IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/0000775002537200253720000000000015257173642022627 5ustar zmoelnigzmoelnigIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/DualDelay/0000775002537200253720000000000015257173642024473 5ustar zmoelnigzmoelnigIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/DualDelay/Source/0000775002537200253720000000000015257173642025733 5ustar zmoelnigzmoelnigIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/DualDelay/Source/PluginProcessor.cpp0000664002537200253720000010524115257173642031600 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich, Felix Holzmüller Copyright (c) 2017, 2024 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #include "PluginProcessor.h" #include "PluginEditor.h" //============================================================================== DualDelayAudioProcessor::DualDelayAudioProcessor() : AudioProcessorBase ( #ifndef JucePlugin_PreferredChannelConfigurations BusesProperties() #if ! JucePlugin_IsMidiEffect #if ! JucePlugin_IsSynth .withInput ("Input", ((juce::PluginHostType::getPluginLoadedAs() == juce::AudioProcessor::wrapperType_VST3) ? juce::AudioChannelSet::ambisonic (1) : juce::AudioChannelSet::ambisonic (maxOrder)), true) #endif .withOutput ("Output", ((juce::PluginHostType::getPluginLoadedAs() == juce::AudioProcessor::wrapperType_VST3) ? juce::AudioChannelSet::ambisonic (1) : juce::AudioChannelSet::ambisonic (maxOrder)), true) #endif , #endif createParameterLayout()) { dryGain = parameters.getRawParameterValue ("dryGain"); orderSetting = parameters.getRawParameterValue ("orderSetting"); for (int i = 0; i < 2; ++i) { juce::String side = (i == 0) ? "L" : "R"; wetGain[i] = parameters.getRawParameterValue ("wetGain" + side); delayBPM[i] = parameters.getRawParameterValue ("delayBPM" + side); delayMult[i] = parameters.getRawParameterValue ("delayMult" + side); sync[i] = parameters.getRawParameterValue ("sync" + side); transformMode[i] = parameters.getRawParameterValue ("transformMode" + side); yaw[i] = parameters.getRawParameterValue ("yaw" + side); pitch[i] = parameters.getRawParameterValue ("pitch" + side); roll[i] = parameters.getRawParameterValue ("roll" + side); warpModeAz[i] = parameters.getRawParameterValue ("warpModeAz" + side); warpModeEl[i] = parameters.getRawParameterValue ("warpModeEl" + side); warpFactorAz[i] = parameters.getRawParameterValue ("warpFactorAz" + side); warpFactorEl[i] = parameters.getRawParameterValue ("warpFactorEl" + side); HPcutOff[i] = parameters.getRawParameterValue ("HPcutOff" + side); LPcutOff[i] = parameters.getRawParameterValue ("LPcutOff" + side); feedback[i] = parameters.getRawParameterValue ("feedback" + side); xfeedback[i] = parameters.getRawParameterValue ("xfeedback" + side); lfoRate[i] = parameters.getRawParameterValue ("lfoRate" + side); lfoDepth[i] = parameters.getRawParameterValue ("lfoDepth" + side); parameters.addParameterListener ("yaw" + side, this); parameters.addParameterListener ("pitch" + side, this); parameters.addParameterListener ("roll" + side, this); parameters.addParameterListener ("warpModeAz" + side, this); parameters.addParameterListener ("warpModeEl" + side, this); parameters.addParameterListener ("warpFactorAz" + side, this); parameters.addParameterListener ("warpFactorEl" + side, this); parameters.addParameterListener ("lfoRate" + side, this); parameters.addParameterListener ("HPcutOff" + side, this); parameters.addParameterListener ("LPcutOff" + side, this); LFO[i].initialise ([] (float phi) { return std::sin (phi); }); } parameters.addParameterListener ("orderSetting", this); } DualDelayAudioProcessor::~DualDelayAudioProcessor() { } //============================================================================== int DualDelayAudioProcessor::getNumPrograms() { return 1; // NB: some hosts don't cope very well if you tell them there are 0 programs, // so this should be at least 1, even if you're not really implementing programs. } int DualDelayAudioProcessor::getCurrentProgram() { return 0; } void DualDelayAudioProcessor::setCurrentProgram (int index) { } const juce::String DualDelayAudioProcessor::getProgramName (int index) { return {}; } void DualDelayAudioProcessor::changeProgramName (int index, const juce::String& newName) { } //============================================================================== void DualDelayAudioProcessor::prepareToPlay (double sampleRate, int samplesPerBlock) { checkInputAndOutput (this, *orderSetting, *orderSetting, true); const int maxLfoDepth = static_cast (ceil ( parameters.getParameterRange ("lfoDepthL").getRange().getEnd() * sampleRate / 500.0f)); const int maxDelay = static_cast (ceil (sampleRate * 60.0f / (parameters.getParameterRange ("delayBPML").start * parameters.getParameterRange ("delayMultL").start) + maxLfoDepth)); juce::dsp::ProcessSpec specDelay; specDelay.sampleRate = sampleRate; specDelay.numChannels = numberOfOutputChannels; specDelay.maximumBlockSize = samplesPerBlock; juce::dsp::ProcessSpec specLFO; specLFO.sampleRate = sampleRate; specLFO.numChannels = 1; specLFO.maximumBlockSize = samplesPerBlock; for (int i = 0; i < 2; ++i) { LFO[i].prepare (specLFO); LFO[i].setFrequency (*lfoRate[i], true); for (int j = lowPassFilters[i].size(); --j >= 0;) { lowPassFilters[i][j]->reset(); highPassFilters[i][j]->reset(); updateFilterCoeffs = true; } delayBuffer[i].clear(); delayOutBuffer[i].clear(); delayLine[i].reset(); delayLine[i].prepare (specDelay); delayLine[i].setMaximumDelayInSamples (maxDelay); delayLine[i].setDelay (sampleRate * 60.0f / (*delayBPM[0] * *delayMult[0])); delayTimeInterp[i].setFrequency (0.5f, sampleRate); auto tmp_prdersetting = orderSetting->load(); rotator[i].updateParams (*yaw[i], *pitch[i], *roll[i], static_cast (*orderSetting)); warp[i].updateParams ( AmbisonicWarp::AzimuthWarpType (juce::roundToInt (warpModeAz[i]->load())), AmbisonicWarp::ElevationWarpType (juce::roundToInt (warpModeEl[i]->load())), *warpFactorAz[i], *warpFactorEl[i]); warp[i].setWorkingOrder (isqrt (numberOfOutputChannels) - 1); } } void DualDelayAudioProcessor::releaseResources() { } void DualDelayAudioProcessor::processBlock (juce::AudioSampleBuffer& buffer, juce::MidiBuffer& midiMessages) { juce::ScopedNoDenormals noDenormals; checkInputAndOutput (this, *orderSetting, *orderSetting); const int totalNumInputChannels = getTotalNumInputChannels(); const int workingOrder = juce::jmin (isqrt (buffer.getNumChannels()) - 1, input.getOrder(), output.getOrder()); const int nCh = squares[workingOrder + 1]; const double fs = getSampleRate(); const int spb = buffer.getNumSamples(); const float msToSamples = fs / 1000.0f; // Sync delay time to host BPM juce::Optional hostBPM; juce::AudioPlayHead* playHead = getPlayHead(); if (updateFilterCoeffs) { for (int i = 0; i < 2; ++i) updateFilters (i); } if (playHead != nullptr && (*sync[0] > 0.5f || *sync[1] > 0.5f)) { hostBPM = playHead->getPosition()->getBpm(); if (hostBPM.hasValue()) { auto hostBPMMapped = parameters.getParameter ("delayBPML")->convertTo0to1 (*hostBPM); if (*sync[0] > 0.5f) parameters.getParameter ("delayBPML") ->setValue (static_cast (hostBPMMapped)); if (*sync[1] > 0.5f) parameters.getParameter ("delayBPMR") ->setValue (static_cast (hostBPMMapped)); } } //clear not used channels for (int channel = nCh; channel < totalNumInputChannels; ++channel) buffer.clear (channel, 0, spb); for (int i = 0; i < 2; ++i) { int otherSide = (i + 1) % 2; // Update rotator to current working order if it has changed if (rotator[i].getOrder() != workingOrder) rotator[i].updateParams (*yaw[i], *pitch[i], *roll[i], workingOrder); if (warp[i].getWorkingOrder() != workingOrder) warp[i].setWorkingOrder (workingOrder); // Setting up delay interpolator const float newDelay = fs * 60.0f / (*delayBPM[i] * *delayMult[i]); delayTimeInterp[i].setTargetValue (newDelay); // ========== Fill input buffer for delay line ========== // Copy dry input to delay buffer delayBuffer[i].makeCopyOf (buffer, true); // Copy feedback and crossfeed to delay buffer for (int channel = 0; channel < nCh; ++channel) { delayBuffer[i].addFrom (channel, 0, delayOutBuffer[i], channel, 0, spb, juce::Decibels::decibelsToGain (feedback[i]->load(), -59.91f)); delayBuffer[i].addFrom ( channel, 0, delayOutBuffer[otherSide], channel, 0, spb, juce::Decibels::decibelsToGain (xfeedback[otherSide]->load(), -59.91f)); // Apply filter to delayed signal lowPassFilters[i][channel]->processSamples (delayBuffer[i].getWritePointer (channel), spb); highPassFilters[i][channel]->processSamples (delayBuffer[i].getWritePointer (channel), spb); } // Rotate/warp delayed signal if (*transformMode[i] < 0.5f) rotator[i].process (&delayBuffer[i]); else warp[i].process (&delayBuffer[i]); } // ========== Add and get samples from delay line ========== for (int i = 0; i < 2; ++i) { LFO[i].setFrequency (*lfoRate[i]); // Cycle through it on sample basis for smooth delay time changes for (int sample = 0; sample < spb; ++sample) { float currentDelay = delayTimeInterp[i].process() + LFO[i].processSample (1.0f) * msToSamples * *lfoDepth[i]; for (int channel = 0; channel < nCh; ++channel) { // Push samples into delay line delayLine[i].pushSample (channel, delayBuffer[i].getSample (channel, sample)); // Pop samples from delay line to output buffer delayOutBuffer[i].setSample (channel, sample, delayLine[i].popSample (channel, currentDelay)); } } } // ========== Calculate output ========== // Apply gain to direct signal buffer.applyGain (juce::Decibels::decibelsToGain (dryGain->load(), -59.91f)); // Add delayed signal to output buffer for (int i = 0; i < 2; ++i) { for (int channel = 0; channel < nCh; ++channel) { buffer.addFrom (channel, 0, delayOutBuffer[i], channel, 0, spb, juce::Decibels::decibelsToGain (wetGain[i]->load(), -59.91f)); } } } //============================================================================== bool DualDelayAudioProcessor::hasEditor() const { return true; // (change this to false if you choose to not supply an editor) } juce::AudioProcessorEditor* DualDelayAudioProcessor::createEditor() { return new DualDelayAudioProcessorEditor (*this, parameters); } //============================================================================== void DualDelayAudioProcessor::getStateInformation (juce::MemoryBlock& destData) { auto state = parameters.copyState(); auto oscConfig = state.getOrCreateChildWithName ("OSCConfig", nullptr); oscConfig.copyPropertiesFrom (oscParameterInterface.getConfig(), nullptr); std::unique_ptr xml (state.createXml()); copyXmlToBinary (*xml, destData); } void DualDelayAudioProcessor::setStateInformation (const void* data, int sizeInBytes) { std::unique_ptr xmlState (getXmlFromBinary (data, sizeInBytes)); if (xmlState.get() != nullptr) { if (xmlState->hasTagName (parameters.state.getType())) { parameters.replaceState (juce::ValueTree::fromXml (*xmlState)); if (parameters.state.hasProperty ("OSCPort")) // legacy { oscParameterInterface.getOSCReceiver().connect ( parameters.state.getProperty ("OSCPort", juce::var (-1))); parameters.state.removeProperty ("OSCPort", nullptr); } auto oscConfig = parameters.state.getChildWithName ("OSCConfig"); if (oscConfig.isValid()) oscParameterInterface.setConfig (oscConfig); // Add compatibility layer for old delay parameters juce::String ch[2] = { "L", "R" }; for (int i = 0; i < 2; ++i) { // rotation to yaw auto oldTimeParameter = xmlState->getChildByAttribute ("id", "rotation" + ch[i]); if (oldTimeParameter != nullptr) { auto parameterState = parameters.state.getChildWithProperty ("id", "yaw" + ch[i]); if (parameterState.isValid()) { parameterState.setProperty ( "value", oldTimeParameter->getStringAttribute ("value").getFloatValue(), nullptr); } } // ms to BPM oldTimeParameter = xmlState->getChildByAttribute ("id", "delayTime" + ch[i]); if (oldTimeParameter != nullptr) { float value = 60000.0f / oldTimeParameter->getStringAttribute ("value").getFloatValue(); auto delayState = parameters.state.getChildWithProperty ("id", "delayBPM" + ch[i]); const float maxBPM = parameters.getParameterRange ("delayBPM" + ch[i]).getRange().getEnd(); const float maxMult = parameters.getParameterRange ("delayMult" + ch[i]).getRange().getEnd(); // Set multiplier if BPM is too high if (value > maxBPM) { float mult = static_cast ( juce::nextPowerOfTwo (static_cast (ceil (value / maxBPM)))); value /= mult; // Limiting multiplier to maximum value, so it's at least somehow on beat mult = juce::jmin (mult, maxMult); auto multState = parameters.state.getChildWithProperty ("id", "delayMult" + ch[i]); if (multState.isValid()) multState.setProperty ("value", mult, nullptr); } if (delayState.isValid()) delayState.setProperty ("value", value, nullptr); } } } } } //============================================================================== // This creates new instances of the plugin.. juce::AudioProcessor* JUCE_CALLTYPE createPluginFilter() { return new DualDelayAudioProcessor(); } void DualDelayAudioProcessor::parameterChanged (const juce::String& parameterID, float newValue) { if (parameterID == "orderSetting") { userChangedIOSettings = true; rotator[0].updateParams (*yaw[0], *pitch[0], *roll[0], static_cast (newValue) - 1); rotator[1].updateParams (*yaw[1], *pitch[1], *roll[1], static_cast (newValue) - 1); warp[1].setWorkingOrder (static_cast (newValue) - 1); warp[0].setWorkingOrder (static_cast (newValue) - 1); } const int currentOrder = static_cast (*orderSetting); bool sideIdx = parameterID.endsWith ("L") ? 0 : 1; juce::String side = (sideIdx == 0) ? "L" : "R"; if (parameterID == "yaw" + side || parameterID == "pitch" + side || parameterID == "roll" + side) rotator[sideIdx].updateParams (*yaw[sideIdx], *pitch[sideIdx], *roll[sideIdx], currentOrder); else if (parameterID == "warpModeAz" + side || parameterID == "warpModeEl" + side || parameterID == "warpFactorAz" + side || parameterID == "warpFactorEl" + side) warp[sideIdx].updateParams (AmbisonicWarp::AzimuthWarpType ( juce::roundToInt (warpModeAz[sideIdx]->load())), AmbisonicWarp::ElevationWarpType ( juce::roundToInt (warpModeEl[sideIdx]->load())), *warpFactorAz[sideIdx], *warpFactorEl[sideIdx]); else if (parameterID.startsWith ("HPcutOff") || parameterID.startsWith ("LPcutOff")) { updateFilters (sideIdx); } } void DualDelayAudioProcessor::updateBuffers() { DBG ("IOHelper: input size: " << input.getSize()); DBG ("IOHelper: output size: " << output.getSize()); const int nChannels = juce::jmin (input.getNumberOfChannels(), output.getNumberOfChannels()); const int _nChannels = juce::jmin (input.getPreviousNumberOfChannels(), output.getPreviousNumberOfChannels()); const int samplesPerBlock = getBlockSize(); const double sampleRate = getSampleRate(); const int maxLfoDepth = static_cast (ceil ( parameters.getParameterRange ("lfoDepthL").getRange().getEnd() * sampleRate / 500.0f)); const int maxDelay = static_cast (ceil (sampleRate * 60.0f / (parameters.getParameterRange ("delayBPML").start * parameters.getParameterRange ("delayMultL").start) + maxLfoDepth)); for (int i = 0; i < 2; ++i) { delayBuffer[i].setSize (nChannels, samplesPerBlock); delayBuffer[i].clear(); delayOutBuffer[i].setSize (nChannels, samplesPerBlock); delayOutBuffer[i].clear(); if (nChannels > _nChannels) { for (int channel = _nChannels; channel < nChannels; ++channel) { lowPassFilters[i].add (new juce::IIRFilter()); highPassFilters[i].add (new juce::IIRFilter()); } } else { const int diff = _nChannels - nChannels; lowPassFilters[i].removeRange (nChannels, diff); highPassFilters[i].removeRange (nChannels, diff); } } updateFilterCoeffs = true; } void DualDelayAudioProcessor::updateFilters (const int endIdx) { const int nCh = lowPassFilters[endIdx].size(); const double fs = getSampleRate(); for (int channel = 0; channel < nCh; ++channel) { lowPassFilters[endIdx][channel]->setCoefficients (juce::IIRCoefficients::makeLowPass ( fs, juce::jmin (fs / 2.0, static_cast (LPcutOff[endIdx]->load())))); highPassFilters[endIdx][channel]->setCoefficients (juce::IIRCoefficients::makeHighPass ( fs, juce::jmin (fs / 2.0, static_cast (HPcutOff[endIdx]->load())))); } updateFilterCoeffs = false; } std::tuple DualDelayAudioProcessor::msToBPM (const float ms) { float transformedBPM = 60000.0f / ms; float mult = 1.0f; const float maxBPM = parameters.getParameterRange ("delayBPML").getRange().getEnd(); const float minBPM = parameters.getParameterRange ("delayBPML").getRange().getStart(); const float maxMult = parameters.getParameterRange ("delayMultL").getRange().getEnd(); const float minMult = parameters.getParameterRange ("delayMultL").getRange().getStart(); if (transformedBPM > maxBPM) { mult = static_cast ( juce::nextPowerOfTwo (static_cast (ceil (transformedBPM / maxBPM)))); transformedBPM /= mult; mult = juce::jmin (mult, maxMult); } else if (transformedBPM < minBPM) { float transformedBPM_tmp = juce::jmax (transformedBPM / minMult, minBPM); // Clip values to avoid division by zero mult = static_cast ( juce::nextPowerOfTwo (static_cast (floor (transformedBPM / minBPM)))); mult = juce::jmax (mult, 1.0f) * minMult; transformedBPM /= mult; } return { transformedBPM, mult }; } //============================================================================== std::vector> DualDelayAudioProcessor::createParameterLayout() { // add your audio parameters here std::vector> params; params.push_back (OSCParameterInterface::createParameterTheOldWay ( "orderSetting", "Ambisonics Order", "", juce::NormalisableRange (0.0f, 8.0f, 1.0f), 0.0f, [] (float value) { if (value >= 0.5f && value < 1.5f) return "0th"; else if (value >= 1.5f && value < 2.5f) return "1st"; else if (value >= 2.5f && value < 3.5f) return "2nd"; else if (value >= 3.5f && value < 4.5f) return "3rd"; else if (value >= 4.5f && value < 5.5f) return "4th"; else if (value >= 5.5f && value < 6.5f) return "5th"; else if (value >= 6.5f && value < 7.5f) return "6th"; else if (value >= 7.5f) return "7th"; else return "Auto"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "useSN3D", "Normalization", "", juce::NormalisableRange (0.0f, 1.0f, 1.0f), 1.0f, [] (float value) { if (value >= 0.5f) return "SN3D"; else return "N3D"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "dryGain", "Dry amount", "dB", juce::NormalisableRange (-60.0f, 0.0f, 0.1f), 0.0f, [] (float value) { return (value >= -59.9f) ? juce::String (value, 1) : "-inf"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "wetGainL", "Wet amount left", "dB", juce::NormalisableRange (-60.0f, 0.0f, 0.1f), -6.0f, [] (float value) { return (value >= -59.9f) ? juce::String (value, 1) : "-inf"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "wetGainR", "Wet amount right", "dB", juce::NormalisableRange (-60.0f, 0.0f, 0.1f), -6.0f, [] (float value) { return (value >= -59.9f) ? juce::String (value, 1) : "-inf"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "delayBPML", "delay left", "BPM", juce::NormalisableRange (46.0f, 320.0f, 0.001f), 100.0f, [] (float value) { return juce::String (value, 1); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "delayBPMR", "delay right", "BPM", juce::NormalisableRange (46.0f, 320.0f, 0.001f), 120.0f, [] (float value) { return juce::String (value, 1); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "delayMultL", "delay multiplier left", "", juce::NormalisableRange (1.0f, 16.0f, 1.0f, 0.6f), 1.0f, [] (float value) { return juce::String (std::round (value), 0); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "delayMultR", "delay multiplier right", "", juce::NormalisableRange (1.0f, 16.0f, 1.0f, 0.6f), 1.0f, [] (float value) { return juce::String (std::round (value), 0); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "syncL", "sync BPM left", "", juce::NormalisableRange (0.0f, 1.0f, 1.0f), 0.0f, [] (float value) { return (value >= 0.5f) ? "on" : "off"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "syncR", "sync BPM right", "", juce::NormalisableRange (0.0f, 1.0f, 1.0f), 0.0f, [] (float value) { return (value >= 0.5f) ? "on" : "off"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "transformModeL", "transform mode left", "", juce::NormalisableRange (0.0f, 1.0f, 1.0f), 0.0f, [] (float value) { return (value > 0.5f) ? "warp" : "rotate"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "transformModeR", "transform mode right", "", juce::NormalisableRange (0.0f, 1.0f, 1.0f), 0.0f, [] (float value) { return (value > 0.5f) ? "warp" : "rotate"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "yawL", "yaw left", juce::CharPointer_UTF8 (R"(°)"), juce::NormalisableRange (-180.0f, 180.0f, 0.1f), 10.0f, [] (float value) { return juce::String (value, 1); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "yawR", "yaw right", juce::CharPointer_UTF8 (R"(°)"), juce::NormalisableRange (-180.0f, 180.0f, 0.1f), -7.5f, [] (float value) { return juce::String (value, 1); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "pitchL", "pitch left", juce::CharPointer_UTF8 (R"(°)"), juce::NormalisableRange (-180.0f, 180.0f, 0.1f), 0.0f, [] (float value) { return juce::String (value, 1); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "pitchR", "pitch right", juce::CharPointer_UTF8 (R"(°)"), juce::NormalisableRange (-180.0f, 180.0f, 0.1f), 0.0f, [] (float value) { return juce::String (value, 1); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "rollL", "roll left", juce::CharPointer_UTF8 (R"(°)"), juce::NormalisableRange (-180.0f, 180.0f, 0.1f), 0.0f, [] (float value) { return juce::String (value, 1); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "rollR", "roll right", juce::CharPointer_UTF8 (R"(°)"), juce::NormalisableRange (-180.0f, 180.0f, 0.1f), 0.0f, [] (float value) { return juce::String (value, 1); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "warpModeAzL", "Warp mode azimuth left", "", juce::NormalisableRange (0.0f, 1.0f, 1.0f), 0.0f, [] (float value) { return (value > 0.5f) ? "One Point" : "Two Point"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "warpModeElL", "warp mode elevation left", "", juce::NormalisableRange (0.0f, 1.0f, 1.0f), 0.0f, [] (float value) { return (value > 0.5f) ? "Pole" : "Equator"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "warpModeAzR", "Warp mode azimuth right", "", juce::NormalisableRange (0.0f, 1.0f, 1.0f), 0.0f, [] (float value) { return (value > 0.5f) ? "One Point" : "Two Point"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "warpModeElR", "warp mode elevation right", "", juce::NormalisableRange (0.0f, 1.0f, 1.0f), 0.0f, [] (float value) { return (value > 0.5f) ? "Pole" : "Equator"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "warpFactorAzL", "warp factor azimuth left", "", juce::NormalisableRange (-0.9f, 0.9f, 0.01f), 0.0f, [] (float value) { return juce::String (value, 2); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "warpFactorElL", "warp factor elevation left", "", juce::NormalisableRange (-0.9f, 0.9f, 0.01f), 0.0f, [] (float value) { return juce::String (value, 2); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "warpFactorAzR", "warp factor azimuth right", "", juce::NormalisableRange (-0.9f, 0.9f, 0.01f), 0.0f, [] (float value) { return juce::String (value, 2); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "warpFactorElR", "warp factor elevation right", "", juce::NormalisableRange (-0.9f, 0.9f, 0.01f), 0.0f, [] (float value) { return juce::String (value, 2); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "LPcutOffL", "lowpass frequency left", "Hz", juce::NormalisableRange (20.0f, 20000.0f, 1.0f, 0.2), 20000.0f, [] (float value) { return juce::String (value, 0); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "LPcutOffR", "lowpass frequency right", "Hz", juce::NormalisableRange (20.0f, 20000.0f, 1.0f, 0.2), 20000.0f, [] (float value) { return juce::String (value, 0); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "HPcutOffL", "highpass frequency left", "Hz", juce::NormalisableRange (20.0f, 20000.0f, 1.0f, 0.2), 100.0f, [] (float value) { return juce::String (value, 0); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "HPcutOffR", "highpass frequency right", "Hz", juce::NormalisableRange (20.0f, 20000.0f, 1.0f, 0.2), 100.0f, [] (float value) { return juce::String (value, 0); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "feedbackL", "feedback left", "dB", juce::NormalisableRange (-60.0f, 0.0f, 0.1f), -8.0f, [] (float value) { return (value >= -59.9f) ? juce::String (value, 1) : "-inf"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "feedbackR", "feedback right", "dB", juce::NormalisableRange (-60.0f, 0.0f, 0.1f), -8.0f, [] (float value) { return (value >= -59.9f) ? juce::String (value, 1) : "-inf"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "xfeedbackL", "cross feedback left", "dB", juce::NormalisableRange (-60.0f, 0.0f, 0.1f), -20.0f, [] (float value) { return (value >= -59.9f) ? juce::String (value, 1) : "-inf"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "xfeedbackR", "cross feedback right", "dB", juce::NormalisableRange (-60.0f, 0.0f, 0.1f), -20.0f, [] (float value) { return (value >= -59.9f) ? juce::String (value, 1) : "-inf"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "lfoRateL", "LFO left rate", "Hz", juce::NormalisableRange (0.0f, 10.0f, 0.01f), 0.0f, [] (float value) { return juce::String (value, 2); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "lfoRateR", "LFO right rate", "Hz", juce::NormalisableRange (0.0f, 10.0f, 0.01f), 0.0f, [] (float value) { return juce::String (value, 2); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "lfoDepthL", "LFO left depth", "ms", juce::NormalisableRange (0.0f, 1.0f, 0.01f), 0.0f, [] (float value) { return juce::String (value, 2); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "lfoDepthR", "LFO right depth", "ms", juce::NormalisableRange (0.0f, 1.0f, 0.01f), 0.0f, [] (float value) { return juce::String (value, 2); }, nullptr)); return params; } IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/DualDelay/Source/PluginEditor.cpp0000664002537200253720000013514415257173642031054 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #include "PluginEditor.h" #include "PluginProcessor.h" //============================================================================== DualDelayAudioProcessorEditor::DualDelayAudioProcessorEditor ( DualDelayAudioProcessor& p, juce::AudioProcessorValueTreeState& vts) : juce::AudioProcessorEditor (&p), processor (p), valueTreeState (vts), footer (p.getOSCParameterInterface()) { setLookAndFeel (&globalLaF); addAndMakeVisible (&title); title.setTitle (juce::String ("Dual"), juce::String ("Delay")); title.setFont (globalLaF.robotoBold, globalLaF.robotoLight); addAndMakeVisible (&footer); cbNormalizationAttachement.reset ( new ComboBoxAttachment (valueTreeState, "useSN3D", *title.getInputWidgetPtr()->getNormCbPointer())); cbOrderAttachement.reset ( new ComboBoxAttachment (valueTreeState, "orderSetting", *title.getInputWidgetPtr()->getOrderCbPointer())); addAndMakeVisible (&SlDryGain); SlDryGainAttachment.reset (new SliderAttachment (valueTreeState, "dryGain", SlDryGain)); SlDryGain.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); SlDryGain.setTextValueSuffix (" dB"); SlDryGain.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); SlDryGain.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[0]); auto delayMSRange = juce::NormalisableRange ( 60000.0f / (valueTreeState.getParameterRange ("delayBPML").end * valueTreeState.getParameterRange ("delayMultL").end), 60000.0f / (valueTreeState.getParameterRange ("delayBPML").start * valueTreeState.getParameterRange ("delayMultL").start), 0.1f); // =========================== LEFT SIDE ============================================================== addAndMakeVisible (&cbLeftTransfromMode); cbLeftTransfromMode.setJustificationType (juce::Justification::centred); cbLeftTransfromMode.addSectionHeading ("Mode"); cbLeftTransfromMode.addItem ("Rotate", 1); cbLeftTransfromMode.addItem ("Warp", 2); cbLeftTransfromModeAttachment.reset ( new ComboBoxAttachment (valueTreeState, "transformModeL", cbLeftTransfromMode)); cbLeftTransfromMode.addListener (this); bool leftTrMode = (valueTreeState.getParameter ("transformModeL")->getValue() > 0.5f) ? true : false; SlLeftYaw.setVisible (! leftTrMode); addChildComponent (&SlLeftYaw); SlLeftYawAttachment.reset (new SliderAttachment (valueTreeState, "yawL", SlLeftYaw)); SlLeftYaw.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); SlLeftYaw.setReverse (true); SlLeftYaw.setTextValueSuffix (" deg"); SlLeftYaw.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); SlLeftYaw.setRotaryParameters (juce::MathConstants::pi, 3 * juce::MathConstants::pi, false); SlLeftYaw.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[0]); SlLeftYaw.addListener (this); SlLeftPitch.setVisible (! leftTrMode); addChildComponent (&SlLeftPitch); SlLeftPitchAttachment.reset (new SliderAttachment (valueTreeState, "pitchL", SlLeftPitch)); SlLeftPitch.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); SlLeftPitch.setReverse (true); SlLeftPitch.setTextValueSuffix (" deg"); SlLeftPitch.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); SlLeftPitch.setRotaryParameters (0.5 * juce::MathConstants::pi, 2.5 * juce::MathConstants::pi, false); SlLeftPitch.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[0]); SlLeftPitch.addListener (this); SlLeftRoll.setVisible (! leftTrMode); addChildComponent (&SlLeftRoll); SlLeftRollAttachment.reset (new SliderAttachment (valueTreeState, "rollL", SlLeftRoll)); SlLeftRoll.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); SlLeftRoll.setReverse (false); SlLeftRoll.setTextValueSuffix (" deg"); SlLeftRoll.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); SlLeftRoll.setRotaryParameters (juce::MathConstants::pi, 3 * juce::MathConstants::pi, false); SlLeftRoll.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[0]); SlLeftRoll.addListener (this); cbLeftWarpTypeAz.setVisible (leftTrMode); addChildComponent (&cbLeftWarpTypeAz); cbLeftWarpTypeAz.setJustificationType (juce::Justification::centred); cbLeftWarpTypeAz.addSectionHeading ("Warp type azimuth"); cbLeftWarpTypeAz.addItem ("One Point", 1); cbLeftWarpTypeAz.addItem ("Two Point", 2); cbLeftWarpTypeAzAttachment.reset ( new ComboBoxAttachment (valueTreeState, "warpModeAzL", cbLeftWarpTypeAz)); cbLeftWarpTypeEl.setVisible (leftTrMode); addChildComponent (&cbLeftWarpTypeEl); cbLeftWarpTypeEl.setJustificationType (juce::Justification::centred); cbLeftWarpTypeEl.addSectionHeading ("Warp type elevation"); cbLeftWarpTypeEl.addItem ("Pole", 1); cbLeftWarpTypeEl.addItem ("Equator", 2); cbLeftWarpTypeElAttachment.reset ( new ComboBoxAttachment (valueTreeState, "warpModeElL", cbLeftWarpTypeEl)); SlLeftWarpFactorAz.setVisible (leftTrMode); addChildComponent (&SlLeftWarpFactorAz); SlLeftWarpFactorAzAttachment.reset ( new SliderAttachment (valueTreeState, "warpFactorAzL", SlLeftWarpFactorAz)); SlLeftWarpFactorAz.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); SlLeftWarpFactorAz.setTextValueSuffix (""); SlLeftWarpFactorAz.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); // SlLeftWarpFactorAz.setRotaryParameters (juce::MathConstants::pi, // 3 * juce::MathConstants::pi, // false); SlLeftWarpFactorAz.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[0]); SlLeftWarpFactorEl.setVisible (leftTrMode); addChildComponent (&SlLeftWarpFactorEl); SlLeftWarpFactorElAttachment.reset ( new SliderAttachment (valueTreeState, "warpFactorElL", SlLeftWarpFactorEl)); SlLeftWarpFactorEl.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); SlLeftWarpFactorEl.setTextValueSuffix (""); SlLeftWarpFactorEl.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); // SlLeftWarpFactorEl.setRotaryParameters (juce::MathConstants::pi, // 3 * juce::MathConstants::pi, // false); SlLeftWarpFactorEl.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[0]); addAndMakeVisible (&SlLeftDelay); SlLeftDelayAttachment.reset (new SliderAttachment (valueTreeState, "delayBPML", SlLeftDelay)); SlLeftDelay.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); SlLeftDelay.setTextValueSuffix (" BPM"); SlLeftDelay.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); SlLeftDelay.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[1]); SlLeftDelay.addListener (this); SlLeftDelayMS.setVisible (false); addChildComponent (&SlLeftDelayMS); SlLeftDelayMS.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); SlLeftDelayMS.setNormalisableRange (delayMSRange); SlLeftDelayMS.setTextValueSuffix (" ms"); SlLeftDelayMS.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); SlLeftDelayMS.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[1]); SlLeftDelayMS.setValue ((60000.0f / *valueTreeState.getRawParameterValue ("delayBPML")) / *valueTreeState.getRawParameterValue ("delayMultL")); SlLeftDelayMS.addListener (this); addAndMakeVisible (&tbLeftSync); btLeftSyncAttachment.reset (new ButtonAttachment (valueTreeState, "syncL", tbLeftSync)); tbLeftSync.setButtonText ("Sync"); tbLeftSync.setColour (juce::ToggleButton::tickColourId, globalLaF.ClWidgetColours[1]); tbLeftSync.addListener (this); addAndMakeVisible (&btLeftTap); btLeftTap.setButtonText ("Tap"); btLeftTap.setColour (juce::TextButton::buttonColourId, globalLaF.ClWidgetColours[1]); btLeftTap.addListener (this); addAndMakeVisible (&SlLeftDelayMult); SlLeftDelayMultAttachment.reset ( new SliderAttachment (valueTreeState, "delayMultL", SlLeftDelayMult)); SlLeftDelayMult.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); SlLeftDelayMult.setTextValueSuffix (""); SlLeftDelayMult.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); SlLeftDelayMult.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[1]); SlLeftDelayMult.addListener (this); addAndMakeVisible (&SlLeftLfoRate); SlLeftLfoRateAttachment.reset ( new SliderAttachment (valueTreeState, "lfoRateL", SlLeftLfoRate)); SlLeftLfoRate.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); SlLeftLfoRate.setTextValueSuffix (" Hz"); SlLeftLfoRate.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); SlLeftLfoRate.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[2]); addAndMakeVisible (&SlLeftLfoDepth); SlLeftLfoDepthAttachment.reset ( new SliderAttachment (valueTreeState, "lfoDepthL", SlLeftLfoDepth)); SlLeftLfoDepth.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); SlLeftLfoDepth.setTextValueSuffix (" ms"); SlLeftLfoDepth.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); SlLeftLfoDepth.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[2]); addAndMakeVisible (&dblSlLeftFilter); dblSlLeftFilterHpAttachment.reset ( new SliderAttachment (valueTreeState, "HPcutOffL", *dblSlLeftFilter.getLeftSliderAddress())); dblSlLeftFilterLpAttachment.reset ( new SliderAttachment (valueTreeState, "LPcutOffL", *dblSlLeftFilter.getRightSliderAddress())); dblSlLeftFilter.setRangeAndPosition (valueTreeState.getParameterRange ("HPcutOffL"), valueTreeState.getParameterRange ("LPcutOffL")); dblSlLeftFilter.setColour (globalLaF.ClWidgetColours[1]); addAndMakeVisible (&SlLeftFb); SlLeftFbAttachment.reset (new SliderAttachment (valueTreeState, "feedbackL", SlLeftFb)); SlLeftFb.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); SlLeftFb.setTextValueSuffix (" dB"); SlLeftFb.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); SlLeftFb.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[3]); addAndMakeVisible (&SlLeftCrossFb); SlLeftCrossFbAttachment.reset ( new SliderAttachment (valueTreeState, "xfeedbackL", SlLeftCrossFb)); SlLeftCrossFb.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); SlLeftCrossFb.setTextValueSuffix (" dB"); SlLeftCrossFb.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); SlLeftCrossFb.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[3]); addAndMakeVisible (&SlLeftGain); SlLeftGainAttachment.reset (new SliderAttachment (valueTreeState, "wetGainL", SlLeftGain)); SlLeftGain.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); SlLeftGain.setTextValueSuffix (" dB"); SlLeftGain.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); SlLeftGain.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[0]); addAndMakeVisible (&btTimeMode); btTimeMode.setButtonText ("BPM"); btTimeMode.setToggleable (true); btTimeMode.setClickingTogglesState (! isModeMS); btTimeMode.setColour (juce::TextButton::buttonColourId, globalLaF.ClWidgetColours[1]); btTimeMode.setColour (juce::TextButton::buttonOnColourId, globalLaF.ClWidgetColours[1]); btTimeMode.addListener (this); // =========================== RIGHT SIDE ================================================================ addAndMakeVisible (&cbRightTransfromMode); cbRightTransfromMode.setJustificationType (juce::Justification::centred); cbRightTransfromMode.addSectionHeading ("Mode"); cbRightTransfromMode.addItem ("Rotate", 1); cbRightTransfromMode.addItem ("Warp", 2); cbRightTransfromModeAttachment.reset ( new ComboBoxAttachment (valueTreeState, "transformModeR", cbRightTransfromMode)); cbRightTransfromMode.addListener (this); bool rightTrMode = (valueTreeState.getParameter ("transformModeR")->getValue() > 0.5f) ? true : false; SlRightYaw.setVisible (! rightTrMode); addChildComponent (&SlRightYaw); SlRightYawAttachment.reset (new SliderAttachment (valueTreeState, "yawR", SlRightYaw)); SlRightYaw.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); SlRightYaw.setReverse (true); SlRightYaw.setTextValueSuffix (" deg"); SlRightYaw.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); SlRightYaw.setRotaryParameters (juce::MathConstants::pi, 3 * juce::MathConstants::pi, false); SlRightYaw.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[0]); SlRightYaw.addListener (this); SlRightPitch.setVisible (! rightTrMode); addChildComponent (&SlRightPitch); SlRightPitchAttachment.reset (new SliderAttachment (valueTreeState, "pitchR", SlRightPitch)); SlRightPitch.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); SlRightPitch.setReverse (true); SlRightPitch.setTextValueSuffix (" deg"); SlRightPitch.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); SlRightPitch.setRotaryParameters (0.5 * juce::MathConstants::pi, 2.5 * juce::MathConstants::pi, false); SlRightPitch.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[0]); SlRightPitch.addListener (this); SlRightRoll.setVisible (! rightTrMode); addChildComponent (&SlRightRoll); SlRightRollAttachment.reset (new SliderAttachment (valueTreeState, "rollR", SlRightRoll)); SlRightRoll.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); SlRightRoll.setReverse (false); SlRightRoll.setTextValueSuffix (" deg"); SlRightRoll.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); SlRightRoll.setRotaryParameters (juce::MathConstants::pi, 3 * juce::MathConstants::pi, false); SlRightRoll.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[0]); SlRightRoll.addListener (this); cbRightWarpTypeAz.setVisible (rightTrMode); addChildComponent (&cbRightWarpTypeAz); cbRightWarpTypeAz.setJustificationType (juce::Justification::centred); cbRightWarpTypeAz.addSectionHeading ("Warp type azimuth"); cbRightWarpTypeAz.addItem ("One Point", 1); cbRightWarpTypeAz.addItem ("Two Point", 2); cbRightWarpTypeAzAttachment.reset ( new ComboBoxAttachment (valueTreeState, "warpModeAzR", cbRightWarpTypeAz)); cbRightWarpTypeEl.setVisible (rightTrMode); addChildComponent (&cbRightWarpTypeEl); cbRightWarpTypeEl.setJustificationType (juce::Justification::centred); cbRightWarpTypeEl.addSectionHeading ("Warp type elevation"); cbRightWarpTypeEl.addItem ("Pole", 1); cbRightWarpTypeEl.addItem ("Equator", 2); cbRightWarpTypeElAttachment.reset ( new ComboBoxAttachment (valueTreeState, "warpModeElR", cbRightWarpTypeEl)); SlRightWarpFactorAz.setVisible (rightTrMode); addChildComponent (&SlRightWarpFactorAz); SlRightWarpFactorAzAttachment.reset ( new SliderAttachment (valueTreeState, "warpFactorAzR", SlRightWarpFactorAz)); SlRightWarpFactorAz.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); SlRightWarpFactorAz.setTextValueSuffix (""); SlRightWarpFactorAz.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); // SlRightWarpFactorAz.setRotaryParameters (juce::MathConstants::pi, // 3 * juce::MathConstants::pi, // false); SlRightWarpFactorAz.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[0]); SlRightWarpFactorEl.setVisible (rightTrMode); addChildComponent (&SlRightWarpFactorEl); SlRightWarpFactorElAttachment.reset ( new SliderAttachment (valueTreeState, "warpFactorElR", SlRightWarpFactorEl)); SlRightWarpFactorEl.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); SlRightWarpFactorEl.setTextValueSuffix (""); SlRightWarpFactorEl.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); // SlRightWarpFactorEl.setRotaryParameters (juce::MathConstants::pi, // 3 * juce::MathConstants::pi, // false); SlRightWarpFactorEl.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[0]); addAndMakeVisible (&SlRightDelay); SlRightDelayAttachment.reset (new SliderAttachment (valueTreeState, "delayBPMR", SlRightDelay)); SlRightDelay.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); SlRightDelay.setTextValueSuffix (" BPM"); SlRightDelay.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); SlRightDelay.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[1]); SlRightDelay.addListener (this); SlRightDelayMS.setVisible (false); addChildComponent (&SlRightDelayMS); SlRightDelayMS.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); SlRightDelayMS.setNormalisableRange (delayMSRange); SlRightDelayMS.setTextValueSuffix (" ms"); SlRightDelayMS.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); SlRightDelayMS.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[1]); SlRightDelayMS.setValue ((60000.0f / *valueTreeState.getRawParameterValue ("delayBPMR")) / *valueTreeState.getRawParameterValue ("delayMultR")); SlRightDelayMS.addListener (this); addAndMakeVisible (&tbRightSync); btRightSyncAttachment.reset (new ButtonAttachment (valueTreeState, "syncR", tbRightSync)); tbRightSync.setButtonText ("Sync"); tbRightSync.setColour (juce::ToggleButton::tickColourId, globalLaF.ClWidgetColours[1]); tbRightSync.addListener (this); addAndMakeVisible (&btRightTap); btRightTap.setButtonText ("Tap"); btRightTap.setColour (juce::TextButton::buttonColourId, globalLaF.ClWidgetColours[1]); // btLeftTap.setColour (juce::TextButton::buttonOnColourId, globalLaF.ClWidgetColours[1]); btRightTap.addListener (this); addAndMakeVisible (&SlRightDelayMult); SlRightDelayMultAttachment.reset ( new SliderAttachment (valueTreeState, "delayMultR", SlRightDelayMult)); SlRightDelayMult.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); SlRightDelayMult.setTextValueSuffix (""); SlRightDelayMult.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); SlRightDelayMult.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[1]); SlRightDelayMult.addListener (this); addAndMakeVisible (&SlRightLfoRate); SlRightLfoRateAttachment.reset ( new SliderAttachment (valueTreeState, "lfoRateR", SlRightLfoRate)); SlRightLfoRate.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); SlRightLfoRate.setTextValueSuffix (" Hz"); SlRightLfoRate.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); SlRightLfoRate.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[2]); addAndMakeVisible (&SlRightLfoDepth); SlRightLfoDepthAttachment.reset ( new SliderAttachment (valueTreeState, "lfoDepthR", SlRightLfoDepth)); SlRightLfoDepth.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); SlRightLfoDepth.setTextValueSuffix (" ms"); SlRightLfoDepth.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); SlRightLfoDepth.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[2]); addAndMakeVisible (&dblSlRightFilter); dblSlRightFilterHpAttachment.reset ( new SliderAttachment (valueTreeState, "HPcutOffR", *dblSlRightFilter.getLeftSliderAddress())); dblSlRightFilterLpAttachment.reset ( new SliderAttachment (valueTreeState, "LPcutOffR", *dblSlRightFilter.getRightSliderAddress())); dblSlRightFilter.setRangeAndPosition (valueTreeState.getParameterRange ("HPcutOffR"), valueTreeState.getParameterRange ("LPcutOffR")); dblSlRightFilter.getLeftSliderAddress()->setTextValueSuffix (" Hz"); dblSlRightFilter.getRightSliderAddress()->setTextValueSuffix (" Hz"); dblSlRightFilter.setColour (globalLaF.ClWidgetColours[1]); addAndMakeVisible (&SlRightFb); SlRightFbAttachment.reset (new SliderAttachment (valueTreeState, "feedbackR", SlRightFb)); SlRightFb.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); SlRightFb.setTextValueSuffix (" dB"); SlRightFb.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); SlRightFb.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[3]); addAndMakeVisible (&SlRightCrossFb); SlRightCrossFbAttachment.reset ( new SliderAttachment (valueTreeState, "xfeedbackR", SlRightCrossFb)); SlRightCrossFb.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); SlRightCrossFb.setTextValueSuffix (" dB"); SlRightCrossFb.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); SlRightCrossFb.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[3]); addAndMakeVisible (&SlRightGain); SlRightGainAttachment.reset (new SliderAttachment (valueTreeState, "wetGainR", SlRightGain)); SlRightGain.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); SlRightGain.setTextValueSuffix (" dB"); SlRightGain.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); SlRightGain.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[0]); // ============ GROUPCOMPONENTS ========= addAndMakeVisible (&gcRotDelL); gcRotDelL.setText ("Rotation & Delay"); gcRotDelL.setTextLabelPosition (juce::Justification::centred); addAndMakeVisible (&gcRotDelR); gcRotDelR.setText ("Rotation & Delay"); gcRotDelR.setTextLabelPosition (juce::Justification::centred); addAndMakeVisible (&gcFiltL); gcFiltL.setText ("Spectral Filter"); gcFiltL.setTextLabelPosition (juce::Justification::centred); addAndMakeVisible (&gcFiltR); gcFiltR.setText ("Spectral Filter"); gcFiltR.setTextLabelPosition (juce::Justification::centred); addAndMakeVisible (&gcFbL); gcFbL.setText ("Feedback"); gcFbL.setTextLabelPosition (juce::Justification::centred); addAndMakeVisible (&gcFbR); gcFbR.setText ("Feedback"); gcFbR.setTextLabelPosition (juce::Justification::centred); addAndMakeVisible (&gcOutput); gcOutput.setText ("Output Mix"); gcOutput.setTextLabelPosition (juce::Justification::centred); // ============ LABELS ========= lbYawL.setVisible (! leftTrMode); addChildComponent (&lbYawL); lbYawL.setText ("Yaw"); lbPitchL.setVisible (! leftTrMode); addChildComponent (&lbPitchL); lbPitchL.setText ("Pitch"); lbRollL.setVisible (! leftTrMode); addChildComponent (&lbRollL); lbRollL.setText ("Roll"); addAndMakeVisible (&lbDelL); lbDelL.setText ("Delay"); addAndMakeVisible (&lbDelMultL); lbDelMultL.setText ("Mult"); addAndMakeVisible (&lbFbL); lbFbL.setText ("Self"); addAndMakeVisible (&lbXFbL); lbXFbL.setText ("Cross"); lbWarpFactorAzL.setVisible (leftTrMode); addChildComponent (&lbWarpFactorAzL); lbWarpFactorAzL.setText ("Warp Az"); lbWarpFactorElL.setVisible (leftTrMode); addChildComponent (&lbWarpFactorElL); lbWarpFactorElL.setText ("Warp El"); lbAzModeL.setVisible (leftTrMode); addChildComponent (&lbAzModeL); lbAzModeL.setText ("Az:"); lbElModeL.setVisible (leftTrMode); addChildComponent (&lbElModeL); lbElModeL.setText ("El:"); addAndMakeVisible (&lbYawR); lbYawR.setText ("Yaw"); addAndMakeVisible (&lbPitchR); lbPitchR.setText ("Pitch"); addAndMakeVisible (&lbRollR); lbRollR.setText ("Roll"); addAndMakeVisible (&lbDelR); lbDelR.setText ("Delay"); addAndMakeVisible (&lbDelMultR); lbDelMultR.setText ("Mult"); addAndMakeVisible (&lbFbR); lbFbR.setText ("Self"); addAndMakeVisible (&lbXFbR); lbXFbR.setText ("Cross"); lbWarpFactorAzR.setVisible (rightTrMode); addChildComponent (&lbWarpFactorAzR); lbWarpFactorAzR.setText ("Warp Az"); lbWarpFactorElR.setVisible (rightTrMode); addChildComponent (&lbWarpFactorElR); lbWarpFactorElR.setText ("Warp El"); lbAzModeR.setVisible (rightTrMode); addChildComponent (&lbAzModeR); lbAzModeR.setText ("Az:"); lbElModeR.setVisible (rightTrMode); addChildComponent (&lbElModeR); lbElModeR.setText ("El:"); addAndMakeVisible (&lbGainL); lbGainL.setText ("Delay I"); addAndMakeVisible (&lbGainR); lbGainR.setText ("Delay II"); addAndMakeVisible (&lbGainDry); lbGainDry.setText ("Dry"); addAndMakeVisible (&lbLfoL); lbLfoL.setText ("Rate", "LFO", "Depth", false, true, false); addAndMakeVisible (&lbLfoR); lbLfoR.setText ("Rate", "LFO", "Depth", false, true, false); addAndMakeVisible (&lbFilterL); lbFilterL.setText ("HighPass", "Cutoff Frequency", "LowPass", false, true, false); addAndMakeVisible (&lbFilterR); lbFilterR.setText ("HighPass", "Cutoff Frequency", "LowPass", false, true, false); setSize (780, 550); startTimer (20); } DualDelayAudioProcessorEditor::~DualDelayAudioProcessorEditor() { setLookAndFeel (nullptr); } //============================================================================== void DualDelayAudioProcessorEditor::paint (juce::Graphics& g) { // (Our component is opaque, so we must completely fill the background with a solid colour) g.fillAll (globalLaF.ClBackground); } void DualDelayAudioProcessorEditor::resized() { // This is generally where you'll want to lay out the positions of any // subcomponents in your editor.. const int leftRightMargin = 30; const int headerHeight = 60; const int footerHeight = 25; const int textHeight = 14; const int sliderHeight = 70; const int sliderWidth = 55; const int sliderSpacing = 10; updateDelayUnit (! isModeMS); juce::Rectangle area (getLocalBounds()); juce::Rectangle groupArea; juce::Rectangle sliderRow; juce::Rectangle footerArea (area.removeFromBottom (footerHeight)); footer.setBounds (footerArea); area.removeFromLeft (leftRightMargin); area.removeFromRight (leftRightMargin); juce::Rectangle headerArea = area.removeFromTop (headerHeight); title.setBounds (headerArea); area.removeFromTop (10); juce::Rectangle tempArea; // ======== BEGIN: Rotations and Delays ========= tempArea = area.removeFromTop (40 + 2 * sliderHeight + 2 * textHeight); // ------ left side --------- groupArea = tempArea.removeFromLeft (5 * sliderWidth + 4 * sliderSpacing); gcRotDelL.setBounds (groupArea); groupArea.removeFromTop (30); // First row sliderRow = groupArea.removeFromTop (sliderHeight); auto tmp_componentArea = sliderRow.removeFromLeft (sliderWidth); btLeftTap.setBounds (tmp_componentArea.removeFromTop (45)); tmp_componentArea.removeFromTop (5); tbLeftSync.setBounds (tmp_componentArea.removeFromTop (20)); sliderRow.removeFromLeft (sliderSpacing); // spacing between rotary sliders tmp_componentArea = sliderRow.removeFromLeft (sliderWidth); SlLeftDelay.setBounds (tmp_componentArea); SlLeftDelayMS.setBounds (tmp_componentArea); sliderRow.removeFromLeft (sliderSpacing); // spacing between rotary sliders SlLeftDelayMult.setBounds (sliderRow.removeFromLeft (sliderWidth)); sliderRow.removeFromLeft (sliderSpacing); // spacing between rotary sliders SlLeftLfoRate.setBounds (sliderRow.removeFromLeft (sliderWidth)); sliderRow.removeFromLeft (sliderSpacing); // spacing between rotary sliders SlLeftLfoDepth.setBounds (sliderRow.removeFromLeft (sliderWidth)); // First row labels sliderRow = groupArea.removeFromTop (textHeight); sliderRow.removeFromLeft (sliderWidth + sliderSpacing); lbDelL.setBounds (sliderRow.removeFromLeft (sliderWidth)); sliderRow.removeFromLeft (sliderSpacing); lbDelMultL.setBounds (sliderRow.removeFromLeft (sliderWidth)); sliderRow.removeFromLeft (sliderSpacing); lbLfoL.setBounds (sliderRow.removeFromLeft (2 * sliderWidth + 10).reduced (15, 0)); // Second row groupArea.removeFromTop (sliderSpacing); sliderRow = groupArea.removeFromTop (sliderHeight); tmp_componentArea = sliderRow.removeFromLeft (2 * sliderWidth + sliderSpacing); cbLeftTransfromMode.setBounds (tmp_componentArea.removeFromTop (20)); tmp_componentArea.removeFromTop (5); auto tmp_cbArea = tmp_componentArea.removeFromTop (20); lbAzModeL.setBounds (tmp_cbArea.removeFromLeft (15)); tmp_cbArea.removeFromLeft (5); cbLeftWarpTypeAz.setBounds (tmp_cbArea); tmp_componentArea.removeFromTop (5); tmp_cbArea = tmp_componentArea.removeFromTop (20); lbElModeL.setBounds (tmp_cbArea.removeFromLeft (15)); tmp_cbArea.removeFromLeft (5); cbLeftWarpTypeEl.setBounds (tmp_cbArea); sliderRow.removeFromLeft (sliderSpacing); // spacing between rotary sliders tmp_componentArea = sliderRow; SlLeftYaw.setBounds (sliderRow.removeFromLeft (sliderWidth)); sliderRow.removeFromLeft (sliderSpacing); // spacing between rotary sliders SlLeftPitch.setBounds (sliderRow.removeFromLeft (sliderWidth)); sliderRow.removeFromLeft (sliderSpacing); // spacing between rotary sliders SlLeftRoll.setBounds (sliderRow); tmp_componentArea.reduce ((sliderWidth + sliderSpacing) * 0.5f, 0); SlLeftWarpFactorAz.setBounds (tmp_componentArea.removeFromLeft (sliderWidth)); tmp_componentArea.removeFromLeft (sliderSpacing); SlLeftWarpFactorEl.setBounds (tmp_componentArea); // Second Row Labels sliderRow = groupArea.removeFromTop (textHeight); sliderRow.removeFromLeft (2 * sliderWidth + 2 * sliderSpacing); tmp_componentArea = sliderRow; lbYawL.setBounds (sliderRow.removeFromLeft (sliderWidth)); sliderRow.removeFromLeft (sliderSpacing); lbPitchL.setBounds (sliderRow.removeFromLeft (sliderWidth)); sliderRow.removeFromLeft (sliderSpacing); lbRollL.setBounds (sliderRow); tmp_componentArea.reduce ((sliderWidth + sliderSpacing) * 0.5f, 0); lbWarpFactorAzL.setBounds (tmp_componentArea.removeFromLeft (sliderWidth)); tmp_componentArea.removeFromLeft (sliderSpacing); lbWarpFactorElL.setBounds (tmp_componentArea); // ------ right side -------- groupArea = tempArea.removeFromRight (5 * sliderWidth + 4 * sliderSpacing); gcRotDelR.setBounds (groupArea); groupArea.removeFromTop (30); // First row sliderRow = groupArea.removeFromTop (sliderHeight); tmp_componentArea = sliderRow.removeFromLeft (sliderWidth); btRightTap.setBounds (tmp_componentArea.removeFromTop (45)); tmp_componentArea.removeFromTop (5); tbRightSync.setBounds (tmp_componentArea.removeFromTop (20)); sliderRow.removeFromLeft (sliderSpacing); // spacing between rotary sliders tmp_componentArea = sliderRow.removeFromLeft (sliderWidth); SlRightDelay.setBounds (tmp_componentArea); SlRightDelayMS.setBounds (tmp_componentArea); sliderRow.removeFromLeft (sliderSpacing); // spacing between rotary sliders SlRightDelayMult.setBounds (sliderRow.removeFromLeft (sliderWidth)); sliderRow.removeFromLeft (sliderSpacing); // spacing between rotary sliders SlRightLfoRate.setBounds (sliderRow.removeFromLeft (sliderWidth)); sliderRow.removeFromLeft (sliderSpacing); // spacing between rotary sliders SlRightLfoDepth.setBounds (sliderRow.removeFromLeft (sliderWidth)); // First row labels sliderRow = groupArea.removeFromTop (textHeight); sliderRow.removeFromLeft (sliderWidth + sliderSpacing); lbDelR.setBounds (sliderRow.removeFromLeft (sliderWidth)); sliderRow.removeFromLeft (sliderSpacing); lbDelMultR.setBounds (sliderRow.removeFromLeft (sliderWidth)); sliderRow.removeFromLeft (sliderSpacing); lbLfoR.setBounds (sliderRow.removeFromLeft (2 * sliderWidth + 10).reduced (15, 0)); // Second row groupArea.removeFromTop (sliderSpacing); sliderRow = groupArea.removeFromTop (sliderHeight); tmp_componentArea = sliderRow.removeFromLeft (2 * sliderWidth + sliderSpacing); cbRightTransfromMode.setBounds (tmp_componentArea.removeFromTop (20)); tmp_componentArea.removeFromTop (5); tmp_cbArea = tmp_componentArea.removeFromTop (20); lbAzModeR.setBounds (tmp_cbArea.removeFromLeft (15)); tmp_cbArea.removeFromLeft (5); cbRightWarpTypeAz.setBounds (tmp_cbArea); tmp_componentArea.removeFromTop (5); tmp_cbArea = tmp_componentArea.removeFromTop (20); lbElModeR.setBounds (tmp_cbArea.removeFromLeft (15)); tmp_cbArea.removeFromLeft (5); cbRightWarpTypeEl.setBounds (tmp_cbArea); sliderRow.removeFromLeft (sliderSpacing); // spacing between rotary sliders tmp_componentArea = sliderRow; SlRightYaw.setBounds (sliderRow.removeFromLeft (sliderWidth)); sliderRow.removeFromLeft (sliderSpacing); // spacing between rotary sliders SlRightPitch.setBounds (sliderRow.removeFromLeft (sliderWidth)); sliderRow.removeFromLeft (sliderSpacing); // spacing between rotary sliders SlRightRoll.setBounds (sliderRow); tmp_componentArea.reduce ((sliderWidth + sliderSpacing) * 0.5f, 0); SlRightWarpFactorAz.setBounds (tmp_componentArea.removeFromLeft (sliderWidth)); tmp_componentArea.removeFromLeft (sliderSpacing); SlRightWarpFactorEl.setBounds (tmp_componentArea); // Second Row Labels sliderRow = groupArea.removeFromTop (textHeight); sliderRow.removeFromLeft (2 * sliderWidth + 2 * sliderSpacing); tmp_componentArea = sliderRow; lbYawR.setBounds (sliderRow.removeFromLeft (sliderWidth)); sliderRow.removeFromLeft (sliderSpacing); lbPitchR.setBounds (sliderRow.removeFromLeft (sliderWidth)); sliderRow.removeFromLeft (sliderSpacing); lbRollR.setBounds (sliderRow); tmp_componentArea.reduce ((sliderWidth + sliderSpacing) * 0.5f, 0); lbWarpFactorAzR.setBounds (tmp_componentArea.removeFromLeft (sliderWidth)); tmp_componentArea.removeFromLeft (sliderSpacing); lbWarpFactorElR.setBounds (tmp_componentArea); // ======== END: Rotations and Delays ================= // ======== BEGIN: BPM/MS button =========== int actualWidth = tempArea.getWidth(); int wantedWidth = 40; tempArea.removeFromLeft (juce::roundToInt ((actualWidth - wantedWidth) / 2)); tempArea.removeFromTop (25 + textHeight); btTimeMode.setBounds (tempArea.removeFromLeft (wantedWidth).removeFromTop (25)); // ======== BEGIN: BPM/MS button =========== area.removeFromTop (30); // spacing // ======== BEGIN: Filters ============= tempArea = area.removeFromTop (60 + textHeight); // ----- left side ------ groupArea = tempArea.removeFromLeft (330); gcFiltL.setBounds (groupArea); groupArea.removeFromTop (30); dblSlLeftFilter.setBounds (groupArea.removeFromTop (30)); lbFilterL.setBounds (groupArea.reduced (9, 0)); // ----- right side ------ groupArea = tempArea.removeFromRight (330); gcFiltR.setBounds (groupArea); groupArea.removeFromTop (30); dblSlRightFilter.setBounds (groupArea.removeFromTop (30)); lbFilterR.setBounds (groupArea.reduced (9, 0)); // ======== END: Filters =============== area.removeFromTop (30); // spacing // ======== BEGIN: Feedback ============= tempArea = area.removeFromTop (30 + sliderHeight + textHeight); // ------ left side ------------- groupArea = tempArea.removeFromLeft (120); gcFbL.setBounds (groupArea); groupArea.removeFromTop (30); sliderRow = groupArea.removeFromTop (sliderHeight); SlLeftFb.setBounds (sliderRow.removeFromLeft (55)); sliderRow.removeFromLeft (10); SlLeftCrossFb.setBounds (sliderRow.removeFromLeft (55)); lbFbL.setBounds (groupArea.removeFromLeft (55)); groupArea.removeFromLeft (10); lbXFbL.setBounds (groupArea.removeFromLeft (55)); // ------ right side ------------- groupArea = tempArea.removeFromRight (120); gcFbR.setBounds (groupArea); groupArea.removeFromTop (30); sliderRow = groupArea.removeFromTop (sliderHeight); SlRightFb.setBounds (sliderRow.removeFromLeft (55)); sliderRow.removeFromLeft (10); SlRightCrossFb.setBounds (sliderRow.removeFromLeft (55)); lbFbR.setBounds (groupArea.removeFromLeft (55)); groupArea.removeFromLeft (10); lbXFbR.setBounds (groupArea.removeFromLeft (55)); // ======== END: Feedback =============== // ======== BEGIN: Output Mix =========== actualWidth = tempArea.getWidth(); wantedWidth = 186; tempArea.removeFromLeft (juce::roundToInt ((actualWidth - wantedWidth) / 2)); tempArea.setWidth (wantedWidth); gcOutput.setBounds (tempArea); tempArea.removeFromTop (30); sliderRow = tempArea.removeFromTop (sliderHeight); SlLeftGain.setBounds (sliderRow.removeFromLeft (55)); sliderRow.removeFromLeft (10); // spacing between rotary sliders SlDryGain.setBounds (sliderRow.removeFromLeft (55)); sliderRow.removeFromLeft (10); // spacing between rotary sliders SlRightGain.setBounds (sliderRow.removeFromLeft (55)); sliderRow.removeFromLeft (10); // spacing between rotary sliders lbGainL.setBounds (tempArea.removeFromLeft (55)); tempArea.removeFromLeft (10); // spacing between rotary sliders lbGainDry.setBounds (tempArea.removeFromLeft (55)); tempArea.removeFromLeft (10); // spacing between rotary sliders lbGainR.setBounds (tempArea.removeFromLeft (55)); // ======== END: Output Mix ============= } void DualDelayAudioProcessorEditor::buttonClicked (juce::Button* button) { if ((button == &btLeftTap) || (button == &btRightTap)) { double currentTap = juce::Time::getMillisecondCounterHiRes(); double rawTapInterval = currentTap - lastTap; if (rawTapInterval > maxTapIntervalMS) { tapIntervalMS = 0.0; lastTap = currentTap; } else if (rawTapInterval > minTapIntervalMS) { if (tapIntervalMS > 0.0) { tapIntervalMS = tapBeta * tapIntervalMS + (1.0 - tapBeta) * rawTapInterval; } else { tapIntervalMS = rawTapInterval; } auto [bpm, mult] = processor.msToBPM (tapIntervalMS); if (button == &btRightTap) { SlRightDelayMS.setValue (tapIntervalMS, juce::dontSendNotification); SlRightDelay.setValue (bpm, juce::sendNotification); SlRightDelayMult.setValue (mult, juce::sendNotification); } else { SlLeftDelayMS.setValue (tapIntervalMS, juce::dontSendNotification); SlLeftDelay.setValue (bpm, juce::sendNotification); SlLeftDelayMult.setValue (mult, juce::sendNotification); } lastTap = currentTap; } } else if (button == &btTimeMode) { updateDelayUnit (! btTimeMode.getToggleState()); } if (button == &tbLeftSync) { if (tbLeftSync.getToggleState()) { // Disable slider when using host BPM SlLeftDelayMS.setVisible (false); SlLeftDelay.setVisible (false); SlLeftDelayMult.setVisible (true); lbDelL.setVisible (false); } else { // Restore default controls updateDelayUnit (! isModeMS); } } else if (button == &tbRightSync) { if (tbRightSync.getToggleState()) { // Disable slider when using host BPM SlRightDelayMS.setVisible (false); SlRightDelay.setVisible (false); SlRightDelayMult.setVisible (true); lbDelR.setVisible (false); } else { // Restore default controls updateDelayUnit (! isModeMS); } } } void DualDelayAudioProcessorEditor::sliderValueChanged (juce::Slider* slider) { if (slider == &SlLeftDelayMS) { if (isModeMS) { auto [bpm, mult] = processor.msToBPM (SlLeftDelayMS.getValue()); SlLeftDelay.setValue (bpm, juce::sendNotification); SlLeftDelayMult.setValue (mult, juce::sendNotification); } } else if (slider == &SlRightDelayMS) { if (isModeMS) { auto [bpm, mult] = processor.msToBPM (SlRightDelayMS.getValue()); SlRightDelay.setValue (bpm, juce::sendNotification); SlRightDelayMult.setValue (mult, juce::sendNotification); } } else if (slider == &SlLeftDelay) { float ms = (60000.0f / SlLeftDelay.getValue()) / *valueTreeState.getRawParameterValue ("delayMultL"); SlLeftDelayMS.setValue (ms, juce::dontSendNotification); } else if (slider == &SlRightDelay) { float ms = (60000.0f / SlRightDelay.getValue()) / *valueTreeState.getRawParameterValue ("delayMultR"); SlRightDelayMS.setValue (ms, juce::dontSendNotification); } else if (slider == &SlLeftDelayMult) { float ms = (60000.0f / SlLeftDelay.getValue()) / slider->getValue(); SlLeftDelayMS.setValue (ms, juce::dontSendNotification); } else if (slider == &SlRightDelayMult) { float ms = (60000.0f / SlRightDelay.getValue()) / slider->getValue(); SlRightDelayMS.setValue (ms, juce::dontSendNotification); } } void DualDelayAudioProcessorEditor::comboBoxChanged (juce::ComboBox* comboBox) { if (comboBox == &cbLeftTransfromMode) updateTransformMode (0); else if (comboBox == &cbRightTransfromMode) updateTransformMode (1); } void DualDelayAudioProcessorEditor::updateDelayUnit (bool isBPM) { if (! tbLeftSync.getToggleState()) { SlLeftDelayMS.setVisible (! isBPM); SlLeftDelay.setVisible (isBPM); SlLeftDelayMult.setVisible (isBPM); lbDelMultL.setVisible (isBPM); } if (! tbRightSync.getToggleState()) { SlRightDelayMS.setVisible (! isBPM); SlRightDelay.setVisible (isBPM); SlRightDelayMult.setVisible (isBPM); lbDelMultR.setVisible (isBPM); } btTimeMode.setButtonText (isBPM ? "BPM" : "ms"); isModeMS = ! isBPM; } void DualDelayAudioProcessorEditor::updateTransformMode (bool side) { if (side) { bool rightTrMode = cbRightTransfromMode.getSelectedId() == 1; SlRightYaw.setVisible (rightTrMode); SlRightPitch.setVisible (rightTrMode); SlRightRoll.setVisible (rightTrMode); lbYawR.setVisible (rightTrMode); lbPitchR.setVisible (rightTrMode); lbRollR.setVisible (rightTrMode); cbRightWarpTypeAz.setVisible (! rightTrMode); cbRightWarpTypeEl.setVisible (! rightTrMode); SlRightWarpFactorAz.setVisible (! rightTrMode); SlRightWarpFactorEl.setVisible (! rightTrMode); lbWarpFactorAzR.setVisible (! rightTrMode); lbWarpFactorElR.setVisible (! rightTrMode); lbAzModeR.setVisible (! rightTrMode); lbElModeR.setVisible (! rightTrMode); } else { bool leftTrMode = cbLeftTransfromMode.getSelectedId() == 1; SlLeftYaw.setVisible (leftTrMode); SlLeftPitch.setVisible (leftTrMode); SlLeftRoll.setVisible (leftTrMode); lbYawL.setVisible (leftTrMode); lbPitchL.setVisible (leftTrMode); lbRollL.setVisible (leftTrMode); cbLeftWarpTypeAz.setVisible (! leftTrMode); cbLeftWarpTypeEl.setVisible (! leftTrMode); SlLeftWarpFactorAz.setVisible (! leftTrMode); SlLeftWarpFactorEl.setVisible (! leftTrMode); lbWarpFactorAzL.setVisible (! leftTrMode); lbWarpFactorElL.setVisible (! leftTrMode); lbAzModeL.setVisible (! leftTrMode); lbElModeL.setVisible (! leftTrMode); } } void DualDelayAudioProcessorEditor::timerCallback() { // === update titleBar widgets according to available input/output channel counts auto sizes = processor.getMaxSize(); sizes.first = juce::jmin (sizes.first, sizes.second); sizes.second = sizes.first; title.setMaxSize (sizes); // ========================================== } IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/DualDelay/Source/PluginProcessor.h0000664002537200253720000001136215257173642031245 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich, Felix Holzmüller Copyright (c) 2017, 2024 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once #include #include "../../resources/AmbisonicRotator.h" #include "../../resources/AmbisonicWarp.h" #include "../../resources/AudioProcessorBase.h" #include "../../resources/OnePoleFilter.h" #include "../../resources/ambisonicTools.h" #define ProcessorClass DualDelayAudioProcessor #define OneOverSqrt2 0.7071067811865475f //============================================================================== /** */ class DualDelayAudioProcessor : public AudioProcessorBase, IOTypes::Ambisonics<>, true> { public: constexpr static int maxOrder = 7; constexpr static int numberOfInputChannels = (maxOrder + 1) * (maxOrder + 1); constexpr static int numberOfOutputChannels = (maxOrder + 1) * (maxOrder + 1); //============================================================================== DualDelayAudioProcessor(); ~DualDelayAudioProcessor(); //============================================================================== void prepareToPlay (double sampleRate, int samplesPerBlock) override; void releaseResources() override; void processBlock (juce::AudioSampleBuffer&, juce::MidiBuffer&) override; //============================================================================== juce::AudioProcessorEditor* createEditor() override; bool hasEditor() const override; //============================================================================== int getNumPrograms() override; int getCurrentProgram() override; void setCurrentProgram (int index) override; const juce::String getProgramName (int index) override; void changeProgramName (int index, const juce::String& newName) override; //============================================================================== void getStateInformation (juce::MemoryBlock& destData) override; void setStateInformation (const void* data, int sizeInBytes) override; void parameterChanged (const juce::String& parameterID, float newValue) override; void updateBuffers() override; void updateFilters (int idx); std::tuple msToBPM (float ms); //======= Parameters =========================================================== std::vector> createParameterLayout(); //============================================================================== private: //============================================================================== // parameters std::atomic* dryGain; std::atomic* wetGain[2]; std::atomic* delayBPM[2]; std::atomic* delayMult[2]; std::atomic* sync[2]; std::atomic* transformMode[2]; std::atomic* yaw[2]; std::atomic* pitch[2]; std::atomic* roll[2]; std::atomic* warpModeAz[2]; std::atomic* warpModeEl[2]; std::atomic* warpFactorAz[2]; std::atomic* warpFactorEl[2]; std::atomic* LPcutOff[2]; std::atomic* HPcutOff[2]; std::atomic* feedback[2]; std::atomic* xfeedback[2]; std::atomic* lfoRate[2]; std::atomic* lfoDepth[2]; std::atomic* orderSetting; juce::dsp::Oscillator LFO[2]; AmbisonicRotator rotator[2]; AmbisonicWarp warp[2]; juce::OwnedArray lowPassFilters[2]; juce::OwnedArray highPassFilters[2]; juce::dsp::DelayLine delayLine[2]; juce::AudioBuffer delayBuffer[2]; juce::AudioBuffer delayOutBuffer[2]; OnePoleFilter delayTimeInterp[2]; bool updateFilterCoeffs = false; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DualDelayAudioProcessor) }; IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/DualDelay/Source/PluginEditor.h0000664002537200253720000001426515257173642030521 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once #include "../JuceLibraryCode/JuceHeader.h" #include "PluginProcessor.h" #include "../../resources/customComponents/DoubleSlider.h" #include "../../resources/customComponents/ReverseSlider.h" #include "../../resources/customComponents/SimpleLabel.h" #include "../../resources/customComponents/TitleBar.h" #include "../../resources/lookAndFeel/IEM_LaF.h" typedef ReverseSlider::SliderAttachment SliderAttachment; typedef juce::AudioProcessorValueTreeState::ComboBoxAttachment ComboBoxAttachment; typedef juce::AudioProcessorValueTreeState::ButtonAttachment ButtonAttachment; //============================================================================== /** */ class DualDelayAudioProcessorEditor : public juce::AudioProcessorEditor, private juce::Timer, private juce::Time, private juce::Button::Listener, private juce::Slider::Listener, private juce::ComboBox::Listener { public: DualDelayAudioProcessorEditor (DualDelayAudioProcessor&, juce::AudioProcessorValueTreeState&); ~DualDelayAudioProcessorEditor(); //============================================================================== void paint (juce::Graphics&) override; void resized() override; void buttonClicked (juce::Button* button) override; void sliderValueChanged (juce::Slider* slider) override; void comboBoxChanged (juce::ComboBox* comboBox) override; private: LaF globalLaF; void updateDelayUnit (bool isBPM); void updateTransformMode (bool side); void timerCallback() override; DualDelayAudioProcessor& processor; juce::AudioProcessorValueTreeState& valueTreeState; TitleBar, NoIOWidget> title; OSCFooter footer; std::unique_ptr cbNormalizationAttachement; std::unique_ptr cbOrderAttachement; int maxPossibleOrder; ReverseSlider SlDryGain; std::unique_ptr SlDryGainAttachment; // elements for left side DoubleSlider dblSlLeftFilter; ReverseSlider SlLeftYaw, SlLeftPitch, SlLeftRoll; ReverseSlider SlLeftWarpFactorAz, SlLeftWarpFactorEl; ReverseSlider SlLeftDelay, SlLeftDelayMS, SlLeftDelayMult, SlLeftLfoRate, SlLeftLfoDepth, SlLeftFb, SlLeftCrossFb, SlLeftGain; juce::ComboBox cbLeftTransfromMode, cbLeftWarpTypeAz, cbLeftWarpTypeEl; juce::ToggleButton tbLeftSync; juce::TextButton btLeftTap; std::unique_ptr dblSlLeftFilterHpAttachment, dblSlLeftFilterLpAttachment; std::unique_ptr SlLeftYawAttachment, SlLeftPitchAttachment, SlLeftRollAttachment; std::unique_ptr SlLeftWarpFactorAzAttachment, SlLeftWarpFactorElAttachment; std::unique_ptr SlLeftDelayAttachment, SlLeftDelayMultAttachment, SlLeftLfoRateAttachment, SlLeftLfoDepthAttachment, SlLeftFbAttachment, SlLeftCrossFbAttachment, SlLeftGainAttachment; std::unique_ptr cbLeftTransfromModeAttachment, cbLeftWarpTypeAzAttachment, cbLeftWarpTypeElAttachment; std::unique_ptr btLeftSyncAttachment; // elements for right side DoubleSlider dblSlRightFilter; ReverseSlider SlRightYaw, SlRightPitch, SlRightRoll; ReverseSlider SlRightWarpFactorAz, SlRightWarpFactorEl; ReverseSlider SlRightDelay, SlRightDelayMS, SlRightDelayMult, SlRightLfoRate, SlRightLfoDepth, SlRightFb, SlRightCrossFb, SlRightGain; juce::ComboBox cbRightTransfromMode, cbRightWarpTypeAz, cbRightWarpTypeEl; juce::ToggleButton tbRightSync; juce::TextButton btRightTap; std::unique_ptr dblSlRightFilterHpAttachment, dblSlRightFilterLpAttachment; std::unique_ptr SlRightYawAttachment, SlRightPitchAttachment, SlRightRollAttachment; std::unique_ptr SlRightWarpFactorAzAttachment, SlRightWarpFactorElAttachment; std::unique_ptr SlRightDelayAttachment, SlRightDelayMultAttachment, SlRightLfoRateAttachment, SlRightLfoDepthAttachment, SlRightFbAttachment, SlRightCrossFbAttachment, SlRightGainAttachment; std::unique_ptr cbRightTransfromModeAttachment, cbRightWarpTypeAzAttachment, cbRightWarpTypeElAttachment; std::unique_ptr btRightSyncAttachment; juce::TextButton btTimeMode; // labels and groups SimpleLabel lbYawL, lbPitchL, lbRollL, lbDelL, lbDelMultL, lbFbL, lbXFbL, lbWarpFactorAzL, lbAzModeL, lbElModeL, lbWarpFactorElL; SimpleLabel lbYawR, lbPitchR, lbRollR, lbDelR, lbDelMultR, lbFbR, lbXFbR, lbWarpFactorAzR, lbAzModeR, lbElModeR, lbWarpFactorElR; SimpleLabel lbGainL, lbGainR, lbGainDry; TripleLabel lbLfoL, lbLfoR, lbFilterL, lbFilterR; juce::GroupComponent gcRotDelL, gcRotDelR, gcFiltL, gcFiltR, gcFbL, gcFbR, gcOutput; double lastTap = 0.0; double tapIntervalMS = 0.0; const double tapBeta = 0.8; const double minTapIntervalMS = 100.0; const double maxTapIntervalMS = 2000.0; bool isModeMS { false }; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DualDelayAudioProcessorEditor) }; IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/DualDelay/CMakeLists.txt0000664002537200253720000000365415257173642027243 0ustar zmoelnigzmoelnigset (PLUGIN_TARGET "") if (IEM_FORMATS) juce_add_plugin (DualDelay PLUGIN_MANUFACTURER_CODE IEMA PLUGIN_CODE DuDe ICON_BIG "../resources/Standalone/IEMPluginSuiteSmall.png" ICON_SMALL "../resources/Standalone/IEMPluginSuiteSmall.png" COMPANY_NAME "IEM" PRODUCT_NAME "DualDelay" FORMATS ${IEM_FORMATS} VERSION ${DualDelay_VERSION} LV2URI "http://plugins.iem.at/DualDelay" VST2_CATEGORY kPlugSurroundFx kPlugCategSpacializer kPlugCategEffect VST3_CATEGORIES Spatial Surround Delay Fx AAX_CATEGORY SoundField Delay) list (APPEND PLUGIN_TARGET DualDelay) endif() foreach (TARGET IN LISTS PLUGIN_TARGET) juce_generate_juce_header (${TARGET}) target_sources (${TARGET} PRIVATE Source/PluginEditor.cpp Source/PluginEditor.h Source/PluginProcessor.cpp Source/PluginProcessor.h ../resources/OSC/OSCInputStream.h ../resources/OSC/OSCParameterInterface.cpp ../resources/OSC/OSCParameterInterface.h ../resources/OSC/OSCStatus.cpp ../resources/OSC/OSCStatus.h ../resources/OSC/OSCUtilities.h ../resources/efficientSHvanilla.cpp ) target_compile_definitions (${TARGET} PRIVATE JUCE_USE_CURL=0 JUCE_WEB_BROWSER=0 JUCE_USE_CUSTOM_PLUGIN_STANDALONE_APP=1 JUCE_USE_FLAC=0 JUCE_USE_OGGVORBIS=0 JUCE_USE_MP3AUDIOFORMAT=0 JUCE_USE_LAME_AUDIO_FORMAT=0 JUCE_USE_WINDOWS_MEDIA_FORMAT=0 JUCE_VST3_CAN_REPLACE_VST2=0) target_include_directories (${TARGET} PRIVATE Source) target_link_libraries (${TARGET} PRIVATE LAF_fonts IEM_logo juce::juce_audio_utils juce::juce_audio_plugin_client juce::juce_osc juce::juce_dsp juce::juce_opengl juce::juce_recommended_config_flags juce::juce_recommended_lto_flags) endforeach() IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/AllRADecoder/0000775002537200253720000000000015257173642025050 5ustar zmoelnigzmoelnigIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/AllRADecoder/Source/0000775002537200253720000000000015257173642026310 5ustar zmoelnigzmoelnig././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/AllRADecoder/Source/PluginProcessor.cppIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/AllRADecoder/Source/PluginProcessor.0000664002537200253720000016151215257173642031455 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Authors: Daniel Rudrich, Franz Zotter Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #include "PluginProcessor.h" #include "PluginEditor.h" #include const juce::StringArray AllRADecoderAudioProcessor::weightsStrings = juce::StringArray ("basic", "maxrE", "inphase"); //============================================================================== AllRADecoderAudioProcessor::AllRADecoderAudioProcessor() : AudioProcessorBase ( #ifndef JucePlugin_PreferredChannelConfigurations BusesProperties() #if ! JucePlugin_IsMidiEffect #if ! JucePlugin_IsSynth .withInput ("Input", ((juce::PluginHostType::getPluginLoadedAs() == juce::AudioProcessor::wrapperType_VST3) ? juce::AudioChannelSet::ambisonic (1) : juce::AudioChannelSet::ambisonic (7)), true) #endif .withOutput ("Output", ((juce::PluginHostType::getPluginLoadedAs() == juce::AudioProcessor::wrapperType_VST3) ? juce::AudioChannelSet::ambisonic (1) : juce::AudioChannelSet::ambisonic (7)), true) #endif , #endif createParameterLayout()), energyDistribution (juce::Image::PixelFormat::ARGB, 200, 100, true), rEVector (juce::Image::PixelFormat::ARGB, 200, 100, true) { // get pointers to the parameters inputOrderSetting = parameters.getRawParameterValue ("inputOrderSetting"); useSN3D = parameters.getRawParameterValue ("useSN3D"); decoderOrder = parameters.getRawParameterValue ("decoderOrder"); exportDecoder = parameters.getRawParameterValue ("exportDecoder"); exportLayout = parameters.getRawParameterValue ("exportLayout"); weights = parameters.getRawParameterValue ("weights"); // add listeners to parameter changes parameters.addParameterListener ("inputOrderSetting", this); parameters.addParameterListener ("useSN3D", this); // global properties juce::PropertiesFile::Options options; options.applicationName = "AllRADecoder"; options.filenameSuffix = "settings"; options.folderName = "IEM"; options.osxLibrarySubFolder = "Preferences"; properties.reset (new juce::PropertiesFile (options)); lastDir = juce::File (properties->getValue ("presetFolder")); undoManager.beginNewTransaction(); loudspeakers.appendChild ( createLoudspeakerFromSpherical (juce::Vector3D (1.0f, 0.0f, 0.0f), 1), &undoManager); undoManager.beginNewTransaction(); loudspeakers.appendChild ( createLoudspeakerFromSpherical (juce::Vector3D (1.0f, 45.0f, 0.0f), 2, true), &undoManager); undoManager.beginNewTransaction(); loudspeakers.appendChild ( createLoudspeakerFromSpherical (juce::Vector3D (1.0f, 90.0f, 0.0f), 3), &undoManager); undoManager.beginNewTransaction(); loudspeakers.appendChild ( createLoudspeakerFromSpherical (juce::Vector3D (1.0f, 135.0f, 0.0f), 4), &undoManager); undoManager.beginNewTransaction(); loudspeakers.appendChild ( createLoudspeakerFromSpherical (juce::Vector3D (1.0f, 180.0f, 0.0f), 5), &undoManager); undoManager.beginNewTransaction(); loudspeakers.appendChild ( createLoudspeakerFromSpherical (juce::Vector3D (1.0f, -135.0f, 0.0f), 6), &undoManager); undoManager.beginNewTransaction(); loudspeakers.appendChild ( createLoudspeakerFromSpherical (juce::Vector3D (1.0f, -90.0f, 0.0f), 7), &undoManager); undoManager.beginNewTransaction(); loudspeakers.appendChild ( createLoudspeakerFromSpherical (juce::Vector3D (1.0f, -45.0f, 0.0f), 8), &undoManager); undoManager.beginNewTransaction(); loudspeakers.appendChild ( createLoudspeakerFromSpherical (juce::Vector3D (1.0f, 22.5f, 40.0f), 9), &undoManager); undoManager.beginNewTransaction(); loudspeakers.appendChild ( createLoudspeakerFromSpherical (juce::Vector3D (1.0f, 142.5f, 40.0f), 10), &undoManager); undoManager.beginNewTransaction(); loudspeakers.appendChild ( createLoudspeakerFromSpherical (juce::Vector3D (1.0f, -97.5f, 40.0f), 11), &undoManager); undoManager.beginNewTransaction(); loudspeakers.appendChild ( createLoudspeakerFromSpherical (juce::Vector3D (1.0f, 0.0f, -90.0f), 12), &undoManager); loudspeakers.addListener (this); prepareLayout(); } AllRADecoderAudioProcessor::~AllRADecoderAudioProcessor() { } int AllRADecoderAudioProcessor::getNumPrograms() { return 2; // NB: some hosts don't cope very well if you tell them there are 0 programs, // so this should be at least 1, even if you're not really implementing programs. } int AllRADecoderAudioProcessor::getCurrentProgram() { return 0; } void AllRADecoderAudioProcessor::setCurrentProgram (int index) { if (index == 1) { loudspeakers.removeListener (this); undoManager.beginNewTransaction(); loudspeakers.removeAllChildren (&undoManager); loudspeakers.appendChild ( createLoudspeakerFromSpherical (juce::Vector3D (1.0f, 0.0f, 0.0f), 1), &undoManager); loudspeakers.appendChild ( createLoudspeakerFromSpherical (juce::Vector3D (1.0f, -24.0f, 0.0f), 2), &undoManager); loudspeakers.appendChild ( createLoudspeakerFromSpherical (juce::Vector3D (1.0f, -48.0f, 0.0f), 3), &undoManager); loudspeakers.appendChild ( createLoudspeakerFromSpherical (juce::Vector3D (1.0f, -72.0f, 0.0f), 4), &undoManager); loudspeakers.appendChild ( createLoudspeakerFromSpherical (juce::Vector3D (1.0f, -102.0f, 0.0f), 5), &undoManager); loudspeakers.appendChild ( createLoudspeakerFromSpherical (juce::Vector3D (1.0f, -138.0f, 0.0f), 6), &undoManager); loudspeakers.appendChild ( createLoudspeakerFromSpherical (juce::Vector3D (1.0f, -178.0f, 0.0f), 7), &undoManager); loudspeakers.appendChild ( createLoudspeakerFromSpherical (juce::Vector3D (1.0f, 142.0f, 0.0f), 8), &undoManager); loudspeakers.appendChild ( createLoudspeakerFromSpherical (juce::Vector3D (1.0f, 102.0f, 0.0f), 9), &undoManager); loudspeakers.appendChild ( createLoudspeakerFromSpherical (juce::Vector3D (1.0f, 70.0f, 0.0f), 10), &undoManager); loudspeakers.appendChild ( createLoudspeakerFromSpherical (juce::Vector3D (1.0f, 45.0f, 0.0f), 11), &undoManager); loudspeakers.appendChild ( createLoudspeakerFromSpherical (juce::Vector3D (1.0f, 23.0f, 0.0f), 12), &undoManager); loudspeakers.appendChild ( createLoudspeakerFromSpherical (juce::Vector3D (1.0f, -24.0f, 28.0f), 13), &undoManager); loudspeakers.appendChild ( createLoudspeakerFromSpherical (juce::Vector3D (1.0f, -69.0f, 28.0f), 14), &undoManager); loudspeakers.appendChild ( createLoudspeakerFromSpherical (juce::Vector3D (1.0f, -115.0f, 27.0f), 15), &undoManager); loudspeakers.appendChild ( createLoudspeakerFromSpherical (juce::Vector3D (1.0f, -159.0f, 27.0f), 16), &undoManager); loudspeakers.appendChild ( createLoudspeakerFromSpherical (juce::Vector3D (1.0f, 155.0f, 28.0f), 17), &undoManager); loudspeakers.appendChild ( createLoudspeakerFromSpherical (juce::Vector3D (1.0f, 112.0f, 28.0f), 18), &undoManager); loudspeakers.appendChild ( createLoudspeakerFromSpherical (juce::Vector3D (1.0f, 66.0f, 29.0f), 19), &undoManager); loudspeakers.appendChild ( createLoudspeakerFromSpherical (juce::Vector3D (1.0f, 22.0f, 28.0f), 20), &undoManager); loudspeakers.appendChild ( createLoudspeakerFromSpherical (juce::Vector3D (1.0f, 0.0f, 60.0f), 21), &undoManager); loudspeakers.appendChild ( createLoudspeakerFromSpherical (juce::Vector3D (1.0f, -91.0f, 59.0f), 22), &undoManager); loudspeakers.appendChild ( createLoudspeakerFromSpherical (juce::Vector3D (1.0f, -178.0f, 59.0f), 23), &undoManager); loudspeakers.appendChild ( createLoudspeakerFromSpherical (juce::Vector3D (1.0f, 86.0f, 60.0f), 24), &undoManager); loudspeakers.appendChild ( createLoudspeakerFromSpherical (juce::Vector3D (1.0f, 0.0f, 90.0f), 25), &undoManager); loudspeakers.appendChild ( createLoudspeakerFromSpherical (juce::Vector3D (1.0f, 0.0f, -90.0f), 25, true, 0.0f), &undoManager); loudspeakers.addListener (this); prepareLayout(); updateTable = true; } } const juce::String AllRADecoderAudioProcessor::getProgramName (int index) { if (index == 1) return "IEM CUBE"; else return "default"; } void AllRADecoderAudioProcessor::changeProgramName (int index, const juce::String& newName) { } //============================================================================== void AllRADecoderAudioProcessor::prepareToPlay (double sampleRate, int samplesPerBlock) { checkInputAndOutput (this, *inputOrderSetting, 64, true); juce::dsp::ProcessSpec specs; specs.sampleRate = sampleRate; specs.maximumBlockSize = samplesPerBlock; specs.numChannels = 64; decoder.prepare (specs); noiseBurst.prepare (specs); ambisonicNoiseBurst.prepare (specs); } void AllRADecoderAudioProcessor::releaseResources() { // When playback stops, you can use this as an opportunity to free up any // spare memory, etc. } void AllRADecoderAudioProcessor::processBlock (juce::AudioBuffer& buffer, juce::MidiBuffer& midiMessages) { checkInputAndOutput (this, *inputOrderSetting, 64, false); juce::ScopedNoDenormals noDenormals; // ====== is a decoder loaded? stop processing if not =========== decoder.checkIfNewDecoderAvailable(); if (decoder.getCurrentDecoder() == nullptr) { buffer.clear(); } else { ambisonicNoiseBurst.processBuffer (buffer); const int nChIn = juce::jmin (decoder.getCurrentDecoder()->getNumInputChannels(), buffer.getNumChannels(), input.getNumberOfChannels()); const int nChOut = juce::jmin (decoder.getCurrentDecoder()->getNumOutputChannels(), buffer.getNumChannels()); for (int ch = juce::jmax (nChIn, nChOut); ch < buffer.getNumChannels(); ++ch) // clear all not needed channels buffer.clear (ch, 0, buffer.getNumSamples()); decoder.setInputNormalization (*useSN3D >= 0.5f ? ReferenceCountedDecoder::Normalization::sn3d : ReferenceCountedDecoder::Normalization::n3d); const int L = buffer.getNumSamples(); auto inputAudioBlock = juce::dsp::AudioBlock (buffer.getArrayOfWritePointers(), nChIn, L); auto outputAudioBlock = juce::dsp::AudioBlock (buffer.getArrayOfWritePointers(), nChOut, L); decoder.process (inputAudioBlock, outputAudioBlock); for (int ch = nChOut; ch < buffer.getNumChannels(); ++ch) // clear all not needed channels buffer.clear (ch, 0, buffer.getNumSamples()); } noiseBurst.processBuffer (buffer); } //============================================================================== bool AllRADecoderAudioProcessor::hasEditor() const { return true; // (change this to false if you choose to not supply an editor) } juce::AudioProcessorEditor* AllRADecoderAudioProcessor::createEditor() { return new AllRADecoderAudioProcessorEditor (*this, parameters); } //============================================================================== void AllRADecoderAudioProcessor::getStateInformation (juce::MemoryBlock& destData) { if (parameters.state.getChildWithName ("Loudspeakers").isValid() && parameters.state.getChildWithName ("Loudspeakers") != loudspeakers) { parameters.state.removeChild (parameters.state.getChildWithName ("Loudspeakers"), nullptr); } parameters.state.appendChild (loudspeakers, nullptr); auto state = parameters.copyState(); auto oscConfig = state.getOrCreateChildWithName ("OSCConfig", nullptr); oscConfig.copyPropertiesFrom (oscParameterInterface.getConfig(), nullptr); std::unique_ptr xml (state.createXml()); copyXmlToBinary (*xml, destData); } void AllRADecoderAudioProcessor::setStateInformation (const void* data, int sizeInBytes) { std::unique_ptr xmlState (getXmlFromBinary (data, sizeInBytes)); if (xmlState != nullptr) { if (xmlState->hasTagName (parameters.state.getType())) { parameters.replaceState (juce::ValueTree::fromXml (*xmlState)); if (parameters.state.hasProperty ("OSCPort")) // legacy { oscParameterInterface.getOSCReceiver().connect ( parameters.state.getProperty ("OSCPort", juce::var (-1))); parameters.state.removeProperty ("OSCPort", nullptr); } auto oscConfig = parameters.state.getChildWithName ("OSCConfig"); if (oscConfig.isValid()) oscParameterInterface.setConfig (oscConfig); } juce::XmlElement* lsps (xmlState->getChildByName ("Loudspeakers")); if (lsps != nullptr) { loudspeakers.removeListener (this); loudspeakers.removeAllChildren (nullptr); const int nChilds = lsps->getNumChildElements(); for (int i = 0; i < nChilds; ++i) { juce::XmlElement* lsp (lsps->getChildElement (i)); if (lsp->getTagName() == "Element" || lsp->getTagName() == "Loudspeaker") loudspeakers.appendChild ( createLoudspeakerFromSpherical ( juce::Vector3D (lsp->getDoubleAttribute ("Radius", 1.0), lsp->getDoubleAttribute ("Azimuth"), lsp->getDoubleAttribute ("Elevation")), lsp->getIntAttribute ("Channel", -1), lsp->getBoolAttribute ("Imaginary", false), lsp->getDoubleAttribute ("Gain", 1.0)), &undoManager); } undoManager.clearUndoHistory(); loudspeakers.addListener (this); prepareLayout(); updateTable = true; calculateDecoder(); } } } //============================================================================== void AllRADecoderAudioProcessor::parameterChanged (const juce::String& parameterID, float newValue) { DBG ("Parameter with ID " << parameterID << " has changed. New value: " << newValue); if (parameterID == "inputOrderSetting" || parameterID == "outputOrderSetting") userChangedIOSettings = true; else if (parameterID == "useSN3D") decoder.setInputNormalization (*useSN3D >= 0.5f ? ReferenceCountedDecoder::Normalization::sn3d : ReferenceCountedDecoder::Normalization::n3d); } void AllRADecoderAudioProcessor::updateBuffers() { DBG ("IOHelper: input size: " << input.getSize()); DBG ("IOHelper: output size: " << output.getSize()); } //============================================================================== // This creates new instances of the plugin.. juce::AudioProcessor* JUCE_CALLTYPE createPluginFilter() { return new AllRADecoderAudioProcessor(); } juce::Result AllRADecoderAudioProcessor::verifyLoudspeakers() { const int nLsps = loudspeakers.getNumChildren(); if (nLsps == 0) return juce::Result::fail ("There are no loudspeakers."); for (int i = 0; i < nLsps; ++i) { juce::ValueTree lsp = loudspeakers.getChild (i); if (! lsp.isValid()) return juce::Result::fail ("Something went wrong. Try again!"); if (lsp.hasProperty ("Azimuth")) { const auto azimuth = lsp.getProperty ("Azimuth", juce::var()); if (! azimuth.isDouble() && ! azimuth.isInt()) return juce::Result::fail ( "Loudspeaker #" + juce::String (i + 1) + ": 'Azimuth' value is neither a double nor an integer."); } else return juce::Result::fail ("Loudspeaker #" + juce::String (i + 1) + ": Missing 'Azumith' attribute."); if (lsp.hasProperty ("Elevation")) //mandatory { const auto elevation = lsp.getProperty ("Elevation", juce::var()); if (! elevation.isDouble() && ! elevation.isInt()) return juce::Result::fail ( "Loudspeaker #" + juce::String (i + 1) + ": 'Elevation' value is neither a double nor an integer."); } else return juce::Result::fail ("Loudspeaker #" + juce::String (i + 1) + ": Missing 'Elevation' attribute."); if (lsp.hasProperty ("Radius")) //optional { const auto radius = lsp.getProperty ("Radius", juce::var()); if (! radius.isDouble() && ! radius.isInt()) return juce::Result::fail ( "Loudspeaker #" + juce::String (i + 1) + ": 'Radius' value is neither a double nor an integer."); if ((float) radius < FLT_EPSILON) return juce::Result::fail ("Loudspeaker #" + juce::String (i + 1) + ": Radius has to be greater than zero."); } bool isImaginary = false; if (lsp.hasProperty ("IsImaginary")) //optional { const auto imaginary = lsp.getProperty ("IsImaginary", juce::var()); if (! imaginary.isBool()) return juce::Result::fail ("Loudspeaker #" + juce::String (i + 1) + ": 'IsImaginary' value is not a bool."); isImaginary = imaginary; } if (! isImaginary) { if (lsp.hasProperty ("Channel")) //mandatory { const auto channel = lsp.getProperty ("Channel", juce::var()); if (! channel.isInt()) return juce::Result::fail ("Loudspeaker #" + juce::String (i + 1) + ": 'Channel' value is not an integer."); } else return juce::Result::fail ("Loudspeaker #" + juce::String (i + 1) + ": Missing 'Channel' attribute."); } } return juce::Result::ok(); } juce::Result AllRADecoderAudioProcessor::calculateTris() { return juce::Result::ok(); } juce::ValueTree AllRADecoderAudioProcessor::createLoudspeakerFromCartesian ( juce::Vector3D cartCoordinates, int channel, bool isImaginary, float gain) { juce::Vector3D sphericalCoordinates = cartesianToSpherical (cartCoordinates); return createLoudspeakerFromSpherical (sphericalCoordinates, channel, isImaginary, gain); } juce::ValueTree AllRADecoderAudioProcessor::createLoudspeakerFromSpherical ( juce::Vector3D sphericalCoordinates, int channel, bool isImaginary, float gain) { return ConfigurationHelper::createElement (sphericalCoordinates.y, sphericalCoordinates.z, sphericalCoordinates.x, channel, isImaginary, gain); } juce::Vector3D AllRADecoderAudioProcessor::cartesianToSpherical (juce::Vector3D cartvect) { const float r = cartvect.length(); return juce::Vector3D ( r, // radius juce::radiansToDegrees (std::atan2 (cartvect.y, cartvect.x)), // azimuth juce::radiansToDegrees ( std::atan2 (cartvect.z, std::sqrt (cartvect.x * cartvect.x + cartvect.y * cartvect.y))) // elevation ); } juce::Vector3D AllRADecoderAudioProcessor::sphericalToCartesian (juce::Vector3D sphervect) { return juce::Vector3D (sphervect.x * std::cos (juce::degreesToRadians (sphervect.z)) * std::cos (juce::degreesToRadians (sphervect.y)), sphervect.x * std::cos (juce::degreesToRadians (sphervect.z)) * std::sin (juce::degreesToRadians (sphervect.y)), sphervect.x * std::sin (juce::degreesToRadians (sphervect.z))); } juce::Vector3D AllRADecoderAudioProcessor::sphericalInRadiansToCartesian (juce::Vector3D sphervect) { return juce::Vector3D (sphervect.x * std::cos (sphervect.z) * cos (sphervect.y), sphervect.x * std::cos (sphervect.z) * sin (sphervect.y), sphervect.x * std::sin (sphervect.z)); } void AllRADecoderAudioProcessor::playNoiseBurst (const int channel) { noiseBurst.setChannel (channel); } void AllRADecoderAudioProcessor::playAmbisonicNoiseBurst (const float azimuthInDegrees, const float elevationInDegrees) { auto dec = decoder.getCurrentDecoder(); if (dec != nullptr) { ambisonicNoiseBurst.setOrder (decoder.getCurrentDecoder()->getOrder()); ambisonicNoiseBurst.setNormalization (*useSN3D >= 0.5f); ambisonicNoiseBurst.play (azimuthInDegrees, elevationInDegrees); } } void AllRADecoderAudioProcessor::addImaginaryLoudspeakerBelow() { undoManager.beginNewTransaction(); loudspeakers.appendChild ( createLoudspeakerFromCartesian (juce::Vector3D (0.0f, 0.0f, -1.0f), highestChannelNumber + 1, true, 0.0f), &undoManager); } void AllRADecoderAudioProcessor::clearLoudspeakers() { undoManager.beginNewTransaction(); loudspeakers.removeAllChildren (&undoManager); highestChannelNumber = 0; prepareLayout(); } void AllRADecoderAudioProcessor::addRandomPoint() { undoManager.beginNewTransaction(); loudspeakers.appendChild ( createLoudspeakerFromSpherical ( juce::Vector3D ( 1.0f, (static_cast (rand()) * 360.0f) / static_cast (RAND_MAX), (static_cast (rand()) * 180.0f) / static_cast (RAND_MAX) - 90.0f), highestChannelNumber + 1), &undoManager); } void AllRADecoderAudioProcessor::convertLoudspeakersToArray() { imaginaryFlags.clear(); highestChannelNumber = 0; int i = 0; int imaginaryCount = 0; for (juce::ValueTree::Iterator it = loudspeakers.begin(); it != loudspeakers.end(); ++it) { const bool isImaginary = (*it).getProperty ("Imaginary"); juce::Vector3D spherical; spherical.x = isImaginary ? (float) (*it).getProperty ("Radius") : 1.0f; spherical.y = (*it).getProperty ("Azimuth"); spherical.z = (*it).getProperty ("Elevation"); juce::Vector3D cart = sphericalToCartesian (spherical); R3 newPoint { cart.x, cart.y, cart.z }; newPoint.lspNum = i; if (isImaginary) { imaginaryFlags.setBit (i); ++imaginaryCount; newPoint.realLspNum = -1; } else newPoint.realLspNum = i - imaginaryCount; newPoint.azimuth = (*it).getProperty ("Azimuth"); newPoint.elevation = (*it).getProperty ("Elevation"); newPoint.radius = (*it).getProperty ("Radius"); newPoint.isImaginary = isImaginary; newPoint.gain = (*it).getProperty ("Gain"); newPoint.channel = (*it).getProperty ("Channel"); if (newPoint.channel > highestChannelNumber) highestChannelNumber = newPoint.channel; DBG (newPoint.lspNum << " \t " << newPoint.realLspNum << " \t " << newPoint.gain << " \t " << newPoint.x << " \t " << newPoint.y << " \t " << newPoint.z); points.push_back (newPoint); ++i; } } void AllRADecoderAudioProcessor::prepareLayout() { isLayoutReady = false; wrapSphericalCoordinates(); juce::Result res = checkLayout(); if (res.failed()) { DBG (res.getErrorMessage()); MailBox::Message newMessage; newMessage.messageColour = juce::Colours::red; newMessage.headline = "Improper layout"; newMessage.text = res.getErrorMessage(); messageToEditor = newMessage; updateMessage = true; } else { DBG ("Layout is ready for creating a decoder!"); MailBox::Message newMessage; newMessage.messageColour = juce::Colours::cornflowerblue; newMessage.headline = "Suitable layout"; newMessage.text = "The layout is ready to calculate a decoder."; messageToEditor = newMessage; updateMessage = true; isLayoutReady = true; } } juce::Result AllRADecoderAudioProcessor::checkLayout() { points.clear(); triangles.clear(); normals.clear(); // Check if loudspeakers are stored properly juce::Result res = verifyLoudspeakers(); if (res.failed()) { updateLoudspeakerVisualization = true; return juce::Result::fail (res.getErrorMessage()); } convertLoudspeakersToArray(); // Check for duplicates std::vector outx; std::vector noDuplicates; const int nDuplicates = de_duplicateR3 (points, outx, noDuplicates); if (nDuplicates > 0) { updateLoudspeakerVisualization = true; return juce::Result::fail ("ERROR 1: There are duplicate loudspeakers."); } const int nLsps = loudspeakers.getNumChildren(); if (nLsps < 4) { updateLoudspeakerVisualization = true; return juce::Result::fail ("ERROR 2: There are less than 4 loudspeakers! Add some more!"); } // calculate convex hull const int result = NewtonApple_hull_3D (points, triangles); if (result != 1) { return juce::Result::fail ( "ERROR: An error occurred! The layout might be broken somehow. Try adding additional loudspeakers (e.g. imaginary ones) or make small changes to the coordinates."); } // normalise normal vectors for (int i = 0; i < triangles.size(); ++i) { const Tri tri = triangles[i]; normals.push_back (juce::Vector3D (tri.er, tri.ec, tri.ez).normalised()); } updateLoudspeakerVisualization = true; juce::Array usedIndices; // calculate centroid juce::Vector3D centroid { 0.0f, 0.0f, 0.0f }; for (int i = 0; i < nLsps; ++i) { R3 lsp = points[i]; centroid += juce::Vector3D (lsp.x, lsp.y, lsp.z); usedIndices.add (i); } centroid /= nLsps; DBG ("centroid: x: " << centroid.x << " y: " << centroid.y << " z: " << centroid.z); for (int i = 0; i < triangles.size(); ++i) { Tri tri = triangles[i]; juce::Vector3D a { points[tri.a].x, points[tri.a].y, points[tri.a].z }; usedIndices.removeFirstMatchingValue (tri.a); usedIndices.removeFirstMatchingValue (tri.b); usedIndices.removeFirstMatchingValue (tri.c); const float dist = normals[i] * (a - centroid); if (dist < 0.001f) // too flat! { return juce::Result::fail ( "ERROR 3: Convex hull is too flat. Check coordinates and/or try adding imaginary loudspeakers."); } if (normals[i] * a < 0.001f) // origin is not within hull { return juce::Result::fail ( "ERROR 4: Point of origin is not within the convex hull. Try adding imaginary loudspeakers."); } const int numberOfImaginaryLspsInTriangle = (int) imaginaryFlags[points[tri.a].lspNum] + (int) imaginaryFlags[points[tri.b].lspNum] + (int) imaginaryFlags[points[tri.c].lspNum]; if (numberOfImaginaryLspsInTriangle > 1) { return juce::Result::fail ( "ERROR 5: There is a triangle with more than one imaginary loudspeaker."); } } if (usedIndices.size() > 0) return juce::Result::fail ( "ERROR 6: There is at least one loudspeaker which is not part of the convex hull."); if (imaginaryFlags.countNumberOfSetBits() == nLsps) return juce::Result::fail ("ERROR 7: There are only imaginary loudspeakers."); juce::Array routing; for (int i = 0; i < nLsps; ++i) { if (! points[i].isImaginary) { const int channel = points[i].channel; if (channel < 1) return juce::Result::fail ("ERROR 8: A channel number is smaller than 1."); if (routing.contains (channel)) return juce::Result::fail ( "ERROR 9: Channel number duplicates: a channel number may occur only once."); else routing.add (channel); } } return juce::Result::ok(); } juce::Result AllRADecoderAudioProcessor::calculateDecoder() { if (! isLayoutReady) return juce::Result::fail ("Layout not ready!"); const int N = juce::roundToInt (decoderOrder->load()) + 1; const auto ambisonicWeights = ReferenceCountedDecoder::Weights (juce::roundToInt (weights->load())); const int nCoeffs = juce::square (N + 1); const int nLsps = (int) points.size(); const int nRealLsps = nLsps - imaginaryFlags.countNumberOfSetBits(); DBG ("Number of loudspeakers: " << nLsps << ". Number of real loudspeakers: " << nRealLsps); juce::dsp::Matrix decoderMatrix (nRealLsps, nCoeffs); juce::Array> inverseArray; for (int t = 0; t < triangles.size(); ++t) //iterate over each triangle { Tri tri = triangles[t]; juce::Array triangleIndices (tri.a, tri.b, tri.c); juce::dsp::Matrix L (3, 3); for (int i = 0; i < 3; ++i) { L (0, i) = points[triangleIndices[i]].x; L (1, i) = points[triangleIndices[i]].y; L (2, i) = points[triangleIndices[i]].z; if (points[triangleIndices[i]].isImaginary) { const float factor = 1.0f / std::sqrt (juce::square (points[triangleIndices[i]].x) + juce::square (points[triangleIndices[i]].y) + juce::square (points[triangleIndices[i]].z)); L (0, i) *= factor; L (1, i) *= factor; L (2, i) *= factor; } } inverseArray.add (getInverse (L)); } std::vector sh; sh.resize (nCoeffs); for (int i = 0; i < 5200; ++i) //iterate over each tDesign point { const juce::dsp::Matrix source (3, 1, tDesign5200[i]); SHEval (N, source (0, 0), source (1, 0), source (2, 0), &sh[0], false); const juce::dsp::Matrix gains (3, 1); int t = 0; for (; t < triangles.size(); ++t) //iterate over each triangle { Tri tri = triangles[t]; juce::Array triangleIndices (tri.a, tri.b, tri.c); juce::Array imagFlags (points[tri.a].isImaginary, points[tri.b].isImaginary, points[tri.c].isImaginary); juce::dsp::Matrix gains (3, 1); gains = inverseArray.getUnchecked (t) * source; if (gains (0, 0) >= -FLT_EPSILON && gains (1, 0) >= -FLT_EPSILON && gains (2, 0) >= -FLT_EPSILON) { // we found the corresponding triangle! const float foo = 1.0f / std::sqrt (juce::square (gains (0, 0)) + juce::square (gains (1, 0)) + juce::square (gains (2, 0))); gains = gains * foo; if (imagFlags.contains (true)) { const int imagGainIdx = imagFlags.indexOf ( true); // which of the three corresponds to the imaginary loudspeaker const int imaginaryLspIdx = triangleIndices[imagGainIdx]; juce::Array realGainIndex (0, 1, 2); realGainIndex.remove (imagGainIdx); juce::Array connectedLsps; connectedLsps.add (imaginaryLspIdx); for (int k = 0; k < triangles.size(); ++k) //iterate over each triangle { Tri probe = triangles[k]; juce::Array probeTriangleIndices (probe.a, probe.b, probe.c); if (probeTriangleIndices.contains (imaginaryLspIdx)) { // found searched imaginaryLspIdx in that triangle for (int j = 0; j < 3; ++j) { if (! connectedLsps.contains (probeTriangleIndices[j])) connectedLsps.add (probeTriangleIndices[j]); } } } connectedLsps.remove (0); // remove imaginary loudspeaker again juce::Array gainVector; gainVector.resize (connectedLsps.size()); const float kappa = getKappa (gains (imagGainIdx, 0), gains (realGainIndex[0], 0), gains (realGainIndex[1], 0), connectedLsps.size()); gainVector.fill (gains (imagGainIdx, 0) * (points[imaginaryLspIdx].gain) * kappa); for (int j = 0; j < 2; ++j) { const int idx = connectedLsps.indexOf (triangleIndices[realGainIndex[j]]); gainVector.set (idx, gainVector[idx] + gains (realGainIndex[j], 0)); } for (int n = 0; n < connectedLsps.size(); ++n) juce::FloatVectorOperations::addWithMultiply ( &decoderMatrix (points[connectedLsps[n]].realLspNum, 0), &sh[0], gainVector[n], nCoeffs); } else { juce::FloatVectorOperations::addWithMultiply ( &decoderMatrix (points[tri.a].realLspNum, 0), &sh[0], gains (0, 0), nCoeffs); juce::FloatVectorOperations::addWithMultiply ( &decoderMatrix (points[tri.b].realLspNum, 0), &sh[0], gains (1, 0), nCoeffs); juce::FloatVectorOperations::addWithMultiply ( &decoderMatrix (points[tri.c].realLspNum, 0), &sh[0], gains (2, 0), nCoeffs); } break; } } jassert (t < triangles.size()); } // calculate max lsp gain float maxGain = 0.0f; for (int i = 0; i < nLsps; ++i) { const R3 point = points[i]; if (! point.isImaginary) { SHEval (N, point.x, point.y, point.z, &sh[0]); // encoding at loudspeaker position float sumOfSquares = 0.0f; for (int m = 0; m < nRealLsps; ++m) { float sum = 0.0f; for (int n = 0; n < nCoeffs; ++n) sum += sh[n] * decoderMatrix (m, n); sumOfSquares += juce::square (sum); } sumOfSquares = sqrt (sumOfSquares); if (sumOfSquares > maxGain) maxGain = sumOfSquares; } } decoderMatrix = decoderMatrix * (1.0f / maxGain); // calculate energy and rE vector juce::Array> realLspsCoordinates; realLspsCoordinates.resize (nRealLsps); for (int i = 0; i < nLsps; ++i) { if (! points[i].isImaginary) realLspsCoordinates.set (points[i].realLspNum, juce::Vector3D (points[i].x, points[i].y, points[i].z) .normalised()); // zero count } const int w = energyDistribution.getWidth(); const float wHalf = w / 2; const int h = energyDistribution.getHeight(); const float hHalf = h / 2; float minLvl = 0.0f; float maxLvl = 0.0f; float sumLvl = 0.0f; auto levelValues = juce::dsp::Matrix (w, h); for (int y = 0; y < h; ++y) for (int x = 0; x < w; ++x) { juce::Vector3D spher (1.0f, 0.0f, 0.0f); HammerAitov::XYToSpherical ((x - wHalf) / wHalf, (hHalf - y) / hHalf, spher.y, spher.z); juce::Vector3D cart = sphericalInRadiansToCartesian (spher); SHEval (N, cart.x, cart.y, cart.z, &sh[0]); // encoding a source if (ambisonicWeights == ReferenceCountedDecoder::Weights::maxrE) multiplyMaxRE (N, sh.data()); else if (ambisonicWeights == ReferenceCountedDecoder::Weights::inPhase) multiplyInPhase (N, sh.data()); juce::Vector3D rE (0.0f, 0.0f, 0.0f); float sumOfSquares = 0.0f; for (int m = 0; m < nRealLsps; ++m) { float sum = 0.0f; for (int n = 0; n < nCoeffs; ++n) sum += (sh[n] * decoderMatrix (m, n)); const float sumSquared = juce::square (sum); rE += realLspsCoordinates[m] * sumSquared; sumOfSquares += sumSquared; } const float lvl = 0.5f * juce::Decibels::gainToDecibels (sumOfSquares); levelValues (x, y) = lvl; sumLvl += lvl; if (lvl > maxLvl) maxLvl = lvl; if (lvl < minLvl) minLvl = lvl; rE /= sumOfSquares + FLT_EPSILON; const float width = 2.0f * std::acos (juce::jmin (1.0f, rE.length())); const float reMap = juce::jlimit (0.0f, 1.0f, width / juce::MathConstants::pi); const juce::Colour rEPixelColour = juce::Colours::limegreen.withMultipliedAlpha (reMap); rEVector.setPixelAt (x, y, rEPixelColour); } const float meanLvl = sumLvl / (w * h); for (int y = 0; y < h; ++y) for (int x = 0; x < w; ++x) { constexpr float plusMinusRange = 1.5f; const float map = (juce::jlimit (-plusMinusRange, plusMinusRange, levelValues (x, y) - meanLvl) + plusMinusRange) / (2 * plusMinusRange); const juce::Colour pixelColour = juce::Colours::red.withMultipliedAlpha (map); energyDistribution.setPixelAt (x, y, pixelColour); } DBG ("min: " << minLvl << " max: " << maxLvl); updateLoudspeakerVisualization = true; ReferenceCountedDecoder::Ptr newDecoder = new ReferenceCountedDecoder ( "Decoder", "A " + getOrderString (N) + " order Ambisonics decoder using the AllRAD approach.", (int) decoderMatrix.getSize()[0], (int) decoderMatrix.getSize()[1]); newDecoder->getMatrix() = decoderMatrix; ReferenceCountedDecoder::Settings newSettings; newSettings.expectedNormalization = ReferenceCountedDecoder::Normalization::n3d; newSettings.weights = ambisonicWeights; newSettings.weightsAlreadyApplied = false; newDecoder->setSettings (newSettings); juce::Array& routing = newDecoder->getRoutingArrayReference(); routing.resize (nRealLsps); for (int i = 0; i < nLsps; ++i) { if (! points[i].isImaginary) routing.set (points[i].realLspNum, points[i].channel - 1); // zero count } decoder.setDecoder (newDecoder); decoderConfig = newDecoder; updateChannelCount = true; DBG ("finished"); MailBox::Message newMessage; newMessage.messageColour = juce::Colours::green; newMessage.headline = "Decoder created"; newMessage.text = "The decoder was calculated successfully."; messageToEditor = newMessage; updateMessage = true; return juce::Result::ok(); } float AllRADecoderAudioProcessor::getKappa (float gIm, float gRe1, float gRe2, int N) { const float p = gIm * (gRe1 + gRe2) / (N * juce::square (gIm)); const float q = (juce::square (gRe1) + juce::square (gRe2) - 1.0f) / (N * juce::square (gIm)); return -p + std::sqrt (juce::jmax (juce::square (p) - q, 0.0f)); } juce::dsp::Matrix AllRADecoderAudioProcessor::getInverse (juce::dsp::Matrix A) { const float det = A (0, 0) * (A (1, 1) * A (2, 2) - A (1, 2) * A (2, 1)) + A (0, 1) * (A (1, 2) * A (2, 0) - A (1, 0) * A (2, 2)) + A (0, 2) * (A (1, 0) * A (2, 1) - A (1, 1) * A (2, 0)); const float factor = 1.0 / det; juce::dsp::Matrix inverse (3, 3); inverse (0, 0) = (A (1, 1) * A (2, 2) - A (1, 2) * A (2, 1)) * factor; inverse (0, 1) = (-A (0, 1) * A (2, 2) + A (0, 2) * A (2, 1)) * factor; inverse (0, 2) = (A (0, 1) * A (1, 2) - A (0, 2) * A (1, 1)) * factor; inverse (1, 0) = (-A (1, 0) * A (2, 2) + A (1, 2) * A (2, 0)) * factor; inverse (1, 1) = (A (0, 0) * A (2, 2) - A (0, 2) * A (2, 0)) * factor; inverse (1, 2) = (-A (0, 0) * A (1, 2) + A (0, 2) * A (1, 0)) * factor; inverse (2, 0) = (A (1, 0) * A (2, 1) - A (1, 1) * A (2, 0)) * factor; inverse (2, 1) = (-A (0, 0) * A (2, 1) + A (0, 1) * A (2, 0)) * factor; inverse (2, 2) = (A (0, 0) * A (1, 1) - A (0, 1) * A (1, 0)) * factor; return inverse; } void AllRADecoderAudioProcessor::saveConfigurationToFile (juce::File destination) { if (*exportDecoder < 0.5f && *exportLayout < 0.5f) { DBG ("nothing to export"); MailBox::Message newMessage; newMessage.messageColour = juce::Colours::red; newMessage.headline = "Nothing to export."; newMessage.text = "Please select at least one of the export options."; messageToEditor = newMessage; updateMessage = true; return; } auto* jsonObj = new juce::DynamicObject(); jsonObj->setProperty ( "Name", juce::var ("All-Round Ambisonic decoder (AllRAD) and loudspeaker layout")); juce::String versionString = juce::String ("v") + juce::String (JucePlugin_VersionString); jsonObj->setProperty ( "Description", juce::var ("This configuration file was created with the IEM AllRADecoder " + versionString + " plug-in. " + juce::Time::getCurrentTime().toString (true, true))); if (*exportDecoder >= 0.5f) { if (decoderConfig != nullptr) jsonObj->setProperty ("Decoder", ConfigurationHelper::convertDecoderToVar (decoderConfig)); else { DBG ("No decoder available"); MailBox::Message newMessage; newMessage.messageColour = juce::Colours::red; newMessage.headline = "No decoder available for export."; newMessage.text = "Please calculate a decoder first."; messageToEditor = newMessage; updateMessage = true; return; } } if (*exportLayout >= 0.5f) jsonObj->setProperty ( "LoudspeakerLayout", ConfigurationHelper::convertLoudspeakersToVar (loudspeakers, "A loudspeaker layout")); juce::Result result = ConfigurationHelper::writeConfigurationToFile (destination, juce::var (jsonObj)); if (result.wasOk()) { DBG ("Configuration successfully written to file."); MailBox::Message newMessage; newMessage.messageColour = juce::Colours::green; newMessage.headline = "Configuration exported successfully"; newMessage.text = "The decoder was successfully written to " + destination.getFileName() + "."; messageToEditor = newMessage; updateMessage = true; } else DBG ("Could not write configuration file."); } void AllRADecoderAudioProcessor::setLastDir (juce::File newLastDir) { lastDir = newLastDir; const juce::var v (lastDir.getFullPathName()); properties->setValue ("presetFolder", v); } void AllRADecoderAudioProcessor::valueTreePropertyChanged ( juce::ValueTree& treeWhosePropertyHasChanged, const juce::Identifier& property) { DBG ("valueTreePropertyChanged"); prepareLayout(); updateTable = true; } void AllRADecoderAudioProcessor::valueTreeChildAdded (juce::ValueTree& parentTree, juce::ValueTree& childWhichHasBeenAdded) { DBG ("valueTreeChildAdded"); prepareLayout(); updateTable = true; } void AllRADecoderAudioProcessor::valueTreeChildRemoved (juce::ValueTree& parentTree, juce::ValueTree& childWhichHasBeenRemoved, int indexFromWhichChildWasRemoved) { DBG ("valueTreeChildRemoved"); prepareLayout(); updateTable = true; } void AllRADecoderAudioProcessor::valueTreeChildOrderChanged ( juce::ValueTree& parentTreeWhoseChildrenHaveMoved, int oldIndex, int newIndex) { DBG ("valueTreeChildOrderChanged"); prepareLayout(); } void AllRADecoderAudioProcessor::valueTreeParentChanged (juce::ValueTree& treeWhoseParentHasChanged) { DBG ("valueTreeParentChanged"); } void AllRADecoderAudioProcessor::loadConfiguration (const juce::File& configFile) { undoManager.beginNewTransaction(); loudspeakers.removeAllChildren (&undoManager); juce::Result result = ConfigurationHelper::parseFileForLoudspeakerLayout (configFile, loudspeakers, &undoManager); if (! result.wasOk()) { DBG ("Configuration could not be loaded."); MailBox::Message newMessage; newMessage.messageColour = juce::Colours::red; newMessage.headline = "Error loading configuration"; newMessage.text = result.getErrorMessage(); messageToEditor = newMessage; updateMessage = true; } } void AllRADecoderAudioProcessor::rotate (const float degreesAddedToAzimuth) { loudspeakers.removeListener (this); undoManager.beginNewTransaction(); bool amountIsPositive = degreesAddedToAzimuth > 0; const int nLsps = loudspeakers.getNumChildren(); for (int i = 0; i < nLsps; ++i) { auto lsp = loudspeakers.getChild (i); float val = lsp.getProperty ("Azimuth"); val += degreesAddedToAzimuth; if (amountIsPositive && val > 360.0f) val -= 360.0f; else if (! amountIsPositive && val < -360.0f) val += 360.0f; lsp.setProperty ("Azimuth", val, &undoManager); } loudspeakers.addListener (this); prepareLayout(); updateTable = true; } void AllRADecoderAudioProcessor::wrapSphericalCoordinates() { loudspeakers.removeListener (this); for (juce::ValueTree::Iterator it = loudspeakers.begin(); it != loudspeakers.end(); ++it) { bool updateElevation = false; float az = (*it).getProperty ("Azimuth"); float el = (*it).getProperty ("Elevation"); // Wrap elevation if (el > 180.0f || el < -180.0f) { float fullRotations = std::copysign (std::ceil (std::abs (el) / 360.0f), el); el -= fullRotations * 360.0f; updateElevation = true; } if (el > 90.0f || el < -90.0f) { el = std::copysign (180.0 - std::abs (el), el); az += 180.0f; updateElevation = true; (*it).setProperty ("Azimuth", az, &undoManager); } // Wrap azimuth if (az > 180.0f || az < -180.0f) { float fullRotations = std::copysign (std::ceil (std::abs (az) / 360.0f), az); az -= fullRotations * 360.0f; (*it).setProperty ("Azimuth", az, nullptr); } // Update coordinates if (updateElevation) (*it).setProperty ("Elevation", el, nullptr); } loudspeakers.addListener (this); } //============================================================================== const bool AllRADecoderAudioProcessor::interceptOSCMessage (juce::OSCMessage& message) { if (message.getAddressPattern().toString().equalsIgnoreCase ( "/" + juce::String (JucePlugin_Name) + "/decoderOrder") && message.size() >= 1) { if (message[0].isInt32()) { auto value = message[0].getInt32() - 1; message.clear(); message.addInt32 (value); } else if (message[0].isFloat32()) { auto value = message[0].getFloat32() - 1; message.clear(); message.addFloat32 (value); } } return false; } const bool AllRADecoderAudioProcessor::processNotYetConsumedOSCMessage (const juce::OSCMessage& message) { const juce::String prefix ("/" + juce::String (JucePlugin_Name)); if (message.getAddressPattern().toString().startsWith (prefix)) { juce::OSCMessage msg (message); msg.setAddressPattern (message.getAddressPattern().toString().substring ( juce::String (JucePlugin_Name).length() + 1)); if (msg.getAddressPattern().toString().equalsIgnoreCase ("/loadFile") && msg.size() >= 1) { if (msg[0].isString()) { juce::File fileToLoad (msg[0].getString()); loadConfiguration (fileToLoad); return true; } } else if (msg.getAddressPattern().toString().equalsIgnoreCase ("/calculate") || msg.getAddressPattern().toString().equalsIgnoreCase ("/calculateDecoder")) { calculateDecoder(); return true; } else if (msg.getAddressPattern().toString().equalsIgnoreCase ("/export") && msg.size() >= 1) { if (msg[0].isString()) { juce::File file (msg[0].getString()); saveConfigurationToFile (file); return true; } } else if (msg.getAddressPattern().toString().equalsIgnoreCase ("/playNoise") && msg.size() >= 1) { if (msg[0].isInt32()) { const int channel = msg[0].getInt32(); if (channel <= 64) { playNoiseBurst (channel); return true; } } } else if (msg.getAddressPattern().toString().equalsIgnoreCase ("/playEncodedNoise") && msg.size() >= 2) { float azimuth = 0.0f; float elevation = 0.0f; if (msg[0].isInt32()) azimuth = msg[0].getInt32(); else if (msg[0].isFloat32()) azimuth = msg[0].getFloat32(); else return false; if (msg[1].isInt32()) elevation = msg[1].getInt32(); else if (msg[1].isFloat32()) elevation = msg[1].getFloat32(); else return false; playAmbisonicNoiseBurst (azimuth, elevation); return true; } } return false; } // ============================================================================== std::vector> AllRADecoderAudioProcessor::createParameterLayout() { // add your audio parameters here std::vector> params; params.push_back (OSCParameterInterface::createParameterTheOldWay ( "inputOrderSetting", "Input Ambisonic Order", "", juce::NormalisableRange (0.0f, 8.0f, 1.0f), 0.0f, [] (float value) { if (value >= 0.5f && value < 1.5f) return "0th"; else if (value >= 1.5f && value < 2.5f) return "1st"; else if (value >= 2.5f && value < 3.5f) return "2nd"; else if (value >= 3.5f && value < 4.5f) return "3rd"; else if (value >= 4.5f && value < 5.5f) return "4th"; else if (value >= 5.5f && value < 6.5f) return "5th"; else if (value >= 6.5f && value < 7.5f) return "6th"; else if (value >= 7.5f) return "7th"; else return "Auto"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "useSN3D", "Input Normalization", "", juce::NormalisableRange (0.0f, 1.0f, 1.0f), 1.0f, [] (float value) { if (value >= 0.5f) return "SN3D"; else return "N3D"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "decoderOrder", "Decoder Order", "", juce::NormalisableRange (0.0f, 6.0f, 1.0f), 0.0f, [] (float value) { if (value >= 0.5f && value < 1.5f) return "2nd"; else if (value >= 1.5f && value < 2.5f) return "3rd"; else if (value >= 2.5f && value < 3.5f) return "4th"; else if (value >= 3.5f && value < 4.5f) return "5th"; else if (value >= 4.5f && value < 5.5f) return "6th"; else if (value >= 5.5f) return "7th"; else return "1st"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "exportDecoder", "Export Decoder", "", juce::NormalisableRange (0.0f, 1.0f, 1.0f), 1.0f, [] (float value) { if (value >= 0.5f) return "Yes"; else return "No"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "exportLayout", "Export Layout", "", juce::NormalisableRange (0.0f, 1.0f, 1.0f), 1.0f, [] (float value) { if (value >= 0.5f) return "Yes"; else return "No"; }, nullptr)); params.push_back (std::make_unique ("weights", "Ambisonic Weights", weightsStrings, 1)); return params; } IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/AllRADecoder/Source/PluginEditor.cpp0000664002537200253720000003430615257173642031427 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Authors: Daniel Rudrich, Franz Zotter Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #include "PluginEditor.h" #include "PluginProcessor.h" //============================================================================== AllRADecoderAudioProcessorEditor::AllRADecoderAudioProcessorEditor ( AllRADecoderAudioProcessor& p, juce::AudioProcessorValueTreeState& vts) : juce::AudioProcessorEditor (&p), processor (p), valueTreeState (vts), footer (p.getOSCParameterInterface()), lv (processor.points, processor.triangles, processor.normals, processor.imaginaryFlags), lspList (processor.getLoudspeakersValueTree(), lv, grid, processor.undoManager, processor), grid (processor.points, processor.imaginaryFlags, processor.energyDistribution, processor.rEVector) { // ============== BEGIN: essentials ====================== // set GUI size and lookAndFeel //setSize(500, 300); // use this to create a fixed-size GUI setResizeLimits (1000, 600, 1200, 900); // use this to create a resizable GUI setResizable (true, true); setLookAndFeel (&globalLaF); // make title and footer visible, and set the PluginName addAndMakeVisible (&title); title.setTitle (juce::String ("AllRA"), juce::String ("Decoder")); title.setFont (globalLaF.robotoBold, globalLaF.robotoLight); addAndMakeVisible (&footer); // ============= END: essentials ======================== // create the connection between title component's comboBoxes and parameters cbNormalizationSettingAttachment.reset ( new ComboBoxAttachment (valueTreeState, "useSN3D", *title.getInputWidgetPtr()->getNormCbPointer())); cbOrderSettingAttachment.reset ( new ComboBoxAttachment (valueTreeState, "inputOrderSetting", *title.getInputWidgetPtr()->getOrderCbPointer())); addAndMakeVisible (cbDecoderOrder); cbDecoderOrder.setJustificationType (juce::Justification::centred); cbDecoderOrder.addSectionHeading ("Decoder order"); for (int n = 1; n <= 7; ++n) cbDecoderOrder.addItem (getOrderString (n), n); cbDecoderOrderAttachment.reset ( new ComboBoxAttachment (valueTreeState, "decoderOrder", cbDecoderOrder)); addAndMakeVisible (lbDecoderOrder); lbDecoderOrder.setText ("Decoder Order", juce::Justification::left); addAndMakeVisible (cbDecoderWeights); cbDecoderWeights.setJustificationType (juce::Justification::centred); cbDecoderWeights.addItemList (p.weightsStrings, 1); cbDecoderWeightsAttachment.reset ( new ComboBoxAttachment (valueTreeState, "weights", cbDecoderWeights)); addAndMakeVisible (lbDecoderWeights); lbDecoderWeights.setText ("Weights", juce::Justification::left); addAndMakeVisible (gcLayout); gcLayout.setText ("Loudspeaker Layout"); addAndMakeVisible (gcDecoder); gcDecoder.setText ("Calculate Decoder"); addAndMakeVisible (gcExport); gcExport.setText ("Export Decoder/Layout"); addAndMakeVisible (tbExportDecoder); tbExportDecoderAttachment.reset ( new ButtonAttachment (valueTreeState, "exportDecoder", tbExportDecoder)); tbExportDecoder.setButtonText ("Export Decoder"); tbExportDecoder.setColour (juce::ToggleButton::tickColourId, juce::Colours::orange); addAndMakeVisible (tbExportLayout); tbExportLayoutAttachment.reset ( new ButtonAttachment (valueTreeState, "exportLayout", tbExportLayout)); tbExportLayout.setButtonText ("Export Layout"); tbExportLayout.setColour (juce::ToggleButton::tickColourId, juce::Colours::limegreen); addAndMakeVisible (messageDisplay); messageDisplay.setMessage (processor.messageToEditor); addAndMakeVisible (grid); addAndMakeVisible (tbCalculateDecoder); tbCalculateDecoder.setButtonText ("CALCULATE DECODER"); tbCalculateDecoder.setColour (juce::TextButton::buttonColourId, juce::Colours::cornflowerblue); tbCalculateDecoder.addListener (this); addAndMakeVisible (tbAddSpeakers); tbAddSpeakers.setButtonText ("ADD LOUDSPEAKER"); tbAddSpeakers.setColour (juce::TextButton::buttonColourId, juce::Colours::limegreen); tbAddSpeakers.setTooltip ( "Adds a new loudspeaker with random position. \n Alt+click: adds an imaginary loudspeaker to the nadir position."); tbAddSpeakers.addListener (this); addAndMakeVisible (tbClearSpeakers); tbClearSpeakers.setButtonText ("CLEAR"); tbClearSpeakers.setColour (juce::TextButton::buttonColourId, juce::Colours::red); tbClearSpeakers.setTooltip ("Delete all loudspeakers."); tbClearSpeakers.addListener (this); addAndMakeVisible (tbJson); tbJson.setButtonText ("EXPORT"); tbJson.setColour (juce::TextButton::buttonColourId, juce::Colours::orange); tbJson.setTooltip ("Stores the decoder and/or loudspeaker layout to a configuration file."); tbJson.addListener (this); addAndMakeVisible (tbImport); tbImport.setButtonText ("IMPORT"); tbImport.setColour (juce::TextButton::buttonColourId, juce::Colours::orange); tbImport.setTooltip ("Imports loudspeakers from a configuration file."); tbImport.addListener (this); addAndMakeVisible (tbUndo); tbUndo.setButtonText ("UNDO"); tbUndo.setColour (juce::TextButton::buttonColourId, juce::Colours::orangered); tbUndo.onClick = [this]() { processor.undo(); }; addAndMakeVisible (tbRedo); tbRedo.setButtonText ("REDO"); tbRedo.setColour (juce::TextButton::buttonColourId, juce::Colours::orangered); tbRedo.onClick = [this]() { processor.redo(); }; addAndMakeVisible (tbRotate); tbRotate.setButtonText ("ROTATE"); tbRotate.setColour (juce::TextButton::buttonColourId, juce::Colours::cornflowerblue); tbRotate.setTooltip ("Rotates all loudspeakers by a desired amount around the z-axis."); tbRotate.onClick = [this]() { openRotateWindow(); }; addAndMakeVisible (lv); addAndMakeVisible (lspList); updateChannelCount(); // start timer after everything is set up properly startTimer (50); tooltipWin.setLookAndFeel (&globalLaF); tooltipWin.setMillisecondsBeforeTipAppears (500); tooltipWin.setOpaque (false); } AllRADecoderAudioProcessorEditor::~AllRADecoderAudioProcessorEditor() { setLookAndFeel (nullptr); } //============================================================================== void AllRADecoderAudioProcessorEditor::paint (juce::Graphics& g) { g.fillAll (globalLaF.ClBackground); } void AllRADecoderAudioProcessorEditor::resized() { // ============ BEGIN: header and footer ============ const int leftRightMargin = 30; const int headerHeight = 60; const int footerHeight = 25; juce::Rectangle area (getLocalBounds()); juce::Rectangle footerArea (area.removeFromBottom (footerHeight)); footer.setBounds (footerArea); area.removeFromLeft (leftRightMargin); area.removeFromRight (leftRightMargin); juce::Rectangle headerArea = area.removeFromTop (headerHeight); title.setBounds (headerArea); area.removeFromTop (10); area.removeFromBottom (5); // =========== END: header and footer ================= // try to not use explicit coordinates to position your GUI components // the removeFrom...() methods are quite handy to create scalable areas // best practice would be the use of flexBoxes... // the following is medium level practice ;-) juce::Rectangle rightArea = area.removeFromRight (420); juce::Rectangle bottomRight = rightArea.removeFromBottom (100); rightArea.removeFromBottom (25); gcLayout.setBounds (rightArea); rightArea.removeFromTop (25); juce::Rectangle ctrlsAndDisplay (rightArea.removeFromBottom (80)); juce::Rectangle lspCtrlArea (ctrlsAndDisplay.removeFromTop (20)); ctrlsAndDisplay.removeFromTop (5); tbAddSpeakers.setBounds (lspCtrlArea.removeFromLeft (110)); lspCtrlArea.removeFromLeft (5); tbRotate.setBounds (lspCtrlArea.removeFromLeft (55)); lspCtrlArea.removeFromLeft (5); tbUndo.setBounds (lspCtrlArea.removeFromLeft (55)); lspCtrlArea.removeFromLeft (5); tbRedo.setBounds (lspCtrlArea.removeFromLeft (55)); lspCtrlArea.removeFromLeft (5); tbClearSpeakers.setBounds (lspCtrlArea.removeFromLeft (55)); lspCtrlArea.removeFromLeft (5); tbImport.setBounds (lspCtrlArea.removeFromRight (80)); messageDisplay.setBounds (ctrlsAndDisplay); rightArea.removeFromBottom (5); lspList.setBounds (rightArea); juce::Rectangle decoderArea = bottomRight.removeFromLeft (150); bottomRight.removeFromLeft (20); juce::Rectangle exportArea = bottomRight; gcDecoder.setBounds (decoderArea); decoderArea.removeFromTop (25); auto decoderCtrlRow = decoderArea.removeFromTop (20); lbDecoderOrder.setBounds (decoderCtrlRow.removeFromLeft (80)); cbDecoderOrder.setBounds (decoderCtrlRow.removeFromLeft (55)); ; decoderArea.removeFromTop (5); decoderCtrlRow = decoderArea.removeFromTop (20); lbDecoderWeights.setBounds (decoderCtrlRow.removeFromLeft (55)); cbDecoderWeights.setBounds (decoderCtrlRow.removeFromLeft (80)); ; decoderArea.removeFromTop (5); tbCalculateDecoder.setBounds (decoderArea.removeFromTop (20)); gcExport.setBounds (exportArea); exportArea.removeFromTop (25); juce::Rectangle toggleArea (exportArea.removeFromLeft (120)); tbExportDecoder.setBounds (toggleArea.removeFromTop (20)); tbExportLayout.setBounds (toggleArea.removeFromTop (20)); exportArea.removeFromLeft (20); exportArea.removeFromTop (10); tbJson.setBounds (exportArea.removeFromTop (20).removeFromLeft (80)); area.removeFromRight (20); juce::Rectangle leftArea = area; grid.setBounds (leftArea.removeFromBottom (200)); leftArea.removeFromBottom (10); lv.setBounds (leftArea); } void AllRADecoderAudioProcessorEditor::timerCallback() { // === update titleBar widgets according to available input/output channel counts title.setMaxSize (processor.getMaxSize()); // ========================================== if (processor.updateLoudspeakerVisualization.get()) { processor.updateLoudspeakerVisualization = false; lv.updateVerticesAndIndices(); grid.repaint(); } if (processor.updateTable.get()) { processor.updateTable = false; lspList.updateContent(); } if (processor.updateMessage.get()) { processor.updateMessage = false; messageDisplay.setMessage (processor.messageToEditor); } if (processor.updateChannelCount.get()) { processor.updateChannelCount = false; updateChannelCount(); } } void AllRADecoderAudioProcessorEditor::buttonClicked (juce::Button* button) { if (button == &tbAddSpeakers) { const auto& modifiers = juce::ModifierKeys::getCurrentModifiers(); if (modifiers.isAltDown()) processor.addImaginaryLoudspeakerBelow(); else processor.addRandomPoint(); } else if (button == &tbClearSpeakers) { processor.clearLoudspeakers(); } else if (button == &tbCalculateDecoder) { processor.calculateDecoder(); } else if (button == &tbJson) { juce::FileChooser myChooser ( "Save configuration...", processor.getLastDir().exists() ? processor.getLastDir() : juce::File::getSpecialLocation (juce::File::userHomeDirectory), "*.json"); if (myChooser.browseForFileToSave (true)) { juce::File configFile (myChooser.getResult()); processor.setLastDir (configFile.getParentDirectory()); processor.saveConfigurationToFile (configFile); } } else if (button == &tbImport) { juce::FileChooser myChooser ( "Load configuration...", processor.getLastDir().exists() ? processor.getLastDir() : juce::File::getSpecialLocation (juce::File::userHomeDirectory), "*.json"); if (myChooser.browseForFileToOpen()) { juce::File configFile (myChooser.getResult()); processor.setLastDir (configFile.getParentDirectory()); processor.loadConfiguration (configFile); } } } void AllRADecoderAudioProcessorEditor::updateChannelCount() { ReferenceCountedDecoder::Ptr currentDecoder = processor.getCurrentDecoder(); if (currentDecoder != nullptr) { const int order = currentDecoder->getOrder(); title.getInputWidgetPtr()->setMaxOrder (order); const int nCh = currentDecoder->getNumOutputChannels(); title.getOutputWidgetPtr()->setSizeIfUnselectable (nCh); } else { title.getInputWidgetPtr()->setMaxOrder (0); title.getOutputWidgetPtr()->setSizeIfUnselectable (0); } }; void AllRADecoderAudioProcessorEditor::buttonStateChanged (juce::Button* button) {}; void AllRADecoderAudioProcessorEditor::openRotateWindow() { auto rotateWindow = std::make_unique (processor); rotateWindow->setSize (120, 35); auto& myBox = juce::CallOutBox::launchAsynchronously (std::move (rotateWindow), tbRotate.getScreenBounds(), nullptr); myBox.setLookAndFeel (&globalLaF); } IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/AllRADecoder/Source/tDesign5200.h0000664002537200253720000153226615257173642030404 0ustar zmoelnigzmoelnig#pragma once const float tDesign5200[5200][3] = { { -7.2383074899637885e-03f, 8.5752416612971694e-01f, 5.1439275987149580e-01f }, { -4.1138047257034893e-01f, -6.3585777299457713e-01f, 6.5303215794490033e-01f }, { -3.2348767499720643e-01f, 6.9485601757348392e-01f, 6.4228563658766336e-01f }, { 7.8815511707500985e-01f, 5.8227328543715007e-01f, 1.9942249746381341e-01f }, { -9.2635545465347735e-01f, -1.4876593337587213e-01f, -3.4602639884921310e-01f }, { 4.7305272651083291e-01f, 7.3037083855650720e-01f, 4.9272665457323461e-01f }, { 7.4158747403194691e-01f, -6.7080325721539769e-01f, -8.4266522492280338e-03f }, { -4.4412361052518468e-01f, -8.9576316020580737e-01f, 1.9041517591282517e-02f }, { 5.8830188643864145e-01f, -8.0666067194290869e-01f, -5.6563687586212143e-02f }, { 9.2566374836178078e-02f, -9.7796399314699256e-01f, -1.8713068791001991e-01f }, { 2.5734493434106637e-01f, -7.1601663034615082e-01f, -6.4891738290535561e-01f }, { -5.5739436242778584e-01f, -6.5863430620529506e-01f, -5.0548231959504941e-01f }, { -1.1590429423881965e-01f, -6.0044080506190212e-01f, 7.9122502121306548e-01f }, { -2.0245054186102057e-01f, -6.3412118282239016e-01f, 7.4626007771829250e-01f }, { -4.7431678660028675e-01f, 8.8024990731567043e-01f, -1.3553103701056677e-02f }, { -9.6266109911266429e-01f, -1.3673014663333358e-01f, 2.3364176693567543e-01f }, { 6.0149715220484079e-01f, -6.9749367941128393e-01f, 3.8949164698459926e-01f }, { 6.9546275479533870e-01f, 2.2605904446460809e-01f, -6.8207687624506586e-01f }, { -9.8754256570476684e-01f, 4.5560429339804934e-02f, 1.5061184614637374e-01f }, { -7.6623090306407005e-01f, 3.0198715925093389e-01f, -5.6718071091775568e-01f }, { 4.2058246410471667e-01f, -2.5858281858736554e-01f, -8.6962366390239076e-01f }, { -3.2077950518116394e-01f, -3.9090694626633160e-01f, -8.6272374976956501e-01f }, { 4.4800974527455739e-01f, -8.2872611052480671e-02f, 8.9017941926129163e-01f }, { -8.5451006129011653e-01f, -5.1941942038137090e-01f, -4.0026097289245699e-03f }, { 4.0094393711665849e-01f, -5.9673636613371228e-01f, -6.9508968387030823e-01f }, { -9.4114327549065668e-01f, 1.7577319110334488e-01f, 2.8870940457156069e-01f }, { -9.6303798466037138e-01f, -2.2995519476295739e-01f, 1.4027989343744432e-01f }, { 4.1083092113833347e-01f, 8.2286182900753135e-01f, -3.9257657163795279e-01f }, { -5.8516302219263838e-01f, -7.0794774570210062e-01f, 3.9546709953381909e-01f }, { 9.6141087851221052e-01f, -1.8685609715060755e-01f, -2.0192553487863324e-01f }, { -8.0997443282468684e-01f, -1.5517496383734380e-01f, -5.6556356739840141e-01f }, { -8.4540030419144108e-01f, 1.6149317249100109e-01f, -5.0913483568875040e-01f }, { 2.7466429688399663e-01f, -9.3460611518740788e-01f, -2.2598879058820906e-01f }, { 2.7813946188217986e-01f, 1.8873572687196830e-01f, -9.4181594016347014e-01f }, { 6.9780956514467019e-01f, -6.6400041325174242e-01f, -2.6863592833819067e-01f }, { 9.9466995863365615e-01f, -4.9634688297415144e-02f, 9.0377381624714037e-02f }, { -9.9425172881024759e-01f, -5.2798046520896577e-02f, 9.3144329088846706e-02f }, { -1.8717202381605713e-01f, -4.6873352319500977e-01f, -8.6328182984109803e-01f }, { -9.1254828193315984e-01f, -3.7564850557966506e-01f, 1.6169054825994847e-01f }, { -9.8857145204147945e-01f, 1.4542110917840739e-01f, -3.9738963422852151e-02f }, { -4.1146137171528108e-01f, 8.5900646479944343e-01f, 3.0464312403030186e-01f }, { -6.7747953040098829e-01f, -4.1761619967542674e-01f, 6.0549004587714772e-01f }, { 6.5219676124187231e-01f, -4.1390788407982659e-01f, -6.3507452170762857e-01f }, { -1.7257054623879303e-01f, -3.2404610725006372e-01f, 9.3016854760141443e-01f }, { 9.4341493079886851e-01f, -3.1803787358968622e-01f, 9.3915809682486723e-02f }, { 4.4434840174451223e-01f, 2.8909241441373090e-01f, 8.4792692715559947e-01f }, { -9.6093626297573242e-01f, -3.7170122621162309e-02f, 2.7426242995088057e-01f }, { 5.7693280740124664e-01f, 4.8560718391035818e-01f, -6.5676038147772564e-01f }, { -4.5131466820416338e-01f, -1.3069791260861682e-01f, -8.8274182290379577e-01f }, { -5.9654575129075724e-02f, -2.4092814929374057e-01f, -9.6870788091357163e-01f }, { 4.4901381205246604e-01f, 6.6509642198091479e-01f, -5.9668529900970213e-01f }, { 1.8575692892658918e-01f, -9.8258392305458697e-01f, 4.8163793890852761e-03f }, { -5.8454864531675188e-01f, 3.8913754259157374e-01f, -7.1195144090319895e-01f }, { 4.3425772598118989e-01f, -3.0068346547524977e-01f, -8.4912288923066970e-01f }, { -3.4111680500691205e-01f, 9.2755818197394913e-01f, 1.5256193625887976e-01f }, { 2.3816436489697806e-01f, 7.4046135610592687e-02f, 9.6839811291346334e-01f }, { 1.4575542585983653e-01f, 7.1324120887725806e-01f, -6.8559633443574153e-01f }, { 6.3324482935082094e-01f, 3.9492277047739516e-01f, -6.6561023989937862e-01f }, { 7.3050590547198702e-01f, -2.0207223935019872e-01f, -6.5232502033460937e-01f }, { 5.3950160753369025e-01f, 2.8627242200170520e-02f, -8.4149776973713764e-01f }, { 6.7118440004519542e-01f, 5.8888413575392329e-01f, 4.5025212469607062e-01f }, { 9.9784470342498754e-01f, 8.5359717136319745e-03f, -6.5062162841414986e-02f }, { 2.2899649868225680e-01f, 9.7342721236835017e-01f, -2.5653859358340471e-04 }, { 9.8030136501947085e-01f, 4.5935935636968496e-02f, 1.9209144582234342e-01f }, { -3.3467926928794201e-01f, -4.7708743156069161e-01f, 8.1263606205712513e-01f }, { -6.8640915348552412e-01f, -2.4130567394022810e-02f, -7.2681510009666739e-01f }, { 4.1010128785356384e-02f, 8.9118307482502734e-01f, -4.5178633941545659e-01f }, { 1.4110194824875233e-01f, 4.9688232510045882e-01f, -8.5626993127352569e-01f }, { 6.4336918662336728e-01f, 3.3398921915154905e-01f, -6.8885941322894417e-01f }, { -3.8602715858157205e-01f, 4.0511438124909005e-01f, -8.2877341351095768e-01f }, { 7.6318096971574323e-01f, 6.7438859827019818e-02f, -6.4265605703904283e-01f }, { -7.0463162675420832e-01f, -4.6650665347230880e-01f, 5.3466420568781781e-01f }, { -6.2871196340938240e-01f, 7.5167192954080808e-02f, 7.7399687348808022e-01f }, { -3.7367600929295108e-01f, 9.2702401536486945e-01f, 3.1507380336814605e-02f }, { -1.9993868532166226e-02f, -6.8409838908398546e-01f, 7.2911565562249070e-01f }, { 4.4815845705717205e-01f, -6.9913257834782094e-01f, -5.5710648466954937e-01f }, { -1.2642645610188497e-01f, 9.8230441283990932e-01f, -1.3818245805006907e-01f }, { -9.7349186641539376e-01f, -1.1854870249016892e-02f, -2.2841420287375316e-01f }, { -8.6707209316341505e-01f, 3.0449454130072501e-01f, 3.9429564995733235e-01f }, { -2.3676893538080110e-01f, 3.5773000921573789e-01f, 9.0331041826448022e-01f }, { 4.2480125364218591e-01f, -6.8166289918947054e-01f, -5.9571770728477857e-01f }, { 8.4242697779315157e-01f, -9.9806829894008034e-02f, 5.2948596184677599e-01f }, { -7.4023322968232363e-01f, -6.7220475359316478e-01f, 1.3983380164648099e-02f }, { 4.0899781046280237e-01f, 7.7191919340038018e-01f, 4.8668424044419206e-01f }, { 4.6405331684919177e-01f, 4.4878477448600523e-01f, 7.6370592855549380e-01f }, { -7.6408424632768523e-01f, -3.8627897034217001e-01f, -5.1668541839812554e-01f }, { -1.8182353374663424e-01f, 3.9399889661286308e-01f, 9.0094676426730846e-01f }, { -1.7280744648820255e-03f, 2.9295177622620228e-01f, -9.5612565626310697e-01f }, { -9.5286630679205819e-01f, -2.7457062093311646e-01f, 1.2906113086776386e-01f }, { 2.2446853325025284e-01f, 5.9332292806912701e-01f, 7.7303413935476206e-01f }, { -2.7275897071630445e-01f, -6.6551501287219117e-01f, -6.9476061455404137e-01f }, { 9.2592721534352573e-01f, 3.3933846764680142e-01f, -1.6585595033433370e-01f }, { 9.1680731960327777e-01f, 2.0119278570118967e-01f, -3.4494318619686992e-01f }, { -2.3963803941061804e-01f, 9.6306314664040382e-01f, 1.2281280735541818e-01f }, { 6.6679682463375767e-01f, 3.0886039558222395e-01f, 6.7822359933810183e-01f }, { 7.6434144352351874e-01f, -6.1414280926269715e-01f, -1.9649622780935505e-01f }, { 5.3042333707932310e-01f, -8.0205347623967527e-01f, 2.7452013538807563e-01f }, { -2.4421907807553977e-01f, 2.3859761149779166e-01f, 9.3990862411804810e-01f }, { 3.6263212536854067e-01f, 6.5445209665758775e-01f, 6.6346845805296772e-01f }, { -7.3091086780766523e-01f, 3.0289433442984270e-01f, 6.1157528194895883e-01f }, { -3.8281914413542228e-01f, 1.9170705235231086e-01f, 9.0371339979100185e-01f }, { -8.1660107996055331e-02f, -7.5867078739381189e-01f, -6.4633602956769021e-01f }, { -8.0882767052791682e-01f, 5.0193215338430608e-01f, 3.0636891615726441e-01f }, { 8.3030457471809560e-01f, -2.5126098845508499e-01f, 4.9745575570373685e-01f }, { 6.4809864551846075e-01f, -4.0733701376475057e-01f, 6.4346305480140198e-01f }, { 8.7121849753641101e-01f, -3.1013920148743879e-01f, 3.8051544679701571e-01f }, { -5.8841614511615126e-01f, 7.4679948639152860e-01f, -3.0993058463468492e-01f }, { -9.2213592441112574e-02f, 3.8484876160369896e-01f, -9.1836163032936191e-01f }, { 4.5511431838476313e-01f, -4.6749759671135760e-01f, -7.5783702355472005e-01f }, { 2.4540449961431987e-01f, 8.6303537501040573e-01f, -4.4152754506337849e-01f }, { 4.9939311052493790e-01f, 5.3271306554742170e-01f, 6.8324469332391857e-01f }, { -6.0260984091509529e-01f, -7.5115265598450387e-02f, 7.9449296819188886e-01f }, { 8.2045231224740989e-01f, -5.5523661116605993e-01f, -1.3627292081961176e-01f }, { -1.3078303011799933e-01f, 1.2653066813962099e-01f, 9.8330350810586231e-01f }, { 7.7076123058250040e-02f, 3.7560945866738243e-01f, -9.2356743436194488e-01f }, { 6.2746828219920248e-01f, 2.9865837828733149e-01f, 7.1908742716916085e-01f }, { 9.0776136515538552e-01f, -4.1252391767106161e-01f, 7.6113870487250920e-02f }, { -2.3779065765507507e-01f, -2.0375335320632507e-01f, 9.4970530912970341e-01f }, { -5.0252099542631212e-01f, 4.6676462329362028e-01f, 7.2773857641141515e-01f }, { -3.2672779734090929e-01f, -6.3237016707145488e-01f, -7.0239370601022477e-01f }, { 2.4243758213072819e-01f, -9.3149738622516165e-01f, -2.7117639688272765e-01f }, { -2.6932974157240386e-01f, 3.9407600424095179e-01f, -8.7872953358017247e-01f }, { -2.7710837615336764e-01f, -9.5028020524787171e-01f, -1.4205097458203736e-01f }, { 2.8134737696026041e-01f, 9.4926441553719121e-01f, -1.4050168280990710e-01f }, { 8.9499591905325815e-01f, -2.4417044199353852e-01f, -3.7331367525807824e-01f }, { -1.4482771561151656e-01f, -5.0119083356289895e-01f, 8.5313110431121675e-01f }, { 4.9826365828315650e-01f, 8.6616190837064022e-01f, 3.8689473012906803e-02f }, { -8.4312175276462042e-01f, 3.3665840066741759e-01f, 4.1929325212215224e-01f }, { -6.2307592409666979e-01f, -7.1141713194016309e-01f, 3.2505700606680293e-01f }, { 6.7282115768734196e-01f, -3.0369152430112345e-01f, 6.7459850862266579e-01f }, { -8.8174599402022169e-01f, -1.0243056478805469e-01f, -4.6046930562904120e-01f }, { -5.5195159580630448e-01f, -5.8612984624390729e-01f, 5.9312834970937567e-01f }, { -3.9362150076995589e-01f, -9.0135921475955116e-01f, -1.8059258041141360e-01f }, { 3.7924755947379990e-01f, -2.0202863806602203e-01f, -9.0297049676850183e-01f }, { 3.5855884378748193e-01f, 5.3900874035833568e-01f, 7.6217132808778920e-01f }, { -2.4804999588797882e-01f, 1.8658753461474323e-01f, 9.5060837965292821e-01f }, { -1.6745925415255555e-01f, 5.7969768153515633e-01f, -7.9743839650560733e-01f }, { -2.8345663828248302e-01f, -9.5714849897791099e-01f, 5.9321877228605553e-02f }, { 6.8761569542420897e-01f, -5.6356711780795921e-01f, 4.5779554293582991e-01f }, { -6.5469822845273029e-01f, 7.5268577397061914e-02f, -7.5213354593282111e-01f }, { 1.4046962874018967e-01f, -3.4698200844434046e-01f, -9.2729270956776366e-01f }, { -4.8713540575976377e-01f, 8.5965103990736824e-01f, -1.5394539954623701e-01f }, { -6.5331935184400003e-01f, -1.6496904926957687e-01f, -7.3889040952581575e-01f }, { -1.9606127275820734e-01f, 2.3328818802226586e-01f, 9.5243718882334694e-01f }, { 3.6180262400164448e-01f, -3.0837241679778699e-01f, 8.7977571790986397e-01f }, { -1.9013947444734453e-01f, -4.1455186711051728e-01f, 8.8994029559969445e-01f }, { 1.0300839999790491e-01f, -2.5228299909259033e-01f, 9.6215516310973448e-01f }, { 6.9755622367439496e-01f, 5.8976982397527988e-01f, 4.0692366549671799e-01f }, { -1.9749638596722996e-01f, 8.7803119086428361e-01f, 4.3595459098320177e-01f }, { 1.4506293135767856e-01f, -9.5348791287890944e-01f, -2.6423010036659095e-01f }, { 8.6721789566115468e-02f, 5.0918451082608929e-01f, -8.5627709600878998e-01f }, { 9.7833689807696889e-01f, 1.8565703580636142e-01f, -9.1588093749843003e-02f }, { -8.9688435400927158e-01f, 4.3750438513713463e-01f, 6.4717605944204434e-02f }, { 9.1639747272103678e-01f, -3.8427757561429854e-01f, 1.1201078908075661e-01f }, { -7.6176913485282979e-02f, 7.9898302438686120e-01f, 5.9650918232117789e-01f }, { -8.9893057176687730e-01f, -3.7449830292949310e-01f, 2.2732102464533396e-01f }, { -2.9437918479271546e-01f, 3.3269598078100127e-01f, 8.9590974988161831e-01f }, { 9.5997116476431599e-01f, 1.4156809269309095e-01f, 2.4168954870304776e-01f }, { -6.6160950013225184e-01f, -2.3603251897020731e-02f, 7.4947698819552666e-01f }, { 3.2960537313258592e-01f, -6.3388453195025751e-01f, -6.9967899650935061e-01f }, { -7.4447331338477654e-02f, 7.6559275355041623e-01f, 6.3900338854161842e-01f }, { 3.1722820605347823e-01f, 5.9521081866544319e-02f, 9.4647953284660524e-01f }, { 4.4407878658605307e-02f, 8.1550002574226543e-01f, -5.7705081953620596e-01f }, { -2.5985296068083846e-01f, -4.3915216179218886e-01f, 8.6001268456846014e-01f }, { -4.7921670237660235e-01f, 8.0601208551340331e-01f, 3.4741311168352457e-01f }, { -4.4666605363533418e-01f, -7.6968838876692902e-01f, 4.5614605196932878e-01f }, { 9.1729623464847376e-01f, 9.5738679295781174e-03f, 3.9809039042986105e-01f }, { -1.3223364315345051e-01f, -7.7680046499654387e-01f, 6.1570715539087173e-01f }, { -7.9591120745320898e-01f, 6.0254859188406207e-01f, 5.8826390922007532e-02f }, { 8.0451920724261028e-01f, 1.9055623656989404e-01f, 5.6252748011278553e-01f }, { -8.3955469131620564e-01f, 5.3854689037198922e-01f, -7.1520396808262374e-02f }, { -1.1272911791477315e-01f, -5.3832854503254546e-01f, 8.3516137576955751e-01f }, { 6.0130298446681696e-01f, -3.3263034859336327e-01f, -7.2649278872261114e-01f }, { 6.8523078468296539e-01f, -4.8570475698321867e-02f, 7.2670467221093760e-01f }, { 7.3828781676575983e-01f, -1.0428293920929864e-01f, -6.6637539585815853e-01f }, { 6.3568458903630176e-01f, -5.5738437325734969e-01f, 5.3406719025817295e-01f }, { 6.6508902360559041e-01f, -7.4205630158207003e-01f, -8.3719985437781086e-02f }, { 3.6890994247060160e-01f, -9.0486632602918426e-01f, 2.1242030591443783e-01f }, { -9.1925741378388948e-01f, -2.9988108388736784e-01f, -2.5502380816286979e-01f }, { -8.7128940379081810e-01f, 4.5874701932080436e-01f, -1.7437301140405348e-01f }, { 6.0726973839744725e-01f, 6.1911771195090992e-01f, 4.9791236535696332e-01f }, { -2.4740531338266711e-01f, -3.1567366312203554e-01f, 9.1604625937838968e-01f }, { 3.8771768371523829e-01f, -5.2569709805659526e-01f, 7.5717736286114945e-01f }, { -1.2311031311263700e-01f, 9.5616623966564451e-01f, 2.6568773575189658e-01f }, { 1.9098370783282481e-01f, -3.0860036035511768e-01f, 9.3182135676915978e-01f }, { 8.8847621579594327e-01f, 3.9644680383221664e-01f, 2.3117081497485881e-01f }, { -6.1014797133383825e-01f, 5.6757378166507222e-01f, 5.5279241623199804e-01f }, { -7.1638457932831121e-02f, 6.1580339112717974e-01f, 7.8463629461124962e-01f }, { 4.8227301415017315e-01f, 6.8023332232504319e-01f, -5.5199218021738383e-01f }, { -3.9558730098414069e-01f, -4.5101278846435822e-01f, -8.0006134261173179e-01f }, { -2.8719882656693979e-01f, 6.7061800360947144e-01f, 6.8395052982903648e-01f }, { 9.6752985736960706e-01f, -2.0256370864186962e-01f, -1.5117512705336036e-01f }, { -8.8865421886453400e-01f, -2.0373937026756431e-03f, 4.5857336198384369e-01f }, { -3.1831322536887557e-02f, -4.9245151801919346e-01f, 8.6975759226703198e-01f }, { 8.8592868898529631e-01f, 6.5419862068096940e-02f, -4.5918471194039695e-01f }, { -7.6038372590049252e-01f, -5.4516135114528752e-01f, -3.5300947664776550e-01f }, { -8.7989850930672542e-01f, -4.6732892368299134e-01f, 8.5920256104712267e-02f }, { 3.9566352412756040e-01f, -9.1235253034472930e-01f, 1.0518191882889968e-01f }, { -5.4096150228749684e-01f, -7.6882430047086869e-01f, 3.4098364777263740e-01f }, { 7.1089580986834944e-01f, -6.6419089244222262e-01f, 2.3125225600721705e-01f }, { 6.0522567956698292e-01f, -4.2032182634339016e-01f, -6.7604100400200628e-01f }, { 5.8587627721083702e-01f, 7.8802400173758813e-01f, -1.8912207826440611e-01f }, { 3.5543990363883471e-01f, 9.0963006138707259e-01f, -2.1502471095705872e-01f }, { 1.3926738206887984e-01f, -5.5504631725845344e-01f, -8.2007815602508827e-01f }, { 7.7864105500026315e-01f, 3.5104862865586878e-01f, -5.2007977059957944e-01f }, { -8.1847542869455184e-02f, 8.5543207795079318e-02f, 9.9296693768038446e-01f }, { -1.5273859709954932e-01f, 5.1200102781600942e-01f, 8.4529631992066045e-01f }, { -6.3840212459713983e-02f, -7.8879115387900822e-01f, 6.1133701248601113e-01f }, { 5.1812091383232028e-01f, 4.6047776999280587e-01f, -7.2077107460830725e-01f }, { 2.8841178675632972e-01f, -9.5496663536409054e-01f, 6.9694810433844179e-02f }, { 1.0663075457584248e-01f, -4.1755248017437951e-01f, -9.0237453891320030e-01f }, { -9.0517719478245939e-01f, -1.9541560468345717e-01f, 3.7744799309568006e-01f }, { -4.3819121715573700e-02f, 7.4266497660529107e-01f, 6.6822796790910977e-01f }, { 5.5101614610089189e-01f, 2.4982834802806794e-01f, 7.9622044890701416e-01f }, { -4.5098968337560752e-01f, -5.1205343818393378e-01f, -7.3103322902093970e-01f }, { 9.0936797887504939e-01f, 1.2443036264711639e-01f, -3.9694705421279380e-01f }, { 7.7245621848799517e-01f, 2.9257032982066600e-01f, 5.6366123924557143e-01f }, { 7.0311643271896596e-01f, 7.0812849324563176e-01f, -6.4663120047110542e-02f }, { -9.5107061398509596e-01f, 2.9262637179836909e-01f, 9.9169016038959168e-02f }, { -2.9260638308269560e-01f, -5.5603192184479833e-01f, 7.7795244486333670e-01f }, { 1.2674888493901326e-01f, -2.1338146582605200e-01f, 9.6871206775214802e-01f }, { -2.5419119094938397e-01f, -2.0178173078819117e-03f, -9.6715188406839481e-01f }, { 9.1674686161724317e-01f, 2.6640717834791849e-01f, -2.9766156459918597e-01f }, { -4.3548212490560756e-01f, 8.9823025005774193e-01f, 5.9478876661409136e-02f }, { -5.3523117134743237e-01f, -6.6094695395670733e-01f, 5.2600068181838500e-01f }, { 4.3703209020643424e-02f, -3.6968345800735691e-01f, 9.2812939313277909e-01f }, { -2.3895393126027081e-01f, 8.8709796641131977e-01f, 3.9491545515991483e-01f }, { -8.8598075684670019e-01f, 4.1938650380493256e-02f, -4.6182166265952845e-01f }, { 1.8146713048443452e-01f, -4.1200741950211456e-01f, 8.9292752607865877e-01f }, { -5.0097907576123690e-01f, -2.4803059529261262e-01f, 8.2915667364389523e-01f }, { -9.7786397956395321e-01f, -1.8892558731992937e-01f, -8.9939757210970195e-02f }, { -4.2170579982461104e-01f, 7.8063539854651454e-01f, 4.6127279665118948e-01f }, { -8.5216030435273193e-01f, 5.1094855974025799e-01f, 1.1293531327629655e-01f }, { 5.6606685109805710e-02f, -1.3447233173069245e-01f, 9.8929918386693816e-01f }, { -5.9546112812404084e-01f, 7.7726838130239440e-01f, -2.0317457597051869e-01f }, { -6.7283525665558308e-01f, 1.5780247579406531e-01f, 7.2276628036626001e-01f }, { -4.3247388485471944e-01f, 4.6382259356212069e-01f, 7.7319786640935240e-01f }, { -3.0766386220466119e-01f, -9.2206289769629846e-01f, -2.3482538317911178e-01f }, { -8.2073934678793692e-01f, -2.8917977918938281e-01f, 4.9270881861611782e-01f }, { -2.8850427458838362e-01f, -4.0337331418520200e-01f, 8.6836354883624456e-01f }, { -6.0021962808616736e-01f, 3.0182757175658013e-02f, 7.9926553737126571e-01f }, { -4.0642454052539523e-01f, 3.5307830413016000e-01f, -8.4270683159168203e-01f }, { -3.4273782755354776e-01f, 5.9640022616951567e-02f, -9.3753605224872505e-01f }, { 9.2401928336124017e-01f, 3.4642532223796407e-01f, 1.6179573569443303e-01f }, { -1.1491828496388215e-01f, 7.8799870732607177e-02f, -9.9024460016375970e-01f }, { 7.9286046492106488e-01f, -1.3896362890171871e-01f, -5.9334761565849270e-01f }, { 4.0089376481560857e-02f, -3.3558135071726014e-01f, -9.4115779704792268e-01f }, { -9.2602571411376802e-02f, -7.6371489266958337e-01f, 6.3887739550142775e-01f }, { 9.6830053651644765e-02f, -7.9130482205841535e-01f, -6.0370573899617619e-01f }, { 4.1728071705651480e-02f, -4.1833648188826500e-01f, 9.0733310088030916e-01f }, { 4.4999211809200051e-01f, -7.1057497392177149e-01f, 5.4091616734125170e-01f }, { 1.1012413543429049e-01f, -7.4845374356792838e-01f, 6.5397986859994683e-01f }, { 9.8278989384075832e-01f, -1.1776879867356324e-01f, -1.4231842685842463e-01f }, { 6.8697088982404109e-01f, 5.9952712422547316e-01f, -4.1065584599795885e-01f }, { -7.7902019824063629e-01f, 5.2527096394455242e-01f, 3.4237106356974822e-01f }, { -7.0996707148683769e-01f, 4.7410804985217721e-02f, 7.0263715598810828e-01f }, { -4.0607827678540757e-02f, 6.7068838776547890e-01f, 7.4062682293296167e-01f }, { 5.9340515951859785e-01f, 1.4765376090079196e-01f, 7.9124502118405726e-01f }, { 7.1491789743359180e-01f, -1.0846034309292926e-01f, 6.9074507157510467e-01f }, { -1.0766945096599981e-01f, -9.9416365678520169e-01f, -6.7759026082009751e-03f }, { 6.0052316347232537e-01f, 7.9749512656974098e-01f, -5.8081436196976970e-02f }, { 2.6677634863903493e-01f, 3.9695414443444382e-01f, -8.7821283697241803e-01f }, { -2.4431854690710161e-01f, -9.6174876363865403e-01f, -1.2388608992426409e-01f }, { -7.5061518463302646e-01f, 6.2549082747518991e-01f, 2.1292738044396653e-01f }, { 5.7073463075048891e-01f, 3.1207229149376031e-01f, -7.5952147181230922e-01f }, { -8.1319266765595544e-01f, 5.1646400770696443e-01f, -2.6829575847160020e-01f }, { 5.2742388189233491e-01f, 6.7619601440822097e-01f, -5.1437632032205516e-01f }, { 3.5778173461287682e-01f, -9.2403554586940628e-01f, 1.3472394125480966e-01f }, { 8.9372328905165488e-01f, -4.3386828868736577e-01f, -1.1409202723323314e-01f }, { 9.8369652029060961e-01f, -6.7757862870818322e-02f, -1.6658339649354470e-01f }, { -2.3920671291769424e-01f, -3.9400101070790267e-01f, -8.8743639324532042e-01f }, { -3.0430160928941979e-01f, -8.1502894069275655e-01f, -4.9308047661321208e-01f }, { 1.5709500273720655e-02f, 8.3495247190146904e-01f, -5.5009779245764701e-01f }, { 5.1034247536056887e-01f, -7.5071907936677029e-01f, 4.1948947748132620e-01f }, { -2.8536860429684208e-01f, 8.8627921335846216e-01f, 3.6479297642687403e-01f }, { 6.3132715519900195e-01f, 5.0407208222368362e-02f, -7.7387669332236775e-01f }, { 5.4744347853509645e-01f, 3.5451851557545583e-01f, -7.5803842905460184e-01f }, { 1.3025492676431291e-01f, -5.1726194189664443e-01f, -8.4585680674623409e-01f }, { -2.1437810807073385e-01f, -8.5339692252306287e-01f, 4.7513757945270785e-01f }, { 2.2923289702095836e-01f, -9.6750739573158517e-01f, 1.0668513545974687e-01f }, { -5.3218988862840577e-01f, -4.9603235512599353e-01f, 6.8609461819041062e-01f }, { 2.7802555116558963e-01f, -5.8798387763493809e-01f, -7.5958985810794788e-01f }, { 8.3834779240052482e-01f, 2.0055146791757869e-01f, -5.0690441672298636e-01f }, { -3.6543012529709751e-01f, 2.7955144918903541e-01f, -8.8786925320210164e-01f }, { 3.3348585818089860e-02f, 9.4722988055899404e-01f, 3.1881566021782448e-01f }, { -8.9248558237010500e-01f, 1.3773984089261312e-01f, -4.2953139756293957e-01f }, { 6.8672024871890891e-01f, -6.2061459574063926e-01f, 3.7848754742147395e-01f }, { -9.7806754849851379e-02f, 6.3938631500983012e-01f, -7.6263948159264050e-01f }, { -8.0463345500431127e-01f, -5.8561667917817961e-01f, 9.8071953973325576e-02f }, { 4.2032614744854790e-01f, 1.1653767363524720e-02f, -9.0729825276878961e-01f }, { 3.2320701082204550e-01f, 4.9037686279055259e-01f, -8.0936256436480536e-01f }, { 5.0422641867763029e-01f, -8.6347676423851905e-01f, -1.2790478009366110e-02f }, { 3.1330431053417362e-01f, 8.4987644417906638e-01f, 4.2373392433253732e-01f }, { 4.8591679664584475e-01f, -8.4230863468525818e-01f, 2.3324028526842666e-01f }, { -4.4354244041090357e-01f, 6.5389159051023205e-01f, -6.1294036530019724e-01f }, { -4.3291541965659242e-01f, -8.6411938129260746e-01f, 2.5667476365633929e-01f }, { 8.8626775679775194e-01f, 2.6583880246796210e-01f, 3.7928774612829325e-01f }, { -4.4152208152849114e-02f, -9.2151617551660647e-01f, -3.8582187700605375e-01f }, { -7.7486808384748029e-01f, 2.0341366290359354e-02f, 6.3179560100714183e-01f }, { 7.3871872143412076e-01f, -2.4236253880868250e-01f, -6.2893167386048199e-01f }, { -1.6024597477953695e-01f, 8.2226189936116745e-01f, -5.4608295745785873e-01f }, { -6.9960867361989854e-01f, 6.8754816906526584e-01f, 1.9448706643580951e-01f }, { 5.2896780386819675e-01f, 3.8419888983215689e-01f, 7.5669298630461423e-01f }, { 7.5488811894913699e-01f, -1.7835467042153971e-01f, 6.3113670421570112e-01f }, { -8.8138300909789580e-01f, 4.4344140913141150e-01f, 1.6286100804393522e-01f }, { 6.0729639758538678e-02f, 5.8523061946084462e-02f, -9.9643713403066869e-01f }, { -1.4093685329892028e-01f, -4.3111900526920854e-01f, 8.9122006635728679e-01f }, { -8.0625391749769459e-01f, 1.6037182773604827e-02f, 5.9135220409524702e-01f }, { -5.1279146288679334e-01f, 8.3807627055239564e-01f, -1.8620708989565904e-01f }, { 5.3493427651526988e-02f, -6.4693097041318803e-01f, 7.6066994992463177e-01f }, { 4.4832567479577273e-01f, -7.9326903004343075e-01f, 4.1198098899447988e-01f }, { -2.7971048002178527e-02f, 8.2868411026343591e-01f, -5.5901723217675270e-01f }, { -7.4366242718910203e-01f, -1.1758633152387325e-01f, -6.5813345836993531e-01f }, { -6.5625411192815297e-01f, 2.9186521868012066e-01f, 6.9580545751107514e-01f }, { 5.0460180089310613e-01f, 7.6790605124470701e-01f, -3.9458499590987450e-01f }, { -7.9280777812612324e-01f, -5.1590623765231280e-01f, -3.2449434647487324e-01f }, { 9.0326813575929166e-01f, -3.8553680887415687e-01f, -1.8832961510358778e-01f }, { 6.7463306287027269e-01f, 5.2203988187862416e-01f, 5.2186645055073899e-01f }, { 5.8103721091886684e-01f, -4.7705238578285275e-01f, -6.5940638512719330e-01f }, { -8.7209752948435915e-01f, -2.5259757475815325e-01f, 4.1909469609334887e-01f }, { -8.6573810559934572e-01f, 4.0062685838210688e-01f, 2.9999275467274111e-01f }, { 4.5894572936066041e-01f, 6.2363831531044867e-01f, 6.3280650216188283e-01f }, { -1.2980626245954167e-02f, 9.5618896678811405e-01f, -2.9246224223810813e-01f }, { -6.3003838076735974e-01f, 1.9661211052930896e-01f, -7.5126248192842315e-01f }, { -6.9723455669212742e-01f, -1.1904459170474802e-01f, 7.0688921206946020e-01f }, { -5.5314628809335609e-01f, 7.1102007685163393e-01f, 4.3414241244370322e-01f }, { 1.4513447988484610e-01f, -9.8464659899874396e-01f, 9.6989988291379545e-02f }, { 6.1379167791481326e-01f, -6.4193999106983279e-01f, 4.5953544366869148e-01f }, { -1.0841814405569261e-01f, -8.5846852467673596e-01f, 5.0127567084276847e-01f }, { -8.2814650224499131e-01f, 5.4622059507520360e-01f, 1.2576339823286142e-01f }, { -6.3050427182206925e-01f, -4.6950500731177475e-01f, 6.1808527835832849e-01f }, { -5.8739668370833986e-01f, -7.2874331539110726e-01f, 3.5199192638641852e-01f }, { 6.5724081464234707e-01f, 7.4842236182046729e-01f, 8.8873392504942084e-02f }, { -9.3377409991562721e-01f, 2.8856535269316991e-02f, 3.5669767408690928e-01f }, { -1.1883729970753924e-01f, 3.5719433335558887e-01f, 9.2643936899123458e-01f }, { -8.2995321923009757e-01f, -4.7046565954163172e-01f, 2.9973274275870315e-01f }, { 7.0718893954780637e-01f, -2.5730327845596551e-01f, 6.5854295735134927e-01f }, { -7.2743068377106090e-01f, 3.3148125580538362e-01f, -6.0080344319756740e-01f }, { 8.3687621882650409e-01f, 1.8343009276158698e-01f, 5.1574373038567201e-01f }, { 7.7842930808716881e-01f, -3.8116326142873291e-01f, -4.9876084494268702e-01f }, { 8.7026820454893894e-01f, -4.7447145526533718e-01f, -1.3232569776713510e-01f }, { -5.1319670163237241e-01f, 6.1445825620121097e-01f, 5.9922466306037558e-01f }, { -1.2531752216211869e-01f, 9.6083761828523007e-01f, -2.4715701472366397e-01f }, { 5.5477359500820340e-02f, -4.1836061982719835e-01f, -9.0658516111869991e-01f }, { -7.8893735943084653e-01f, 2.1210634646342558e-02f, -6.1410744326394762e-01f }, { -3.7679136024587778e-01f, -2.0322296477000829e-01f, -9.0373043405329068e-01f }, { -3.6335326920246358e-01f, -8.8174742625022895e-01f, 3.0082532815735247e-01f }, { 7.1279206762817415e-01f, 4.9094076095978512e-01f, -5.0090382066278916e-01f }, { 6.9425567033283964e-01f, -7.0268710007239299e-01f, -1.5569169407052644e-01f }, { 6.9387145954399065e-01f, -2.7561121446679682e-01f, -6.6526750716567351e-01f }, { 5.6126364313016552e-01f, 3.5913082595467288e-01f, 7.4565955552743290e-01f }, { 5.5434200267970457e-01f, -7.6812757411884036e-01f, -3.2044496242468840e-01f }, { 6.5171801846072019e-01f, -4.5731029592183314e-01f, -6.0508752892248385e-01f }, { 8.1483302804843094e-01f, 7.1076547736922430e-02f, 5.7532187579060978e-01f }, { -2.9415845332220186e-01f, -1.2889288550231252e-02f, -9.5566974974609242e-01f }, { -2.1547234300550178e-01f, -3.4882528150145459e-01f, -9.1208146148529423e-01f }, { -7.6180563840871440e-01f, 6.4549981823822489e-01f, 5.4609101284579895e-02f }, { -3.0197120777239383e-01f, -3.4437389035371174e-01f, 8.8894320027723450e-01f }, { 7.3699685735822279e-02f, -9.7349739045017902e-01f, 2.1649754527276480e-01f }, { -8.6184766085583009e-01f, -4.5897827567524174e-01f, 2.1577199061860639e-01f }, { -6.5758145781724897e-01f, -6.8862965002227650e-01f, 3.0557459227680961e-01f }, { -1.1760521092365656e-01f, 5.4147500777040880e-01f, 8.3245049722108888e-01f }, { 4.7917316405135102e-01f, -6.6329454041843694e-01f, -5.7483339456238225e-01f }, { -5.6411334692990378e-01f, 2.5589236282315625e-01f, 7.8504473150536092e-01f }, { -2.6681597458926443e-01f, -3.6207336555508113e-01f, -8.9314730792831576e-01f }, { 4.0206409944512661e-01f, -6.5233239621341477e-01f, 6.4250050956232230e-01f }, { -4.4918308631692661e-02f, 3.9670085075055217e-01f, -9.1684828655751771e-01f }, { -8.2387956612142621e-01f, 5.3729419360461717e-01f, -1.8038129073253356e-01f }, { -9.1913894906197569e-01f, -3.4414028705340810e-01f, 1.9170564713655353e-01f }, { -7.6359775586966261e-01f, 2.5621100406717301e-01f, -5.9268405464100871e-01f }, { 6.9022452711866278e-01f, 4.4164695597223053e-01f, 5.7318240416492283e-01f }, { -3.5778368305199634e-02f, -8.2112922442906544e-01f, -5.6961978999148100e-01f }, { 7.8098870632287176e-01f, 1.2403743395550081e-01f, -6.1210403982808503e-01f }, { -8.9081263771941477e-01f, 4.0512082293538981e-01f, 2.0574246840050139e-01f }, { 4.5065316081463747e-01f, 4.0496634039652771e-02f, 8.9178010253606521e-01f }, { 9.3875829947647926e-01f, -1.6145804385722898e-01f, 3.0440787643854744e-01f }, { -7.9560508272612651e-01f, -9.7243653881356959e-02f, -5.9796005227787274e-01f }, { 4.0616552008992562e-01f, -3.1248794404629693e-01f, 8.5870883023047961e-01f }, { -7.5622213987830744e-01f, 6.0457182127091758e-01f, -2.5024185917435837e-01f }, { 2.7638695470210156e-01f, -2.4938045580002127e-01f, -9.2812695227294850e-01f }, { 4.0149852454745656e-03f, 7.9754778079123467e-01f, -6.0324241996767369e-01f }, { 4.6924882989407740e-01f, -3.1878756302069955e-01f, 8.2351686400848079e-01f }, { 4.9248136571555767e-01f, -4.6110329523986177e-01f, 7.3813674582822397e-01f }, { -8.1111413521640430e-01f, 5.5972036149895110e-01f, 1.6972618117317148e-01f }, { -7.2088383928582433e-01f, -6.7790833199907974e-01f, 1.4410684807723501e-01f }, { -3.8319714140916158e-02f, 2.5072996733254072e-02f, -9.9895092188904488e-01f }, { 5.1392619504651771e-01f, -4.3956663160188242e-01f, -7.3665530774384813e-01f }, { 2.0706210086399693e-01f, 7.7665163132186843e-01f, -5.9492649121624142e-01f }, { 7.4711583090514100e-01f, -2.7252002028424469e-03f, 6.6468827919166373e-01f }, { 6.9579808212829630e-01f, -6.8903475253936364e-01f, -2.0272182590831753e-01f }, { 1.3588476763180588e-01f, 9.1765965546868644e-01f, -3.7341141740812073e-01f }, { 6.7519371990526197e-02f, 8.5441793722616133e-01f, -5.1518067020434333e-01f }, { -5.6027702873767837e-01f, -7.2885883732885060e-01f, -3.9351549692040699e-01f }, { -3.3625924984786870e-01f, 9.3381776479147593e-01f, -1.2212329446751838e-01f }, { 3.7661378894869074e-01f, -6.9829445001655666e-01f, -6.0872564842446530e-01f }, { 7.1889221387880586e-01f, -6.8308184137025718e-01f, 1.2881452874054208e-01f }, { 8.8910059784331918e-01f, -3.3093753083440458e-01f, 3.1619689688527930e-01f }, { -7.0679384864195971e-01f, 6.1843739926602870e-01f, 3.4347873108965127e-01f }, { 3.3104493070224211e-01f, -8.9659587947876163e-01f, -2.9415146227420591e-01f }, { 1.9978357814285866e-01f, 3.1528703167897237e-01f, 9.2772873705598824e-01f }, { -5.4055350136646285e-01f, -5.9853937936648216e-01f, -5.9122967069324572e-01f }, { -2.8546922303938477e-01f, -8.3927200441844918e-01f, 4.6274163989933803e-01f }, { 8.2551899888192792e-01f, 5.2372752608657869e-01f, -2.1030421038155997e-01f }, { -7.2883159023330879e-01f, -1.3611446209325684e-01f, 6.7102709802738192e-01f }, { 7.3411248219832814e-01f, -6.1725324793884584e-01f, -2.8297931265298359e-01f }, { -3.1260567431414386e-02f, 9.0443648301611379e-01f, 4.2546142611676174e-01f }, { 9.9417499657178290e-02f, 9.4061714042285050e-01f, -3.2458520592389067e-01f }, { 3.5017336531138232e-01f, -5.6069247057855631e-01f, 7.5033497030527363e-01f }, { -8.5394723232871605e-01f, 2.3042435439190028e-02f, 5.1984918059679264e-01f }, { 6.2174220080783260e-01f, 7.7304347729541034e-01f, -1.2585872216756841e-01f }, { 1.5733196984692827e-01f, 9.6830593433927870e-01f, -1.9398522827117981e-01f }, { -4.4546774540909417e-01f, -8.5039319033993221e-01f, -2.7998198089093246e-01f }, { -9.2913337442539312e-01f, -3.6096193333595633e-01f, -8.0110269074887677e-02f }, { -2.3538037603718578e-01f, 9.4669459235160480e-01f, -2.1992141184709985e-01f }, { -3.8435062913059997e-01f, -3.7903491781482213e-01f, -8.4178805228158415e-01f }, { -2.0125510370250502e-01f, -9.7511036815674446e-01f, -9.3038449830767866e-02f }, { -1.9674634879540548e-01f, 9.5125185189771178e-01f, 2.3750955453802380e-01f }, { -8.0413016292971362e-01f, 4.7195136469886423e-01f, -3.6143684154428946e-01f }, { -6.7320615701728148e-01f, 7.1185158516045210e-01f, -2.0015191944764094e-01f }, { 1.2261928720940314e-01f, -5.9564582549498368e-01f, -7.9383282936312061e-01f }, { 6.7983521147246428e-01f, 7.3332565889656343e-01f, -7.5870446229779273e-03f }, { 7.8315209635139027e-01f, -5.0785359977192190e-01f, -3.5882797435417918e-01f }, { -9.2840411947504947e-02f, 2.1291425750296977e-01f, -9.7265007935093317e-01f }, { -6.4450374876373040e-01f, 3.1187734627868294e-02f, 7.6396481793226567e-01f }, { 2.2207774639134656e-01f, -7.8441732875888659e-01f, -5.7911219025376559e-01f }, { -4.0165044294941904e-01f, -8.3002821366795787e-01f, 3.8694972049830240e-01f }, { 3.8126630984670162e-01f, 6.2978956410204412e-01f, -6.7675778970325573e-01f }, { -7.2267295892860489e-02f, -2.9909249562916423e-01f, 9.5148363990278473e-01f }, { 7.1105672732729719e-01f, 7.0288444682959084e-01f, -1.8755930466223328e-02f }, { 5.3771627340110606e-01f, -2.0454569881113371e-01f, 8.1793781329480786e-01f }, { 6.5327862054126129e-01f, -6.0678755897091896e-01f, 4.5280890254258521e-01f }, { -9.9653578734271964e-01f, -8.3104789401580309e-02f, -3.1652051663151135e-03f }, { -4.1629498360229822e-01f, -8.8371427187455598e-01f, 2.1388682126953412e-01f }, { 9.3976830102423603e-01f, -1.2601355452038268e-01f, -3.1773593512091042e-01f }, { 7.1963987073304025e-01f, 6.8956707194018141e-01f, 8.1337013389831625e-02f }, { 6.1116066242619636e-02f, -8.0767138578732467e-01f, 5.8645695411292564e-01f }, { 4.1646141760476801e-01f, -7.8112315282953249e-01f, -4.6519512869362456e-01f }, { 1.8359007006197378e-01f, -9.0712361753183568e-01f, -3.7871021730420124e-01f }, { 3.4762959330822263e-01f, 9.0015569416086527e-01f, -2.6243740611073463e-01f }, { -5.8618744389358557e-01f, 3.1659402410925896e-01f, 7.4575633052613810e-01f }, { 5.9086297095263240e-01f, 2.3624117426216514e-02f, -8.0642597343640965e-01f }, { -3.7426480449098770e-01f, 7.1278898615256148e-01f, -5.9317595815990920e-01f }, { 6.3372219748815961e-01f, 6.7155341722656559e-01f, -3.8394294396706974e-01f }, { -9.1410661263371529e-01f, 2.9897367887029297e-01f, -2.7390480113002325e-01f }, { -8.0152775543883559e-01f, -3.7776766972410591e-01f, 4.6351358661036146e-01f }, { 1.9928435095300320e-01f, -5.5186605936786493e-01f, 8.0977132573525001e-01f }, { -3.8746511585370857e-01f, 2.2443513532232498e-01f, -8.9414744535189605e-01f }, { -5.8082511099080669e-01f, -6.9772356241791386e-02f, -8.1103268044326404e-01f }, { 2.2279375323465056e-01f, -1.0587066084298768e-01f, -9.6909976095977168e-01f }, { 6.2387871601406486e-01f, -4.9453370765930571e-01f, -6.0515432717066653e-01f }, { -3.0290062235917814e-01f, -6.4143771859145673e-02f, -9.5086107792153551e-01f }, { 8.0040701522904190e-01f, -5.9878361110649192e-01f, -2.8404172975210491e-02f }, { 8.1351612004281382e-01f, 2.6437033570710550e-01f, -5.1797668676167119e-01f }, { 2.4902100493247092e-01f, -4.8773858641503365e-01f, 8.3671955303093470e-01f }, { -4.6910947329908109e-01f, 7.6323249481938193e-01f, 4.4431122078205604e-01f }, { 1.6020614024714355e-01f, 9.8704761701961108e-01f, -8.4258152733031680e-03f }, { 2.3052248764341063e-01f, -5.2143229727347440e-01f, -8.2156420446049161e-01f }, { -6.2620837496528403e-01f, 7.7712008043973513e-01f, 6.2828748998192935e-02f }, { 5.3453646623778428e-01f, 7.7784004251312844e-01f, 3.3050814592865413e-01f }, { 9.7067220668438625e-01f, 1.8324353590010356e-01f, 1.5561900180020272e-01f }, { 9.5213136660639430e-01f, -2.8380763693873567e-01f, -1.1357414291770317e-01f }, { -2.0632149576181671e-01f, -5.5945735731823287e-01f, -8.0276952217252606e-01f }, { 5.1915916415341568e-01f, -5.9538467273503926e-01f, 6.1318093067847190e-01f }, { 7.9635378461924888e-01f, -3.0452217289635303e-01f, -5.2257716744714622e-01f }, { -4.1749466518764422e-01f, -9.0834169427432421e-01f, -2.4770365009563280e-02f }, { 6.9308479536009038e-01f, -3.7493119455990997e-01f, 6.1567854095017860e-01f }, { -4.7538747584668258e-02f, 9.9838744102570065e-01f, 3.1025555276812493e-02f }, { 7.1605478807134471e-01f, -5.9863398959746339e-01f, -3.5903048196319715e-01f }, { 6.0271688231314735e-01f, -3.5671756736404947e-01f, 7.1378213546473313e-01f }, { -1.4971672824351381e-01f, 4.7820331180050668e-01f, -8.6539383743304144e-01f }, { 8.1103377291083800e-01f, 3.7927511359286253e-01f, 4.4539264408736329e-01f }, { 9.8008026035250662e-02f, -5.6219234852083488e-01f, 8.2117853728485968e-01f }, { 8.5575862203363728e-01f, 5.1646781978643541e-01f, -3.0629592555835555e-02f }, { -8.8782111093735461e-02f, -9.8590311155514254e-01f, -1.4181957331633618e-01f }, { -6.9402953481649832e-01f, 2.4051568140988500e-01f, -6.7858323866592352e-01f }, { -2.1643214252145376e-01f, -2.8814841707462041e-01f, 9.3280631291869143e-01f }, { 3.2658433699503520e-01f, 5.8661625400673301e-01f, 7.4109651285417710e-01f }, { -9.8339135315776172e-01f, -1.7484391255750262e-01f, -4.8693457220973034e-02f }, { -6.7655403739722753e-01f, -7.2565636481589157e-01f, -1.2528956334705796e-01f }, { 6.5294479519088555e-01f, 7.9793697520548282e-03f, -7.5736346894439821e-01f }, { -5.3182438313948377e-01f, 8.5060751346670307e-02f, 8.4257195187037137e-01f }, { 7.9350872873077474e-02f, -1.0314601338244919e-01f, -9.9149601053034420e-01f }, { 5.7802485181661767e-01f, 5.5868748847030736e-01f, -5.9477353749903616e-01f }, { -8.6898309575743116e-01f, 3.3985741738125713e-01f, -3.5967390110873093e-01f }, { -1.8339980424957936e-01f, -3.8679559741030084e-01f, -9.0374425454617657e-01f }, { -1.8689344637830715e-01f, 6.5593798851533280e-01f, -7.3131128455897487e-01f }, { 8.5268907165410368e-01f, -2.4032861661138383e-01f, 4.6385720121533258e-01f }, { -3.4706406916143917e-01f, -9.3577711758366544e-01f, -6.2190980888794434e-02f }, { 2.4976731636191404e-01f, 9.1592153179620928e-01f, -3.1417198358455356e-01f }, { -8.0334931780634355e-01f, -2.4823926950936986e-01f, -5.4130133812280279e-01f }, { 7.5539467788263082e-01f, -6.4687032482424600e-01f, -1.0458328493775187e-01f }, { -7.3954481022924667e-01f, -2.0677108457439844e-01f, -6.4056162252113924e-01f }, { -6.0313848342760075e-03f, -9.3473491083397442e-01f, -3.5529462262351058e-01f }, { 6.7005311418711355e-01f, -5.8640660302907666e-01f, -4.5514406520578726e-01f }, { 3.9833820720256119e-01f, -5.9978251269779093e-01f, 6.9396513611605426e-01f }, { 5.9595545012208462e-01f, 7.1669881255815526e-01f, 3.6218767724415163e-01f }, { 3.9228950117296202e-01f, 8.5467189240238894e-01f, -3.4006602830448640e-01f }, { 5.7980020701150281e-01f, 7.9778549009771293e-01f, 1.6543890636416397e-01f }, { 8.8899169088494068e-01f, 1.1987083667733724e-01f, -4.4195560416382235e-01f }, { 8.9236396260423700e-01f, 7.4826395365775169e-03f, -4.5125443859404812e-01f }, { -7.2344458050363436e-01f, -4.8599909950592379e-01f, -4.9033948874157740e-01f }, { -7.1032598856934159e-01f, -5.6981712735166024e-01f, 4.1321354205748073e-01f }, { 8.7366982491913125e-01f, -4.8519890102821756e-01f, 3.5819875303866308e-02f }, { -8.1619066099334572e-02f, -5.0006419253955592e-01f, -8.6213347655037409e-01f }, { -1.5166812793196383e-01f, 4.3880232666461239e-01f, -8.8569142317363347e-01f }, { -8.4793176822231087e-01f, 1.1269189111110169e-01f, -5.1798866215119899e-01f }, { -7.3250275524729111e-02f, 9.8983823356345702e-01f, -1.2187972969910271e-01f }, { -7.4920901876919660e-02f, -8.6634620652082328e-01f, -4.9379257680622130e-01f }, { 6.9842962155778676e-01f, 6.3497330365777516e-01f, 3.3015900316753072e-01f }, { -1.1040954490421940e-02f, -4.4285038952746375e-01f, 8.9652753991124778e-01f }, { 3.5300292728715732e-01f, -7.8971091318513309e-01f, 5.0174257037150150e-01f }, { -6.9703434439854661e-02f, -9.7140471863550593e-01f, 2.2696762729508890e-01f }, { -4.8728431368885383e-01f, 7.2029185390933059e-01f, 4.9369387561994538e-01f }, { -7.7582041981350847e-01f, -3.9379540285502390e-01f, 4.9297855621785514e-01f }, { -9.6031429675175639e-01f, 2.1365524393498256e-01f, 1.7929832178038529e-01f }, { 7.2464644133241063e-01f, 4.3995665081011154e-01f, 5.3040143332406520e-01f }, { 4.1460836043644794e-01f, -8.8383165819975285e-01f, -2.1665988881210996e-01f }, { -3.7162548666206774e-01f, -9.0541929290285939e-01f, 2.0520819111932939e-01f }, { -7.4401495929381611e-02f, 8.5485874000223472e-01f, -5.1349873616715158e-01f }, { 8.9342550026894141e-01f, -2.0412935751777864e-01f, -4.0015257198794901e-01f }, { 1.3407670135995456e-01f, 2.7125791559016266e-01f, -9.5312254268908869e-01f }, { -2.7973759217078886e-01f, 9.0850832927101755e-01f, -3.1041825843798831e-01f }, { -6.0687167147651910e-01f, 3.5467292525046878e-01f, -7.1127624060808559e-01f }, { 1.1590264755766588e-01f, 9.7620742806742355e-01f, -1.8326383624465961e-01f }, { 2.6777101774120521e-01f, 6.8652417483548933e-01f, -6.7600535458255784e-01f }, { -2.2949067216391200e-01f, -7.3317137728560555e-01f, 6.4015135938220435e-01f }, { 3.8778592409272833e-01f, 7.9939203027469363e-01f, 4.5890571908492495e-01f }, { -6.3437069875162011e-01f, -4.0598984736688763e-02f, -7.7196213573188388e-01f }, { -1.7752583651342560e-01f, 7.4711996554236049e-01f, 6.4054378028218384e-01f }, { -8.2001666310727506e-01f, 1.8326056348649475e-01f, -5.4220682225237837e-01f }, { 5.5407218455428986e-01f, -3.2313771560268839e-01f, -7.6719360728457131e-01f }, { 1.9833083910713684e-01f, 9.2792304295241523e-01f, 3.1563223000351093e-01f }, { 4.1157959825250806e-01f, -6.5489939134148842e-02f, 9.0901776779912802e-01f }, { 6.7180637832856294e-01f, -4.2148810895572703e-01f, 6.0911736475492551e-01f }, { -3.9098245587038033e-01f, -8.8110048138365871e-01f, 2.6607266095382831e-01f }, { -9.4510645063582532e-01f, -3.4819059377711785e-02f, -3.2490218538908544e-01f }, { -8.9990734545882445e-01f, -5.1562334257490926e-02f, -4.3302204940992423e-01f }, { 7.5717841089732962e-01f, 6.2934686963819786e-01f, -1.7493819407892533e-01f }, { 9.5324641294483115e-01f, -5.5178134584547428e-02f, -2.9711386650841776e-01f }, { -4.6148698341986338e-01f, 4.8203065232881193e-01f, 7.4476587888375678e-01f }, { -7.3878799388404387e-02f, -1.1379543695000173e-01f, -9.9075351199492911e-01f }, { -7.3989197788657590e-01f, 5.2538154083214994e-01f, 4.2015960968651711e-01f }, { 9.6176795805514481e-01f, 6.4890947767981391e-02f, -2.6606683325099034e-01f }, { -9.1127503820978384e-01f, -1.9563194822067681e-01f, -3.6236162265220551e-01f }, { -9.4880187808546657e-01f, -4.4068385256759062e-03f, 3.1584106116162292e-01f }, { 1.8310127166372440e-03f, 5.3089403597227980e-01f, 8.4743623356657061e-01f }, { 6.0321721484046975e-01f, 1.8821283794792559e-01f, 7.7505155915699864e-01f }, { 7.3173931090147831e-02f, -8.9449622408276669e-02f, 9.9329972357784890e-01f }, { 5.3481418052579288e-01f, 1.4043494460507455e-01f, -8.3321774983631636e-01f }, { -3.2572800002689678e-01f, 5.8830356385667426e-01f, -7.4013524895927896e-01f }, { 2.0709150890888598e-02f, -2.5634611193721207e-01f, 9.6636318326188975e-01f }, { 5.5048577521214437e-01f, -8.5655006494248509e-02f, -8.3043881842767608e-01f }, { -7.7695591660682961e-01f, -5.0128640426763726e-01f, 3.8085619930108028e-01f }, { 1.1723262743746635e-01f, -5.0398876063906439e-01f, 8.5571714965495937e-01f }, { -2.9964116691021028e-02f, -7.3162211631033724e-01f, -6.8105156239194575e-01f }, { -3.2189483950613457e-01f, -4.3993999391127897e-01f, 8.3835345413295925e-01f }, { -1.1622594894944908e-01f, -2.7276080134670055e-01f, -9.5503564019334153e-01f }, { 8.5177501920399246e-01f, -4.2228483648410048e-01f, -3.1008842857422919e-01f }, { -8.5972218344701490e-01f, -1.1323089479866148e-01f, -4.9805273993041316e-01f }, { -1.7598944207780304e-01f, 1.3655933007418652e-01f, 9.7487397423812328e-01f }, { -3.3615510227663115e-01f, -6.3572724051824980e-01f, 6.9487453750762740e-01f }, { -7.6985270032261799e-01f, 2.3438774175502025e-01f, 5.9362379190945114e-01f }, { 4.5181533778156119e-01f, 4.0148933134827863e-01f, 7.9666129400068497e-01f }, { -7.9156824120779756e-01f, 2.7141093261396698e-01f, 5.4749961202617381e-01f }, { -6.5594229700721951e-01f, -2.5429423695782299e-01f, 7.1068568583230318e-01f }, { -7.8322255919068418e-01f, 5.4098528684347236e-01f, -3.0642673217864169e-01f }, { -7.0907749995499192e-01f, 5.1193676546275080e-01f, 4.8490189443341514e-01f }, { 2.8421467363452829e-02f, -9.5117325014911780e-01f, 3.0734617029283468e-01f }, { -9.2643803533306601e-01f, -4.7103719403573843e-02f, -3.7348869635714277e-01f }, { -9.4924771377986705e-01f, 1.1840342960468726e-01f, -2.9139218545037121e-01f }, { 4.8895946764172893e-01f, 2.7886532817396659e-01f, 8.2653056068480790e-01f }, { -1.3963618786040532e-02f, 3.5813594991651271e-01f, -9.3356502651277340e-01f }, { -8.8362917685035469e-01f, 2.6045826047067167e-01f, 3.8905137497682274e-01f }, { -5.0372720281252903e-01f, -5.9776995953727641e-01f, -6.2364251027449058e-01f }, { -1.8435906484650921e-01f, -7.3689073270798811e-01f, 6.5038741013184220e-01f }, { 8.4901684029207058e-01f, -7.2123802997284769e-02f, -5.2342006260906504e-01f }, { 5.4789487565416317e-01f, -2.6523633005515668e-01f, -7.9338571606172814e-01f }, { 8.1696216450030312e-01f, 5.1519074754783045e-01f, 2.5913570849284184e-01f }, { 5.7965239304886407e-01f, -1.7633439282907687e-01f, -7.9555595977801963e-01f }, { 4.6781617934090874e-01f, 6.4998074450741539e-01f, 5.9889319090841298e-01f }, { 5.7465541837048728e-01f, -9.1170228050305419e-02f, 8.1330138303995003e-01f }, { -7.9507858086916983e-01f, -4.9023328514677877e-01f, -3.5710135308797697e-01f }, { 7.7076315827405026e-02f, 8.7826452190764071e-01f, -4.7192231468411977e-01f }, { 1.3262786400007864e-01f, 1.1815350187646181e-01f, -9.8409836890684133e-01f }, { -3.2177122799818875e-01f, 9.4681708705626566e-01f, -8.2491867797627235e-04 }, { 6.3232245939134527e-02f, -2.2510440634556741e-01f, 9.7228066386064804e-01f }, { 7.5634508907506870e-01f, 4.2849657161151483e-01f, 4.9430030785869861e-01f }, { -6.3680151303367538e-01f, 6.8955022455057147e-01f, -3.4497002887247785e-01f }, { 6.6874575587418528e-01f, 7.2295603075032433e-01f, 1.7353296978384430e-01f }, { 4.9955934159286391e-01f, 6.9551940630318110e-01f, 5.1642348870183563e-01f }, { 6.1918964569871482e-01f, 2.3856832086309165e-01f, -7.4812387940772551e-01f }, { -2.7283990222048704e-01f, -9.4945171722746524e-01f, 1.5524118142468665e-01f }, { 6.0365609438442336e-01f, 3.7581236463263845e-01f, 7.0311050788746488e-01f }, { -6.8083225900675537e-01f, -5.9599507503562488e-01f, 4.2574323908787809e-01f }, { 3.8224957768209383e-01f, 7.4120377804575266e-01f, -5.5181719778615412e-01f }, { -5.3456990549344119e-01f, -7.9418700845220058e-01f, -2.8896714648291366e-01f }, { -9.9441259956763162e-01f, 8.9557541694264234e-02f, 5.5884063442320241e-02f }, { -9.4921817795727031e-02f, 5.3936277583607828e-01f, -8.3670642674043993e-01f }, { 4.7241155775072513e-01f, -8.5768809179637895e-01f, -2.0297403108333706e-01f }, { 3.5799952398695928e-01f, -7.4543480894014724e-01f, -5.6228399092049275e-01f }, { 9.1231997460855951e-01f, -4.0436337540104061e-01f, -6.4517629873660470e-02f }, { 7.9470301073435035e-01f, -5.3186762032452400e-02f, 6.0466378515193253e-01f }, { -6.0664454698195491e-01f, -7.6248475509311398e-01f, -2.2494308584095776e-01f }, { 9.9985544259208425e-01f, 1.4225180732434292e-02f, 9.3133319556937561e-03f }, { 4.5626627092487737e-01f, 3.7166591447167907e-01f, -8.0850821766772230e-01f }, { 4.3647555130377491e-01f, 3.6613428138857829e-01f, 8.2184839301791857e-01f }, { -5.7162812277191721e-01f, 6.0622646377220646e-01f, -5.5292925757143607e-01f }, { 6.9670540310662707e-02f, 9.6309555113779188e-01f, -2.5998649040173871e-01f }, { -5.8199884173634164e-01f, 7.5828055906728387e-01f, 2.9374809268855556e-01f }, { -3.3164727412326532e-02f, 8.8407026462600713e-01f, 4.6617579094132267e-01f }, { -5.9677945169391966e-01f, 4.8409438048482079e-01f, -6.3992727463276811e-01f }, { -8.6843257696116405e-01f, 4.9551492488650334e-01f, 1.7024056135799610e-02f }, { -7.3476552400701348e-02f, -1.3879761622802908e-01f, 9.8759122007879541e-01f }, { 2.2097091840338343e-01f, -8.7471007113345844e-01f, 4.3133994097192696e-01f }, { -4.4918521123084122e-02f, 5.6131859573913734e-01f, -8.2637991295623703e-01f }, { 2.2397714860148965e-01f, -3.2759692714417360e-01f, -9.1788588083162126e-01f }, { -3.5391747160044007e-02f, -9.9887048187504379e-01f, -3.1704647477574524e-02f }, { 4.7124192906849088e-01f, -8.7909779093543294e-01f, -7.1541025015366785e-02f }, { 4.2156543704367611e-01f, 9.0675458147417076e-01f, -8.8719369799229904e-03f }, { 7.4080232466950002e-01f, 2.6494634311321374e-01f, -6.1726440933784599e-01f }, { -7.5541636793722333e-01f, -5.9929563631657445e-01f, -2.6493556073967411e-01f }, { -1.6657918045274381e-01f, -5.9264741707003699e-01f, 7.8804848561488006e-01f }, { 7.0621408063110813e-01f, 5.2013433262421416e-01f, 4.8033524578560977e-01f }, { 8.1083414065195258e-01f, 5.6438584314658047e-01f, -1.5497295379818016e-01f }, { -4.3699646854834584e-01f, -2.7084187766167889e-01f, 8.5771718169858924e-01f }, { 2.3265851394999415e-01f, -6.0344503896643920e-01f, -7.6270839829739190e-01f }, { 3.1405983709523644e-01f, -6.9611464868629958e-01f, -6.4559338178768799e-01f }, { 3.4705862496526607e-01f, 2.0768541131834703e-01f, 9.1455840751848527e-01f }, { -6.7844372313611387e-02f, -6.3785247301219306e-01f, -7.6716449593134961e-01f }, { 7.9161980733143167e-01f, -5.7555104188224160e-01f, -2.0513185717682461e-01f }, { -8.9086821311775999e-01f, 2.5039665119677679e-01f, -3.7901892291257605e-01f }, { 4.5527641380552580e-01f, 2.4114977282046315e-01f, -8.5707069375928302e-01f }, { 7.6210783439579349e-02f, 7.6337345624120490e-01f, -6.4144593130978922e-01f }, { -9.3209912999483821e-02f, -9.7126744337436854e-01f, -2.1897823078937875e-01f }, { 8.9525039561051334e-01f, 2.2787450606679635e-01f, -3.8288371425804058e-01f }, { -8.2425503350200591e-01f, 4.3883337049404575e-01f, 3.5781128082753710e-01f }, { -8.4787941027569924e-01f, -1.6568660014929606e-01f, -5.0363524118304070e-01f }, { 3.4261787032191815e-01f, -1.1804798225066493e-01f, 9.3202879184208676e-01f }, { 2.6655808077193743e-01f, 8.7756390676319374e-01f, -3.9853278299495243e-01f }, { 5.3337781199400702e-01f, 5.3788998928228093e-01f, -6.5282652297711785e-01f }, { -5.9929963191801705e-01f, -7.9221621546450560e-01f, 1.1503659912404111e-01f }, { 6.5126177783502170e-01f, 4.9468898781857812e-01f, 5.7544843562407699e-01f }, { 9.8585286759372448e-01f, -1.4436066670233602e-01f, -8.5171129888521824e-02f }, { 3.9326373773803354e-03f, 1.2248036717754794e-01f, 9.9246314491738741e-01f }, { -7.8980783602751914e-01f, -6.0077140572549725e-01f, -1.2360137625502843e-01f }, { 3.5921897031833389e-01f, -8.5784585267797209e-01f, -3.6750812835451552e-01f }, { 4.0874302253768563e-01f, -7.4373169615830925e-01f, -5.2895397309807712e-01f }, { -3.7261916906573656e-01f, -2.1796248655426248e-03f, 9.2798179081284005e-01f }, { 8.6678260140535923e-02f, -8.3105923020155725e-01f, -5.4938823714728779e-01f }, { 8.0839546774273174e-01f, -5.3961911107748628e-01f, -2.3517649264531879e-01f }, { 6.4534621399999681e-01f, -5.1557075727211477e-01f, -5.6366218457665607e-01f }, { 2.0282408254032427e-01f, 8.4065556974361666e-01f, -5.0215595645248612e-01f }, { -9.4249807607587877e-01f, -2.9520823062668439e-01f, -1.5668272771281888e-01f }, { 5.0651149170066440e-02f, -4.8994906286754278e-02f, 9.9751388975076627e-01f }, { 1.0302881739402779e-01f, 5.3390656631090172e-01f, 8.3924301679340219e-01f }, { -1.9824067173923224e-02f, -9.8583404991925139e-01f, 1.6654798822108546e-01f }, { -9.6625201543197237e-01f, 1.6381707014914579e-01f, 1.9879891901466992e-01f }, { -4.5946396389964550e-01f, -2.8961851314466708e-01f, -8.3965110773552709e-01f }, { -5.7130002833035716e-02f, 9.8776207056709975e-01f, 1.4512840771294011e-01f }, { 5.2652430383996063e-01f, 2.8564778093413212e-01f, 8.0073560100275976e-01f }, { -2.7905871557380896e-01f, 9.5599287051523252e-01f, -9.0575188580217111e-02f }, { 8.4498435675346262e-01f, -5.0084374267022158e-01f, -1.8750195270989017e-01f }, { -6.5662488236363448e-01f, 1.2332680429040875e-01f, -7.4406603416931905e-01f }, { -1.4195987515217731e-01f, 9.4203712577783882e-01f, 3.0399580178516711e-01f }, { 1.4875248613192857e-02f, -1.6712123846713595e-01f, 9.8582413169485072e-01f }, { 1.4812382707716878e-01f, -9.1078924134109496e-01f, 3.8538589713341309e-01f }, { 9.8712740313925162e-01f, 1.0660924089811309e-01f, -1.1922231220155670e-01f }, { 6.6745193470256559e-01f, -6.8216387071202800e-01f, 2.9859733481226097e-01f }, { 2.9942068698934976e-01f, -9.3851136826377424e-01f, 1.7188270373276165e-01f }, { -3.9154837348282934e-01f, 7.6913475715181256e-01f, 5.0509563110758848e-01f }, { -4.5404057382829527e-01f, -8.3948428715659984e-01f, 2.9851849010546666e-01f }, { -2.6249864071116613e-01f, 9.6478624683470460e-01f, 1.6791710555941163e-02f }, { 3.7776711839074212e-01f, -2.3044970429667178e-01f, 8.9676359094932678e-01f }, { -2.4824608017715619e-01f, 9.4416114711722454e-01f, 2.1664166716253785e-01f }, { 4.9052940852575444e-01f, 8.3291246356334192e-01f, 2.5619860930968785e-01f }, { -1.2116156021896148e-02f, -9.0002878191650659e-01f, 4.3566201404889843e-01f }, { -7.1015038940234276e-01f, 1.3698551475094300e-01f, 6.9059495594749309e-01f }, { -5.5393850881169582e-01f, -7.9898226772003555e-01f, -2.3405013207521216e-01f }, { 8.7836573130089568e-01f, -2.2291417099913857e-01f, 4.2282728677795800e-01f }, { -4.1794861234996133e-01f, 9.0837604844969233e-01f, 1.3111523087112000e-02f }, { 8.5946186944980918e-01f, 4.3297040330503006e-01f, -2.7177550445858584e-01f }, { 2.8717303256110760e-01f, -9.5021972640448071e-01f, -1.2088887840265022e-01f }, { -6.5357940761214151e-01f, 6.6873295946783828e-01f, 3.5444348896086220e-01f }, { -7.3923421243107756e-01f, -3.8260663544444917e-01f, -5.5420658755132357e-01f }, { 1.2217009788442011e-01f, 2.6181258814561281e-01f, 9.5735502081067447e-01f }, { 2.7830661670605428e-01f, 9.2502551248183365e-02f, 9.5602756503680719e-01f }, { 5.0933030467299423e-01f, 7.4562667956171202e-01f, -4.2967836281047583e-01f }, { 4.5390311474068090e-01f, -8.4178928073539150e-01f, -2.9216907650827922e-01f }, { -3.6221171342577067e-02f, 7.1227486576981122e-02f, 9.9680222306257804e-01f }, { -5.8966222552538261e-01f, 5.1792527891839235e-01f, 6.1971918257042691e-01f }, { -4.4200155863731838e-01f, -6.6317745642415593e-01f, 6.0401182393473718e-01f }, { 4.2754571919905499e-01f, -8.5465988836040885e-01f, 2.9455242864783227e-01f }, { 1.0740343633093610e-01f, -8.1528841135886831e-01f, 5.6900730062824267e-01f }, { -7.4406720220524036e-01f, 6.6151433944858862e-01f, -9.3609707329761316e-02f }, { 2.6790989252165504e-01f, 6.6463024724235620e-01f, 6.9748901349024828e-01f }, { -3.6235839042162338e-01f, -5.1283661520784107e-01f, -7.7826409591681345e-01f }, { 9.9877789381261461e-01f, -3.6284878970624448e-02f, 3.3557806682271873e-02f }, { -1.7135417494274963e-01f, 8.6428131981652967e-01f, 4.7292234769133823e-01f }, { -5.1384317456494144e-01f, -6.5979290845889471e-01f, -5.4830512481680815e-01f }, { -8.4125934730327812e-01f, -5.3879730737849041e-01f, 4.4499125121187227e-02f }, { -4.6918191321721681e-01f, 8.4572572031978899e-01f, -2.5419743960041374e-01f }, { 7.7749935218039612e-01f, -9.5846390689082808e-02f, 6.2153698743593688e-01f }, { 6.6669587914427442e-01f, 6.7339201598249132e-01f, 3.1946799142179971e-01f }, { -3.8048957248198144e-02f, -2.6691658666304785e-01f, 9.6296823032562839e-01f }, { 2.0460853738311571e-01f, 3.8591476326985752e-01f, 8.9955830379153967e-01f }, { -9.0507705986582776e-01f, 3.9156929909129534e-01f, 1.6585837245608215e-01f }, { 2.9602243745768647e-01f, -4.7175438353531168e-01f, -8.3055313986332513e-01f }, { -6.5620523823133803e-01f, 7.3907803416091000e-01f, -1.5217866058878851e-01f }, { 7.0450522369134494e-01f, 3.8652091902666008e-01f, -5.9520918083174257e-01f }, { -9.8253644410288887e-02f, -3.2576469642683029e-02f, 9.9462806866974951e-01f }, { -2.1653799271692248e-01f, 9.7619467633890011e-01f, 1.2459999908349534e-02f }, { 4.2663326431068355e-01f, 4.5141317526067049e-01f, 7.8371563910942188e-01f }, { -2.6306025896414398e-01f, -9.2075317468634610e-01f, 2.8811957840232355e-01f }, { -9.8809030365485384e-01f, 1.2488635788981646e-01f, -8.9894101231813628e-02f }, { 2.1393858872281901e-01f, 5.7905388582556705e-01f, -7.8671905885493820e-01f }, { 3.4144264903299704e-01f, 1.6664821524552179e-01f, 9.2501096738190725e-01f }, { 3.3599127130667422e-01f, 9.0993147453759948e-01f, 2.4317602112781339e-01f }, { 4.6198081167010008e-01f, 5.8534981825900445e-01f, -6.6628771556496968e-01f }, { -4.2212802454954856e-01f, 8.7423637259365505e-01f, -2.3983055627710098e-01f }, { 6.0700597107114973e-01f, -2.2536573134386434e-01f, 7.6207220013579791e-01f }, { -9.8484790469667927e-01f, -1.4600516606622463e-01f, 9.3579357213728787e-02f }, { 4.2910257009242309e-02f, 9.9499422066903853e-01f, 9.0250820930413270e-02f }, { -9.1248425378519538e-01f, 3.8938338994425170e-01f, -1.2551120360190160e-01f }, { -2.8141834725664072e-01f, -7.0500797864289100e-01f, -6.5097424209964372e-01f }, { -8.3829194387467532e-01f, -2.2273023626458774e-01f, -4.9765234721473889e-01f }, { -6.7574542876051202e-01f, -5.6933529119311332e-01f, -4.6821516604155894e-01f }, { 6.5901345817401691e-01f, -7.4784910306824204e-01f, 8.0143502453718957e-02f }, { -7.1388392415848079e-01f, 6.8966211256753718e-01f, 1.2139157020555441e-01f }, { -8.0282116630857464e-03f, -9.8501844252774429e-01f, -1.7226205530443867e-01f }, { 2.9654259988616688e-01f, 4.2470981018874931e-01f, 8.5538533046936760e-01f }, { 8.6394179523489767e-01f, 2.7845374745988793e-01f, -4.1960467701379017e-01f }, { -5.4551534244537458e-01f, 7.9118506863414462e-01f, 2.7647639741411845e-01f }, { 3.5810411670176301e-01f, -8.3653896355206236e-01f, -4.1468542783716339e-01f }, { -6.4964378537786227e-01f, 5.7121723413093684e-01f, -5.0167103120643175e-01f }, { 9.4457860522430692e-01f, -2.1460291653145014e-01f, -2.4842875592148822e-01f }, { -6.0762701097189475e-01f, -4.3828033324374688e-01f, 6.6234414395321040e-01f }, { -5.8211209625266547e-01f, 8.0294148324891323e-01f, 1.2818144122439326e-01f }, { 8.7085019440078326e-01f, -4.5932254800918565e-01f, 1.7505066638681352e-01f }, { 6.7204202185768025e-01f, -5.2391712903874832e-01f, -5.2332624887085188e-01f }, { 3.3583161360818220e-01f, -5.0424628873204347e-01f, -7.9558331279714845e-01f }, { -1.2244021391289248e-02f, 9.4786461075037265e-01f, 3.1843800594026805e-01f }, { -8.5786305465603382e-02f, 2.2673456545881565e-01f, 9.7017119449134559e-01f }, { 9.3131076829510995e-02f, -6.2554901054808021e-01f, -7.7460637612331440e-01f }, { -1.9558213930480578e-01f, -7.3354122891985651e-01f, -6.5089545417040839e-01f }, { -1.5282756067150516e-01f, 1.4600186903586361e-02f, -9.8814501528954635e-01f }, { 7.2091851824556463e-01f, -1.5089987076863634e-01f, 6.7639169055557469e-01f }, { -9.8117945785507332e-01f, 1.8945906982164556e-01f, -3.7311289786622029e-02f }, { 9.9720938054113772e-01f, -6.1257601292899921e-02f, -4.2672680307200297e-02f }, { -5.5709624451378870e-01f, 8.0119103203503953e-05f, 8.3044793210023848e-01f }, { -9.8363130335411608e-01f, 7.9020571819890972e-02f, -1.6194199051246841e-01f }, { 1.1926929155434624e-01f, -9.9169739161049186e-01f, 4.8074104932606207e-02f }, { -7.2002972881922156e-01f, 5.7852498930360308e-01f, 3.8323103523564489e-01f }, { -5.2269564682952507e-01f, 2.1239979992465338e-01f, -8.2563647313901500e-01f }, { 6.4587298039872110e-01f, 7.6251117963369619e-01f, 3.7746445190276715e-02f }, { 8.3564624507741200e-02f, -9.9646335109321094e-01f, -8.8172251285977173e-03f }, { -6.1197689411981560e-01f, -2.8089868075112645e-01f, 7.3931063310068845e-01f }, { -5.5399042952968836e-01f, -7.9573618557280090e-01f, 2.4474175565187128e-01f }, { 2.1973108461512356e-01f, -6.3547871117270560e-01f, -7.4019258176513669e-01f }, { 2.2819763242590613e-01f, 9.4517977124055996e-01f, 2.3358304859910950e-01f }, { 4.5345403479209340e-01f, -5.7436314643730613e-01f, -6.8153240153745354e-01f }, { 8.2190308049525240e-01f, -5.3921548946607734e-01f, -1.8363546006224732e-01f }, { -2.6346355447287828e-01f, 9.6187373150175437e-01f, 7.3388555725041771e-02f }, { -3.7564404930890659e-02f, -6.3736082797202342e-01f, 7.6964932953196608e-01f }, { -5.1921621086646541e-01f, 7.7461457394816713e-01f, 3.6109110789462751e-01f }, { -1.3521346987211683e-01f, 7.8697295065751516e-01f, 6.0198911327244642e-01f }, { 3.0560684284957157e-01f, 6.3761871778804302e-01f, -7.0713989304086733e-01f }, { -5.3131348005627410e-01f, -8.4714359863461941e-01f, -7.3286562805278043e-03f }, { -5.7670698766723538e-01f, -1.7355021407251536e-01f, 7.9830406085098138e-01f }, { 3.0289002437667684e-01f, -5.4447563415695965e-01f, -7.8217895455098563e-01f }, { -8.8179501233520072e-02f, 9.6621834944837193e-01f, 2.4217034655686392e-01f }, { 1.7518606781465162e-01f, 5.4954343206832690e-01f, -8.1689158271719531e-01f }, { -8.8409556356602759e-01f, 4.1961967582004528e-01f, -2.0565593146697234e-01f }, { -8.9100001231918646e-01f, 1.2622524075291539e-01f, 4.3610338985621067e-01f }, { 1.7244880733440790e-01f, -6.3022304253200523e-01f, -7.5702069027909835e-01f }, { 5.5434542417667709e-01f, 6.0016790558662847e-01f, 5.7662781393038942e-01f }, { 9.1341809815641350e-01f, 3.2903540460177788e-01f, 2.3958939976314694e-01f }, { -4.4205449805941666e-01f, -4.0022588429976996e-01f, 8.0274968843463546e-01f }, { 9.5596487033652588e-01f, 1.9949464809085457e-01f, 2.1525113719926128e-01f }, { 6.5742892313294754e-01f, 7.4245835931007964e-01f, -1.2861880002098236e-01f }, { -3.1841803156141874e-01f, -8.9647075561424938e-01f, 3.0813980837432875e-01f }, { -9.9694858478890691e-01f, -6.2141192970753129e-02f, -4.7243956476645962e-02f }, { -5.8140890998774886e-01f, -1.2364526963086096e-01f, -8.0416138099561163e-01f }, { 3.8302867892932219e-01f, -8.6726535852966302e-01f, 3.1802488740989010e-01f }, { 1.2817959248813940e-01f, -3.7493292233883446e-01f, 9.1814775271523486e-01f }, { -9.9859801864120901e-01f, 3.9726245904826978e-02f, -3.4983175272707924e-02f }, { -1.5459877806065567e-01f, 9.6206164828577634e-01f, 2.2480347577341236e-01f }, { 7.4271157153200296e-01f, 6.6101574349012104e-01f, 1.0694722236068022e-01f }, { 5.9228933383611093e-01f, -6.1338215030177778e-01f, -5.2245160801278334e-01f }, { 9.2247497932160472e-01f, -1.8764149300002822e-01f, 3.3738788157004884e-01f }, { 7.0063111815265966e-01f, -2.3354538159294089e-01f, -6.7421998710566378e-01f }, { -5.0611364511222967e-01f, -6.4712825105319227e-01f, 5.7015261546365692e-01f }, { 7.1491458990347545e-01f, 4.1926288424026542e-01f, -5.5956747854184596e-01f }, { 6.7095759228300500e-01f, 3.4194396530042065e-01f, -6.5794394438463943e-01f }, { 4.1349115445205009e-01f, 8.0789949871505529e-01f, 4.1990887721727582e-01f }, { 8.5025117489703073e-01f, 1.5618200237064012e-01f, -5.0267297691612223e-01f }, { -1.2360269241362953e-01f, -7.5312153771886137e-01f, -6.4616586404117593e-01f }, { 5.7582363374508172e-01f, 7.8855601954982402e-01f, 2.1588549477060151e-01f }, { -5.5057699901055335e-01f, -6.2883545550056419e-01f, -5.4902726532106871e-01f }, { 2.1656615608520788e-01f, -8.6501905467611440e-01f, -4.5259378595570521e-01f }, { -6.4291941839097977e-01f, -3.0048146132896419e-01f, 7.0453212336515536e-01f }, { -7.4188564030673976e-01f, 6.4261527626113502e-01f, -1.9144530138523622e-01f }, { 2.9086965782545871e-01f, -6.2185094752195946e-01f, -7.2711501237599396e-01f }, { -2.3787202693465098e-01f, 7.4708005002348687e-01f, -6.2071595569866345e-01f }, { -4.2561269979255606e-01f, 8.5830016072610582e-01f, -2.8666123538565963e-01f }, { 1.8027659731407267e-01f, -5.9449784264142458e-01f, 7.8362788589709576e-01f }, { -9.7844343287264279e-01f, -1.8645144949094195e-02f, 2.0567160046594984e-01f }, { -3.0485827401516851e-02f, 8.5713489711897506e-01f, -5.1418905323673403e-01f }, { -8.3997240124518605e-02f, -9.5848061826149322e-01f, -2.7250572116660188e-01f }, { 3.2215443575716451e-01f, 5.1386239985470028e-01f, 7.9508612963474035e-01f }, { 5.0384992278328000e-01f, -2.8070230094228282e-01f, 8.1690970954995445e-01f }, { 2.0874707857145031e-01f, 9.7392274514663912e-01f, -8.8877126832045156e-02f }, { 7.4556938664495698e-01f, 4.8083139953163984e-01f, -4.6144062989978163e-01f }, { 8.9126667786009950e-01f, 4.3507293620681581e-01f, 1.2788764254845636e-01f }, { 6.5315431032167665e-02f, -7.6742384320148882e-01f, -6.3780446796407675e-01f }, { 2.8012324014712153e-01f, -5.8595491589565096e-01f, 7.6038661670705299e-01f }, { -4.5333478128889299e-02f, -8.5569432317747951e-01f, -5.1549209600397627e-01f }, { 4.3187320968609923e-02f, -7.2763996932143826e-01f, -6.8459837156792203e-01f }, { 3.2921101193017771e-01f, -7.1852964480236148e-02f, -9.4151859308210706e-01f }, { -9.2902510505808567e-01f, 1.8828085216380314e-01f, -3.1853206256244443e-01f }, { 2.5815481921325684e-01f, -9.6504246374133440e-01f, 4.5267344665065150e-02f }, { -6.9076097816323656e-01f, 3.3122232202235014e-01f, 6.4276048761657034e-01f }, { 7.3194700665256529e-01f, -3.1280154581752706e-01f, 6.0531708416871488e-01f }, { 2.4854161185437296e-01f, 7.8845381899853469e-03f, -9.6858912921545892e-01f }, { 9.6854572525923810e-01f, -7.4433053695763890e-02f, -2.3744241112231820e-01f }, { -9.1834247983968731e-01f, -3.9409093906221637e-01f, -3.6598107477762341e-02f }, { -6.3530796383055321e-01f, 7.7146002752545773e-01f, -3.5117189863322684e-02f }, { -3.8912429973288770e-01f, -1.1579126298864102e-01f, -9.1387891034473767e-01f }, { -3.3851483561346118e-01f, 9.0785849328001622e-01f, 2.4738767602475706e-01f }, { 5.4282264933013769e-01f, 8.2337541821033822e-01f, 1.6551885711652647e-01f }, { -3.4834733556675729e-01f, -8.0904056216806641e-01f, -4.7339993934338448e-01f }, { -3.3524927510716163e-01f, -9.3155582032161610e-01f, -1.4075395967802712e-01f }, { 2.1371987084930866e-01f, -6.7820974577790982e-01f, -7.0310408727016926e-01f }, { -5.9867117788535418e-01f, 6.9370146315143044e-01f, -4.0046360732397057e-01f }, { -2.4240127974640414e-02f, 8.2153662635646707e-01f, 5.6964022659096647e-01f }, { -2.3236753457640882e-01f, 3.1820811570256385e-01f, -9.1910223804313806e-01f }, { -4.2622260826492769e-01f, 7.7236043367865981e-01f, -4.7094973053560024e-01f }, { 1.2092218250416881e-01f, -6.9811853372336960e-02f, 9.9020408548296135e-01f }, { 3.3469987030706007e-02f, -9.8949773785449902e-01f, -1.4062000835227353e-01f }, { -1.4818810715090591e-01f, 6.9511531295098294e-01f, -7.0345929988883416e-01f }, { -4.7975372448739506e-01f, -3.7816395322924196e-01f, 7.9172494486311618e-01f }, { -7.5859125000219841e-03f, -3.6534858603812437e-01f, -9.3083987055319306e-01f }, { 3.5152705089584091e-01f, -5.4029519225594980e-01f, -7.6453243077947930e-01f }, { 7.1407450237116465e-01f, -5.1491046487457492e-01f, -4.7430456272950039e-01f }, { -7.0562794091074599e-01f, -4.2893570729902158e-01f, 5.6400653188588945e-01f }, { 5.8673275498644994e-01f, 2.7200838642721947e-01f, 7.6272938316238414e-01f }, { 1.6520840518525581e-01f, 7.9789783119206770e-01f, -5.7971133664535046e-01f }, { 6.3636617845035559e-01f, -6.9231012450141205e-01f, 3.4021284284595987e-01f }, { -6.5594758767157380e-01f, 3.7679367034473882e-01f, 6.5403309718697211e-01f }, { -2.1224022782850599e-01f, -3.5010355076919714e-01f, 9.1234948864462240e-01f }, { 1.1688570423739730e-01f, -6.0074671640806043e-01f, 7.9084835137329645e-01f }, { 9.0525973394147644e-03f, 9.6610040853784285e-01f, -2.5800785085811562e-01f }, { -3.6226524711883273e-01f, -2.0623190427521640e-01f, 9.0897320773989210e-01f }, { 1.2807778989463187e-01f, 9.8288657277575486e-01f, -1.3240115102534916e-01f }, { 7.4453680643526399e-01f, 2.6687868144887675e-02f, -6.6704775058241483e-01f }, { 7.0443580276167206e-02f, -9.1690260100022458e-01f, -3.9284516323470026e-01f }, { 9.2441572794171611e-01f, 1.3352863032541631e-01f, 3.5724734683046366e-01f }, { -3.6550526440192865e-01f, 2.9664761448769578e-01f, 8.8227325388069855e-01f }, { -1.0146305655107048e-02f, 4.3591095457471363e-01f, 8.9993260423395882e-01f }, { 3.1167125311979471e-01f, 9.2955625010915144e-01f, 1.9694214343748140e-01f }, { -1.7203941240084242e-01f, -3.7489762722850345e-01f, 9.1096334156716263e-01f }, { 8.4760172473192108e-01f, -5.1370457756465893e-01f, -1.3296211197400520e-01f }, { 3.9649856890464896e-01f, -3.2881118188656570e-02f, -9.1744630192901699e-01f }, { -1.6219643595761352e-02f, -9.0806777075054890e-01f, -4.1850907622864658e-01f }, { 9.1520748334318947e-02f, -2.8695016644409804e-01f, -9.5356360805246265e-01f }, { 5.7805868987515463e-01f, -3.9212110388631138e-01f, 7.1560407415469662e-01f }, { 9.7849035550322638e-01f, -1.8750979660535294e-01f, -8.6004071788426464e-02f }, { 4.2989371624412703e-01f, 4.1669526675942847e-01f, -8.0097218890177624e-01f }, { -7.0037777877417595e-01f, -7.2039623951668713e-02f, -7.1012763611920748e-01f }, { 3.4687052076110242e-01f, -7.7534387686826822e-01f, -5.2775251248080779e-01f }, { -5.0219541476612395e-01f, -6.3399525554268843e-01f, -5.8808994323763253e-01f }, { 6.5016394687073176e-01f, -2.2447763548838331e-01f, 7.2587645874144224e-01f }, { 7.9624397120721058e-01f, -2.9170413865544204e-01f, 5.3000399414292854e-01f }, { 9.3066986928608253e-01f, -2.3987106487751658e-01f, -2.7625254141374367e-01f }, { 8.8111310552058997e-01f, 3.8260120395248914e-01f, -2.7794966093515477e-01f }, { -9.0277586504489749e-01f, 3.6475348110918759e-01f, 2.2792682051738994e-01f }, { -4.7349353746877115e-01f, 8.7706196119238700e-01f, 8.1032007285227858e-02f }, { 6.6254425781621751e-01f, 6.6630394194257103e-01f, -3.4216101967721074e-01f }, { 4.3691972671699425e-01f, 5.0985613538997998e-01f, 7.4104512252004018e-01f }, { 3.4477949909791628e-01f, -8.0515733138187906e-01f, -4.8254405884209256e-01f }, { -4.2865491626372343e-01f, -1.0149305080122052e-01f, 8.9774947697116547e-01f }, { 9.2283776595768496e-01f, -3.3449243378712862e-01f, -1.9101117627351705e-01f }, { 9.3505850497149690e-01f, -6.0947475864872890e-02f, 3.4921482996311853e-01f }, { -7.4844481000681107e-01f, 4.9532355562639779e-01f, -4.4100446892916090e-01f }, { -2.5395683069645186e-01f, 2.6049300580928375e-01f, -9.3147695734626634e-01f }, { 7.7427222829399497e-02f, 4.8734332070289033e-01f, 8.6977095429268403e-01f }, { -9.4105376707169186e-01f, 3.3444693150683968e-01f, 5.0626647981446789e-02f }, { -6.6212665594538533e-02f, 9.2196372828461171e-01f, 3.8157406442577357e-01f }, { -9.4900192082796531e-01f, 2.3204204597862976e-01f, 2.1342877772897384e-01f }, { -8.2743745641450006e-01f, 2.6762113719784381e-01f, 4.9368632009327046e-01f }, { -3.8288881460777267e-02f, 2.3271089570206310e-01f, 9.7179195334085067e-01f }, { 5.4389631474512712e-01f, 7.1368527892696987e-01f, 4.4139565182453122e-01f }, { -6.1952219458303781e-01f, 3.1441956813546956e-01f, 7.1925835802757365e-01f }, { -1.8064938760866359e-01f, -7.7079153008707602e-02f, 9.8052261724453615e-01f }, { -4.0230769259774779e-01f, 7.4112341918414115e-01f, 5.3747985823980793e-01f }, { -2.3059018223234090e-01f, -6.4650215180402826e-01f, -7.2722976807252404e-01f }, { -8.9484611668209169e-01f, 3.1070772597374385e-01f, -3.2048578202348599e-01f }, { -3.3325883557113506e-01f, 1.5525925911276089e-01f, -9.2996403746248579e-01f }, { 3.1469900019393604e-01f, -8.6260366940783462e-01f, 3.9608010402073512e-01f }, { 1.8769196252439377e-01f, -3.7316500313547868e-01f, 9.0858109579642898e-01f }, { 2.7688291014964297e-02f, -8.8505654019946978e-01f, 4.6465931518782116e-01f }, { 2.1481969692920416e-01f, -8.5710557142524257e-01f, 4.6821206439289154e-01f }, { -8.0586514979915402e-01f, 8.9259135753691696e-02f, -5.8533252687997028e-01f }, { -8.9606117497095084e-01f, -3.2486759748322608e-01f, -3.0254820246558317e-01f }, { -6.2555187214279118e-01f, -7.6068354770751834e-01f, 1.7333607675770424e-01f }, { 8.1494910123015540e-01f, 5.6975921901682547e-01f, -1.0598299273703829e-01f }, { 1.5331035545550853e-02f, 7.3093558918389190e-01f, 6.8227422918757374e-01f }, { -5.5139334998787193e-01f, -5.2760716514580175e-01f, 6.4621672283837006e-01f }, { -3.7405855353050388e-01f, 8.5697635349793355e-01f, -3.5450208472737094e-01f }, { 1.1974190807217158e-01f, -9.8117251238533132e-01f, -1.5153341674591952e-01f }, { -1.1363644816088583e-01f, 9.1324177399420559e-01f, 3.9124956214837420e-01f }, { 9.5925892617451869e-01f, 2.2573347498053772e-01f, 1.6990206245870071e-01f }, { -2.0304525111588628e-01f, 6.0944410051927311e-01f, -7.6638796594253811e-01f }, { -2.2227015691202631e-01f, -1.0221031212396539e-01f, -9.6961282450358754e-01f }, { 6.4574002238984463e-01f, -1.1997865801059952e-01f, -7.5407224130446449e-01f }, { -2.6455026852263530e-01f, -8.1309485052980524e-01f, -5.1854596658976648e-01f }, { -1.4515657731235226e-01f, -9.8420608394085829e-01f, -1.0133090543740042e-01f }, { -9.5651707919695106e-01f, -2.8641539162662899e-01f, 5.5147988575272977e-02f }, { -1.5491368190098073e-01f, -1.1982591665091291e-01f, 9.8063423398260485e-01f }, { 6.2084201183763366e-01f, -6.6643603280062769e-01f, 4.1281740578900011e-01f }, { -2.0381697403027782e-01f, 1.8532273582693104e-01f, 9.6130854811697297e-01f }, { -3.8176002435599427e-01f, 1.5463874381986240e-01f, -9.1123330860626772e-01f }, { 2.6233320859874315e-01f, 9.2520188378455404e-01f, 2.7419475178748592e-01f }, { -3.5262635205950939e-03f, -3.9644479784124759e-01f, 9.1805178924186825e-01f }, { -8.4979141897743271e-01f, -2.6251084495807536e-01f, -4.5710239609054643e-01f }, { -2.5796689389967903e-01f, 3.1008414784742894e-01f, 9.1504147605749853e-01f }, { -1.8157288835537835e-01f, -5.2228302736268573e-01f, 8.3321769396908107e-01f }, { 6.1409957144923566e-01f, 4.8543482314782577e-01f, -6.2228188855317357e-01f }, { 8.6987947729011605e-01f, 4.6753217646516229e-02f, 4.9104361479319952e-01f }, { -5.8725971499857543e-01f, -4.1057932407828979e-01f, -6.9753182420532367e-01f }, { -3.0300519910319551e-01f, -5.3191106376859754e-01f, -7.9073286864591119e-01f }, { -8.5410565491455614e-01f, -4.2514512752304906e-01f, -2.9959164004756117e-01f }, { 8.1373730975161807e-01f, -5.1343690645017859e-01f, -2.7242271163225362e-01f }, { -6.4066273243254579e-01f, -7.4527242154728923e-01f, -1.8471675872292684e-01f }, { -9.1868526577383358e-01f, -1.1260068593830641e-01f, -3.7860067086084714e-01f }, { -6.0325845469748077e-02f, 9.3132486958603533e-01f, -3.5915843253209928e-01f }, { 8.5001917081762712e-01f, 2.8664100924152441e-01f, 4.4193250736228284e-01f }, { -5.4552789672234515e-02f, -4.5401319205323681e-01f, 8.8932334647225342e-01f }, { 2.6105764641884621e-01f, 5.1028493487062687e-01f, -8.1942552467587493e-01f }, { -1.5970544910093321e-01f, 8.8345902254866382e-01f, -4.4044786865737995e-01f }, { -7.3938839397153525e-02f, 9.7962909892183525e-01f, 1.8670799815271705e-01f }, { -7.2900032265542569e-01f, -2.1627966210884489e-01f, 6.4944717824190223e-01f }, { -7.8693657616584600e-01f, -2.4195854442481449e-01f, 5.6761508777709613e-01f }, { 2.7039706711026368e-01f, -9.5546308565848792e-01f, 1.1821894113097269e-01f }, { 2.3036150362107360e-01f, -2.7297317154139272e-01f, -9.3403384589000382e-01f }, { 2.6743537713451604e-01f, -9.0137982306076725e-01f, 3.4057705976160407e-01f }, { 6.4003060710764581e-01f, -1.8639232700705041e-01f, 7.4539836490182565e-01f }, { 1.8293975676152952e-01f, 4.9636095629777605e-01f, -8.4862173343556890e-01f }, { 8.7159063603632470e-01f, -4.0886695803132511e-01f, -2.7047656793889868e-01f }, { 8.4092138134330130e-01f, 2.5341698085436598e-01f, -4.7815380811443053e-01f }, { 8.8409166730089736e-02f, 9.8944668616505549e-01f, -1.1480015015269540e-01f }, { 9.0908172505815499e-01f, 3.3009211520237676e-02f, -4.1530808939882391e-01f }, { -1.6737144546296470e-01f, -2.8003994596068027e-01f, 9.4528536850518163e-01f }, { 5.5411157175413028e-01f, -4.0406074402197040e-01f, -7.2780167709931731e-01f }, { -7.2704888089438469e-01f, -3.5372043696077354e-01f, -5.8845711591117866e-01f }, { 3.6510167226981266e-01f, 4.9406679670678721e-01f, 7.8904928191950130e-01f }, { -9.6957010974801772e-01f, 4.2618188973906915e-02f, 2.4107569817756655e-01f }, { -9.0601523589430533e-01f, -3.7063323542060739e-01f, -2.0437073452194413e-01f }, { 4.0868703341185697e-01f, 8.7483266031707119e-01f, -2.6008215079772701e-01f }, { -4.8456585363876714e-01f, 8.2759707714468222e-01f, 2.8333551028579462e-01f }, { -1.8679111169461607e-01f, -8.7804604718913604e-01f, 4.4061799737121837e-01f }, { -8.1515125600908767e-01f, -2.5150853129088668e-01f, 5.2179678852471667e-01f }, { 2.2840096470933094e-01f, 2.6618802563623767e-01f, 9.3647046634035858e-01f }, { -2.7697730771570761e-01f, 3.0121010163660200e-01f, -9.1244509187272527e-01f }, { -8.0230547914982386e-01f, 5.7485475672986364e-01f, -1.6077290440624845e-01f }, { -1.8030748248674347e-01f, -7.6887699374601506e-02f, -9.8060057793383626e-01f }, { 9.0094554823487127e-01f, 1.0044263099691615e-01f, 4.2214736407347686e-01f }, { -7.3701201959406226e-01f, -3.4643620675400305e-01f, 5.8034062206929760e-01f }, { 8.9558942058476809e-01f, -4.1339744536391437e-01f, 1.6438412910992595e-01f }, { 2.1752450811770546e-01f, 2.2673622891586090e-01f, -9.4935439687461531e-01f }, { 1.0455910706677791e-03f, -1.6655368953575259e-01f, -9.8603183277282747e-01f }, { 2.6098823972430951e-01f, -4.5889343957429399e-02f, 9.6425064523533666e-01f }, { -5.7427398659508011e-01f, -5.0073664953295971e-01f, -6.4766673230504868e-01f }, { -1.0975355395528662e-01f, -7.1760712442951224e-01f, 6.8774571780723615e-01f }, { -3.1180837554447122e-01f, 9.0829051837363317e-01f, -2.7889759979762235e-01f }, { -9.6655606543677086e-01f, 2.4800089080355084e-01f, -6.5306435579000552e-02f }, { 6.0291229895716014e-01f, 1.8134286320738258e-01f, -7.7692440155393538e-01f }, { -6.3334440558880267e-01f, 5.2705960564965659e-01f, 5.6664189396989939e-01f }, { -7.1074163215378872e-01f, 6.9634425850448223e-01f, -9.9754729066904552e-02f }, { -2.2406776498948575e-01f, 8.8488147684577356e-01f, -4.0838512292670420e-01f }, { 4.0788448892884926e-01f, -8.6654837754451397e-01f, -2.8761806804549317e-01f }, { -9.5475397654808958e-01f, 2.9201887313942304e-01f, -5.6301172243492272e-02f }, { 3.6686397161774281e-01f, -9.2236265640226833e-01f, -1.2107004750724752e-01f }, { 2.6853538744154637e-01f, -8.7132097917239892e-01f, 4.1071705217299004e-01f }, { -2.4188938240346344e-01f, 9.0688699384862925e-01f, 3.4502971910933611e-01f }, { 1.5821505048287929e-01f, 5.4244765354687703e-02f, -9.8591353740189347e-01f }, { 5.1513495544391397e-01f, 2.3425500117145190e-01f, -8.2447593785747308e-01f }, { -6.3509853948711259e-01f, -7.6970668517189722e-01f, -6.4818700565703366e-02f }, { -7.3949593337157693e-01f, 3.4476607786256264e-01f, 5.7817135529371022e-01f }, { 6.3158211478500581e-01f, -4.5881630027130199e-01f, 6.2497330734124490e-01f }, { -8.3553757154326425e-01f, 4.7204544678993998e-01f, 2.8115842990113343e-01f }, { 5.7431023601509856e-01f, 7.8435907318542086e-01f, -2.3441117106483939e-01f }, { -6.0733616432627102e-01f, -1.9322266061757687e-01f, 7.7058924656740269e-01f }, { 8.0510324255009336e-01f, -3.3434058581909870e-01f, -4.8992360783030992e-01f }, { -2.3362456258298919e-01f, -4.8270440621366123e-01f, -8.4404740387008104e-01f }, { -7.1327868529963734e-01f, 5.4950068199066060e-01f, 4.3506610714812033e-01f }, { -9.8872778155827679e-02f, 8.4510287753647229e-01f, 5.2538109988780801e-01f }, { 2.9019912094833816e-01f, -4.5964045621979832e-01f, 8.3935399040385072e-01f }, { 7.6830219694161794e-01f, -2.9391678407604316e-01f, 5.6861644208823225e-01f }, { -2.8723045181491003e-01f, 2.7241602061446824e-01f, 9.1830723576740936e-01f }, { 8.9284972350849778e-01f, 4.4234443177438920e-01f, 8.4562254635219769e-02f }, { 1.4290728266100897e-01f, 3.0459678067042956e-01f, 9.4169969192288505e-01f }, { -2.3511616110838818e-01f, -1.6172689283571873e-01f, 9.5841786446171717e-01f }, { 4.1913476014043310e-01f, 9.0644445496966453e-01f, 5.1812188689241145e-02f }, { -2.4364704792743161e-01f, 6.5948272035916655e-01f, 7.1113898612291060e-01f }, { -6.3821988018327791e-01f, 1.7318589970993692e-01f, 7.5012134263764418e-01f }, { -2.7490692832184199e-01f, 3.8068632530697710e-01f, 8.8289529531248501e-01f }, { -4.6208882976765886e-01f, 8.7987064713172591e-01f, -1.1091238758566774e-01f }, { -8.2187241427638880e-01f, 1.8603839197558356e-01f, 5.3843797355186507e-01f }, { 2.7951867272418995e-02f, 4.7852622804190631e-01f, 8.7762824828737740e-01f }, { 7.6204566177125199e-01f, 1.5318793258478069e-01f, 6.2914216730880101e-01f }, { -2.5969386391288019e-01f, -3.6390636582593744e-01f, 8.9450056118336640e-01f }, { 5.3036426042566220e-01f, 8.3686624789334185e-01f, -1.3553093521429002e-01f }, { 2.4090947644798322e-01f, -6.6146234538619531e-01f, 7.1023248995927535e-01f }, { -1.9230632058208630e-01f, 8.3543358094579481e-02f, 9.7777235918308747e-01f }, { -5.0082948812490424e-01f, 8.1970840971937042e-01f, -2.7793514865861652e-01f }, { -3.4520936726880412e-02f, -7.6407684951071886e-01f, -6.4420095697637159e-01f }, { 2.5999307694228237e-02f, -7.0985600945872562e-01f, 7.0386680688519077e-01f }, { 4.8438024360074228e-01f, 8.5873985788568563e-01f, 1.6715751878918927e-01f }, { 2.4391244708439777e-01f, 2.1648306905704448e-01f, 9.4532629232923793e-01f }, { 4.5420696691812573e-01f, 8.8909532946571779e-01f, -5.6617367700057673e-02f }, { -5.8197773768951666e-01f, -5.9765253800893570e-01f, -5.5146473744498825e-01f }, { 5.4450045500993693e-01f, -7.5777331535798165e-01f, 3.5958150261845317e-01f }, { -5.8472316150909331e-01f, -2.8049409321963117e-02f, 8.1074783689597330e-01f }, { 5.0969801904296552e-01f, 8.3604742021072898e-01f, 2.0305821958901732e-01f }, { -1.8835429646475699e-01f, -9.0382124537843855e-01f, -3.8422625548735567e-01f }, { 8.2952781730338798e-01f, -5.5715967683557310e-01f, -3.8166671696085452e-02f }, { 2.0211303085010021e-01f, 9.5947629114951360e-01f, -1.9635572179735428e-01f }, { 3.8267977754184557e-01f, -4.3026253714439833e-01f, -8.1757589066128211e-01f }, { 2.5456278206331079e-01f, 9.4741976017149843e-01f, 1.9389065997300559e-01f }, { 3.1078194011736382e-01f, -5.5459904677901117e-01f, 7.7190315649613672e-01f }, { 6.5707108368002598e-01f, -7.4131189071388892e-01f, 1.3680011578122125e-01f }, { -9.3534607724608454e-01f, -8.3711007084880801e-02f, -3.4368616945288422e-01f }, { -6.4822438131245064e-01f, 1.1542552980394372e-01f, 7.5265005051588851e-01f }, { 5.6290999336886482e-01f, -5.6063215379768083e-01f, 6.0730875795894645e-01f }, { 7.8181719127555038e-01f, 3.2762422564115851e-01f, 5.3049434134497675e-01f }, { -9.7214640206774183e-01f, -6.0134697625203036e-02f, 2.2652856572244878e-01f }, { -7.4213323650351970e-01f, -6.6189735355778323e-01f, 1.0549953852986205e-01f }, { -9.0308267866462566e-02f, -9.0535773583581791e-01f, -4.1493588289903383e-01f }, { 1.2814380963693273e-01f, 9.8248396716809538e-01f, 1.3529382214046035e-01f }, { 1.5916465154866177e-01f, -2.6488010842359695e-02f, 9.8689665060684451e-01f }, { 6.3447655901875466e-01f, 7.7291959357003959e-01f, -5.8989771355311329e-03f }, { 1.0579118422053352e-01f, -9.1948246158337343e-01f, 3.7862940744453211e-01f }, { 9.7556037915607663e-01f, -2.1470781650895629e-01f, -4.6717236121248916e-02f }, { -6.8409301363746622e-01f, 5.5488724661671174e-01f, 4.7340985650336204e-01f }, { 8.1134159453084753e-01f, -1.4301472363792169e-02f, -5.8439736898138883e-01f }, { -4.5897533410583824e-01f, 7.4179694953214659e-01f, -4.8895698005779220e-01f }, { 3.7656245857503196e-01f, 4.5271984509092106e-01f, -8.0823601543904233e-01f }, { -6.9093981833802409e-01f, 5.9596509165434652e-01f, 4.0917939459904945e-01f }, { -6.3249418664849710e-01f, -2.2605661623180592e-01f, 7.4084378253021876e-01f }, { -5.1437044139829746e-01f, -5.9448625099410513e-01f, 6.1806888482975308e-01f }, { -8.4090847618272579e-01f, -2.1197196657381953e-01f, 4.9793656229571426e-01f }, { -2.1294213459913508e-01f, 5.6556064651776006e-01f, -7.9674136482473223e-01f }, { 5.4885529254851984e-01f, 8.3439014745637352e-01f, 5.0506926942846628e-02f }, { 4.0273704070404531e-01f, 6.0368702339344205e-01f, 6.8801515523374490e-01f }, { 4.5088652957833070e-01f, 5.9076948472667190e-01f, 6.6909846312825416e-01f }, { -1.8508155806245866e-01f, -9.3716160552137051e-01f, -2.9575824925398075e-01f }, { -8.6939486305168889e-01f, 1.9151972367377040e-01f, -4.5549178647178451e-01f }, { 4.8702247996687803e-01f, 4.5197597007657830e-01f, -7.4734652369583410e-01f }, { -2.1653269370131500e-01f, -8.9135812878045917e-01f, 3.9823897199476960e-01f }, { 4.7876132405714239e-01f, 8.7035248014099920e-01f, 1.1521351873570791e-01f }, { 4.8088048675725796e-02f, -1.8973349005859050e-01f, -9.8065730116322891e-01f }, { -9.8881640325993825e-01f, -3.5048550979327700e-02f, -1.4496109725829401e-01f }, { -9.6800839785720250e-01f, -2.2240611178558481e-01f, -1.1616911430474956e-01f }, { 2.0576373728011682e-01f, 8.0277826917670181e-01f, 5.5965018981340287e-01f }, { 2.1859396773871065e-01f, -6.9349204005090037e-01f, 6.8650234351696715e-01f }, { -9.7364649303174622e-01f, -1.2571505298204225e-01f, 1.9028460804990030e-01f }, { -6.4117028324548409e-01f, -2.4927350380930471e-01f, -7.2578467067136265e-01f }, { -8.5836194339216776e-01f, 4.8812175348930220e-01f, 1.5796179255297799e-01f }, { -1.2573867111164552e-01f, -8.9156270167613016e-01f, 4.3509278960589215e-01f }, { 9.0374153238297628e-01f, 4.1621986250619869e-01f, -1.0006132470335857e-01f }, { -6.3438787459725354e-01f, -4.8119573750151368e-01f, -6.0498155903659889e-01f }, { 5.3844238671404676e-01f, -7.1111145991397207e-01f, -4.5210650047162604e-01f }, { -1.0780314993315618e-01f, 5.1589572344548522e-02f, 9.9283281416852653e-01f }, { -5.0550324425872739e-01f, -8.6150564844767274e-01f, -4.7691589789567453e-02f }, { -2.6009795542782743e-01f, 6.9724550297851229e-01f, 6.6798036060838295e-01f }, { -7.6545138137349211e-01f, -5.8706414447573618e-01f, 2.6351446454489824e-01f }, { -1.4564580130884855e-01f, 7.2734846311235546e-01f, 6.7063515697374376e-01f }, { 8.6086703408985665e-02f, -4.0739404096814796e-01f, 9.0918599575654280e-01f }, { 3.5551271424102326e-01f, -8.9570894477507768e-01f, 2.6705092447489753e-01f }, { 9.4537151874736569e-01f, -2.7611836402718259e-01f, 1.7329552962569852e-01f }, { -8.9359379451781928e-01f, 3.5244355704872921e-01f, 2.7798141933245191e-01f }, { -4.7735513435697380e-01f, 1.6696766303081806e-01f, -8.6270149832086340e-01f }, { -3.3750383565999664e-01f, -2.4681794935186940e-01f, 9.0838981764027282e-01f }, { 2.7999735252569591e-01f, -5.1559270028205872e-01f, 8.0979358480692865e-01f }, { 9.0269768707251363e-01f, 1.8437434018356305e-01f, 3.8877112603151204e-01f }, { 3.6672866662707310e-01f, 8.3063400541204546e-01f, -4.1899550609412395e-01f }, { 8.9750687011243824e-01f, -3.3670740488308626e-01f, -2.8479736936613786e-01f }, { 5.1372764689178141e-01f, -2.0130911115148850e-01f, -8.3400152672907668e-01f }, { -9.5826950670729749e-01f, 2.8569600771646780e-01f, -9.8662905807896262e-03f }, { 4.1034311719158989e-01f, -8.8657714406634813e-01f, 2.1354037977077536e-01f }, { 7.5900714652014911e-01f, -4.5762367751455180e-01f, 4.6312927062473436e-01f }, { 4.9538490258584523e-03f, 9.7689968129406647e-03f, -9.9994001124122334e-01f }, { -4.8720914612071692e-01f, 5.1899032374794296e-01f, -7.0233630960696258e-01f }, { -8.2657689275218016e-01f, 5.4903211912076288e-01f, -1.2383203358548008e-01f }, { -8.9743651206321673e-01f, 3.4607933288371928e-01f, -2.7356315937378639e-01f }, { -1.2550258598138539e-01f, -3.9026658733804803e-01f, 9.1210804827032343e-01f }, { -5.0295061923117668e-01f, 1.2185950405404708e-01f, 8.5568156219862401e-01f }, { 3.7804630141209483e-01f, -1.6472416365675016e-01f, 9.1101423912923540e-01f }, { -4.8855901468625501e-01f, 6.1999613678382304e-01f, -6.1393393744109859e-01f }, { -4.3611574133585451e-01f, 5.8633158970516375e-01f, -6.8265535013862855e-01f }, { 7.8881376988370733e-01f, -5.8695813850239742e-01f, 1.8235399663197371e-01f }, { -9.4024286867887774e-01f, -2.5329128334753809e-01f, 2.2756729483533364e-01f }, { -4.9670349527664659e-03f, -9.2105868713828698e-01f, 3.8939212037594334e-01f }, { 6.8235630867167929e-01f, 6.2955590035885078e-01f, -3.7154977639519149e-01f }, { -9.4073292521437724e-01f, 2.9586446627627283e-01f, -1.6578836211464676e-01f }, { 8.6307928791669319e-01f, 3.5779741594679859e-01f, -3.5647601870393386e-01f }, { -3.1991266378819616e-01f, -5.6119934304725094e-01f, -7.6335521542154572e-01f }, { -1.5799335384359767e-01f, -5.5196439948684206e-01f, -8.1876333689313507e-01f }, { 8.7769659661322663e-01f, -4.6804219211849973e-01f, 1.0288435590734071e-01f }, { -4.5319446568689370e-01f, -7.9752756666592439e-01f, -3.9820165328474000e-01f }, { -7.4389989033265616e-02f, -1.8683239306577154e-01f, 9.7957122580900036e-01f }, { 5.2619541157395477e-01f, -7.1865709599119110e-01f, 4.5458812921151415e-01f }, { -9.6361312505241359e-01f, 2.3509670652752471e-01f, 1.2719781368652691e-01f }, { -8.6253973144390172e-01f, 2.2782871172333632e-01f, 4.5179562834888826e-01f }, { 6.5318982920521976e-02f, -2.8240273379335018e-01f, 9.5706955150410611e-01f }, { 4.5371097157267104e-01f, -8.8372206880780635e-01f, -1.1481140786800668e-01f }, { 1.8913097364474737e-01f, 5.0246028489795980e-01f, 8.4366055787173722e-01f }, { 6.1761029773328657e-01f, 7.9612606737378175e-02f, 7.8244447277891904e-01f }, { 6.8889160711884934e-01f, 2.2157532787761614e-01f, 6.9016862266922552e-01f }, { 2.4768135901002705e-01f, 3.2094361871517346e-01f, -9.1413846763220474e-01f }, { 4.5381084418840767e-01f, 8.4918826533360026e-01f, -2.7006482132391063e-01f }, { -6.5568640054672445e-01f, -6.3407626076204604e-01f, -4.0990564728496026e-01f }, { 9.4650674252047828e-01f, 1.8220069473525924e-01f, 2.6632291152144966e-01f }, { -7.3571765200469219e-01f, 1.4311469123111994e-01f, -6.6199525805138804e-01f }, { -3.4825462706706550e-01f, -9.0130090791117035e-01f, -2.5763421380880119e-01f }, { 5.3787446545804363e-01f, 4.3721668814963954e-01f, 7.2078611738273979e-01f }, { 8.3762443268130593e-02f, 8.3312976346515732e-01f, -5.4669795163896884e-01f }, { -1.3328995850465475e-01f, 2.9568250169265026e-01f, -9.4594167111646121e-01f }, { 2.0960122457088545e-02f, 3.1294248265465743e-02f, 9.9929041989407830e-01f }, { -4.8765478177545868e-01f, 8.4315120970097812e-01f, 2.2647042056592509e-01f }, { 3.0569011367796389e-01f, -7.9618330832135364e-01f, -5.2215485629266911e-01f }, { -2.8911343126404554e-01f, 9.4805456461861892e-01f, -1.3268747630628452e-01f }, { 1.5033951103088683e-01f, -8.6921027082382996e-01f, 4.7103241556962716e-01f }, { -9.3609455215175663e-01f, -3.1741283755765431e-01f, 1.5157862641348968e-01f }, { -9.4917157835127652e-01f, -3.0384949920423965e-01f, -8.2151060148237531e-02f }, { -1.2052143995530275e-01f, -9.7262334606367196e-01f, 1.9869174417425375e-01f }, { 1.2912930182719290e-01f, -7.6911140029451375e-01f, -6.2593392410591864e-01f }, { 6.0478983298869216e-01f, -5.1580215315897793e-01f, 6.0677623281574911e-01f }, { 5.2923790310019125e-01f, 5.7364916271536881e-01f, 6.2516708169742008e-01f }, { 3.2025327463540426e-01f, -9.4527376164599319e-01f, -6.2412784178679306e-02f }, { 3.0239549228294521e-01f, 8.0557131575921026e-01f, 5.0952116881728282e-01f }, { 9.7886730513132270e-01f, 1.2877730914925214e-01f, -1.5885592086296244e-01f }, { 6.3945079534974747e-01f, 6.2193511624135589e-01f, 4.5199490208676746e-01f }, { 4.7869835568958119e-01f, 5.4802681203926007e-01f, -6.8594059330686696e-01f }, { 6.8102389862035084e-01f, 7.3095547326886123e-01f, 4.3709788448735611e-02f }, { 8.6974340353855573e-01f, -3.7923700804220484e-01f, 3.1579376772248940e-01f }, { -6.2865011894511547e-02f, 7.1696150008641890e-01f, -6.9427242324129146e-01f }, { 4.2066308013742115e-01f, -2.0502733161460729e-01f, -8.8374564570372360e-01f }, { -5.8790256559855469e-01f, -7.3209419987321556e-01f, -3.4410558826417414e-01f }, { 7.2258924147473491e-01f, -6.8515450189577853e-01f, -9.1804665659838108e-02f }, { -5.8009068991508805e-01f, 6.0504858180257448e-01f, 5.4535401816850171e-01f }, { 2.1470275212000157e-02f, 6.6282692131592236e-01f, -7.4846476180323751e-01f }, { 1.9258681276694473e-01f, 5.6457350575440923e-01f, 8.0260019695265827e-01f }, { -7.9342588530565528e-01f, -2.0483148826073413e-01f, -5.7316614165862045e-01f }, { -5.2873790938136454e-02f, 9.6620021179481497e-01f, -2.5231233215894366e-01f }, { -3.3702552324669877e-01f, 9.2612516793073019e-01f, -1.6942836245908119e-01f }, { 3.2380418440338304e-01f, 4.4452230777618654e-03f, 9.4611367718400985e-01f }, { -6.3557382316677025e-01f, -3.7006420515667687e-01f, -6.7756800349996749e-01f }, { 6.0397130503539009e-01f, -1.6500978511087255e-01f, 7.7973741317927769e-01f }, { 5.9748821193499480e-01f, -7.9419228253234575e-01f, 1.1075402911309999e-01f }, { 9.2946256163101182e-01f, 4.2832281016941483e-02f, -3.6642153625190110e-01f }, { -3.9297506360374507e-01f, -4.3355453791508475e-01f, 8.1092605213969404e-01f }, { -6.4547192307164691e-01f, 7.5094806287625460e-01f, 1.3943817048638626e-01f }, { 7.4171619354173868e-01f, 6.6103474784798544e-01f, -1.1353479808192889e-01f }, { -7.6252941722949374e-01f, -2.1340534820947202e-01f, 6.1074302715237183e-01f }, { -8.3943726190868162e-01f, 4.8907156523783685e-01f, -2.3696853671968271e-01f }, { -3.2208026077087654e-01f, -8.7118667945049022e-02f, 9.4269541386242273e-01f }, { 7.2534782846115542e-01f, -6.8377614968861145e-01f, 7.9502860726541738e-02f }, { 5.3788692455180720e-01f, 6.5279293273964456e-01f, 5.3342201244546739e-01f }, { -8.5199016239549530e-01f, 3.9321225876385524e-01f, 3.4568321153785386e-01f }, { 7.4029641923302258e-01f, 3.4239033286019155e-01f, -5.7855861555649835e-01f }, { -5.4921912102491754e-01f, 5.2686748698531471e-01f, 6.4866710126103677e-01f }, { -7.0403884909833264e-02f, -6.6057534057763034e-01f, 7.4745134451036388e-01f }, { 3.3827435891332452e-01f, 2.6107097155249503e-01f, -9.0410862506361245e-01f }, { -4.8616883626788293e-01f, -8.3380346146470719e-01f, 2.6155620866537493e-01f }, { -2.5809936244819465e-01f, 8.4984409122283255e-01f, -4.5951032601833153e-01f }, { -7.3039730107537115e-01f, -4.8848177648543167e-01f, 4.7739431984833081e-01f }, { 6.0090269095918736e-01f, 7.9929450514460054e-01f, -6.6520706291770962e-03f }, { -7.6036624728872004e-01f, 2.8009229057419277e-01f, 5.8599614226116792e-01f }, { 9.9778513065253915e-01f, 4.5957053358948285e-02f, 4.8091395230935981e-02f }, { 1.7801962873677854e-01f, 9.6016801985344002e-01f, 2.1537498795158108e-01f }, { -3.9185015864089776e-02f, 7.9785404292628281e-01f, -6.0157581460520515e-01f }, { -9.6867249623222862e-01f, 3.2369128026334647e-02f, -2.4622313984278069e-01f }, { 2.1129151102436933e-01f, 9.0100772260167439e-01f, -3.7886802607396552e-01f }, { -3.7837910306803424e-01f, 6.0349540205208807e-01f, 7.0187075310445757e-01f }, { -4.6109653324404188e-03f, -2.9667011522939235e-01f, 9.5496889045061673e-01f }, { -8.1877385773623379e-01f, 5.1653889893516824e-01f, 2.5059316785293551e-01f }, { 6.0111730652662310e-01f, 2.2745159051536679e-01f, 7.6610949463259348e-01f }, { -1.5412469951327362e-01f, 1.8422707267018207e-01f, 9.7072445250715644e-01f }, { -9.4565805331398300e-01f, 1.2777924388783882e-01f, 2.9900386458014289e-01f }, { 3.8533899428930385e-01f, -6.8788441021861135e-01f, 6.1508446384078108e-01f }, { -2.9988382706600936e-01f, 9.3459985049862848e-01f, -1.9129247165580049e-01f }, { 4.1065427191168941e-01f, -9.0920789623822940e-01f, -6.8586225867394157e-02f }, { -4.6300937384114565e-01f, -2.0399177040856856e-01f, -8.6255995579484679e-01f }, { 7.2900676989267710e-01f, 2.1891991948707745e-01f, 6.4855469954539435e-01f }, { -5.5388058959289041e-02f, 9.4783518965660452e-01f, -3.1391179680501186e-01f }, { -6.1510889065886820e-01f, -3.3753080122978490e-01f, 7.1254053277943141e-01f }, { -1.7036260350882071e-01f, 3.3052218403984562e-02f, 9.8482695646711038e-01f }, { 3.4643962325102928e-01f, 9.3570020227264006e-01f, -6.6668725116244693e-02f }, { 4.8740395309707543e-02f, 9.5417595221858886e-01f, -2.9525010765925669e-01f }, { 5.6646457580443295e-02f, -4.6120251515928329e-01f, -8.8548484959051565e-01f }, { -4.0586215074398102e-01f, -3.8354608002686497e-01f, 8.2955911126904980e-01f }, { 5.5559329788470790e-01f, 7.2893673348210941e-01f, 3.9995915532217324e-01f }, { -1.8555284034771616e-01f, -9.7282418112386204e-01f, -1.3850363193643092e-01f }, { -2.8714093950593539e-01f, 1.6847134137355541e-01f, 9.4295677949492662e-01f }, { -8.7163575548641281e-01f, 1.8277493045113802e-01f, 4.5480153315068328e-01f }, { -2.1784379596762538e-01f, -9.2485000068995615e-01f, 3.1176362325037826e-01f }, { -8.4638300281162682e-01f, 5.3256845451143087e-01f, 2.5794981837009758e-03f }, { 6.5565631772604138e-01f, 7.5475783903429364e-02f, 7.5127771101643304e-01f }, { 4.1637646667747180e-01f, 2.5488026366756417e-01f, -8.7273517700957670e-01f }, { -8.3425755204539076e-01f, -5.4886988449338969e-01f, -5.2499397629355328e-02f }, { -9.0020326790595162e-01f, 2.7355118252063915e-01f, -3.3882713438124412e-01f }, { 7.0865758175410709e-01f, -3.7722164281414389e-01f, -5.9624513751897334e-01f }, { 6.0743546566799256e-01f, 4.4112527263054041e-01f, -6.6062897975742818e-01f }, { -4.5952160463600533e-01f, 4.0313047943955638e-01f, 7.9140742441525291e-01f }, { -5.4602098075972327e-01f, -1.2925232117655777e-01f, -8.2774085681489828e-01f }, { 2.8763747593556621e-01f, 2.1203748960366117e-01f, 9.3397258280957784e-01f }, { 7.5574406002177097e-01f, -5.3841489764370076e-01f, 3.7277381042279928e-01f }, { -1.3431978443296469e-01f, -1.8098366909654826e-01f, -9.7427055124859085e-01f }, { 1.5306522210835075e-01f, -6.1146347496909996e-02f, -9.8632254459112323e-01f }, { -4.6936944772215966e-01f, -5.1287851298394038e-01f, 7.1878227055512223e-01f }, { 9.9359018127530041e-01f, 9.6710664591403941e-02f, -5.8528617168053597e-02f }, { -2.7449110068162325e-01f, 6.2504010368405727e-01f, 7.3073901252992768e-01f }, { 6.1247735611572907e-01f, 5.6683515714116450e-01f, -5.5097131765114393e-01f }, { -5.1431585507754896e-01f, -5.6104053242922647e-01f, 6.4862371386450224e-01f }, { 8.1616993259721526e-01f, 3.3616300818506817e-01f, -4.6995858652888001e-01f }, { -2.9252103487073331e-02f, -1.0618461007935644e-01f, 9.9391606437559732e-01f }, { -4.8032063378413375e-01f, 8.0807007420227714e-02f, 8.7336264879658976e-01f }, { -3.5443872112449404e-01f, 9.2826340395365448e-01f, 1.1269536746471662e-01f }, { -5.6168831600760460e-01f, -7.0239342763062609e-02f, 8.2436197776750619e-01f }, { -1.9298297845227769e-01f, -9.4373607130152948e-01f, 2.6855129445236758e-01f }, { 3.6514269902857854e-01f, -7.6014226912664395e-01f, 5.3745189555263595e-01f }, { -3.9106184151832396e-01f, 9.0393293679050479e-01f, 1.7313544378200146e-01f }, { -2.8013151258095642e-01f, 7.2084194648924194e-01f, -6.3396626396102995e-01f }, { -3.1441970571640954e-01f, 5.0222598921222139e-01f, 8.0554907014843746e-01f }, { -4.8333840821593765e-01f, -8.7543032645844943e-01f, 2.3930441150381786e-03f }, { 1.0097169033359560e-01f, -2.8674957356532745e-02f, 9.9447597485900963e-01f }, { 7.0217561983735466e-02f, -9.6851264584569718e-01f, -2.3885717243999080e-01f }, { 5.4875821709904482e-01f, -5.9496872001389378e-01f, -5.8726198699669507e-01f }, { 5.6564276243401657e-01f, -7.0416659105153800e-01f, 4.2918256878963612e-01f }, { 4.3749401952792982e-01f, 8.2566996534378323e-01f, -3.5618547304247433e-01f }, { 3.8807699286255570e-01f, -5.5740464124994704e-01f, -7.3395934051129408e-01f }, { 5.7404216421821208e-01f, -1.3869233512444434e-01f, 8.0699444228408412e-01f }, { 1.1833401680777580e-01f, -8.9509186852589584e-01f, 4.2989255327925546e-01f }, { 3.2165025644870499e-01f, -3.3727812225637754e-01f, 8.8475114058908921e-01f }, { 9.0374876858893305e-01f, 3.8276384904543226e-01f, -1.9165072172551983e-01f }, { -4.7294994155003939e-01f, -5.8261079723213416e-01f, 6.6097126392631578e-01f }, { -3.6589788516284477e-01f, 6.8937834186720282e-01f, 6.2520095921054353e-01f }, { -5.7761406636467527e-01f, -7.7220000494384167e-01f, -2.6470576628097031e-01f }, { 3.8459094748047246e-01f, -3.9923801488151672e-01f, 8.3228529398850870e-01f }, { -6.4746986109502758e-01f, 6.1820289026189723e-01f, -4.4565453598658950e-01f }, { 9.2089694481473042e-02f, -7.4303807518400844e-01f, -6.6288302663226539e-01f }, { 4.7226599312926809e-01f, 8.7655268577901724e-01f, -9.2845144122983114e-02f }, { -8.5424328226578705e-01f, -3.2738196725711079e-02f, -5.1884161858791122e-01f }, { -6.9466068160350003e-02f, -6.9112397337349529e-02f, -9.9518739034848402e-01f }, { -2.0916222941275756e-01f, -9.5460281392497504e-01f, 2.1209580248935775e-01f }, { -3.7153469994004606e-01f, 8.6348545012077071e-01f, 3.4110825872469008e-01f }, { -4.1188443579743661e-02f, 9.3707854292727000e-01f, 3.4668042416724804e-01f }, { 7.7892544850404666e-01f, -5.0039321993397035e-01f, 3.7799705173041120e-01f }, { -5.2276488812959976e-01f, -4.6027478031813146e-01f, 7.1754024161850527e-01f }, { 3.0886952556253572e-01f, 2.2310711333011018e-01f, -9.2456629408619451e-01f }, { -6.2618271473023968e-01f, -6.8535675031661403e-01f, 3.7172749772987990e-01f }, { 3.5323600198413824e-01f, 9.2754842123259951e-01f, 1.2197644514894743e-01f }, { 1.9262392705713571e-01f, -8.9993120623439193e-01f, 3.9117751311981047e-01f }, { 3.8043359565157531e-01f, -4.9233079033715771e-01f, 7.8286695688705843e-01f }, { -5.0001153355145844e-01f, 7.3460258262020084e-01f, -4.5863657935586627e-01f }, { 3.6050747866666155e-01f, 3.9076375521787909e-01f, -8.4695811315166469e-01f }, { 9.8843803165964861e-02f, -9.2647010796819662e-01f, -3.6315704814458177e-01f }, { -3.4501709734048414e-01f, 7.2814423120755545e-01f, 5.9225769822088825e-01f }, { -1.9422328393073130e-03f, 9.9961588709698779e-01f, -2.7646084621521027e-02f }, { 3.7321497727910297e-01f, 9.2159807653465631e-01f, -1.0661878850456130e-01f }, { 7.0610662929897394e-01f, 3.0430153091089091e-01f, -6.3938564759097427e-01f }, { -8.4633807597975841e-01f, -3.0984919081880824e-01f, -4.3324974333034566e-01f }, { -7.6855576030106143e-01f, 5.0710000652304565e-01f, 3.9009181828434236e-01f }, { 7.8470297816715454e-02f, -7.7473708135078623e-01f, 6.2739530372853536e-01f }, { -9.1045222122836800e-01f, 9.7540638436826019e-02f, 4.0194847519758947e-01f }, { -7.5229152934225096e-01f, 6.4278648165283292e-01f, 1.4450949409734168e-01f }, { 1.2659832556170519e-01f, 1.2894167772607788e-02f, 9.9187025583108623e-01f }, { 2.7803425222390593e-01f, 9.5877101430604295e-01f, -5.8780070745577444e-02f }, { -9.7341041528446903e-01f, -2.2688444267748467e-01f, 3.1553337171283273e-02f }, { -7.6870260814796576e-01f, 4.5371580870793449e-01f, -4.5081954832839710e-01f }, { 7.5474105206973219e-01f, -5.6470884460157156e-01f, 3.3387103071310631e-01f }, { 9.2073743303773792e-01f, 3.2854126272391609e-01f, -2.1048329646518729e-01f }, { -8.4431877595420035e-01f, 3.3742465150336609e-01f, -4.1625762350860657e-01f }, { -9.4974294108604573e-01f, -1.8791842545419901e-01f, 2.5034977777510148e-01f }, { 5.8165271558194065e-01f, 6.0269388703853344e-01f, 5.4629680301328642e-01f }, { -2.5992560414995447e-01f, -1.1692008331330753e-01f, 9.5852406043108296e-01f }, { 5.1899805067083371e-01f, -6.6210205512600517e-01f, 5.4061251557635537e-01f }, { 3.6759224960650849e-01f, 9.0577653820311643e-01f, 2.1081935601363733e-01f }, { 5.6746607185643538e-01f, 8.1741017891896228e-01f, -9.9110325857082487e-02f }, { 6.9019513769969698e-01f, 2.7848878592147880e-01f, -6.6788821520646480e-01f }, { -4.1282316164097071e-01f, -6.6692072518185153e-01f, -6.2031748607923842e-01f }, { 9.1692465036159265e-01f, 6.4538242583248195e-02f, 3.9380706037796837e-01f }, { -6.5312005641113571e-02f, 3.9137945933207108e-01f, 9.1790874313957316e-01f }, { 9.4953820498193320e-01f, -1.7458377407989750e-01f, 2.6057187704682816e-01f }, { 6.7108350093809346e-02f, -6.0219696335621575e-01f, 7.9552202148792794e-01f }, { 7.8951146437778980e-02f, 7.9662671058205470e-01f, -5.9929341767065636e-01f }, { -3.3664210910179554e-01f, -8.7380398298179440e-01f, 3.5091122766968691e-01f }, { 5.9372243613109776e-01f, 6.9607938486617205e-01f, -4.0369191074244470e-01f }, { -1.8941188226688818e-01f, -2.3710388467224344e-01f, -9.5284043088517500e-01f }, { 4.8040965201741570e-01f, -6.2229761419606722e-01f, 6.1802285201632168e-01f }, { 7.9376573435071840e-01f, -5.8814445882734423e-01f, -1.5499049816474275e-01f }, { -3.4941202667482196e-01f, 4.8491960515429461e-01f, -8.0172577116617405e-01f }, { -4.7558478217424655e-01f, -1.8736202656711578e-02f, 8.7947033473237801e-01f }, { -3.6161168903353874e-01f, -9.0790354754942570e-01f, -2.1200975143016162e-01f }, { -2.5295960416680918e-01f, -9.4792897594102021e-01f, 1.9349960008015510e-01f }, { -8.4503029778459815e-01f, 2.0946559206725257e-01f, -4.9198370050845053e-01f }, { -6.5906595737013629e-01f, 6.8630411459912399e-01f, 3.0760157041227582e-01f }, { -8.8270498814680132e-02f, 9.5604608517738032e-01f, -2.7961438098927044e-01f }, { 8.8801819600577270e-01f, 4.5980719075474036e-01f, 1.0153289550412247e-03f }, { -9.2700004754631560e-01f, 3.3764096234077462e-01f, -1.6330796795846844e-01f }, { 4.7147697622739432e-01f, 8.2161331391268755e-01f, -3.2040758931224550e-01f }, { -7.1913713989931194e-01f, 5.0386365683246359e-01f, -4.7850098154638604e-01f }, { 7.3163617255941171e-01f, -3.9020602824383216e-01f, 5.5897027338203631e-01f }, { -8.6592914085559558e-01f, 1.3112057181330119e-02f, -4.9999479694649201e-01f }, { 3.3846233294683381e-01f, -1.7475546303674827e-01f, 9.2461006771232934e-01f }, { 4.0445413517810247e-01f, 2.5246544874660687e-01f, 8.7902107467711355e-01f }, { 8.9265172099916834e-01f, -8.3191649621463193e-02f, -4.4300344742505404e-01f }, { 6.5016025052104520e-01f, 4.8339287458008817e-01f, -5.8619363477234288e-01f }, { -3.5302669439320633e-01f, 8.0487930916394146e-01f, -4.7701305089649498e-01f }, { 1.6576607793645437e-01f, -8.3273419022175210e-01f, -5.2827585203309080e-01f }, { -6.9608046027328319e-01f, -4.7536878428950163e-01f, -5.3804880052728998e-01f }, { -9.6379094965111800e-01f, 2.2334182500109662e-01f, -1.4568951429590146e-01f }, { -2.0644944964025946e-01f, 7.1682959813620251e-01f, 6.6598344722607361e-01f }, { 6.2550472773135568e-01f, 7.5165640963415203e-01f, 2.0918049010751072e-01f }, { -1.9246436107837472e-01f, 7.3836457417559620e-01f, -6.4635533982259608e-01f }, { 4.1170297880162526e-01f, 6.6476707250378086e-01f, 6.2336618175886105e-01f }, { -6.1729178225599854e-02f, 1.7958417521837641e-01f, 9.8180396850222984e-01f }, { 5.5197570092179327e-01f, 4.6912578467101712e-01f, -6.8937930324945040e-01f }, { 3.5709042777913369e-01f, -5.9638003383261240e-01f, 7.1890004982217615e-01f }, { 8.5586361256141275e-01f, -1.3374063869368918e-01f, -4.9961076675261124e-01f }, { 2.1643653178020822e-01f, 9.6578154469493749e-01f, -1.4290288883579422e-01f }, { -2.4646206732229622e-01f, -8.9205662963268384e-01f, -3.7880261205487564e-01f }, { 9.6934271073756173e-01f, 2.3234799765144890e-01f, -7.9931953105864553e-02f }, { -6.9585521793298966e-01f, -6.3905765884327814e-01f, -3.2770539261534831e-01f }, { -2.5919383315786176e-01f, -5.2678786191212723e-01f, -8.0951411685960373e-01f }, { 9.1476715795660302e-01f, 2.0828777400682466e-01f, 3.4614628399461561e-01f }, { 4.4094718423630003e-01f, -4.3660717963179191e-02f, -8.9647048050731615e-01f }, { 4.9362524018713594e-01f, 6.4730523046945698e-01f, -5.8080122318834304e-01f }, { 6.3749785849961593e-01f, -7.6997154763463249e-01f, 2.7208385500294655e-02f }, { -1.3308354858243387e-01f, 8.5940956618766662e-01f, -4.9366381945797255e-01f }, { -9.7995084894637940e-01f, -1.4660853649926875e-01f, -1.3491579105061338e-01f }, { -9.7910896381237777e-01f, -8.1308659460655644e-02f, 1.8637204425278764e-01f }, { -4.0828509231076598e-01f, -2.2791603053101900e-01f, -8.8394432314698013e-01f }, { -3.4236762239744944e-01f, 5.2279124750689654e-01f, 7.8068798035072906e-01f }, { -6.1359797775835845e-01f, 3.6382517632354233e-01f, 7.0080579532706233e-01f }, { -4.8663590678720559e-01f, 3.0775484007762532e-01f, -8.1760164666797819e-01f }, { 7.7237674027234882e-01f, -6.3653838590993703e-02f, -6.3196705603923087e-01f }, { 1.7387253238407491e-01f, 9.7472786002958681e-02f, -9.7993234382337346e-01f }, { -7.8696459677618924e-01f, 5.9944728429439353e-01f, 1.4611528589769932e-01f }, { 2.7964871191921070e-01f, -8.4812490101165527e-01f, 4.4997861083155527e-01f }, { -7.2035895199094968e-01f, -3.8610436336198123e-01f, 5.7619996605287982e-01f }, { -2.8138903219058020e-01f, 7.5499392998366166e-01f, -5.9228741186241196e-01f }, { 2.8679183210211129e-01f, -1.8224360733677225e-01f, 9.4049865104868424e-01f }, { 8.3045446552958202e-01f, 5.5697687302236065e-01f, -1.1051859581507244e-02f }, { -2.6653882490073499e-01f, 4.3243904652164505e-01f, -8.6136724215864269e-01f }, { 5.2949994473503958e-01f, -5.5672194715154089e-01f, -6.4007068522577015e-01f }, { -4.8877227068267282e-01f, -7.8865784685787388e-01f, -3.7298856282895132e-01f }, { -2.4751167448596970e-01f, -5.5052339045709331e-01f, 7.9728411971691637e-01f }, { -3.8941012719887613e-01f, 5.9320120328167997e-02f, -9.1915225950829649e-01f }, { 6.2523031419201447e-01f, 7.2510469513249753e-01f, -2.8863512487596293e-01f }, { 9.2117407888634262e-01f, -2.8857482705746967e-01f, 2.6108022823770027e-01f }, { 5.4681120771543068e-01f, -5.3738454860138740e-01f, 6.4203999099843867e-01f }, { -3.3429759600528952e-01f, 2.4470498764413523e-01f, -9.1014536549233049e-01f }, { 4.2356058203746505e-01f, -6.8885981132388763e-01f, 5.8827595028770463e-01f }, { -2.0737811961923230e-01f, 3.9763856906231410e-01f, -8.9379968891092521e-01f }, { -6.6676530223500441e-01f, 6.3851833764585431e-01f, -3.8434146826154220e-01f }, { 2.6159891420289044e-01f, -8.7324352405851513e-01f, -4.1111039366298480e-01f }, { 4.6553533693882038e-01f, 3.2596439636049473e-01f, 8.2281471934245154e-01f }, { 9.5218503491102657e-01f, -2.8070208846086359e-01f, 1.2062336765816380e-01f }, { 9.9964797770480862e-01f, -1.6483931470962256e-02f, -2.0789436595229346e-02f }, { -2.9143225273852691e-01f, 8.4511035314117833e-01f, 4.4816931295810558e-01f }, { 6.3523518286831093e-01f, 1.9027965848643269e-01f, -7.4851179951457691e-01f }, { -6.5231431715155397e-01f, 2.2025963106206659e-01f, 7.2523908234698997e-01f }, { 2.6376172983873691e-01f, -9.6433346964522526e-01f, -2.2151956899525989e-02f }, { 1.9666811034037127e-01f, -6.7158097984023765e-02f, -9.7816739071097425e-01f }, { -6.7824118458742555e-01f, -1.1510135788517448e-01f, -7.2576895286477683e-01f }, { 3.1551944383970315e-01f, -8.3626957401239266e-01f, -4.4844250483224241e-01f }, { -3.4793469243462843e-01f, -1.7005154974353073e-01f, -9.2196741820426820e-01f }, { 1.4809788973422593e-02f, -9.3591588285337979e-01f, 3.5191210603407969e-01f }, { 2.8975211630128600e-01f, 1.7322269277579152e-02f, -9.5694495666469814e-01f }, { -9.8361491502324139e-01f, 1.7979849594701175e-01f, 1.3198477147535677e-02f }, { 4.2165926987692191e-02f, 9.9843672695236885e-01f, -3.6689737991833463e-02f }, { -3.8790813583768419e-01f, 8.0579200433188880e-01f, -4.4746678525420197e-01f }, { 9.7230625438234364e-01f, -1.9670119075921477e-01f, 1.2621089193442955e-01f }, { 2.9486556341975789e-01f, 8.4710911639140374e-01f, -4.4210908657900705e-01f }, { -5.2889277059059114e-01f, -1.1208985009133639e-01f, 8.4125400606684186e-01f }, { 6.3744931597731522e-02f, 1.4829150694139767e-01f, -9.8688713268775063e-01f }, { -9.2825505545341835e-01f, -3.5357963625206185e-01f, 1.1542960128593883e-01f }, { 9.7037513061405811e-01f, -3.1542823545778940e-02f, -2.3953529211477254e-01f }, { 6.5685862234650916e-01f, 7.0905037682287542e-01f, -2.5648452853219900e-01f }, { 2.6451756146945021e-01f, -9.0045198576570132e-02f, -9.6016786130736620e-01f }, { 6.5768055518670021e-01f, 6.5763486405236571e-01f, 3.6738627207904812e-01f }, { 4.0116154767064294e-01f, 9.0740092625710811e-01f, 1.2527159174464392e-01f }, { -4.9183421999315130e-01f, -6.8876903337480400e-01f, 5.3263150367553980e-01f }, { 6.3934589015411492e-01f, 5.3732027471082966e-01f, 5.5002159514670057e-01f }, { 7.5220555927657440e-01f, 4.4163944992086218e-01f, -4.8902085115771304e-01f }, { -4.0722412220567078e-01f, -6.3742339709759310e-01f, -6.5411002677407792e-01f }, { 9.5713171879787895e-01f, 1.2819007781407263e-01f, -2.5974252024079530e-01f }, { 9.0323030274346172e-01f, -9.2226543816498113e-02f, 4.1912919824514505e-01f }, { -6.4409602727374804e-01f, -1.1318677312074087e-01f, -7.5652433010491416e-01f }, { -7.2165392648908600e-01f, 6.7574150024644952e-01f, -1.5029649106869533e-01f }, { -3.8972557171058041e-02f, -2.8058797028665045e-01f, -9.5903677234919749e-01f }, { 4.8465761100884447e-01f, -1.6714634493013975e-01f, -8.5858552251228559e-01f }, { -6.6807491233535654e-01f, 5.9190988177699455e-01f, 4.5090864192522417e-01f }, { -2.9417742691049364e-01f, -7.1009014502425083e-01f, 6.3971214419906053e-01f }, { -3.9142476842296237e-01f, -2.9987067782999249e-01f, 8.6997944070122202e-01f }, { 1.4754274918304547e-01f, -5.2683196432705259e-01f, 8.3706583882440710e-01f }, { -8.1362328120318672e-01f, -5.1370203474311560e-01f, 2.7226343086235999e-01f }, { -4.3330428371979829e-01f, 4.8140326897049707e-01f, -7.6190438398436311e-01f }, { 2.7185043498878708e-01f, -3.4737485990751182e-01f, -8.9745643220194471e-01f }, { 1.1905843075445915e-01f, 8.0495065913268515e-01f, 5.8127405449421299e-01f }, { 2.6205454655901533e-01f, -8.3565727079263752e-01f, 4.8270523137744159e-01f }, { 9.7747279618706606e-01f, -1.6561059654886544e-02f, 2.1041070319103497e-01f }, { -2.2051508933515554e-01f, 8.4675014540075511e-01f, 4.8413560769613762e-01f }, { -1.8859890254513448e-01f, -7.9847238760318950e-01f, -5.7172747021114245e-01f }, { -3.6782883569889985e-01f, -6.5689254180578405e-01f, 6.5817485226064965e-01f }, { -2.6390888301586901e-01f, 1.2425495309988861e-01f, 9.5651074646104262e-01f }, { -9.8902319972213615e-01f, 8.8859245521563754e-02f, -1.1805568557560460e-01f }, { 8.1891498966924636e-01f, -2.6665999832807630e-01f, -5.0820338938921727e-01f }, { 9.6441493720968618e-01f, -2.5493088146200599e-01f, -7.0100460510909748e-02f }, { -1.5854076909153170e-01f, -9.4310636086955912e-01f, 2.9225881787080865e-01f }, { -5.3903048209931015e-01f, 4.6438068415223149e-01f, 7.0270670948418501e-01f }, { 4.0831975896033479e-01f, 5.8258167273191976e-02f, 9.1097802409747675e-01f }, { -5.6982687045319047e-01f, -3.1552385970549318e-01f, -7.5877666784507236e-01f }, { -8.5030803381945486e-01f, -3.2484982389341732e-01f, 4.1406381095008604e-01f }, { -3.7324426346935041e-01f, 4.4210378371812797e-01f, -8.1561814852867076e-01f }, { 4.7493575300774649e-01f, -4.2260358000760073e-01f, -7.7190818409945894e-01f }, { -4.4834653376186157e-01f, -4.7284625762865240e-01f, -7.5855243873466116e-01f }, { -7.1565049875728182e-01f, -6.9738882361516530e-01f, -3.8641846812873144e-02f }, { -2.6053640580194770e-01f, 9.6503951072475147e-01f, -2.8627329458665553e-02f }, { 8.8278447951787831e-01f, 4.6208923073035874e-01f, -8.4646946580334323e-02f }, { -2.4182476627700197e-01f, 7.3330798399415531e-01f, 6.3543700161817862e-01f }, { 1.2019663790343081e-01f, 9.9251701313927454e-01f, 2.1511551915302615e-02f }, { -5.5589477722779879e-01f, 7.3581170812298347e-01f, 3.8673262965515764e-01f }, { 5.8371294034821219e-01f, -8.1194802114137987e-01f, -4.4287960713732359e-03f }, { 5.1146301553798901e-01f, 7.8980589412608404e-01f, -3.3854428564145578e-01f }, { 4.8258407293017269e-01f, 7.0728763698029229e-01f, -5.1658185327105710e-01f }, { -2.8256215331457324e-01f, -7.0999441402813890e-02f, 9.5661784890034329e-01f }, { -6.9079489902481339e-01f, -5.1843191076627271e-01f, -5.0401464401397034e-01f }, { 4.5330278817258862e-01f, 7.0377631719342615e-01f, 5.4700592098496992e-01f }, { -6.1839384039718792e-01f, -7.8532784488647267e-01f, -2.9141623235257132e-02f }, { 5.6937190870680698e-01f, -7.3685588527157930e-01f, -3.6449833184282820e-01f }, { 2.4201199491378458e-01f, -9.4569332460826527e-01f, 2.1701228101012310e-01f }, { 2.1680058733334145e-02f, 1.8472513854271455e-01f, -9.8255106648137847e-01f }, { -1.9931712383081962e-01f, 4.7010359364223547e-01f, -8.5981119752679758e-01f }, { 2.0541735448909798e-01f, 4.6185452110869041e-01f, 8.6284072215337781e-01f }, { -5.8250133415941197e-01f, 1.5766945318930775e-01f, 7.9739108299095607e-01f }, { -3.3661565949385625e-01f, 6.5831788691837601e-01f, 6.7328111331511487e-01f }, { -1.0937983552452721e-01f, 5.7770266877133591e-01f, 8.0888545423632363e-01f }, { 8.3180061950724704e-01f, -4.5812836784399213e-01f, 3.1341047838890124e-01f }, { -7.0023026778187059e-01f, 4.8417024287679328e-01f, 5.2464916658158989e-01f }, { -6.7665156271658256e-01f, 6.3380543390816924e-01f, 3.7474435902583503e-01f }, { -6.5496641922618393e-01f, -4.3606520419695449e-01f, -6.1714352250890481e-01f }, { 9.0646347213857237e-01f, 4.1913249539037373e-01f, -5.1496844430721271e-02f }, { 2.4411546094376810e-01f, 7.8328408499789337e-01f, 5.7172868033467128e-01f }, { 1.6581992956780839e-02f, -1.1179194894117853e-01f, -9.9359327577309731e-01f }, { -8.8842899043642043e-01f, -4.4178913805650843e-01f, 1.2456438675404075e-01f }, { 3.3427433542691504e-01f, 9.3294678694340127e-01f, -1.3368231523607765e-01f }, { 2.4177568355426235e-01f, -3.8036183475323226e-01f, -8.9267541329703037e-01f }, { -8.7939890183206326e-01f, 4.7132571883211605e-01f, -6.7153839979186392e-02f }, { -7.1207485326624509e-01f, -1.7465190331623909e-01f, 6.8003390798832264e-01f }, { -9.4763159008798925e-01f, -1.4789676759422890e-01f, 2.8305638237370240e-01f }, { 3.3814755683449754e-01f, 8.1381464350783461e-01f, 4.7261184477229978e-01f }, { 4.1363314005603707e-01f, 1.7449708835142380e-01f, 8.9356499014020141e-01f }, { -9.1910650130760463e-01f, 2.3075319915423673e-01f, -3.1936843979043911e-01f }, { 8.5659744508685876e-01f, 1.5153825969912540e-01f, 4.9323115566438669e-01f }, { -6.3097374714811294e-01f, 2.6048910308571199e-01f, 7.3076504950871224e-01f }, { -9.2179746901996751e-01f, -3.5031318461494809e-01f, -1.6604246081444166e-01f }, { -6.0864001337482165e-01f, -7.9284427650599609e-01f, 3.0907722833953412e-02f }, { 9.3244671912627364e-01f, 2.1230312576502003e-01f, 2.9235337997199606e-01f }, { -2.4884803191651370e-01f, -9.6578151726206773e-01f, -7.3080215696562909e-02f }, { 3.8959459292519588e-01f, 6.7997756545272359e-01f, -6.2116548813052874e-01f }, { -6.8941111434289759e-01f, -4.2636567435857581e-01f, -5.8559766661867863e-01f }, { -7.7599906418221931e-01f, -6.0755617542873674e-01f, -1.6941353572464590e-01f }, { 4.7293293070832257e-02f, -2.7879433558312422e-01f, -9.5918562482831271e-01f }, { 8.0371446891771459e-01f, 2.7059185422879156e-01f, 5.2992744869212094e-01f }, { 3.1443778594753918e-01f, -3.7239243161338137e-01f, -8.7318540737089889e-01f }, { -7.5389201971167741e-01f, 6.4240849966313140e-01f, -1.3768856951690731e-01f }, { -8.2690213493853060e-01f, 5.5972279856930551e-01f, 5.4251709612184860e-02f }, { -5.2216603316225685e-01f, 8.1726932951998255e-01f, 2.4374879863816989e-01f }, { -9.3672451713468774e-01f, -3.2814191220420447e-01f, -1.2194287373091617e-01f }, { -1.9023610067416405e-01f, 5.3087466830603702e-01f, -8.2582220395872408e-01f }, { -6.3538101367367761e-01f, 6.6488191197594304e-01f, -3.9271237641590095e-01f }, { -3.2715994866863196e-01f, 4.2952527661067741e-01f, -8.4170921626156570e-01f }, { -5.9214813713703163e-01f, -6.4520634346499040e-01f, 4.8277257382506739e-01f }, { -4.1667305826246331e-01f, -8.5303458561713819e-01f, -3.1419032171472611e-01f }, { 9.6582275247405891e-01f, -2.4447142740672719e-02f, 2.5804795681277892e-01f }, { 9.3646402857158295e-01f, -3.4882710926796501e-01f, -3.6807214391159360e-02f }, { -6.5731399135067115e-01f, 7.1184848543154555e-01f, -2.4740665020056474e-01f }, { 3.4037422269749212e-01f, 8.8280334403212968e-01f, -3.2373390969864030e-01f }, { 5.1829267439699933e-01f, -2.9937209049166941e-01f, -8.0109241358351013e-01f }, { -2.5432160342487381e-01f, 9.2852207517964080e-01f, -2.7049450629448019e-01f }, { -9.4079347596743268e-01f, -2.3825303306441131e-01f, -2.4112886142625953e-01f }, { 8.5810260209227052e-01f, -5.1164803556347693e-01f, -4.3315262743166202e-02f }, { 7.0339104879787351e-01f, 3.9752523059128630e-01f, 5.8924928808983068e-01f }, { -9.5006259648434295e-03f, 9.2128411386027587e-01f, 3.8877412420962693e-01f }, { -6.5222874788313057e-01f, 3.3902616125637008e-01f, 6.7798150595615325e-01f }, { -8.7681031318689373e-01f, -4.8044855638880080e-01f, -1.9309566360195537e-02f }, { 6.0251872894767589e-01f, -4.5356064892346931e-01f, 6.5669926070873452e-01f }, { 2.3439544186025041e-01f, 9.7112870519672623e-01f, -4.4360058364120061e-02f }, { 8.5463511439757200e-01f, -1.8213031718028813e-01f, -4.8623797548366859e-01f }, { -8.7823242612682340e-01f, 4.0332173844681302e-01f, 2.5698128530232361e-01f }, { 2.1183667844862264e-01f, -9.6425820099157822e-01f, 1.5915823410788410e-01f }, { -9.9229237715779273e-01f, -9.6545807648243220e-02f, 7.7683622856334511e-02f }, { -5.1775751792715197e-01f, 8.2487006934061724e-01f, -2.2697251229151108e-01f }, { -8.9598097533729815e-01f, 4.3284301312402118e-01f, -9.9322796091039750e-02f }, { -1.2078054172580130e-01f, -6.6003528903297171e-01f, -7.4146171713149400e-01f }, { 7.7313590934397325e-01f, -4.8808703422778371e-01f, -4.0500853410958382e-01f }, { 1.2856760704658285e-01f, -1.1168066784638106e-01f, -9.8539220559516394e-01f }, { 3.1672853999216899e-01f, 3.7391924490840150e-01f, 8.7170375142106615e-01f }, { 7.2494180179733791e-01f, 6.5291705574997316e-01f, 2.1945091095189284e-01f }, { 4.9897145077528454e-01f, -3.6252067524987830e-01f, 7.8715071703427930e-01f }, { -5.3010169928038842e-01f, -8.3384864177604856e-01f, -1.5391111405055702e-01f }, { 9.6444572688330343e-01f, 1.9533707732178207e-01f, -1.7801085955615376e-01f }, { -9.9390500458224440e-01f, 3.9745261044847893e-02f, 1.0282585322206436e-01f }, { 7.5590321562027962e-01f, -6.1993757511063297e-01f, 2.1044650527121947e-01f }, { -7.6604834185371340e-01f, 6.4272374391429332e-01f, -8.7250760437994693e-03f }, { -2.4774062302417565e-01f, 9.5369329391112789e-01f, 1.7056871006294250e-01f }, { 7.6483122143232399e-02f, 6.4742224276370164e-01f, -7.5828409689379750e-01f }, { 2.6512204738656420e-01f, 8.0816931405475112e-01f, 5.2590175870577716e-01f }, { -7.2659151006302680e-01f, 6.2653043949019793e-01f, 2.8200068421291108e-01f }, { -8.0956402933927463e-01f, -5.1657972844230216e-01f, -2.7883949964528959e-01f }, { -6.1385311406962129e-02f, 9.1147027550735105e-01f, -4.0676010179222821e-01f }, { -6.1998038418063439e-01f, -5.9777123900472684e-01f, -5.0822619870485508e-01f }, { 2.5952759787988239e-01f, -6.8475935843543101e-01f, -6.8099195808305635e-01f }, { 7.1452322958740544e-01f, 6.0004173375870440e-01f, -3.5973111087009418e-01f }, { -6.6448182468645062e-02f, -7.3662586130303709e-01f, 6.7302821598070639e-01f }, { -4.5200155789777963e-01f, -7.0052496123934072e-01f, -5.5223126526718891e-01f }, { -5.7052563943417045e-01f, 4.7644050969382007e-03f, -8.2126597104245302e-01f }, { 9.2074528062550309e-01f, -3.8951771291362908e-01f, -2.2451715578084442e-02f }, { 5.0081231373418655e-01f, 3.7052504573774864e-01f, -7.8223923251985383e-01f }, { -8.2843317155036100e-01f, -5.3672876544590076e-01f, -1.6006471384389900e-01f }, { 4.5708757560508684e-02f, 5.9079218156931623e-01f, -8.0552796827847184e-01f }, { 8.8000485446417576e-01f, 1.8047360942276214e-01f, 4.3934124825857762e-01f }, { -8.5987706138508546e-01f, -4.4279743537613020e-01f, -2.5405092113210626e-01f }, { 5.4073249808027701e-01f, -8.3483163762280721e-01f, 1.0326907738469043e-01f }, { -8.9580331263697599e-01f, -3.1580229634089574e-01f, 3.1273844454182054e-01f }, { 5.2636681848488220e-01f, -7.8205311566242586e-01f, 3.3366284881717895e-01f }, { 2.1001755356515753e-01f, 8.8624129087518144e-01f, 4.1287891874301130e-01f }, { -6.4698123543285979e-01f, -6.7165397139587224e-01f, -3.6096568217203612e-01f }, { 2.1465870500352507e-01f, 5.3256695456569192e-01f, -8.1871489498532624e-01f }, { -2.9044511280617852e-01f, 9.1688033310967954e-01f, 2.7381031975382053e-01f }, { 8.6894904576772225e-01f, 1.0523964173885629e-01f, -4.8358264409099944e-01f }, { -2.0509887026514617e-01f, -5.5211626151784365e-01f, 8.0814731774814474e-01f }, { 8.5256864392394827e-01f, -3.2543297946177302e-01f, -4.0892552289666756e-01f }, { 3.7615823271378412e-02f, -9.0816028940594995e-01f, 4.1692917694222087e-01f }, { 2.3616391699311599e-02f, -9.6377716635556299e-01f, -2.6566113689199294e-01f }, { -9.4583556363183974e-01f, -1.7366906887964875e-01f, -2.7428842681330162e-01f }, { -2.0219709624397869e-01f, 9.6151134655640813e-01f, 1.8604371721126761e-01f }, { 1.9267688346626070e-02f, 5.6885213053691874e-01f, 8.2221408998471057e-01f }, { -1.9042135933731250e-01f, 8.3503111231657012e-01f, -5.1620029772509990e-01f }, { 3.8396852380039120e-01f, -1.0774667780641173e-01f, 9.1703807235699308e-01f }, { 1.2356168885418722e-01f, 8.6950832341664319e-01f, 4.7821311625328650e-01f }, { -1.0953175647146959e-01f, 2.1805522154596996e-02f, -9.9374408854988416e-01f }, { 1.3850702629010805e-01f, 6.8437555315118770e-01f, 7.1585327122063025e-01f }, { -8.1531882720498294e-01f, 4.1782770309161132e-01f, 4.0084313706770569e-01f }, { 5.8510531799830157e-01f, 8.0266757585494153e-01f, 1.1565694757020900e-01f }, { -6.9988750541272404e-01f, 6.5441954967023030e-01f, -2.8616871383253500e-01f }, { 2.9474120438720330e-01f, -8.9687916984174110e-01f, -3.2975047708891997e-01f }, { 1.9600607178876064e-01f, -4.9559172041317939e-01f, -8.4615038053518854e-01f }, { 8.1365982602860498e-01f, -5.7555315005461216e-01f, -8.1830672545893629e-02f }, { -9.3317084586306631e-01f, -1.9462043775468779e-01f, 3.0218381432396890e-01f }, { 4.3252294937514313e-01f, -8.8786881920544336e-01f, 1.5688485633278651e-01f }, { -2.4257579902837770e-01f, -9.4788393481571220e-01f, -2.0657450918258702e-01f }, { 4.5931204546052623e-01f, 8.8371580628637869e-02f, 8.8386815115834083e-01f }, { 6.0673569424440710e-01f, 7.5481379925140824e-01f, -2.4925474075614332e-01f }, { 3.4835419122949761e-02f, 4.3287344028727298e-01f, 9.0078137095989563e-01f }, { 2.1536064839812595e-02f, 3.3328473748228471e-01f, -9.4258022558962051e-01f }, { 4.4791543940152484e-01f, 8.8407093983246621e-01f, -1.3338040519311195e-01f }, { 9.0020719887352760e-02f, 9.1561876020542476e-01f, 3.9183996216675487e-01f }, { -1.3344658198276324e-01f, 8.8643639910710537e-01f, 4.4319580333656861e-01f }, { 9.5178663933178187e-01f, -3.0416788645526316e-01f, 3.9800628623813568e-02f }, { -5.9486237878734582e-01f, 7.7882826484049905e-01f, 1.9891024153873513e-01f }, { -2.6796381131515201e-01f, 8.0398579544906534e-01f, 5.3085048416818015e-01f }, { -6.7286101758668027e-01f, 4.0133466770709469e-01f, 6.2144069347658015e-01f }, { -3.3186253016231770e-01f, 8.8574134420730632e-01f, -3.2454511587158263e-01f }, { -6.7855940233083013e-03f, -9.9314639619899403e-01f, 1.1667986728952739e-01f }, { -4.4061685490010094e-01f, 5.3177655354557996e-01f, 7.2323611931175580e-01f }, { 6.9973451583926438e-01f, 7.0022155007003595e-01f, 1.4163822986999844e-01f }, { -7.5002835105872834e-01f, -6.6007085933408083e-01f, -4.1999205541214508e-02f }, { -4.5675143162874282e-01f, 5.6743357198751831e-01f, 6.8512573377926755e-01f }, { -6.1937564769115860e-01f, 7.0384973248521077e-01f, 3.4780649954774440e-01f }, { 5.6452702109106245e-01f, 2.7180677392365010e-01f, -7.7937816245213654e-01f }, { 6.6805203171892891e-01f, -7.4397513199875231e-01f, 1.4404370296910376e-02f }, { -2.8693350513590471e-01f, 7.3661519318898291e-02f, -9.5511420479545550e-01f }, { 8.5667377935443445e-01f, 5.1007753367562370e-01f, -7.7012631470315826e-02f }, { 4.4776082063984857e-01f, -3.5707497184704179e-01f, 8.1976076508964724e-01f }, { -3.7800580293923976e-02f, 4.4218144773731738e-01f, -8.9612872033339752e-01f }, { -3.4398802976398996e-01f, -2.8597147351225177e-01f, 8.9436712356633497e-01f }, { -3.5923465668951249e-01f, -6.5873505338575211e-01f, -6.6107381650919939e-01f }, { 3.0735449979510809e-01f, 9.1108698236132335e-01f, -2.7468840897904018e-01f }, { 7.8139892710541436e-01f, -2.1910008693602390e-01f, -5.8430374688438724e-01f }, { -2.8103898299108915e-01f, -4.8634839837957400e-01f, -8.2733447011046113e-01f }, { -9.7107511588121498e-01f, -1.8422344159004250e-01f, -1.5190405815844737e-01f }, { 5.8341968451254511e-01f, -6.8058986026506074e-01f, -4.4319173483681668e-01f }, { -5.8546654790050701e-01f, -1.8099193825142620e-01f, -7.9023467373777978e-01f }, { 9.9768727885605635e-01f, 6.7971073805383031e-02f, 1.6350700544307849e-04 }, { -8.2236641125470789e-01f, 1.2532539525046285e-01f, -5.5498381142639452e-01f }, { 3.7270069198228450e-01f, -8.8732427147606208e-01f, -2.7156920194565859e-01f }, { -5.8501062453641554e-02f, -9.8877851285743534e-01f, 1.3745791429828191e-01f }, { -9.0992826496042523e-01f, -3.9913426582568512e-01f, 1.1279357459492863e-01f }, { 9.7935947299627368e-01f, 7.1291919119646330e-02f, -1.8913615445149271e-01f }, { -1.7831709274084520e-01f, -9.5307521334610534e-01f, -2.4464392929669981e-01f }, { -9.3115885910060492e-01f, 2.9070640020169974e-01f, -2.2007491451828179e-01f }, { -4.0518057127001950e-01f, -7.7918715184686749e-01f, -4.7822179693325062e-01f }, { 1.4099470444820151e-02f, -7.5013259086148543e-01f, -6.6113712727437313e-01f }, { 2.6075575696800812e-01f, -6.4889984631495146e-01f, -7.1479747107867786e-01f }, { 2.4272203737378029e-01f, 5.9953743324851691e-02f, -9.6824147878226074e-01f }, { 1.6123815079080514e-01f, -8.1500347763247727e-01f, 5.5657128040937387e-01f }, { -9.4032266557918498e-01f, -3.3772705716897611e-01f, -4.1637956890790508e-02f }, { 8.3339818526809528e-01f, 3.8092901781754618e-01f, 4.0042545895135712e-01f }, { -5.2493160475506222e-02f, 8.3611283451203122e-01f, 5.4604010481607435e-01f }, { 5.9033630296161921e-01f, 6.7480424522595484e-01f, -4.4287953218752030e-01f }, { -6.8443854850138797e-01f, -3.5029350585215679e-01f, -6.3940467083304775e-01f }, { -5.1240390704492278e-01f, -1.0483069141858456e-01f, -8.5232198269304282e-01f }, { 9.0981648295237583e-01f, 3.8911395643657837e-01f, -1.4430625854217721e-01f }, { 9.2217260677755175e-01f, -3.4480431522443324e-02f, 3.8523860547863181e-01f }, { -2.2519648362963985e-02f, 2.8313301218071663e-01f, 9.5881622996853921e-01f }, { -4.4089541907825347e-01f, 8.8932026208267290e-01f, 1.2132889550728329e-01f }, { -1.3530922721788674e-01f, 3.6268660945010922e-01f, -9.2203570232138099e-01f }, { 9.5307085040698647e-01f, 2.6122337668149442e-01f, 1.5303039430002746e-01f }, { -8.9018462715289315e-01f, -1.4039352068227354e-01f, -4.3342933556821067e-01f }, { -1.6985599534635467e-03f, 9.9739308138499183e-01f, 7.2139837118166947e-02f }, { -8.4973450875424184e-01f, 5.0809369322150399e-01f, -1.4068426898811243e-01f }, { 6.2772533138345099e-01f, -2.3643769861571734e-01f, -7.4165903420159296e-01f }, { 8.3875762725899783e-01f, -4.9240514632080296e-01f, -2.3242808477385993e-01f }, { 6.1241913889526589e-01f, 5.6996296511522870e-01f, 5.4780016129227049e-01f }, { -4.5814637074857922e-01f, -2.3052461021767165e-01f, 8.5846392297748653e-01f }, { -5.9207472952437834e-01f, 7.0139584342472894e-01f, 3.9685184324272393e-01f }, { -8.3025130939534744e-02f, -3.5979200669229655e-01f, 9.2933123242082183e-01f }, { -6.6266228064913191e-01f, -6.1759987276385347e-02f, -7.4636747368606027e-01f }, { -4.9063552615571882e-02f, 9.5969393905819145e-01f, 2.7673147840408641e-01f }, { -9.6246468437058519e-01f, 1.3205431595441078e-01f, -2.3711471691407596e-01f }, { 6.2531592238681943e-01f, -7.6738719719805115e-01f, 1.4176348890331644e-01f }, { -1.1071284074333669e-01f, -8.3648490549172039e-01f, -5.3668954692545312e-01f }, { 3.0717910330294701e-01f, 9.2576888495199872e-01f, -2.2043813224741840e-01f }, { 5.0088350955174132e-01f, 8.1626010770774415e-01f, -2.8781095605287943e-01f }, { -6.9666991280665203e-01f, 6.7403485516602646e-01f, -2.4561768383258889e-01f }, { 6.1599743567669829e-01f, -7.5880928528102443e-01f, -2.1155525947381423e-01f }, { -2.2672962480640010e-01f, -6.1010581682615184e-01f, -7.5918678170134313e-01f }, { -6.7022253760795181e-01f, -7.4213505940844060e-01f, -6.1076737951571321e-03f }, { 5.0482254133557347e-01f, 6.0892217172997609e-01f, 6.1185618451981238e-01f }, { 8.1072907192641930e-01f, 4.7639252601907378e-01f, -3.4024775250762912e-01f }, { 7.1478144298930180e-01f, -6.9918998966394941e-01f, 1.4860925672978004e-02f }, { -5.8055188519114909e-01f, 3.2045459735860921e-01f, -7.4851076120035476e-01f }, { -9.7819331256543696e-01f, 1.3642785243648711e-01f, 1.5660550543268045e-01f }, { -9.7285554494835247e-01f, 2.3052607520873361e-01f, -2.0243945072572215e-02f }, { -9.5933350861349942e-01f, -1.0392857589963946e-02f, -2.8208368928817451e-01f }, { -1.3076801263423113e-01f, 6.5175992441436126e-01f, 7.4706674922598437e-01f }, { 1.6872002499899039e-01f, 9.4012533141277821e-01f, -2.9613833659348132e-01f }, { 7.8994161630488791e-01f, -6.0365350864992839e-01f, -1.0767861590980929e-01f }, { 7.6029049358902745e-01f, -4.2028992896726697e-01f, -4.9529258117484737e-01f }, { -6.6607961814114292e-01f, -4.9446953091867768e-01f, 5.5842441322887404e-01f }, { -5.9186289549900017e-01f, 6.2288811294260615e-01f, -5.1157473714633195e-01f }, { -8.1616724536896668e-01f, -5.7603983368515854e-01f, 4.5267401016712623e-02f }, { -4.4061436461767073e-01f, -8.9370843140432710e-01f, 8.4523495723872924e-02f }, { 5.0349274181131976e-01f, -4.0879873391147298e-01f, 7.6116926770311499e-01f }, { 3.9171273543053242e-01f, 2.1127326227428175e-01f, 8.9550250784099550e-01f }, { -4.3414745560879686e-01f, -9.2867604448265709e-02f, -8.9604218362332044e-01f }, { -2.2110933284330117e-01f, 1.3425155365877875e-01f, 9.6596437991770401e-01f }, { -7.1682744581543278e-01f, -6.3370645884634214e-01f, 2.9081701625274992e-01f }, { -4.8445212722380782e-01f, -2.4167210307958201e-01f, -8.4077388816578935e-01f }, { 1.5680045374426360e-01f, 7.6689224981156545e-01f, -6.2232619652763188e-01f }, { 7.2817831376992026e-01f, 6.1316982137807474e-01f, -3.0623375631431560e-01f }, { 9.8642395276144346e-01f, 6.5714141471902493e-02f, -1.5049729907576523e-01f }, { 8.0965345950151912e-01f, 3.1345518612435386e-01f, 4.9619262570998435e-01f }, { -2.3076227018015300e-01f, 4.8781096019814751e-01f, 8.4189621793417235e-01f }, { 1.1442777698220184e-01f, -9.6314872272224061e-01f, 2.4341491690820405e-01f }, { -1.7829345680702927e-01f, 2.8788288947099544e-01f, 9.4092235875742192e-01f }, { -5.8982799530464447e-01f, -5.9286813839567887e-01f, 5.4827940544046194e-01f }, { 9.9466033411769328e-01f, -8.5463433508878639e-02f, 5.7851717915305467e-02f }, { -4.2254268115808541e-01f, -5.2781065790656112e-01f, 7.3679956026044136e-01f }, { -7.5378884849445837e-01f, -1.7267902173541916e-01f, 6.3402233977825828e-01f }, { 1.1555536982124637e-01f, 6.3447494857885489e-01f, -7.6425682602861611e-01f }, { -5.2539487241194435e-02f, -8.6116558406956045e-01f, 5.0560205606243835e-01f }, { 7.3172759283122102e-01f, -6.3216539522060911e-01f, 2.5483650243832429e-01f }, { 6.1381018767717710e-01f, -7.7153187389068556e-01f, -1.6725914347035276e-01f }, { -5.8541825065677722e-01f, -4.0787132715765256e-01f, 7.0066143912778167e-01f }, { -1.7370775365722890e-01f, -3.3361393597982680e-01f, -9.2656751402118964e-01f }, { 4.8076238848910785e-01f, -2.9150370598887893e-01f, -8.2697830395301020e-01f }, { -4.3100715858598049e-01f, 1.8083269014474423e-01f, 8.8404319318835001e-01f }, { -2.1563576799553447e-01f, 9.6110563195265297e-01f, -1.7256065539359627e-01f }, { -6.6977999694497858e-01f, -7.3368782708663838e-01f, 1.1444181087902990e-01f }, { -1.7261387074543832e-01f, 5.5315087461116963e-01f, 8.1500218499288402e-01f }, { -6.6444101816123402e-01f, -6.7782191581004136e-01f, -3.1476274212884187e-01f }, { 8.9982736205401070e-01f, 2.9298084250997997e-01f, 3.2322274737564899e-01f }, { 9.0281954504276707e-01f, -4.2730318723843676e-02f, 4.2789132843577210e-01f }, { 2.8144901987528537e-01f, 7.4430981504833316e-01f, -6.0563136348273550e-01f }, { -7.8763245226295930e-01f, -5.9872014434870480e-01f, 1.4549676592042601e-01f }, { -6.1386650193835079e-01f, 7.8482030877853970e-01f, -8.5000004274884022e-02f }, { -1.6631774870196928e-01f, -9.6084845147388476e-01f, 2.2160473769066050e-01f }, { 9.8286763070840188e-01f, 1.7130823852153715e-01f, 6.8005205097115773e-02f }, { 9.0365179204503188e-01f, 4.2680057983614289e-01f, 3.5421798166309575e-02f }, { 7.9711013392603047e-01f, -4.0192331324599051e-01f, -4.5063631085587330e-01f }, { 6.0339001699459638e-01f, 3.3369514019774948e-01f, 7.2427069580348546e-01f }, { -2.2453319138831160e-01f, 4.0354988973675426e-01f, 8.8697933034453136e-01f }, { -7.9383294215333799e-01f, -1.4557191136865083e-01f, 5.9045582271043173e-01f }, { -2.2277737205473068e-02f, 3.3144512160323319e-01f, 9.4321144702045567e-01f }, { -9.7459780190510914e-01f, -2.0907315406413432e-01f, 8.0296580072905396e-02f }, { 1.2959649207779697e-01f, -6.4588317202366907e-01f, -7.5235608413687538e-01f }, { -9.4010152500906274e-01f, -1.2310857174917487e-01f, 3.1788897784841930e-01f }, { 7.2548110747843852e-01f, -3.2747678107537159e-01f, -6.0533967369434116e-01f }, { 3.9451818998551624e-01f, 5.4398093393120595e-01f, 7.4056744546994846e-01f }, { -3.8464476109109336e-01f, 2.3639685751315903e-01f, 8.9228074815221636e-01f }, { -7.8782138143547203e-02f, 5.8469830944218504e-01f, -8.0741641155291233e-01f }, { -7.7047381996814102e-01f, -4.9682139891406180e-01f, -3.9942282148717456e-01f }, { 7.2954595221528973e-01f, 1.7987864529774461e-01f, 6.5985329928108605e-01f }, { 9.2422097098623124e-01f, 3.7537491570661158e-01f, -7.0066179056104821e-02f }, { -5.2896357075212153e-01f, 8.4851650638994935e-01f, -1.4740393514437703e-02f }, { 2.5484816575608848e-01f, 1.4072797048622840e-01f, -9.5668597289475532e-01f }, { 5.2268357977161595e-01f, 8.4212380471781356e-01f, 1.3277564899002633e-01f }, { -6.8881938032509504e-01f, 7.0889623534092905e-01f, 1.5163768927285215e-01f }, { 8.3586635456849101e-01f, 2.2694973977115693e-01f, 4.9982122095623932e-01f }, { -1.1626353616813311e-01f, -5.1998878395729842e-01f, -8.4622364343965906e-01f }, { -4.5333001415334984e-01f, -6.2079948213435177e-01f, 6.3960917852188781e-01f }, { 3.4162440902777069e-01f, 7.0217095686749642e-01f, -6.2469889585960592e-01f }, { 9.1731679513123698e-01f, 3.9332662234846849e-01f, 6.1839029116744049e-02f }, { -4.5013306725852831e-01f, 2.6057849967613822e-01f, 8.5409546730266761e-01f }, { -2.1264650900074999e-01f, -2.0976142098798389e-02f, 9.7690401968281659e-01f }, { 8.7006206697482658e-02f, 3.0783730539715509e-01f, 9.4745243331891527e-01f }, { 5.7838981885878715e-01f, -7.0879045274730057e-01f, -4.0383327195115576e-01f }, { -7.3702925616485693e-01f, -4.3256041194061862e-01f, 5.1930662000290351e-01f }, { 7.9074922946704318e-01f, 7.9270803327482944e-02f, -6.0698582836594550e-01f }, { 5.3805163178760973e-01f, -4.2186331615987183e-01f, 7.2974775368567357e-01f }, { -9.0527684333829062e-01f, 2.9771059057132088e-01f, 3.0305484846333580e-01f }, { 5.8280240651665594e-01f, 2.3177520909131830e-01f, -7.7885917045963460e-01f }, { 7.7150695345522613e-01f, 6.2005813780797070e-01f, 1.4249535609396966e-01f }, { 3.1009589033611829e-01f, -3.3171663193195935e-02f, 9.5012640188432151e-01f }, { 4.3966972545139543e-01f, -5.6206681724101526e-01f, 7.0055080149697191e-01f }, { -6.3450674659109463e-01f, -5.6554572989164187e-01f, 5.2683888991959826e-01f }, { 9.0497525047050853e-01f, 1.4069994969175909e-01f, 4.0152623848582647e-01f }, { -4.1432847062634043e-01f, 7.3624903689720822e-01f, -5.3504137606018010e-01f }, { -3.5584750300964713e-01f, 1.0612809994274319e-01f, -9.2849845503605566e-01f }, { 7.9494053032725409e-01f, 6.0191582495737694e-01f, -7.5940061291156088e-02f }, { -5.7362625169273407e-01f, -2.6901666872523999e-01f, -7.7368143012283719e-01f }, { -3.3368964169109938e-01f, 6.2380400218758048e-01f, -7.0676713978708916e-01f }, { -9.4703066525438218e-01f, 3.0127669790373568e-01f, -1.1119923726385719e-01f }, { -8.4246459535881757e-01f, -4.3486262576281781e-01f, 3.1803757998320159e-01f }, { 3.1282017097236386e-01f, 1.2117091178649271e-01f, 9.4205156481460772e-01f }, { 8.4157349868646625e-01f, 2.9273713117236128e-01f, -4.5393724053176793e-01f }, { -3.0465291843001052e-01f, 9.5166892807457359e-01f, 3.8895380567226676e-02f }, { -4.5042874738266664e-01f, -1.3546107679710628e-01f, 8.8247619809502531e-01f }, { -6.5819235508137941e-01f, -2.8803932647085712e-01f, -6.9556895425158405e-01f }, { 3.5974141134819164e-02f, 7.7468460289144347e-01f, 6.3132371032025925e-01f }, { 4.8256895620166723e-01f, -3.4105547392301250e-01f, -8.0672694650518695e-01f }, { 2.5750175801370184e-01f, -5.4615518481765868e-01f, 7.9712443113772524e-01f }, { -9.2570298317150368e-01f, 3.7731994317759254e-01f, 2.6526353459096416e-02f }, { 3.0002762127737248e-01f, -8.3983455000230522e-02f, 9.5022639710590329e-01f }, { -7.7307297518857787e-01f, -3.4773078595081119e-01f, 5.3051058004069207e-01f }, { 7.8850337261169690e-02f, 8.9239653490307236e-01f, 4.4430963168356968e-01f }, { 5.3124774590459500e-02f, -1.4431262711927495e-01f, -9.8810506727708158e-01f }, { -7.9377719980904027e-01f, 2.2389277311326949e-01f, -5.6549958727745242e-01f }, { 2.2211514341422781e-02f, 8.6102597497038014e-01f, -5.0807570209267727e-01f }, { 5.6870222713457530e-01f, -1.2171871437740085e-01f, -8.1348775738943147e-01f }, { 5.3263182421797106e-01f, 6.9009188311124237e-01f, 4.8997605318445486e-01f }, { -7.7260220444337224e-01f, -2.9176149372159843e-02f, 6.3421966699011711e-01f }, { 9.2623741621686462e-01f, -2.0544773944508804e-01f, -3.1603081361919438e-01f }, { -3.6492676015412973e-01f, -5.5315950566204342e-01f, -7.4889453264070105e-01f }, { -7.3943811338571097e-01f, -5.9787449110464341e-01f, 3.0947919051035433e-01f }, { -7.4566458685105463e-01f, 1.2047664217749153e-01f, 6.5533937971548961e-01f }, { -8.5398478184266657e-01f, -3.6620286669324875e-01f, 3.6960174892278286e-01f }, { 6.0153703299052352e-01f, -3.8560999487731662e-01f, -6.9961284278640412e-01f }, { -7.3320472386653113e-01f, 6.3668783957571939e-01f, -2.3882928596846509e-01f }, { 1.2109114104366098e-01f, 9.3610281327977540e-01f, 3.3022486055782380e-01f }, { -8.9507437341434470e-01f, 4.4552112278218442e-01f, 1.8782843549900959e-02f }, { -6.6388792617699449e-02f, 2.8094007624197176e-01f, 9.5742634274178984e-01f }, { -8.1344599580355115e-01f, 3.4266101379027142e-01f, -4.6998834191859729e-01f }, { -4.8500984065948244e-01f, -4.7364245628337287e-01f, 7.3513827139478782e-01f }, { -9.5361665347291136e-01f, -1.9166327471319014e-01f, -2.3212166496331518e-01f }, { -5.2415582849905218e-01f, 4.4056459730245207e-01f, -7.2880964802491499e-01f }, { 3.9835989362340724e-01f, -3.6952007016991889e-01f, -8.3950241982615270e-01f }, { -3.0683277991151292e-01f, 8.1022743070629111e-01f, 4.9938477720376645e-01f }, { -8.1219394710798287e-01f, 5.3816533434336400e-01f, -2.2520893675041012e-01f }, { -9.7535777560141357e-01f, -5.4727341889748267e-02f, -2.1373377745116776e-01f }, { 8.3870323421826309e-01f, 3.4089582301895038e-01f, -4.2469627118690101e-01f }, { 1.1562070672697301e-01f, 8.9617657279648644e-01f, -4.2836830245327351e-01f }, { 6.7976459575749126e-01f, 5.6490365903712580e-01f, -4.6776484515311867e-01f }, { 8.0711964431202932e-01f, 5.8966034687427893e-01f, -2.9301110725165509e-02f }, { 1.6805077045619538e-01f, -7.6666239994753679e-02f, 9.8279256519071512e-01f }, { 9.7061814164476845e-01f, 1.3392612212462371e-01f, -1.9991052229114029e-01f }, { 2.4170929893090815e-01f, -3.7563342800929644e-01f, 8.9469332319645345e-01f }, { -7.4444501058661561e-01f, -3.1266230773463258e-02f, -6.6695130933668190e-01f }, { 3.5116533672090261e-01f, 3.0840036213215849e-01f, 8.8406567794618551e-01f }, { -8.4449154544373428e-01f, 1.3162775182701655e-01f, 5.1914175773387627e-01f }, { -5.1155672910178362e-01f, -4.1041901941709469e-01f, 7.5489465583708759e-01f }, { 8.6490869148665239e-01f, 4.6676236940129745e-01f, 1.8456935255272916e-01f }, { 6.0386002804236094e-01f, -9.3860479648510270e-02f, -7.9154486726453521e-01f }, { -5.1797913166888221e-01f, -8.5026407129106374e-01f, -9.3534101947341436e-02f }, { -9.2407833985861865e-01f, 2.2140487989817870e-01f, 3.1154309647529066e-01f }, { 2.6850481625332956e-01f, -3.0107443583773236e-01f, -9.1501876906091761e-01f }, { 2.0947696383943323e-02f, 2.5854811600925409e-01f, -9.6577122846162244e-01f }, { 3.9948263065937789e-01f, -8.3117266345917284e-01f, -3.8673716051040130e-01f }, { -2.0346968709925264e-01f, 4.5186498158648641e-01f, 8.6857246378616937e-01f }, { 9.3867730159596163e-01f, -3.4444687370806204e-01f, 1.5533018420979016e-02f }, { 1.0813043094183048e-02f, 6.4661319670735040e-01f, 7.6274140568278093e-01f }, { 9.2171463861973779e-01f, -2.9796218119266965e-01f, -2.4831565301646427e-01f }, { -6.7244682410626688e-01f, -8.3675683901797471e-02f, 7.3540033224969503e-01f }, { -9.4027644178053182e-01f, -3.3699015774146290e-01f, 4.8144019544757020e-02f }, { 5.8062280789119658e-01f, -4.0274024671147393e-02f, 8.1317596982038909e-01f }, { 5.1027367942662341e-02f, -6.0573899354305860e-01f, -7.9402549041091031e-01f }, { -3.2518480414684037e-01f, 7.2444424320789369e-01f, -6.0781196239867086e-01f }, { 8.4692443645007631e-01f, 3.3625068485785320e-01f, 4.1189133988995857e-01f }, { 9.3099522108146116e-01f, 2.1186165135052623e-01f, -2.9725837079972939e-01f }, { 4.7828123661572346e-02f, -6.8239526999865005e-02f, -9.9652187007704351e-01f }, { -8.4803122613032134e-01f, 4.9434369817670293e-01f, -1.9096425733860417e-01f }, { -7.1875280030622379e-01f, 5.9512727609754645e-01f, -3.5946896569339087e-01f }, { -9.7527888743312963e-01f, -1.2240979345717720e-01f, -1.8397536300539816e-01f }, { 5.8710235541016809e-01f, -5.1432380263108068e-01f, -6.2512546766144306e-01f }, { -6.9326619147704582e-01f, 4.2461649983651456e-01f, -5.8230817942177260e-01f }, { -7.9636785953846545e-01f, -5.6669561560985515e-01f, 2.1131566800095594e-01f }, { 7.9925547018260357e-01f, 5.8017457090897118e-01f, 1.5680612441412009e-01f }, { -4.0609293305537197e-01f, 6.2784261537602926e-01f, -6.6400465362847616e-01f }, { 2.6862944601739169e-01f, 3.9056056369462661e-01f, 8.8051159380153809e-01f }, { -3.5353537936698161e-02f, 4.8037586369905177e-01f, -8.7634990553474046e-01f }, { -6.0355813368684308e-01f, 5.3877283996822856e-01f, -5.8774263600067722e-01f }, { -1.9967858628757601e-01f, 9.7933705590864117e-01f, -3.2052973378303241e-02f }, { 1.8145708242373296e-01f, 8.4187430715063505e-01f, 5.0825286836170913e-01f }, { -4.0935146898173635e-01f, -5.2853364806214520e-01f, -7.4369587716257701e-01f }, { 1.8010853004459626e-01f, -4.9120510528417360e-01f, 8.5221972633114906e-01f }, { 2.5105140540753990e-01f, 9.5159705385769588e-01f, -1.7730267604368696e-01f }, { 3.8296791879540676e-01f, -2.5815788451940097e-01f, -8.8695551175579401e-01f }, { -2.1512398850466300e-02f, -9.5146616758877955e-01f, 3.0700056780015722e-01f }, { -9.0342460461344620e-01f, -1.6159590620584610e-01f, -3.9712812400603148e-01f }, { 8.1270768707535579e-01f, -1.3519337491823225e-01f, 5.6677064739349714e-01f }, { -2.9671434938328878e-01f, -2.2658069354124374e-01f, 9.2769703254048441e-01f }, { 2.1997728449486537e-01f, 9.0305228460557663e-01f, 3.6892623324306145e-01f }, { 5.9873984060929109e-01f, -8.0006645730458281e-01f, 3.7473552850708497e-02f }, { 3.9448645205998334e-01f, -4.7577278954693275e-01f, -7.8614292076432046e-01f }, { -4.2106356421386471e-01f, 8.2674194404856260e-01f, -3.7309949456186609e-01f }, { -5.1098679206358077e-01f, 8.5587260495535367e-01f, 7.9840982105106872e-02f }, { 1.0890091233343073e-01f, -1.9375627444682963e-01f, -9.7498671652768243e-01f }, { -8.9612880130474903e-01f, 8.4906960078465460e-02f, -4.3559611982012381e-01f }, { 9.4196450020119737e-01f, 3.0533142205290875e-01f, 1.3955501806763096e-01f }, { 1.4882311533122083e-01f, -7.4133893693174102e-01f, -6.5442208163541238e-01f }, { -6.8502285224122927e-01f, 3.7477848518267620e-01f, -6.2472776387116780e-01f }, { -1.9858628866728648e-01f, 9.0350838083798990e-01f, 3.7978426995975895e-01f }, { -5.5710626914073846e-01f, 8.1457984740527101e-01f, 1.6153104062468154e-01f }, { -7.0487547324936195e-01f, 7.0849425611934858e-01f, 3.4444974341390669e-02f }, { 8.5780844884131208e-02f, -3.5271374751538181e-01f, 9.3179110264297982e-01f }, { 9.4299997957472736e-01f, 2.3545124115699886e-01f, 2.3518875729867003e-01f }, { -8.8570259250226324e-02f, -9.4429961602048007e-01f, -3.1694407134370201e-01f }, { 6.9262862628852429e-01f, -7.1972655815241171e-01f, 4.7531752921126380e-02f }, { -1.7504635334448240e-01f, 6.6034738234125445e-01f, 7.3027399571383600e-01f }, { -1.2412407728073387e-01f, -2.0054859443975920e-01f, 9.7178880149312452e-01f }, { 5.1076123674787373e-02f, 7.1505209612314791e-01f, 6.9720278930900037e-01f }, { -6.7817730976256729e-01f, -6.8471576572798021e-01f, -2.6690795545796797e-01f }, { 7.6671616844466783e-01f, 3.8270865488106459e-01f, 5.1544194874365246e-01f }, { 4.8432346146855920e-01f, -1.0307199949790219e-01f, 8.6879626356851780e-01f }, { -7.6227892576653300e-01f, -5.6257014800553762e-01f, 3.2007134814795257e-01f }, { -7.5030197911271557e-01f, 6.5919048341464570e-01f, -5.0148247378227366e-02f }, { 8.8894204387362019e-01f, 1.7797608828483538e-01f, -4.2202672265227387e-01f }, { 5.9141040771214348e-01f, -7.8774844697145496e-01f, 1.7229658715081148e-01f }, { -7.6476357163735775e-01f, -5.6477920594643660e-01f, -3.1009857791835255e-01f }, { 2.5198964805550783e-01f, -2.9395219216727408e-01f, 9.2200505746601813e-01f }, { -9.9441078533356075e-01f, 2.8217220195245182e-02f, -1.0173975868235578e-01f }, { 3.6846287748804568e-01f, 9.6405860255610216e-03f, 9.2959247362180875e-01f }, { 8.0120617696235430e-01f, -4.9299439113702404e-01f, 3.3915364114926361e-01f }, { -7.9085722499225852e-01f, 4.6563355545313528e-01f, 3.9715266801774873e-01f }, { -4.6602567357271009e-02f, -3.9450773995210253e-01f, 9.1771010882173210e-01f }, { 2.4149938237036331e-01f, 3.5578884487612250e-01f, 9.0282464863142031e-01f }, { 3.2551197544986599e-01f, -6.4250465836733062e-01f, 6.9370722773732540e-01f }, { 6.3385527513637385e-01f, -3.4754559165263516e-01f, -6.9097000796316166e-01f }, { 1.6812115319096738e-01f, -7.2383532329913647e-01f, 6.6917688438422163e-01f }, { 4.7008803653626204e-02f, -9.9600102514317834e-01f, -7.5974537134442036e-02f }, { -7.6017748161162424e-01f, 5.2966279283924267e-01f, -3.7628117456543358e-01f }, { -2.2735658873696851e-01f, -9.7147005887477389e-01f, 6.7490045693660586e-02f }, { -6.8827448417067505e-01f, -3.0468726050815376e-01f, 6.5836457052580488e-01f }, { -8.6887107055316692e-01f, -4.9357939952501395e-01f, 3.7979456556411613e-02f }, { -5.4008963238534857e-01f, 6.9774266401017815e-01f, -4.7059362916410030e-01f }, { -1.8215745902595076e-01f, -9.2157986740053799e-01f, -3.4279616118506329e-01f }, { 4.1728620106536773e-01f, 6.4932204659851345e-01f, -6.3580901708103477e-01f }, { 9.5974962900055094e-01f, -9.5541160569072980e-03f, -2.8069443973772595e-01f }, { -7.0016077053224890e-01f, -3.1013594684439061e-01f, -6.4311009157267995e-01f }, { -6.9210956834562820e-01f, -2.1354101155190136e-01f, 6.8948138610829723e-01f }, { -9.3910259692157683e-01f, -2.6924436147074582e-01f, -2.1352701531975019e-01f }, { -5.2878647865433968e-02f, -1.8734134663672500e-01f, -9.8087056660920446e-01f }, { 8.2298946833912456e-01f, -4.0566638088562978e-01f, -3.9764698216136374e-01f }, { 6.5651670554002661e-01f, -2.7388812123219131e-01f, 7.0283078503632035e-01f }, { 7.4729029099939426e-01f, -5.1724859450132932e-01f, -4.1714639212684052e-01f }, { -6.0878331429244947e-01f, -5.0716185787084522e-01f, 6.1005714991309890e-01f }, { 8.9196686462538766e-01f, -4.4899086295054907e-01f, 5.2936919038384649e-02f }, { 5.2152741432698724e-01f, 5.0907412229553961e-01f, -6.8472818995162810e-01f }, { -5.8281653513075582e-01f, 8.0909847515119693e-01f, 7.5395914253948287e-02f }, { 8.7627658092244687e-01f, 2.3086297429759128e-01f, -4.2289672595722011e-01f }, { -8.6482364039338788e-01f, -1.8337406025455716e-01f, 4.6739065570728544e-01f }, { -2.4474287749875246e-02f, -8.7729569021855147e-01f, 4.7932586114572595e-01f }, { 4.1224723001361191e-01f, 9.0441392214636118e-01f, -1.0994398016235211e-01f }, { -6.9791971722767432e-01f, 3.2881214047843571e-01f, -6.3623159665237661e-01f }, { 5.5115357886311256e-01f, 4.1608959471974355e-01f, -7.2325595861516567e-01f }, { -3.0522920545206911e-01f, 8.2600506295712917e-01f, -4.7386788043534622e-01f }, { 1.6905241822732481e-01f, -9.5726814316963027e-01f, 2.3464650426559119e-01f }, { -7.9231290774428409e-01f, -1.8638945810307883e-01f, 5.8094683588934204e-01f }, { 1.2083799412197425e-01f, -9.3631936975222374e-01f, 3.2970322564903171e-01f }, { -5.1170238762781195e-01f, -7.5657251244318735e-01f, -4.0713474417126277e-01f }, { 4.9493080581954074e-01f, -4.7551183476503395e-01f, -7.2727710843200000e-01f }, { 8.0865578291202711e-01f, 3.0568665550662988e-01f, -5.0262460485744975e-01f }, { 4.8684277106083729e-01f, 7.8842609532954244e-01f, 3.7598990474375282e-01f }, { -4.5157533001475297e-01f, 2.6997677748865467e-01f, -8.5040711482142972e-01f }, { -3.5626025652564688e-02f, -9.9921640361216146e-01f, 1.7244275820715117e-02f }, { 1.6371972021132677e-01f, -1.7977916480213227e-01f, 9.6998727059532730e-01f }, { 5.8111077528819899e-01f, 9.7454443388477932e-02f, 8.0796837704689306e-01f }, { 6.4900972114188971e-01f, 7.4736989914191820e-01f, 1.4221327547006812e-01f }, { -7.7807177646843140e-01f, 3.5296101533217111e-01f, 5.1963721221535142e-01f }, { 1.0895206220755388e-01f, -8.6599904404547157e-01f, 4.8803186766137602e-01f }, { -8.8428958006597103e-01f, -1.3470014075752904e-01f, 4.4708814641706890e-01f }, { 6.8609501230758818e-02f, -9.4008606723874877e-01f, 3.3396245675891351e-01f }, { 4.1521136189089863e-01f, 7.7515437741776450e-01f, -4.7616721446019694e-01f }, { -4.2190449276443337e-01f, -8.9018283663174747e-01f, 1.7196254345479364e-01f }, { -7.1497837952411447e-01f, -6.5641033851614117e-01f, 2.4068939382988250e-01f }, { 7.6718623127163721e-01f, 4.1932552678964161e-02f, 6.4005230065444474e-01f }, { 5.8212104262110676e-03f, -3.0622188398122402e-01f, -9.5194236762535345e-01f }, { 8.3455354112779756e-01f, -4.1726452238099968e-02f, -5.4934441853419713e-01f }, { 1.1923994341864140e-01f, 7.7944182713563626e-02f, 9.8980126301931637e-01f }, { -4.9467083858112249e-01f, 5.8930956754643493e-01f, 6.3876051463414907e-01f }, { 3.9407282966731699e-01f, 8.8443325770647052e-01f, 2.4996883321869087e-01f }, { -1.9293863358992266e-01f, -9.1954018646802738e-01f, 3.4237483718696227e-01f }, { 3.2623314014482707e-01f, 7.2674807803219776e-01f, 6.0449083479218457e-01f }, { 9.0925806549929966e-01f, -1.0537525516893344e-01f, -4.0267334891019735e-01f }, { 9.4633855041389892e-01f, 9.7611821401538776e-02f, 3.0808323603077536e-01f }, { 2.8631617758845318e-01f, 1.1187326874591828e-01f, -9.5158153523029276e-01f }, { 3.2910348152987889e-01f, -9.4343053420318856e-01f, 4.0369859771850876e-02f }, { 6.2741029846217478e-01f, -7.7457431745793615e-01f, 7.9943380702701808e-02f }, { -5.7990287155741538e-01f, -3.0501590656962918e-01f, 7.5543229762763719e-01f }, { -6.8957425730051453e-02f, -7.9225550217064977e-01f, -6.0628053961595685e-01f }, { -4.8842299550675250e-01f, -1.0765786567286506e-01f, 8.6594039137747481e-01f }, { -2.7608043259519427e-01f, -2.6515625089260159e-01f, 9.2383535186234900e-01f }, { 3.7558969028101019e-01f, 8.7837309017617549e-01f, -2.9562323827630843e-01f }, { -9.6677758349309062e-01f, 8.4963510803814609e-04f, 2.5561764840371110e-01f }, { 9.6389629850260428e-01f, 2.6051311153643841e-01f, 5.5107571626606247e-02f }, { 9.4971364394245128e-01f, 3.1301210815180186e-01f, -8.2106430878240867e-03f }, { -5.4870123548471073e-01f, 7.7828173827029223e-01f, -3.0529410418893543e-01f }, { -6.3830735872029765e-01f, -7.1259796203117975e-01f, -2.9114920627150381e-01f }, { 4.4053720514849354e-01f, -3.4261665496248583e-01f, -8.2978358541385422e-01f }, { -4.4290317701639625e-01f, -8.7430341336906015e-01f, -1.9857068555049387e-01f }, { -2.3775037963701387e-01f, -8.3978449772472685e-01f, -4.8809502595671284e-01f }, { -2.8206188385966707e-01f, -9.5934456808874069e-01f, -9.9545643884255894e-03f }, { 3.7442360461686808e-01f, -8.3933676299062854e-01f, 3.9410755206938708e-01f }, { -3.2631989425774971e-01f, -5.9959161447979825e-01f, -7.3075660958839095e-01f }, { -7.4830328670709390e-01f, -8.7781311314343566e-02f, 6.5752310414714332e-01f }, { -2.5035498487506963e-01f, 4.3644939914356523e-01f, 8.6419575533291326e-01f }, { 7.0873593902922516e-01f, -2.9878953208930081e-01f, 6.3907603948373726e-01f }, { 6.8307187513318310e-02f, 9.9766239622860808e-01f, 1.9675582359783179e-03f }, { -9.2769028757911409e-01f, -1.6651620166904066e-02f, 3.7297916011112164e-01f }, { -3.2595683643067010e-02f, -9.8967365993116829e-01f, -1.3958355292185104e-01f }, { -2.3539459053001754e-02f, 9.9145591046771520e-01f, -1.2830070719261830e-01f }, { 1.8343386947770543e-01f, -3.0357077623105788e-01f, -9.3498491931523109e-01f }, { -4.9251716292261288e-01f, -1.6065594065940295e-01f, 8.5534584406396852e-01f }, { 3.4366078919966081e-01f, -2.4181866818431152e-01f, -9.0742547555390585e-01f }, { -6.6507701502558036e-01f, 7.4516202897161121e-01f, -4.9052162679901208e-02f }, { 8.9134923075983441e-01f, -3.8636574008503838e-01f, -2.3710348734759723e-01f }, { 8.9251330680877461e-01f, -4.3353202548624792e-01f, 1.2437837451525639e-01f }, { -4.2903447470604428e-02f, -3.5466715582830037e-02f, 9.9844950111705888e-01f }, { 4.9413361397512617e-01f, 3.4551548541100680e-01f, 7.9777880448221816e-01f }, { -1.4285788594554835e-01f, 1.8732033777230153e-01f, -9.7185529554560723e-01f }, { -1.7142075314317912e-01f, 8.0071568072647337e-01f, 5.7399418466615637e-01f }, { -8.2705363978326438e-02f, 9.9324948469659247e-01f, -8.1334395670995152e-02f }, { 1.5626488426420004e-01f, 9.5588113605348324e-01f, -2.4874191380424474e-01f }, { 7.6375764342703611e-01f, -3.9646541252637481e-02f, 6.4428442001454855e-01f }, { 4.6404136384623973e-01f, -4.4094944398755670e-01f, 7.6826375710870698e-01f }, { -7.8014546585563102e-02f, 1.1034978825927962e-02f, 9.9689114739943419e-01f }, { -6.5840246343242470e-01f, -3.9510288845860131e-01f, -6.4062461994352415e-01f }, { -2.6344115450716910e-01f, 5.9284225269161672e-01f, 7.6101039515597890e-01f }, { 9.2107889787652542e-01f, -6.0438668106878014e-02f, -3.8465677075027799e-01f }, { 9.7027424062832079e-01f, -1.4658474693825344e-01f, -1.9256378148079578e-01f }, { 7.4041895201905428e-01f, -2.3074405490755795e-01f, 6.3129783511099058e-01f }, { -4.6057460949204676e-01f, -8.5459538287588943e-01f, -2.3987029965892098e-01f }, { -1.3474952894192196e-01f, -9.7196660050955608e-01f, -1.9267457523977324e-01f }, { -3.1161011981483516e-01f, 4.6858986924555718e-01f, -8.2663333326778909e-01f }, { -9.3070618677151007e-01f, -8.9701706955868959e-02f, 3.5459779705243283e-01f }, { -1.8022520880778742e-01f, 8.3647832189971705e-01f, 5.1751607810967837e-01f }, { -1.4654413064652608e-01f, -8.9250347416792986e-01f, -4.2657047058045300e-01f }, { 1.9585849641001438e-01f, -9.4040939207530938e-01f, -2.7797414390650715e-01f }, { 7.1827742407924411e-01f, 4.8048189329783558e-01f, 5.0320442393823717e-01f }, { 2.8533524766793359e-02f, 1.6885628980012263e-01f, 9.8522758353556050e-01f }, { 2.6111165167057243e-01f, 8.9640662604461185e-01f, 3.5815620355534972e-01f }, { -3.5097050728768231e-01f, -4.1490136669388644e-01f, -8.3945015273676149e-01f }, { -1.2473164327147260e-01f, -9.9002108525365240e-01f, -6.5576428081883353e-02f }, { 5.1995973598003253e-01f, -8.2227505940403944e-01f, 2.3131277448869544e-01f }, { 9.9420868507157456e-01f, 9.8414160459491987e-02f, 4.3171096225414339e-02f }, { 2.0305122797076147e-01f, 6.4863682883720486e-01f, -7.3351241509301024e-01f }, { -8.9398659219873478e-01f, 1.8187215579453789e-01f, -4.0952471465778523e-01f }, { -8.9025638195660992e-02f, 1.3729413752812061e-01f, 9.8652154337564513e-01f }, { -4.7227166643745372e-01f, 6.3764146146309952e-01f, 6.0858264821106511e-01f }, { 4.4094319715353392e-01f, 1.3113467685037541e-01f, 8.8790359466068580e-01f }, { 8.8594528261932079e-02f, -9.5771807501824746e-01f, -2.7372814679054847e-01f }, { -6.8960524506287291e-01f, 4.9695404163924134e-01f, -5.2676492525622676e-01f }, { -4.3712744827569261e-01f, -8.2472071032562333e-01f, 3.5882494885944183e-01f }, { -9.3007095297473752e-01f, -2.3127523033079533e-01f, -2.8544665047623347e-01f }, { 9.6415585502258261e-01f, 2.6337816177256429e-01f, -3.2178115652997781e-02f }, { -2.2006970983318247e-01f, 5.9406850539845513e-01f, 7.7372600687038073e-01f }, { 7.2079713379935262e-01f, -1.9810868114781160e-01f, 6.6423222020654260e-01f }, { 8.7831231844838620e-01f, -4.3014002199895474e-01f, -2.0867925804104115e-01f }, { -6.3566245863891213e-01f, 6.0042469352476624e-01f, 4.8520451984995350e-01f }, { -6.4391406799480699e-01f, -6.0783416111500455e-01f, -4.6466364783571973e-01f }, { -8.7603715208248945e-01f, -3.0092253847781314e-01f, -3.7683488958331668e-01f }, { 4.5779593903463589e-01f, -8.0284073711713222e-01f, -3.8192882717676058e-01f }, { 3.0138927071417321e-01f, -1.1416114161721655e-01f, -9.4664235128322494e-01f }, { 5.0056070072691450e-01f, 2.3475341890001949e-01f, 8.3326455414984035e-01f }, { 7.2050337896066841e-01f, -5.8877015849933945e-01f, 3.6636673070425235e-01f }, { -7.7431902490855931e-01f, -3.3933470032164531e-01f, -5.3411797275721484e-01f }, { 3.7535881220457551e-01f, 9.2617678013598226e-01f, -3.6087865513417666e-02f }, { 1.0560958601834239e-01f, 7.6907745687892293e-01f, 6.3037011402959353e-01f }, { -2.2402869317095625e-01f, -9.4243303365858366e-01f, -2.4825616146471066e-01f }, { -6.6954445868970902e-01f, -4.7443722973700431e-01f, -5.7150637168572449e-01f }, { -7.8355675924502344e-01f, -4.2911190300921220e-01f, 4.4933481919082230e-01f }, { 8.0741189634026533e-01f, -1.8572180162482721e-01f, 5.5999414465639274e-01f }, { -8.1196437263296961e-01f, -4.1096727688570056e-01f, 4.1451146534673783e-01f }, { 7.8200488347263897e-01f, 5.6905703041549160e-01f, 2.5424881191393306e-01f }, { 4.3351994451279646e-01f, 7.3742014847158421e-01f, 5.1794978746763531e-01f }, { 8.0797770906504129e-01f, 5.8399854453145372e-01f, 7.8215865648545629e-02f }, { 5.5853100791414001e-01f, 7.3362334569805021e-01f, -3.8709159102880802e-01f }, { -3.0081831036415367e-02f, -3.6965831905204249e-02f, -9.9886365972191260e-01f }, { -5.9115285048384258e-01f, -7.7748419384756751e-01f, 2.1460809789480362e-01f }, { -5.3778016508788429e-01f, 5.4442432922175599e-01f, -6.4373491732971033e-01f }, { 4.2599060885662865e-01f, 6.9680836745858832e-01f, -5.7705294402303831e-01f }, { -5.6564920044256639e-01f, 4.3721502864852863e-01f, -6.9920240328716798e-01f }, { 3.3669503129567757e-01f, -9.4146989069299492e-01f, -1.6459064958950026e-02f }, { -1.7958605763110524e-01f, 2.0640472636047011e-01f, -9.6184506904208689e-01f }, { 8.4485345333787879e-03f, -9.9913307856313927e-01f, -4.0764121297805614e-02f }, { -9.4598796995531198e-02f, 4.2649127949760818e-01f, -8.9953113126755724e-01f }, { -6.0473895568601621e-01f, -7.8917942521082074e-01f, -1.0717569827020153e-01f }, { 5.0794192880033817e-01f, -5.1581156759645497e-01f, -6.8987928197640491e-01f }, { 2.5526790643881747e-01f, 9.5568859916773652e-01f, 1.4662058983359882e-01f }, { -7.7715314076279174e-01f, 1.0870567750541196e-01f, 6.1985165280139232e-01f }, { 4.2369939669702511e-01f, 3.5759750249507177e-01f, -8.3222764160286344e-01f }, { 5.8490779792819236e-01f, 6.2493626774815914e-01f, -5.1704693130874890e-01f }, { 7.9078916624273032e-01f, 3.7712801348742414e-01f, -4.8210678899612736e-01f }, { 8.3102853540071375e-01f, 4.6814611288671693e-01f, -3.0038440428690993e-01f }, { -7.0846840061482119e-01f, -6.8444937812178475e-01f, -1.7205107997039565e-01f }, { -5.5539474673632594e-01f, 3.5422695526421605e-01f, -7.5236954979712956e-01f }, { -5.8912766686409257e-01f, -7.8530854911970749e-01f, -1.9031309680305963e-01f }, { 5.9217541739912560e-01f, -7.2338378975326101e-01f, 3.5502699580508151e-01f }, { 3.4018377703106659e-02f, -9.9713923730081566e-01f, 6.7498825275677160e-02f }, { 9.5204576685230302e-01f, -1.6842107985092683e-01f, -2.5542748027660989e-01f }, { 1.6339162714850791e-01f, -9.2805748164294966e-01f, 3.3468266603502062e-01f }, { 8.3923811563713757e-01f, -3.8780654410690840e-01f, 3.8116331094385630e-01f }, { -8.4596691540837557e-02f, -6.7898576200334448e-01f, -7.2926108820989621e-01f }, { 1.8133169590235528e-02f, 9.9578365171144057e-01f, -8.9922784347684553e-02f }, { -9.1093304768806810e-02f, -4.9956244934967109e-01f, 8.6147511224994455e-01f }, { -3.1865350629593631e-01f, -9.3419155406862320e-01f, 1.6045586069744036e-01f }, { 1.0681808780952592e-01f, -9.8520474428220695e-01f, 1.3402055051576064e-01f }, { -1.2647420772711564e-02f, -8.4101718280732163e-01f, 5.4086055593899085e-01f }, { -3.9668110743385093e-01f, 7.6953518787941089e-01f, -5.0045948249628902e-01f }, { -8.8602490284673907e-01f, -8.3169591787248892e-02f, 4.5611697023611059e-01f }, { 1.1604018329282970e-01f, -8.9430423377937551e-01f, -4.3215114636623447e-01f }, { -8.8481601633701190e-01f, -4.1378283437432573e-01f, 2.1420640329049481e-01f }, { 9.3677905350872481e-01f, -2.6751079584853110e-01f, 2.2557255819754116e-01f }, { 4.9561649750438896e-01f, 8.3394438273075899e-01f, -2.4269539326755982e-01f }, { 7.4399686288802014e-01f, -4.8410482352232920e-01f, -4.6055530379662230e-01f }, { 2.6108443352785848e-02f, -4.6570563507937657e-01f, 8.8455447013793842e-01f }, { -2.3183538491958125e-01f, 9.6571127982474170e-01f, -1.1685066674370700e-01f }, { -7.0269535558563534e-01f, -7.0452815281065406e-01f, 9.9294104233760866e-02f }, { -9.2386536901636007e-01f, 2.5815694674861106e-01f, 2.8253808730452534e-01f }, { 6.2273469491145095e-01f, 7.2084540854731316e-01f, 3.0427519900543859e-01f }, { -9.5698870490333166e-01f, -2.6756936570235218e-01f, -1.1215727005007271e-01f }, { 7.5619207987534853e-01f, -1.5189367843294163e-01f, -6.3647611800122128e-01f }, { -8.4148409571184646e-01f, 3.7788153787338896e-01f, 3.8614771784701574e-01f }, { -3.9203305583765152e-01f, -2.5372903812554354e-01f, 8.8426899659689484e-01f }, { 7.4147244539766632e-01f, 6.1614174693681711e-01f, -2.6568394832517078e-01f }, { 3.1451324247212131e-01f, 9.0598427885402022e-01f, 2.8332650207672705e-01f }, { 3.0926681981322929e-01f, 5.5764842718443697e-01f, 7.7031309596899311e-01f }, { 9.7724656640912533e-01f, 2.0849574209597246e-01f, -3.8970167685355203e-02f }, { -1.8223027243102827e-01f, 9.4252778523965219e-01f, 2.8005981836198718e-01f }, { 1.6054370207074667e-01f, 9.8292210451950135e-01f, -8.9943627747461924e-02f }, { -4.1004751353540786e-01f, 4.5688626284081835e-01f, -7.8937695651113371e-01f }, { 4.5250052347378822e-01f, 4.9371040582448977e-01f, -7.4262595661380248e-01f }, { 6.1493436667501500e-01f, -6.8191247736878371e-03f, -7.8854880902789970e-01f }, { -9.9447142225320617e-01f, -2.4461441769378995e-02f, -1.0211869656555785e-01f }, { -3.2839023026443143e-01f, 2.8477221106913814e-01f, 9.0059127492423996e-01f }, { 4.2109574192479057e-02f, 9.6282667390832399e-01f, 2.6681750274665661e-01f }, { -3.3124125710840435e-01f, 3.4246088083021753e-01f, 8.7920405748053476e-01f }, { -4.2426915067285598e-01f, 3.0689730842193175e-01f, -8.5194467535791729e-01f }, { 8.3461972758811387e-01f, -4.2222373557011167e-01f, -3.5374712358118610e-01f }, { -4.4074422649735640e-01f, 1.3157512678972676e-02f, 8.9753629824612091e-01f }, { -1.2688019057022412e-01f, -1.2544910444518170e-01f, -9.8395322014553388e-01f }, { 7.8196647243335471e-01f, 2.3866789231085064e-02f, -6.2286339783449673e-01f }, { -7.5036832886570037e-01f, -3.8815600205187228e-01f, 5.3505353854208182e-01f }, { 1.7549983269949401e-01f, -6.8437583569600946e-01f, 7.0769310031809574e-01f }, { -5.1413689101510629e-01f, -8.3700665106739869e-01f, 1.8730489413322479e-01f }, { -9.8398998040750685e-01f, -1.7040012025398890e-01f, 5.2225640015806311e-02f }, { 1.7247700447991096e-01f, -4.5564583018995969e-01f, 8.7329179565374315e-01f }, { 8.7697341894079883e-01f, -1.7972189206456829e-01f, 4.4566541708328450e-01f }, { -3.9844663135514952e-01f, 8.1972521237294005e-01f, 4.1144970307666029e-01f }, { 2.2584397909829107e-01f, -8.2428506621640485e-01f, 5.1918072645049884e-01f }, { -1.7459954935065053e-01f, 6.1927844276620814e-01f, 7.6551238245479092e-01f }, { 3.6152684674413210e-01f, 5.7836759948716732e-02f, 9.3056609022781367e-01f }, { 2.1576671130612446e-01f, 1.1811163623693730e-01f, 9.6927517644762418e-01f }, { -2.7463698371980610e-01f, 4.8905415164695426e-01f, 8.2788922201594384e-01f }, { -3.3910253055319894e-01f, 8.3442207155179526e-01f, -4.3445285161870845e-01f }, { 4.8748955622498663e-01f, 4.2475235920908141e-02f, -8.7209505611775417e-01f }, { 4.1108225472112103e-01f, 6.3459144567183634e-01f, 6.5445020966726575e-01f }, { -7.1016494707573274e-01f, 2.7004920724033171e-01f, -6.5018395367295101e-01f }, { -6.6393981372412109e-03f, -4.0805070627157264e-01f, -9.1293512338152816e-01f }, { -3.1768418711753371e-01f, -7.5833569480851215e-01f, 5.6921325637652087e-01f }, { -1.8610021865539261e-01f, -9.8139983067692049e-01f, 4.7128345650222253e-02f }, { -9.2419295948511493e-01f, 2.5768387148753324e-01f, -2.8189784676960755e-01f }, { 8.5866680298477138e-01f, -4.9057371716802595e-01f, 1.4842085256411064e-01f }, { 6.7855983402132636e-01f, 8.3741129999257754e-03f, 7.3449739678532189e-01f }, { 8.8301041860407459e-01f, -4.0464160465124976e-01f, 2.3781878063331899e-01f }, { -9.4994020990891248e-01f, 2.5486155202642780e-01f, -1.8071852947855596e-01f }, { 8.2880496966697415e-01f, -5.5267209242600890e-01f, 8.7383525385412664e-02f }, { -6.5434051813628491e-01f, 5.0368500873079847e-01f, -5.6403891559447694e-01f }, { -6.2770810118318887e-01f, -5.2215055221188089e-01f, -5.7735720358701970e-01f }, { -7.5330180488469245e-01f, -2.5974508935330776e-01f, -6.0420930091674940e-01f }, { 5.0375055066520436e-01f, -7.1057756826746798e-01f, -4.9123813184604803e-01f }, { -1.0685567008417600e-01f, 4.4392485692118944e-01f, 8.8966993159169050e-01f }, { -4.7447879577526592e-01f, -8.1198972087785048e-01f, 3.3991552707748435e-01f }, { -5.6868112013883787e-01f, -4.6137477540363414e-01f, 6.8098098374248517e-01f }, { -5.4335386950751996e-01f, -8.1676703631943293e-01f, -1.9405715877847726e-01f }, { -2.7086636803553221e-01f, 6.4983352746622380e-01f, -7.1017448366443303e-01f }, { -4.4425792284556259e-01f, 7.5031916612242133e-01f, 4.8954677706864785e-01f }, { 1.9702342991422900e-01f, 6.2937611348220213e-01f, 7.5170970184165586e-01f }, { 7.7330815780838935e-01f, 5.7926651433219489e-01f, -2.5776888571048351e-01f }, { -1.1657911801592971e-01f, 7.6782234407801719e-01f, -6.2996679053515736e-01f }, { -3.7549431624581367e-02f, 2.7009065380933530e-02f, 9.9892970251760926e-01f }, { -3.4231485551169183e-01f, -1.2605629560927392e-01f, 9.3109094616652610e-01f }, { 7.0712864790742858e-01f, -1.7077044486049138e-02f, -7.0687866700037960e-01f }, { 4.9138014136002972e-01f, 3.9715656945503545e-02f, 8.7003920789260081e-01f }, { -2.1668475742131149e-01f, -9.6134093567721202e-01f, -1.6991562992417689e-01f }, { 7.2985733598999225e-01f, -4.5883399925454488e-01f, -5.0673427970650642e-01f }, { 4.6985359534922227e-01f, -5.2168013294617999e-01f, -7.1210072168666227e-01f }, { 6.2486378342258486e-01f, 6.1053338983036598e-01f, -4.8661507587522929e-01f }, { 9.6099188068914831e-01f, -2.7010624231561475e-01f, 5.9474558524398591e-02f }, { -5.3860795572131137e-01f, 2.4999454161299850e-01f, -8.0461431704725250e-01f }, { 6.7082770848504791e-01f, -7.1126322031745459e-01f, 2.0998765904772518e-01f }, { 2.1618327693382416e-01f, -2.0351417453728282e-01f, -9.5490668210907492e-01f }, { -6.7478860218213665e-01f, 7.3197869323956821e-01f, -9.4167590010428917e-02f }, { -6.2019998868108384e-01f, -7.0518722921304922e-01f, -3.4360288967761282e-01f }, { 2.8812171358545696e-01f, -3.7983677976506292e-01f, 8.7903919076357850e-01f }, { 9.0776792825864838e-01f, 7.8757761426413234e-02f, -4.1201286805159559e-01f }, { 8.6701366215196318e-01f, 4.8229424812242472e-01f, -1.2521808124175335e-01f }, { -6.9137494375667352e-01f, 6.5169047282855197e-01f, 3.1192982346988712e-01f }, { 6.1974230178940370e-01f, 7.6442225181711054e-01f, -1.7770227995056678e-01f }, { 7.0351765108760145e-01f, 1.3464311551478342e-01f, -6.9780666810561265e-01f }, { 8.6115808644037631e-02f, -5.7103783419055665e-01f, -8.1639442638013016e-01f }, { -4.5818287961893356e-01f, 8.1642897469377584e-01f, -3.5144299410369789e-01f }, { 3.4583816343935825e-01f, -6.7341148721482069e-01f, 6.5338574639795688e-01f }, { 4.6544447620953927e-01f, 8.5747211398868306e-01f, 2.1932399161470348e-01f }, { -2.8235929406266863e-01f, -7.7934328549448784e-01f, -5.5937221276274396e-01f }, { 1.9711355349480741e-01f, -2.1257518152379271e-01f, 9.5705696759846870e-01f }, { 4.8130460941869679e-02f, -9.8105025998623163e-01f, -1.8768016973156815e-01f }, { 1.0088805031694777e-01f, 7.2885868837256584e-01f, 6.7719023448885307e-01f }, { -6.6760741957553860e-01f, 7.4148196116014098e-01f, 6.7118064645829617e-02f }, { -2.1966632777054240e-01f, 2.3174325486672620e-01f, -9.4765065729285503e-01f }, { -3.1634865740570922e-02f, 1.8015589199949145e-01f, -9.8312923354330362e-01f }, { -4.2799290532838785e-01f, 6.9862271148066790e-01f, 5.7336583434310517e-01f }, { 8.3050695389067219e-01f, 5.5310951450055923e-01f, -6.5788027088465442e-02f }, { -8.6363876202749490e-01f, 2.7907183940249869e-01f, -4.1981781426723908e-01f }, { -7.2461274764504047e-01f, 1.7573533120457074e-01f, 6.6637336330072861e-01f }, { 9.2913163897875573e-01f, 1.6863893239200364e-01f, 3.2905213558087781e-01f }, { -5.2084537137929432e-01f, -7.3003435936448791e-01f, -4.4245896223270981e-01f }, { 8.8901616047309862e-01f, 3.6779136115459049e-01f, 2.7272656833855297e-01f }, { 4.2097516974507848e-01f, 7.4858928745722952e-01f, -5.1224406796211885e-01f }, { -1.9556055196416910e-01f, -6.8989217605207565e-01f, -6.9699702720858236e-01f }, { -9.2789161454220692e-01f, -3.1387304584857173e-01f, -2.0124826148813538e-01f }, { 9.9780291654171227e-01f, -2.2441671572638344e-03f, 6.6214072934860646e-02f }, { -1.1480314187026795e-01f, 4.8228661939250295e-01f, 8.6845832103312026e-01f }, { -5.9918767664660011e-01f, 6.1806194246356372e-01f, 5.0889445215389806e-01f }, { 4.0644744375860881e-01f, 5.7646308461068030e-01f, -7.0886584594211643e-01f }, { 1.0977611293646559e-01f, 6.4787681225005181e-02f, -9.9184260918254941e-01f }, { -6.6071069125916704e-01f, 1.6902164171805140e-01f, -7.3136384042880354e-01f }, { -3.4564947188434753e-01f, 4.1446687761190171e-01f, 8.4186914063214868e-01f }, { 4.8182900079699931e-01f, -8.0045193714318408e-01f, 3.5653542645113012e-01f }, { -6.1567757934592637e-01f, -8.9228317337647467e-02f, -7.8293002604053485e-01f }, { 1.5540939112074242e-01f, -3.4004898102305064e-01f, 9.2747755318210534e-01f }, { -6.0389515878452693e-01f, 1.7162480733624930e-01f, -7.7836724154052528e-01f }, { 9.9805526301597935e-01f, 4.7200372289670854e-02f, -4.0716296759662193e-02f }, { 9.6933686849671630e-01f, 2.7582232138638876e-02f, -2.4418283281842312e-01f }, { 5.1675004470929120e-01f, 8.5452779455250860e-01f, -5.2456073339235527e-02f }, { -2.9187700091672608e-01f, 3.4956085916285007e-01f, -8.9028929122908562e-01f }, { -1.3242142663834511e-01f, -9.3012228207157965e-01f, -3.4254504252874834e-01f }, { 4.6300164910291652e-01f, 7.6717980363690086e-01f, -4.4391961188893880e-01f }, { -1.1779128516414626e-01f, 8.3932496521283828e-01f, -5.3071538126367379e-01f }, { -2.9661395878012697e-01f, -3.0168053966452668e-01f, 9.0609547589892592e-01f }, { -1.0220083380765994e-01f, 3.2964672698010095e-01f, -9.3855635151030004e-01f }, { -2.8927558298767181e-01f, 5.4871007085511503e-01f, 7.8437038140748094e-01f }, { 5.4116222636759603e-01f, 7.9982407666019573e-01f, -2.5966303384874045e-01f }, { -7.3698912058356969e-01f, 5.9244874885002796e-01f, 3.2534829971507939e-01f }, { 3.3746044661037750e-01f, -2.7499599690420562e-01f, 9.0027642902621119e-01f }, { 4.6669623038818692e-01f, -3.8498100277063796e-01f, -7.9623128301214741e-01f }, { -7.4845137146145480e-01f, 5.5306731464004077e-01f, 3.6597416580179731e-01f }, { -4.3984616279930594e-01f, -8.8474489953865498e-01f, -1.5414868086059577e-01f }, { -2.5343574610044807e-02f, 6.5082655463737993e-01f, -7.5880333354883378e-01f }, { 9.6590239229951347e-01f, -2.5851428513897845e-01f, -1.4245452929265783e-02f }, { -7.3448063733119728e-01f, -6.7321613894991339e-01f, -8.5546616782482904e-02f }, { 1.4488127829543959e-01f, 6.3867153781629171e-01f, 7.5571693244418725e-01f }, { 7.3026958699768618e-01f, 6.0243699650689764e-01f, 3.2214281855409593e-01f }, { -8.2985359421796701e-01f, -3.5728562520716090e-01f, -4.2859070706660213e-01f }, { -1.4764464407380670e-01f, 9.2265428244903513e-01f, 3.5624448649035273e-01f }, { 8.6530680300360108e-01f, 4.1562656767754136e-01f, 2.8017618192179183e-01f }, { 2.9480406961255501e-01f, 4.8348973227997366e-01f, 8.2421370973778108e-01f }, { 6.4502468890840747e-01f, 1.7732431247953021e-01f, 7.4330292539601528e-01f }, { -2.8628912005622958e-01f, -8.9382031639653814e-01f, -3.4514313224258447e-01f }, { 1.9791236818414618e-01f, -9.7391956389027412e-01f, -1.1095664735166305e-01f }, { 3.3762225741277574e-01f, -7.0813528657333347e-01f, 6.2012549311345377e-01f }, { -4.1846609401338074e-02f, 5.3505317144383246e-01f, 8.4378134905288626e-01f }, { 5.3924209816757751e-01f, -4.5896344131828476e-01f, 7.0609526205541573e-01f }, { -7.7915265057219552e-01f, -6.2396096939331025e-01f, -5.9948776301795806e-02f }, { 9.8627109952470859e-01f, 9.1279489193177119e-02f, 1.3761312835247566e-01f }, { -2.8929833724538495e-01f, 4.4457513771829543e-01f, 8.4773782444209378e-01f }, { -7.0889986604723088e-01f, -1.2897615724121064e-01f, -6.9341627524994576e-01f }, { -6.7075343600098203e-01f, -7.0664559103710511e-01f, -2.2525948761527667e-01f }, { -8.2536629218346169e-01f, 2.7438187324580610e-01f, -4.9344206484798891e-01f }, { 2.8534736416365580e-01f, -6.6065214800195404e-01f, 6.9434546236384254e-01f }, { 3.2121849129383062e-01f, 3.7247855658004619e-01f, -8.7067698128465565e-01f }, { 8.7798776587914840e-01f, -1.2967239544867795e-01f, -4.6078471418347150e-01f }, { 5.0664856403987013e-01f, -8.5434263768736307e-01f, 1.1578380709640101e-01f }, { -5.7738520156129070e-01f, 7.8005047339174838e-01f, 2.4113810976147432e-01f }, { -7.4522809578989624e-01f, -6.5110429706061490e-01f, -1.4386896675297203e-01f }, { -2.8860770387708362e-01f, 8.1149162455319579e-01f, -5.0812098612713552e-01f }, { 8.3784555033261410e-01f, 5.1957811570683310e-01f, -1.6749153849187656e-01f }, { -9.6726218354773319e-01f, -9.7218100204061603e-02f, -2.3441951555104018e-01f }, { 2.5213745179499264e-01f, -5.5601351832377266e-01f, -7.9200736918512793e-01f }, { 5.6274407100501043e-02f, -6.9544050389248324e-01f, -7.1637678399795746e-01f }, { 9.2791025922455472e-01f, -3.1387360787965002e-01f, 2.0116140062753446e-01f }, { -5.1023335366558253e-01f, 8.0244385118104911e-01f, 3.0942816696108788e-01f }, { -5.8139182926563415e-01f, 4.3657981031979948e-01f, 6.8657236332690208e-01f }, { 5.8641394634953870e-01f, 8.0884216863908087e-01f, 4.3508961812355543e-02f }, { -5.1346774331405465e-01f, 7.5928902860239300e-01f, -3.9978875374378225e-01f }, { -6.8431055685723352e-01f, -1.7467819684668770e-01f, -7.0795945457358844e-01f }, { -3.9980121689887621e-01f, -1.5553080625043117e-01f, -9.0331011024634755e-01f }, { 4.3792623403269021e-01f, 7.1878688395258772e-01f, -5.3996854445761433e-01f }, { 7.0675603108970986e-01f, 6.5930911694263283e-01f, -2.5652953209064788e-01f }, { -8.1015649073784268e-01f, 5.7732059244438361e-01f, 1.0172214141970115e-01f }, { 4.9754074342315530e-01f, -8.5000407785116905e-01f, 1.7304992421355661e-01f }, { 3.5416109678233409e-01f, 7.8525816416828920e-01f, 5.0787747846600007e-01f }, { -9.8152656964210316e-01f, 2.0929746511374820e-02f, 1.9017765062586914e-01f }, { 4.3820229427686730e-01f, 4.5656058028138968e-01f, -7.7429399185555514e-01f }, { 6.2903110585332656e-01f, -7.1732610008313502e-01f, 2.9960496325738856e-01f }, { 2.7501339852175042e-02f, -5.2884478329737394e-01f, -8.4827287560400555e-01f }, { -9.0720106288928937e-01f, -3.4316321917031894e-01f, -2.4336235637667433e-01f }, { -7.1464754947042231e-01f, 5.7253349336116710e-01f, -4.0185106571412615e-01f }, { -8.6601169574216486e-01f, 8.3627672552544649e-02f, 4.9298088727781780e-01f }, { 3.5888041272150939e-01f, -3.0318915659259732e-01f, -8.8276904379883447e-01f }, { 6.6606208224988250e-01f, -5.0983228849889228e-01f, 5.4445600390934534e-01f }, { -8.3264544269165752e-01f, 6.8161540133546833e-02f, -5.4959582532206019e-01f }, { -8.1817102126571406e-01f, -8.5338469140004661e-02f, -5.6860665283292189e-01f }, { 1.7171189790900665e-01f, -1.1945966341577764e-01f, -9.7787750405307716e-01f }, { -6.1156025027909933e-01f, -2.8546948478343137e-01f, -7.3790326841398912e-01f }, { 1.2850701742454587e-01f, -8.1151648806260690e-01f, -5.7002362764641623e-01f }, { -4.0239829061669302e-01f, -7.2901824038136076e-01f, -5.5372197075791396e-01f }, { -6.1418287440143893e-01f, 1.3703745261006145e-01f, 7.7717445491609638e-01f }, { 1.8991178054003463e-01f, 8.6299002421909643e-01f, -4.6816848859191396e-01f }, { -4.8065060647540486e-01f, -4.0477718004129232e-01f, -7.7790129773168837e-01f }, { 3.8206533055977643e-01f, 7.5723092944485126e-01f, 5.2974277029171002e-01f }, { 2.9689069660514311e-01f, 8.9900444996059503e-01f, 3.2194240668225238e-01f }, { 6.3978462495583477e-01f, -7.2581912563733686e-01f, 2.5270977529405847e-01f }, { 6.8079384427980294e-01f, 6.7557178291086029e-01f, -2.8305919473737129e-01f }, { -5.4640222268130900e-01f, -7.4471347025443158e-01f, 3.8320550396690156e-01f }, { -8.0098239793974879e-01f, 3.1138044918613333e-01f, -5.1134080030380114e-01f }, { -6.8076598100807284e-01f, -6.3321928219599721e-01f, -3.6822685909273678e-01f }, { -1.1576856952600597e-02f, -9.5493093069670576e-01f, -2.9660224878079111e-01f }, { -2.6502058319599769e-01f, 7.8177557998039393e-01f, -5.6443868845851797e-01f }, { 9.0772257523529243e-01f, 2.5075009731856440e-01f, 3.3639874420535432e-01f }, { 4.7383230197350773e-01f, -7.5590991722317658e-01f, 4.5175562713721329e-01f }, { -9.1412774578157413e-02f, 1.1983588888820693e-01f, -9.8857628151716059e-01f }, { -4.8539141105763040e-01f, -8.2350674002804503e-01f, -2.9365256205227369e-01f }, { 6.7983898644871887e-01f, -5.4953717578170547e-01f, -4.8562109194128467e-01f }, { -8.2317739832092604e-02f, 5.1611273261834045e-01f, 8.5255582628832316e-01f }, { 8.5338589196422787e-01f, -2.8167869165572804e-02f, 5.2051809818976558e-01f }, { 4.3833156932075557e-01f, -8.6433851492186431e-01f, -2.4654485790514810e-01f }, { 3.0431124312739832e-01f, -8.8359519356120508e-01f, 3.5588509553196240e-01f }, { -5.1607838852432142e-01f, -7.4851604303271380e-01f, 4.1639744262037437e-01f }, { -9.5566058583965363e-01f, -2.2823218869932660e-01f, 1.8607233194143827e-01f }, { -2.2384069834577902e-01f, 2.8129670894186548e-01f, 9.3314923956597073e-01f }, { 4.0491070178591471e-01f, -7.6231977409585838e-01f, 5.0489195438398238e-01f }, { -8.2889269960063716e-01f, -5.5032480704513054e-01f, 1.0039670960498526e-01f }, { 7.7502242458178730e-02f, -5.3597903811735215e-01f, -8.4066632685789888e-01f }, { 6.1721355396276012e-01f, -5.2661318046633557e-02f, 7.8503134611698810e-01f }, { 1.9533306560910588e-01f, -8.4747665267976680e-01f, -4.9358719254296585e-01f }, { 6.1804664222322103e-01f, -7.8201523253475547e-01f, -8.0439568125481906e-02f }, { -9.3472583012815513e-01f, 1.4073267766579450e-01f, -3.2631569978817582e-01f }, { 5.6096832740114078e-01f, -6.5747502499743515e-01f, 5.0303193453039197e-01f }, { -4.4181131785995142e-01f, 6.6521515902849471e-01f, 6.0190659708093208e-01f }, { 1.8821563084270243e-01f, 7.4110666144008686e-01f, 6.4446550929868385e-01f }, { -6.7263928768529913e-01f, 6.4012557357094629e-02f, 7.3719656887618390e-01f }, { 5.6716784784280971e-01f, 1.6845695777078257e-01f, -8.0619035329875299e-01f }, { 4.9767232232166436e-01f, -8.1296105272079711e-01f, 3.0235175930372044e-01f }, { -8.1156643001844303e-02f, 9.9668424078671303e-01f, -5.8415292590613425e-03f }, { -3.3360893948251785e-01f, -8.7636766680330580e-01f, -3.4739716187539565e-01f }, { 2.5497334732500493e-01f, -9.5205820915171346e-01f, 1.6903774294729146e-01f }, { -2.8227840955328959e-01f, -9.1061316802360259e-01f, -3.0183200248165099e-01f }, { -4.5870188884960006e-01f, -6.0729952391273223e-01f, -6.4867547003195514e-01f }, { 1.1792553072167712e-01f, 8.6598784362767733e-01f, -4.8596154569378869e-01f }, { -6.2316151604627479e-01f, 6.7788395436789203e-02f, -7.7914983049668562e-01f }, { 6.5188514750859883e-01f, -3.0388990289763346e-01f, -6.9476375939923585e-01f }, { 8.9903514360414077e-02f, 9.2561813437070950e-01f, -3.6762539007763601e-01f }, { 2.8458360460808763e-01f, 9.2943044814608677e-01f, 2.3488553392499911e-01f }, { -2.9596651800765712e-02f, 6.8668594845813791e-01f, -7.2635146202945844e-01f }, { 8.4266266295953754e-02f, -4.9683455593985365e-01f, -8.6374453421633168e-01f }, { -4.4870033631735542e-02f, 1.2559589164557014e-01f, -9.9106627027845173e-01f }, { -6.6511305833396617e-01f, -4.6152530675872466e-01f, 5.8704259713831941e-01f }, { 3.9076301133641805e-01f, 8.5435246969325063e-01f, 3.4261658818617896e-01f }, { 5.2215399806431395e-01f, 3.2216369918095272e-01f, -7.8966179674307213e-01f }, { -3.3173921140033952e-01f, 8.2615047247877682e-01f, 4.5543879110433133e-01f }, { 1.1891768809531120e-01f, 7.5864839493342395e-01f, -6.4055538115217325e-01f }, { 5.2057206652746257e-01f, -3.5342767501711303e-01f, -7.7723458626294095e-01f }, { 8.6492631889204141e-01f, -3.5240368642022124e-01f, 3.5737110219672352e-01f }, { 7.4000051770116271e-01f, 1.8083762837067535e-01f, -6.4784024725798006e-01f }, { -3.8176306178088282e-01f, -2.7725155255201489e-01f, -8.8169639971317970e-01f }, { 6.7021722305018083e-01f, 2.0003584039049949e-01f, -7.1469891316985412e-01f }, { -1.6070224696525254e-01f, 1.0836974721972611e-01f, -9.8103556801364322e-01f }, { -7.7661622605009062e-01f, -4.3406328433618815e-02f, -6.2847683178270564e-01f }, { 2.4801488958986684e-01f, -4.7655679059453032e-01f, -8.4343478697523921e-01f }, { -2.8406538746623089e-01f, -3.0964445727150519e-01f, -9.0742887640007086e-01f }, { -3.3474520637020153e-02f, 8.9769143595567291e-01f, -4.3935127435796018e-01f }, { 8.1495866923971072e-01f, -5.7938084744144258e-01f, 1.2657055308226306e-02f }, { 1.5866103504801718e-01f, -9.6806942324357692e-01f, -1.9408314645620339e-01f }, { -1.2990007065719777e-01f, -6.4780554544230401e-02f, 9.8940863721527972e-01f }, { 7.6183270886663490e-01f, -6.3058991721036728e-01f, -1.4821362964838061e-01f }, { -4.8461032619933281e-01f, 5.5259144410537619e-01f, -6.7808224253589700e-01f }, { -4.7452618082606146e-01f, 6.8719233282121972e-01f, 5.5008326771713567e-01f }, { -6.5977282653740765e-01f, -5.8822313322879238e-01f, 4.6764662181752376e-01f }, { 4.8178205419180192e-01f, 3.2653375198779377e-01f, -8.1318002992664651e-01f }, { -7.0715183083234101e-01f, 7.0496534580674808e-01f, -5.4407254682077043e-02f }, { 3.6635444800695599e-01f, 7.9438970158585653e-01f, -4.8448882385443376e-01f }, { 3.6485576577024265e-01f, -9.1467228142384338e-01f, -1.7393932211869545e-01f }, { -1.3644015071123103e-01f, -9.7936737349097547e-01f, -1.4907593036867064e-01f }, { -3.1444120363733880e-01f, -5.8096336793656211e-01f, 7.5073849945963755e-01f }, { 7.9866046902752941e-01f, -4.4803639891942926e-01f, 4.0175221275810902e-01f }, { 1.0386092449494287e-01f, -2.3927806794028461e-01f, -9.6538019172024669e-01f }, { -2.5927022143281214e-01f, -1.3183171009019115e-01f, -9.5676504560569953e-01f }, { 8.4962403898900163e-01f, 5.9554777318633720e-02f, -5.2401547770132062e-01f }, { 8.1035165783300833e-01f, 5.4244281619558099e-01f, 2.2155356418957026e-01f }, { -5.2597474433504809e-01f, -5.8174536820502783e-02f, 8.4850827431876052e-01f }, { 9.1329224516832830e-01f, -2.8108326067537798e-01f, -2.9477020793067227e-01f }, { 5.8923405526886363e-01f, -7.9846095763571656e-01f, -1.2354483899728094e-01f }, { 5.9224135671391409e-01f, -2.3555792406543519e-01f, -7.7055995211770834e-01f }, { 8.9592176022746162e-01f, -1.4800028413110522e-01f, 4.1883184626773418e-01f }, { -6.5088018889377008e-01f, 6.3388549790547111e-01f, 4.1778481931580908e-01f }, { -3.5415399683340631e-01f, 7.5671633360445312e-01f, 5.4950462871859196e-01f }, { 7.6383788490563681e-02f, -4.5628814771018594e-01f, 8.8654759777184911e-01f }, { 8.9338764816010052e-02f, 4.2386827284174627e-01f, -9.0130698010128862e-01f }, { 7.7807958947443356e-01f, -1.9628951048322074e-01f, 5.9670979589542061e-01f }, { 8.8973628928067872e-01f, -4.5148267086721516e-01f, -6.7325577930340760e-02f }, { -6.1940916578952676e-01f, 6.5058975756484039e-01f, -4.3939191240582121e-01f }, { -2.4237023809569452e-01f, 3.5880443644030668e-01f, -9.0139671847427438e-01f }, { -2.7177275274048468e-01f, -7.4309395114601406e-01f, 6.1151529060037790e-01f }, { -8.2970754470155686e-02f, -5.6878027776054263e-01f, 8.1829386502239720e-01f }, { 2.3438858726040679e-01f, -7.7831932278262195e-01f, 5.8247834461486336e-01f }, { -6.1741143248628227e-01f, -3.8188171728639625e-01f, 6.8772776375367450e-01f }, { 7.4863777027236034e-01f, 5.7271679918844709e-01f, -3.3397149107216995e-01f }, { -7.2446581192403192e-01f, -2.5735532372682079e-01f, -6.3946659389112459e-01f }, { 9.3995700733261101e-01f, 2.2748646774198497e-01f, -2.5442234839061745e-01f }, { 2.9395946965780601e-02f, -8.9071790748958102e-01f, -4.5360499069054250e-01f }, { -1.4680772339304682e-01f, -2.3184902322697504e-01f, -9.6160985996444959e-01f }, { -7.5850231910657273e-01f, -4.6525094067270328e-01f, -4.5630668865699914e-01f }, { 1.2668025482315237e-01f, 8.2745471444831731e-01f, -5.4705649486611063e-01f }, { -1.4186929183264343e-01f, -8.0793903035023074e-01f, -5.7193323672578533e-01f }, { -1.3937532278184681e-01f, -9.4523574149795564e-01f, -2.9513371951416523e-01f }, { -6.2134999632770449e-01f, 7.7670746789580314e-01f, 1.0319734191562990e-01f }, { 6.6113539560695000e-01f, 1.0196260493042468e-01f, -7.4330586966029255e-01f }, { 4.5214630235898740e-01f, -6.4438677804825673e-01f, -6.1670852235045526e-01f }, { 1.3708320572508167e-01f, -9.9055218590162875e-01f, 3.8159813468865620e-03f }, { -9.8403393125715966e-01f, -6.9679735144246866e-03f, -1.7784450927616999e-01f }, { -2.4287785170074308e-01f, -8.6358699772204317e-01f, 4.4184595338042826e-01f }, { 2.5420625850459627e-01f, -8.9299626956063127e-01f, -3.7139849311472795e-01f }, { -4.0084286541078235e-01f, 6.6856730509992757e-01f, 6.2637269720246724e-01f }, { 4.4633735551614556e-01f, -2.8821307945849439e-01f, 8.4718131819575992e-01f }, { -7.6192065346504723e-01f, -3.1038404953148069e-01f, 5.6845286490599634e-01f }, { -2.6827337613108021e-01f, 8.9617523128618548e-01f, -3.5341102202447516e-01f }, { -9.1806520705884326e-02f, 8.7838317838326230e-01f, 4.6905709107655336e-01f }, { 2.5507538314171979e-01f, -2.1256864437740125e-01f, -9.4326619802824418e-01f }, { -6.7508180416868313e-01f, 7.0097508406922038e-01f, 2.2999671561677862e-01f }, { 3.5748004975158343e-01f, 5.0627727982030613e-01f, -7.8478744253928834e-01f }, { 3.8702089491939717e-01f, -1.2671093728655822e-01f, -9.1332314394618885e-01f }, { -2.4145223707328842e-01f, -4.4222207064249042e-01f, -8.6379422170385745e-01f }, { 3.1760913214642933e-01f, -2.3996392983779043e-02f, -9.4791804091965670e-01f }, { 9.6254163947110061e-02f, 3.8101421106089850e-01f, 9.1954516305208411e-01f }, { 4.7775547970391985e-01f, -8.7846643210053887e-01f, 6.8139038316259301e-03f }, { -8.4228242657950536e-01f, 8.2036896180296026e-02f, 5.3275722570458250e-01f }, { -8.4127219648162366e-01f, -5.0620814393828151e-01f, 1.8977462010907706e-01f }, { 8.3171619751905268e-01f, 2.6922263783360062e-01f, 4.8555878950171005e-01f }, { -8.9650177412172050e-01f, -2.8322349359995841e-01f, -3.4068903955020602e-01f }, { -4.5658554043680066e-01f, -5.5447325152834703e-01f, 6.9576508794536185e-01f }, { -9.9426243512082435e-01f, 1.0063610737239677e-01f, -3.6257192397368208e-02f }, { 6.5474324903178494e-01f, 2.4742959787486246e-01f, -7.1420576302826477e-01f }, { -8.0221367672832689e-01f, -3.2546332666607801e-02f, 5.9614927082063440e-01f }, { 8.7807870748400663e-01f, 3.2775837060833973e-01f, 3.4864341949817812e-01f }, { 5.7484912793151399e-01f, -7.8737504147637571e-01f, -2.2268593169855530e-01f }, { -7.5636890306068361e-01f, -4.8731859317558979e-01f, 4.3637904535866778e-01f }, { -3.2762026900159430e-01f, -9.2671134898888929e-01f, -1.8404085142846902e-01f }, { -2.8212305696985551e-01f, -4.1746111853761725e-01f, -8.6378978648471250e-01f }, { -7.4841079766276342e-01f, -6.3616717120380673e-01f, 1.8754361685840631e-01f }, { 8.6514863397933206e-01f, -2.7843706573499044e-01f, -4.1712185455641665e-01f }, { 4.5551844620875043e-01f, 8.6200553007554503e-01f, -2.2237223586307778e-01f }, { -9.7252167944189072e-01f, 1.8327994839534456e-01f, 1.4356198498113648e-01f }, { 5.3020475922122157e-01f, -7.6442172963407040e-01f, -3.6680012617558161e-01f }, { -7.1697226011979154e-01f, 3.6467503752185763e-02f, -6.9614718227455474e-01f }, { 6.8523417086574509e-03f, -2.1487356727943074e-01f, 9.7661783492711196e-01f }, { 2.5852171739101809e-01f, 5.5363192457050436e-01f, -7.9161746679413159e-01f }, { -2.3250517618819910e-01f, -9.1128047147056523e-01f, -3.3986651109233890e-01f }, { 3.1248959298836698e-01f, -2.1103545535160967e-01f, -9.2618264443818177e-01f }, { 2.3233189526232809e-01f, 4.2180059793888752e-01f, 8.7641665092706422e-01f }, { -8.6273167086803204e-01f, 4.4788194677012805e-01f, -2.3472500045511530e-01f }, { 1.8020453703763184e-01f, 7.9075701717727528e-02f, 9.8044548967747402e-01f }, { 1.6516219151518063e-01f, 9.8161223236006678e-01f, 9.5702015522083322e-02f }, { -4.3567459637462636e-01f, -8.9067894043150153e-01f, 1.2991794004533824e-01f }, { 5.0935657246997956e-01f, -5.9760854784511797e-01f, -6.1920909685184988e-01f }, { -4.8713616695526435e-01f, 6.5381594125757780e-01f, -5.7898451602922896e-01f }, { 9.8658663349738440e-01f, 1.5886190376812231e-01f, -3.7546106795053567e-02f }, { 6.7459337888798343e-01f, -4.7582052674997771e-01f, -5.6437452058351056e-01f }, { -4.6275593783366875e-01f, 1.4045949385201650e-01f, 8.7528742284264383e-01f }, { 7.6931300202142372e-01f, -4.4876906270620887e-01f, -4.5471291303258105e-01f }, { -2.0361382322375784e-01f, 3.3287423524484133e-01f, 9.2072588456193971e-01f }, { -3.0470242351442584e-01f, -6.6908819027992250e-01f, 6.7784764271359210e-01f }, { 9.4679195008933170e-01f, 1.1320422126506821e-01f, -3.0128028069193297e-01f }, { -2.6145632544440384e-01f, -6.8455336403913769e-02f, -9.6278474063673081e-01f }, { -5.0533595433569312e-01f, 8.0131391133560537e-01f, -3.2020554141936375e-01f }, { -5.4475779069654295e-01f, 7.9716122469718442e-01f, -2.6033234780700337e-01f }, { 5.4140614145366217e-01f, -1.6280391669731784e-01f, -8.2484803127865314e-01f }, { -1.7174404600610539e-03f, -3.4760049294046708e-01f, 9.3764116148226473e-01f }, { -4.0744979399471770e-01f, 6.6712541990279528e-01f, -6.2364119451266320e-01f }, { -4.2414645745408741e-01f, -5.6124659641285313e-01f, -7.1070531209787369e-01f }, { -8.5706713427659165e-01f, 5.1368572235814869e-01f, -3.9533605809460207e-02f }, { -8.8853548927979265e-01f, -4.5489376967702694e-01f, -5.9802530041323965e-02f }, { 4.5474586008302609e-01f, -9.6539539825724094e-02f, -8.8537354827642456e-01f }, { -7.3130226797777897e-01f, -6.3841801993985148e-01f, -2.4004046464426793e-01f }, { 6.1559262357241329e-01f, 7.6929976248777898e-01f, 1.7094910716198539e-01f }, { 1.1230581796549477e-01f, -1.2339389919154010e-01f, 9.8598242828835914e-01f }, { -6.9088806271960637e-02f, -9.8072713875635120e-01f, -1.8275944887938336e-01f }, { 7.0437464123024418e-01f, 5.5278332311060974e-01f, 4.4529424258860129e-01f }, { 1.2274514378318009e-01f, 2.1646464333549692e-01f, -9.6854359110123822e-01f }, { -1.9238519177119079e-01f, 7.0164441211446171e-01f, -6.8606344964275245e-01f }, { -5.5083824459936992e-01f, 3.0942662333532112e-01f, 7.7513379042458608e-01f }, { -4.4456699265567678e-01f, -4.2981321744873124e-02f, -8.9471380620964558e-01f }, { -5.7784445900305112e-02f, 3.4384831170039698e-01f, -9.3724559020183251e-01f }, { 4.7087586348099708e-01f, -8.7344427144035452e-01f, 1.2397994143833795e-01f }, { 2.6154737056366700e-01f, -9.1579152230360616e-01f, -3.0482595136909751e-01f }, { -1.1014673263301357e-01f, 8.0823367837382065e-01f, -5.7846868405523466e-01f }, { -4.4859840729950595e-01f, -3.4678415309303728e-01f, 8.2371124803045603e-01f }, { 7.3404526504828305e-01f, 5.5065663851742486e-01f, 3.9743529701938396e-01f }, { -3.9461593005270973e-01f, -8.7838080641675442e-01f, -2.6967652227675831e-01f }, { -6.3645277537128053e-01f, 7.4405876657451231e-01f, -2.0323488038673321e-01f }, { -3.6224497089113844e-01f, -7.2106865895929984e-01f, -5.9062557524265347e-01f }, { -2.0394638281391309e-01f, 8.0014671310967711e-01f, -5.6406658333648951e-01f }, { -2.5448574568658566e-01f, -5.0865453633589253e-01f, 8.2250080115903879e-01f }, { -4.3195770428057761e-01f, 3.1244511358164345e-01f, 8.4604408437835377e-01f }, { -6.6703283101913691e-01f, 4.9698677816086623e-01f, 5.5504175038989412e-01f }, { 2.5459855936874415e-01f, 8.1468164970857837e-01f, -5.2103107699586337e-01f }, { -1.5105341557296234e-01f, -9.8362432019694479e-01f, 9.8316134794041526e-02f }, { 3.3650705802147707e-01f, -7.1961721847686211e-01f, -6.0738295890924898e-01f }, { 6.1793465512404799e-01f, -2.8754848630073720e-01f, -7.3175995382562342e-01f }, { -9.1763233245040521e-01f, -6.1993160713416103e-02f, 3.9256560020764608e-01f }, { 1.6168008629653743e-01f, 5.3125336133593903e-01f, 8.3164260097977805e-01f }, { -6.9998302033532234e-01f, -5.0270781827226441e-01f, 5.0725597156680147e-01f }, { 1.8177885626296947e-01f, 7.0546461405286509e-01f, 6.8503731703825366e-01f }, { -6.9077203025888412e-01f, 4.6150349455747353e-01f, -5.5664039264435294e-01f }, { 5.7459220995570559e-01f, -8.0001804732050141e-01f, -1.7266996328171957e-01f }, { -8.9861438866100352e-01f, 4.0807424805275716e-01f, -1.6114462003922927e-01f }, { 3.9552476215954413e-01f, -2.6495788079858745e-01f, 8.7940746182947382e-01f }, { -4.4305881303890471e-01f, 4.2162103499382014e-01f, -7.9116028151019868e-01f }, { -2.8858648195791808e-01f, -9.5174227653474630e-01f, 1.0442452531666417e-01f }, { -8.3976612634562120e-01f, -4.8272445306570999e-01f, 2.4853562210452090e-01f }, { 7.1244744796939474e-01f, 5.6061765267470864e-01f, -4.2205033040076684e-01f }, { -7.1493528243627946e-01f, 3.8172660644554002e-01f, -5.8579206196339750e-01f }, { 8.6944117392309783e-01f, -4.6056308436857507e-01f, -1.7875595208028852e-01f }, { 8.9706452388484936e-01f, 3.2316069781674983e-01f, -3.0140073552305735e-01f }, { -5.3631657937918664e-01f, 5.1306688596811589e-01f, -6.7016930488197446e-01f }, { 2.3270852124078433e-02f, 6.0922017421341979e-01f, 7.9265960334357255e-01f }, { 1.7357060642774083e-01f, 9.7448247739322436e-01f, -1.4232760040789735e-01f }, { -5.8226605511602936e-01f, 7.3488108407160868e-01f, 3.4772982807540992e-01f }, { 7.3280571427803265e-01f, -4.1559691874412424e-01f, -5.3877173854226268e-01f }, { -9.9827261106147114e-01f, -3.9231087998143899e-03f, -5.8620842896171713e-02f }, { 1.5515673381330186e-01f, -3.9151645725794360e-01f, -9.0699572857239907e-01f }, { -6.2525210006591692e-01f, 7.8034386353950502e-01f, 1.1102522208896485e-02f }, { -8.5082564226133428e-01f, 2.5050440413788500e-01f, -4.6189097195995416e-01f }, { 8.6536791406587699e-01f, -2.7224969352196204e-01f, 4.2073563871209035e-01f }, { 5.7072816117779701e-01f, 6.7674949961367303e-01f, 4.6505857782784055e-01f }, { 8.7407403241436221e-01f, 4.2599829837349257e-01f, -2.3349525828544182e-01f }, { -2.4161101353649667e-01f, -9.6388366320381413e-01f, 1.1203750241175187e-01f }, { 7.9021164049314707e-01f, -4.2215069922161180e-01f, 4.4424582201280566e-01f }, { 7.5897053184144281e-01f, 6.0972259942656037e-01f, 2.2847775284441943e-01f }, { -5.5701051201392071e-01f, -8.0895308410916000e-01f, 1.8797392695868259e-01f }, { 3.1245839332487518e-01f, 4.1843499184510846e-01f, -8.5280824928023624e-01f }, { -2.7388330866188937e-01f, -9.2722468745965436e-01f, -2.5542574694373027e-01f }, { -2.0364584962678914e-01f, -2.8317632702886836e-01f, -9.3719770365714328e-01f }, { 9.5070223078684912e-01f, 2.5859250435899533e-01f, -1.7115836253672126e-01f }, { 3.3774441484559736e-01f, -8.8699836396519460e-01f, 3.1490095675255303e-01f }, { 9.8831829902415935e-01f, -1.2234696465629953e-01f, 9.0874419136425882e-02f }, { -2.7915605167115576e-01f, 6.5233393199321504e-02f, 9.5802740212745152e-01f }, { -5.9146048265978335e-01f, 7.9498713146122246e-01f, -1.3479598756236424e-01f }, { 7.6003989425771956e-01f, 2.2048064315845833e-01f, 6.1133267958546689e-01f }, { 1.4428208749310262e-01f, 9.7246079876815827e-01f, 1.8303735708272306e-01f }, { -2.2459641056415169e-01f, -2.1015224358870052e-01f, -9.5152114368327856e-01f }, { -8.0021534359595381e-01f, -5.9959047446179847e-01f, -1.2110607263265377e-02f }, { -4.3144963764819314e-02f, 9.8428610633879943e-01f, -1.7122900738524968e-01f }, { -4.1123677948553111e-01f, -6.9659489181775358e-01f, -5.8791144562066555e-01f }, { 7.7564318725672265e-01f, 3.1549194701133748e-01f, -5.4666486756808130e-01f }, { 9.1735642807657103e-01f, -3.8445139388607580e-01f, -1.0321971519844646e-01f }, { 4.5019303614436645e-01f, 2.4131580779385212e-01f, 8.5970513033011375e-01f }, { -5.0746931811325380e-01f, 7.8255407188147419e-01f, -3.6067161761828959e-01f }, { -4.1856206125028839e-01f, -7.9441991755429997e-01f, -4.4011679753780031e-01f }, { -9.6018621574111818e-01f, 8.2530640692840704e-02f, -2.6689159680960350e-01f }, { -9.9027116439350460e-01f, -1.3897984412382863e-01f, -6.9010070315108389e-03f }, { -5.3791934829197718e-01f, 5.6423153976876261e-01f, 6.2632702661094375e-01f }, { 1.2231017846007808e-01f, -8.4417794702889803e-01f, -5.2192318783048786e-01f }, { -4.4504365904355046e-02f, 2.9968847150727435e-01f, -9.5299852122712392e-01f }, { -4.7134863463446203e-01f, -7.6756321379298087e-01f, -4.3436986251352533e-01f }, { 7.9511921023429855e-01f, -4.4213303441485563e-01f, -4.1509495467362334e-01f }, { -4.1774295872867895e-01f, 6.3044689629078821e-01f, 6.5423813049219426e-01f }, { 3.0716920095057815e-01f, -6.6752376716071382e-01f, -6.7827656767940347e-01f }, { 2.1132533161398459e-01f, -7.3001482243089011e-01f, 6.4993843035277998e-01f }, { 5.0438487382876940e-01f, 4.3504855243966262e-01f, 7.4587442379591662e-01f }, { 5.5622535013570429e-01f, 8.2536927075204969e-01f, 9.6844859257695856e-02f }, { -2.1822854670522782e-01f, 1.6830054954224632e-01f, -9.6127583264466920e-01f }, { -3.6131368784140055e-01f, -9.3220793787596457e-01f, 2.0994750284032998e-02f }, { -4.8411041063583132e-01f, -7.4812618313611290e-01f, 4.5381089059232371e-01f }, { -3.6195778765753717e-01f, -7.9801057427416067e-01f, 4.8183574307089899e-01f }, { 5.9919067168062601e-01f, 3.6837399020484482e-02f, 7.9975842915490791e-01f }, { 6.2220238343021750e-01f, 6.7033853870168691e-01f, 4.0436423875640121e-01f }, { 6.2248011965588497e-02f, -4.9992620347604155e-01f, 8.6382809405828165e-01f }, { 1.0553170423621962e-01f, -1.5520109409493199e-01f, -9.8222995260414203e-01f }, { 7.9781759071179455e-03f, -7.4623126280325858e-01f, 6.6563897957094498e-01f }, { 3.4116368704980232e-01f, -1.3088299558980143e-01f, -9.3084745264947932e-01f }, { 8.7449069045257100e-01f, -4.8496813549583118e-01f, -8.4817371736329913e-03f }, { 1.7655269835317872e-01f, 9.1733328344289344e-01f, 3.5683160144820614e-01f }, { -8.5346343314576911e-01f, -3.5342067069910957e-02f, 5.1995298496908660e-01f }, { 2.0917168610536852e-01f, -8.8886677582238727e-01f, -4.0763103484763169e-01f }, { -9.6215249585815166e-01f, -9.7228510243527785e-02f, 2.5457649441720592e-01f }, { -4.3298662428366375e-01f, -4.4568744186490383e-01f, 7.8350831990180891e-01f }, { -8.8302859637872477e-01f, -3.5898099146701123e-01f, 3.0231299301019243e-01f }, { -1.1371728957288824e-01f, -8.3556314462539272e-01f, 5.3749661338088539e-01f }, { 9.3011334857619554e-01f, 3.6721517435077139e-01f, -6.4941917825998077e-03f }, { -9.7500184040952631e-01f, 1.2174595506132617e-01f, -1.8587451042098807e-01f }, { 6.2712948459435092e-02f, 6.3930402448177737e-01f, 7.6639249107551111e-01f }, { -5.1777567689921011e-01f, 7.5178610433716897e-01f, 4.0832095432038268e-01f }, { -6.8768217256823527e-01f, -2.6239997414415089e-01f, 6.7693388384758879e-01f }, { 4.4514371003617154e-03f, -2.5152892220656786e-01f, -9.6783954558663488e-01f }, { -5.1889581169016130e-01f, 3.4567399805759713e-01f, -7.8182902458100456e-01f }, { -9.9684751878572253e-01f, -1.1508111741510944e-02f, 7.8502150638652429e-02f }, { 4.7549246765014586e-01f, 4.8699534439253023e-01f, 7.3262708641434759e-01f }, { 1.8247045274005411e-01f, 8.2137864657830228e-01f, -5.4040878307262552e-01f }, { -2.2121505398281988e-01f, 7.9162688409286286e-01f, 5.6955313735665014e-01f }, { -9.1409310971055302e-01f, 3.1469200144459281e-01f, 2.5573957653536422e-01f }, { 4.3576102495649686e-02f, 9.1060132579674802e-01f, 4.1098217570655488e-01f }, { -3.0754923425874013e-02f, 6.2933315440023085e-01f, 7.7652682854987298e-01f }, { 5.8895390793633573e-01f, -5.6700554168699546e-01f, 5.7588020457622513e-01f }, { -6.9791830315487191e-01f, -3.8308015131965217e-01f, -6.0511126231986190e-01f }, { 3.5096709655746383e-01f, -1.7397705993965540e-01f, -9.2008373518325892e-01f }, { -5.3962654226964224e-01f, -4.5779043414726123e-01f, -7.0656288699688441e-01f }, { 1.8979406137643536e-02f, 8.9561541174034409e-01f, 4.4442414020374305e-01f }, { 5.2174367392035381e-01f, 4.0337296500998343e-01f, -7.5171390157635520e-01f }, { -7.6908743680328329e-01f, -2.0979569284873664e-01f, -6.0373030552844897e-01f }, { -9.4002807550678913e-01f, 3.3485280008429263e-01f, -6.4967834616147344e-02f }, { -3.7291130422886160e-01f, -9.2303214690407376e-01f, -9.4598176303699419e-02f }, { -1.1316694004232535e-02f, -5.5886050701002610e-01f, -8.2918445845379374e-01f }, { -8.1980648043774851e-01f, 5.7118924329103937e-01f, -4.0745343057596035e-02f }, { -5.2125222445133035e-01f, -2.3361357587363546e-01f, -8.2080498029195281e-01f }, { 2.5042709518219891e-01f, 7.2555443543963671e-01f, -6.4098130332520309e-01f }, { 8.4259495608886037e-01f, -2.9816459818689389e-01f, 4.4847699200924418e-01f }, { -9.4061073789365945e-01f, 7.1637301785607895e-03f, -3.3941143282021913e-01f }, { -1.6537814314391772e-01f, 8.9932533658037883e-01f, -4.0480119658278957e-01f }, { 6.4892560857179371e-02f, 7.5140785854820469e-01f, 6.5663931169051892e-01f }, { 2.5911770654728705e-01f, -1.0192672872568016e-01f, 9.6045247468313377e-01f }, { -1.2622328921756709e-01f, -3.4132900035022584e-01f, 9.3143018781818210e-01f }, { -2.1595285808832948e-01f, -9.6423117179370499e-01f, 1.5369648800418489e-01f }, { -4.1292026858460112e-01f, -7.5103473054981618e-01f, -5.1521227207820441e-01f }, { 1.3611029636863578e-01f, -9.0764012520289883e-01f, -3.9706849578392434e-01f }, { -8.3097396804625767e-01f, -4.1708853839841398e-01f, 3.6812961788768339e-01f }, { -9.9131698152702841e-01f, -4.7185923703500273e-03f, 1.3140919687062899e-01f }, { 5.6708229811497202e-01f, -5.5664708294054865e-01f, -6.0709282010119336e-01f }, { -2.8860957964470041e-01f, 2.2586074989137470e-01f, 9.3042540388567163e-01f }, { 4.2433617650639695e-02f, 9.4057393271843193e-01f, -3.3692738859235238e-01f }, { -1.0107655050197416e-01f, 6.9659244403425657e-01f, -7.1031154985189637e-01f }, { 7.9507752367308349e-01f, -5.2049552353865702e-01f, -3.1134569424692021e-01f }, { -1.8940909856549853e-01f, -5.9776331039257002e-01f, -7.7897574938448588e-01f }, { 4.9024716298238991e-01f, -6.9484699274761874e-01f, 5.2616097903332659e-01f }, { -5.8581428521276169e-01f, 5.5257729400280498e-01f, 5.9285745115769517e-01f }, { -6.5987665860386457e-01f, -7.2782547105320272e-01f, 1.8663568553731175e-01f }, { 5.6154056654011320e-01f, 1.0586564208993111e-01f, -8.2064892490924235e-01f }, { 6.8504581640584172e-01f, -4.1447253469997625e-01f, -5.9910328609032915e-01f }, { -8.1820730050771751e-01f, 1.3924764219752422e-01f, 5.5780543878515909e-01f }, { -9.5086798486887492e-01f, -8.6971477653757581e-02f, -2.9712966433213439e-01f }, { 9.7265062063153843e-02f, -6.8003571785432737e-01f, 7.2669865153597235e-01f }, { -3.8172685301088005e-01f, 5.7364285740145560e-01f, -7.2471958842210360e-01f }, { -6.1316408608320827e-01f, -6.6975460484219751e-01f, 4.1887775404098021e-01f }, { -3.6079174393726704e-01f, 6.8618881636148643e-01f, -6.3164406575786625e-01f }, { -3.6167876217630041e-01f, 9.0811533517224075e-01f, -2.1098580761659794e-01f }, { -5.1708089748172403e-01f, -7.8888560271841757e-01f, -3.3209464205719086e-01f }, { -4.8768723107783074e-01f, 1.7806310630671981e-01f, 8.5466642312427388e-01f }, { 6.0855504589322440e-01f, 4.1766061700468787e-01f, 6.7470020388403551e-01f }, { 1.1191332820412471e-01f, 9.6945290249758720e-01f, 2.1825782187422166e-01f }, { 6.7608448797938847e-01f, -1.4768627630043152e-01f, 7.2187154598734582e-01f }, { -2.1480715104765519e-01f, -8.1969868622745656e-01f, -5.3099147983350126e-01f }, { -3.0214438800626781e-01f, -4.5179984145661872e-01f, -8.3939601622600768e-01f }, { -4.4611855901960951e-01f, 8.3685080215114416e-01f, 3.1726797228408310e-01f }, { 9.9289082569083231e-01f, 7.7120297911436195e-02f, 9.0665693120543858e-02f }, { -9.1579742917107665e-01f, -4.0099942606626204e-01f, 2.2683232092788601e-02f }, { 8.5954973292645165e-01f, 2.1539400290065200e-01f, -4.6344328686528569e-01f }, { -7.1150729841416405e-02f, 7.0781091593431600e-01f, 7.0280956234762371e-01f }, { 2.6982092127754792e-01f, 7.0351205040495124e-01f, 6.5747050532777263e-01f }, { -2.4703089573852730e-01f, 1.1598367070168006e-01f, -9.6204133210646681e-01f }, { 1.5614737664936149e-01f, -9.8393598730858167e-01f, -8.6533055213652704e-02f }, { -3.4945845325596309e-01f, -3.3196936217778550e-01f, 8.7617072082056258e-01f }, { -4.5918944679879825e-01f, 8.8615721161959649e-01f, -6.2212926656726918e-02f }, { -2.1758802819439088e-01f, 6.3525832503892066e-01f, 7.4101437938492254e-01f }, { 8.6539584169379091e-01f, 4.9311927619511081e-01f, 8.9013575503432127e-02f }, { 4.3765477823557897e-01f, 8.7921572111567392e-01f, -1.8824986276385877e-01f }, { -3.7080618286476970e-02f, -3.3286564306663230e-01f, -9.4224492113957814e-01f }, { 8.4305302581711228e-01f, 5.3609277951297973e-01f, 4.3198696909274352e-02f }, { 5.5133669750809267e-01f, -2.9708161881342043e-01f, 7.7959627868792924e-01f }, { -5.1993496072795697e-01f, 2.9480424758864343e-01f, 8.0172195443090588e-01f }, { 7.8572166278145894e-01f, 4.1648529521901523e-01f, -4.5736360535384663e-01f }, { -6.2885131501172331e-01f, -2.0022381261350744e-01f, -7.5130316681785481e-01f }, { 2.1830150111253430e-02f, -3.5065044000237633e-02f, -9.9914657945437690e-01f }, { -6.0272195563754316e-01f, 7.1619557892186103e-01f, -3.5183822550319344e-01f }, { 2.1151084794987837e-01f, -9.7498994572816144e-01f, 6.8247834606824265e-02f }, { -2.1092002212016672e-01f, -6.9760505368869363e-01f, 6.8473347613273827e-01f }, { -8.0378844539264305e-01f, -4.9049989930000576e-01f, 3.3665113075699338e-01f }, { -4.1518693412506830e-01f, 3.6681543175395159e-01f, 8.3250600523899432e-01f }, { -6.6950582536443193e-01f, 5.3335344594068324e-01f, 5.1700681959360018e-01f }, { -7.3505854443420493e-01f, 2.8430979188343303e-01f, -6.1551350796994453e-01f }, { -3.3623860787078680e-01f, 1.4833540260771111e-01f, 9.3002161636723457e-01f }, { 1.5991492758858566e-01f, 9.2776088026529202e-01f, -3.3717497680537911e-01f }, { -9.7204827249167147e-01f, 1.1177818109394991e-01f, 2.0646499504101257e-01f }, { 8.6116957912095227e-01f, 2.0832441569666194e-01f, 4.6366787016277750e-01f }, { -5.9257906831905183e-01f, -2.4371786613567745e-01f, 7.6775754604979074e-01f }, { 9.0720690999168496e-01f, 2.5269059814347378e-01f, -3.3633775297048085e-01f }, { 6.8739596905883826e-01f, -7.2575250354583098e-01f, -2.7750411143244544e-02f }, { 4.9055555269204393e-01f, -5.6051713151732807e-01f, -6.6721495411792875e-01f }, { -5.6718340540072587e-01f, 8.2337866210612243e-01f, -1.8723339081685005e-02f }, { 9.8732316702287037e-01f, -1.5512410765656021e-01f, -3.3607664061714594e-02f }, { 6.8112847058895032e-01f, -1.3726605079204293e-01f, -7.1918150549990767e-01f }, { 9.7597510799722142e-01f, -6.7900373039466916e-02f, 2.0703170750132324e-01f }, { 3.3244264194714068e-01f, 4.5814462766726771e-01f, 8.2436969252564463e-01f }, { 9.9582098396610041e-01f, -3.5135689860504256e-02f, -8.4297397295609894e-02f }, { 2.2409079355436800e-02f, 7.4333423931754294e-01f, -6.6854471938730575e-01f }, { -5.3732245001771983e-01f, 7.2932467695184811e-01f, -4.2352107420533092e-01f }, { 4.6197996472629628e-02f, 4.3659386468135469e-01f, -8.9847178166290442e-01f }, { -2.9321959906795713e-02f, -4.7609555385475305e-01f, -8.7890457176360182e-01f }, { 6.8083967816874896e-02f, 3.2525768146425532e-01f, -9.4317125378947364e-01f }, { -9.3309634144280995e-01f, 3.4757798403697882e-01f, 9.2307976897083560e-02f }, { -3.1428638492042291e-02f, 9.9411045196472325e-01f, 1.0371427084557958e-01f }, { -5.5250374653130863e-01f, 7.5705731780970520e-01f, -3.4871740366612392e-01f }, { 6.6797234223042357e-01f, -5.5213925672006314e-01f, 4.9895409729134221e-01f }, { 9.4519770168971695e-01f, 5.2988666621994210e-02f, 3.2216999539078750e-01f }, { 3.0579797856547625e-01f, 2.9847554895868422e-01f, 9.0410173264908666e-01f }, { -7.9149399950405808e-01f, 6.0981557431079869e-01f, -4.0770259712942375e-02f }, { 5.4223521651616002e-01f, -8.3911557549766225e-01f, 4.3197464357297356e-02f }, { 1.4618423453272172e-01f, 7.6284490330643595e-01f, 6.2983952168268742e-01f }, { 9.2055162024514625e-01f, -3.6078076280160071e-01f, 1.4973962620606152e-01f }, { 8.3906912010386570e-01f, -1.4650478310952042e-01f, 5.2392686532965349e-01f }, { -3.5857180246388615e-01f, 3.6963332280165934e-01f, 8.5720328344705032e-01f }, { 8.1386050755263994e-01f, -9.9693902396757406e-02f, -5.7244405846428792e-01f }, { 7.0658242875124710e-01f, 6.8165668871669505e-01f, 1.8996165430891418e-01f }, { 1.1332832340712148e-01f, -9.8846111869454656e-01f, -1.0050526325947519e-01f }, { -8.6090793350532857e-01f, -4.3491589995253171e-01f, 2.6398047275520981e-01f }, { -5.5101748802402295e-01f, -5.5945998068438951e-01f, -6.1918031130222329e-01f }, { -9.2395138352065420e-01f, 6.1851894713895739e-02f, 3.7747607077875828e-01f }, { 6.5329433036525983e-02f, 2.8589478835236587e-01f, -9.5603150323202324e-01f }, { 5.3660734179796676e-01f, 6.4699745577463730e-01f, -5.4170734991290859e-01f }, { -3.7550936302463733e-01f, -3.6145826624052552e-01f, 8.5342875510919158e-01f }, { 2.7716197838367113e-01f, -7.7113298089868598e-01f, 5.7317987011823457e-01f }, { -3.9543959394974704e-01f, -9.1525341369706570e-01f, 7.7063066722828297e-02f }, { -5.4945545087746461e-01f, 7.9729944081960671e-02f, -8.3171019202467966e-01f }, { 7.5339704407495478e-01f, -3.2545789714672602e-01f, -5.7137557802548034e-01f }, { -1.7095235413629473e-01f, -1.2457390907112284e-01f, -9.7737231073629183e-01f }, { 2.3267457046834892e-02f, 3.1135744690528661e-01f, 9.5000798191341285e-01f }, { -2.6695894715294383e-01f, -6.6213453398712252e-01f, 7.0022195012484989e-01f }, { -4.4648996933631779e-01f, 8.7773521483690331e-01f, -1.7386086367342474e-01f }, { -3.9185652049850118e-02f, -2.1679142291133269e-01f, 9.7543116806133878e-01f }, { 8.1230891404214756e-01f, -8.7591398014060351e-02f, 5.7661250000464737e-01f }, { -1.1649699518247636e-01f, 9.9190646180780573e-01f, -5.0497733982567204e-02f }, { 6.5877949626656396e-01f, -2.5796467404141588e-01f, -7.0672753041428804e-01f }, { -2.3824659797070849e-01f, -7.8934971934432363e-01f, -5.6583175867604074e-01f }, { 6.4526818608779446e-01f, 3.8388950254126980e-01f, 6.6049815886312946e-01f }, { 4.1576933941273507e-02f, 9.2253373546690398e-01f, -3.8367025619602513e-01f }, { 7.9859046103161568e-01f, -3.7521917301681512e-01f, 4.7059945574754852e-01f }, { -7.5510096177079211e-01f, 9.7882600783016152e-02f, -6.4826039058142171e-01f }, { 6.5465693725316620e-01f, -6.3253967217557716e-01f, 4.1390561439815898e-01f }, { 7.1368405545938415e-03f, -4.4589472754412740e-01f, -8.9505695765981663e-01f }, { 8.8128644641121190e-01f, 8.2942273824435336e-02f, 4.6524700814162201e-01f }, { 8.3040158372972475e-02f, -6.6899847431160198e-01f, -7.3861043417091021e-01f }, { -1.2777104587717900e-01f, -2.4883988234434437e-01f, 9.6007982625941302e-01f }, { 6.8578421665345535e-01f, -7.1089613399678553e-01f, 1.5597017297365198e-01f }, { -7.9702214347599476e-01f, -3.8907852118597691e-01f, -4.6192381099123264e-01f }, { -7.1395341798445533e-01f, -6.8916623056342141e-01f, -1.2377569874300309e-01f }, { 3.6017800536687344e-01f, 2.6402261927762993e-01f, 8.9474234333673963e-01f }, { 2.7842117004434686e-01f, 9.6045907528325580e-01f, 1.2952671507957035e-04 }, { 4.5955974774191005e-01f, 7.5823021036790089e-02f, -8.8490434948430807e-01f }, { -8.6872152112579470e-01f, 3.3870434194961735e-01f, 3.6138938484322164e-01f }, { -5.4544788880143169e-01f, 8.3520663996506495e-01f, -7.0117538179312794e-02f }, { -1.3728425275892558e-01f, 6.6159413060801153e-01f, -7.3718806304053297e-01f }, { -8.2755960339135237e-01f, 5.1312719149384296e-02f, 5.5902782371563930e-01f }, { 4.5978190057492718e-01f, 8.8592512061726025e-01f, 6.1133334302985565e-02f }, { 4.6709499667906890e-01f, -2.5026654987426389e-01f, -8.4805006815129325e-01f }, { 4.9418715053437662e-01f, -2.0322384431666504e-01f, 8.4526867287736940e-01f }, { -5.1744608256201585e-01f, -3.5400560235351503e-01f, 7.7905685616875764e-01f }, { 4.8148994078264018e-01f, -4.3039858175735676e-02f, -8.7539420122213640e-01f }, { 7.7964215026484207e-01f, -5.5980299282066581e-01f, 2.8067548300384021e-01f }, { -2.1785197788329719e-01f, -4.9265509136899205e-01f, 8.4251497119074714e-01f }, { 8.4879304220351925e-01f, 4.2166451500307794e-01f, -3.1898183066455965e-01f }, { 9.4319323991031423e-01f, -1.4599919036892717e-02f, 3.3192371797086206e-01f }, { -4.1681903712945728e-01f, 9.0579141270938457e-01f, -7.6182720799467613e-02f }, { 3.6027362490707759e-01f, -9.2995061643258881e-01f, -7.3449072104162419e-02f }, { -2.1012715489370348e-01f, 4.6630435337500171e-02f, -9.7656140681296266e-01f }, { -5.8077091816416715e-01f, -3.5529133006178254e-01f, 7.3244331616697811e-01f }, { -4.8210389958898225e-01f, 3.1551126373495594e-02f, 8.7554574776287974e-01f }, { -9.6729623096318129e-01f, -2.4535784827746460e-01f, -6.4323618159090198e-02f }, { 4.4598682705646675e-01f, 8.8008123441803265e-01f, 1.6295020993339379e-01f }, { -1.0469648602070411e-01f, -1.0489427566591485e-01f, 9.8895694382892096e-01f }, { 5.3196195620911568e-01f, 8.1990428235522794e-01f, -2.1159736511055513e-01f }, { -8.1907453401669428e-01f, 2.3404353925068724e-01f, -5.2377526617848902e-01f }, { -6.7388395352584285e-01f, -1.5106139200784430e-01f, 7.2322947466556697e-01f }, { -8.8814963573657535e-01f, 2.1770632933573239e-01f, 4.0471493511872070e-01f }, { 3.5925350503571452e-01f, -6.7156169104524954e-01f, -6.4802917699745488e-01f }, { 1.9209198688637899e-01f, -6.8751747696566235e-03f, -9.8135284202264883e-01f }, { 7.2345332592912737e-01f, -1.4867285097292102e-01f, -6.7417480565923515e-01f }, { -1.7088286327610516e-02f, -7.9391167087525716e-01f, -6.0779293292900582e-01f }, { 1.3298231626822643e-01f, 5.6454303580384124e-01f, 8.1462068736640880e-01f }, { 8.8828975449003766e-01f, 2.2505380033781883e-01f, 4.0036495728464283e-01f }, { 2.6456996298468122e-01f, 6.2976180377100621e-01f, -7.3034430592520738e-01f }, { -8.7563970115549139e-01f, -4.5646868275203778e-01f, -1.5777026154171508e-01f }, { -6.5812839657905953e-01f, -6.6267310143707148e-01f, 3.5739526332626304e-01f }, { -6.7038390353776067e-01f, 6.6462711730295432e-01f, -3.2993365518394668e-01f }, { -6.2540319935444499e-01f, -7.4719412583489897e-01f, 2.2488169457527118e-01f }, { 6.3240839638894419e-01f, -5.6020332169427889e-01f, -5.3500640981156511e-01f }, { 3.3496426805582652e-02f, 7.7571093345201170e-01f, -6.3019880761095304e-01f }, { -1.5250274189155219e-01f, 7.9411836144370340e-01f, -5.8831874161335895e-01f }, { 6.5675577777867788e-01f, 6.3313557427110145e-01f, 4.0964764486900973e-01f }, { -8.7412436370594826e-01f, -5.7627093679873662e-02f, -4.8227141201784107e-01f }, { 3.7389251661362716e-01f, -8.0992700165092646e-01f, -4.5190998884409356e-01f }, { -3.0433538540277705e-01f, 9.5156909144001911e-01f, -4.3545808153707552e-02f }, { 2.5076178516081404e-01f, -8.0765426245441196e-01f, -5.3367885422057104e-01f }, { -8.5901191377339992e-01f, 4.0656696213857607e-01f, -3.1112993634938185e-01f }, { -9.1680148908713566e-01f, -2.6587457608603299e-01f, 2.9796935983198503e-01f }, { 8.6468019310157440e-01f, -7.9205969910816604e-02f, 4.9603888757668058e-01f }, { -3.7410594314103079e-01f, -9.2710356484152612e-01f, -2.2885003052082981e-02f }, { 9.6122220113673618e-01f, -1.7248328725893886e-01f, 2.1517759097591510e-01f }, { 7.6882084768685277e-01f, 4.9837979395535914e-01f, -4.0066455438319348e-01f }, { 7.5964165964665709e-01f, -5.4522704764892438e-01f, -3.5450249003541573e-01f }, { 6.5586735525231277e-01f, 2.8842899808968125e-01f, -6.9760069192577434e-01f }, { 5.1115051934279143e-01f, 4.8706578638930043e-01f, 7.0816104545828196e-01f }, { -6.1785176249893814e-01f, -6.4272188667422825e-01f, -4.5295449657429865e-01f }, { -3.7233034803697795e-01f, 4.5757404674886887e-01f, 8.0746275683311042e-01f }, { -3.2253568956331069e-01f, 5.2551116448252566e-01f, -7.8727933096337510e-01f }, { 3.2330898563780652e-01f, -9.1506875742783145e-01f, 2.4108187195502087e-01f }, { -2.9292504677425668e-01f, 8.5567058001280294e-01f, -4.2664127258488832e-01f }, { -7.8940028782346094e-01f, -6.1273082146509539e-01f, 3.7525005142523667e-02f }, { -9.6457750482134652e-01f, 2.5123430345294451e-01f, 8.0446018926599958e-02f }, { -9.9778185358594187e-02f, 4.9992583493680842e-01f, -8.6030138514899590e-01f }, { 4.8637495499628752e-01f, -8.6222675776323809e-01f, -1.4143698720438591e-01f }, { -7.5886798709522918e-01f, -3.1610501515720590e-01f, -5.6938299724745700e-01f }, { 5.0732023700037321e-01f, 1.9819818003485604e-01f, 8.3865586420221017e-01f }, { -8.1598410461040410e-02f, 9.0004708960762625e-01f, 4.2808519700998005e-01f }, { 3.0947170580849975e-01f, 5.9421512584922342e-01f, -7.4238510728325435e-01f }, { -8.8627803156574680e-01f, -3.6875180336709712e-01f, -2.8023803859836527e-01f }, { 3.1894354243738615e-01f, 8.5622577807591027e-01f, -4.0638950982498728e-01f }, { -9.1479005500747212e-01f, 6.2222497982801002e-02f, -3.9910840132000031e-01f }, { -7.6816781918692983e-02f, -9.8020718143522867e-01f, 1.8246386896714870e-01f }, { 7.8154524571106265e-01f, -2.3884517551322265e-01f, 5.7631589518292181e-01f }, { 1.3309931016943599e-01f, -9.9025775593416066e-01f, -4.0916383572605651e-02f }, { 7.2191543114544920e-01f, 3.5236016636837514e-01f, 5.9555052130858821e-01f }, { 9.1959154068623739e-01f, -3.6466010543147653e-01f, -1.4619988305404510e-01f }, { 8.6379788041965366e-01f, -1.4001235817247870e-01f, 4.8399355506194014e-01f }, { -7.8595139160191829e-01f, -5.5609364309121112e-01f, -2.7025963470809450e-01f }, { 4.0823913381449817e-01f, -1.9210672816511012e-01f, 8.9243252664618000e-01f }, { -4.4734302883318317e-01f, 7.2174135656992600e-01f, 5.2817954217382990e-01f }, { 2.1620208789891063e-01f, -1.5525525760258493e-01f, -9.6392554804554631e-01f }, { 8.4654657907402620e-01f, 4.4612758590095232e-02f, 5.3044188298912187e-01f }, { -5.2197997673382412e-01f, 4.0163248500636024e-02f, 8.5201162982604439e-01f }, { 5.8785413878194370e-01f, 7.3705813938288967e-01f, -3.3342586985171391e-01f }, { -2.2496836805778114e-01f, 4.9819290495685953e-01f, -8.3737271440145711e-01f }, { 3.0445008074854640e-01f, 6.2639154017796916e-01f, 7.1759583800749238e-01f }, { -4.9872875753519352e-01f, -3.5826734738722693e-01f, -7.8924909515533948e-01f }, { -5.2838236690546891e-01f, -8.3671246144634104e-01f, 1.4395947764485628e-01f }, { -3.3110090166316514e-01f, 4.5936199948155038e-01f, 8.2423221627776178e-01f }, { 9.4208159154907201e-01f, 3.2795775555665896e-01f, 7.0185364817787407e-02f }, { 4.2089203426712268e-01f, 6.2272138496542243e-02f, -9.0497075989092080e-01f }, { 9.5406839280064737e-01f, 2.9260692123027388e-01f, -6.4301566908823826e-02f }, { 8.5756285174749336e-01f, 3.6690748696758235e-01f, 3.6050638178795130e-01f }, { 8.7115328741777442e-01f, 3.7170160450378298e-02f, -4.8960221506167395e-01f }, { 6.1211078562085097e-01f, -1.0443425686587705e-01f, 7.8384556649859083e-01f }, { -8.3470836249493002e-02f, -9.9161368311187614e-01f, -9.8665713199216520e-02f }, { 4.9124510655132118e-02f, -8.4617942214350550e-01f, -5.3062903048530707e-01f }, { 7.7935065942457404e-01f, 1.6642718083344157e-01f, -6.0408156993432149e-01f }, { 5.7520092838862980e-01f, 4.5050416196453447e-01f, 6.8278099858848651e-01f }, { -5.6173729549314017e-02f, 8.6357856002780597e-01f, 5.0107542622725132e-01f }, { 7.2467184648262750e-01f, -6.0878840831582981e-01f, 3.2284266882761581e-01f }, { 6.1060725778331459e-01f, -1.4100315468397226e-01f, -7.7927972327753314e-01f }, { 7.1880312188552098e-01f, -5.3720008483348403e-02f, 6.9313507533249086e-01f }, { -5.9624593838234230e-01f, 8.0171868837194182e-01f, -4.1688435779403128e-02f }, { -2.8167750429332877e-01f, 9.0651071900500846e-01f, 3.1447750301747224e-01f }, { 2.2576928186924919e-01f, 5.3817406611431329e-01f, 8.1203257688730091e-01f }, { -3.0966496863543518e-02f, -6.5244933163816243e-01f, -7.5719940948003606e-01f }, { -1.7562004554978114e-01f, -9.7022380362677385e-01f, 1.6680338868586619e-01f }, { 8.6858912735140681e-02f, 2.4751372914132980e-01f, -9.6498315175189542e-01f }, { -5.7637641133096440e-01f, 2.1965343265993828e-01f, -7.8711028578080777e-01f }, { 5.5340585610216053e-01f, 1.6907476655608758e-01f, 8.1557077053180327e-01f }, { -5.0136085940859176e-01f, -8.5962925343821872e-01f, 9.8360740574320787e-02f }, { 1.9009982161655106e-01f, -9.3827613538253907e-01f, 2.8896358177625525e-01f }, { 5.5004272874308768e-01f, -6.7860533913706655e-01f, -4.8677283228578494e-01f }, { 2.2133596015662749e-01f, -9.4129582572567749e-01f, 2.5489715811079328e-01f }, { -4.9469430903109224e-01f, 2.6316916223543474e-01f, -8.2826296105799013e-01f }, { -6.1479257122905517e-01f, 7.4614262465379366e-01f, 2.5554114744266720e-01f }, { 7.4377669521971568e-01f, 3.0166194537982133e-01f, -5.9648662881719317e-01f }, { 4.4268112030680001e-01f, -8.6460765212245883e-01f, 2.3767000991964862e-01f }, { 2.9252009185461519e-01f, 1.6901656422734443e-01f, 9.4120422697635153e-01f }, { 9.5624794128418111e-01f, 6.4970459287462309e-03f, 2.9248532131367755e-01f }, { -1.0584983273068883e-01f, 9.3590097139936335e-01f, -3.3598390533567724e-01f }, { 9.3578516274642720e-01f, -3.4270270674543712e-01f, -8.2831056814419685e-02f }, { -8.2506122699368314e-02f, -2.9962684111135679e-01f, -9.5048224381244839e-01f }, { -7.4052402016611707e-01f, 6.7147207470605441e-01f, 2.7375690803322344e-02f }, { 1.5818502059894440e-01f, -1.2501381863393429e-01f, 9.7946365139737235e-01f }, { -4.1046132553737946e-01f, -7.9816072797075166e-01f, 4.4097726989414887e-01f }, { -7.6796167919910974e-01f, -6.0181356138210595e-01f, -2.1921518336618459e-01f }, { -9.2325695022285637e-01f, 3.4832412788014533e-01f, 1.6207068149954279e-01f }, { 9.6505013473070145e-01f, -2.4124249301198800e-01f, 1.0237332182563919e-01f }, { 4.2835914961189520e-01f, -9.0360430114348655e-01f, 2.7759500653539828e-03f }, { 7.1885860013373248e-01f, 4.9812937019160633e-02f, -6.9336929865641983e-01f }, { 5.4653666381154731e-01f, 6.9153568030805201e-01f, -4.7230930328612369e-01f }, { -9.9648849859074384e-01f, 8.3299287220377591e-02f, 8.4794413107404844e-03f }, { -6.1618958864879503e-01f, -3.2267738969861071e-01f, -7.1846342496895388e-01f }, { -2.5846256090980507e-01f, 9.5147887118391894e-01f, -1.6698821005843745e-01f }, { -9.2164084710164529e-01f, 3.2994629280669580e-01f, 2.0423905801016556e-01f }, { -6.3262149196905815e-01f, 4.2941717630711579e-01f, 6.4450829055277969e-01f }, { 6.5748573726796422e-01f, 7.5223302053800656e-01f, -4.3104386104762922e-02f }, { 9.0826590453017286e-01f, -2.3381343527716120e-01f, 3.4696444220104128e-01f }, { -5.4809422728244817e-01f, 6.5680590362883307e-01f, 5.1787906211582646e-01f }, { 4.0605739103504584e-01f, -6.5577651755095567e-01f, -6.3645467569541281e-01f }, { 9.3974778221666611e-01f, 2.7021468011910171e-01f, 2.0942333314840808e-01f }, { -7.3612890108522133e-01f, 3.8705161253876602e-01f, 5.5525245629191544e-01f }, { 8.8824307880371545e-01f, 4.3722725449851313e-01f, -1.4091330980779984e-01f }, { -4.2486262556500048e-01f, 8.9559904646035482e-01f, -1.3188668385139363e-01f }, { 9.5341301679641721e-01f, -3.0143911878547480e-01f, -1.1750619940715457e-02f }, { 5.0491643365836880e-01f, -6.3405998999447510e-01f, -5.8568534565064900e-01f }, { 3.1207425488268259e-01f, 6.6159956557374100e-01f, 6.8183258522312917e-01f }, { -9.8257572069114862e-01f, -1.8580594589459670e-01f, 4.5938631329104163e-03f }, { -1.3217593881607340e-01f, 5.5884767733441498e-01f, -8.1866891643448825e-01f }, { 7.7818675977864671e-01f, -5.7193270262843154e-01f, -2.5945780113411288e-01f }, { 6.8735504014242932e-01f, 3.5283013787390899e-01f, 6.3486529484503862e-01f }, { 1.2908698964663037e-01f, -6.8489523541828734e-01f, -7.1711579651078627e-01f }, { 4.7176707010069729e-01f, 8.2765168366509823e-01f, 3.0402059485326310e-01f }, { -1.5042087674399759e-01f, -8.6936011238522015e-01f, 4.7072981086088500e-01f }, { 1.2282335185452717e-01f, 8.9486101952866115e-01f, 4.2911324841741272e-01f }, { 1.2757099636359887e-01f, 5.8266643507522420e-01f, -8.0263657175805803e-01f }, { 6.0242278792076248e-02f, 3.4018447682981434e-01f, 9.3842708271338970e-01f }, { 9.7741638196958036e-01f, -1.6062522101232704e-01f, -1.3731989889392071e-01f }, { -7.4385211542621932e-01f, 6.6160471551350974e-01f, 9.4674340696020792e-02f }, { -3.5192419853202617e-01f, -4.5449904056474211e-01f, -8.1827866928896542e-01f }, { 9.6975467880954569e-01f, 2.4402407862795081e-01f, 5.3020728752528022e-03f }, { 1.0373688069586430e-01f, 7.2481683706619382e-01f, -6.8108678763344888e-01f }, { 6.0818983955043904e-01f, -7.1340368649458830e-01f, -3.4808088020392985e-01f }, { -6.7772335944760809e-01f, 2.0804834621864304e-01f, -7.0527082294302790e-01f }, { 9.5052785314074617e-01f, 2.1007986280896767e-02f, -3.0992816089549829e-01f }, { -9.2739581573139573e-01f, 1.6745771827853290e-01f, 3.3450697085837638e-01f }, { 4.3315399365026591e-01f, -9.0016116069007546e-01f, 4.5689195330204047e-02f }, { 5.4385673345612617e-01f, -6.0831248895406875e-01f, 5.7807937971954848e-01f }, { -3.0049605801484114e-01f, 9.3629593013827372e-01f, 1.8180222860032888e-01f }, { -1.4072234213782699e-03f, 5.2640516993982756e-01f, -8.5023268390650786e-01f }, { 4.5365794531686626e-01f, -7.2479826805716829e-01f, -5.1851898641439187e-01f }, { -5.3859879412258138e-01f, 1.9432193122889183e-01f, 8.1984774562913509e-01f }, { -6.3573755095273454e-01f, -5.8692492784100998e-02f, 7.6967068126531069e-01f }, { 5.7364560008846814e-02f, 1.2401851091696829e-01f, 9.9062036936705944e-01f }, { 5.4476819133702947e-01f, 7.5879353683818418e-01f, -3.5701538644711234e-01f }, { 2.0003481434269169e-01f, -1.4895651833572665e-01f, 9.6839972567952703e-01f }, { 9.8449656462989010e-01f, -6.4604385782908613e-02f, 1.6307295167978580e-01f }, { -7.6643526535653494e-01f, 5.6353985457724998e-01f, 3.0822040218147434e-01f }, { 4.6043630051915296e-01f, -8.6764558312801054e-01f, 1.8758879295600439e-01f }, { 7.5061807635826250e-01f, -2.6326236393560276e-01f, 6.0602428266469643e-01f }, { 7.7364032137642536e-01f, -5.8712870455923005e-01f, 2.3824470072423740e-01f }, { 5.3808571841629393e-01f, -8.1530246130113027e-01f, -2.1388234203117354e-01f }, { -2.3474938403134796e-01f, -6.9035826239051556e-01f, -6.8432316652737313e-01f }, { 1.7099132929209582e-01f, 3.9608543638541810e-01f, -9.0215203396672272e-01f }, { 2.1590011985350006e-02f, 6.9957880553389018e-01f, -7.1422921126921701e-01f }, { -9.1037587117607355e-01f, 3.6749699251775575e-01f, -1.9016238763438387e-01f }, { 1.9981158241597108e-01f, 3.9010985310103066e-02f, -9.7905744190908461e-01f }, { -6.0101463302947605e-02f, 3.4894436634771203e-01f, 9.3521422321468051e-01f }, { 9.1886838696261486e-01f, -1.4636800822031604e-01f, -3.6641137210837188e-01f }, { -1.6448408492944308e-01f, 3.5411598203174643e-01f, 9.2062308089392131e-01f }, { -2.6122740451648480e-01f, -1.8774165147969663e-01f, -9.4684387067206432e-01f }, { -7.4371896714734753e-01f, -6.4130216628778280e-01f, -1.8871573707531539e-01f }, { 7.1232190149615315e-01f, -5.4790388188341455e-01f, -4.3863292724781838e-01f }, { -7.8145187146351525e-01f, 5.6433708439053754e-01f, -2.6618908273585706e-01f }, { -2.7064575102661248e-01f, -7.7497255472967719e-01f, 5.7111156254010331e-01f }, { 3.0791092209970894e-01f, 9.4681663853017806e-01f, -9.3429743947637797e-02f }, { 4.4144157446043508e-01f, 1.7366791876428897e-01f, -8.8032311700305388e-01f }, { -3.1008616917516418e-01f, -3.5145103078933548e-01f, -8.8336217976738451e-01f }, { -3.4926339572850895e-01f, -9.3406312736742736e-01f, 7.4438931324759094e-02f }, { -2.7743534036092327e-01f, 7.7562213831630233e-01f, 5.6695672716042922e-01f }, { -8.7526481607849937e-01f, -3.9865659277125942e-01f, 2.7383283728413721e-01f }, { -1.6590991155644474e-01f, 4.7003388182360151e-01f, 8.6691525028988237e-01f }, { 3.2957113864096194e-01f, -7.4464984085582142e-01f, 5.8041319685918558e-01f }, { -5.7991249582439119e-01f, 6.5529526579088226e-01f, 4.8403472170783612e-01f }, { -2.6854882406112945e-01f, -8.7050026660709612e-01f, -4.1244492351386636e-01f }, { -6.2524080886252809e-01f, -7.7655307820503905e-01f, 7.7712596554291108e-02f }, { 9.2950776764099019e-01f, -2.2056919648776163e-01f, 2.9557493035744120e-01f }, { 3.0434841742323460e-01f, 9.5148026934411833e-01f, 4.5357886423605005e-02f }, { -7.8875319072334360e-01f, -5.2718838224357301e-01f, 3.1613417048960235e-01f }, { 7.5634750301091713e-01f, 4.0451991867956011e-01f, -5.1410319010937156e-01f }, { -2.1572533479189310e-01f, -1.0526968413147456e-01f, 9.7076303675602793e-01f }, { 2.8094024090189140e-01f, -5.1248971038841040e-01f, -8.1143507305759865e-01f }, { 9.6505862345478099e-01f, 2.2238261399037024e-01f, -1.3859230242107007e-01f }, { -1.1446725975489272e-01f, 1.8739679679393115e-01f, 9.7559196747184218e-01f }, { -2.3517270607971305e-01f, -9.7150331202474127e-01f, -2.9582309580268314e-02f }, { 6.0533716529739645e-01f, -7.5268416611357503e-01f, 2.5890821229081323e-01f }, { -2.0297270961874245e-01f, 1.6317642606833945e-04f, -9.7918438127018737e-01f }, { 8.3316765291958350e-01f, -5.3119200191783053e-02f, 5.5046345264645657e-01f }, { -7.9130222862433275e-01f, 3.8297962641915478e-01f, 4.7662080181419780e-01f }, { -1.9546122198412737e-02f, 7.6325194887339820e-01f, -6.4580524281548246e-01f }, { -9.5608549674416143e-01f, 2.0919076578523094e-01f, -2.0527967855016380e-01f }, { 4.6431911829205325e-01f, 7.4285168081098307e-01f, -4.8226459200815019e-01f }, { 2.8440642389716425e-01f, 4.7289945221862117e-01f, -8.3395389209317472e-01f }, { -7.2925263796519313e-02f, 8.2485089165832948e-01f, -5.6062724909753270e-01f }, { 3.6304294702605273e-02f, -9.9930591512445754e-01f, -8.3478250710456534e-03f }, { -7.7824766422356428e-01f, -6.2189396130634111e-01f, 8.7054431370686233e-02f }, { 6.8654797717799076e-01f, -1.8442859751059776e-01f, 7.0330503158521696e-01f }, { 1.6588002589519496e-01f, -9.7560190503281286e-01f, -1.4382190342696688e-01f }, { -8.8682354271017760e-01f, -4.1562601517650422e-01f, -2.0198767190962411e-01f }, { -4.2340370538837441e-01f, 1.2807758514373421e-01f, 8.9684192277521468e-01f }, { -2.2756423513175894e-01f, 9.1614425433993696e-01f, -3.2999124856398609e-01f }, { 1.0782169442954124e-02f, -6.7061057403098823e-01f, -7.4173122006555170e-01f }, { 7.6449210840167880e-01f, 5.1211998264207803e-01f, 3.9151620601225900e-01f }, { 4.0122195813863992e-01f, 3.0158354027212697e-01f, 8.6490942216183875e-01f }, { -3.7705639531172626e-02f, -9.9549010881797118e-01f, -8.7050146427960010e-02f }, { -6.6126423631633513e-01f, 7.4984601714319565e-01f, 2.1460669688071587e-02f }, { -1.1424386777657725e-01f, -3.4402738841542012e-02f, -9.9285688305800079e-01f }, { -2.6722118494474889e-01f, 6.8387319802576862e-01f, -6.7890373937601201e-01f }, { -1.6562814809355331e-01f, -8.2253944273428503e-01f, 5.4405531125564033e-01f }, { -6.3365831621218827e-01f, 7.4313531463957350e-01f, 2.1500474978631648e-01f }, { -1.3616910221635883e-01f, -8.0392943003282302e-01f, 5.7892611543157302e-01f }, { 7.1495436720542516e-01f, -6.7888939177168268e-03f, 6.9913815782952660e-01f }, { 7.9655490349411429e-01f, 4.6448447384827229e-01f, 3.8698121307548772e-01f }, { -5.8106771083163589e-01f, 5.3717338511401765e-02f, -8.1208051507971424e-01f }, { 6.5736465794313570e-01f, 4.4874046855613553e-01f, 6.0539548921950526e-01f }, { -1.0814765105175524e-01f, -6.1874311992714337e-01f, -7.7811376874774063e-01f }, { 8.2033896555004493e-01f, -5.4496580204935996e-01f, 1.7336740234825002e-01f }, { 8.6856742437794299e-01f, 4.7616325729491277e-01f, 1.3732873592866471e-01f }, { -2.2468381663771586e-01f, -4.4655798711836128e-02f, -9.7340795259876378e-01f }, { -4.5851726917303587e-01f, -1.8897560356325840e-01f, 8.6836060201278353e-01f }, { -3.1082097533991243e-01f, -9.1246680784120049e-01f, 2.6607263270925691e-01f }, { -3.2689909067771894e-01f, 8.8306913590279512e-01f, 3.3663910309108652e-01f }, { -8.1594922566055017e-01f, -5.6791900572699583e-01f, -1.0814279485018324e-01f }, { 2.7987206647645668e-01f, 8.7351450704868661e-01f, 3.9830143406933377e-01f }, { -4.6527415517567600e-01f, -8.8094929464957294e-01f, -8.6303538641128358e-02f }, { -2.8162043067225551e-01f, -9.4081076207114223e-01f, -1.8858696402214503e-01f }, { -2.1518064098485756e-01f, 2.6745998633801314e-02f, 9.7620794060611216e-01f }, { 5.2762024303248922e-01f, 8.4946348152661411e-01f, 5.3546890685380009e-03f }, { -6.1207305796910971e-01f, 2.8644291824841822e-01f, -7.3710041805284088e-01f }, { -5.4809300212826639e-01f, -3.7498878436064859e-01f, 7.4764796035416781e-01f }, { -4.5786021221763717e-01f, 8.3310606768704687e-01f, -3.1031968363454809e-01f }, { 4.3736527058203273e-01f, -8.2866292907140926e-01f, -3.4932702453646186e-01f }, { 7.0833744085043715e-01f, 6.7657690349411437e-01f, -2.0125049949694321e-01f }, { 8.2967026049873428e-03f, 6.8385719328478567e-01f, 7.2956871089606068e-01f }, { 9.3259364422877311e-01f, -3.5264457091182805e-01f, 7.6882386477718820e-02f }, { -1.2142429828436495e-01f, -3.3319168340164057e-01f, -9.3500772290828194e-01f }, { 8.3274624211966096e-03f, -8.6942144938558685e-01f, -4.9400100882274428e-01f }, { 3.8867239129726755e-01f, -7.9459053707019656e-01f, 4.6643290047096825e-01f }, { 9.5838623121331190e-01f, 2.6285985099765585e-01f, -1.1135766948995703e-01f }, { -7.3138374147622587e-01f, 4.6571946695348654e-01f, -4.9817988799709445e-01f }, { -1.0802183132619060e-01f, -7.9549368437940438e-01f, -5.9625588640232030e-01f }, { 5.3934857111857892e-01f, 6.1593728142128290e-01f, -5.7421632177055593e-01f }, { -6.7063007743187708e-01f, -7.4007929159530339e-01f, -5.0377985226768056e-02f }, { 1.7961034010465346e-03f, 4.1304920474276030e-01f, -9.1070693885242027e-01f }, { 5.1599844536558104e-01f, -8.1620331516382050e-01f, -2.5991874248674851e-01f }, { 4.7917225986460443e-01f, -8.1898011125900128e-01f, -3.1569846806476914e-01f }, { -8.7684638224836897e-01f, 2.2850420178165737e-01f, -4.2299675141314586e-01f }, { -7.0147986495631209e-01f, 5.4515089393045402e-01f, -4.5906045561309339e-01f }, { 8.5354995622073204e-01f, -1.9237886085967942e-01f, 4.8419298438733954e-01f }, { 6.9184694707148953e-01f, 1.8981882017604944e-02f, -7.2179463144507339e-01f }, { -6.5353283346669055e-01f, 4.5349340280339162e-01f, 6.0600211979398189e-01f }, { -9.3055983223451078e-01f, 9.4311555331515334e-02f, -3.5378486282291616e-01f }, { -7.3171037423653007e-01f, -6.0996406007852388e-01f, -3.0421008143577349e-01f }, { 8.6951855942293976e-01f, 3.7828047658713282e-01f, 3.1755527999399913e-01f }, { 2.3619219427148389e-01f, 2.8188909514910337e-01f, -9.2992031131771791e-01f }, { -4.6379439050530907e-01f, -6.8031655868418706e-01f, 5.6750695442074883e-01f }, { 1.6685808359914087e-01f, 8.9500366053622094e-01f, 4.1367478478194331e-01f }, { 3.5622726573608177e-01f, 3.4882205466236127e-01f, 8.6684791591566024e-01f }, { 4.4282289968189198e-01f, 1.1907050818579615e-01f, -8.8866759454685718e-01f }, { 5.2547242960592688e-01f, 7.5977013088499401e-01f, 3.8292045380084255e-01f }, { -8.7334825975961861e-01f, -3.8004939527504132e-02f, 4.8561141023081039e-01f }, { 4.7886268711095531e-01f, -5.4087192544764029e-01f, 6.9148252845277125e-01f }, { 9.0130779412666409e-02f, -9.9178142195840280e-01f, 9.0807784141196127e-02f }, { 4.6196527353073302e-01f, 5.3863774637961925e-01f, 7.0459737739134387e-01f }, { 4.0263513200599271e-01f, 1.3195371775616188e-01f, -9.0579973881915199e-01f }, { -3.7336200958284943e-01f, -7.3440533112045780e-01f, 5.6678886670620732e-01f }, { -9.1494421340145005e-01f, 1.4126318568408874e-01f, 3.7804999501862768e-01f }, { -6.8327077306768857e-01f, 1.2752977583667993e-02f, 7.3005370503424871e-01f }, { -4.0410213207596857e-01f, 8.5436639736577336e-01f, -3.2674076253795781e-01f }, { -4.7196453673120004e-01f, 8.8122203777765218e-01f, 2.6404473164706257e-02f }, { 8.3987269873937331e-01f, -5.3548500595082238e-01f, -8.8711094650497077e-02f }, { -7.2557449416204278e-01f, 2.0013394203709289e-01f, -6.5839810044242164e-01f }, { 5.0306179859756800e-02f, -6.8589765654709822e-01f, 7.2595708758239752e-01f }, { 1.2846965543094849e-01f, 3.9971486460128636e-01f, -9.0759218520777751e-01f }, { 8.4064862508248817e-01f, 5.3439517354190558e-01f, 8.7930015592167815e-02f }, { 2.2438835269573038e-01f, 8.0254779649554620e-01f, -5.5278106110343528e-01f }, { -5.5289118240050161e-01f, -2.1128976448231399e-01f, 8.0601983589039761e-01f }, { -4.7200681899964730e-01f, -8.7946421281140041e-01f, 6.1255703423092896e-02f }, { 5.5838371784324059e-01f, -2.1690539156947275e-01f, -8.0072446868798375e-01f }, { 6.9084295487952319e-01f, 1.7887560361806426e-01f, 7.0052803664350383e-01f }, { 2.1873738379425137e-01f, 3.5488362866415651e-01f, -9.0896180724880149e-01f }, { -6.4279916027254480e-01f, 2.3913103052692813e-01f, -7.2775379751124658e-01f }, { -4.1405588827349127e-01f, 7.0240352836063935e-01f, -5.7895337008482362e-01f }, { 6.8714843210967214e-01f, 4.8035029014734643e-01f, 5.4506020860504889e-01f }, { 3.7321271073839501e-01f, -8.9972595446310077e-01f, -2.2628627755292968e-01f }, { -2.5283441214035390e-01f, 1.9630216877967308e-01f, -9.4738599238643928e-01f }, { -3.5740947002347478e-01f, -5.8708067574583456e-01f, 7.2635717859972526e-01f }, { -8.8173289374302577e-01f, -4.0032318565682951e-01f, -2.4957654360359616e-01f }, { 8.1411054680947847e-01f, -1.2977144645220321e-02f, 5.8056490704350117e-01f }, { -3.4148619017816129e-01f, -5.2409432947993506e-01f, 7.8020017670119879e-01f }, { -4.3742374315233779e-01f, 8.2216068309963164e-01f, 3.6429696689890895e-01f }, { -9.3562365202306944e-02f, 9.8936582652370164e-01f, 1.1136132688156519e-01f }, { -6.1313584469646032e-01f, 2.0950134554905311e-01f, 7.6169129059054785e-01f }, { -4.4770838467387192e-01f, -4.3635815383952986e-01f, -7.8047982925279336e-01f }, { 1.6948609105023824e-01f, -5.9534469232773812e-01f, -7.8539108873076813e-01f }, { -3.4039119244372273e-01f, -1.2504322387613453e-01f, -9.3193241614904854e-01f }, { 9.2799523554378016e-01f, 1.3142194288524131e-01f, -3.4864468407866545e-01f }, { 2.1211847254999266e-01f, -7.4313866477768131e-01f, -6.3462640861809638e-01f }, { -1.8268868295178893e-03f, -1.1630027281575755e-02f, 9.9993070007373108e-01f }, { 4.0548212176846193e-01f, -8.9912193968530829e-01f, -1.6481500690979303e-01f }, { -3.2053026621902431e-01f, -8.0209065537133639e-01f, 5.0389575211896909e-01f }, { -7.4019162216530510e-01f, -5.2765766011157866e-01f, 4.1676582897577857e-01f }, { -6.4098431593141014e-01f, 5.6704906933414900e-01f, 5.1729533121536841e-01f }, { 5.5478285826968332e-01f, 2.1046588173197825e-01f, 8.0493483760917039e-01f }, { 9.3726656898457605e-01f, -2.4715325605768603e-03f, -3.4860474780284212e-01f }, { -3.6333849280046587e-01f, -6.8945208748130948e-01f, -6.2661069151200310e-01f }, { 4.1673795209448194e-02f, 5.4744381908842821e-01f, -8.3580413957739963e-01f }, { 8.2641566790192922e-01f, 5.3529028800379808e-01f, 1.7464664730540688e-01f }, { 8.7451586097570325e-02f, 9.9441289409756950e-01f, 5.9120353022585739e-02f }, { 7.4884666181363457e-01f, -5.9830878323196646e-01f, 2.8505311259142563e-01f }, { 2.0827934770362516e-01f, 9.6173341219515751e-01f, 1.7801280062852684e-01f }, { -9.7142856518640275e-01f, 1.8130278423950880e-01f, -1.5315300573899582e-01f }, { 6.4807065244633977e-01f, -3.8033770049464910e-01f, -6.5980880792864394e-01f }, { 2.8577240307742036e-01f, 7.7046559302436768e-01f, 5.6983936649284417e-01f }, { -2.6106647228608837e-01f, 1.9975906910420494e-02f, 9.6511411770380984e-01f }, { -4.9364270362441554e-01f, -4.7248206144534521e-01f, -7.3012162190331997e-01f }, { -6.5222115009386916e-01f, -3.7769732881308804e-01f, 6.5723078075945951e-01f }, { -3.0091783676372569e-01f, -5.1311206472092441e-01f, 8.0384355726426615e-01f }, { -4.7838259397690201e-02f, 5.1671521425528111e-01f, -8.5481979872656100e-01f }, { -8.8433641249731909e-01f, 4.6627216288277662e-01f, -2.3224548477613335e-02f }, { 3.3099347492974157e-01f, -8.1948478318057005e-01f, 4.6785468864747787e-01f }, { 8.2415726330231676e-01f, -3.5008573230013362e-01f, 4.4520196022245312e-01f }, { -7.5674436803977418e-01f, 1.6680769372877691e-01f, 6.3207052988805712e-01f }, { -3.4593566437724493e-01f, 9.3601767574606465e-01f, 6.4802984520848109e-02f }, { -9.1544830929275955e-01f, 3.9715465184155913e-01f, 6.4981347582502930e-02f }, { -3.6525189125844421e-01f, 8.8238952028324646e-01f, -2.9661387429861036e-01f }, { -1.9946867164892182e-01f, 9.7235759583219261e-01f, 1.2137938399107596e-01f }, { 1.6779166611087831e-01f, 2.2607931574539999e-01f, -9.5954890431693329e-01f }, { 4.4851544334940979e-01f, 7.6465332712915390e-01f, 4.6275175460218149e-01f }, { -7.5871101256413176e-01f, 6.8539502762095209e-02f, 6.4781165162031062e-01f }, { 6.4437737847164112e-01f, 3.4513789179498899e-01f, 6.8239111201811964e-01f }, { 2.9566009229300888e-01f, -1.7126560161211113e-01f, -9.3981551568897348e-01f }, { 3.4192383666694165e-01f, 4.1340730620005611e-01f, 8.4390905262319105e-01f }, { 3.0264233956740771e-01f, 5.3210954767968155e-01f, -7.9073829018790442e-01f }, { -1.1848494825858491e-01f, -6.8049629010790824e-01f, 7.2310864756655624e-01f }, { -4.0583787760460821e-01f, -9.1336726946330260e-01f, 3.2493817481759328e-02f }, { -1.2512419292274909e-01f, 2.4246239257266111e-01f, -9.6205817107562230e-01f }, { 5.7795967140412630e-01f, 3.6810243679048976e-01f, -7.2832905630582789e-01f }, { 9.8791690154490142e-01f, 4.4171778509017684e-02f, 1.4855655362612497e-01f }, { -6.2328592924124260e-01f, 6.3755698078779510e-01f, 4.5280873076679062e-01f }, { 9.9081759265974650e-02f, -3.7551787594129465e-01f, -9.2150373294376720e-01f }, { -7.4181762470804491e-01f, 2.2599074519816992e-01f, -6.3137532004132857e-01f }, { 6.8087871751972651e-01f, 5.0115841383095150e-01f, -5.3408278035819234e-01f }, { 3.8566493431948595e-01f, -8.1568642952864767e-01f, 4.3118233627915836e-01f }, { -4.1580768441009808e-01f, -7.0678980767386823e-01f, 5.7232170791771353e-01f }, { -9.3902516013086779e-01f, 2.8656895906849367e-01f, 1.9002626223656049e-01f }, { -6.4461630181247420e-01f, -1.1119079042601451e-01f, 7.5637717546343719e-01f }, { -9.8697493493466082e-01f, -1.3433652268705490e-01f, -8.8510883415953201e-02f }, { -1.7671423273212633e-01f, -1.9519243059816074e-01f, 9.6471342635369084e-01f }, { -4.5592201488918677e-01f, -7.2700082529167864e-01f, -5.1342469395676948e-01f }, { 3.1674222112424039e-01f, 8.7637792982117380e-01f, 3.6281688147002839e-01f }, { 3.9340881615883366e-01f, -9.0495794624565873e-01f, 1.6211298188406886e-01f }, { 3.1946983804677420e-01f, 7.9565786207035760e-01f, -5.1465288214873106e-01f }, { -7.9686915062773522e-01f, 4.4632174355679022e-01f, -4.0718111204506857e-01f }, { 7.5231294018154704e-02f, 9.3269627124239274e-01f, 3.5272924178594994e-01f }, { -1.2314541399211285e-01f, 7.6460385446884782e-01f, 6.3262639270274845e-01f }, { 5.2502233043279589e-01f, -5.1870929350936339e-02f, -8.4950630323452359e-01f }, { 8.3703697808919242e-01f, -4.6560466055745359e-01f, -2.8736979204239860e-01f }, { -8.0322841618133733e-01f, -9.5864014778579004e-02f, 5.8790662703302876e-01f }, { -3.9156400336952224e-01f, 9.3643674589809642e-02f, 9.1537341750487311e-01f }, { -1.3437054359116385e-01f, 6.0524776338455313e-03f, 9.9091267250424597e-01f }, { -5.5780971419102332e-01f, 8.1404378407391387e-01f, -1.6180556345426431e-01f }, { -5.3354742481443418e-01f, 8.3548560627603097e-01f, -1.3149504621642044e-01f }, { 9.5403282382375398e-01f, -9.7759701940220697e-02f, -2.8330974523202179e-01f }, { -9.7316023783056582e-01f, 2.1081746396466880e-01f, -9.2277561698725252e-02f }, { 2.4701466016782830e-02f, -8.1821441926584892e-01f, 5.7438227834959465e-01f }, { -4.4239832866278206e-01f, -7.4430388322970331e-01f, 5.0029536096746019e-01f }, { 6.5300271012508154e-02f, -1.8339748050369808e-01f, 9.8086759491308950e-01f }, { -7.9737082321029745e-02f, 7.8503845880653100e-01f, -6.1429359096249381e-01f }, { -1.9421549347193576e-01f, 9.5424359128395397e-01f, -2.2737526380183629e-01f }, { -1.6873800316127971e-01f, -9.0055359582368322e-01f, 4.0066283498495120e-01f }, { 3.1435631783182588e-01f, 6.6780511856774383e-01f, -6.7469728697686182e-01f }, { 4.9454555575694231e-01f, -7.9081171264909678e-01f, -3.6061271250201304e-01f }, { 3.5864138135436546e-01f, 6.8704420883290251e-01f, 6.3193877447851188e-01f }, { 7.7673374687611441e-01f, -2.8546525296368724e-01f, -5.6142165598965832e-01f }, { -1.3481661270124717e-01f, -9.1217970363275869e-01f, -3.8697890022611614e-01f }, { 6.6970077730685429e-01f, 7.3768480376693824e-01f, -8.5568680987433393e-02f }, { 5.9301993895860527e-01f, -7.4341476273442642e-01f, -3.0929248705076640e-01f }, { 4.6030585357342851e-01f, -2.0692460516389183e-01f, -8.6330801510457722e-01f }, { -9.5022345046678991e-01f, -3.1151494154022302e-01f, 5.8168187335806074e-03f }, { -7.3216236228367670e-01f, 5.3704102974286350e-01f, -4.1895728616162181e-01f }, { -9.3893326156954704e-01f, 3.1652333373222502e-01f, 1.3497151374053404e-01f }, { -7.9593226351725499e-02f, -3.5397498959582729e-01f, -9.3186191308560140e-01f }, { -4.2983698909816223e-02f, 9.7413849929131657e-01f, 2.2182557523083746e-01f }, { 9.7607012219080169e-01f, 1.6990988898965542e-01f, -1.3571199722189817e-01f }, { 9.0534421032421908e-01f, -3.2838302584275059e-01f, 2.6928878396764977e-01f }, { 9.1933537380392949e-01f, -1.0188342690440447e-02f, -3.9334293961632438e-01f }, { 1.6890386009481365e-01f, -8.8304182358387895e-01f, -4.3784543373972645e-01f }, { 9.9009913914823233e-01f, -8.6478167799645705e-02f, -1.1056772201662488e-01f }, { -9.8379265184347009e-01f, 1.4625964862581031e-01f, 1.0373106266999932e-01f }, { 4.8399989066844634e-01f, 5.0660184629517757e-01f, -7.1351151018273640e-01f }, { -6.9286677409167674e-01f, 1.2671508829757058e-01f, -7.0984429261460724e-01f }, { -2.7497293747074263e-03f, -8.4458160831758844e-01f, -5.3541978472974017e-01f }, { -2.5238550903396251e-01f, -5.6699260871500046e-01f, -7.8410518203377921e-01f }, { 4.2758500505590630e-01f, -4.4150711375797164e-01f, -7.8882351128274963e-01f }, { 2.4412646993850658e-02f, -7.8217263905609058e-01f, -6.2258331601383621e-01f }, { -6.4768708062480695e-01f, -6.3900027789439073e-01f, 4.1494588857175835e-01f }, { -1.7690094497023331e-01f, 9.8191044875857403e-01f, 6.7512415801644021e-02f }, { -5.5343971283118099e-01f, 8.3179893071949962e-01f, 4.2603088095079039e-02f }, { 2.3246424870306354e-01f, -4.1856374321010337e-01f, 8.7793209643164705e-01f }, { -7.5397855762081789e-01f, 6.0079464656034764e-01f, 2.6563532768150022e-01f }, { 8.0269809742812837e-01f, 4.2497947378342682e-01f, 4.1841153335923303e-01f }, { 6.5912045388764773e-01f, -7.3708974882596712e-01f, -1.4919426745895420e-01f }, { -7.9935712636326850e-01f, 3.8042786462807077e-01f, -4.6508367456489352e-01f }, { 1.7634923293548033e-01f, 4.2723953988537533e-01f, 8.8677354696765764e-01f }, { 7.8573547960250345e-01f, 8.4068820770713028e-04f, 6.1856208203959706e-01f }, { -5.2014373986986540e-01f, -7.1447433942245486e-01f, 4.6794968552295940e-01f }, { -3.6168933143848714e-01f, 3.7186137261776631e-01f, -8.5492686650871541e-01f }, { -4.5480995702868321e-01f, 3.6498843566039590e-01f, 8.1236158502340838e-01f }, { -8.8066740285548406e-01f, 3.4969917468662165e-01f, 3.1958631505631202e-01f }, { -3.8612294717911139e-01f, -9.4914809735861638e-02f, 9.1755122394039801e-01f }, { -3.0461889801960695e-01f, 9.4769728043942125e-01f, 9.5274296728158833e-02f }, { -9.1623587798258432e-01f, 1.5966109889839786e-01f, -3.6745088024937272e-01f }, { 5.7965773211442129e-01f, -4.7402699612921678e-02f, -8.1348011510384988e-01f }, { 4.9640669235764967e-01f, 8.4734900994839002e-01f, -1.8862675081234101e-01f }, { -3.3123658058599625e-01f, 9.1218227792048279e-01f, -2.4125882269773294e-01f }, { 5.7403568170301521e-03f, -6.5895398405005856e-01f, 7.5216134918524524e-01f }, { -1.8900561148034289e-01f, -1.5250574179261253e-01f, 9.7006127515184659e-01f }, { -1.0261629167019888e-01f, -4.0676104293868309e-01f, -9.0775291276387071e-01f }, { 3.0074951987605386e-01f, -9.1628524723492777e-01f, -2.6452045666441454e-01f }, { 5.6395303135638584e-02f, -8.6953665550803117e-04f, 9.9840813983573073e-01f }, { 6.9459540545823917e-01f, 7.0273105729654795e-01f, -1.5396845075267926e-01f }, { -5.1079762892864378e-01f, -8.2143506676055045e-01f, -2.5363401462927965e-01f }, { 2.3859890607147026e-03f, -6.2171912269149421e-01f, -7.8323664338175647e-01f }, { -2.8297765796012708e-01f, -9.3130570618145869e-01f, 2.2933234994055232e-01f }, { -5.5093056318345690e-01f, -4.1247481770988487e-01f, -7.2549296296074184e-01f }, { 9.4855289670791598e-01f, 1.7343739604441827e-01f, -2.6489030144637854e-01f }, { 1.4724591868253076e-01f, 3.9121825407011285e-01f, 9.0844202738186342e-01f }, { -4.3989915128093365e-01f, 7.9734863326623473e-01f, 4.1318748012346840e-01f }, { -4.6408956362180726e-01f, -6.6930505582918554e-01f, -5.8021687253889076e-01f }, { 2.0920702905617464e-01f, 8.5965824653608414e-01f, 4.6606879122721145e-01f }, { 8.3351780421058308e-01f, 4.2195176012082997e-01f, -3.5665779424386823e-01f }, { 9.6060956951376930e-01f, -1.2835485383047901e-01f, -2.4648384623891137e-01f }, { 3.1487224495683525e-01f, 9.4877764167264955e-01f, -2.6008768097088523e-02f }, { 8.0426602845079997e-01f, -6.1356870518341690e-02f, -5.9109346969846699e-01f }, { -7.1453889536397286e-01f, -5.5872554493590909e-01f, -4.2102248449234259e-01f }, { 1.2671329102788977e-02f, 9.0839392166320676e-01f, -4.1792334285620919e-01f }, { -9.9313365040611368e-01f, -7.2930198559009923e-02f, -9.1469877933507082e-02f }, { -1.5374708197019982e-01f, -9.8791307001172124e-01f, -1.9738310101538176e-02f }, { -1.5446102792209903e-02f, 4.8703599599345115e-01f, 8.7324530145612544e-01f }, { 5.9751208061042460e-01f, 4.7657650772302551e-01f, 6.4486754129133106e-01f }, { -8.8505569269163320e-01f, -2.0337579342149747e-01f, -4.1870599169860184e-01f }, { 5.7186528856509503e-02f, 3.9620218374395494e-01f, 9.1638066899835080e-01f }, { -3.8143649812091746e-01f, 8.0478172910118839e-01f, 4.5478848534912658e-01f }, { 6.4954707041012960e-01f, -8.5942506844282007e-02f, 7.5544853487113106e-01f }, { -3.9860633417670382e-01f, 9.1391225575422619e-01f, 7.6664066787718116e-02f }, { 4.1436455648862497e-01f, -1.5644152829890318e-01f, -8.9656458916772341e-01f }, { -3.2847395828320419e-01f, 1.9517476309886020e-01f, 9.2412751857039055e-01f }, { 9.3378613697937052e-01f, 2.5317768599568524e-02f, 3.5693481334591487e-01f }, { -1.5330022812835495e-01f, 5.1730331862985857e-01f, -8.4195980699219208e-01f }, { 1.4709802700558700e-01f, 2.2293172965524249e-01f, 9.6367194333133177e-01f }, { 9.0229981547770544e-01f, -3.9528775453932845e-02f, -4.2929304548293246e-01f }, { -4.4315272178477294e-01f, 8.0243443541576545e-02f, 8.9284749814474895e-01f }, { -7.2228841339899530e-01f, -1.6976682381575195e-01f, -6.7043170673907837e-01f }, { 9.2490182124714791e-03f, 6.1016218544582224e-02f, -9.9809392180126277e-01f }, { 4.3593759544693078e-01f, -4.8905804774767209e-01f, 7.5550025731907189e-01f }, { 5.6848375081720670e-01f, 4.0398012652243076e-01f, 7.1667725123079018e-01f }, { 4.0443819907675410e-01f, -8.5219528815215828e-01f, -3.3195321052644139e-01f }, { -5.2973985728503614e-01f, 3.0301089578242513e-01f, -7.9218689754423599e-01f }, { 8.5079484132170646e-01f, -4.5481438189982337e-01f, 2.6323376682609323e-01f }, { -9.6639354884749129e-01f, -1.5631429056140989e-01f, -2.0408172704148347e-01f }, { 3.3138231066468088e-01f, -3.9612904612834393e-01f, 8.5631042443262673e-01f }, { -4.1018377392959787e-01f, 5.1084118428431591e-01f, 7.5550682064682262e-01f }, { -8.0560652121908838e-01f, 5.5220261963382689e-01f, 2.1464016361999355e-01f }, { -4.6902927530380273e-01f, -2.9072314154588097e-01f, 8.3396138632294192e-01f }, { 7.0121606489295718e-01f, -4.3959216066359580e-01f, -5.6129739231457987e-01f }, { 5.7700923100049251e-01f, 6.5401816478776931e-01f, -4.8920403459891715e-01f }, { 1.1625388790924869e-01f, 1.7707398215376383e-02f, -9.9306167058971007e-01f }, { -4.3192814223268450e-01f, 3.8797778578189279e-01f, -8.1419366104582358e-01f }, { -7.9037611940514851e-01f, -5.5292963873451084e-01f, 2.6376960492631030e-01f }, { 8.1815013054253405e-01f, -4.7367823121828134e-01f, -3.2597438114544353e-01f }, { -2.4555241456385074e-01f, 7.5964932205426583e-01f, 6.0219342341506610e-01f }, { -9.1702325898443482e-01f, -2.2765515103951259e-01f, 3.2747744149291119e-01f }, { 1.8150954955825988e-01f, -7.6701506722884993e-01f, -6.1542031983277934e-01f }, { -4.7294383808127477e-01f, 7.6457487837654814e-01f, -4.3789197455130369e-01f }, { 6.0974956831115323e-01f, 3.7509169321681046e-01f, -6.9822037038753637e-01f }, { -9.1663636786260161e-01f, 3.8261713673916353e-01f, 1.1568014429962215e-01f }, { 7.0153683455820248e-01f, 9.0589737460098824e-02f, -7.0685187219456924e-01f }, { -3.0575608400167437e-01f, -6.1912144931611923e-01f, 7.2332693029685347e-01f }, { 2.6141976099951564e-01f, 2.4066202309057255e-01f, -9.3474140766358949e-01f }, { 2.2394000788467064e-01f, 6.7802061873360253e-01f, 7.0009921685480869e-01f }, { -8.4462151812309305e-01f, -7.8993550027827097e-02f, -5.2950402281516495e-01f }, { -5.4355546494046125e-01f, -6.2134131539186654e-01f, 5.6434247254700232e-01f }, { -3.3217026092687507e-01f, 3.3898388647340655e-01f, -8.8020045584352902e-01f }, { -7.1232173795400755e-01f, -5.3453325435109011e-01f, 4.5483177289082927e-01f }, { 4.7064768757999598e-01f, -6.0855676059433228e-01f, -6.3886573183301587e-01f }, { -2.6758276662505086e-02f, -1.5875962147797232e-01f, 9.8695459734388180e-01f }, { -7.9085997516293882e-01f, 6.1180834199707135e-01f, 1.5200406181093187e-02f }, { -9.0306609363097756e-01f, -4.2402699333082866e-01f, 6.8357438958052963e-02f }, { -1.4352667503068903e-03f, 8.8031503048933191e-01f, -4.7438738084388593e-01f }, { -1.3020679121383796e-01f, -9.5958277860304331e-01f, -2.4949365228449952e-01f }, { -5.9048972129998434e-01f, 8.0672589809246897e-01f, 2.2698334431540321e-02f }, { 8.7747510973961240e-01f, 4.7704038661194675e-01f, 4.9698101860930592e-02f }, { -3.3294707541736362e-01f, 9.3989002988632731e-01f, -7.5848379622133213e-02f }, { -2.2079384236135169e-01f, 6.6973726787133803e-01f, -7.0901485964650002e-01f }, { 8.1290364855277575e-01f, 1.2331503111827442e-01f, -5.6919334260854115e-01f }, { 4.1335924458827095e-01f, 8.6022095280442612e-01f, 2.9858674999011475e-01f }, { 6.1088997103361731e-01f, -7.6399948364865145e-01f, 2.0764930116699193e-01f }, { -4.2820128744146546e-01f, -5.9604293785813700e-01f, -6.7924699017582157e-01f }, { 4.0154404819309847e-01f, -5.5711589994393707e-01f, 7.2690044118184138e-01f }, { -1.6887009255041197e-01f, 9.8541623217667107e-01f, 2.0922265765170270e-02f }, { 2.3764592496211170e-01f, -1.9747206069262621e-01f, 9.5106740013245650e-01f }, { 2.9909113804340709e-01f, 8.2136541827467302e-01f, -4.8569881697032269e-01f }, { 4.1951059094836252e-01f, -1.3062422240659421e-01f, 8.9830294255492016e-01f }, { -8.3640863517454855e-01f, 5.1760717402384226e-01f, 1.8028701673859054e-01f }, { 9.8014338009962898e-02f, 8.2999713049937873e-01f, 5.4908829245146540e-01f }, { 2.0215528070426442e-01f, -4.5074376511605813e-01f, -8.6946150040837333e-01f }, { -6.5696132543489394e-01f, 7.3115948166326028e-01f, 1.8386851078077501e-01f }, { -6.2174131276312961e-01f, -9.5038425146148110e-03f, 7.8316499984424592e-01f }, { 6.6238595514484860e-03f, -9.9951627608606897e-01f, 3.0386482581568248e-02f }, { 5.0727438992365559e-01f, -8.5995962572034712e-01f, 5.6054754111523539e-02f }, { -6.2839949013198693e-01f, 4.9474718019637676e-01f, 6.0028269047973792e-01f }, { 7.8883725933717963e-01f, 5.3913750249737435e-01f, 2.9507038428534432e-01f }, { -1.4014338252926334e-01f, 9.8533426179932693e-01f, -9.7345903137379161e-02f }, { 3.1457938388357892e-01f, -9.4155169825322294e-01f, 1.2049983714470204e-01f }, { 7.9553042550833952e-01f, -3.3842990025762315e-01f, 5.0258983744414831e-01f }, { -9.3225983220452791e-01f, -3.6178894441053255e-01f, 6.0411944009141976e-04 }, { 5.8191879496777121e-01f, -2.8634944443558252e-01f, -7.6116654664711203e-01f }, { -7.8798469691641881e-01f, -4.3487565974713632e-01f, -4.3584776927848623e-01f }, { 4.9006700029379147e-01f, -5.4738295432603466e-02f, 8.6996439825787009e-01f }, { 7.8385432218687573e-02f, -9.8277820653140091e-01f, 1.6734013500297085e-01f }, { 4.3822437590860047e-01f, 8.9248608290568809e-01f, 1.0690176883091770e-01f }, { -4.7963558736582512e-01f, -6.5588436977127323e-02f, 8.7501306291228442e-01f }, { -4.9756930531559407e-01f, -6.9079642431007615e-01f, -5.2461899181040950e-01f }, { 3.4139588349358263e-01f, -4.3533404161386702e-01f, 8.3302648394019985e-01f }, { -8.3383515079676762e-01f, -5.3211071825751999e-01f, 1.4689154097904403e-01f }, { 8.9275499170683037e-01f, 2.0170288059852123e-03f, 4.5053796330313040e-01f }, { 6.2921007345946212e-01f, 6.9477187882798752e-01f, 3.4840596987848310e-01f }, { -1.5732332443895727e-01f, 6.2497640931017362e-01f, -7.6462661436366242e-01f }, { -3.1741805923298144e-01f, 6.8209794511491246e-03f, 9.4826117178343572e-01f }, { 6.6065196124324033e-01f, 7.3005638823960317e-01f, -1.7480462263912233e-01f }, { 8.8899525841495422e-02f, 5.9997991794400152e-01f, -7.9506035768931815e-01f }, { 2.2027152875415471e-01f, 6.1502989554242860e-01f, -7.5711206647984231e-01f }, { -1.8173018004439087e-01f, -2.3469128692706712e-01f, 9.5493148523941251e-01f }, { -5.1501277514490029e-01f, 8.4647618571853966e-01f, 1.3505520519010272e-01f }, { 2.3984007761550982e-01f, -9.6535901071862185e-01f, -1.0275562074042528e-01f }, { -8.9591881748577296e-01f, -2.3912630910700772e-01f, 3.7436356762878770e-01f }, { 1.1947703779896025e-01f, 7.9770429822927880e-01f, -5.9109482320971118e-01f }, { -3.1515687543268761e-01f, -8.5397310865077669e-01f, 4.1401216596717810e-01f }, { 8.1327487287286837e-01f, 2.2276825528354702e-01f, -5.3754840302203866e-01f }, { -8.5934378226796815e-01f, -3.9181109988364377e-01f, 3.2865228720541778e-01f }, { 3.7736874685621347e-01f, -3.6851758123919005e-02f, 9.2532955038696740e-01f }, { -5.9162409019977535e-01f, 6.7402628215325977e-01f, 4.4234546099394123e-01f }, { -2.8727033312072187e-01f, -1.8588699806603048e-01f, 9.3963917524691842e-01f }, { 7.6598846323018022e-01f, -3.7251169222511255e-01f, 5.2392433934094895e-01f }, { -6.8544752709784981e-02f, 9.9531125284801825e-01f, 6.8243144930922067e-02f }, { 5.0947837944444996e-01f, -8.5804190096401456e-01f, -6.4775590068459551e-02f }, { 4.4312102626099209e-01f, 8.5551461096560022e-01f, 2.6784044972666626e-01f }, { 6.7617437422372795e-01f, -6.5417902605457823e-01f, -3.3887758484950492e-01f }, { -1.9010145377007134e-01f, 9.7426050114028961e-01f, -1.2115243783092895e-01f }, { 5.6327881472446206e-01f, -7.7113837833916987e-01f, 2.9675339650127069e-01f }, { 2.9969904401538661e-01f, -6.9284028845367118e-01f, 6.5586036449208995e-01f }, { 3.6623553872468495e-01f, 8.5209201588429706e-01f, -3.7391272596860703e-01f }, { 9.5502699005703762e-01f, -1.2228538299638853e-01f, 2.7012910499985288e-01f }, { -4.9675478094479697e-03f, 9.9984782431321495e-01f, 1.6722789387279693e-02f }, { 1.6018842444242570e-01f, -7.1193231852071681e-01f, -6.8373389744868573e-01f }, { 3.0892740398752633e-01f, -8.7784466444813236e-01f, -3.6599536085239348e-01f }, { -6.4954499633607798e-01f, 6.5819592928240932e-03f, -7.6029466363156328e-01f }, { 5.6459159040851559e-01f, -3.3914427671369624e-01f, 7.5247424913569427e-01f }, { 7.6514680509203659e-01f, 5.5133300942194208e-01f, 3.3253913961997578e-01f }, { 4.8848643767382954e-01f, 5.7482497710140890e-01f, 6.5647333983117440e-01f }, { 2.8106330257420348e-01f, -3.3106481664949533e-01f, 9.0077716840676958e-01f }, { 9.7361489089943143e-01f, 8.7933791760051963e-02f, 2.1057467199449215e-01f }, { -1.1362323022331702e-01f, -9.9126987897005503e-01f, 6.6886385762062239e-02f }, { 4.3576552412210018e-01f, -8.9446979200578758e-01f, 1.0016086648843561e-01f }, { 1.6894151522224565e-01f, 1.2805455720129327e-01f, 9.7727211912260781e-01f }, { -9.6060599266639024e-01f, 7.8565659446458519e-02f, 2.6657750094327548e-01f }, { -4.1846577206545232e-01f, 5.8489861997231807e-01f, 6.9482372006440785e-01f }, { 1.8637555597724240e-01f, -9.8140498478814664e-01f, -4.5917403750120975e-02f }, { -5.1748221018469077e-02f, 2.4462804288180032e-01f, -9.6823511724025157e-01f }, { 3.8833320807220340e-01f, -7.7272750267395784e-01f, -5.0208517815169507e-01f }, { 5.1043678327228026e-01f, 8.5588337337472120e-01f, 8.3174163436458864e-02f }, { 3.9231177062194739e-01f, -5.1252958718078001e-01f, -7.6380946373802661e-01f }, { 8.6855425460187519e-01f, -4.8878400639136693e-01f, -8.1876137604219648e-02f }, { 2.9968345887000619e-01f, 7.0761248654309594e-01f, -6.3990186229452883e-01f }, { 8.8427835976106750e-01f, 2.7951068322023481e-01f, -3.7406625138340621e-01f }, { -6.1339377295062969e-01f, -1.5050955950416534e-01f, -7.7530313542720397e-01f }, { 9.9311016260531948e-01f, 2.0742986101987312e-02f, -1.1533400824392055e-01f }, { 4.3365815995003748e-01f, -7.7825219918122346e-01f, 4.5416309270826605e-01f }, { 6.8201500034358797e-01f, -4.6407817492512354e-01f, 5.6523179923329003e-01f }, { -1.6548334925401023e-01f, -4.6589142467612443e-01f, 8.6922979788599419e-01f }, { 7.1866875065431907e-02f, 8.7125938570274142e-01f, 4.8553293924636182e-01f }, { -8.2796994004579316e-01f, -4.7328949846924284e-01f, -3.0077039252442744e-01f }, { 6.2040274027738651e-01f, -2.6890679198579548e-01f, 7.3674254463836819e-01f }, { 7.8028692074210593e-01f, -6.2427135302303283e-01f, 3.7915684269102079e-02f }, { -6.5533290905156494e-01f, -5.5898143535422418e-01f, -5.0801430417198357e-01f }, { 2.4978098337860230e-01f, -7.5890553834319319e-01f, -6.0139158974369333e-01f }, { 1.9036481951892603e-01f, -3.5714008643619716e-01f, -9.1444638670064871e-01f }, { -6.8977761666183057e-01f, -2.6839771165042281e-01f, -6.7243550466430679e-01f }, { 4.7935087021086187e-01f, -9.5831236095303366e-03f, 8.7757102673799225e-01f }, { 3.4855734768407490e-02f, 6.2846344376531693e-01f, -7.7705776979861207e-01f }, { -6.9266045915990182e-01f, 2.8879202400664322e-01f, 6.6092409184908696e-01f }, { -6.5765972677721851e-01f, 2.7335428324283456e-01f, -7.0196945774592678e-01f }, { 5.2032092793278428e-01f, -5.1637382251743047e-01f, 6.8016483838397845e-01f }, { 9.0851333392926670e-01f, 3.6215190467578295e-01f, 2.0844548450957448e-01f }, { -4.5126685015562268e-01f, 6.1441930521326771e-01f, -6.4718401350146781e-01f }, { 3.5040899866694891e-01f, 7.4239179167077085e-01f, 5.7102360836754285e-01f }, { -3.4800608048968763e-02f, 7.8775410645349797e-01f, 6.1500600439757735e-01f }, { -1.4025533333777138e-01f, -5.8770241447681471e-01f, -7.9682765607654016e-01f }, { -1.0295714102652018e-01f, 7.3712030391916594e-01f, -6.6787235656355903e-01f }, { 9.0738959939147254e-02f, 9.8102326058278011e-01f, 1.7134702607484159e-01f }, { 6.0813102147379439e-01f, 7.0862656000811353e-01f, -3.5780589594402568e-01f }, { 1.4585406310520371e-01f, 8.4805051035343049e-01f, -5.0944766577636746e-01f }, { 3.7423482475563002e-01f, -7.2384347134084237e-01f, 5.7965414251721004e-01f }, { -7.2214280156779320e-01f, 6.5260308146990742e-01f, 2.2938830004993790e-01f }, { -4.8055141791681910e-01f, -7.7932425252502824e-01f, 4.0214928094482605e-01f }, { 8.1855745123099233e-01f, -3.9693706206767432e-01f, 4.1521641079237825e-01f }, { -4.8777040437151664e-01f, 2.1608527126773117e-01f, 8.4580564443635520e-01f }, { -5.2789486643038463e-01f, -3.8544182858542503e-01f, -7.5681015239832117e-01f }, { 9.6936032952087736e-01f, -1.7739849714124914e-01f, 1.6991269747491566e-01f }, { -6.8634323989621304e-01f, 7.2722582723391216e-01f, -8.6921374081007172e-03f }, { -5.1308632482599892e-01f, -8.5747452482546060e-01f, 3.8468981685250134e-02f }, { -3.3189953852038884e-01f, 7.5146646556906860e-01f, -5.7021123055854028e-01f }, { 6.3676014447916107e-01f, -5.9298366607162445e-01f, 4.9285585131469639e-01f }, { -2.3581698853752825e-01f, 8.3554348749281415e-01f, -4.9624331574887409e-01f }, { -2.1378597197446117e-01f, 7.7427441165292199e-01f, -5.9564645020889395e-01f }, { 5.4091017137561415e-01f, -3.7306577551203923e-01f, 7.5381570270458309e-01f }, { -3.6685133718667101e-01f, 8.0169104311820314e-03f, -9.3024503522001656e-01f }, { 1.1711913025429245e-01f, 3.5067904763454544e-01f, -9.2914332310930714e-01f }, { 9.8666290247438615e-01f, 1.3957806693552394e-01f, -8.3751299162235879e-02f }, { 2.2541135392203476e-01f, 4.8326591453938256e-01f, -8.4595731415210862e-01f }, { -1.1655130634710963e-01f, 2.5999446933234743e-01f, 9.5855029544900416e-01f }, { 9.5333365426337968e-01f, -2.2201744289473160e-01f, 2.0460498209798136e-01f }, { 2.3643316550046672e-01f, -9.2146936343779839e-01f, 3.0821026994077833e-01f }, { -3.5868188816854807e-01f, -8.4493568117037732e-01f, -3.9677575251645064e-01f }, { 5.4802847768821561e-01f, -8.3479989965080659e-01f, -5.2667971156483535e-02f }, { -1.8657528405453638e-01f, 1.4356506452886511e-01f, -9.7189440559496576e-01f }, { -1.9438843925766705e-01f, -7.6778966678910276e-01f, -6.1050156613627693e-01f }, { -7.2344318619480519e-01f, 8.5411260627677746e-02f, 6.8508019450740176e-01f }, { 2.5057796246211883e-01f, -4.3600712289621213e-01f, -8.6435436801817589e-01f }, { -8.5145880491119286e-01f, 3.8298545278789964e-01f, -3.5824579061316364e-01f }, { 4.6882807450335434e-01f, -5.8801756319506293e-01f, 6.5911727479380888e-01f }, { 9.8587192583208005e-01f, -7.9902292781156899e-03f, 1.6731019721531856e-01f }, { 5.2812248581107402e-01f, -2.9878341481526315e-02f, 8.4864240095050947e-01f }, { -1.1627336680597425e-01f, 6.1919494027000344e-01f, 7.7658105186492299e-01f }, { 8.2282098320829777e-01f, 1.5733539510466410e-01f, -5.4608717531122219e-01f }, { 1.7858047293985849e-01f, 2.7201899245629696e-01f, 9.4557637577703768e-01f }, { -9.8084983813026028e-01f, 1.7062902488636611e-01f, -9.3911292751032438e-02f }, { 4.6133354769096968e-01f, -3.9548773651828761e-01f, 7.9420451272862036e-01f }, { -2.3528663149561266e-01f, 9.6955358968243477e-01f, -6.7867796290676644e-02f }, { 1.5049084657318190e-01f, -9.7506579602716881e-01f, 1.6309260717638518e-01f }, { 8.8624225300689849e-02f, 1.8300945407336758e-01f, -9.7910841402248228e-01f }, { -8.6449001637847717e-02f, -8.8056412683558483e-01f, 4.6597573825908939e-01f }, { 3.5417243660652159e-02f, 9.9038988569856623e-01f, -1.3369178418086508e-01f }, { 6.1167687054782038e-01f, 2.8271241306008821e-01f, -7.3886744246756941e-01f }, { 5.5887039403517424e-01f, -8.0321111246401899e-01f, 2.0619357770134825e-01f }, { -3.4198355066369757e-02f, -1.3552709565118287e-01f, -9.9018325518820483e-01f }, { 4.5280172373551025e-01f, -1.4748111479494988e-01f, 8.7932924423164127e-01f }, { 9.1976225748866447e-01f, -9.6248745474920572e-02f, 3.8049122025857546e-01f }, { -8.6871296748101678e-01f, -1.6668178567457939e-01f, -4.6642787486883686e-01f }, { 6.9376377741748785e-01f, -5.0763080387734805e-01f, 5.1088431968328774e-01f }, { -9.3187376447163872e-01f, 1.1003756438324193e-01f, 3.4569209061542144e-01f }, { 6.9779939585457396e-01f, -5.8588235874823591e-01f, -4.1208963206151522e-01f }, { 9.8782498623509607e-01f, 1.2758668066978757e-01f, 8.9013681450089366e-02f }, { 3.4649214588962557e-01f, 3.3142443462290994e-01f, -8.7755400800844563e-01f }, { -7.5814970187007613e-02f, -9.4667720910929309e-01f, 3.1313631544198589e-01f }, { -3.9031796915119088e-01f, 3.3115067190789743e-01f, 8.5906409275014983e-01f }, { -8.1001438731346520e-01f, 5.7890791425695576e-01f, -9.3500369816662765e-02f }, { -7.9600773282151083e-01f, -5.6356806831760586e-01f, -2.2082282866841588e-01f }, { 5.2684926509988628e-01f, 1.7516451555891318e-02f, 8.4977822153112392e-01f }, { -1.2646885141227351e-01f, 1.4823023044367376e-01f, -9.8083302779070181e-01f }, { 4.9608479085120288e-01f, 1.0369303165385212e-01f, 8.6206011128723015e-01f }, { -2.9500191792496916e-01f, -8.8188741655500680e-01f, 3.6776140763071613e-01f }, { -7.7919254860344234e-01f, -7.9333353209109295e-02f, 6.2174367006787534e-01f }, { 6.6975416401952304e-01f, 2.6460472488147163e-01f, 6.9383982254473586e-01f }, { -5.0192676940004677e-01f, 3.9828572709621879e-01f, -7.6774865532351710e-01f }, { -8.1902132005330330e-01f, 3.7282422274893801e-01f, 4.3612633058529587e-01f }, { -4.8068589175123116e-01f, -8.6663649900881379e-01f, 1.3372453797665562e-01f }, { 2.1322813623368680e-01f, 9.7457333880745245e-01f, 6.8851791581647670e-02f }, { 8.0033618063473044e-01f, 4.6493491241964630e-01f, -3.7854659578491523e-01f }, { -7.6044350405548833e-01f, 1.6261140826598625e-01f, -6.2871552155292232e-01f }, { -8.4333498286834771e-02f, -9.2655037203307145e-01f, -3.6659551163657378e-01f }, { -7.2975781230713943e-01f, -5.7512121237437686e-01f, 3.6971492592770017e-01f }, { 8.1001568471920327e-01f, -5.8387200249114901e-01f, 5.4480044198366828e-02f }, { 3.7474443133055303e-03f, 9.7600499868346535e-01f, 2.1771586806203952e-01f }, { 1.2840156196094588e-01f, 8.4723904625623758e-01f, 5.1546002501145549e-01f }, { 6.1100880980736870e-02f, 7.2625930741716160e-01f, -6.8470000783797458e-01f }, { 3.8740538692352527e-01f, -9.2145103497113889e-01f, -2.9069852652719559e-02f }, { -2.3182512912841280e-01f, -8.0294777503254255e-01f, 5.4911927672854854e-01f }, { 6.1715204368310317e-01f, -6.8258760853898848e-01f, -3.9140453707998030e-01f }, { -1.6269387066825042e-01f, -6.7184612659967846e-01f, 7.2260188667065584e-01f }, { -5.0416985112049617e-01f, -7.8447267887635430e-01f, 3.6113069284913057e-01f }, { -8.3240084708873097e-01f, 4.4248244435362627e-01f, -3.3364369648594172e-01f }, { -9.4436116702166728e-01f, -3.1468152708658093e-01f, 9.5694946219391147e-02f }, { 7.4545109045027846e-01f, -7.8264491292485694e-02f, 6.6194965152133678e-01f }, { 8.5074836475291116e-01f, -2.2661115598129719e-01f, -4.7420945146113203e-01f }, { -1.6897969292956458e-01f, 2.5631163031062515e-01f, -9.5170910027431155e-01f }, { 5.4048669376454317e-01f, 8.1053341072904761e-01f, 2.2563183276171386e-01f }, { -8.7291701599253668e-01f, 4.8391174050547719e-01f, 6.2010568386728054e-02f }, { -7.7789885483403065e-01f, -2.6929094524326724e-01f, -5.6776382278011639e-01f }, { 5.2629065065984793e-01f, 7.5508705962730377e-02f, 8.4694544473175359e-01f }, { 2.8340238707668125e-01f, -4.2341783955134055e-01f, 8.6046523471254444e-01f }, { 7.7375535520907801e-01f, -6.3348161017567384e-01f, -1.9235005872604968e-03f }, { -8.8862389242989803e-01f, 7.5535752712189999e-02f, 4.5237365956136294e-01f }, { 2.5688551352188682e-01f, 9.6528927159409561e-01f, 4.7185327040688375e-02f }, { -1.7878912914561992e-01f, -8.7130054338386054e-01f, -4.5702276792118374e-01f }, { -9.7804714425183403e-03f, -2.1286231346354387e-01f, -9.7703325321368162e-01f }, { -9.0615259033219020e-01f, 2.0865772034077007e-01f, -3.6789868004174037e-01f }, { 4.9797586753980250e-01f, 8.0243235936731061e-01f, 3.2881962226757766e-01f }, { 2.0547967647121418e-01f, -7.1432257257025344e-01f, -6.6897037667889303e-01f }, { 6.3979613538074587e-01f, -5.8378080684782607e-01f, -4.9986085534672897e-01f }, { 4.0752567656713773e-01f, 4.9309900460471878e-01f, 7.6861966836422568e-01f }, { 9.1212654886233946e-01f, -3.4631501885287774e-01f, 2.1929675459844170e-01f }, { 9.7177992519484224e-01f, 2.6966236912082307e-02f, 2.3434290912060504e-01f }, { -4.7735650133345009e-01f, 2.1919041999449654e-01f, -8.5093262389999136e-01f }, { 8.2232765229492044e-01f, 7.7187275624299889e-02f, -5.6375469554835878e-01f }, { 7.5613187885583286e-02f, 7.9436603265803885e-01f, 6.0271490107422021e-01f }, { -2.3822143677131397e-01f, -9.3788153030742716e-01f, 2.5224746216921506e-01f }, { -1.4232388266170615e-01f, -4.2741998639293755e-01f, -8.9277996598039655e-01f }, { -8.0007497770820835e-02f, 9.4883644325051875e-01f, 3.0546391646176019e-01f }, { -5.1654800221121666e-01f, 8.5575617523833725e-01f, 2.9317741267927962e-02f }, { 3.1979991307023636e-01f, 2.4653552531587644e-01f, 9.1484875818765476e-01f }, { 2.2516664811525741e-01f, 9.8544132696231079e-02f, -9.6932400903293814e-01f }, { 8.0484101567018740e-02f, -8.9639048011492506e-01f, 4.3589725458447665e-01f }, { -4.6749567648702761e-01f, 8.5812451710948368e-01f, -2.1229721053643594e-01f }, { -9.0520664652296423e-01f, -1.0807326181567820e-01f, 4.1100011821308419e-01f }, { 5.1551578154921029e-01f, -1.2908705782089508e-01f, -8.4710094467947072e-01f }, { -3.8888140346974126e-01f, -7.5466759608795464e-01f, 5.2843928076008140e-01f }, { -4.3879558177800010e-01f, 8.8627287477164127e-02f, -8.9420559231451158e-01f }, { -5.7855269417747135e-01f, -7.5380815274676827e-01f, 3.1152856837294080e-01f }, { -4.6099296207112783e-01f, -8.8645176698527928e-01f, -4.1094448889890632e-02f }, { 1.9288577507758098e-01f, 9.8082474077773540e-01f, 2.7890960023081252e-02f }, { 3.0208640191685715e-01f, -8.0873370115914023e-01f, 5.0467178085005460e-01f }, { -9.0452158265605365e-01f, 1.7302134950605685e-02f, -4.2607668633186085e-01f }, { -7.7926525044552752e-01f, 3.4813357187961175e-01f, -5.2110333483716287e-01f }, { -2.1789157183433785e-01f, -8.2883386609997289e-01f, 5.1532289424140065e-01f }, { -3.3781374431190353e-01f, -1.7776209025411852e-01f, 9.2427404671042157e-01f }, { -1.5953949544831588e-02f, 7.2296447470607772e-01f, -6.9070097712894984e-01f }, { 8.3589148906156407e-01f, 4.8562978047864697e-01f, -2.5583028520232337e-01f }, { -5.3372294972055456e-01f, -2.7616510198917582e-01f, -7.9929509530892195e-01f }, { -2.3228683302553382e-01f, -4.0015824022127577e-01f, 8.8651915376148505e-01f }, { -7.0488386727177710e-01f, -3.3669085337763788e-01f, 6.2432203461981195e-01f }, { -8.5859413312093780e-01f, -1.4350191101069268e-01f, 4.9216187998115485e-01f }, { -7.8617957894324486e-01f, 1.5395452539660243e-01f, 5.9851455601558190e-01f }, { -4.6473627730299849e-01f, 8.6457063801048750e-01f, 1.9114864490414016e-01f }, { -8.4597344714211542e-01f, 4.5275161017573851e-01f, -2.8168227884224900e-01f }, { 1.0254343015199427e-01f, -7.1384204942753060e-01f, -6.9275852459696652e-01f }, { 6.1946560242915716e-01f, -1.7039190246968584e-03f, 7.8502195132813879e-01f }, { -2.2763016427492247e-02f, 5.8695368408660631e-01f, 8.0930044966024950e-01f }, { 2.0689233561898765e-01f, -8.0481363829609776e-01f, 5.5630079010793976e-01f }, { 6.4175979265157423e-01f, 6.9743984370640411e-01f, -3.1893891726566520e-01f }, { 9.8246753516830776e-01f, 1.8636243807142855e-01f, 5.1559690052304184e-03f }, { -9.0574510426746346e-01f, 2.4573585359749189e-01f, 3.4531101394573810e-01f }, { -8.5607567353025160e-01f, -3.4092144873837227e-01f, -3.8846751084209774e-01f }, { 1.0975543350010893e-01f, 6.8290855998918254e-01f, -7.2221163346397588e-01f }, { 5.4933804593175961e-01f, 7.1649167789518453e-01f, -4.2996207600068542e-01f }, { -3.2644025301539920e-01f, -8.9779565537235306e-01f, -2.9563444049327098e-01f }, { -3.9772918833566723e-01f, 5.3167071768524610e-01f, -7.4775513418625672e-01f }, { -8.1421253874292687e-01f, 3.0962785068875245e-02f, -5.7974067279653274e-01f }, { -3.3280568081561623e-01f, -9.3617159681174877e-01f, 1.1323921643933624e-01f }, { -3.5098545082184168e-01f, -2.4901641564329594e-01f, -9.0266274878913322e-01f }, { -9.8927373500988391e-01f, 3.0742098432229251e-02f, -1.4280196288418845e-01f }, { 1.6910005899698580e-01f, -8.8469077087179526e-01f, 4.3442768095677847e-01f }, { -2.5673117014302288e-01f, -5.9377431313419671e-01f, 7.6257535453160774e-01f }, { -4.2467758075476969e-01f, 8.7405891691230364e-01f, 2.3594482865781707e-01f }, { 4.4733382666516275e-01f, -8.9353353887110887e-01f, -3.8603917334572385e-02f }, { -3.8013621458089997e-01f, -6.1312701263863401e-01f, 6.9251117300512066e-01f }, { -8.2590465965503623e-01f, -4.5059217302786397e-01f, -3.3889258883328532e-01f }, { 9.6923119549011227e-01f, 9.2813577273982373e-02f, -2.2798361687282342e-01f }, { 3.5688357205626714e-01f, -5.9634562789353218e-01f, -7.1903129840684121e-01f }, { 7.0195036090944452e-01f, 6.5394373188485888e-01f, 2.8217598471096766e-01f }, { 1.4782926737000163e-01f, -2.5278326773954995e-01f, -9.5616270961576599e-01f }, { -4.5609669623150229e-01f, 7.1786337805493372e-01f, -5.2597335876854834e-01f }, { -2.3535799293541543e-01f, 7.7896296020023931e-02f, 9.6878211287563198e-01f }, { 1.2100457619315422e-01f, -4.6406872321751380e-01f, 8.7749536333338063e-01f }, { 1.3021983865795148e-01f, 1.7415497928379914e-01f, 9.7607009830777858e-01f }, { -4.0984053086812550e-01f, -3.0490027880672449e-01f, -8.5968980408128304e-01f }, { 7.6987650933995322e-01f, -3.5237292159049882e-01f, -5.3209349225141356e-01f }, { -6.4825908899877749e-01f, -7.5359907333575560e-01f, -1.0885122965757288e-01f }, { 9.5260682230186178e-01f, 2.8867305466954274e-01f, 9.5958895427699947e-02f }, { -2.9108803479159007e-01f, -9.5431333884578051e-01f, -6.7481903516339314e-02f }, { -3.3379901291245534e-03f, 9.6365899550908674e-01f, 2.6711457877906225e-01f }, { -3.1849400213181467e-01f, -9.4725105499467210e-01f, 3.5735268538803697e-02f }, { -5.5425767312344199e-01f, 5.8941371477853277e-01f, 5.8769882134879092e-01f }, { -8.4853207247271756e-01f, -2.4522603718352107e-01f, 4.6888965937885757e-01f }, { 2.2170339006237924e-01f, 9.6836629168804711e-01f, 1.1451782375328580e-01f }, { 5.6335808669013554e-01f, -4.3954956802060058e-01f, -6.9958833853469371e-01f }, { -6.9630116477691617e-01f, 6.6722403622156190e-01f, 2.6453123335159806e-01f }, { 4.5163396547395690e-01f, 2.0251911832473801e-01f, 8.6891470694380557e-01f }, { 2.1767079581891816e-01f, 3.4603638402107256e-02f, 9.7540863890827578e-01f }, { -6.2945483983499007e-01f, -6.2816975483368531e-01f, 4.5737223759263612e-01f }, { 7.2014936414814268e-01f, -2.9247879491348344e-01f, -6.2915900044661388e-01f }, { -3.1350630075204350e-01f, 6.3108669315472776e-01f, 7.0953744447477873e-01f }, { -4.4415594800775636e-02f, -6.9206483812061659e-01f, -7.2046756677561685e-01f }, { -2.1949041303214148e-01f, 8.1719006205615696e-01f, 5.3293935964951422e-01f }, { 3.0550092051577593e-01f, 3.1482960176880659e-01f, -8.9863869792820972e-01f }, { -9.4132119814076642e-01f, -4.6587071004457185e-02f, 3.3428138857264805e-01f }, { -3.7660592224650824e-01f, 3.1751442009241326e-01f, -8.7026006019019142e-01f }, { 5.3872183954306918e-01f, -7.3283416879804608e-02f, 8.3929036716130156e-01f }, { -2.3535417651412238e-01f, 7.1157236182217465e-01f, -6.6202204305307810e-01f }, { -4.6290079411429030e-01f, -3.4016161561873504e-01f, -8.1854317544526101e-01f }, { -8.1902428229316138e-01f, -3.9733699696560182e-01f, -4.1391126567964937e-01f }, { -7.0987115972771309e-01f, -6.1004987353665407e-01f, 3.5202569279065987e-01f }, { -7.3058383383516967e-01f, -3.0828443284032642e-01f, -6.0926838930558624e-01f }, { -9.3652735190272202e-02f, 3.1491351547241775e-01f, 9.4448856158461969e-01f }, { 1.8570622768364548e-01f, 3.1264191563446880e-01f, -9.3154078256827799e-01f }, { -7.8080334327012557e-02f, -9.9598822791615693e-01f, -4.3713970808145097e-02f }, { 9.2034911070693715e-01f, 2.9105281079594630e-01f, 2.6123892464318771e-01f }, { 3.2294048602238312e-01f, -9.2882290712934334e-01f, -1.8165200158385819e-01f }, { -4.1036435194282878e-01f, 2.5850565944364334e-01f, -8.7451467837318164e-01f }, { 4.6728654381266527e-01f, -8.3798760619446722e-01f, 2.8181564512297846e-01f }, { 8.2779457038230453e-01f, -1.6952136884612207e-01f, -5.3480711920290747e-01f }, { -8.5935702004554404e-01f, 4.4568616812109474e-01f, 2.5073761513577830e-01f }, { 9.3469297453217659e-01f, 2.8498652925968682e-01f, -2.1244227804443599e-01f }, { 2.0145720001505016e-01f, -7.6197228819009977e-01f, 6.1547804883069512e-01f }, { -3.7686523897136298e-01f, -4.7369807903920708e-01f, 7.9597909618885265e-01f }, { -8.3310452917028499e-01f, -4.7369326649423973e-03f, 5.5309529463274743e-01f }, { -8.2286321385070738e-01f, -3.3745964178227472e-01f, 4.5718390332497932e-01f }, { -3.8445032413983055e-01f, 9.0944076768109106e-01f, -1.5847851068333191e-01f }, { 9.7073293452868449e-03f, -9.6621387822985849e-01f, 2.5755874916802612e-01f }, { -2.6382567844699356e-01f, 4.6984220935840076e-01f, -8.4240388751310991e-01f }, { 7.2172943592862948e-01f, -6.5158864863323263e-01f, -2.3353555251066210e-01f }, { -5.7135665410275160e-01f, 8.1534535870931746e-01f, -9.3613673379924905e-02f }, { 2.8147378461230121e-01f, -9.4295610667528162e-01f, -1.7778157795402399e-01f }, { 3.1145529284041679e-01f, -8.5858665703534121e-01f, -4.0721560987094729e-01f }, { 7.9887859827369290e-01f, 1.9145890298895174e-01f, -5.7020739532781117e-01f }, { -7.3845631802785616e-01f, 4.8962197670251356e-01f, 4.6362979444235991e-01f }, { 6.3932786131872232e-01f, -1.3766572562920662e-01f, 7.5651043200250223e-01f }, { -7.1696199168661179e-01f, 4.3496138120892930e-01f, 5.4476976727199833e-01f }, { -1.7110972651197454e-01f, 3.2088099218078581e-01f, -9.3153467479749341e-01f }, { -6.3780005149540697e-01f, -7.5897971143218224e-01f, 1.3099958758247154e-01f }, { 6.4378807979921016e-01f, -7.4062924306118438e-01f, 1.9236744171263201e-01f }, { 2.3976999586291306e-01f, -8.3285370710229001e-01f, -4.9886376060992010e-01f }, { -9.5904345486371678e-01f, -2.1318486162582370e-01f, -1.8651505691671252e-01f }, { -7.4231356791852401e-03f, -7.8841170629984636e-01f, 6.1510314454248505e-01f }, { -6.5737524135912703e-02f, -8.9239244888788782e-01f, -4.4644629586139328e-01f }, { -9.3133130555130661e-01f, 3.6316206502431875e-01f, -2.7116670654252092e-02f }, { 5.0057665222209913e-01f, -6.4499547631085352e-01f, 5.7741133586781179e-01f }, { -9.9506095226892277e-01f, 6.7916708328027958e-02f, -7.2394903132403390e-02f }, { 6.8565454327123465e-01f, -2.3275031229026241e-01f, 6.8971380979381591e-01f }, { 3.5583834068963183e-01f, -8.6213301656403474e-01f, 3.6070172864216687e-01f }, { 3.9346253734450837e-01f, 4.0862248633039011e-01f, -8.2353803516995583e-01f }, { 5.2664186937731935e-03f, 2.2636708514923470e-01f, 9.7402782691008427e-01f }, { 6.8762946374779388e-01f, 7.1871700814090045e-01f, 1.0301253707638861e-01f }, { -7.8450860719690141e-01f, -1.4632775246507276e-01f, -6.0260636745100715e-01f }, { 5.4980226726356451e-01f, 2.1252124420783028e-01f, -8.0780702378241287e-01f }, { -4.8299540154266835e-01f, 1.1120109703376861e-01f, -8.6853310708753229e-01f }, { 2.7850402279039055e-01f, -4.6472647418064728e-02f, -9.5931006579287281e-01f }, { -3.0942583864612017e-01f, -8.6859981226225547e-01f, -3.8702715216909495e-01f }, { 6.9007685995528845e-01f, -7.1696787304423448e-01f, 9.8747133511183943e-02f }, { -7.4362657072520832e-01f, 2.6443405619204875e-02f, 6.6807205420577565e-01f }, { -2.4439755321113046e-01f, 9.3392678090283188e-01f, 2.6086510670629454e-01f }, { 4.0387436361622897e-01f, 8.9814488345959809e-01f, 1.7384264933821922e-01f }, { 8.0011483174252651e-01f, -2.3951735139370448e-01f, -5.4995244740520366e-01f }, { 6.3387837817412598e-02f, -8.6772309812609782e-01f, -4.9298945931457799e-01f }, { 9.1605371963349813e-01f, -2.6494753882445032e-01f, 3.0107870136643461e-01f }, { -3.8122502816212289e-01f, -8.5216477161687509e-01f, -3.5844480735246786e-01f }, { 3.8405775044539769e-01f, 9.2002480048356450e-01f, 7.7807524173424264e-02f }, { -1.1961201349479021e-01f, 6.0328108812338310e-01f, -7.8850801831077721e-01f }, { 9.3910412106342678e-01f, 3.4021447353797774e-01f, -4.8348338099310814e-02f }, { 1.5985038371931315e-01f, 4.2439017777151304e-02f, 9.8622856610164100e-01f }, { -1.5050787144074554e-01f, 9.6739109216282093e-01f, -2.0372004181817885e-01f }, { 2.1490240881853415e-01f, 4.4221176024416470e-01f, -8.7078453924363464e-01f }, { -3.2114302016412816e-01f, -8.4343996563076806e-01f, -4.3066946139310991e-01f }, { 7.9206390310360286e-01f, -6.0258098665014481e-01f, 9.7626471451264477e-02f }, { -5.4175202649636633e-01f, 6.9563760683758213e-01f, 4.7179769153776285e-01f }, { 7.3500393737574099e-01f, 5.5958381973773097e-01f, -3.8292970729611503e-01f }, { 2.7998590972458576e-01f, -9.5752519169342265e-01f, -6.8944888339674021e-02f }, { -9.4196136476117287e-01f, 2.1592738336591877e-01f, 2.5706838080560623e-01f }, { -3.4279638859630002e-01f, -7.7232722478220772e-01f, 5.3479088794177088e-01f }, { -3.5471485498041366e-01f, -8.4911218365140384e-01f, 3.9138966674015396e-01f }, { -6.3240316616731895e-01f, 3.1886027868501449e-01f, -7.0597050795232608e-01f }, { -2.8131348616357327e-01f, -4.7020843737373458e-01f, 8.3652062014336970e-01f }, { -6.3710591184658938e-01f, -7.3225454484704633e-01f, -2.4062281404923100e-01f }, { -9.9180834549414676e-01f, -1.2205479606984224e-01f, 3.7667393917184017e-02f }, { 8.6857138833863423e-02f, 1.5619194320176100e-01f, 9.8390035791865271e-01f }, { -3.7007270178139956e-01f, -5.7920810896801851e-02f, 9.2719543520299552e-01f }, { 3.3516625371208655e-02f, -7.7780268813872966e-01f, 6.2761422398467992e-01f }, { -8.7997062247820834e-01f, 4.5659300625960464e-01f, -1.3105163184840973e-01f }, { -3.3637917017298562e-02f, -7.6098826133783770e-01f, 6.4789301327051840e-01f }, { -3.1213549154573467e-01f, -9.4429816759912022e-01f, -1.0427082807020599e-01f }, { 9.3675468932122019e-01f, -2.6995467490046943e-01f, -2.2274452975120629e-01f }, { -3.5243718767937210e-01f, 8.3933891130785432e-01f, 4.1388189221709254e-01f }, { -5.5457291630403471e-01f, 6.6252240624098413e-01f, -5.0350068692177008e-01f }, { -6.2894416239523054e-01f, 4.9432775544649149e-01f, -6.0005775620701352e-01f }, { 8.4579556283388202e-01f, 1.0797789019093318e-01f, -5.2246592340594955e-01f }, { -5.8473362773058857e-01f, -6.7098590158577021e-01f, -4.5592159904325275e-01f }, { -3.2036347111439772e-01f, -2.1787983124162552e-01f, -9.2189783897873157e-01f }, { -6.7272137100310192e-01f, 7.3230165866110664e-01f, 1.0573664321274354e-01f }, { -4.3709979992147419e-01f, 2.1835580758273537e-01f, 8.7250473133588147e-01f }, { -7.9162550336814241e-01f, 1.9400217233729486e-01f, 5.7938952315825121e-01f }, { -3.5002631990930144e-01f, 7.8215804504307496e-01f, -5.1547101562080733e-01f }, { 1.3685832432762662e-01f, 9.1669244063065858e-01f, 3.7542611570432965e-01f }, { 1.9821696068172023e-01f, 1.4028552826831370e-01f, -9.7006701163197051e-01f }, { 5.7024068670573980e-01f, 6.4351008866948411e-01f, 5.1060779959373814e-01f }, { 8.9383674327788554e-01f, -3.0629855046957577e-01f, -3.2747072288468781e-01f }, { -9.4352025071006540e-01f, 6.9420082199608810e-02f, -3.2396047395849836e-01f }, { 5.0185384111364188e-02f, -8.4333217458755438e-01f, 5.3504417623876765e-01f }, { -3.8031261984855236e-01f, 8.8783010336511847e-01f, -2.5907531480751617e-01f }, { 8.3886514599037110e-01f, 1.5469953791449751e-02f, -5.4411942381451872e-01f }, { -7.6085540016198849e-01f, -6.3368945783593700e-01f, 1.3977385689726293e-01f }, { -5.3747271144422915e-01f, 6.4713538230539791e-01f, -5.4068371662297610e-01f }, { -3.7694652328216149e-01f, -6.1837841252638215e-01f, -6.8957918871355328e-01f }, { 5.4100604269202834e-01f, -8.2722205104249069e-01f, -1.5171071168433037e-01f }, { 2.2991035862968395e-01f, 1.8360757381895237e-01f, -9.5573505001704739e-01f }, { -8.5590534949737196e-01f, -4.9709480601628725e-01f, -1.4255801111621638e-01f }, { -7.1351236547304020e-02f, -1.0473025295779002e-02f, -9.9739626868377873e-01f }, { -3.9393158883727147e-01f, -6.4694784559968493e-02f, -9.1686012464654720e-01f }, { -7.7341102745787127e-01f, 2.0069909998653421e-01f, -6.0129464813114297e-01f }, { 7.6505034477720080e-01f, -1.9092403039414679e-01f, -6.1501706039291404e-01f }, { 4.2490640628405169e-01f, 8.7898497496947459e-01f, 2.1642541365718765e-01f }, { -7.9793691847412374e-01f, -3.0156473255180544e-01f, -5.2187679218085337e-01f }, { -6.8606781346913814e-01f, -7.1055342181822945e-01f, 1.5628432443492579e-01f }, { 9.6508565523455725e-01f, 2.4021836590064213e-01f, 1.0442612098756889e-01f }, { -5.6549035192683750e-01f, -7.6171075833227986e-01f, -3.1625524899758500e-01f }, { 1.1122261346398279e-01f, -1.6898519841253720e-01f, 9.7932299726480276e-01f }, { -6.0571422768820471e-01f, 4.2187781423407944e-01f, -6.7463277731900728e-01f }, { -7.1376551773061458e-01f, 2.2609015719711814e-01f, 6.6288915100288825e-01f }, { 7.3333108098316258e-01f, 3.9928372217267488e-01f, 5.5027087409020714e-01f }, { -8.9071519251740938e-01f, -4.5352138240019341e-01f, 3.0737623923978830e-02f }, { 1.6328672651000481e-01f, -2.0671974031572499e-01f, -9.6467838884751955e-01f }, { 2.8392218327471014e-01f, 7.8612496803924781e-01f, -5.4899519894969351e-01f }, { 8.4375400408261692e-02f, 3.7685755239327441e-02f, 9.9572113347964397e-01f }, { 3.9689999571725426e-01f, 8.3316311040626256e-01f, 3.8510988673079477e-01f }, { -3.2150327717064214e-01f, -7.4753595754714131e-01f, -5.8122769629691240e-01f }, { -1.2862126939859461e-01f, -9.5995496429645932e-01f, 2.4888357836723066e-01f }, { -4.0121610613302805e-01f, -4.8780931382071291e-01f, -7.7528556643937085e-01f }, { -9.7596770933997867e-01f, 1.9687330143116941e-01f, 9.3423409856774858e-02f }, { -2.9164072483714060e-01f, 7.2055463967052125e-01f, 6.2908401574491812e-01f }, { -5.7972711297216450e-01f, -8.0106314850416183e-01f, -1.4904464630961564e-01f }, { -5.6146670939189880e-01f, -2.2039968170484447e-01f, -7.9760837166433773e-01f }, { -4.6762727645470814e-01f, -8.5581602050330108e-01f, 2.2114174044138615e-01f }, { 6.5965028288547156e-01f, 6.9758320132050056e-01f, 2.7971267673196204e-01f }, { -2.7788653108110478e-01f, -5.9133659304599662e-01f, -7.5703375721856914e-01f }, { -2.5920612179528152e-01f, -6.2763793274013935e-01f, 7.3408637898379103e-01f }, { 8.9485298155360937e-01f, -4.4582761621455297e-01f, -2.1814628694176635e-02f }, { 4.4952532500353581e-01f, -7.5217088597396276e-01f, -4.8183600993866105e-01f }, { 4.0259463258272815e-01f, 8.0149150276757986e-01f, -4.4218653621174947e-01f }, { 8.9655198437099393e-01f, -2.9223101386423594e-01f, 3.3285969094547002e-01f }, { 3.4321083952887288e-01f, 9.3921407649229471e-01f, 9.1234943202786883e-03f }, { 2.5219972619648939e-01f, 9.6199456450141696e-01f, -1.0469840484049812e-01f }, { 9.4742997917931027e-01f, 6.7519809887763294e-02f, -3.1275790929249409e-01f }, { -2.8864839760813032e-01f, 9.4780174539560236e-01f, 1.3547676547404133e-01f }, { -1.6714185343547325e-02f, 2.2646273319550822e-01f, -9.7387641232443944e-01f }, { -8.6008576608698417e-01f, -4.9268472696194210e-01f, 1.3234135707707578e-01f }, { -4.0614085231556302e-01f, 2.7127378301449534e-01f, 8.7261683614825614e-01f }, { 4.1291398443280131e-01f, 9.0871974503029329e-01f, -6.1077544579877199e-02f }, { -7.5031003475919744e-01f, 5.8596853716754238e-01f, -3.0606490355704352e-01f }, { 4.8845870497937088e-01f, 6.7088639392761640e-01f, 5.5796015984358149e-01f }, { 3.7177369129310006e-01f, -6.3634643964215032e-01f, -6.7590497203161770e-01f }, { 3.3706444996496726e-01f, 4.4546584496027480e-01f, -8.2942614954174343e-01f }, { -4.2685912918983238e-01f, -8.9708502339578322e-01f, -1.1414790679765065e-01f }, { 5.2975578957432925e-03f, -9.9513166837413836e-01f, -9.8411881799126313e-02f }, { 8.5750618363570097e-01f, 1.0447384559028219e-01f, 5.0375426610016250e-01f }, { 5.6630101436948355e-01f, 7.4810581713755009e-01f, 3.4589138105632616e-01f }, { 9.7587104757352139e-01f, 2.1342268251885127e-01f, 4.6113523983917978e-02f }, { 3.1311495734578892e-01f, -7.5506520996485660e-01f, -5.7605169228730835e-01f }, { 7.2275298866114479e-01f, 2.3646954992622002e-01f, -6.4939223073507280e-01f }, { -4.8711753946364622e-01f, -8.5649830092966184e-01f, -1.7066681942160108e-01f }, { -9.5806624227160797e-01f, 2.6130935560631458e-01f, -1.1758612202200262e-01f }, { 1.0557629165646210e-01f, -3.1345838147519089e-01f, 9.4371472899548592e-01f }, { -3.0627775596961804e-01f, 3.9840626907867771e-01f, 8.6456138067636545e-01f }, { 9.0827485638858407e-01f, 1.7154213094924350e-01f, -3.8158889208373142e-01f }, { 1.0440193442459486e-01f, 6.4806805932442557e-01f, 7.5439248841161943e-01f }, { -1.8804286477261131e-01f, -9.7632236887687840e-01f, 1.0693228249107031e-01f }, { -9.6357855015232952e-01f, -2.5362539933505246e-01f, 8.4797019396142884e-02f }, { 5.0772927753702124e-01f, -5.6514581782488060e-01f, 6.5024701869887969e-01f }, { -2.7044207662701616e-02f, -8.1413397821478717e-01f, 5.8004696046791004e-01f }, { 7.8261810594766401e-01f, 6.1434776608231312e-01f, 1.0042769813434133e-01f }, { 8.2512995285681678e-02f, -2.2053210551012416e-02f, -9.9634595473328325e-01f }, { -4.2062019710538613e-02f, -9.6457624099266726e-01f, -2.6042937969884683e-01f }, { 9.9357193278565470e-01f, 6.2655818063638180e-02f, -9.4281826686561820e-02f }, { -3.8434861348933042e-01f, -8.5669014350844908e-01f, 3.4403218065219188e-01f }, { -7.2166504697313483e-01f, 9.6586838652546900e-02f, -6.8547103700766954e-01f }, { 9.7373486760453087e-01f, 2.0134861183401850e-01f, 1.0629743234763707e-01f }, { 7.3558505709702182e-01f, 6.3983861608763293e-01f, -2.2253352362876475e-01f }, { 3.7825041404459098e-01f, 2.3413319204198038e-01f, -8.9560497578973319e-01f }, { -5.0377624944411403e-01f, -4.3481814969439270e-01f, -7.4641990005114844e-01f }, { 1.1464137293472046e-01f, 9.6447964910438932e-01f, -2.3798395339836742e-01f }, { 6.2594281805238894e-01f, 7.7606764168244946e-01f, -7.6906463070896089e-02f }, { -9.4202249051961373e-01f, -1.3224437400750533e-01f, -3.0839107136651528e-01f }, { 6.3055958911522159e-01f, -3.2204477135493553e-01f, 7.0617403649368904e-01f }, { -7.4413780483106740e-01f, -6.2164543162783059e-01f, 2.4457286185807406e-01f }, { -2.3995546768979190e-01f, -7.2532536691403093e-01f, -6.4523211764201538e-01f }, { 6.6599377686051439e-02f, 6.8703191086465476e-01f, -7.2356870879377566e-01f }, { 2.2466718863888951e-01f, 8.2594706525092709e-01f, 5.1704554901137922e-01f }, { 9.2424913829771305e-01f, 2.5604004451711249e-01f, 2.8320844966139325e-01f }, { -4.3057966990873531e-01f, -8.2982721505892321e-01f, -3.5494780040005341e-01f }, { -4.9850037566790623e-01f, 8.9661395770524385e-03f, -8.6684311371784062e-01f }, { -9.7967655590305336e-01f, 1.4039111941114352e-01f, -1.4326262389198963e-01f }, { 6.5128202481197905e-01f, -7.5765963411488746e-01f, -4.2232724156789539e-02f }, { 9.8453960572844723e-01f, -1.7144093506928967e-01f, 3.5913375428121064e-02f }, { 5.4291477132647113e-02f, -7.4199815527542823e-01f, 6.6819994992413523e-01f }, { 6.5374497073638849e-02f, 7.9470700994989693e-02f, 9.9469119972770126e-01f }, { -4.0865385008674354e-01f, -8.8282383633449457e-01f, -2.3156879066257366e-01f }, { 5.7443817390730151e-02f, -8.0803489939521689e-01f, -5.8632739080051699e-01f }, { -1.2676009878769207e-01f, -1.5781878673769567e-01f, 9.7929827320790075e-01f }, { 4.2499534090875146e-01f, -8.1661519520930759e-01f, 3.9053627636766175e-01f }, { 4.3813419634583595e-01f, -2.4459511930218536e-01f, 8.6499228528694883e-01f }, { -6.2217718190240245e-01f, -7.3092351526639465e-01f, 2.8043959982606093e-01f }, { 9.6248397582715073e-01f, 9.5305907927237712e-02f, 2.5404995609156389e-01f }, { 3.9714362558942229e-01f, 8.9026704202631968e-01f, -2.2293840973550519e-01f }, { 2.9119532415416916e-01f, 6.8937667403718761e-02f, -9.5417654614001213e-01f }, { 9.0312355378345310e-01f, -3.8268216796036397e-01f, 1.9473624451216553e-01f }, { -8.6944006752086656e-01f, 1.3330974440847440e-01f, 4.7571260340152666e-01f }, { 3.0175535918653779e-01f, -9.0632884210976883e-01f, 2.9582382115402622e-01f }, { -4.4492966832865422e-01f, 1.4088123804224567e-01f, -8.8441509881312963e-01f }, { -7.4642311125394867e-01f, 4.9389299879200189e-02f, -6.6363637335774317e-01f }, { -7.5808621996825687e-01f, 3.9685543077997848e-01f, 5.1750463780982425e-01f }, { 7.4471450163952058e-01f, -6.6577130424349018e-01f, 4.6356029745035096e-02f }, { 6.7079765461258001e-01f, -7.0343457374300711e-01f, -2.3496873628050097e-01f }, { -6.2236913264100124e-01f, -6.6900968464621757e-01f, -4.0630370978524954e-01f }, { -1.4656333030955074e-01f, 7.3054020732449254e-01f, -6.6695591735200987e-01f }, { -1.1449021635285282e-01f, 3.9798694026926584e-01f, 9.1021886694057530e-01f }, { 6.7625714511272778e-02f, 9.7486127039186810e-01f, -2.1230229915569160e-01f }, { -1.4996615557844292e-01f, -6.8575489881086138e-01f, -7.1221511563426354e-01f }, { 1.7056344497371231e-01f, -9.8382948631450418e-01f, 5.4659428252025383e-02f }, { 1.3945363473011599e-01f, -3.0085259773289741e-01f, -9.4341952396477724e-01f }, { 3.7565111017175218e-01f, -9.2663940105169929e-01f, 1.5022111878097358e-02f }, { -3.6420456386161967e-02f, 9.7578938208945443e-01f, -2.1565860093700087e-01f }, { 2.6626667643216623e-01f, -8.0262713271517649e-01f, 5.3375251086171260e-01f }, { -4.6753019163756593e-01f, -5.5363184329340442e-01f, -6.8913518412492070e-01f }, { 1.2236158117789185e-01f, 9.9024466537908695e-01f, -6.6656928671416760e-02f }, { -7.3102891482675536e-01f, 6.6070091651894669e-01f, 1.7050227153396080e-01f }, { -5.6197327898726179e-01f, 1.7910726599286703e-01f, -8.0753118885456399e-01f }, { -9.9943042241006430e-01f, 3.2425349657063417e-02f, 9.3502652827344920e-03f }, { -8.1471794813873266e-01f, -2.0319202692809057e-01f, 5.4309084431010934e-01f }, { -3.8084688133676692e-01f, 5.0319722724119531e-01f, -7.7572430893509547e-01f }, { -2.8924716210286722e-01f, 8.6603503013115646e-01f, 4.0782276273053297e-01f }, { -2.5535903484908240e-01f, -7.0048496477847066e-01f, 6.6641771993266341e-01f }, { 9.2399578535340110e-01f, -3.8062146840727312e-01f, 3.6865789516063577e-02f }, { -1.2346499231223672e-01f, -7.8769718196254751e-02f, -9.8921773496466492e-01f }, { -8.2011443176379006e-01f, -5.2638362062740063e-01f, -2.2434928738006846e-01f }, { -4.4923156121533435e-02f, -3.3707170364836470e-01f, 9.4040660176525204e-01f }, { -4.4550611332656309e-01f, 5.1651056551076158e-01f, -7.3125996656757630e-01f }, { -8.0637497967673044e-01f, 2.3210985899829520e-01f, 5.4395257652404227e-01f }, { -9.5463883901498980e-01f, 3.6880997458219190e-02f, -2.9547331363525753e-01f }, { 8.1519781729807539e-01f, -3.6546092175564582e-01f, -4.4932263835908293e-01f }, { -9.5599405052298958e-01f, 2.8971339462369022e-01f, 4.6276606836125951e-02f }, { -6.2476494875325839e-01f, -7.6615479843218537e-01f, -1.5058414142490464e-01f }, { -5.3317886205679144e-01f, 1.5343993835780595e-01f, 8.3197144564737169e-01f }, { -9.1592185278276017e-01f, -2.7616007620674821e-01f, -2.9124349246717746e-01f }, { 6.3469037768578918e-01f, 1.3417730806401518e-01f, -7.6102862920770908e-01f }, { 2.9028270769078396e-01f, -8.2371992320944265e-01f, -4.8705383452297840e-01f }, { -2.7707312216162250e-01f, -6.2895924722072150e-01f, -7.2638884236416656e-01f }, { 2.4267434162864354e-01f, 7.4669034383184574e-01f, 6.1932438539378076e-01f }, { 9.6107120033984739e-01f, 5.1680636591955841e-02f, 2.7142450088150688e-01f }, { 9.2764864567284305e-02f, -9.5227497812981265e-01f, 2.9080413671348992e-01f }, { -8.7410885799952187e-01f, -3.3045353472587685e-01f, 3.5599742380239963e-01f }, { -5.3874253930746197e-01f, -8.3926636298246571e-01f, 7.3406050886368035e-02f }, { -5.6010597583258581e-01f, -7.0204191864621646e-01f, -4.3979363376493519e-01f }, { -7.0784835019309628e-02f, -5.9298259500383244e-01f, -8.0209796730437488e-01f }, { 5.8419073099547580e-01f, -5.0101946105375506e-01f, 6.3851443951125841e-01f }, { -4.0858243090121932e-01f, -8.2123398966724015e-01f, -3.9829026020488839e-01f }, { 7.3345794945333120e-01f, 6.6283044191370533e-01f, 1.5064939978704489e-01f }, { -1.8417321426527858e-01f, -9.8143543869262140e-01f, -5.3522956060156453e-02f }, { -8.9249571883036938e-01f, 2.9317983451800217e-01f, 3.4277831976579148e-01f }, { -5.3421586813519617e-01f, -6.9061444219479218e-01f, -4.8750907526376869e-01f }, { -4.5540542210676410e-01f, -7.5560626419629473e-01f, -4.7081320608398325e-01f }, { -3.7371037511722871e-01f, -8.2115244478531590e-01f, 4.3133422998046295e-01f }, { 3.5326646029938213e-01f, 1.0544014773133166e-01f, 9.2956182326617742e-01f }, { 1.5294260274832819e-01f, 8.8008816037642834e-01f, -4.4950349301179077e-01f }, { 3.5283774231610798e-01f, 6.2489451137035568e-01f, 6.9642830015477986e-01f }, { 4.8493944255445570e-01f, -2.4594803768425125e-01f, 8.3925163080820997e-01f }, { -7.4403560589713702e-01f, -3.2328571993451793e-02f, 6.6735738595608918e-01f }, { -4.0016911380986103e-01f, -7.7493550492145979e-01f, 4.8922351084627236e-01f }, { -3.6365816650629240e-01f, -7.8086631912399507e-01f, -5.0793752528340030e-01f }, { 3.8168937665044628e-01f, 1.4497235584745910e-01f, 9.1285060978904509e-01f }, { 9.7764923301230960e-02f, 6.9122751728905207e-01f, 7.1599339320577360e-01f }, { -2.0689578702012032e-01f, 6.8684401338133350e-01f, 6.9673483808084946e-01f }, { 7.1305356540559817e-01f, -4.6001524666476068e-01f, 5.2909411799633888e-01f }, { 1.8168191757054211e-01f, 9.8244912703708409e-01f, -4.2253918303065512e-02f }, { -2.3519123403938719e-02f, 7.0918776738451028e-01f, 7.0462724998859083e-01f }, { -2.1362678070068838e-01f, -4.5451976746806005e-01f, 8.6474006472941944e-01f }, { -1.5806293004619171e-01f, -2.9081810275269054e-01f, -9.4363178266553649e-01f }, { -2.7093422840457115e-01f, -8.7134108097184149e-01f, 4.0909578889257991e-01f }, { 5.5942456427043130e-01f, -8.2275321996582673e-01f, -1.0060465161562875e-01f }, { -1.3432844107892189e-01f, -9.7911518233500749e-01f, 1.5260841929065261e-01f }, { 1.9655659585265220e-01f, -3.9570087627779265e-03f, 9.8048449590417719e-01f }, { -6.5930410950075546e-01f, -3.3528293792361541e-01f, 6.7298101216358619e-01f }, { 2.4617674833848727e-01f, -1.4924642604517119e-01f, 9.5766513609415294e-01f }, { 7.8814261964154075e-01f, 5.2042857785298702e-01f, -3.2861117823118413e-01f }, { -8.7017105366880620e-01f, -2.6830455575176809e-01f, -4.1329771680928262e-01f }, { 8.5845349799660275e-01f, -3.7887643638931129e-01f, -3.4570252779858746e-01f }, { 2.9410352050370442e-01f, 9.0037633505265569e-01f, -3.2066427070142239e-01f }, { -9.8756892828128162e-01f, -8.0548643102265449e-02f, 1.3497973176645714e-01f }, { 6.6045514848383380e-01f, 6.0148829809473747e-01f, -4.4945614257265781e-01f }, { 1.3569942971705003e-02f, -5.4598119439173765e-01f, 8.3768752647888711e-01f }, { -3.9550664687505332e-01f, 8.4227382937299256e-01f, 3.6626396032234299e-01f }, { 2.8377366076593347e-01f, 7.3889442105555059e-01f, 6.1115263558990207e-01f }, { 7.7426467528899756e-01f, -1.0707877871778559e-01f, -6.2373740287714885e-01f }, { -1.1667493207915473e-01f, -7.1297341554065652e-01f, -6.9141584372692455e-01f }, { 2.0658969341480835e-01f, -4.0504725149128251e-01f, -8.9065000007530082e-01f }, { -3.5172523910924747e-01f, -9.0352953137498715e-01f, 2.4479326401443094e-01f }, { -3.1910262645634802e-01f, -9.2568247079713295e-01f, 2.0318827979875095e-01f }, { -9.5792584785475698e-01f, -1.3040840279161567e-01f, -2.5567893635003397e-01f }, { 1.2367236142619793e-01f, 3.0699844597283749e-01f, -9.4364034525317464e-01f }, { -7.8257013653180785e-01f, 1.2648894666193478e-01f, -6.0957733535700120e-01f }, { -9.6504853929854439e-01f, -2.6192469539566493e-01f, 8.7618913274447457e-03f }, { 4.4345502273541071e-01f, -7.4383632540169531e-01f, 5.0005516078092793e-01f }, { 2.5322140082666822e-01f, 8.4235826582731932e-01f, 4.7572205557002606e-01f }, { -4.1353591271497925e-01f, -1.6910879353441874e-01f, 8.9464532907981043e-01f }, { 2.9391983468673505e-01f, -7.3357084414588847e-01f, 6.1276826565742681e-01f }, { -6.4071437831383415e-01f, 7.6033259394815655e-01f, -1.0667442056081010e-01f }, { -9.0952713585735601e-01f, -2.4080473319101717e-01f, -3.3878233367741883e-01f }, { -1.5629313173951101e-01f, -6.2992257675526431e-01f, -7.6076935024031034e-01f }, { 2.6987444700441848e-01f, 9.5826879053143998e-01f, 9.4279944566543358e-02f }, { -4.5726458816662757e-01f, -6.4047240991410781e-01f, -6.1701230826266307e-01f }, { 6.6197606370768447e-01f, -3.3155268639319960e-02f, -7.4879130553147721e-01f }, { -8.4168150279713694e-01f, -8.9272387191788788e-02f, 5.3254360266013179e-01f }, { -9.1661368637399454e-01f, -3.8024419708943158e-01f, -1.2342487809064159e-01f }, { 8.9852783270578618e-01f, 4.2616970346458567e-02f, 4.3684268071186888e-01f }, { 5.1583124792499435e-01f, -3.9375519809435533e-01f, -7.6083833212964369e-01f }, { 5.1619351242244293e-01f, -8.4900308843262651e-01f, -1.1286280859895025e-01f }, { 1.7901402148682655e-01f, -9.7601998022852832e-01f, 1.2385062900856562e-01f }, { 2.2113455992342007e-01f, -6.1999615419914300e-01f, 7.5279763229286789e-01f }, { -3.9211375718055080e-01f, 4.0533269324607119e-01f, 8.2580397747627643e-01f }, { 5.4481875863109175e-01f, 7.8114038496475746e-01f, -3.0494625628262212e-01f }, { -6.2286247840945719e-01f, 7.2353349213119555e-01f, -2.9755943734666795e-01f }, { -3.3128483724374386e-01f, -4.9392557936645698e-01f, -8.0392031860122548e-01f }, { 8.6117993586831043e-01f, -4.1826344421812400e-01f, 2.8883353214030544e-01f }, { 6.8260965194547951e-01f, 4.6162712034030762e-01f, -5.6651960675442337e-01f }, { 1.7730575582727833e-02f, -6.1858061475929882e-01f, 7.8552125988639743e-01f }, { 9.0716889026013392e-01f, 3.3039547079009168e-01f, -2.6054450181416378e-01f }, { 7.3141237799374759e-02f, -9.8934486871221849e-01f, -1.2588522584472905e-01f }, { -7.9950978927635707e-01f, 1.6163397929027201e-01f, -5.7849680516841850e-01f }, { 4.8021608045660452e-01f, 1.4544165463632655e-01f, -8.6500823184958386e-01f }, { 4.6289286384691947e-01f, -6.7264956282191757e-01f, 5.7729781069659392e-01f }, { 4.3309499171581589e-01f, 6.8418043482659063e-01f, 5.8679286017399246e-01f }, { 7.3790327523797650e-01f, 6.7146080913624928e-01f, -6.8111219245882301e-02f }, { -1.5460463121925402e-01f, 6.9568961119258355e-01f, 7.0150792788411898e-01f }, { -4.5020668055531587e-01f, 8.5385413425226853e-01f, 2.6124138685069143e-01f }, { -5.7488830780590039e-01f, -4.5952338496470757e-01f, -6.7700937380411907e-01f }, { -1.3724611012914956e-01f, -3.7500143314632201e-01f, -9.1680828442625995e-01f }, { 6.9493574502420941e-01f, -6.0108698231010775e-02f, -7.1655513024792472e-01f }, { 9.3127598455676397e-01f, -9.7243872192186304e-02f, -3.5109638264855364e-01f }, { 1.6473614182605484e-02f, -8.6013503108943201e-01f, 5.0980030240138585e-01f }, { -1.4547828270699828e-01f, 8.2511139379445508e-01f, 5.4591872755126691e-01f }, { 6.6786935286746751e-01f, -2.1126061762711729e-01f, -7.1366622376304112e-01f }, { -7.0176925234465681e-01f, 4.0277927334894198e-01f, 5.8761277506885412e-01f }, { 1.7235943557613209e-01f, 7.3343832892913419e-01f, -6.5754120983062070e-01f }, { -5.7969668599532165e-01f, -6.7789329815185317e-01f, 4.5211992719503546e-01f }, { 5.5861148220604084e-01f, -1.3415588116023653e-02f, -8.2932094748840834e-01f }, { 9.4903013267285774e-01f, 2.3217566334791614e-01f, -2.1315784908816560e-01f }, { 3.1230772762070946e-01f, 6.9657480061567012e-01f, 6.4594692538600129e-01f }, { 3.4329395526553852e-01f, 9.3706030282546682e-01f, 6.3774988410713954e-02f }, { -8.4227058923481563e-02f, -4.1693909095433246e-01f, 9.0502353393670110e-01f }, { -8.7293206645254717e-01f, 3.0350986660979545e-01f, -3.8193110403499464e-01f }, { 5.3169340059286818e-01f, -8.2923969587250335e-01f, 1.7223139828518486e-01f }, { -6.5696788709607001e-01f, 4.5506197077794636e-01f, -6.0109217103221113e-01f }, { 5.1021328059238191e-01f, -8.3952853289229012e-01f, -1.8674648796397331e-01f }, { 5.8530324567024304e-03f, -6.1015823007123091e-02f, 9.9811963779590285e-01f }, { -8.3816489635983982e-01f, -4.8398075937768703e-01f, -2.5148008084597168e-01f }, { 2.6177375952963899e-01f, 4.5540812803666902e-01f, 8.5092769125223300e-01f }, { -8.9481769542088074e-01f, -1.6711678796870316e-01f, 4.1397254877671241e-01f }, { -3.0921442609196992e-01f, 1.1168280361473171e-01f, -9.4441166345686722e-01f }, { -7.2522977491123353e-01f, 6.8831015836066556e-01f, -1.6459024263819781e-02f }, { 7.8264478697099615e-01f, 5.1306125596588004e-01f, 3.5247026123325331e-01f }, { -9.5443680137588888e-02f, 9.8054343531180499e-01f, -1.7153738772850047e-01f }, { -3.7944148476541184e-01f, 6.0584491726081713e-01f, -6.9926825744363175e-01f }, { -7.1129504733311233e-01f, 6.9894404031678292e-01f, 7.4408226326372728e-02f }, { 2.4816670426803836e-01f, 3.1346979480683956e-01f, 9.1659695321144175e-01f }, { -1.4101197984406116e-01f, 3.0560663998979443e-01f, 9.4165821991559462e-01f }, { -1.7968483819548950e-02f, 1.7711672794132333e-01f, 9.8402581179183801e-01f }, { 3.7084810031197962e-01f, -6.3665121592552620e-01f, 6.7612640516071021e-01f }, { -5.4949021727768899e-01f, 7.6792391744306798e-01f, 3.2917071275405135e-01f }, { 4.4451435263770001e-01f, -5.1708551882783016e-01f, 7.3145714605685563e-01f }, { -1.0987953732915649e-01f, 6.8895597382574114e-01f, 7.1642595807672627e-01f }, { 1.4460241059128504e-01f, -8.3967248877756895e-01f, 5.2348854279847690e-01f }, { -5.3118605989511769e-01f, -5.0088987337297741e-01f, -6.8333791386509724e-01f }, { 5.7374130175125726e-01f, 6.3418821281273657e-02f, -8.1657759690801379e-01f }, { -2.4955885951601567e-01f, -9.6804365140061210e-01f, 2.4735897397019178e-02f }, { 6.1441381772891757e-01f, 8.4521539839531895e-02f, -7.8444360529417989e-01f }, { -3.8144573989534580e-01f, -9.1359751717748605e-01f, -1.4085000576082812e-01f }, { 6.4468893273518646e-01f, -6.8412592511630510e-01f, -3.4109807767345451e-01f }, { -8.9458681447447974e-01f, 3.7883331065635423e-01f, -2.3706487320045749e-01f }, { -6.3219707383375345e-02f, -7.5390684912806871e-02f, 9.9514798559145878e-01f }, { -5.4630697491924041e-01f, -3.1528950303943071e-01f, 7.7597758886950929e-01f }, { 8.3529682172237024e-02f, 4.4593652793680449e-01f, 8.9115846247896491e-01f }, { 1.5186150789972802e-01f, -8.6641956996753966e-01f, -4.7566291761675566e-01f }, { -9.2078446914173315e-02f, 4.6310194027405255e-01f, -8.8150902010602339e-01f }, { 6.8326587844159792e-01f, -3.4687775255894504e-01f, 6.4251347389536251e-01f }, { -3.3474315584360415e-01f, 8.6038356641909597e-01f, 3.8430084341804599e-01f }, { -9.7193614442218712e-01f, -1.6698799181540266e-01f, 1.6569593161931354e-01f }, { -4.5362618169486590e-01f, 6.8728648909780710e-01f, -5.6732756779883908e-01f }, { 1.4873827309981752e-01f, 9.8719106519959710e-01f, 5.7712450176447515e-02f }, { -4.8816943627181192e-01f, -1.4455067528620283e-01f, -8.6069489586285108e-01f }, { 7.7211665953878328e-01f, 6.2574354716362701e-01f, -1.1081911949547477e-01f }, { 5.4261665203344422e-01f, 5.8047164931839190e-01f, -6.0714070302822054e-01f }, { 7.6723993716209737e-01f, 5.2630010122337612e-01f, -3.6653933250848358e-01f }, { -1.5473384314396205e-01f, 4.2520582138368312e-01f, 8.9177208256780893e-01f }, { 2.6728340485847696e-01f, -6.2501772450178472e-01f, 7.3342513288397104e-01f }, { -8.8641933944892726e-01f, -1.5018991034867412e-02f, -4.6263936771444569e-01f }, { 6.5431842843821919e-01f, -7.3110789139540622e-01f, -1.9325797614976245e-01f }, { 8.8273876904052329e-01f, -1.1209129104188890e-01f, 4.5629793787106288e-01f }, { -3.8780276582741230e-01f, 7.1558828806009023e-01f, 5.8098400735978839e-01f }, { 4.8137099139720196e-02f, 2.1811300568566616e-01f, -9.7473562386791701e-01f }, { -8.0130515848881789e-01f, -2.9254673565526797e-02f, -5.9754013007812712e-01f }, { -3.1942309830380067e-01f, 3.9509777321671963e-01f, -8.6131680226801000e-01f }, { 5.5237108182592276e-01f, -7.3425386264952908e-01f, 3.9466118778859682e-01f }, { -7.9104845611442834e-02f, 6.5956410455917647e-01f, 7.4747415699664255e-01f }, { 5.3587102983890800e-01f, -7.3576097218721059e-01f, -4.1412320773595734e-01f }, { -7.8599027261392274e-01f, -4.6114075876935468e-01f, 4.1178694971783081e-01f }, { -7.6868202387066792e-02f, -7.2310400100121153e-01f, -6.8644874768464748e-01f }, { -6.1776468140696739e-01f, 7.4587439359228302e-01f, -2.4907466227918926e-01f }, { 6.9741608157571500e-01f, 4.4457684216734739e-02f, 7.1528618291818047e-01f }, { 3.5072846253266676e-01f, 8.5379211749588613e-01f, 3.8474480590563248e-01f }, { -9.1150156757319367e-01f, 3.4420948822299711e-03f, 4.1128219545031663e-01f }, { 7.0007936284153649e-01f, 1.3838301351175175e-01f, 7.0052767775070424e-01f }, { -8.9064040392961152e-01f, -2.3855394301641270e-01f, -3.8710681621410464e-01f }, { -1.8798326217246616e-01f, 9.2372199529326027e-01f, 3.3376633825842278e-01f }, { -2.3773661416331129e-01f, -8.6096716729785872e-01f, -4.4968526673804399e-01f }, { 2.9842325266627800e-01f, -2.8076233319759386e-01f, 9.1220396541865678e-01f }, { 8.0320826225606434e-01f, 1.3034733664554954e-01f, 5.8126247020860133e-01f }, { -4.5238669756122596e-01f, 6.1053443452806322e-01f, 6.5007228838425801e-01f }, { -7.6423703626485018e-01f, 4.3150594268029019e-01f, 4.7931656953699414e-01f }, { 7.0083414285193324e-01f, 3.1381434348009746e-01f, 6.4058727901758361e-01f }, { 8.5209875958289305e-01f, 4.7555416484563084e-01f, -2.1857708071815213e-01f }, { 6.0952361900918373e-01f, 3.2329141705199632e-01f, -7.2385331216376958e-01f }, { 5.3981356873670494e-01f, -4.7588091334744986e-01f, -6.9436205780510485e-01f }, { 7.5280202292109522e-01f, -1.2968036019450832e-01f, 6.4534651038471524e-01f }, { -2.9140260395503859e-01f, 2.3700655281212923e-01f, -9.2677527822678474e-01f }, { -3.9997336281699331e-01f, 9.0795643321345987e-01f, 1.2504568934256657e-01f }, { -7.2286637421887379e-01f, -2.5939500600873472e-01f, 6.4045174360086454e-01f }, { 1.3198717971747123e-01f, -4.1994613050911594e-01f, 8.9790012354417714e-01f }, { 3.2506811502111443e-01f, -9.3732231820375567e-01f, -1.2552924915634889e-01f }, { 3.5680466534307947e-01f, -3.6213806724228914e-01f, -8.6113091399823305e-01f }, { 2.9738805284362824e-01f, -9.5474984920762695e-01f, 3.6154479513800806e-03f }, { 8.1206829260474023e-01f, 3.4280941781294434e-02f, -5.8255463707416277e-01f }, { 8.0650723232804356e-01f, -4.6145168570378942e-01f, -3.6960577100972097e-01f }, { 2.5647601189576458e-01f, -1.2080286178317999e-03f, 9.6654984144062750e-01f }, { 7.4807749027130455e-01f, 1.3430082871584981e-01f, -6.4987949341060325e-01f }, { -1.9306607055383077e-01f, -7.9555489960070913e-01f, 5.7429773995916877e-01f }, { -9.2928847690160687e-01f, -1.9424394151093161e-01f, -3.1415317583018249e-01f }, { -9.9208869709800285e-01f, -1.1569687961467871e-01f, -4.8726267431580018e-02f }, { -5.9820965584979091e-01f, -2.6974660727526613e-02f, -8.0088549451635693e-01f }, { 4.1421687212620406e-01f, 2.0113467156444922e-01f, -8.8767630741202341e-01f }, { 5.4813931951121837e-02f, 6.7790259187513691e-01f, 7.3310538723503416e-01f }, { 3.8696171525251805e-01f, 3.4872515750997513e-01f, -8.5361079857770783e-01f }, { 6.5351773654201295e-01f, -3.1147857878553991e-02f, 7.5627004368451722e-01f }, { 8.8356654702099269e-01f, 4.2836666331896939e-01f, -1.8924100703170202e-01f }, { 9.2712639231487315e-01f, 3.5693657727264611e-01f, -1.1416186963297473e-01f }, { -4.6842719463056298e-01f, -8.1775361552507353e-01f, -3.3444728676760238e-01f }, { -2.0450752410364786e-01f, 2.8465983960387331e-01f, -9.3656043494357211e-01f }, { 6.0488520682640257e-01f, 6.5345386715385478e-01f, 4.5509551751720489e-01f }, { -6.0676537787906759e-01f, -7.4082399384570907e-01f, -2.8812425505285960e-01f }, { -2.0693960343565628e-02f, -9.7700197432320635e-01f, 2.1222370785059758e-01f }, { 3.1717745818257731e-01f, -7.7624897294773432e-01f, 5.4482657058776696e-01f }, { -1.6024090178556863e-01f, 8.9889587249143854e-01f, 4.0781008302002947e-01f }, { -9.1245501732143885e-01f, 4.0914214320394143e-01f, -5.3430346637776769e-03f }, { -6.1231252934219593e-01f, 4.0449458405762162e-01f, 6.7930663023307392e-01f }, { -4.1907560381685077e-01f, -3.4155887393442358e-01f, -8.4125690126274177e-01f }, { 8.7447394436625359e-02f, -3.3231559153940021e-01f, -9.3910558555790935e-01f }, { 9.3743512556694564e-01f, -3.2339130650040909e-01f, -1.2897072626469686e-01f }, { 4.3822876521339305e-01f, 5.4743759830838212e-01f, -7.1292890620166005e-01f }, { -5.4513910376432270e-03f, 7.6110198667651396e-01f, 6.4860931862934124e-01f }, { -3.1703949022859050e-02f, 8.4042050435527954e-02f, -9.9595772670076121e-01f }, { 6.2088382594276859e-01f, -5.3877054882258475e-02f, -7.8204893557876787e-01f }, { -5.6117588509639427e-01f, 8.0117198476036455e-01f, -2.0785830948368783e-01f }, { 7.0178822044752198e-01f, -4.8668686636984559e-01f, -5.2022032615440961e-01f }, { 1.7216568521252640e-02f, 3.6695435425343786e-01f, 9.3007961576565878e-01f }, { 2.1674070315353747e-01f, 9.3400145857877759e-01f, -2.8401539213434596e-01f }, { 9.9733959181819565e-01f, -7.2738382763635812e-02f, 4.7818683425689280e-03f }, { 8.3949264008297098e-01f, -2.7506312837078672e-01f, -4.6860685297741805e-01f }, { -5.8627835681691765e-01f, -7.9404579924358343e-01f, 1.6052712241759576e-01f }, { -9.9767503526466739e-01f, 3.7538101289163399e-02f, 5.6880708164098390e-02f }, { -1.5292565842947511e-01f, 2.3734600511326479e-01f, 9.5931257515508761e-01f }, { 1.4586678929817376e-01f, -9.4890803119981004e-01f, 2.7981498906302776e-01f }, { 1.9367238344247206e-01f, -6.4933996045418729e-01f, 7.3542411141399677e-01f }, { 5.9721500852576359e-01f, 1.2819702782234049e-01f, -7.9177001436597116e-01f }, { 9.4222240757468412e-01f, 2.9872485542533622e-01f, -1.5159286070022510e-01f }, { -1.8809971703691580e-01f, 3.5912362989479957e-01f, -9.1413823621037493e-01f }, { 3.3866788914745205e-01f, -9.2290190264464866e-01f, 1.8318334792031848e-01f }, { -5.7677294333491913e-01f, -6.2856808174706769e-01f, 5.2176157241175369e-01f }, { 9.2944833945957905e-01f, -1.2795859037474280e-01f, 3.4605257320982291e-01f }, { 2.1923982251770643e-01f, 3.9639404175093551e-01f, -8.9151874006481890e-01f }, { -6.8028416978435013e-01f, -6.2501269832707240e-01f, 3.8284797932172687e-01f }, { -3.8969700557001108e-01f, 8.2754780791391402e-01f, -4.0410502281788396e-01f }, { 8.0667065966777673e-01f, 5.1702844322103458e-01f, -2.8629361804201497e-01f }, { 5.8158049283774926e-01f, -6.7357590529665856e-01f, 4.5613553923629707e-01f }, { -5.2895750355799298e-01f, -3.2689733181559127e-01f, -7.8316160138348401e-01f }, { -2.4239333369171071e-01f, 8.0964018336818588e-01f, -5.3453554162221006e-01f }, { 4.8411282258389138e-01f, 8.6157862450497869e-01f, -1.5269921023360439e-01f }, { -5.4896590876992413e-01f, 8.1017891623479621e-01f, 2.0553966696728496e-01f }, { 8.3800797407208127e-01f, 3.8630808220969776e-01f, -3.8536826674114094e-01f }, { -5.5285656259670102e-01f, -8.2548135803352696e-01f, -1.1371081185570756e-01f }, { 7.9234813832172443e-02f, 9.0608216053420676e-01f, -4.1561636473873970e-01f }, { 7.2862121596418097e-02f, -5.3593946558623418e-01f, 8.4110641447061296e-01f }, { -3.3899603364562597e-01f, 8.9368718568047290e-01f, 2.9394710973753341e-01f }, { -6.6120457152910161e-01f, 4.1011581534052666e-01f, -6.2818272230028116e-01f }, { 8.9679600464751108e-01f, 3.2931227990134349e-01f, 2.9548324547161819e-01f }, { 3.7897037166407760e-01f, 3.7119020045886526e-02f, -9.2466406643257415e-01f }, { 3.2214971439833123e-01f, 7.7235126626920558e-01f, 5.4744231020759471e-01f }, { 4.0759011343949108e-03f, 1.3986492945829077e-01f, -9.9016220314530790e-01f }, { 8.9711470141315275e-01f, 3.7365139565606498e-01f, -2.3573257524717423e-01f }, { -4.7923532832303328e-01f, 7.8386947478784985e-01f, 3.9481913148039699e-01f }, { 3.8423220684365983e-01f, 9.1239318531394165e-02f, -9.1871703912465763e-01f }, { 7.8450030547245353e-01f, 6.0242003349192996e-01f, -1.4713726231383042e-01f }, { 7.0482793625407680e-01f, 3.4742054432785541e-01f, -6.1847922006705758e-01f }, { 8.0897487311741301e-01f, -5.7302197749942685e-01f, 1.3116961525944876e-01f }, { -3.1447872587081466e-01f, 6.9151282865031927e-01f, -6.5031772141523492e-01f }, { -8.4316614059409134e-01f, -5.0097091168195373e-01f, -1.9518966418388348e-01f }, { -4.7996840693341081e-01f, 4.3089762088609379e-01f, 7.6417116450472533e-01f }, { 1.0743272838954769e-01f, -5.8205911032238988e-02f, -9.9250706838373937e-01f }, { -4.1216789601810036e-02f, -9.3616991888756274e-01f, 3.4912327224774714e-01f }, { 6.5493658644807651e-01f, -6.2136027366365187e-01f, -4.3008078083584839e-01f }, { -6.4095114025255306e-01f, -4.2381201768368859e-01f, 6.3997266306916023e-01f }, { -2.8768586160447640e-01f, -8.4106259965192076e-01f, -4.5809447551748850e-01f }, { -7.8629922383380668e-01f, 5.7894427773517543e-01f, -2.1577083648178508e-01f }, { 1.1943432999300976e-01f, 4.2923302810767450e-01f, 8.9526222326234517e-01f }, { 5.3663935629666870e-01f, 5.3294644876701081e-01f, 6.5420660652436780e-01f }, { 2.6289307643297455e-01f, 5.7059910375231992e-01f, 7.7801278470257507e-01f }, { 4.4643350547094063e-01f, -2.0040055222485839e-01f, 8.7208757809115678e-01f }, { 6.6950226003231916e-01f, 1.5235967953422264e-01f, -7.2701667921984137e-01f }, { 6.6764252898394527e-01f, -6.8630621762507160e-01f, -2.8850862923158754e-01f }, { -8.6352023654460086e-01f, -9.6085928644489588e-02f, 4.9507605011198286e-01f }, { 3.9669457688383875e-01f, -8.7866821668464190e-01f, 2.6566064379050058e-01f }, { -7.4958073031238603e-01f, 2.1497972278677654e-01f, 6.2602911077271062e-01f }, { -4.9928931887679462e-01f, 6.7984540439699925e-01f, -5.3714095187001620e-01f }, { 4.1153558165124011e-02f, -9.5020358030082042e-01f, -3.0890053517896698e-01f }, { -5.2887133584791279e-01f, 6.2030851647799590e-01f, -5.7923436923521043e-01f }, { -2.9821105961551619e-01f, -1.1644161981613298e-01f, -9.4737084243583636e-01f }, { 6.8649238483162833e-01f, -6.4490244964612164e-01f, 3.3590033642230116e-01f }, { 4.9764005214573670e-01f, -7.6294281985609735e-01f, -4.1264104513537564e-01f }, { 3.5595148880894989e-02f, 3.8363469994027344e-01f, -9.2279867922417580e-01f }, { -8.3292630499624476e-01f, 3.7344638666923996e-01f, -4.0837674606788177e-01f }, { 3.2533230134874419e-01f, -5.8078047656413712e-01f, -7.4622579139363965e-01f }, { 2.6410769715082227e-01f, 4.4024891585033721e-01f, -8.5815384191780686e-01f }, { 3.1506077198286270e-02f, -9.8693529797072577e-01f, 1.5800659707433243e-01f }, { 1.6414243846806262e-01f, -1.6539544212332241e-01f, -9.7247190582483611e-01f }, { -7.1781135216530978e-01f, -7.4903191132020290e-03f, 6.9619735551220818e-01f }, { -4.3576059054799487e-01f, -2.5499321050337720e-01f, -8.6318663701568221e-01f }, { 6.2205443125528925e-01f, -7.8271115797878976e-01f, -2.0286146286578877e-02f }, { 7.3585073796129197e-01f, -6.1854635705421004e-02f, -6.7431275791250722e-01f }, { 2.4341445421030231e-01f, -9.5752834992572389e-01f, -1.5456022311714304e-01f }, { -3.9548659877735759e-01f, 5.5517692380377603e-01f, 7.3168909617630185e-01f }, { -9.5310833907049441e-01f, 3.6590275576674637e-02f, 3.0040913056614393e-01f }, { -1.3789868404955670e-02f, 3.9125154982208837e-01f, 9.2018045202622512e-01f }, { -9.7971822634514460e-01f, 3.9693655863249300e-02f, -1.9640929369898433e-01f }, { 8.6280211808559659e-01f, 4.7463977957563874e-01f, -1.7403903203418872e-01f }, { 7.7200470842983238e-01f, 2.4992466508689745e-01f, 5.8441970530037024e-01f }, { -3.5860063600270425e-01f, -4.1462789279749401e-01f, 8.3635476585762680e-01f }, { -6.8893583038090267e-01f, -6.4924900244185202e-01f, 3.2224703946760508e-01f }, { 6.6553999198788460e-01f, 3.8758312176687171e-01f, -6.3783684652598494e-01f }, { -7.2906437312174233e-01f, -5.8986974838430850e-01f, -3.4715820570113798e-01f }, { -8.6406091523690098e-01f, -2.1553000498248448e-01f, -4.5491268581148558e-01f }, { 5.3009193178311453e-01f, -6.5984088005612973e-01f, -5.3255286767155607e-01f }, { -5.5266974982577999e-01f, -7.1279733673358470e-01f, 4.3182879057911183e-01f }, { -1.1277522485697847e-01f, 9.1796975649673329e-01f, -3.8028052121530787e-01f }, { 2.2466402668288016e-01f, 1.7487012945790642e-01f, 9.5861697926648948e-01f }, { 6.5067375341361156e-01f, 2.1528229309509792e-01f, 7.2820134639971601e-01f }, { -6.8355122121565459e-01f, -6.7812761891968576e-01f, 2.7000122302112800e-01f }, { -2.1197184324712834e-01f, -5.9538207902939022e-01f, 7.7497620456440841e-01f }, { -1.5866522274075442e-01f, 9.1883334080881729e-01f, -3.6134559484063794e-01f }, { -8.6695809315149397e-01f, 4.5404297061851839e-01f, 2.0549609619415352e-01f }, { -6.5242359501639169e-01f, 7.0947048916899758e-01f, 2.6644901513083247e-01f }, { 7.7623704126667059e-01f, 4.5868111613549140e-01f, -4.3251322461430580e-01f }, { 8.8668236327860139e-01f, 4.2468775439726730e-01f, 1.8285157345694522e-01f }, { 4.7515274296647597e-01f, 4.1464811579972449e-01f, -7.7607783818066356e-01f }, { -3.3820909244076508e-01f, -6.8701674049447703e-01f, 6.4313498433123550e-01f }, { 1.1721574308060841e-01f, 6.0132806684723261e-01f, 7.9035753023288835e-01f }, { 8.0339277482610522e-02f, 9.5029943589176880e-01f, 3.0079325563808468e-01f }, { 4.5968052322090835e-01f, 8.4536624798651726e-03f, -8.8804411611249834e-01f }, { -1.0438129409493892e-01f, -4.6228214933132622e-01f, 8.8056786215071192e-01f }, { -4.3483536387755289e-01f, -1.7907371893957233e-01f, -8.8252524581828662e-01f }, { -8.2378336773060301e-01f, -2.7195505476140969e-01f, -4.9741472760679789e-01f }, { 1.4872018833620021e-02f, -9.7491079042019380e-01f, -2.2209856770831587e-01f }, { 4.4612493192760411e-01f, -8.7853004711125904e-01f, -1.7075567760774321e-01f }, { -6.2572645397707005e-01f, 4.4513066154382580e-01f, -6.4056623306793015e-01f }, { 2.9412335513990895e-01f, 3.3914452708606063e-01f, 8.9357285193139979e-01f }, { 1.6822164985779869e-01f, 5.9581281358659177e-01f, -7.8530794449384589e-01f }, { -1.6756560356507269e-01f, -8.4608292668346496e-01f, 5.0602909963421594e-01f }, { -4.1545636829331117e-01f, -8.5385713212850245e-01f, 3.1356658616284627e-01f }, { 8.6174746279581182e-01f, 3.2447452033427598e-01f, -3.9000973836408559e-01f }, { -4.7668414139128240e-01f, 4.3737934697914410e-01f, -7.6254280940951336e-01f }, { -4.1384307274918952e-01f, 4.4912100551603600e-02f, 9.0923969026959650e-01f }, { 1.5026083505214119e-01f, -7.5554322333324242e-01f, 6.3763321676701212e-01f }, { 4.2013860492721772e-01f, 6.0708556571253258e-01f, -6.7448548431623456e-01f }, { -9.6326438343310716e-01f, 1.6964947756169377e-01f, -2.0818449119057902e-01f }, { 9.1266029364649559e-01f, 4.0860903657083480e-01f, -9.4785881726504751e-03f }, { 1.8568178043964495e-01f, -8.4471412305794491e-01f, 5.0197642048129176e-01f }, { -5.0884080128712084e-01f, 3.7789830798400936e-01f, 7.7348167901269882e-01f }, { 2.9822595875111931e-02f, 2.6561581673964541e-01f, 9.6361758528630059e-01f }, { 7.8102299019717936e-01f, 4.2219102936473024e-01f, 4.6017151531511175e-01f }, { 8.6784428022329219e-01f, 4.3879905713536965e-01f, 2.3302723604940809e-01f }, { 6.4886969839430531e-01f, -3.5521716668293668e-01f, 6.7289589016387219e-01f }, { 2.6504756421704784e-01f, 9.2789291167106280e-01f, -2.6222992425199498e-01f }, { 5.3884598609347789e-01f, -1.5779736417490217e-01f, 8.2749319944661825e-01f }, { -4.9841207433088314e-01f, 6.5787521493026502e-01f, 5.6461102162607835e-01f }, { 5.2329354124143090e-01f, -1.1600107080783689e-01f, 8.4422012607283781e-01f }, { -6.1766743111227329e-01f, 7.7015237451829732e-01f, -1.5922394470365792e-01f }, { 5.1341415986293315e-01f, 1.8022274433052407e-01f, -8.3900277882627605e-01f }, { -4.1956884928486643e-01f, -3.2622995947706840e-01f, 8.4707496377201674e-01f }, { -9.2625631884379411e-01f, -3.0629390580890220e-01f, 2.1962075281327786e-01f }, { 7.1321744145522814e-01f, -5.2355227942159666e-01f, 4.6606211165091349e-01f }, { 3.0154155280086681e-01f, 9.4081587796868071e-01f, 1.5471966809834697e-01f }, { 1.6490106633143986e-02f, -1.0851993472249488e-01f, 9.9395749413697410e-01f }, { -4.9282113732409549e-01f, 5.8043763925731551e-01f, -6.4824337523801923e-01f }, { 9.1135162601675546e-01f, -1.5787078501751708e-01f, 3.8015132381009636e-01f }, { 4.2533119041954576e-01f, -6.1644952927815932e-01f, -6.6263365165755639e-01f }, { -1.0254751039938839e-01f, -5.6120173797174833e-01f, -8.2130178217776706e-01f }, { 2.0363966753486579e-01f, 9.4129878210193940e-01f, 2.6923500630433445e-01f }, { 9.9424483598454960e-01f, 2.8392489673870192e-02f, 1.0330088406289169e-01f }, { 1.6084223349829682e-01f, 8.2179807862599741e-01f, 5.4660561092061466e-01f }, { -4.8025518525066074e-01f, -7.7281633010371872e-02f, -8.7371763530279267e-01f }, { 2.9225721527999104e-01f, 2.7760269369157164e-01f, -9.1516253451065643e-01f }, { 5.6321576594296208e-01f, -8.1433939740637595e-01f, 1.4014045392071142e-01f }, { 7.3934578208855084e-01f, -4.2595681547652037e-01f, 5.2146774191408130e-01f }, { -3.6648948347445681e-01f, 6.5157139921717799e-01f, -6.6418383767206712e-01f }, { -9.7727273044207397e-01f, 2.0630524402119566e-01f, 4.8745836987871771e-02f }, { 9.9189719525305453e-01f, -1.8151695960525602e-02f, 1.2573969135830029e-01f }, { -3.8630451581506348e-01f, 8.9264708318734520e-01f, 2.3227140576922925e-01f }, { -4.1812267905611944e-01f, 3.0713829943155992e-02f, -9.0787118354376473e-01f }, { -6.0716715245161056e-02f, 8.7986583583285483e-01f, -4.7132747790044005e-01f }, { -2.8399336327812930e-01f, -7.4337320039862931e-01f, -6.0559396838399560e-01f }, { 8.4543644168619747e-01f, -5.3213581786850905e-01f, 4.5482902396327241e-02f }, { -7.9906901212139192e-01f, -3.3081666336976701e-01f, 5.0204486762065115e-01f }, { -6.2725002377368416e-02f, 5.7064356149730411e-01f, 8.1879881521557640e-01f }, { 2.6048857659252161e-01f, -1.5112601297347036e-01f, -9.5357570736022024e-01f }, { 7.0575791677977417e-01f, 2.6369911768067256e-01f, 6.5754736577459427e-01f }, { -5.0275193730639789e-01f, -5.2748979573799082e-01f, 6.8483209980765103e-01f }, { 9.5187613390022574e-01f, -3.0014283919576423e-01f, -6.2016947608416043e-02f }, { -9.6159375874242525e-01f, -5.4768150739171469e-02f, -2.6895704640746254e-01f }, { 4.9662455238608999e-01f, -9.4723275521502892e-02f, -8.6278129038696316e-01f }, { -5.7133832542977880e-02f, 7.5437573260386226e-01f, -6.5395181721388085e-01f }, { -9.1759844708590299e-01f, -1.3415418299997042e-01f, 3.7418677834625541e-01f }, { 8.0404419282482098e-01f, -5.5213490558307632e-01f, 2.2059007688799004e-01f }, { 2.4439952041199520e-01f, 9.1778714730431143e-01f, 3.1294668342291304e-01f }, { 4.1280870829977084e-01f, -9.0369413972926860e-01f, -1.1369200574733446e-01f }, { 5.1941122160150865e-01f, 6.3419660379925269e-01f, 5.7271864873070288e-01f }, { -9.1993140602430823e-01f, 3.8517264136591023e-01f, -7.3268305244131735e-02f }, { 3.7370774449221339e-01f, -4.5346650612819750e-01f, 8.0914192174576394e-01f }, { -1.3811108920867590e-01f, -4.6971911407144051e-01f, -8.7194568690574659e-01f }, { -9.4419459629645219e-01f, 7.6035410059581213e-02f, 3.2049209154306901e-01f }, { -5.8376202177678360e-01f, -4.8916132339803181e-01f, 6.4803017030271681e-01f }, { 8.0762804525362841e-01f, 4.2667115605469996e-01f, -4.0704872572058132e-01f }, { 3.9647547757241358e-02f, 9.9855757891911434e-01f, 3.6205435227792244e-02f }, { 6.6128224467204555e-01f, 1.3560396519045903e-01f, 7.3777866430666439e-01f }, { 5.7480124103503105e-01f, -8.1518889497657920e-01f, 7.1208137255876547e-02f }, { 7.8468949038480507e-01f, 1.0548098553246395e-01f, 6.1084872543923263e-01f }, { -9.4296115418637261e-01f, -2.7899943952024958e-01f, 1.8161380576071542e-01f }, { 4.9004855500491584e-01f, 3.9224276677971887e-01f, 7.7845875012526200e-01f }, { -8.7067835141174243e-01f, -4.8205785519425853e-01f, -9.7670019086930862e-02f }, { -4.0944401585906470e-01f, -4.1000958277832550e-01f, -8.1501395074387861e-01f }, { 1.0303733826968224e-02f, -5.0916814182333126e-01f, 8.6060538949125753e-01f }, { -4.0728706394221209e-01f, 8.9142875211666150e-01f, -1.9867568408102693e-01f }, { 8.5965111134329109e-01f, -5.0383240460919476e-01f, 8.4574670155793744e-02f }, { 2.4205972048881763e-01f, -8.9261127195615053e-01f, 3.8033170903002361e-01f }, { 3.6720627785546195e-01f, 2.9085312827352122e-01f, -8.8349533517559897e-01f }, { -1.7747869461384055e-01f, 9.2976609121659093e-01f, -3.2254663008933904e-01f }, { 6.4832515285342796e-01f, -4.7855374427071756e-01f, 5.9216620135064779e-01f }, { 1.3303944259058512e-01f, 1.6035510556717886e-01f, -9.7805252764548656e-01f }, { 1.5822937570838239e-01f, -4.3476030581605951e-01f, -8.8653648607920366e-01f }, { 7.0824394444374061e-01f, 5.2651187953453915e-01f, -4.7029326581164077e-01f }, { 1.3700475363781356e-01f, -9.4216432863859523e-01f, -3.0586937624029514e-01f }, { -4.0157167663575943e-01f, -6.7542040505041978e-01f, 6.1850421580250525e-01f }, { 1.6498704226741751e-01f, -7.9584512849011035e-01f, -5.8258888364129391e-01f }, { 8.9589856565796278e-01f, -4.1698559357260168e-01f, -1.5326048024494121e-01f }, { 4.4850154118926422e-01f, 8.1126731493838500e-01f, 3.7508893780477975e-01f }, { 7.2341730105483493e-01f, 8.9825791048553150e-02f, 6.8454272021331142e-01f }, { 4.7255716924522428e-01f, -8.7899297094987527e-01f, 6.3726594257438207e-02f }, { -5.6227320296777827e-01f, 1.1569971371077348e-01f, 8.1881769733659315e-01f }, { 4.0810795519762683e-01f, 3.4174269286250974e-01f, 8.4655763464721767e-01f }, { 8.4209019062865664e-01f, 4.9910847338020076e-01f, 2.0438894942505600e-01f }, { 3.7864763911614685e-01f, 3.8578454196054873e-01f, 8.4130627750900433e-01f }, { 2.7275891956225662e-01f, 5.2776072487767445e-01f, 8.0440735269875674e-01f }, { 9.3855159198885807e-01f, -1.6743595386732918e-01f, -3.0180475564132120e-01f }, { 1.4996769604691948e-02f, 7.5020432659865993e-02f, 9.9706922105987716e-01f }, { -4.9115519121119017e-01f, -3.2259312549573377e-01f, 8.0913549763262338e-01f }, { 5.9496871612645552e-01f, -7.5922294965210202e-01f, -2.6380435847877681e-01f }, { 9.2046455545432941e-03f, 8.0120534016922051e-01f, 5.9831870887056404e-01f }, { -4.3316564640802233e-02f, -9.4406875236944710e-01f, -3.2689121436238494e-01f }, { -6.3490464544143299e-01f, 3.8580260794725185e-01f, -6.6936719287547042e-01f }, { -3.5341151061733228e-01f, 7.9379432353392421e-01f, 4.9496553020235162e-01f }, { -5.3986290396523684e-01f, -7.8941706539492207e-01f, 2.9217929732527387e-01f }, { -7.7545047138295875e-01f, 6.0260310333790534e-01f, 1.8853664439432674e-01f }, { 6.3580908548800752e-01f, 5.7860835089400420e-01f, -5.1084164188780090e-01f }, { 8.9716262843970429e-01f, -1.4781909898812984e-01f, -4.1623158470435473e-01f }, { -8.2427179744137580e-01f, -5.7436287162031092e-02f, 5.6327353644548606e-01f }, { -9.8695127112459313e-01f, -3.5763336690492031e-02f, 1.5699736359032401e-01f }, { -4.6732683853118051e-01f, 7.9128035846370404e-01f, -3.9431081686659830e-01f }, { 3.4170664155867742e-01f, 8.2195435211814294e-01f, -4.5566173215306699e-01f }, { 5.4838095693803868e-01f, -6.2769478709235227e-01f, -5.5251930312415987e-01f }, { -1.1525072065013603e-01f, 9.9304140749412828e-01f, 2.4208147217514492e-02f }, { -9.7427015825175678e-01f, -1.8774424247840563e-01f, 1.2469866942476318e-01f }, { -5.0506993155013935e-01f, -1.8251760190445185e-01f, -8.4355894236205309e-01f }, { 6.9850754986846986e-01f, -1.8050400917977757e-01f, -6.9246336036412348e-01f }, { -1.4622379716970171e-01f, 9.8902182675102135e-01f, -2.1317301690098087e-02f }, { -1.2180768439769277e-01f, 9.9030439221357280e-01f, 6.6783971012348523e-02f }, { -3.6486420427974525e-01f, 9.3094788086004787e-01f, -1.4496742996085457e-02f }, { -6.0219506053111382e-01f, -2.3272706488782999e-01f, -7.6367481452554398e-01f }, { -5.2122011209174313e-01f, 4.8140021957336648e-01f, -7.0468675547776916e-01f }, { 7.0935573557288523e-02f, 9.8365694695314421e-01f, -1.6549064962987389e-01f }, { -4.4449576347885300e-01f, -7.9938471329422145e-01f, 4.0423705471031079e-01f }, { -1.0104495896430529e-01f, 8.1600969690053304e-01f, 5.6913802441253392e-01f }, { 9.4104909254040248e-01f, -2.2471833576753583e-01f, 2.5284041409306773e-01f }, { -9.8486425384347587e-01f, 9.3547845841426044e-02f, 1.4591505076503300e-01f }, { -3.0666965609327956e-01f, 1.1043188313158143e-01f, 9.4538802680150458e-01f }, { -9.2452758069176300e-01f, -3.7538783563106676e-01f, 6.5823441116814291e-02f }, { -6.7935619937498015e-01f, -5.9806990874698396e-01f, -4.2519117890915420e-01f }, { 2.8599753149779061e-01f, -7.3302186564739680e-01f, -6.1715829125110200e-01f }, { 5.9081205399773495e-01f, -5.8461652668205610e-01f, -5.5602574902713475e-01f }, { 5.5098590609654063e-01f, 8.1694965142043496e-01f, -1.7031675879667257e-01f }, { 8.4509076453236154e-01f, 5.1594831064898805e-01f, 1.4006762809644491e-01f }, { -2.0102200197720951e-01f, 5.1485394434848075e-01f, 8.3337600799992206e-01f }, { -7.0933173369328895e-01f, -5.9173343830003999e-01f, -3.8301439865008424e-01f }, { -6.7641062764965720e-01f, 5.7890242991548446e-01f, -4.5534672442057217e-01f }, { 8.7183599907436637e-01f, -4.4016499565628497e-01f, 2.1484126074128282e-01f }, { 7.8128285849781054e-01f, 2.7385325419822509e-01f, -5.6089347489744645e-01f }, { 7.7731367370534765e-01f, -1.8505813051015237e-02f, -6.2884098749526285e-01f }, { -9.8055412057678815e-02f, -2.2273066793964730e-01f, -9.6993617610921046e-01f }, { -7.5594928420202012e-01f, -6.5220804175946778e-01f, 5.6261443091460514e-02f }, { 2.9960181554756868e-02f, 1.0449858886982206e-01f, -9.9407365544280568e-01f }, { 9.8053829969414319e-01f, 1.4843767402956279e-01f, 1.2849474604672256e-01f }, { -8.9286383028607386e-01f, -4.1746332082406673e-01f, 1.6887438033468391e-01f }, { 5.2448430473910090e-01f, 7.3086810581862297e-02f, -8.4827739107046396e-01f }, { -1.7971555943957634e-01f, -9.6319739008065586e-01f, -1.9988272921173822e-01f }, { 1.6212783884187570e-01f, 7.9103128298442416e-01f, 5.8990174877896284e-01f }, { 1.1367587951841686e-02f, 9.9074626292156431e-01f, 1.3525021423684225e-01f }, { 9.5352768519977393e-01f, -2.5818444800397466e-01f, -1.5532464185197276e-01f }, { 4.5782042187740274e-01f, 8.8901070647657132e-01f, 7.7733571913599347e-03f }, { 3.2989733673593913e-01f, -9.1554106061059859e-01f, -2.3011369700770681e-01f }, { 5.0047997471340777e-01f, 1.0616298085624035e-01f, -8.5921430179355385e-01f }, { -3.0409936599061388e-01f, 7.4696139465578182e-01f, 5.9124635347543231e-01f }, { 8.2880213147650850e-01f, -1.9875924848688989e-01f, 5.2305046410544642e-01f }, { -1.2040849382145388e-01f, 9.8139694147293088e-01f, 1.4953875044023049e-01f }, { 6.8889380097817565e-01f, 6.8289952169578072e-01f, 2.4305055902325257e-01f }, { -7.7216984750289830e-01f, -6.0214383588335962e-01f, 2.0292000274744842e-01f }, { -5.8783779092149602e-01f, -7.6370458089085214e-01f, 2.6683711265651078e-01f }, { 5.7801178272820297e-01f, -6.4754437209844340e-01f, -4.9657694790535467e-01f }, { 6.2854526210202533e-01f, -5.2716828502867275e-01f, 5.7186051861360765e-01f }, { 8.6938999446921561e-01f, 3.0289438873689833e-01f, 3.9040495231044114e-01f }, { 9.3169780755319287e-02f, -8.4109405062868703e-01f, 5.3280408214561692e-01f }, { 4.2844496483645866e-01f, -5.5106098415470373e-01f, -7.1607730298392724e-01f }, { -7.3755011338280246e-02f, 5.8774662956593691e-02f, -9.9554293593838983e-01f }, { 7.9324267247658187e-01f, 3.6671955357545744e-01f, 4.8608932470033489e-01f }, { 6.7142159403966539e-01f, 3.9888904962612076e-01f, 6.2456430345129810e-01f }, { 3.1070551810023922e-01f, 9.4458827601774431e-01f, 1.0590122677234440e-01f }, { 2.2538894324894747e-02f, -4.9386392181987820e-01f, -8.6924704484243176e-01f }, { -7.9147794570420171e-01f, 5.0950252106456895e-01f, -3.3759419795474171e-01f }, { 2.2675763249974862e-01f, -4.5598428589131146e-01f, 8.6061565586694955e-01f }, { 4.2499878632722377e-01f, 5.6373875588820310e-01f, 7.0821934930500707e-01f }, { -9.6726885073029345e-02f, -9.2864129063473544e-01f, 3.5814698523416616e-01f }, { 4.5758887420088978e-01f, 6.2422223767461105e-01f, -6.3321325017727137e-01f }, { 4.9315558493535711e-01f, -7.7713016322365869e-01f, 3.9098117404171179e-01f }, { -5.4263849141209186e-01f, -1.7601613699637608e-01f, -8.2131710511524225e-01f }, { 9.7513350175449476e-01f, -2.1226525539615393e-01f, 6.3703336707132061e-02f }, { 8.8232585604327074e-01f, 4.6894765649142955e-01f, -3.9864510892593213e-02f }, { 8.4316495260281221e-01f, -4.1478501793049843e-01f, 3.4209099900858753e-01f }, { -6.8905144411703423e-01f, 7.0977624621807744e-01f, -1.4637550227003371e-01f }, { 3.1326425249293344e-01f, 1.5868322507644791e-01f, -9.3631465981761763e-01f }, { 9.6703091580523981e-01f, -2.2830866088020765e-01f, -1.1281118403760014e-01f }, { -5.8461829728061376e-01f, -8.0800809573602250e-01f, -7.3105155151757334e-02f }, { -1.6258092834065224e-01f, 6.1927196755596381e-02f, -9.8474995000857213e-01f }, { -8.2094023748531553e-01f, -5.2777243539975049e-01f, 2.1797564751542739e-01f }, { -5.6514950091365179e-01f, 7.3143906826880167e-01f, -3.8157952123655403e-01f }, { 1.4207280363357930e-01f, 7.2648185223396788e-01f, 6.7233878130180591e-01f }, { 5.4879347217068997e-01f, 1.2096208851972767e-01f, 8.2716014050713527e-01f }, { 5.0689259724358771e-01f, 7.1995870933986195e-01f, -4.7404572744127771e-01f }, { -6.8230612611463326e-01f, 6.0529742099768025e-01f, -4.0996753822711279e-01f }, { 4.2323674557396312e-01f, -3.9755927110220690e-01f, -8.1413591196841473e-01f }, { -8.3696322991999239e-01f, 3.0247031753287668e-01f, 4.5607483900502005e-01f }, { -5.4401589116515681e-01f, -6.8058621545473585e-01f, 4.9076380621718624e-01f }, { -7.8039091353098011e-01f, 5.7762106006023317e-01f, 2.3946593296996294e-01f }, { 4.8473385116844819e-01f, -8.3872783184816335e-01f, -2.4813044475574511e-01f }, { 5.6108899412686715e-02f, -9.6294271374795093e-01f, 2.6380508229833016e-01f }, { 7.1329326713177654e-01f, 6.9990882340132710e-01f, 3.6610845243534473e-02f }, { 8.1282967591732469e-01f, 4.9546835828244590e-01f, 3.0629891264749021e-01f }, { -3.6371794983392153e-01f, -5.4728587311202292e-01f, 7.5378208128120128e-01f }, { -6.9746293839793350e-01f, 6.2877669597206176e-01f, -3.4378091303005409e-01f }, { 7.6309299065021685e-01f, 6.4293997153251892e-01f, 6.5706016667210626e-02f }, { -2.4741432631876309e-01f, -2.5871390183142706e-01f, -9.3373083280536007e-01f }, { -5.8553794369280765e-01f, -5.6046495287427867e-01f, -5.8568280928812566e-01f }, { 7.0253392234246337e-01f, -4.1967788006651890e-01f, 5.7473173302070790e-01f }, { -7.4392718529531110e-01f, -5.0386154280315432e-01f, -4.3897139845623306e-01f }, { -4.6269125364592062e-01f, 5.1177319971590696e-02f, -8.8504106442587838e-01f }, { -8.3155193619390355e-01f, -3.7121004541077585e-01f, 4.1318818908373939e-01f }, { 9.6697500170651329e-01f, -1.2288851039130888e-01f, 2.2328851311362546e-01f }, { -9.5149142194930902e-01f, -7.9360571177477274e-02f, 2.9726414802203527e-01f }, { -3.5821531693563902e-01f, 5.5359568940439785e-01f, 7.5180688969014453e-01f }, { 7.0051740921111438e-01f, -1.0218452422061118e-01f, -7.0628158860468360e-01f }, { 9.5277059500167183e-01f, -5.5671148203561366e-02f, 2.9854466425956661e-01f }, { 7.5364095400610021e-01f, -6.1044478609102026e-01f, -2.4368519770200164e-01f }, { -5.7053721820631446e-02f, -9.1780573456342207e-01f, 3.9290903072964750e-01f }, { -3.7115468540814239e-01f, -8.1832981974079388e-01f, -4.3883995445103052e-01f }, { -9.3515294903037574e-02f, -9.5749633694103620e-01f, 2.7286563426656635e-01f }, { -8.7386099194363254e-01f, 4.0595287395964547e-01f, -2.6752426223278269e-01f }, { -4.9893314516443998e-01f, 3.4078445209898639e-01f, 7.9682599974141999e-01f }, { 2.5497030067876764e-01f, 9.4134729088267788e-01f, -2.2103263044089647e-01f }, { 6.5164388917180838e-01f, -6.6377461553152928e-01f, 3.6710148662326414e-01f }, { 8.2000981656397232e-01f, -3.0220789498576978e-01f, 4.8605996435315507e-01f }, { 7.5661656994312065e-01f, -2.6599581374277731e-01f, -5.9730862471491608e-01f }, { 7.3485349881968098e-01f, 5.7418435863137862e-01f, 3.6097459408599053e-01f }, { 7.3433111099263237e-01f, 2.7210665106629339e-01f, 6.2186476815607794e-01f }, { 4.9765351574385702e-01f, 7.5751374152803597e-01f, 4.2250906459385545e-01f }, { -7.3045859219922527e-01f, -7.2701777336611609e-02f, -6.7907635554068846e-01f }, { 5.2452405573338523e-01f, 2.7732618905817719e-01f, -8.0496254560039548e-01f }, { 7.6203436270677294e-01f, 8.6882585243219304e-02f, 6.4168142129528516e-01f }, { 2.5668152980475273e-01f, 1.4168844864213334e-01f, 9.5605385610773908e-01f }, { -6.6398082017193982e-01f, -5.3403119793077014e-01f, 5.2339292131287440e-01f }, { 5.1133673191805229e-01f, 1.4879794525761239e-01f, 8.4640056597244695e-01f }, { -5.1995176648679287e-01f, -8.2177890770853046e-01f, 2.3308708109339343e-01f }, { -8.9155808875019427e-01f, -4.3798099025975218e-01f, -1.1531186649771799e-01f }, { 3.4763812579732045e-01f, 1.9858219026576557e-01f, -9.1635847090610656e-01f }, { 4.2038479276039119e-02f, 9.8166394601861140e-01f, 1.8592649985229903e-01f }, { -5.3907312282187558e-01f, 6.3301301173973079e-01f, 5.5560300144911612e-01f }, { 5.6974962168570387e-01f, 5.5935979189988383e-01f, 6.0208138303282221e-01f }, { -7.5892285656513001e-02f, -8.2819588140230804e-01f, -5.5527645637653711e-01f }, { -8.3666170132810103e-01f, 2.2815267463948297e-01f, 4.9793930813465376e-01f }, { 9.2868901108674784e-01f, 8.9907047583284327e-02f, 3.5979639170171712e-01f }, { -1.1546342939373823e-01f, -2.9789683592735289e-01f, 9.4758940032965178e-01f }, { 7.3295082647230292e-01f, -6.5372573097967812e-01f, -1.8821730693178454e-01f }, { 2.7816924816673599e-01f, 3.5546500937275782e-01f, -8.9233765833678569e-01f }, { 3.5653208520472845e-01f, -8.7497548965797556e-01f, -3.2757100713792436e-01f }, { -1.5898378371904390e-02f, 9.2434029765746928e-01f, -3.8123779415431114e-01f }, { 9.9309340607433938e-01f, 1.1640218304755996e-01f, -1.4697571004403494e-02f }, { -4.9892231385221003e-01f, -3.8678064266865375e-02f, -8.6578318999904658e-01f }, { 5.1155673292210591e-01f, -2.4242878312607921e-01f, -8.2434094530968771e-01f }, { 1.0564105947561625e-01f, -8.6953169763387572e-01f, -4.8244646683628989e-01f }, { -6.8236904882739635e-01f, 4.5193596740326364e-01f, 5.7456623862673195e-01f }, { -1.1047103366099625e-01f, -6.4028132494738998e-01f, 7.6015523128206253e-01f }, { -9.5950186512729929e-01f, 1.2185518676655004e-01f, 2.5398323620924912e-01f }, { -8.7866814113163716e-01f, 3.6131734625710915e-01f, -3.1207703064146469e-01f }, { 8.3272844083613429e-01f, -3.1679407171734847e-01f, -4.5409785283280563e-01f }, { -3.0016350758673377e-01f, -1.7369696185150779e-01f, -9.3793988834934650e-01f }, { 1.5457847922912485e-01f, -6.2482451174687226e-01f, 7.6531027908913762e-01f }, { -1.8505788673576659e-01f, -8.5041676080570150e-01f, -4.9248848869555367e-01f }, { 9.4657708537032328e-02f, 2.1283418528503512e-01f, 9.7249243071016933e-01f }, { -1.8643366199418615e-01f, -6.5218102471212003e-01f, -7.3478051190875138e-01f }, { -8.2019630189390014e-01f, 5.7205812185796168e-01f, 5.2470540221912056e-03f }, { 6.7820066648113730e-01f, 7.0219261122784726e-01f, -2.1672423196670570e-01f }, { -4.8517840115696581e-01f, -6.2975237601676881e-01f, 6.0664146244054618e-01f }, { -5.1948046584665741e-01f, -1.3446980613390894e-02f, 8.5437651203443254e-01f }, { 8.7153850119130205e-01f, 3.7341727044233824e-01f, -3.1777379230611880e-01f }, { -5.6875216298115128e-01f, -1.2363181077113411e-01f, 8.1316428381337091e-01f }, { -2.8981864680533076e-01f, 5.6265471436125714e-01f, -7.7422530594845529e-01f }, { 1.9650589103255819e-01f, -2.5065798796679573e-01f, -9.4792194185910583e-01f }, { 5.6847194129256440e-01f, -8.0485034353305017e-04f, 8.2270225730758018e-01f }, { 1.2491726392767293e-01f, 4.9550348314169668e-01f, 8.5957662565199533e-01f }, { 7.0848647484762073e-01f, -6.8087910166371501e-01f, 1.8560863092971810e-01f }, { 8.3008060294692654e-02f, 4.7299617589131582e-01f, -8.7714552926997469e-01f }, { -3.1026003130029745e-01f, 5.7633603342509221e-01f, 7.5602611697835509e-01f }, { -3.7378129992388465e-01f, 6.4002510550863700e-01f, 6.7130872491415539e-01f }, { 3.4462808373007875e-01f, -9.3517282092465182e-01f, 8.1751323587835129e-02f }, { -9.0792295188693373e-01f, -4.1167051933631410e-01f, -7.8761011587498195e-02f }, { 1.5306732801580208e-01f, -4.8253100354347711e-01f, -8.6240026885050758e-01f }, { 8.0430921220260587e-01f, 5.4008266421523343e-01f, -2.4778500152389926e-01f }, { 2.9274574209833787e-01f, 8.3650874747491932e-01f, 4.6319871100990223e-01f }, { -6.5840867410982440e-01f, -7.4980407597889021e-01f, 6.5512330918583564e-02f }, { 9.3303949460734503e-01f, 3.5791340483231160e-01f, 3.6541704177717002e-02f }, { -2.4560544924284809e-02f, -7.1855091473120569e-01f, 6.9504054743012644e-01f }, { -1.7771731263471680e-01f, -1.7922029505892945e-01f, -9.6762422594149877e-01f }, { 2.6294204859257003e-01f, -8.5214724292678201e-01f, -4.5244508556754870e-01f }, { 3.4764486305802544e-01f, 6.1625884238224871e-01f, -7.0665981092393926e-01f }, { -5.7348516123589002e-02f, -3.9275389675053202e-01f, -9.1785375974917427e-01f }, { 2.4534569083563364e-02f, -9.1447576741596237e-01f, -4.0389618186963661e-01f }, { 4.2027872725945786e-01f, -4.5420437043517353e-01f, 7.8553432852470417e-01f }, { -6.7637906689087357e-01f, 3.0409544238028441e-01f, -6.7084820920635257e-01f }, { 1.2165797513217110e-01f, 1.1781926084617937e-01f, 9.8555464529390757e-01f }, { -2.5477232611097678e-01f, 5.8290952943566621e-01f, -7.7156175536446348e-01f }, { -5.0362497754690549e-01f, 8.6232088784966909e-01f, -5.2579162878818114e-02f }, { -9.1715194767077857e-01f, 3.2911881169426571e-01f, -2.2475122396252259e-01f }, { -6.1804066319740636e-01f, 7.2488258198591471e-01f, 3.0425479612973044e-01f }, { -4.7864409197726460e-01f, -4.3088211626229694e-01f, 7.6501008823451755e-01f }, { 8.4029746272247974e-01f, -3.6591460052755170e-01f, -4.0000834899152421e-01f }, { -2.1623676747310724e-01f, 8.6790342532304210e-01f, -4.4719716535920934e-01f }, { -2.6223811969581161e-03f, 5.7384660963981748e-01f, -8.1895860195845349e-01f }, { 6.8607000471187207e-01f, -3.5769153055475544e-01f, -6.3353351734856811e-01f }, { 7.6825996945584341e-01f, -4.1178836590159401e-01f, 4.9010913176536658e-01f }, { -2.2102253659585425e-01f, 5.5813569302198762e-01f, 7.9977095876982163e-01f }, { 8.4081678927461956e-01f, 4.5508129156773625e-01f, 2.9313502850898082e-01f }, { 2.2752875183486138e-01f, -9.7371250689162092e-01f, 1.0706120273233675e-02f }, { 5.9022305985576651e-01f, 6.9421758149730073e-01f, 4.1194500743974877e-01f }, { -4.0215777314766082e-01f, 1.1036031919177297e-01f, -9.0889478238397015e-01f }, { -5.9613739940867816e-01f, 2.6405449177712143e-01f, 7.5821858747895665e-01f }, { -7.5857258763407742e-01f, -5.3814602375381304e-01f, 3.6737785236470144e-01f }, { 5.0702377267941579e-01f, 5.7352696544479553e-01f, -6.4342343277628333e-01f }, { -8.2733397693265431e-01f, -5.6167394591435393e-01f, -6.3928940080097401e-03f }, { 6.2080586618084832e-01f, 7.7597557627715186e-01f, 1.1163324566090786e-01f }, { 7.3153789474687902e-01f, 6.2758317030233512e-01f, 2.6644262591142265e-01f }, { -3.5113227779834716e-01f, 9.5062553132066380e-02f, 9.3148764590849908e-01f }, { -1.5182126690828188e-01f, 9.8237349583278422e-01f, 1.0905327872026126e-01f }, { 9.3451594530323379e-01f, -3.2344614019046952e-01f, 1.4853465040148203e-01f }, { -4.3580245238623411e-01f, -5.5647303400109149e-02f, 8.9832043287372709e-01f }, { -4.1579036159656224e-01f, 1.7787392250039583e-01f, -8.9189643058918178e-01f }, { -3.8269954635614711e-01f, 8.7961117966456581e-01f, 2.8253359061872646e-01f }, { -6.2071439558118635e-01f, 1.3054830787877691e-01f, -7.7309170117669135e-01f }, { 1.9097190901820621e-01f, -9.6085270244708687e-01f, 2.0072820969179120e-01f }, { 3.8232617170731087e-01f, 7.0507848538770101e-01f, 5.9723615753821979e-01f }, { 3.3455745361482792e-01f, 3.4238691819531555e-02f, -9.4175316416418231e-01f }, { -2.0129741989158001e-01f, -9.7952936988869943e-01f, 1.2499081727549500e-03f }, { -7.4554451579708669e-01f, -5.3905305152388405e-01f, -3.9189945471724807e-01f }, { -8.4100583413521557e-01f, 4.4120544104967752e-01f, 3.1312448920308023e-01f }, { 8.4295999710778946e-01f, -4.8633751678833720e-01f, 2.2998752801008454e-01f }, { -5.0222004154226652e-01f, 6.7067175294411016e-02f, -8.6213515406304653e-01f }, { 5.1608565722766431e-01f, -3.2473772129215495e-01f, 7.9259132393300180e-01f }, { -4.1004499360015473e-01f, -2.4022532929488086e-02f, 9.1174888052308611e-01f }, { 6.7946910852442943e-01f, -3.2418197254577436e-01f, -6.5820040963018844e-01f }, { -1.6324631513524349e-01f, -5.0911699872563954e-01f, -8.4507427022916859e-01f }, { -8.3941487727519928e-02f, -2.4260871609372894e-01f, 9.6648581857854643e-01f }, { 9.9103528212354264e-01f, -3.6426795006926603e-02f, -1.2853854749386870e-01f }, { -8.3393527432975023e-01f, -1.6294716907742016e-01f, 5.2725722215842530e-01f }, { -4.9175412973405747e-01f, 2.6413363422149816e-01f, 8.2970554967557231e-01f }, { -4.3911403396442117e-01f, -4.8090109786826829e-01f, 7.5888931949566107e-01f }, { -2.9540433121758131e-01f, -1.4069981076860499e-01f, 9.4495494302510119e-01f }, { 2.0846754305499796e-01f, 8.8192222945313947e-01f, -4.2279364315114354e-01f }, { -8.4538499774996456e-01f, -2.8900757725889165e-01f, 4.4922024204863953e-01f }, { 3.2317317932877243e-01f, -4.8316974373986210e-01f, 8.1369901984510773e-01f }, { 6.4675975292338506e-01f, 3.1280894313715793e-02f, 7.6205205048567126e-01f }, { 5.7231489664060853e-01f, 5.1429472715962887e-01f, 6.3871479762023087e-01f }, { 4.3902192782020427e-02f, -3.7984827836212776e-01f, -9.2400643011521177e-01f }, { 5.6122168963086017e-01f, 5.3031845840697450e-02f, 8.2596479247883858e-01f }, { 5.9247565446265893e-01f, 7.6548580346098793e-01f, 2.5100614249203113e-01f }, { -4.2887395658488786e-01f, 8.8502120449724131e-01f, 1.8112039353279885e-01f }, { 7.2577260755913775e-01f, -5.5468866664150662e-01f, 4.0690859565297610e-01f }, { -7.6997736223150315e-01f, -6.3806611015685377e-01f, -2.5496510189590440e-03f }, { 6.8578405140759446e-01f, 9.2147071967249944e-02f, 7.2194816431849751e-01f }, { -2.3624041504897234e-01f, 6.2621634046191044e-01f, -7.4299633998828141e-01f }, { 3.5131171953804918e-01f, 8.7719849394355820e-01f, 3.2726576041250088e-01f }, { -1.2196467929418674e-01f, 9.7269751256174664e-01f, 1.9744408337769168e-01f }, { 9.8941553330657095e-01f, 1.4247724378729665e-01f, 2.7516130804473848e-02f }, { 3.9777753906602803e-01f, -7.2010388581956464e-01f, -5.6852741626252112e-01f }, { 4.1670586686456880e-02f, -3.1833707602265426e-01f, 9.4706128008411017e-01f }, { -5.3126747905261500e-02f, -5.2731520577348001e-01f, 8.4800720658322426e-01f }, { 4.5210691006132031e-01f, -8.2552897664005465e-01f, 3.3778876624664322e-01f }, { 4.4157747428266801e-02f, -6.4646953643700078e-01f, -7.6166083777557492e-01f }, { 7.4438230548635886e-01f, 6.6758845867898009e-01f, -1.4853724025875713e-02f }, { -7.7935731664742747e-01f, 6.2121331884219511e-01f, -8.1830223519106335e-02f }, { 5.0884752939516631e-01f, -3.8373124000963626e-03f, -8.6084810905407672e-01f }, { 9.8083637550430036e-01f, -3.0793403059400027e-02f, -1.9238443496189694e-01f }, { 7.9987492320067299e-01f, 4.5152918117616486e-02f, 5.9846580622470102e-01f }, { 4.0296675292024786e-01f, 7.2432064283969655e-01f, 5.5944383310319967e-01f }, { 3.7417531566855200e-01f, 5.3922808222759355e-01f, -7.5447061472365584e-01f }, { -9.8206163649209643e-01f, -7.6322968555088092e-02f, -1.7242316144127598e-01f }, { -7.0677883573835987e-01f, 3.5575816796361814e-01f, 6.1147346899068189e-01f }, { -7.6526438337744973e-01f, -4.2170434749422292e-01f, -4.8634953154948496e-01f }, { -1.6921361486822672e-01f, 9.7191423050348258e-01f, 1.6355268597015160e-01f }, { -2.8130643645577430e-01f, -2.4116465549455918e-01f, -9.2881984138407814e-01f }, { -8.1059444171886275e-01f, -4.5570587343774804e-01f, 3.6778908081783029e-01f }, { 6.2118157727217027e-01f, 4.9543199521342446e-01f, 6.0719073294682624e-01f }, { 8.2781677328897940e-01f, 4.2063437337236703e-01f, 3.7119551963764147e-01f }, { 9.3465558154439277e-01f, 1.6301726948887960e-01f, -3.1598150853539331e-01f }, { 4.8859853182708868e-01f, 8.7221112456317873e-01f, -2.2786594406550006e-02f }, { -9.0663534020482894e-01f, -8.8754026764165633e-02f, -4.1247434177754605e-01f }, { 4.8961181486351701e-01f, -7.4120189395488278e-01f, -4.5923852532616199e-01f }, { -3.2204022646490316e-01f, 7.7861172938053125e-01f, 5.3856649302522730e-01f }, { 3.5470282835773270e-01f, 9.2002197970991906e-01f, 1.6656968633477717e-01f }, { 9.1375136306699078e-01f, 3.9118081808543287e-01f, 1.0970876927223291e-01f }, { 2.1602429571122278e-01f, -4.9514398139087951e-02f, 9.7513169779235154e-01f }, { 4.8773531820462984e-02f, 8.1751164221459993e-01f, 5.7384305993655293e-01f }, { -6.8442000148606752e-01f, -6.9637059480856889e-01f, 2.1595660733529642e-01f }, { 2.0338048086854554e-01f, 7.6878982256917527e-01f, 6.0629909179854058e-01f }, { 6.1354009810005633e-02f, 9.8900446106822859e-01f, 1.3455802267934971e-01f }, { -3.1371997039012736e-02f, -5.1499915954486986e-01f, -8.5661640392293548e-01f }, { 5.6328432833323627e-01f, 8.2621186233117039e-01f, -9.2045639458976734e-03f }, { 3.1463049851712310e-01f, -6.0802212996522509e-01f, 7.2891476790871612e-01f }, { 7.9808578902736427e-01f, 5.6833816633119860e-01f, -2.0012696480949330e-01f }, { 8.3384908844788530e-01f, -1.1891276304318353e-01f, -5.3903195868154830e-01f }, { -5.6306739597833744e-01f, -8.2608504076960843e-01f, 2.3208037462232555e-02f }, { -2.1454479192624593e-01f, 9.3455346074845635e-01f, -2.8386680196952829e-01f }, { 5.3380412161224822e-01f, -6.8910205167236915e-01f, 4.9009338103131700e-01f }, { 8.2541464307868451e-01f, 1.4460477334533689e-01f, 5.4569233686852470e-01f }, { 8.7444807735780145e-02f, -9.4306386219900185e-01f, -3.2091113632025065e-01f }, { 2.9262832891360618e-01f, -2.2892429981102688e-01f, 9.2841926201111391e-01f }, { -7.0737929251652076e-01f, -6.4938764529404636e-01f, -2.7912402737543124e-01f }, { -1.5139827374648729e-01f, -7.7132402824390889e-01f, -6.1817295812755624e-01f }, { -5.6278854440791681e-01f, 1.3518776996640805e-01f, -8.1547122642968084e-01f }, { 3.6164112515677228e-02f, -9.3494037880692826e-01f, -3.5295700169044791e-01f }, { 4.1387679715243286e-01f, 6.5411180007082462e-03f, 9.1030940374915648e-01f }, { 3.6584641162428699e-01f, 8.8566960876341072e-01f, 2.8591213198201243e-01f }, { 6.4091810925985659e-01f, 4.4285298839430859e-01f, -6.2698102674084233e-01f }, { 4.2693467882362357e-01f, 8.5035292726159584e-01f, -3.0761449757026166e-01f }, { 8.7960685610529343e-01f, -3.6846992832803394e-01f, -3.0086822798443702e-01f }, { 3.3435239395337735e-01f, -5.1669497910749773e-01f, 7.8818448045032452e-01f }, { 6.1394660385327393e-01f, 7.8684379772903323e-01f, 6.2820423369978423e-02f }, { -4.7073664414820698e-01f, -8.6389987680916192e-01f, 1.7912011250889515e-01f }, { 7.7958610756108249e-01f, 1.7866293760538576e-01f, 6.0027081856773146e-01f }, { 5.8200222351898256e-01f, 7.5856655677357288e-01f, -2.9300203201282748e-01f }, { 3.2926622965893193e-01f, 7.3691895739140212e-01f, -5.9036785163435213e-01f }, { -4.2418837663161302e-01f, -5.9354468466553945e-01f, 6.8393634823419214e-01f }, { 3.1466293930994449e-01f, -4.3416787285912811e-01f, -8.4408855744039457e-01f }, { 3.4907260472772655e-01f, -4.6871272783710810e-01f, -8.1145344622602800e-01f }, { -9.2867520720718388e-01f, 3.2804165483489141e-02f, -3.6944045020222921e-01f }, { 1.3882545103545846e-01f, -6.6166394213611068e-01f, 7.3683669956219133e-01f }, { -1.7866773956315504e-01f, 9.8132696823781562e-01f, -7.1240580069015874e-02f }, { 9.1397552335361687e-01f, -1.8580663162456804e-01f, -3.6072792843750584e-01f }, { 9.9265175552190021e-01f, -1.0114483120841462e-01f, -6.6424508873690405e-02f }, { 8.1351942688524859e-01f, 4.6927770029194960e-01f, 3.4345972411477271e-01f }, { -5.1148360007998928e-01f, 8.4014488485995731e-01f, 1.8039151668762785e-01f }, { -9.9889935607998886e-02f, 7.3313026671775416e-01f, 6.7271242948721000e-01f }, { 1.3284781596432574e-01f, 5.3819978729722118e-01f, -8.3228147086591708e-01f }, { 7.1787364579143378e-02f, -8.9478673105128792e-01f, -4.4068501247640735e-01f }, { -6.2554948787994580e-01f, 6.7147064513369825e-01f, 3.9725937488858931e-01f }, { 5.8623754198353584e-01f, 7.9927971322840174e-01f, -1.3220243715841914e-01f }, { 4.7549057440929404e-01f, 7.9661758605460076e-01f, -3.7324139003660950e-01f }, { 3.1454917549905043e-01f, -2.7752232987524778e-01f, -9.0776658487382189e-01f }, { 8.7062097527678861e-01f, -3.3954524948893627e-01f, -3.5598896184796147e-01f }, { -9.8697955947855787e-01f, -9.6047764691409271e-02f, -1.2902006072427510e-01f }, { 9.6784066826063619e-01f, 1.5483844492073964e-01f, 1.9826622716774597e-01f }, { -7.2754953774369224e-01f, 4.3736268959848185e-01f, -5.2856934065089489e-01f }, { 5.4614256165002339e-01f, 4.8564116813727282e-01f, 6.8255472906179149e-01f }, { 5.7713846055022966e-01f, -2.0022978530708621e-01f, 7.9171916133790099e-01f }, { -5.7490580748023178e-02f, 4.7839938695894629e-01f, 8.7625844343011006e-01f }, { 7.7542936803564166e-01f, -6.1356212912519159e-01f, 1.4916705028660673e-01f }, { 7.3441096402690453e-01f, -5.5694914907917337e-01f, -3.8787650258433742e-01f }, { 1.6711061977238190e-01f, -7.8556202935605990e-01f, 5.9579051586382215e-01f }, { 8.4500585992514643e-01f, -5.3474657341062759e-01f, 3.3464784111174655e-03f }, { 9.7801239476912283e-01f, 1.1579284061117467e-01f, 1.7344674612445340e-01f }, { 8.8785057092586506e-01f, -2.6412240494507983e-01f, 3.7677674943213063e-01f }, { 4.8130116316151234e-01f, 2.7297553569438465e-01f, -8.3296671437203240e-01f }, { -2.4229191815451728e-01f, 8.6491155990081547e-01f, 4.3957094984421208e-01f }, { -9.1298825211032109e-01f, 1.1712107440034210e-01f, -3.9081338953501882e-01f }, { 8.2592902848070593e-01f, -2.1495581800424277e-01f, -5.2118637378489108e-01f }, { -8.6217343683214598e-01f, -3.9160085103264497e-01f, -3.2141210041246693e-01f }, { -1.0655545384878365e-01f, 8.8018321399453969e-01f, -4.6251858887759523e-01f }, { 6.2077119395120950e-01f, 6.4222929594701950e-01f, -4.4964948147171852e-01f }, { 3.6515626305201465e-01f, 5.8011293573278211e-01f, -7.2810018908758756e-01f }, { -1.0144649869315046e-01f, 9.3503660231699759e-01f, 3.3972806806383471e-01f }, { -8.0518108052890180e-01f, 4.0786753356411404e-01f, -4.3049680907369847e-01f }, { -6.7711688385629654e-01f, 5.3390886943135762e-01f, -5.0641291920651887e-01f }, { -8.7723876722262162e-01f, 4.6749162686965218e-01f, 1.0910418914276818e-01f }, { -3.4665084547656710e-01f, -3.1250015679024123e-01f, -8.8440762283940988e-01f }, { -7.2624601287996016e-01f, 2.6321933210464399e-01f, 6.3504512594172868e-01f }, { 3.6114246781691273e-01f, -1.2054964909945448e-02f, -9.3243272988464432e-01f }, { 8.7239621296226944e-01f, 1.6318953620163146e-01f, -4.6075375514843853e-01f }, { -7.5095295402254114e-01f, 5.6103699556669773e-01f, -3.4829176052601724e-01f }, { 9.4486474275567001e-01f, -1.0088846276508140e-01f, 3.1153191807286851e-01f }, { -9.3605914200254825e-01f, -2.3340263454926410e-01f, 2.6328025535333227e-01f }, { 7.6793720027454326e-01f, -4.8212130429359540e-01f, 4.2170072845649498e-01f }, { -4.3185911625348200e-01f, 7.9571562309158195e-01f, -4.2465792218765552e-01f }, { -4.0530877258824587e-02f, 1.2436149773956810e-01f, 9.9140882882320625e-01f }, { 6.4715800982204796e-01f, -6.5280257325616786e-01f, -3.9374523574678560e-01f }, { 2.2584416745168479e-01f, -9.7269905570143012e-01f, -5.3394372976951453e-02f }, { -5.4242187586616986e-01f, 3.9838785477870658e-01f, -7.3963884818649550e-01f }, { 4.1854699666109180e-01f, -4.1115136310533779e-01f, 8.0979810335823998e-01f }, { -7.6720793607081761e-01f, 3.9048076064436343e-01f, -5.0883863689440445e-01f }, { -5.2349080600702091e-01f, 1.1864162676264130e-01f, -8.4373072743929012e-01f }, { -8.2049242085629748e-01f, 4.8507237867034375e-01f, -3.0248466865027562e-01f }, { -1.4562809394255830e-01f, 8.0893243945170973e-02f, 9.8602674473803420e-01f }, { -2.4115231151551170e-01f, -7.5840200012544756e-01f, -6.0553444894278829e-01f }, { 7.3822741119001145e-01f, 5.1981169771493907e-01f, -4.2990241716743882e-01f }, { -7.7398133881278544e-02f, -9.9662369231375625e-01f, 2.7399722454634567e-02f }, { 6.3172739437613457e-01f, 7.3251692650065103e-01f, 2.5365222566494355e-01f }, { -9.7209867932515037e-01f, 8.2344671958564972e-02f, -2.1964405900077219e-01f }, { 2.5874678594083163e-02f, 9.3034933954029775e-01f, 3.6576031417389271e-01f }, { -5.6465871577577953e-01f, -3.5764577778292500e-01f, -7.4380779260000629e-01f }, { 8.5749825411050265e-02f, 5.5161574989378992e-01f, -8.2967887276408714e-01f }, { 4.1317071367956359e-01f, -8.7284960331781847e-02f, -9.0646086350012889e-01f }, { 9.3019401043555061e-01f, 3.5028154008006279e-01f, 1.0973579921322919e-01f }, { 1.6701909532873674e-01f, 5.9914550659630850e-01f, 7.8302572353724320e-01f }, { -7.1723186548192508e-01f, -6.7023929909555391e-01f, 1.9067703869427538e-01f }, { -2.2263014578208948e-01f, 9.7271662824672678e-01f, 6.5254726429313542e-02f }, { 5.8982888035112280e-01f, 7.4890410652368222e-01f, 3.0206709707564317e-01f }, { 4.0346359510230406e-01f, 9.0009349865708810e-01f, -1.6446525804061632e-01f }, { 8.7080630872822484e-01f, -2.3763022508741957e-01f, -4.3038151540699993e-01f }, { -2.9799729759646743e-01f, 9.2771445305444322e-01f, 2.2481882532185260e-01f }, { 1.0585584372613981e-01f, 9.5838185438371992e-01f, 2.6513913618522900e-01f }, { -4.3628273321132088e-01f, -7.2167490295056247e-01f, 5.3744089084564051e-01f }, { 8.5892010045230249e-01f, -1.0622928957634397e-02f, -5.1199942814359445e-01f }, { 8.1688974364837985e-01f, 3.8212673279945719e-01f, -4.3205359251150360e-01f }, { -8.5913747868756399e-02f, 2.7723793931246776e-01f, -9.5695242981713580e-01f }, { 1.6500441705513919e-01f, 9.0112770716293122e-01f, -4.0092692318622358e-01f }, { -2.3278989434300082e-01f, -9.2655053132319698e-01f, -2.9548769516931800e-01f }, { -2.7138142552553696e-01f, -9.0386147458843435e-01f, 3.3073638541072020e-01f }, { 5.7152715873608573e-01f, -7.8306226691678937e-01f, 2.4529613319046806e-01f }, { -7.8940235632766131e-01f, -2.8846538423710394e-01f, 5.4187788469476772e-01f }, { -5.5739214860175679e-01f, -2.5425781524057250e-01f, 7.9035875149593171e-01f }, { -6.0520288927320032e-01f, -1.2453087871635750e-01f, 7.8627064237544964e-01f }, { 3.5262046482565107e-01f, -4.0924422571533670e-01f, -8.4153310778887147e-01f }, { -9.4465681678953628e-01f, 3.2806007326802195e-01f, -2.9465308486380931e-04 }, { -3.1724480890436874e-01f, 2.9159649665139498e-01f, -9.0240080583068161e-01f }, { -6.8729843473727481e-01f, -3.7543435652269164e-01f, 6.2182787453610056e-01f }, { -3.4347593250933717e-01f, 8.5279938218754381e-01f, -3.9339229469752574e-01f }, { 6.4413642236241464e-01f, 5.2791253638860791e-01f, -5.5353104999620018e-01f }, { -6.2581822438702550e-01f, 6.0663608618460774e-01f, -4.9024912948794891e-01f }, { 1.5015943459395331e-01f, 6.7142690979565589e-01f, -7.2569831817683061e-01f }, { -4.9607192828196123e-01f, -5.6649032397237131e-01f, -6.5802838450654599e-01f }, { 1.3203897303010026e-01f, -7.0702832403391747e-01f, 6.9474934948868161e-01f }, { -8.1155903804968876e-01f, 3.3723930428093057e-01f, 4.7711799317147702e-01f }, { -6.2354424053024926e-01f, -5.9955145964257861e-01f, 5.0172764259307889e-01f }, { -1.7935939132298653e-01f, 8.5957702839008154e-01f, -4.7849507939823638e-01f }, { -6.9157911453379906e-01f, 7.3502498683558168e-02f, -7.1855111928652660e-01f }, { -1.5113436204059016e-01f, 4.0375381446484565e-01f, -9.0229776787691929e-01f }, { 4.1745974025960680e-01f, -8.0597183081677271e-01f, -4.1968651776324811e-01f }, { -3.9022260127891423e-02f, -9.6350487240206528e-01f, 2.6483131248398700e-01f }, { 5.5670507042295225e-01f, 7.8126594994498333e-01f, 2.8231716211016727e-01f }, { 9.0572090678046102e-01f, 3.9173809816370858e-01f, 1.6189781180689275e-01f }, { -7.6771411019589897e-01f, -8.8448938353024836e-02f, -6.3465882985297062e-01f }, { -3.3273116781617075e-02f, -9.7523822380836711e-01f, -2.1863967280147997e-01f }, { 4.5822768376551282e-01f, -7.7848199673768204e-01f, -4.2894425114017398e-01f }, { -6.9719367105126329e-02f, -6.9682195118382417e-01f, 7.1384758751348942e-01f }, { 5.9938975934344252e-01f, -5.9119896622221446e-01f, 5.3964404817619827e-01f }, { 3.6879008375902428e-01f, 5.8562961241543321e-01f, 7.2182534673088439e-01f }, { 3.0874164400072085e-01f, 9.3396657850879028e-01f, -1.7995840488378356e-01f }, { 5.9850068083085939e-01f, -6.2405699476219234e-01f, 5.0234430656013085e-01f }, { -5.9246843551900918e-01f, 1.0492749272944159e-01f, -7.9873110255152246e-01f }, { 1.2377816722820495e-01f, 3.4479484666391258e-01f, 9.3048131578857374e-01f }, { -1.5352160715664745e-01f, -9.1974953571730056e-01f, 3.6123663668549749e-01f }, { 6.1410317982639739e-01f, -6.5192462285010699e-01f, -4.4482757406533735e-01f }, { 3.3237019880656948e-01f, -8.3863163273159491e-01f, 4.3154030579682889e-01f }, { 5.4497640777669865e-01f, -8.3844913051294367e-01f, -1.9417798264166678e-03f }, { -6.3299633512890630e-01f, -1.5872148769001229e-01f, 7.5770913222610869e-01f }, { 2.0805154456161046e-01f, 9.1709506303524169e-01f, -3.4007528602048431e-01f }, { -9.8309059176685021e-01f, -1.2498399584945911e-01f, 1.3383530610794286e-01f }, { 4.9547409346580118e-01f, -6.8840836827843332e-01f, -5.2971628367312573e-01f }, { 1.6002243718907122e-01f, 6.3210100227422306e-01f, -7.5818278964903474e-01f }, { -1.2901175164113807e-01f, -8.5763903103555328e-01f, -4.9780644871564550e-01f }, { 6.3282988412293650e-01f, -7.1548711947294608e-01f, -2.9598060684655819e-01f }, { -8.9504746519983791e-01f, 1.7020751192493463e-01f, 4.1221285511695083e-01f }, { -3.5382304965869993e-01f, 1.9999749984941584e-01f, -9.1367951141754300e-01f }, { 8.4743666689417307e-01f, -3.3782315527146312e-01f, 4.0954439486547417e-01f }, { -5.9152750263121467e-01f, -6.3074602997056828e-01f, -5.0224959861332419e-01f }, { 2.3162327683751560e-01f, -5.8195547722038687e-01f, 7.7953735007390335e-01f }, { -8.4746642857560672e-01f, 5.2686803762710610e-01f, 6.4890086795044530e-02f }, { -5.0490871107076807e-01f, 8.5714196510630103e-01f, -1.0185698374959062e-01f }, { -4.7997960461692363e-01f, 4.7507885004435219e-01f, -7.3750909512515006e-01f }, { -1.1774008380758533e-01f, -8.7919984859012290e-01f, -4.6167618403388311e-01f }, { 3.6384230557703223e-01f, 9.1632814822646569e-01f, -1.6721692928721596e-01f }, { -3.2956998248414782e-01f, -3.5900019271839272e-02f, 9.4344836385553188e-01f }, { 7.4693059293211150e-01f, 6.6426950067662804e-01f, 2.8995168785636745e-02f }, { 4.1407409971401943e-01f, 5.2074470975069198e-01f, -7.4657055072691680e-01f }, { 4.9143442782657387e-01f, -1.5949830080575181e-01f, 8.5618484872534728e-01f }, { -6.9437285636724233e-01f, -7.1527423147422498e-01f, -7.8924711778720472e-02f }, { -5.8012786365448166e-01f, 2.0384006491290860e-01f, 7.8860692981230418e-01f }, { -2.0743324779213840e-01f, -8.8440029358308569e-01f, -4.1809995027571711e-01f }, { -8.2386826438393179e-01f, -1.2924912242738965e-01f, 5.5184757614105495e-01f }, { -1.9479454185017814e-01f, -4.2581330872825268e-01f, -8.8359386177999055e-01f }, { 2.0175285698184592e-01f, -8.1249772096977912e-01f, -5.4693988528775062e-01f }, { -6.0045103156949475e-01f, -5.5680093225285998e-01f, 5.7396104443548768e-01f }, { -9.0346365101362813e-01f, 4.4187058333873618e-02f, 4.2638120874743529e-01f }, { -5.6641627584432519e-01f, 5.0606500939682032e-02f, 8.2256403065128447e-01f }, { 7.5480997047347353e-01f, 6.2957823525713297e-01f, 1.8410093471883346e-01f }, { 8.3980304936865691e-01f, -5.2735988996872385e-01f, 1.2892782757527826e-01f }, { -8.0303058004018113e-01f, 3.0417238875678249e-01f, 5.1246565293522162e-01f }, { -5.4579795371391460e-01f, 3.5735325309675353e-01f, 7.5789395447045971e-01f }, { 6.2728253512176824e-01f, 1.2608530573768553e-01f, 7.6851747983259422e-01f }, { -7.1972926812704796e-01f, -7.6669910431440391e-02f, 6.9000833722190547e-01f }, { 8.9842208630401343e-01f, -2.0596515063260454e-01f, 3.8783516030142545e-01f }, { -1.6720797886727470e-01f, 9.7174331106856526e-01f, -1.6660260861289833e-01f }, { -5.3774691241108986e-02f, -4.3819057103732478e-01f, -8.9727214714149384e-01f }, { 6.6843743392670352e-01f, 5.4253856886776475e-01f, -5.0876644761265610e-01f }, { 5.4932531101308996e-02f, -2.2914000218258168e-01f, -9.7184220757619399e-01f }, { 1.2400780918955560e-01f, -9.6658319104192814e-01f, -2.2436353994178801e-01f }, { -5.3330706602233435e-01f, -1.6184328954415644e-01f, 8.3029532273774487e-01f }, { 4.4654562409605092e-01f, 7.9311291398108630e-01f, -4.1420877740228823e-01f }, { 5.9575497686873313e-01f, -3.0444121266578805e-01f, 7.4323048616611509e-01f }, { 2.4581923378137563e-01f, 6.6429376058039402e-01f, -7.0589425833979946e-01f }, { 9.2958026981140984e-01f, 8.4692638839682463e-02f, -3.5875852450320611e-01f }, { -8.0508155853764707e-01f, -5.6813074343578618e-01f, -1.7050261718136181e-01f }, { -5.9371187798272473e-01f, -5.1888376571209294e-01f, -6.1503320530087158e-01f }, { -8.4823052996540460e-01f, 1.7974025166956903e-01f, 4.9819515248983381e-01f }, { -7.1823212044633566e-01f, -4.2452090906868895e-01f, -5.5129358686878849e-01f }, { -6.8924349736207688e-02f, -6.0857269004077519e-01f, 7.9049902906327185e-01f }, { -7.7425104081776375e-01f, 4.9101211606366529e-01f, -3.9930242632782881e-01f }, { -6.1196173380178209e-01f, -4.6137935655895368e-01f, -6.4236432474380367e-01f }, { -7.9220283728811469e-01f, 4.2243744091069285e-01f, 4.4041034627888315e-01f }, { 2.7332199649095312e-01f, 2.6664165773442916e-01f, 9.2422795488712362e-01f }, { -3.8107186389894987e-01f, 4.9267556913133292e-01f, 7.8233945198085042e-01f }, { -8.7778578886981218e-01f, -2.1037676243811726e-01f, 4.3038787934171369e-01f }, { 6.0113868960148531e-01f, 5.3742960785229099e-01f, 5.9144035410846085e-01f }, { 6.3114808679692969e-01f, 2.5707380866176560e-01f, 7.3182316814426507e-01f }, { -1.5931101685772828e-01f, 5.8773339469032093e-01f, 7.9321463468190512e-01f }, { -3.1753540366258659e-01f, -7.8481211896590675e-01f, -5.3220410121031747e-01f }, { -9.3204404379130135e-01f, 2.7462936489859052e-01f, 2.3637388258552505e-01f }, { -8.5805732290809100e-01f, 5.9203883603206921e-02f, -5.1012991558043141e-01f }, { 9.4349872174348526e-01f, 3.1471898978328888e-01f, -1.0374063590606775e-01f }, { 7.5187179433141604e-01f, 3.5152103604962548e-01f, 5.5778290230470029e-01f }, { -5.0510153967665550e-01f, 7.3512840888007491e-01f, 4.5217104846918443e-01f }, { -5.0472819555204584e-01f, 7.0307447626074993e-01f, -5.0093485549065964e-01f }, { 8.8227082293227210e-01f, -5.3062952046961404e-02f, 4.6774193539009640e-01f }, { 3.7125486012878878e-02f, -5.7533305063201035e-01f, 8.1707623826591125e-01f }, { -4.0460971825715525e-01f, -5.6411660986650403e-01f, 7.1976623035857135e-01f }, { 2.5053166879054939e-01f, -2.4515204353705272e-01f, 9.3655451442114646e-01f }, { -7.1606842718152830e-01f, -8.5630131760114376e-03f, -6.9797756582795678e-01f }, { -5.2150523550833328e-01f, 5.0847518403767444e-01f, 6.8518995654873027e-01f }, { 5.5933221546253531e-01f, -6.2582751904229972e-01f, 5.4358751747545864e-01f }, { 2.0516028110309236e-02f, 8.3920378030549303e-01f, 5.4342994738194805e-01f }, { 5.1349272892031572e-01f, 8.5227814569208249e-01f, -9.9735548936338569e-02f }, { -4.9875427349945423e-01f, -8.4023000863384489e-01f, -2.1273858901760290e-01f }, { -1.1048111052389032e-02f, 6.1092897421297732e-01f, -7.9160831710464830e-01f }, { 5.5653813366323102e-01f, 8.2883365291478051e-01f, -5.7446336476654015e-02f }, { -7.4028276424814576e-02f, 6.6869982659338412e-01f, -7.3983806079678638e-01f }, { -2.7198746082014114e-01f, 8.7655683464142142e-01f, -3.9707799838321950e-01f }, { 9.7886134926892787e-01f, 2.1258562707675392e-02f, -2.0341713895101818e-01f }, { 4.8423113720990521e-02f, 5.2187513813006015e-01f, 8.5164637159991163e-01f }, { -3.1979456328846811e-01f, -7.0947778244762494e-01f, -6.2799101387228362e-01f }, { 9.6477327002063795e-01f, -7.4578985208565277e-02f, 2.5229053176634686e-01f }, { -9.4877446994935707e-02f, 9.7241006564197141e-01f, -2.1311249210194108e-01f }, { -5.3370837099828272e-01f, -5.3693415791656285e-01f, -6.5334300699463455e-01f }, { 3.6776996471311491e-01f, -7.5391672832767306e-02f, -9.2685562452972747e-01f }, { -7.9430284458543332e-01f, 6.2711769026859876e-02f, 6.0427661307468361e-01f }, { -3.1559348868169534e-01f, 8.7618443728555995e-01f, -3.6428228307221228e-01f }, { -7.5409588443526276e-01f, -4.4735589026522932e-01f, 4.8084519808645587e-01f }, { -9.6001593335989810e-01f, -1.8869649320074142e-01f, 2.0679226568918441e-01f }, { 6.4750546831148792e-01f, 6.4174393016601650e-01f, -4.1097615089174661e-01f }, { -7.5852524286347556e-01f, -2.6182326988878524e-01f, 5.9673112143045615e-01f }, { 3.7700151770288909e-01f, 4.5094010783190608e-01f, 8.0902588017829635e-01f }, { -1.3388614225194427e-02f, 9.8519491624542355e-01f, 1.7091437041191668e-01f }, { -7.6547924482776797e-01f, -1.3078228583560142e-01f, 6.3002977663720394e-01f }, { 3.8783238976370860e-01f, -9.1990600446842197e-01f, 5.7956711372494120e-02f }, { -1.3577686933782857e-01f, -7.4128119936255088e-01f, 6.5731790271103696e-01f }, { -4.0259947793940776e-01f, -1.9509522669879542e-02f, -9.1516831178101321e-01f }, { 5.5642813179464556e-01f, -4.8434693787585670e-01f, 6.7512649030963190e-01f }, { 6.1874152486141143e-01f, -1.8919035348657717e-01f, -7.6247356384323206e-01f }, { -7.0389780665412516e-01f, 1.6898116392196491e-01f, -6.8990814173126691e-01f }, { -2.6195247204938926e-01f, 8.3271205366288459e-01f, 4.8782326520139985e-01f }, { 7.3818267009588245e-01f, -3.7770883878853229e-01f, -5.5894756343608121e-01f }, { -8.7383368626909896e-01f, 3.1418031468579105e-02f, 4.8520881694379525e-01f }, { 4.9216824911524326e-01f, -4.9537059318325544e-01f, 7.1580611199689081e-01f }, { 2.1200425159375419e-01f, 7.4780311714079373e-01f, -6.2916189911713860e-01f }, { 6.6688380357002852e-01f, 5.5904931301062621e-01f, 4.9267622041084808e-01f }, { 6.6485800311617094e-01f, 7.1461557051781244e-01f, 2.1745901238136570e-01f }, { -9.0082960550324476e-01f, -4.3395007384313422e-01f, -1.3905224212749926e-02f }, { -3.6852903118343266e-01f, 4.1021771003450121e-02f, 9.2871070171433956e-01f }, { -5.6926319537267589e-01f, 5.7181924615049085e-01f, -5.9073019571203145e-01f }, { 1.8367005193953685e-02f, -8.1955521633605477e-01f, -5.7270577131417821e-01f }, { -9.1001215633853727e-01f, 1.9798228378310215e-01f, 3.6425388209889098e-01f }, { -2.6512576735697790e-01f, -8.2660424634761398e-01f, 4.9642093771663848e-01f }, { 8.5741828107265250e-01f, -4.5257023381482631e-01f, -2.4497770255109164e-01f }, { 1.4187420310860577e-01f, -2.8884929752954192e-01f, 9.4680398911759356e-01f }, { 3.4265784492940649e-01f, 1.2989566884309314e-01f, -9.3043684177064934e-01f }, { 9.0983587718775583e-01f, -2.4690332020059036e-01f, -3.3352275343057430e-01f }, { 7.0333082167861638e-01f, -6.4823092601308441e-01f, 2.9175747091908633e-01f }, { -2.4068337642054174e-01f, -3.1093786424262115e-01f, -9.1945046462277946e-01f }, { 6.7037974175310122e-01f, 5.9315041011630633e-02f, -7.3964364916954017e-01f }, { 8.7050186145449704e-01f, -7.9054062099858186e-02f, -4.8577460253678084e-01f }, { -5.2136365526595241e-01f, 4.1747098375726571e-01f, 7.4424318383742416e-01f }, { -4.6972546737655035e-01f, 3.1255481296245630e-01f, 8.2563156080172062e-01f }, { -1.6527142225911640e-01f, -3.5106299553318517e-02f, -9.8562310480026871e-01f }, { -8.2265051797927768e-01f, -1.9934203385596136e-01f, -5.3245551814831915e-01f }, { 9.5911737714068301e-01f, -2.3418383135446741e-01f, 1.5890811810262936e-01f }, { 1.6283661143348230e-01f, -2.4784452211498467e-01f, 9.5501692698844665e-01f }, { -2.7490475778978457e-01f, -2.1185593939662697e-02f, 9.6123802710565065e-01f }, { 6.7801366425520349e-01f, -6.8977227278617104e-01f, 2.5399150139056259e-01f }, { -3.4074748245448966e-01f, 2.3786716693185170e-01f, 9.0956603064139430e-01f }, { 9.2456507853624958e-01f, 2.8062855295495365e-01f, -2.5773441915597411e-01f }, { -3.1022574433723749e-01f, 7.8325711334740533e-01f, -5.3876551665923911e-01f }, { -4.7418070498718917e-01f, 8.6948449855085097e-01f, 1.3838123354569232e-01f }, { -9.5107782554633802e-01f, 2.6741433410529980e-01f, 1.5472732037060666e-01f }, { -8.7378780413855517e-01f, 9.3888404186104599e-02f, -4.7715808795210496e-01f }, { -1.5563508837943105e-01f, -6.3385451743317656e-01f, 7.5763194890044172e-01f }, { -4.9866271839431719e-01f, 5.5208529134031836e-01f, 6.6823448307406719e-01f }, { 8.8897007945949313e-01f, -3.7190083583095923e-01f, 2.6724888425214505e-01f }, { -1.3074188807496073e-01f, 8.5813109249573272e-01f, 4.9650537438649611e-01f }, { -2.4199457990653882e-02f, -8.8530651114124803e-01f, -4.6437782845854064e-01f }, { 5.6866435140263993e-01f, -3.6237751961642167e-01f, -7.3844660519259264e-01f }, { -5.9927560223943421e-01f, -3.6567532930658919e-01f, -7.1214486314027492e-01f }, { 7.8578828616084062e-01f, -5.3142654895183605e-01f, 3.1642154225265812e-01f }, { 8.8853115659088133e-01f, 3.1000948729083494e-01f, -3.3824030149724071e-01f }, { -9.1754941976591997e-01f, -2.9691957779747430e-01f, 2.6446517087849802e-01f }, { 8.3273001642436384e-01f, 1.3669296218178346e-02f, 5.5351049681715903e-01f }, { 5.0356428952711774e-01f, 7.3236871806195003e-01f, 4.5832201247304843e-01f }, { -7.6642185496685500e-01f, 4.6996722025916388e-01f, 4.3786796196004052e-01f }, { 3.4184141326844129e-02f, 5.0003679296516657e-01f, -8.6532921490196868e-01f }, { -8.3158870265323592e-01f, -1.3231586233318707e-01f, -5.3940035427735233e-01f }, { -3.7515683265814659e-01f, 9.2532871588496735e-01f, -5.4991985494113785e-02f }, { -1.4778829902144869e-01f, -5.6035536725125668e-01f, 8.1496041687008092e-01f }, { -8.5495195532607904e-01f, -5.1144280447155321e-01f, 8.6506715568138270e-02f }, { 1.4476079603195956e-02f, 4.6639333427996343e-01f, -8.8445898766338527e-01f }, { 7.4072401744844441e-01f, 3.0876311129614303e-01f, 5.9665171673075923e-01f }, { 8.3588589103855881e-01f, 9.5415131772077444e-02f, 5.4054669529245281e-01f }, { 3.8448396141792052e-01f, 9.2294279341449237e-01f, 1.8673068752525102e-02f }, { -3.1649301400117108e-01f, 2.6360209665045785e-02f, -9.4822851224526539e-01f }, { -2.3250776876491089e-01f, -2.4478115812837578e-01f, 9.4128758734474649e-01f }, { 5.8068031229306161e-01f, 5.9783735204338817e-01f, -5.5263086723144794e-01f }, { 4.0436097773379509e-01f, 4.1414982004215511e-01f, 8.1545823084031710e-01f }, { -3.8151095918247530e-01f, 9.1789997113642441e-01f, -1.0912850686882397e-01f }, { 4.0961961656332002e-01f, 3.0125680526975601e-01f, -8.6107845577808928e-01f }, { -4.7912471349015545e-01f, 3.7001380919035348e-01f, -7.9594553201297713e-01f }, { -1.7045596432314886e-01f, 9.4860101705520106e-01f, -2.6664747264600774e-01f }, { -6.8652276161621939e-01f, -7.2569578993339101e-01f, 4.5300311873001507e-02f }, { 2.0432269622260393e-01f, 9.4852862399225379e-01f, -2.4196215670159482e-01f }, { -1.5882514026242012e-02f, -8.2897503684009277e-02f, -9.9643150774710343e-01f }, { 3.5837011027495003e-01f, 8.2933738928834722e-01f, 4.2868445130411309e-01f }, { 7.7086754452081241e-01f, 5.6248233866011588e-01f, -2.9895960847562675e-01f }, { 8.1923124626758359e-01f, -4.9678716610068485e-01f, 2.8646583869025732e-01f }, { -6.6924583758714262e-01f, -2.2235045717550733e-01f, -7.0899244217842461e-01f }, { -8.4080195168476746e-01f, 4.9359386710682418e-01f, 2.2229973548705970e-01f }, { 7.3143622196581137e-01f, 6.6313126948830337e-01f, -1.5892757036842731e-01f }, { -8.7295061876682933e-01f, -2.9211609839687264e-01f, 3.9067301193197163e-01f }, { 5.7174351672567170e-01f, 5.2463961066721787e-01f, -6.3076352938411995e-01f }, { 7.3388900021284689e-02f, 5.9925836027488366e-01f, 7.9718472576581867e-01f }, { 4.9771745561480862e-01f, 6.1292851216410382e-01f, -6.1367415894155020e-01f }, { -2.8437520531203736e-01f, 5.1083128008001200e-01f, -8.1128425714761210e-01f }, { -5.1325277069295949e-01f, 6.8815855611064847e-01f, 5.1284441600519326e-01f }, { 5.3739289400100232e-01f, -2.4819959710807454e-01f, 8.0598128853752982e-01f }, { 6.2239905235750692e-01f, -6.2030169541495561e-01f, -4.7733135900526064e-01f }, { 2.8756277426265842e-01f, -9.3135707644819032e-01f, 2.2334199562160961e-01f }, { 4.4806630882280274e-01f, 3.0668016302863554e-01f, -8.3975226138584369e-01f }, { -7.6696358123836283e-01f, 4.2538157674300375e-01f, -4.8043457329969641e-01f }, { -5.5755667951247945e-01f, 4.1255301180093035e-01f, 7.2036835132104438e-01f }, { -8.0479483597759238e-01f, 4.8062073915154796e-01f, 3.4829438278734831e-01f }, { 9.8128808177120785e-01f, -1.9245871044137464e-01f, -5.7745431876597151e-03f }, { 1.1690172013140455e-01f, 9.4947565775253184e-01f, -2.9125583799422078e-01f }, { 6.1326251381639552e-01f, 5.2413778780662656e-01f, -5.9092188023525660e-01f }, { 2.7933832674179182e-01f, -7.7910477146292656e-01f, -5.6121818778154087e-01f }, { 8.0458332649175546e-01f, 2.2905286811907585e-01f, 5.4788726425961631e-01f }, { 9.5207999427524426e-01f, -2.3377355317083354e-01f, -1.9721463013360438e-01f }, { 2.5932345715044597e-01f, -7.0427589498169763e-01f, 6.6086822311204341e-01f }, { 9.7131819419847854e-01f, -2.3675905785284757e-01f, 2.2047996363354316e-02f }, { 3.0961627852596894e-02f, -5.7367265425905245e-01f, -8.1849927511030274e-01f }, { -3.1286667560961862e-01f, -2.8065855292427105e-01f, -9.0738372255812472e-01f }, { 4.4137777698188035e-01f, -2.5132816302579814e-02f, 8.9696934146671603e-01f }, { -9.0294384930085558e-01f, -3.4358523073695146e-01f, 2.5815033261491210e-01f }, { -1.6742416557645928e-01f, -2.8610077942528404e-02f, 9.8546974191050063e-01f }, { -5.1906877772886419e-02f, 9.9799003552720789e-01f, -3.6353335861692655e-02f }, { 5.2611108229816864e-02f, 2.0730868241736308e-01f, 9.7685985764858174e-01f }, { -9.9063400358588261e-01f, 9.3656839491151139e-02f, 9.9361297072522947e-02f }, { -1.6445733834841308e-01f, -8.3104681685191240e-01f, -5.3133320248565263e-01f }, { 6.5619573987635782e-01f, -8.0252347721395792e-02f, -7.5031107658978580e-01f }, { -3.4750083640933943e-01f, 5.5147573058944444e-01f, -7.5836514111979592e-01f }, { 1.6731599060796329e-01f, 8.7110770718491803e-01f, 4.6171064723472754e-01f }, { -4.3215501911589937e-01f, 5.5674860180578700e-01f, -7.0941739042698815e-01f }, { 6.7481104368761746e-01f, 4.2544775413146257e-01f, -6.0301265643576929e-01f }, { -6.7430667192111804e-01f, -7.1780586404396374e-01f, -1.7339334977664014e-01f }, { -7.2592998929104213e-01f, 6.1972927981236481e-01f, -2.9826375976835523e-01f }, { 7.7980248993693002e-01f, -6.2304601111664593e-01f, -6.1006103955263721e-02f }, { -5.6636684692013717e-01f, 2.8059039242927347e-01f, -7.7491781911769742e-01f }, { 5.4720835990617156e-01f, -5.1719765205752521e-01f, -6.5808023793074122e-01f }, { 1.5147705705577524e-01f, 9.4129379870975671e-01f, 3.0169634683946278e-01f }, { 2.5345612591410227e-01f, -7.4136761527708361e-01f, 6.2139685488018437e-01f }, { 6.3481354710013782e-01f, -7.3112460502758592e-01f, -2.4993713677922622e-01f }, { -8.2700816744154404e-01f, 4.1858183686402817e-01f, -3.7529553265728494e-01f }, { -5.2292872207278573e-01f, -2.8203224604269916e-01f, 8.0436519307055643e-01f }, { 7.4745339720596171e-01f, 4.7337726004305514e-01f, 4.6607659100130377e-01f }, { 1.0374594564177570e-02f, 9.8489528343708310e-01f, -1.7283995039057598e-01f }, { -6.1905447247264389e-01f, -4.1915769025633515e-01f, -6.6413732827675842e-01f }, { -4.5559646138344495e-01f, 1.6924581692960927e-04f, -8.9018640504713198e-01f }, { 3.3680852079762869e-01f, -2.2204085158169787e-01f, 9.1501796733560792e-01f }, { -4.8596607022248522e-01f, -8.6487802715265460e-01f, -1.2578941426466125e-01f }, { -9.7705340969942522e-01f, 7.2467878551339127e-02f, 2.0028739644070329e-01f }, { -6.4128993651909760e-01f, -7.6717541536454026e-01f, 1.3751341010130128e-02f }, { 5.7208677893251692e-01f, 3.0918031861912215e-01f, 7.5968694075204146e-01f }, { 7.5827406744621284e-01f, 2.1118716873198431e-01f, -6.1678231038312425e-01f }, { -2.6904651560695773e-02f, -5.9848805463047716e-01f, -8.0067982876367294e-01f }, { -2.1431452593926867e-01f, 4.3261060989232863e-01f, -8.7573817101917739e-01f }, { 3.7800273782757543e-01f, 1.6770435997502242e-01f, -9.1048842817480413e-01f }, { 8.1650430731615486e-01f, -4.4777625612011546e-01f, 3.6444086020809868e-01f }, { 9.5392324609577572e-01f, 2.9872005334458079e-01f, 2.8227119723928711e-02f }, { 4.7117459552605034e-01f, 1.6090048785737732e-01f, 8.6724018215147347e-01f }, { -9.0005321233661062e-01f, -4.0680423785563824e-01f, -1.5625148647370179e-01f }, { -6.7907213775142783e-01f, 2.4770606643143786e-01f, 6.9101572802850875e-01f }, { 8.7999770238502573e-01f, 1.3658791432428041e-01f, 4.5491514094127344e-01f }, { 4.0547500178373841e-01f, 1.0187879225474507e-01f, 9.0841110441098849e-01f }, { 1.0722062598470823e-01f, 9.9381234811207320e-01f, -2.8995760093759003e-02f }, { 7.0447896673241328e-01f, 7.0073530512598470e-01f, -1.1260291995159051e-01f }, { -7.0725686424807588e-01f, -7.0694739304708909e-01f, 3.6209719556009141e-03f }, { -9.9101126459729949e-01f, 1.3288439421638204e-01f, 1.5440570423605915e-02f }, { 7.8063036911165851e-01f, 6.2494076774885043e-01f, -8.0785905994249230e-03f }, { -3.8070899496547533e-01f, 1.4900286434480889e-01f, 9.1261098369974714e-01f }, { 5.8485421027860585e-01f, -4.2988337206982247e-01f, 6.8785597266961851e-01f }, { -8.7751898398970951e-01f, -3.4162109679724245e-01f, -3.3653448405879177e-01f }, { -6.1027367884670621e-02f, -8.9846616617208663e-01f, 4.3478064424845492e-01f }, { 6.8264160388123141e-01f, -1.0021590079866516e-01f, 7.2384888884184395e-01f }, { -7.9619696405160056e-01f, -4.5615770161040597e-01f, -3.9748024566829238e-01f }, { -7.6080095088988930e-01f, 8.9900970273076829e-03f, -6.4892302415654790e-01f }, { -5.4342655305757870e-01f, -7.0756274037651237e-02f, -8.3646944422152536e-01f }, { -6.8203242638882255e-01f, -5.5202240192684171e-01f, 4.7969056393168263e-01f }, { 7.2230882125433105e-02f, -9.9667190260731797e-01f, 3.7786481980871152e-02f }, { -8.4067860795608640e-01f, -5.3102562772696182e-01f, -1.0616619434736754e-01f }, { -8.8082609494355507e-02f, -8.0932456145892373e-01f, 5.8071956065211516e-01f }, { -7.5206943355342426e-01f, 3.4598298745111394e-01f, -5.6096999876021358e-01f }, { -5.3980609180842432e-01f, -7.5893339951743577e-01f, -3.6418330321889159e-01f }, { 4.5417332838346985e-01f, 7.8349804768694020e-01f, 4.2409597623160028e-01f }, { 7.1129420572465873e-01f, -7.0126332750158682e-01f, -4.7857062215821963e-02f }, { 1.9462253495579493e-02f, 9.7618721080189097e-01f, -2.1605497021753142e-01f }, { -5.8930265042292251e-01f, 6.5667773848020838e-01f, -4.7063439524649886e-01f }, { -3.5242591301364168e-01f, 9.1434823697552647e-01f, 1.9940731525259459e-01f }, { 7.8582865515702927e-01f, -1.4151600654536431e-01f, 6.0203533503071671e-01f }, { 1.2974824703688570e-01f, 4.5400266427148800e-01f, -8.8150267908001612e-01f }, { 5.8273125151171234e-01f, 4.2382285412133647e-01f, -6.9339633459951155e-01f }, { -3.2051781630496645e-01f, -9.4702193779294830e-01f, -2.0439637227330578e-02f }, { 5.3094108059431455e-01f, 3.2764466147895938e-01f, 7.8150530691843656e-01f }, { 3.1917096245168158e-01f, 8.7478271234741856e-01f, -3.6453409018329253e-01f }, { -7.1000033525285988e-01f, -5.3325119001588894e-01f, -4.5993770478996909e-01f }, { -9.1912812397988097e-02f, -4.5914486882424682e-01f, -8.8359381185557062e-01f }, { 3.1785916647666129e-01f, -3.2462752196188571e-01f, -8.9083248833416917e-01f }, { -8.0923316720776661e-01f, -5.6455085111685288e-01f, 1.6255466032729957e-01f }, { 4.3171555503883979e-01f, -6.1086703646814322e-01f, 6.6367397364529412e-01f }, { -3.6955336446936982e-01f, -8.7489150238980506e-01f, -3.1304180208955956e-01f }, { 1.9322080287865162e-01f, -9.2740414361579604e-01f, -3.2029248467483756e-01f }, { -3.5002975351856846e-01f, -7.6093640156036979e-02f, -9.3364282762710371e-01f }, { 9.8749128642831929e-01f, 7.5544427809446551e-03f, -1.5749250655955854e-01f }, { 1.8041099752707571e-01f, 6.6668980909373154e-01f, 7.2317119025985077e-01f }, { -2.7483422070388519e-01f, 1.4809137110078530e-01f, -9.5001847189177202e-01f }, { -7.0366264803123213e-01f, -2.1912217484572422e-01f, -6.7590261891529479e-01f }, { -6.0656603549644994e-01f, 4.6910841079676796e-01f, 6.4188390188713274e-01f }, { -9.0714899916397224e-02f, -1.6396777106198576e-01f, -9.8228579190891396e-01f }, { -8.5842358232265059e-01f, -5.0944441732371359e-01f, -5.9794138258271748e-02f }, { 8.7044297306949375e-02f, -7.1877380575939642e-01f, 6.8977351823659683e-01f }, { 2.4007127240427484e-01f, 4.9571734038260656e-01f, 8.3464369799944427e-01f }, { -9.9945241287338582e-01f, -1.5747020156100775e-02f, 2.9101645276005235e-02f }, { -5.7034268426401025e-01f, 4.8276616486837509e-01f, 6.6456455861323549e-01f }, { 9.8161027609640517e-01f, -1.6823502675519553e-01f, 9.0212203357516743e-02f }, { 7.2712843695231022e-01f, -3.5373912553507891e-01f, 5.8834757349798583e-01f }, { 7.4146715712796429e-01f, -5.8765808132559449e-01f, -3.2385866416277287e-01f }, { -6.0216353765842667e-01f, 2.4354440847575770e-01f, -7.6031914023972980e-01f }, { 6.1018654953814477e-02f, -9.2296810617143632e-01f, 3.8000868245072994e-01f }, { 7.3160160319200618e-01f, -4.7881472230102112e-01f, 4.8527884346495315e-01f }, { -7.0649460331499470e-01f, 6.7911224697094452e-01f, -1.9917814011799317e-01f }, { 6.9769119209451402e-01f, 6.4218570752359594e-01f, -3.1752876645455996e-01f }, { -5.4096914069654334e-01f, -2.5694750234314001e-02f, -8.4064984900042639e-01f }, { -5.8315290187809055e-01f, 7.7001201154821231e-01f, -2.5887100089163700e-01f }, { 5.5475117265729346e-01f, -7.8682304261780411e-01f, -2.7048222869722727e-01f }, { 3.6697483009929893e-01f, 7.6954796458383501e-01f, -5.2261401079426417e-01f }, { 6.9218827828921220e-02f, 5.6145831938892843e-01f, 8.2460494144951024e-01f }, { -9.2445440612640761e-01f, -1.6787458357838611e-01f, 3.4234803224475302e-01f }, { 8.4133824918320843e-01f, 5.2672215239885622e-01f, -1.2130014276021914e-01f }, { 6.2694187586854078e-02f, 9.7177799966422251e-01f, 2.2741362802485351e-01f }, { -6.5333429611308391e-01f, -7.1510957223486238e-01f, 2.4854093670961627e-01f }, { 1.7846426012315331e-01f, 1.7450422213125497e-01f, 9.6834848289087594e-01f }, { -6.3208861800656424e-01f, -5.2362927125232950e-01f, 5.7120606200766644e-01f }, { 6.9289176638463112e-01f, -5.8714833363813546e-01f, 4.1851861891957270e-01f }, { -6.8524147485577858e-01f, 1.0538423939752840e-01f, 7.2065129100285508e-01f }, { -7.5808377766906437e-02f, 1.7437216323804292e-01f, -9.8175732161671980e-01f }, { 4.5864846629839376e-02f, -9.9255415532226632e-01f, 1.1283910933769246e-01f }, { 3.0097783531050970e-01f, -1.3797241998842624e-01f, 9.4359734737563616e-01f }, { -5.8061876542634905e-01f, -8.1132862124889493e-01f, 6.8027329634122252e-02f }, { -5.3356311908781595e-01f, 3.2033792916081300e-02f, -8.4515337901512921e-01f }, { -8.9691262835379915e-01f, 4.2576810789158370e-01f, 1.1945398863956183e-01f }, { 3.2515961170366947e-01f, 7.6308724952403961e-01f, -5.5854192011930037e-01f }, { -9.3064589477596249e-01f, 3.4759419778325545e-01f, -1.1435249102692624e-01f }, { -6.1563486365765407e-01f, 2.1129290479122396e-02f, -7.8774822610594974e-01f }, { 4.3609462429298762e-01f, -5.0547651182456499e-01f, -7.4452332042483960e-01f }, { -1.7897001996529241e-01f, -7.6864218940586682e-01f, 6.1413265392664018e-01f }, { -6.1999958863281868e-01f, -5.6308230330379949e-01f, -5.4638706957725836e-01f }, { 8.6160659211748580e-01f, 5.0739365171362560e-01f, 1.3629476160314135e-02f }, { 7.8768296587326547e-01f, 6.1519896930776230e-01f, 3.2951076397637918e-02f }, { -2.1520892741466507e-01f, -1.5493269825139080e-01f, -9.6419965597047008e-01f }, { -6.8822231901289710e-01f, 1.9468786505230623e-01f, 6.9888960130616129e-01f }, { -9.7444944328582728e-01f, -2.2256694827931570e-01f, -3.0203245083496741e-02f }, { 2.7981224037604047e-01f, 3.3858813839768138e-02f, 9.5945749820463899e-01f }, { -8.6876081118407511e-01f, -4.6537535517443940e-01f, 1.6935297974069488e-01f }, { -3.9440875475419218e-01f, -5.0394389202811085e-01f, 7.6842845331286846e-01f }, { -8.7056629017410880e-01f, 1.4345998251999301e-01f, -4.7067352573503940e-01f }, { 3.2611344411705878e-01f, 5.5720149747343617e-01f, -7.6365994577394869e-01f }, { 1.5712836515970547e-03f, -7.0463845889640786e-01f, -7.0956477738947943e-01f }, { 1.1073320459758458e-01f, -4.5945987546596628e-01f, -8.8126884674107719e-01f }, { -1.6525531498987900e-01f, 7.6569779296378193e-01f, -6.2160885669204324e-01f }, { -6.9513641837924722e-01f, -4.6125551296925894e-02f, 7.1739653843632856e-01f }, { 6.5070130953004679e-02f, 8.4965201759713216e-01f, 5.2331379405752465e-01f }, { 1.5013603701545622e-01f, 4.6700199851199015e-01f, 8.7141741075967760e-01f }, { 1.8124456315426726e-01f, -5.3886836562436280e-01f, -8.2266110449950591e-01f }, { 4.7728565613011087e-01f, 2.0368591972219174e-01f, -8.5481603199716272e-01f }, { 7.3529337358138769e-02f, 2.6291684728710796e-01f, 9.6201256122790857e-01f }, { 9.9112580968516450e-01f, -1.2827692390728596e-01f, 3.4851975106317663e-02f }, { -7.3102872325079360e-01f, -2.9830462745221009e-01f, 6.1368669125451347e-01f }, { -8.2646838334922623e-01f, -4.2274528647730314e-01f, -3.7180160581328753e-01f }, { 6.5263135650255222e-01f, -1.7259659483812961e-01f, -7.3775519514261723e-01f }, { 8.1658982227474397e-01f, 5.7631963645207362e-01f, 3.2198428487299736e-02f }, { 7.2558936651526063e-01f, -6.7321539993583934e-01f, -1.4248191635857083e-01f }, { 4.0713760987890907e-01f, -3.5403688406593509e-01f, 8.4196012455636693e-01f }, { 2.1615237284921607e-01f, 7.0708876811389809e-01f, -6.7327826767156496e-01f }, { 3.7971333611210761e-01f, 7.1519014513876955e-01f, -5.8678858090030972e-01f }, { -3.7803333633523795e-01f, -5.8466692944483134e-01f, -7.1781291311371753e-01f }, { 1.7669972448564908e-01f, 3.5106775462996448e-01f, 9.1952631230746773e-01f }, { 6.3551606669898852e-01f, 5.8604034273958527e-01f, 5.0266892250179551e-01f }, { -5.3190868945353043e-01f, 5.8337830945479685e-01f, -6.1379385313107460e-01f }, { -7.9165985220082213e-01f, 5.4314331965679286e-01f, 2.7976778357339743e-01f }, { 7.1965310892484924e-01f, 4.5132736667273204e-01f, -5.2763909152663835e-01f }, { -4.1225107400875155e-01f, -9.0839383576122756e-01f, -6.9783172252589690e-02f }, { -3.8384952133443051e-01f, -1.4637473702921378e-01f, 9.1172034162398563e-01f }, { 9.8861639728118200e-01f, -8.3974284565753787e-02f, 1.2484365646057405e-01f }, { 1.9149777919795435e-01f, 6.8582845980964646e-01f, -7.0211674547569336e-01f }, { 8.1182889147392479e-01f, -5.2523657543099811e-01f, 2.5506938428148473e-01f }, { -3.1468097355341712e-01f, -6.7039576747609619e-01f, -6.7197127902434162e-01f }, { -5.8642314792353281e-02f, -5.4779799094828330e-01f, -8.3455283836843974e-01f }, { -6.3707311592189875e-01f, 5.4386223060694594e-01f, -5.4621581731839308e-01f }, { -9.8736493709015616e-01f, 1.4627272643554470e-01f, 6.0948917185330777e-02f }, { 7.5601159886066971e-01f, 5.8807345002362521e-01f, 2.8743013023245256e-01f }, { 7.4999844096036428e-01f, -6.5933468147733298e-01f, -5.2726808723897983e-02f }, { -7.9277423989568707e-01f, 2.7413979902400348e-01f, -5.4438623710458978e-01f }, { -3.5893288447090038e-01f, -7.5548386389583611e-01f, -5.4809790716478468e-01f }, { -1.7613222086992980e-02f, -5.9715534740726828e-01f, 8.0193220752792993e-01f }, { -2.1131698653431699e-01f, 9.0395223965850513e-01f, -3.7177342511054745e-01f }, { -7.3441470520607599e-01f, -4.4496855537532459e-01f, -5.1248221969573637e-01f }, { -4.1796182616474670e-01f, 4.3127512799441725e-01f, 7.9956843099413888e-01f }, { 1.7546021867560727e-01f, -6.7016320959496345e-01f, -7.2117611175612661e-01f }, { 8.4393267394501059e-01f, 4.2179427228888156e-01f, 3.3146226589510491e-01f }, { 9.4013773278256396e-01f, -4.8451753138539624e-02f, -3.3733287864698608e-01f }, { 1.4926006134266920e-01f, -9.2568411335789136e-01f, -3.4760661150904060e-01f }, { 7.3273367606299045e-01f, 4.4899498359979688e-02f, 6.7903269067861438e-01f }, { 7.6549786383965035e-01f, -6.3778735435648226e-01f, 8.5090017510229321e-02f }, { 5.8923979005420446e-01f, -7.4357986239450147e-01f, 3.1604660741455737e-01f }, { -2.1765819094178296e-01f, -6.6341129273498733e-01f, 7.1589829486292478e-01f }, { 7.4055783264340624e-01f, -6.4750992482432246e-01f, 1.7973590004364962e-01f }, { -9.4201254066075324e-01f, 2.0606823730255253e-01f, -2.6485515817686378e-01f }, { -6.0815578126443259e-01f, 5.7753465385696856e-01f, -5.4461019941693989e-01f }, { 8.4343579613270259e-01f, 4.7607665234815943e-01f, 2.4893187600418662e-01f }, { 8.7809884327186416e-01f, -2.9835819500078565e-02f, -4.7754816020938973e-01f }, { 2.0740215869859119e-01f, -2.6625510312055689e-01f, 9.4132489854960599e-01f }, { 7.4247318059926759e-01f, -1.7779565396153062e-02f, -6.6963980104615284e-01f }, { -3.2452290048981686e-01f, -7.2932852706975804e-01f, 6.0229958215155144e-01f }, { -3.2707130641857945e-01f, -3.8374319187662326e-01f, 8.6357716690865838e-01f }, { -8.6057777127360369e-01f, 4.9935023054224814e-01f, -1.0027585375931977e-01f }, { -9.5590336470224491e-01f, 1.7118738089700986e-01f, 2.3862866125540938e-01f }, { -7.7111488317118915e-01f, 6.0916087676649811e-01f, -1.8521572063125374e-01f }, { -3.2173547160474275e-01f, 5.2411924367348400e-02f, 9.4537784853220730e-01f }, { 9.4550556258648188e-01f, 1.3813647611604069e-01f, 2.9485173407030013e-01f }, { -7.6856740611605689e-01f, 3.2218732920539217e-01f, 5.5272006219743119e-01f }, { 7.7073674877270792e-01f, 6.0068108424099731e-01f, -2.1247846744161042e-01f }, { 7.1024708942892467e-01f, 1.7569388449003964e-01f, -6.8167494519788674e-01f }, { -9.5770466742193583e-01f, -2.8535415040111606e-01f, -3.7078010290419412e-02f }, { -5.4972941963643096e-01f, -4.2231832002558456e-01f, 7.2072519156538484e-01f }, { -1.2892556120924517e-01f, -9.3855424462569659e-01f, 3.2014704365645696e-01f }, { -2.5705547583570781e-02f, 9.9666187840491527e-01f, -7.7487579377696722e-02f }, { -1.4458260136360973e-01f, -9.8893713368594893e-01f, 3.3154441632320307e-02f }, { -1.6051799741263351e-01f, -7.2524729481155370e-01f, -6.6951499899192779e-01f }, { -9.0052613701137063e-01f, -4.6147440296273615e-02f, 4.3234603075948308e-01f }, { 6.0675413262385347e-01f, -5.4358077067125410e-01f, -5.7997359276118821e-01f }, { 2.0636730022807628e-01f, -9.1562845091154943e-01f, 3.4501750285730615e-01f }, { -6.7634579659161909e-01f, 2.8012908186987866e-02f, -7.3605138435285600e-01f }, { 2.7440987099497771e-02f, -9.7768280103562999e-01f, 2.0828666012524646e-01f }, { -3.6816203486106558e-01f, -7.0555986212035382e-01f, 6.0550970021269412e-01f }, { 9.8066883563971163e-01f, -1.3725214526537569e-01f, 1.3946498996201298e-01f }, { 6.9415373697871563e-01f, 6.1558591017141306e-01f, 3.7310129541039816e-01f }, { 6.8927991800554766e-01f, -7.1694774510012271e-01f, -1.0430304612097874e-01f }, { -7.9856673788459820e-01f, -3.5312005770714000e-01f, -4.8743962701985710e-01f }, { 1.9409007048955923e-01f, 2.2529681869818891e-01f, 9.5476195358939253e-01f }, { 3.4758804314738373e-01f, -6.6164263812636959e-02f, 9.3531002478060943e-01f }, { 4.8760929346487630e-01f, -7.2445263673272031e-01f, 4.8724280811284765e-01f }, { 8.2664906117480008e-01f, 3.3007105784958318e-01f, 4.5574601087544203e-01f }, { -2.2660055565715684e-01f, 9.2594945255713601e-01f, 3.0210891990308381e-01f }, { -4.5516255354461810e-01f, 3.3764293554764785e-01f, -8.2390794262800360e-01f }, { -7.2056935346287398e-01f, -6.9072104500045872e-01f, 6.0697980555946718e-02f }, { 6.2290579867695484e-01f, -3.9553991504111635e-01f, 6.7493447206665291e-01f }, { -7.3669381977123183e-01f, 3.9707188609832061e-01f, -5.4737202447804556e-01f }, { -1.6394627287007338e-01f, -7.0591691189847794e-01f, 6.8905945542291780e-01f }, { 8.0278681068968538e-01f, -1.7420886193109678e-01f, -5.7024960237369327e-01f }, { -9.0535046494959570e-01f, 4.2167664894100693e-01f, -5.0292537750979555e-02f }, { -5.9503285353678192e-01f, -6.9959246383579754e-01f, -3.9560875591426548e-01f }, { 7.7119635145498266e-01f, -5.6152622717392098e-01f, -2.9990745855737716e-01f }, { 3.5936298675198886e-01f, -3.5965969868423586e-01f, 8.6110576870385358e-01f }, { 1.8697348491903962e-01f, 2.7089636028992675e-01f, -9.4427542481995153e-01f }, { 2.4900190528956131e-01f, 8.6870029821005890e-01f, 4.2820303951738020e-01f }, { -7.0700739622812414e-01f, -6.7284797172373356e-01f, -2.1775249396042781e-01f }, { 1.2629225486756360e-01f, -9.7226489985212794e-01f, 1.9685332325362975e-01f }, { -3.7224928203360035e-03f, 9.4092642025323148e-01f, -3.3859062998943373e-01f }, { -4.8067835144357801e-01f, 5.1717338423125947e-01f, 7.0815253519017352e-01f }, { -3.4026756432123889e-01f, 5.9852436566435174e-01f, 7.2524931463392439e-01f }, { -9.6883536694704042e-01f, 2.4663584790732443e-01f, 2.2995440409538385e-02f }, { 1.6603733091241171e-01f, 3.4896995279004833e-01f, -9.2230774516600134e-01f }, { -2.3781515007117539e-02f, -9.9676695347364164e-01f, 7.6746856657724738e-02f }, { 6.3161327806345269e-01f, 4.3915682433438724e-01f, 6.3890997066447142e-01f }, { 7.4948134234168440e-01f, -6.4936353181985507e-01f, 1.2885930709169174e-01f }, { 7.4385626593290677e-01f, 3.7852358513392881e-01f, -5.5081553276002504e-01f }, { 2.2685329347689112e-01f, -9.1128676910621220e-01f, -3.4364808698819899e-01f }, { 2.8325229344906355e-01f, -4.0582598344460413e-01f, -8.6894960119506670e-01f }, { -9.4041219048644353e-01f, 2.4517349676987724e-01f, -2.3561593423646049e-01f }, { -6.5940622297081952e-01f, -5.2036754597692647e-01f, -5.4258736642250460e-01f }, { -5.7319352967359050e-01f, 6.9383185708727890e-01f, -4.3594326652805238e-01f }, { 8.4469133058667753e-02f, -9.9477351009128934e-01f, -5.7364005970403489e-02f }, { -4.9582617705614773e-01f, -2.9808888416417639e-01f, -8.1565888659637731e-01f }, { -3.6335021180512217e-01f, -3.4669973452962966e-01f, -8.6474037586911445e-01f }, { 4.4285620033562184e-01f, -6.4564407845893268e-01f, 6.2211101081335241e-01f }, { -5.1657182062960405e-01f, 1.6770381308358115e-01f, -8.3966004145049278e-01f }, { 6.8383043255628750e-01f, -6.2312032169679465e-01f, -3.7960111195617408e-01f }, { -8.0994061865898881e-01f, 1.0098954847179663e-01f, 5.7775194101427052e-01f }, { -7.6510264380222381e-01f, -6.3536066871025887e-01f, -1.0456942719026570e-01f }, { -5.1036163792919420e-01f, -2.0838541452038745e-01f, 8.3432998120971080e-01f }, { -1.0087122230036123e-01f, -9.8735292233281469e-01f, 1.2230782179599942e-01f }, { -9.5417317971417315e-01f, -2.4982872285654020e-01f, -1.6473965020605749e-01f }, { 2.0715043868385494e-01f, -9.6257708302728995e-01f, -1.7473996389996255e-01f }, { -4.4065427770846338e-01f, 2.1252592434158193e-01f, -8.7215625837345723e-01f }, { 7.3980118623200575e-01f, -5.1683599377052591e-01f, 4.3078389059126859e-01f }, { 7.7144976993990677e-01f, 4.7123553626075776e-01f, 4.2755388177947939e-01f }, { 8.6987423328091040e-01f, -2.3257701750006347e-03f, 4.9326809046100012e-01f }, { -1.1086919396071707e-01f, -9.1015504827750504e-01f, 3.9915637277321947e-01f }, { -8.2193928025638763e-01f, -3.1875944473181272e-01f, -4.7202567299446530e-01f }, { 1.7550038783306710e-01f, 1.7878679320434629e-01f, -9.6810892798597270e-01f }, { 5.1807736884366240e-01f, -7.9717044574472584e-01f, -3.1002438665882848e-01f }, { -3.2907591554231896e-02f, -5.6220653661913211e-01f, 8.2634187876497001e-01f }, { -7.3489660463294815e-01f, 4.5233718346865937e-01f, 5.0529006812978683e-01f }, { -1.0590038139347313e-01f, 9.0005827011237161e-01f, -4.2270583107291310e-01f }, { -3.1792638882911056e-01f, 6.5728919514620909e-01f, -6.8329622070528817e-01f }, { -6.5579396698001591e-01f, -3.2968995909176285e-01f, -6.7914564251468601e-01f }, { -2.0938205078226199e-01f, -5.1981599885828356e-01f, -8.2822127728112560e-01f }, { 6.3297730474813130e-01f, -7.6470932798783386e-01f, -1.2066223668649102e-01f }, { 2.4985915441081114e-01f, 8.3984838649376070e-01f, -4.8189738602833398e-01f }, { -8.3877143308364432e-01f, 1.2409119965023217e-02f, -5.4434226070047431e-01f }, { -6.5577176056227815e-01f, 3.5052248396846875e-01f, -6.6865341267477629e-01f }, { 6.7229307662799456e-02f, 9.9489304689179325e-01f, -7.5286422664014890e-02f }, { 6.7360205183041741e-02f, -8.7261854975307140e-01f, 4.8373491644137590e-01f }, { 2.3267218345494672e-01f, -9.4772242250926386e-01f, -2.1837093423686180e-01f }, { -5.6843208868088180e-01f, 4.7393966350350986e-01f, -6.7250736495303154e-01f }, { -2.8639649143838036e-01f, 6.1335276169983965e-01f, -7.3605396501001563e-01f }, { -5.9392693203359681e-01f, 8.8708177443800107e-02f, 7.9961344327103367e-01f }, { -1.3431478383944043e-01f, 9.4373685777743155e-01f, -3.0219245873208717e-01f }, { 3.5658690281525884e-01f, 6.6307981246377468e-01f, -6.5815723276708471e-01f }, { -5.7772429325894481e-01f, 3.7061267031026190e-01f, 7.2724197457514084e-01f }, { -1.9309747733253346e-01f, 7.6885946797804638e-01f, 6.0956417442983557e-01f }, { 2.2203710202613920e-02f, 8.7474641987169977e-01f, 4.8407199482606122e-01f }, { -5.8301060598897236e-01f, -8.1228868022560508e-01f, -1.6903646994541870e-02f }, { 9.3778420830304432e-01f, -2.9810941332341162e-01f, -1.7802122442395357e-01f }, { 2.3903080302337193e-01f, 6.3808349757567528e-01f, 7.3192467189431121e-01f }, { 6.1604817252829336e-01f, -4.5317293981337547e-01f, -6.4429724176458558e-01f }, { -4.0936960543038053e-01f, -2.1560110866655843e-01f, 8.8652844742372783e-01f }, { 2.2849479840891676e-01f, 7.1483808944112293e-01f, 6.6090591840611745e-01f }, { -2.3900398549441979e-01f, -8.9961855742717611e-01f, 3.6546346746347969e-01f }, { -5.5077271391498195e-01f, -8.3295059983292796e-01f, -5.3317125247811396e-02f }, { -2.5574343904251090e-01f, 5.3278437557679337e-01f, 8.0668215706556690e-01f }, { -2.3637946833877474e-01f, -5.7734672476450505e-02f, 9.6994404711917026e-01f }, { 3.3906668410460389e-01f, 8.3988747567509056e-02f, -9.3700569582705850e-01f }, { 7.3728203221199262e-01f, 1.2943983557149849e-01f, 6.6306902653085653e-01f }, { 4.1120168470740875e-01f, -8.4177051363630029e-01f, 3.4976503093686745e-01f }, { 7.6834859776108566e-01f, 6.3777997503635631e-01f, -5.3638938852273867e-02f }, { -3.6828441981406046e-01f, -9.1584176993730448e-01f, 1.6000137049515012e-01f }, { 1.1889382938551794e-01f, -7.8841514824558534e-01f, 6.0354437397008265e-01f }, { 2.6968930846497424e-01f, -9.2354427359569924e-01f, 2.7264198430960013e-01f }, { -2.2820354801826584e-01f, -7.6684241535924569e-01f, 5.9989653331043102e-01f }, { 4.5331750082462047e-01f, -1.4228415423707991e-01f, -8.7991957751783145e-01f }, { -2.8117566029854119e-01f, 9.3148807502502406e-01f, -2.3080341016079975e-01f }, { 9.7491311606040154e-01f, -1.0159083516841116e-01f, -1.9804978753632310e-01f }, { -8.9586868509459205e-01f, -2.7857387985101512e-01f, 3.4614432326941141e-01f }, { -5.0524078816811080e-01f, -8.0893672371709713e-01f, 3.0058796215603040e-01f }, { 5.7602897491378346e-01f, -2.5796264077998077e-01f, 7.7565836295471891e-01f }, { 1.5444009806750078e-01f, 9.5458642897423296e-01f, 2.5478030875073987e-01f }, { 9.7658723690510230e-01f, -1.1888034755093449e-01f, 1.7928979803721881e-01f }, { 2.7299287130246835e-01f, 6.0846817779296458e-01f, 7.4514519983110894e-01f }, { 7.6322428867807746e-01f, -3.3605609062843017e-01f, 5.5186500987413489e-01f }, { 8.0619806166720209e-01f, -2.4446435904560154e-01f, 5.3877811993479230e-01f }, { 2.6806749222197990e-01f, 5.8857467552901199e-01f, -7.6270549423728229e-01f }, { 7.7716299582816462e-01f, 2.3857149265327071e-01f, -5.8232406854652907e-01f }, { -5.5877298367721290e-02f, 6.1876824141650788e-01f, -7.8358381232733931e-01f }, { -6.6295325423762530e-01f, -1.9379192357156597e-01f, 7.2314429614992803e-01f }, { 1.8879273289939583e-01f, -9.5433035154737478e-01f, -2.3154024298130430e-01f }, { -8.0595095555021246e-01f, -5.8859345008843766e-01f, -6.3251938789963102e-02f }, { -2.4874988583472174e-01f, 5.3453929478938633e-01f, -8.0770739542440650e-01f }, { -3.0178859051156992e-01f, 1.9067193402092988e-01f, -9.3411340864680781e-01f }, { 2.2614929504624406e-01f, -3.3629488005468106e-01f, 9.1420033362447128e-01f }, { -4.9193553190449751e-01f, -5.1525250168366676e-01f, -7.0179362490589936e-01f }, { -5.8312264250159160e-02f, 4.3472180233316288e-01f, 8.9867493256139397e-01f }, { -8.2526511195491981e-01f, -3.2182514757161600e-02f, -5.6382779350963075e-01f }, { 3.9218547328195807e-01f, -3.2015324050615346e-01f, -8.6237605320417821e-01f }, { 4.3841125139388987e-01f, 8.3283271761769206e-01f, 3.3791306443636254e-01f }, { 2.0596635784180140e-01f, -5.7179051150982951e-01f, -7.9412434189156467e-01f }, { 1.7127001183797452e-01f, 4.4438762223419015e-01f, -8.7931008424222157e-01f }, { 7.3766030685483686e-01f, 5.1505179274803159e-01f, 4.3655345890035790e-01f }, { 5.6334889606457793e-02f, 1.4011314614787954e-02f, -9.9831360968174410e-01f }, { 7.3843176657196175e-01f, 9.8346826393159920e-02f, -6.6711800144787392e-01f }, { 8.7805209983409804e-01f, -1.8248228362798763e-01f, -4.4240787305251006e-01f }, { 7.0568489416318247e-01f, -6.3506491269386256e-01f, -3.1416776858079287e-01f }, { 8.6488691679358953e-01f, 2.4879278606426450e-01f, 4.3597336015135107e-01f }, { -3.8697432486161187e-01f, -9.1374636534278542e-01f, 1.2376773295471082e-01f }, { 9.9293912039368371e-01f, -1.1790902136405110e-01f, -1.3014064422357325e-02f }, { 1.8102287933322059e-01f, 9.7309729553099178e-01f, 1.4252147412997113e-01f }, { 8.5226970479445899e-02f, 1.0840841347485350e-01f, -9.9044635361576294e-01f }, { -6.5966754696088292e-01f, 6.9373884515251627e-01f, -2.8907636052272517e-01f }, { -6.6536399971676527e-02f, -9.9453241718103846e-01f, 8.0487133473928898e-02f }, { -4.4467154491989164e-01f, -3.8287683907933784e-01f, -8.0973609480816133e-01f }, { -8.3686247845702422e-01f, 3.0639994556375999e-01f, -4.5363009766691142e-01f }, { 8.3872590778917688e-01f, -5.0810566631741017e-01f, 1.9587619421298172e-01f }, { 1.4846916789199915e-01f, -1.0490035638097910e-02f, -9.8886139844660170e-01f }, { -3.4360779380428530e-01f, -2.8859418751904776e-02f, -9.3866970654552073e-01f }, { 6.3512005439591512e-01f, 7.4096397287283067e-01f, -2.1816257105342537e-01f }, { -7.8085810302136238e-01f, 6.9548909633703193e-02f, -6.2082491260792882e-01f }, { -8.4910322921017145e-01f, -3.8147304005945970e-01f, -3.6537929039924100e-01f }, { -4.9579128336516221e-01f, -7.2330080130450236e-01f, -4.8065263358416160e-01f }, { 2.6404643082135060e-01f, 8.9370287085780897e-01f, -3.6273221664337485e-01f }, { -6.1105460201211703e-01f, 7.7502739057146475e-01f, 1.6107394955050802e-01f }, { -5.4624828183801022e-01f, 8.3143800957393987e-01f, 1.0160536809020861e-01f }, { -5.7002030149152938e-01f, -5.4683112623307106e-01f, 6.1323125757757735e-01f }, { -8.6423308383258490e-01f, -4.5945494799250802e-01f, -2.0494469394063852e-01f }, { -3.2954084340277612e-01f, -8.2769383411068032e-01f, 4.5423094291841071e-01f }, { 5.2313289466095758e-01f, 8.0666506941440241e-01f, 2.7499716418593273e-01f }, { -5.5742221100249512e-01f, -8.2181503611561402e-01f, 1.1790048810493495e-01f }, { 9.7724226316928550e-02f, -6.3843008963800185e-01f, 7.6345071631086348e-01f }, { -7.8371989760413585e-01f, 6.0749391352255488e-01f, -1.2936099540593135e-01f }, { -7.7714106126218885e-01f, 6.2085346447325462e-01f, 1.0292106952337800e-01f }, { -2.8384465278327947e-01f, -7.9770087666538347e-01f, 5.3207661521027039e-01f }, { 1.0306397286933119e-01f, 9.8970094409795106e-01f, 9.9347162757746896e-02f }, { 2.1263461016068896e-01f, -9.7928045087696855e-02f, 9.7221223019828029e-01f }, { 3.9996836869293406e-01f, 4.8026716601695729e-01f, -7.8062074869372622e-01f }, { -9.1750858386752965e-01f, -1.5233290597519267e-02f, -3.9742413790177877e-01f }, { 9.5974280309283722e-01f, 1.7582641483831504e-01f, -2.1904068972820590e-01f }, { -4.2326957415503225e-01f, 9.0565781364677433e-01f, -2.5035817844883460e-02f }, { -3.7371215313932998e-01f, 7.4670860627105007e-01f, -5.5024129608446504e-01f }, { 8.8124220155352018e-01f, -2.9135227538105324e-01f, -3.7219085672728153e-01f }, { 2.5560437087610405e-01f, 7.6962619297831791e-01f, -5.8509993049968145e-01f }, { -2.5883217683392690e-01f, 4.7093554100910970e-02f, -9.6477360110937704e-01f }, { -2.1567674811106347e-01f, 9.3085703588785665e-02f, -9.7201779413322342e-01f }, { 4.0797792177398601e-01f, -7.2899665945311076e-01f, 5.4965251373134327e-01f }, { 2.3239922972837868e-01f, -3.7111457239421858e-02f, -9.7191220681871404e-01f }, { 1.4846497309341974e-01f, -5.6471922271388453e-01f, 8.1181916167444346e-01f }, { -7.5904234675350646e-01f, -1.5771351712977935e-01f, -6.3164955659723576e-01f }, { 9.3178327333884226e-01f, 3.0706369580942466e-01f, 1.9362804094915947e-01f }, { -9.9738173203391134e-01f, -6.2899439380704164e-02f, 3.5683905764755448e-02f }, { -8.5854620425971118e-01f, 2.6841314501186342e-01f, 4.3686702637768721e-01f }, { -9.4845203179474469e-01f, 1.6720615349964091e-01f, -2.6922266920947652e-01f }, { -4.8509169460976803e-01f, -7.1658488708134482e-01f, 5.0119072959028266e-01f }, { -9.9960132040239835e-01f, -2.2642430741677818e-02f, -1.6867737841515136e-02f }, { -6.3682241647989801e-02f, -8.3553901147489951e-01f, 5.4572807551218638e-01f }, { 9.0909388527559032e-01f, -3.4331275257602561e-01f, -2.3597597689850644e-01f }, { 2.1232217692470820e-01f, -5.1760611203062323e-01f, 8.2885656538058183e-01f }, { -5.3138424255215277e-01f, 2.3872821396111685e-01f, 8.1279740810746315e-01f }, { 8.1803306136838272e-01f, 5.6242343380434745e-01f, 1.2042338483865325e-01f }, { 9.0679337232503499e-01f, -4.2132617063361139e-01f, 1.4492682519373228e-02f }, { -5.7846059153094376e-01f, 5.2469419130188433e-01f, -6.2456332718126528e-01f, } }; IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/AllRADecoder/Source/NoiseBurst.h0000664002537200253720000001140115257173642030553 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2018 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once class NoiseBurst { public: NoiseBurst() { originalNoise.setSize (1, L); // create noise juce::Random random; for (int i = 0; i < L; ++i) originalNoise.setSample (0, i, random.nextFloat() * 2.0f - 1.0f); juce::dsp::ProcessSpec spec; spec.sampleRate = 44100.0f; spec.maximumBlockSize = L; spec.numChannels = 1; juce::dsp::IIR::Filter filter; filter.coefficients = juce::dsp::IIR::Coefficients::makeHighPass (spec.sampleRate, 200.0f); juce::dsp::AudioBlock ab (originalNoise); juce::dsp::ProcessContextReplacing context (ab); filter.prepare (spec); filter.process (context); filter.coefficients = juce::dsp::IIR::Coefficients::makeFirstOrderLowPass (spec.sampleRate, 200.0f); filter.prepare (spec); filter.reset(); filter.process (context); // fade-in/-out originalNoise.applyGainRamp (0, 0, 1000, 0.0f, 1.0f); originalNoise.applyGainRamp (0, L - 10000, 10000, 1.0f, 0.0f); // level originalNoise.applyGain (juce::Decibels::decibelsToGain (-10.0f)); // copy buffer resampledNoise = originalNoise; resampledL = L; } ~NoiseBurst() {} void prepare (const juce::dsp::ProcessSpec spec) { if (sampleRate != spec.sampleRate) resampleNoise (spec.sampleRate); sampleRate = spec.sampleRate; activeChannel = -1; active = false; } void resampleNoise (double newSampleRate) { double factorReading = 44100.0 / newSampleRate; resampledL = juce::roundToInt (L / factorReading + 0.49); juce::MemoryAudioSource memorySource (originalNoise, false, false); juce::ResamplingAudioSource resamplingSource (&memorySource, false, 1); resamplingSource.setResamplingRatio (factorReading); resamplingSource.prepareToPlay (L, 44100.0); resampledNoise.setSize (1, resampledL); juce::AudioSourceChannelInfo info; info.startSample = 0; info.numSamples = resampledL; info.buffer = &resampledNoise; resamplingSource.getNextAudioBlock (info); } void setChannel (const int channel) { if (! active.get()) if (channel > 0 && channel < 65) { activeChannel = channel; active = true; currentPosition = 0; } } const bool isActive() { return active.get(); } void processBuffer (juce::AudioBuffer buffer) { if (active.get()) { if (activeChannel != -1) { if (buffer.getNumChannels() >= activeChannel) { const int bufferSize = buffer.getNumSamples(); const int copyL = juce::jmin (bufferSize, resampledL - currentPosition); juce::FloatVectorOperations::add ( buffer.getWritePointer (activeChannel - 1), resampledNoise.getReadPointer (0, currentPosition), copyL); currentPosition += copyL; if (currentPosition >= resampledL) { active = false; activeChannel = -1; } } else { active = false; activeChannel = -1; } } } } private: double sampleRate; const int L = 22050; int currentPosition; int resampledL; juce::Atomic active; int activeChannel; juce::AudioBuffer originalNoise; juce::AudioBuffer resampledNoise; }; ././@LongLink0000644000000000000000000000015200000000000011601 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/AllRADecoder/Source/AmbisonicNoiseBurst.hIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/AllRADecoder/Source/AmbisonicNoiseBu0000664002537200253720000001224215257173642031425 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2018 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once #include "../../resources/Conversions.h" class AmbisonicNoiseBurst { public: AmbisonicNoiseBurst() { originalNoise.setSize (1, L); // create noise juce::Random random; for (int i = 0; i < L; ++i) originalNoise.setSample (0, i, random.nextFloat() * 2.0f - 1.0f); juce::dsp::ProcessSpec spec; spec.sampleRate = 44100.0f; spec.maximumBlockSize = L; spec.numChannels = 1; juce::dsp::IIR::Filter filter; filter.coefficients = juce::dsp::IIR::Coefficients::makeHighPass (spec.sampleRate, 200.0f); juce::dsp::AudioBlock ab (originalNoise); juce::dsp::ProcessContextReplacing context (ab); filter.prepare (spec); filter.process (context); filter.coefficients = juce::dsp::IIR::Coefficients::makeFirstOrderLowPass (spec.sampleRate, 200.0f); filter.prepare (spec); filter.reset(); filter.process (context); // fade-in/-out originalNoise.applyGainRamp (0, 0, 1000, 0.0f, 1.0f); originalNoise.applyGainRamp (0, L - 10000, 10000, 1.0f, 0.0f); // level originalNoise.applyGain (juce::Decibels::decibelsToGain (-10.0f)); // copy buffer resampledNoise = originalNoise; resampledL = L; } ~AmbisonicNoiseBurst() {} void prepare (const juce::dsp::ProcessSpec spec) { if (sampleRate != spec.sampleRate) resampleNoise (spec.sampleRate); sampleRate = spec.sampleRate; active = false; } void resampleNoise (double newSampleRate) { double factorReading = 44100.0 / newSampleRate; resampledL = juce::roundToInt (L / factorReading + 0.49); juce::MemoryAudioSource memorySource (originalNoise, false, false); juce::ResamplingAudioSource resamplingSource (&memorySource, false, 1); resamplingSource.setResamplingRatio (factorReading); resamplingSource.prepareToPlay (L, 44100.0); resampledNoise.setSize (1, resampledL); juce::AudioSourceChannelInfo info; info.startSample = 0; info.numSamples = resampledL; info.buffer = &resampledNoise; resamplingSource.getNextAudioBlock (info); } void setOrder (int order) { ambisonicOrder = juce::jmin (order, 7); } void setNormalization (bool useSN3D) { this->useSN3D = useSN3D; } void play (float azimuthInDegrees, float elevationInDegrees) { if (! active.get()) { Conversions::sphericalToCartesian (juce::degreesToRadians (azimuthInDegrees), juce::degreesToRadians (elevationInDegrees), 1.0f, x, y, z); currentPosition = 0; active = true; } } const bool isActive() { return active.get(); } void processBuffer (juce::AudioBuffer buffer) { if (active.get()) { const int bufferSize = buffer.getNumSamples(); const int copyL = juce::jmin (bufferSize, resampledL - currentPosition); const int nCh = juce::jmin (buffer.getNumChannels(), juce::square (ambisonicOrder + 1)); float SH[64]; SHEval (ambisonicOrder, x, y, z, SH); if (useSN3D) juce::FloatVectorOperations::multiply (SH, n3d2sn3d, nCh); for (int ch = 0; ch < nCh; ++ch) buffer.addFrom (ch, 0, resampledNoise, 0, currentPosition, copyL, SH[ch]); currentPosition += copyL; if (currentPosition >= resampledL) { active = false; } } } private: double sampleRate; const int L = 22050; int currentPosition; int resampledL; juce::Atomic active; int ambisonicOrder = 0; float x = 1.0f; float y = 0.0f; float z = 0.0f; bool useSN3D = true; juce::AudioBuffer originalNoise; juce::AudioBuffer resampledNoise; }; ././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/AllRADecoder/Source/LoudspeakerVisualizer.hIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/AllRADecoder/Source/LoudspeakerVisua0000664002537200253720000005706615257173642031537 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Authors: Daniel Rudrich, Franz Zotter Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once #include "../JuceLibraryCode/JuceHeader.h" //============================================================================== /* */ class LoudspeakerVisualizer : public juce::Component, public juce::OpenGLRenderer { struct positionAndColour { float position[3]; float colourId; }; public: LoudspeakerVisualizer (std::vector& pts, std::vector& tris, std::vector>& norms, juce::BigInteger& imagFlags) : extPoints (pts), extTriangles (tris), extNormals (norms), imaginaryFlags (imagFlags) { juce::OpenGLPixelFormat pf; pf.multisamplingLevel = 4; openGLContext.setPixelFormat (pf); openGLContext.setMultisamplingEnabled (true); openGLContext.setComponentPaintingEnabled (true); openGLContext.setContinuousRepainting (false); openGLContext.setRenderer (this); openGLContext.attachTo (*this); } ~LoudspeakerVisualizer() override { openGLContext.detach(); openGLContext.setRenderer (nullptr); } void setActiveSpeakerIndex (int newIdx) { activePoint = newIdx; updateVerticesAndIndices(); } void initialise() { using namespace juce; using namespace juce::gl; const float alphaVal = 0.8f; PixelARGB colormapData[8]; colormapData[0] = juce::Colours::limegreen.getPixelARGB(); // selected colour colormapData[1] = juce::Colours::orange.getPixelARGB(); // imaginary colour colormapData[2] = juce::Colours::cornflowerblue.getPixelARGB(); // regular colour colormapData[3] = juce::Colours::cornflowerblue.withMultipliedAlpha (alphaVal).getPixelARGB(); colormapData[4] = juce::Colours::limegreen.withMultipliedAlpha (alphaVal).getPixelARGB(); colormapData[5] = juce::Colours::cornflowerblue.withMultipliedAlpha (alphaVal).getPixelARGB(); colormapData[6] = juce::Colours::orange.withMultipliedAlpha (alphaVal).getPixelARGB(); colormapData[7] = juce::Colours::red.withMultipliedAlpha (alphaVal).getPixelARGB(); texture.loadARGB (colormapData, 8, 1); openGLContext.extensions.glActiveTexture (GL_TEXTURE0); glEnable (GL_TEXTURE_2D); texture.bind(); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); // linear interpolation when too small glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); // linear interpolation when too bi } void newOpenGLContextCreated() override { createShaders(); initialise(); updateVerticesAndIndices(); } void resized() override { viewHasChanged = true; openGLContext.triggerRepaint(); } void updateVerticesAndIndices() { vertices.clear(); indices.clear(); normals.clear(); nPoints = (int) extPoints.size(); for (int i = 0; i < nPoints; ++i) { float col = extPoints[i].lspNum == activePoint ? 0.0f : imaginaryFlags[extPoints[i].lspNum] ? 0.2f : 0.4f; vertices.push_back ({ extPoints[i].x, extPoints[i].z, -extPoints[i].y, col }); indices.push_back (i); normals.push_back (1.0f); normals.push_back (1.0f); normals.push_back (1.0f); } //normals.insert(normals.end(), extNormals.begin(), extNormals.end()); nTriangles = (int) extTriangles.size(); for (int i = 0; i < nTriangles; ++i) { const float col = 0.4f + 0.6f * ((float) i / nTriangles); // defining a colour juce::Vector3D normal = extNormals[i]; Tri tr = extTriangles[i]; juce::Vector3D a { extPoints[tr.a].x, extPoints[tr.a].y, extPoints[tr.a].z }; juce::Vector3D b { extPoints[tr.b].x, extPoints[tr.b].y, extPoints[tr.b].z }; juce::Vector3D c { extPoints[tr.c].x, extPoints[tr.c].y, extPoints[tr.c].z }; // making sure that triangles are facing outward if (normal * ((b - a) ^ (c - a)) < 0.0f) // incorrect but no swap because of inverse y axis swap { vertices.push_back ({ { a.x, a.z, -a.y }, col }); vertices.push_back ({ b.x, b.z, -b.y, col }); } else // correct -> swap (inverse y axis) { vertices.push_back ({ b.x, b.z, -b.y, col }); vertices.push_back ({ a.x, a.z, -a.y, col }); } vertices.push_back ({ c.x, c.z, -c.y, col }); indices.push_back (nPoints + i * 3); indices.push_back (nPoints + i * 3 + 1); indices.push_back (nPoints + i * 3 + 2); normals.push_back (normal.x); normals.push_back (normal.z); normals.push_back (-normal.y); normals.push_back (normal.x); normals.push_back (normal.z); normals.push_back (-normal.y); normals.push_back (normal.x); normals.push_back (normal.z); normals.push_back (-normal.y); } updatedBuffers = true; openGLContext.triggerRepaint(); } void uploadBuffers() // this should only be called by the openGl thread { using namespace juce; using namespace juce::gl; openGLContext.extensions.glDeleteBuffers (1, &vertexBuffer); openGLContext.extensions.glDeleteBuffers (1, &indexBuffer); openGLContext.extensions.glDeleteBuffers (1, &normalsBuffer); openGLContext.extensions.glGenBuffers (1, &vertexBuffer); openGLContext.extensions.glBindBuffer (GL_ARRAY_BUFFER, vertexBuffer); openGLContext.extensions.glBufferData (GL_ARRAY_BUFFER, vertices.size() * sizeof (positionAndColour), &vertices[0], GL_STATIC_DRAW); openGLContext.extensions.glGenBuffers (1, &indexBuffer); openGLContext.extensions.glBindBuffer (GL_ELEMENT_ARRAY_BUFFER, indexBuffer); openGLContext.extensions.glBufferData (GL_ELEMENT_ARRAY_BUFFER, indices.size() * sizeof (int), &indices[0], GL_STATIC_DRAW); openGLContext.extensions.glGenBuffers (1, &normalsBuffer); openGLContext.extensions.glBindBuffer (GL_ARRAY_BUFFER, normalsBuffer); openGLContext.extensions.glBufferData (GL_ARRAY_BUFFER, normals.size() * sizeof (float), &normals[0], GL_STATIC_DRAW); } void renderOpenGL() override { using namespace juce; using namespace juce::gl; jassert (juce::OpenGLHelpers::isContextActive()); juce::OpenGLHelpers::clear (juce::Colour (0xFF2D2D2D)); const float desktopScale = (float) openGLContext.getRenderingScale(); glViewport (0, 0, juce::roundToInt (desktopScale * getWidth()), juce::roundToInt (desktopScale * getHeight())); glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glEnable (GL_DEPTH_TEST); #ifdef JUCE_OPENGL3 glEnable (GL_BLEND); glBlendFuncSeparate (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA); glBlendEquationSeparate (GL_FUNC_ADD, GL_FUNC_ADD); #endif openGLContext.extensions.glActiveTexture (GL_TEXTURE0); glEnable (GL_TEXTURE_2D); texture.bind(); if (updatedBuffers) { updatedBuffers = false; uploadBuffers(); } shader->use(); GLint programID = shader->getProgramID(); if (viewHasChanged) { viewHasChanged = false; if (projectionMatrix != nullptr) projectionMatrix->setMatrix4 (getProjectionMatrix().mat, 1, false); if (viewMatrix != nullptr) viewMatrix->setMatrix4 (getViewMatrix().mat, 1, false); } GLint attributeID; // 1st attribute buffer : vertices attributeID = openGLContext.extensions.glGetAttribLocation (programID, "position"); openGLContext.extensions.glEnableVertexAttribArray (attributeID); openGLContext.extensions.glBindBuffer (GL_ARRAY_BUFFER, vertexBuffer); openGLContext.extensions.glBindBuffer (GL_ELEMENT_ARRAY_BUFFER, indexBuffer); openGLContext.extensions.glVertexAttribPointer ( attributeID, // attribute 0. No particular reason for 0, but must match the layout in the shader. 3, // size GL_FLOAT, // type GL_FALSE, // normalized? sizeof (positionAndColour), // stride (void*) 0 // array buffer offset ); // 2nd attribute buffer : normals attributeID = openGLContext.extensions.glGetAttribLocation (programID, "normals"); openGLContext.extensions.glEnableVertexAttribArray (attributeID); openGLContext.extensions.glBindBuffer (GL_ARRAY_BUFFER, normalsBuffer); openGLContext.extensions.glVertexAttribPointer ( attributeID, // attribute 0. No particular reason for 0, but must match the layout in the shader. 3, // size GL_FLOAT, // type GL_FALSE, // normalized? 0, // stride (void*) 0 // array buffer offset ); // 3rd attribute buffer : colors attributeID = openGLContext.extensions.glGetAttribLocation (programID, "colormapDepthIn"); openGLContext.extensions.glEnableVertexAttribArray (attributeID); openGLContext.extensions.glBindBuffer (GL_ARRAY_BUFFER, vertexBuffer); openGLContext.extensions.glVertexAttribPointer ( attributeID, // attribute 1, // size GL_FLOAT, // type GL_TRUE, // normalized? sizeof (positionAndColour), // stride (void*) offsetof (positionAndColour, colourId) // array buffer offset ); glPolygonMode (GL_FRONT_AND_BACK, GL_FILL); if (blackFlag != nullptr) blackFlag->set (0.0f); if (drawPointsFlag != nullptr) drawPointsFlag->set (0.0f); // render with alpha = 0, to prime the depth buffer if (alpha != nullptr) alpha->set (0.0f); glDisable (GL_CULL_FACE); glDepthFunc (GL_ALWAYS); // priming depth buffer glPolygonMode (GL_FRONT_AND_BACK, GL_FILL); glDrawElements (GL_TRIANGLES, // mode nTriangles * 3, // count GL_UNSIGNED_INT, // type (void*) (nPoints * sizeof (int)) // element array buffer offset ); // setting alpha factor to 1 to actually draw something if (alpha != nullptr) alpha->set (1.0f); // draw points if (drawPointsFlag != nullptr) drawPointsFlag->set (1.0f); glPointSize (8 * desktopScale); glDepthFunc (GL_ALWAYS); glDrawElements (GL_POINTS, nPoints, GL_UNSIGNED_INT, (void*) 0); // Draw points! if (drawPointsFlag != nullptr) drawPointsFlag->set (0.0f); // draw background first (inward facing triangles in the background -> looking towards us) glEnable (GL_CULL_FACE); glCullFace (GL_BACK); glDepthFunc (GL_ALWAYS); glDrawElements (GL_TRIANGLES, // mode nTriangles * 3, // count GL_UNSIGNED_INT, // type (void*) (nPoints * sizeof (int)) // element array buffer offset ); // render black lines (all) glLineWidth (2.5 * desktopScale); glPolygonMode (GL_FRONT_AND_BACK, GL_LINE); if (blackFlag != nullptr) blackFlag->set (1.0f); glDrawElements (GL_TRIANGLES, // mode nTriangles * 3, // count GL_UNSIGNED_INT, // type (void*) (nPoints * sizeof (int)) // element array buffer offset ); if (blackFlag != nullptr) blackFlag->set (0.0f); glPolygonMode (GL_FRONT_AND_BACK, GL_FILL); // draw foreground triangles glEnable (GL_CULL_FACE); glCullFace (GL_FRONT); glDepthFunc (GL_ALWAYS); glDrawElements (GL_TRIANGLES, // mode nTriangles * 3, // count GL_UNSIGNED_INT, // type (void*) (nPoints * sizeof (int)) // element array buffer offset ); // render black lines (foreground) glLineWidth (2.5 * desktopScale); glPolygonMode (GL_FRONT_AND_BACK, GL_LINE); glDepthFunc (GL_LEQUAL); if (blackFlag != nullptr) blackFlag->set (1.0f); glDrawElements (GL_TRIANGLES, // mode nTriangles * 3, // count GL_UNSIGNED_INT, // type (void*) (nPoints * sizeof (int)) // element array buffer offset ); // draw foreground points if (drawPointsFlag != nullptr) drawPointsFlag->set (1.0f); if (blackFlag != nullptr) blackFlag->set (0.0f); glPointSize (8 * desktopScale); glDepthFunc (GL_LEQUAL); glDrawElements (GL_POINTS, nPoints, GL_UNSIGNED_INT, (void*) 0); // Draw points! if (drawPointsFlag != nullptr) drawPointsFlag->set (0.0f); openGLContext.extensions.glDisableVertexAttribArray ( openGLContext.extensions.glGetAttribLocation (programID, "position")); openGLContext.extensions.glDisableVertexAttribArray ( openGLContext.extensions.glGetAttribLocation (programID, "normals")); openGLContext.extensions.glDisableVertexAttribArray ( openGLContext.extensions.glGetAttribLocation (programID, "colormapDepthIn")); openGLContext.extensions.glBindBuffer (GL_ARRAY_BUFFER, 0); openGLContext.extensions.glBindBuffer (GL_ELEMENT_ARRAY_BUFFER, 0); } void openGLContextClosing() override { openGLContext.extensions.glDeleteBuffers (1, &vertexBuffer); openGLContext.extensions.glDeleteBuffers (1, &indexBuffer); openGLContext.extensions.glDeleteBuffers (1, &normalsBuffer); texture.release(); } void mouseWheelMove (const juce::MouseEvent& e, const juce::MouseWheelDetails& wheel) override { const double delta = (std::abs (wheel.deltaX) > std::abs (wheel.deltaY) ? -wheel.deltaX : wheel.deltaY); zoom += delta; zoom = juce::jmin (zoom, 8.0f); zoom = juce::jmax (zoom, 2.5f); viewHasChanged = true; openGLContext.triggerRepaint(); } void mouseDown (const juce::MouseEvent& e) override { tiltBeforeDrag = tilt; yawBeforeDrag = yaw; } void mouseDrag (const juce::MouseEvent& e) override { float deltaY = (float) e.getDistanceFromDragStartY() / 100; tilt = tiltBeforeDrag + deltaY; tilt = juce::jmin (tilt, (float) juce::MathConstants::pi / 2.0f); tilt = juce::jmax (tilt, 0.0f); float deltaX = (float) e.getDistanceFromDragStartX() / 100; yaw = yawBeforeDrag + deltaX; viewHasChanged = true; openGLContext.triggerRepaint(); } void createShaders() { // NOTE: the two lights below are single light sources which produce diffuse light on the body // adding speculars would be great vertexShader = "attribute vec3 position;\n" "attribute vec3 normals;\n" "attribute float colormapDepthIn;\n" "\n" "uniform mat4 projectionMatrix;\n" "uniform mat4 viewMatrix;\n" "uniform float blackFlag;\n" "uniform float alpha;\n" "uniform float drawPointsFlag;\n" "\n" "varying float colormapDepthOut;\n" "varying float lightIntensity;\n" "varying float blackFlagOut;\n" "varying float alphaOut;\n" "varying float drawPointsFlagOut;\n" "void main()\n" "{\n" " gl_Position.xyz = 500.0 * position;\n" // scaling leads to a better result " gl_Position.w = 1.0;\n" " gl_Position = projectionMatrix * viewMatrix * gl_Position;\n" " vec4 normal;\n" " normal.xyz = normals;\n" " normal.w = 0.0;\n" " vec4 light = normalize(vec4(-0.8, 0.4, 0.8, 0.0));\n" " float value;\n" " value = dot (light , viewMatrix * normal);\n" " lightIntensity = (value > 0.0) ? value : 0.0;\n" " colormapDepthOut = colormapDepthIn;\n" " blackFlagOut = blackFlag;\n" " alphaOut = alpha;\n" " drawPointsFlagOut = drawPointsFlag;\n" "}"; fragmentShader = "varying float colormapDepthOut;\n" "varying float lightIntensity;\n" "varying float blackFlagOut;\n" "varying float alphaOut;\n" "varying float drawPointsFlagOut;\n" "uniform sampler2D tex0;\n" "void main()\n" "{\n" " gl_FragColor = texture2D(tex0, vec2(colormapDepthOut, 0));\n" " if (drawPointsFlagOut != 1.0) gl_FragColor.xyz = gl_FragColor.xyz * (0.2/0.9 + lightIntensity * 0.8/0.9);\n" " if (blackFlagOut == 1.0) gl_FragColor = vec4(0, 0, 0, 1);" " gl_FragColor.w = alphaOut * gl_FragColor.w;\n" "}"; std::unique_ptr newShader ( new juce::OpenGLShaderProgram (openGLContext)); juce::String statusText; if (newShader->addVertexShader ( juce::OpenGLHelpers::translateVertexShaderToV3 (vertexShader)) && newShader->addFragmentShader ( juce::OpenGLHelpers::translateFragmentShaderToV3 (fragmentShader)) && newShader->link()) { shader = std::move (newShader); shader->use(); statusText = "GLSL: v" + juce::String (juce::OpenGLShaderProgram::getLanguageVersion(), 2); projectionMatrix.reset (createUniform (openGLContext, *shader, "projectionMatrix")); viewMatrix.reset (createUniform (openGLContext, *shader, "viewMatrix")); alpha.reset (createUniform (openGLContext, *shader, "alpha")); blackFlag.reset (createUniform (openGLContext, *shader, "blackFlag")); drawPointsFlag.reset (createUniform (openGLContext, *shader, "drawPointsFlag")); } else { statusText = newShader->getLastError(); } } juce::Matrix3D getProjectionMatrix() const { const float near = 1.0f; const float ratio = 1.0f / 3.0f; // similar to focal length (maybe reciprocal) const float w = near * ratio; const float h = w * getLocalBounds().toFloat().getAspectRatio (false); return juce::Matrix3D::fromFrustum (-w, w, -h, h, near, 10000.0f); } juce::Matrix3D createRotationMatrix (juce::Vector3D eulerAngleRadians) const noexcept { const float cx = std::cos (eulerAngleRadians.x), sx = std::sin (eulerAngleRadians.x), cy = std::cos (eulerAngleRadians.y), sy = std::sin (eulerAngleRadians.y), cz = std::cos (eulerAngleRadians.z), sz = std::sin (eulerAngleRadians.z); return juce::Matrix3D ((cy * cz) + (sx * sy * sz), cx * sz, (cy * sx * sz) - (cz * sy), 0.0f, (cz * sx * sy) - (cy * sz), cx * cz, (cy * cz * sx) + (sy * sz), 0.0f, cx * sy, -sx, cx * cy, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f); } juce::Matrix3D getViewMatrix() { auto translationMatrix = juce::Matrix3D::fromTranslation ( { 0.0f, 0.0f, -500.0f * zoom }); // move object further away juce::Matrix3D tiltMatrix = createRotationMatrix (juce::Vector3D (tilt, 0.0f, 0.0f)); juce::Matrix3D rotationMatrix = createRotationMatrix (juce::Vector3D (0.0f, yaw, 0.0f)); return translationMatrix * tiltMatrix * rotationMatrix; } private: GLuint vertexBuffer = 0, indexBuffer = 0, normalsBuffer = 0; const char* vertexShader; const char* fragmentShader; std::unique_ptr shader; std::unique_ptr projectionMatrix, viewMatrix, alpha, blackFlag, drawPointsFlag; static juce::OpenGLShaderProgram::Uniform* createUniform (juce::OpenGLContext& openGLContext, juce::OpenGLShaderProgram& shaderProgram, const char* uniformName) { if (openGLContext.extensions.glGetUniformLocation (shaderProgram.getProgramID(), uniformName) < 0) return nullptr; // Return if error return new juce::OpenGLShaderProgram::Uniform (shaderProgram, uniformName); } bool updatedBuffers; std::vector& extPoints; std::vector& extTriangles; std::vector>& extNormals; juce::BigInteger& imaginaryFlags; std::vector vertices; std::vector indices; std::vector normals; bool viewHasChanged = true; int nVertices; int nPoints = 0; int activePoint = -1; int nTriangles; float zoom = 5.0f; float tilt = 0.0f; float tiltBeforeDrag; float yaw = 0.0f; float yawBeforeDrag; juce::OpenGLTexture texture; juce::OpenGLContext openGLContext; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (LoudspeakerVisualizer) }; ././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/AllRADecoder/Source/PluginProcessor.hIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/AllRADecoder/Source/PluginProcessor.0000664002537200253720000002016215257173642031450 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Authors: Daniel Rudrich, Franz Zotter Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once #include "../../resources/AudioProcessorBase.h" #include "../JuceLibraryCode/JuceHeader.h" #include "../../resources/AmbisonicDecoder.h" #include "../../resources/NewtonApple/NewtonApple_hull3D.h" #include "../../resources/ReferenceCountedDecoder.h" #include "../../resources/customComponents/MailBox.h" #include "../../resources/efficientSHvanilla.h" #include "tDesign5200.h" #define CONFIGURATIONHELPER_ENABLE_DECODER_METHODS 1 #define CONFIGURATIONHELPER_ENABLE_LOUDSPEAKERLAYOUT_METHODS 1 #include "../../resources/ConfigurationHelper.h" #include "../../resources/HammerAitov.h" #include "../../resources/ambisonicTools.h" #include "AmbisonicNoiseBurst.h" #include "NoiseBurst.h" #define ProcessorClass AllRADecoderAudioProcessor //============================================================================== class AllRADecoderAudioProcessor : public AudioProcessorBase, IOTypes::AudioChannels<64>>, public juce::ValueTree::Listener { public: constexpr static int numberOfInputChannels = 64; constexpr static int numberOfOutputChannels = 64; static const juce::StringArray weightsStrings; //============================================================================== AllRADecoderAudioProcessor(); ~AllRADecoderAudioProcessor(); //============================================================================== void prepareToPlay (double sampleRate, int samplesPerBlock) override; void releaseResources() override; void processBlock (juce::AudioBuffer&, juce::MidiBuffer&) override; //============================================================================== juce::AudioProcessorEditor* createEditor() override; bool hasEditor() const override; //============================================================================== int getNumPrograms() override; int getCurrentProgram() override; void setCurrentProgram (int index) override; const juce::String getProgramName (int index) override; void changeProgramName (int index, const juce::String& newName) override; //============================================================================== void getStateInformation (juce::MemoryBlock& destData) override; void setStateInformation (const void* data, int sizeInBytes) override; //============================================================================== void parameterChanged (const juce::String& parameterID, float newValue) override; void updateBuffers() override; // use this to implement a buffer update method //============================================================================== void valueTreePropertyChanged (juce::ValueTree& treeWhosePropertyHasChanged, const juce::Identifier& property) override; void valueTreeChildAdded (juce::ValueTree& parentTree, juce::ValueTree& childWhichHasBeenAdded) override; void valueTreeChildRemoved (juce::ValueTree& parentTree, juce::ValueTree& childWhichHasBeenRemoved, int indexFromWhichChildWasRemoved) override; void valueTreeChildOrderChanged (juce::ValueTree& parentTreeWhoseChildrenHaveMoved, int oldIndex, int newIndex) override; void valueTreeParentChanged (juce::ValueTree& treeWhoseParentHasChanged) override; void playNoiseBurst (const int channel); void playAmbisonicNoiseBurst (const float azimuth, const float elevation); void addRandomPoint(); void addImaginaryLoudspeakerBelow(); void clearLoudspeakers(); void undo() { undoManager.undo(); } void redo() { undoManager.redo(); } void rotate (const float degreesAddedToAzimuth); void saveConfigurationToFile (juce::File destination); void loadConfiguration (const juce::File& presetFile); juce::ValueTree& getLoudspeakersValueTree() { return loudspeakers; } juce::var lsps; juce::Atomic updateLoudspeakerVisualization = false; juce::Atomic updateTable = true; juce::Atomic updateMessage = true; juce::Atomic updateChannelCount = true; ReferenceCountedDecoder::Ptr getCurrentDecoder() { return decoderConfig; } std::vector points; std::vector triangles; std::vector> normals; juce::BigInteger imaginaryFlags; juce::UndoManager undoManager; juce::Result calculateDecoder(); void setLastDir (juce::File newLastDir); juce::File getLastDir() { return lastDir; }; juce::Image energyDistribution; juce::Image rEVector; MailBox::Message messageToEditor; //======= Parameters =========================================================== std::vector> createParameterLayout(); //============================================================================== inline const bool interceptOSCMessage (juce::OSCMessage& message) override; inline const bool processNotYetConsumedOSCMessage (const juce::OSCMessage& message) override; private: //============================================================================== // list of used audio parameters std::atomic* inputOrderSetting; std::atomic* useSN3D; std::atomic* decoderOrder; std::atomic* exportDecoder; std::atomic* exportLayout; std::atomic* weights; juce::ValueTree loudspeakers { "Loudspeakers" }; AmbisonicDecoder decoder; ReferenceCountedDecoder::Ptr decoderConfig { nullptr }; bool isLayoutReady = false; int highestChannelNumber; juce::File lastDir; std::unique_ptr properties; // ========== METHODS void prepareLayout(); juce::Result checkLayout(); juce::Result verifyLoudspeakers(); juce::Result calculateTris(); void convertLoudspeakersToArray(); void wrapSphericalCoordinates(); float getKappa (float gIm, float gRe1, float gRe2, int N); juce::dsp::Matrix getInverse (juce::dsp::Matrix A); juce::ValueTree createLoudspeakerFromCartesian (juce::Vector3D cartesianCoordinates, int channel, bool isImaginary = false, float gain = 1.0f); juce::ValueTree createLoudspeakerFromSpherical (juce::Vector3D sphericalCoordinates, int channel, bool isImaginary = false, float gain = 1.0f); juce::Vector3D cartesianToSpherical (juce::Vector3D cartvect); juce::Vector3D sphericalToCartesian (juce::Vector3D sphervect); juce::Vector3D sphericalInRadiansToCartesian (juce::Vector3D sphervect); NoiseBurst noiseBurst; AmbisonicNoiseBurst ambisonicNoiseBurst; //============================================================================== JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AllRADecoderAudioProcessor) }; ././@LongLink0000644000000000000000000000016000000000000011600 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/AllRADecoder/Source/LoudspeakerTableComponent.hIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/AllRADecoder/Source/LoudspeakerTable0000664002537200253720000005172015257173642031466 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once #include "../JuceLibraryCode/JuceHeader.h" #include "LoudspeakerVisualizer.h" //============================================================================== /* */ class LoudspeakerTableComponent : public juce::Component, public juce::TableListBoxModel { public: LoudspeakerTableComponent (juce::ValueTree& loudspeakers, LoudspeakerVisualizer& visualizer, EnergyDistributionVisualizer& energyVis, juce::UndoManager& undoM, AllRADecoderAudioProcessor& audioProcessor) : data (loudspeakers), undoManager (undoM), processor (audioProcessor), lspVisualizer (visualizer), engVisualizer (energyVis) { typeFace = juce::FontOptions (getLookAndFeel().getTypefaceForFont (juce::FontOptions (12.0f, 0))); addAndMakeVisible (table); table.setModel (this); table.setColour (juce::ListBox::outlineColourId, juce::Colours::grey); table.setOutlineThickness (1); table.getHeader().addColumn (getAttributeNameForColumnId (1), 1, 23, 20, 25, juce::TableHeaderComponent::notSortable); table.getHeader().addColumn (getAttributeNameForColumnId (2), 2, 55); table.getHeader().addColumn (getAttributeNameForColumnId (3), 3, 55); table.getHeader().addColumn (getAttributeNameForColumnId (4), 4, 45); table.getHeader().addColumn (getAttributeNameForColumnId (5), 5, 50); table.getHeader().addColumn (getAttributeNameForColumnId (6), 6, 50); table.getHeader().addColumn (getAttributeNameForColumnId (7), 7, 33); table.getHeader().addColumn (getAttributeNameForColumnId (9), 9, 40, 40, 40, juce::TableHeaderComponent::notSortable); table.getHeader().addColumn (getAttributeNameForColumnId (8), 8, 60, 60, 60, juce::TableHeaderComponent::notSortable); table.setHeaderHeight (23); table.setMultipleSelectionEnabled (false); table.setColour (juce::ListBox::outlineColourId, juce::Colours::steelblue); table.setOutlineThickness (0); } ~LoudspeakerTableComponent() {} void playNoise (const int row) { const auto& modifiers = juce::ModifierKeys::getCurrentModifiers(); if (modifiers.isAltDown()) { const float azimuth = (float) data.getChild (row).getProperty ("Azimuth"); const float elevation = (float) data.getChild (row).getProperty ("Elevation"); processor.playAmbisonicNoiseBurst (azimuth, elevation); } else { if (! data.getChild (row).getProperty ("Imaginary")) { const int ch = (int) data.getChild (row).getProperty ("Channel"); processor.playNoiseBurst (ch); } } } void selectedRowsChanged (int lastRowSelected) override { lspVisualizer.setActiveSpeakerIndex (lastRowSelected); engVisualizer.setActiveSpeakerIndex (lastRowSelected); } void paintRowBackground (juce::Graphics& g, int rowNumber, int /*width*/, int /*height*/, bool rowIsSelected) override { const juce::Colour alternateColour ( getLookAndFeel() .findColour (juce::ListBox::backgroundColourId) .interpolatedWith (getLookAndFeel().findColour (juce::ListBox::textColourId), 0.03f)); if (rowIsSelected) g.fillAll (juce::Colours::limegreen.withMultipliedAlpha (0.3f)); else if (rowNumber % 2) g.fillAll (alternateColour); } int getNumRows() override { return data.getNumChildren(); } void paintCell (juce::Graphics& g, int rowNumber, int columnId, int width, int height, bool /*rowIsSelected*/) override { g.setColour (getLookAndFeel().findColour (juce::ListBox::textColourId)); g.setFont (typeFace); if (columnId == 1) g.drawText (juce::String (rowNumber + 1), 2, 0, width - 4, height, juce::Justification::centred, true); else g.drawText (getText (columnId, rowNumber), 2, 0, width - 4, height, juce::Justification::centred, true); } // This is overloaded from TableListBoxModel, and tells us that the user has clicked a table header // to change the sort order. void updateContent() { table.updateContent(); } void sortOrderChanged (int newSortColumnId, bool isForwards) override { if (newSortColumnId != 0) { DataSorter sorter (getAttributeNameForColumnId (newSortColumnId), isForwards); data.sort (sorter, nullptr, true); table.updateContent(); } } // This is overloaded from TableListBoxModel, and must update any custom components that we're using juce::Component* refreshComponentForCell (int rowNumber, int columnId, bool /*isRowSelected*/, juce::Component* existingComponentToUpdate) override { if (columnId == 1) // The ID and Length columns do not have a custom component { jassert (existingComponentToUpdate == nullptr); return nullptr; } else if (columnId == 6) // Imaginary { ImaginaryButton* imaginaryButton = static_cast (existingComponentToUpdate); if (imaginaryButton == nullptr) imaginaryButton = new ImaginaryButton (*this); imaginaryButton->setRowAndColumn (rowNumber, columnId); return imaginaryButton; } else if (columnId == 8) // Remove { RemoveButton* removeButton = static_cast (existingComponentToUpdate); if (removeButton == nullptr) removeButton = new RemoveButton (*this); removeButton->setRowAndColumn (rowNumber, columnId); return removeButton; } else if (columnId == 9) // Noise { NoiseButton* noiseButton = static_cast (existingComponentToUpdate); if (noiseButton == nullptr) noiseButton = new NoiseButton (*this); noiseButton->setRowAndColumn (rowNumber, columnId); noiseButton->setTooltip ( "Sends a short noise burst to that loudspeaker. \n Alt+click: Encodes a noise burst to the loudspeaker's position and decodes it with the current decoder."); noiseButton->setEnabled (! data.getChild (rowNumber).getProperty ("Imaginary")); return noiseButton; } // The other columns are editable text columns, for which we use the custom juce::Label component EditableTextCustomComponent* textLabel = static_cast (existingComponentToUpdate); // same as above... if (textLabel == nullptr) textLabel = new EditableTextCustomComponent (*this); textLabel->setRowAndColumn (rowNumber, columnId); return textLabel; } juce::String getAttributeNameForColumnId (const int columnId) const { switch (columnId) { case 1: return "ID"; break; case 2: return "Azimuth"; break; case 3: return "Elevation"; break; case 4: return "Radius"; break; case 5: return "Channel"; break; case 6: return "Imaginary"; break; case 7: return "Gain"; break; case 8: return "Remove"; break; case 9: return "Noise"; break; default: return ""; break; } } int getColumnAutoSizeWidth (int columnId) override { int widest = 32; for (int i = getNumRows(); --i >= 0;) { //TODO } return widest + 8; } void resized() override { table.setBounds (getLocalBounds()); } juce::String getText (const int columnId, const int rowNumber) const { if (columnId == 5 && data.getChild (rowNumber) .getProperty (getAttributeNameForColumnId (columnId)) .isInt()) { const int value = data.getChild (rowNumber).getProperty (getAttributeNameForColumnId (columnId)); return juce::String (value); } else if (data.getChild (rowNumber) .getProperty (getAttributeNameForColumnId (columnId)) .isDouble()) { const float value = data.getChild (rowNumber).getProperty (getAttributeNameForColumnId (columnId)); juce::String ret = juce::String (value, 0); if (columnId == 2 || columnId == 3) ret = ret + juce::String (juce::CharPointer_UTF8 (R"(°)")); return ret; } else return ("NaN"); } void setFloat (const int columnId, const int rowNumber, const float newValue) { undoManager.beginNewTransaction(); data.getChild (rowNumber).setProperty (getAttributeNameForColumnId (columnId), newValue, &undoManager); } void setInt (const int columnId, const int rowNumber, const int newValue) { undoManager.beginNewTransaction(); data.getChild (rowNumber).setProperty (getAttributeNameForColumnId (columnId), newValue, &undoManager); } void setBool (const int columnId, const int rowNumber, const bool newValue) { undoManager.beginNewTransaction(); data.getChild (rowNumber).setProperty (getAttributeNameForColumnId (columnId), newValue, &undoManager); } bool getBool (const int columnId, const int rowNumber) { return data.getChild (rowNumber).getProperty (getAttributeNameForColumnId (columnId)); } private: juce::TableListBox table; // the table component itself juce::FontOptions typeFace; juce::ValueTree& data; juce::UndoManager& undoManager; AllRADecoderAudioProcessor& processor; LoudspeakerVisualizer& lspVisualizer; EnergyDistributionVisualizer& engVisualizer; class EditableTextCustomComponent : public juce::Label { public: EditableTextCustomComponent (LoudspeakerTableComponent& td) : owner (td) { setEditable (false, true, false); setJustificationType (juce::Justification::centred); } void mouseDown (const juce::MouseEvent& event) override { owner.table.selectRowsBasedOnModifierKeys (row, event.mods, false); juce::Label::mouseDown (event); } void textWasEdited() override { if (columnId == 5) owner.setInt (columnId, row, getText().getIntValue()); else owner.setFloat (columnId, row, getText().getFloatValue()); } void setRowAndColumn (const int newRow, const int newColumn) { row = newRow; columnId = newColumn; setText (owner.getText (columnId, row), juce::dontSendNotification); } void paint (juce::Graphics& g) override { if (! isBeingEdited()) { const float alpha = isEnabled() ? 1.0f : 0.5f; if ((columnId == 4 || columnId == 7) && ! owner.data.getChild (row).getProperty ("Imaginary")) g.setColour (juce::Colours::white.withMultipliedAlpha (0.4f)); else { if (columnId == 5 && owner.data.getChild (row).getProperty ("Imaginary")) g.setColour (juce::Colours::white.withMultipliedAlpha (0.4f)); else g.setColour (juce::Colours::white); } auto currentFont = juce::FontOptions (getLookAndFeel().getTypefaceForFont ( juce::FontOptions (13.0f, 0))) .withHeight (13.0f); g.setFont (currentFont); juce::Rectangle textArea (getBorderSize().subtractedFrom (getLocalBounds())); g.drawFittedText (getText(), textArea, getJustificationType(), juce::jmax (1, (int) (textArea.getHeight() / 12.0f)), getMinimumHorizontalScale()); g.setColour (findColour (juce::Label::outlineColourId).withMultipliedAlpha (alpha)); } } private: LoudspeakerTableComponent& owner; int row, columnId; juce::Colour textColour; }; class RemoveButton : public juce::TextButton { public: RemoveButton (LoudspeakerTableComponent& td) : owner (td) { setButtonText ("Remove"); setColour (juce::TextButton::buttonColourId, juce::Colours::orangered); onClick = [this]() { owner.undoManager.beginNewTransaction(); owner.data.removeChild (owner.data.getChild (row), &owner.undoManager); }; } void setRowAndColumn (const int newRow, const int newColumn) { row = newRow; columnId = newColumn; } void paintButton (juce::Graphics& g, bool isMouseOverButton, bool isButtonDown) override { juce::LookAndFeel& lf = getLookAndFeel(); juce::Rectangle buttonArea (0.0f, 0.0f, getWidth(), getHeight()); buttonArea.reduce (2.0f, 2.0f); g.setColour (findColour (juce::TextButton::buttonColourId) .withMultipliedAlpha (isButtonDown ? 1.0f : isMouseOverButton ? 0.7f : 0.5f)); if (isButtonDown) buttonArea.reduce (0.8f, 0.8f); else if (isMouseOverButton) buttonArea.reduce (0.4f, 0.4f); g.drawRoundedRectangle (buttonArea, 2.0f, 1.0f); buttonArea.reduce (1.5f, 1.5f); g.setColour (findColour (juce::TextButton::buttonColourId) .withMultipliedAlpha (isButtonDown ? 1.0f : isMouseOverButton ? 0.5f : 0.2f)); g.fillRoundedRectangle (buttonArea, 2.0f); lf.drawButtonText (g, *this, isMouseOverButton, isButtonDown); } private: LoudspeakerTableComponent& owner; int row, columnId; }; class NoiseButton : public juce::TextButton { public: NoiseButton (LoudspeakerTableComponent& td) : owner (td) { setButtonText ("Noise"); setColour (juce::TextButton::buttonColourId, juce::Colours::green); onClick = [this]() { owner.playNoise (row); }; } void setRowAndColumn (const int newRow, const int newColumn) { row = newRow; column = newColumn; } void paintButton (juce::Graphics& g, bool isMouseOverButton, bool isButtonDown) override { juce::LookAndFeel& lf = getLookAndFeel(); juce::Rectangle buttonArea (0.0f, 0.0f, getWidth(), getHeight()); buttonArea.reduce (2.0f, 2.0f); g.setColour (findColour (juce::TextButton::buttonColourId) .withMultipliedAlpha (isButtonDown ? 1.0f : isMouseOverButton ? 0.7f : 0.5f)); if (isButtonDown) buttonArea.reduce (0.8f, 0.8f); else if (isMouseOverButton) buttonArea.reduce (0.4f, 0.4f); g.drawRoundedRectangle (buttonArea, 2.0f, 1.0f); buttonArea.reduce (1.5f, 1.5f); g.setColour (findColour (juce::TextButton::buttonColourId) .withMultipliedAlpha (isButtonDown ? 1.0f : isMouseOverButton ? 0.5f : 0.2f)); g.fillRoundedRectangle (buttonArea, 2.0f); lf.drawButtonText (g, *this, isMouseOverButton, isButtonDown); } private: LoudspeakerTableComponent& owner; int row, column; }; class ImaginaryButton : public juce::Component { public: ImaginaryButton (LoudspeakerTableComponent& td) : owner (td) { addAndMakeVisible (button); button.setButtonText (""); button.setColour (juce::ToggleButton::tickColourId, juce::Colours::orange); button.onClick = [this]() { owner.setBool (columnId, row, button.getToggleState()); owner.repaint(); }; } void mouseDown (const juce::MouseEvent& event) override { owner.table.selectRowsBasedOnModifierKeys (row, event.mods, false); } void setRowAndColumn (const int newRow, const int newColumn) { row = newRow; columnId = newColumn; button.setToggleState (owner.getBool (columnId, row), juce::dontSendNotification); } void resized() override { juce::Rectangle bounds = getLocalBounds(); const int height = bounds.getHeight(); button.setBounds (bounds.reduced ((bounds.getWidth() - height) / 2, 0)); } private: LoudspeakerTableComponent& owner; int row, columnId; juce::ToggleButton button; }; class DataSorter { public: DataSorter (const juce::String& attributeToSortBy, bool forwards) : attributeToSort (attributeToSortBy), direction (forwards ? 1 : -1) { } int compareElements (const juce::ValueTree& first, const juce::ValueTree& second) const { int result = first.getProperty (attributeToSort) .toString() .compareNatural (second.getProperty (attributeToSort).toString()); return direction * result; } private: juce::String attributeToSort; int direction; }; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (LoudspeakerTableComponent) }; IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/AllRADecoder/Source/PluginEditor.h0000664002537200253720000001142615257173642031072 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Authors: Daniel Rudrich, Franz Zotter Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once #include "../JuceLibraryCode/JuceHeader.h" #include "PluginProcessor.h" //Plugin Design Essentials #include "../../resources/customComponents/TitleBar.h" #include "../../resources/lookAndFeel/IEM_LaF.h" //Custom juce::Components #include "../../resources/customComponents/MailBox.h" #include "../../resources/customComponents/ReverseSlider.h" #include "../../resources/customComponents/SimpleLabel.h" #include "EnergyDistributionVisualizer.h" #include "LoudspeakerTableComponent.h" #include "LoudspeakerVisualizer.h" #include "RotateWindow.h" typedef ReverseSlider::SliderAttachment SliderAttachment; // all ReverseSliders will make use of the parameters' valueToText() function typedef juce::AudioProcessorValueTreeState::ComboBoxAttachment ComboBoxAttachment; typedef juce::AudioProcessorValueTreeState::ButtonAttachment ButtonAttachment; //============================================================================== /** */ class AllRADecoderAudioProcessorEditor : public juce::AudioProcessorEditor, private juce::Timer, public juce::Button::Listener { public: AllRADecoderAudioProcessorEditor (AllRADecoderAudioProcessor&, juce::AudioProcessorValueTreeState&); ~AllRADecoderAudioProcessorEditor(); //============================================================================== void paint (juce::Graphics&) override; void resized() override; //============================================================================== void timerCallback() override; //============================================================================== void buttonClicked (juce::Button* button) override; void buttonStateChanged (juce::Button* button) override; void updateChannelCount(); void openRotateWindow(); private: // ====================== begin essentials ================== // lookAndFeel class with the IEM plug-in suite design LaF globalLaF; // stored references to the AudioProcessor and juce::ValueTreeState holding all the parameters AllRADecoderAudioProcessor& processor; juce::AudioProcessorValueTreeState& valueTreeState; /* title and footer component title component can hold different widgets for in- and output: - NoIOWidget (if there's no need for an input or output widget) - AudioChannelsIOWidget - AmbisonicIOWidget - DirectivitiyIOWidget */ TitleBar, AudioChannelsIOWidget<0, false>> title; OSCFooter footer; // =============== end essentials ============ juce::TooltipWindow tooltipWin; // Attachments to create a connection between IOWidgets comboboxes // and the associated parameters std::unique_ptr cbOrderSettingAttachment; std::unique_ptr cbNormalizationSettingAttachment; juce::ComboBox cbDecoderOrder, cbDecoderWeights; std::unique_ptr cbDecoderOrderAttachment, cbDecoderWeightsAttachment; juce::ToggleButton tbExportDecoder, tbExportLayout; std::unique_ptr tbExportDecoderAttachment, tbExportLayoutAttachment; juce::GroupComponent gcLayout, gcDecoder, gcExport; SimpleLabel lbDecoderOrder, lbDecoderWeights; MailBox::Display messageDisplay; juce::TextButton tbCalculateDecoder; juce::TextButton tbAddSpeakers; juce::TextButton tbClearSpeakers; juce::TextButton tbUndo; juce::TextButton tbRedo; juce::TextButton tbRotate; juce::TextButton tbImport; juce::TextButton tbJson; LoudspeakerVisualizer lv; LoudspeakerTableComponent lspList; EnergyDistributionVisualizer grid; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AllRADecoderAudioProcessorEditor) }; ././@LongLink0000644000000000000000000000016300000000000011603 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/AllRADecoder/Source/EnergyDistributionVisualizer.hIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/AllRADecoder/Source/EnergyDistributi0000664002537200253720000001074615257173642031537 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #include "../../resources/customComponents/HammerAitovGrid.h" #include "../JuceLibraryCode/JuceHeader.h" #pragma once class EnergyDistributionVisualizer : public juce::Component { public: EnergyDistributionVisualizer (std::vector& pts, juce::BigInteger& imagFlags, juce::Image& energyImageFromProcessor, juce::Image& rEImageFromProcessor) : juce::Component(), extPoints (pts), imaginaryFlags (imagFlags), energyImage (energyImageFromProcessor), rEImage (rEImageFromProcessor) { setBufferedToImage (true); showrEVector = false; addAndMakeVisible (imgComp); imgComp.setImage (energyImage); imgComp.setImagePlacement (juce::RectanglePlacement::stretchToFit); addAndMakeVisible (background); background.addMouseListener (this, false); // could this be risky? }; ~EnergyDistributionVisualizer() {}; void resized() override { imgComp.setBounds (getLocalBounds().reduced (10, 20)); background.setBounds (getLocalBounds()); } void paintOverChildren (juce::Graphics& g) override { const juce::Rectangle bounds = getLocalBounds().toFloat().reduced (10.0f, 20.0f); const float centreX = bounds.getCentreX(); const float centreY = bounds.getCentreY(); const float wh = bounds.getWidth() * 0.5f; const float hh = bounds.getHeight() * 0.5f; for (int i = 0; i < extPoints.size(); ++i) { R3 point = extPoints[i]; g.setColour (activePoint == point.lspNum ? juce::Colours::lawngreen : point.isImaginary ? juce::Colours::orange : juce::Colours::cornflowerblue); float x, y; float azimuth = juce::degreesToRadians (point.azimuth); float elevation = juce::degreesToRadians (point.elevation); HammerAitov::sphericalToXY (azimuth, elevation, x, y); juce::Rectangle rect (centreX + x * wh - 5.0f, centreY - y * hh - 5.0f, 10.0f, 10.0f); g.fillRoundedRectangle (rect, 5.0f); } g.setColour (juce::Colours::white); auto currentFont = juce::FontOptions (getLookAndFeel().getTypefaceForFont (juce::FontOptions (12.0f))) .withHeight (12.0f); g.setFont (currentFont); juce::String displayText = showrEVector ? "acos-rE source width (double-click to change)" : "energy fluctuations (double-click to change)"; g.drawText (displayText, getLocalBounds().removeFromBottom (12), juce::Justification::centred); }; void mouseDoubleClick (const juce::MouseEvent& event) override { showrEVector = ! showrEVector; if (showrEVector) imgComp.setImage (rEImage); else imgComp.setImage (energyImage); imgComp.repaint(); repaint(); } void setActiveSpeakerIndex (int newIdx) { activePoint = newIdx; repaint(); } private: std::vector& extPoints; juce::BigInteger& imaginaryFlags; int activePoint = -1; juce::ImageComponent imgComp; juce::Image &energyImage, rEImage; bool showrEVector; HammerAitovGrid background; }; IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/AllRADecoder/Source/RotateWindow.h0000664002537200253720000000522415257173642031112 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Authors: Daniel Rudrich, Franz Zotter Copyright (c) 2018 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once #include "../../resources/customComponents/SimpleLabel.h" #include "../JuceLibraryCode/JuceHeader.h" //============================================================================== /* */ class RotateWindow : public juce::Component { public: RotateWindow (AllRADecoderAudioProcessor& p) : processor (p) { addAndMakeVisible (headline); headline.setText ("Add to Azimuth angles", true, juce::Justification::centred); addAndMakeVisible (lbValue); lbValue.setText ("0", juce::dontSendNotification); lbValue.setEditable (true); lbValue.setJustificationType (juce::Justification::centred); addAndMakeVisible (tbRotate); tbRotate.setButtonText ("ROTATE"); tbRotate.setColour (juce::TextButton::buttonColourId, juce::Colours::cornflowerblue); tbRotate.onClick = [this]() { checkAndTriggerRotation(); }; } ~RotateWindow() {} void paint (juce::Graphics& g) override {} void checkAndTriggerRotation() { auto val = lbValue.getTextValue(); float v = val.getValue(); if (v <= 360.0f && v >= -360.0f) processor.rotate (v); } void resized() override { auto bounds = getLocalBounds(); headline.setBounds (bounds.removeFromTop (12)); bounds.removeFromTop (2); auto row = bounds.removeFromTop (20); tbRotate.setBounds (row.removeFromRight (60)); bounds.removeFromRight (5); lbValue.setBounds (row); } private: AllRADecoderAudioProcessor& processor; SimpleLabel headline; juce::Label lbValue; juce::TextButton tbRotate; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (RotateWindow) }; IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/AllRADecoder/CMakeLists.txt0000664002537200253720000000442215257173642027612 0ustar zmoelnigzmoelnigset (PLUGIN_TARGET "") if (IEM_FORMATS) juce_add_plugin (AllRADecoder PLUGIN_MANUFACTURER_CODE IEMA PLUGIN_CODE AlRa ICON_BIG "../resources/Standalone/IEMPluginSuiteSmall.png" ICON_SMALL "../resources/Standalone/IEMPluginSuiteSmall.png" COMPANY_NAME "IEM" PRODUCT_NAME "AllRADecoder" FORMATS ${IEM_FORMATS} VERSION ${AllRADecoder_VERISON} LV2URI "http://plugins.iem.at/AllRADecoder" VST2_CATEGORY kPlugSurroundFx kPlugCategSpacializer VST3_CATEGORIES Spatial Surround Up-Downmix AAX_CATEGORY SoundField) list (APPEND PLUGIN_TARGET AllRADecoder) endif() foreach (TARGET IN LISTS PLUGIN_TARGET) juce_generate_juce_header (${TARGET}) target_sources (${TARGET} PRIVATE Source/AmbisonicNoiseBurst.h Source/EnergyDistributionVisualizer.h Source/LoudspeakerTableComponent.h Source/LoudspeakerVisualizer.h Source/NoiseBurst.h Source/PluginEditor.cpp Source/PluginEditor.h Source/PluginProcessor.cpp Source/PluginProcessor.h Source/RotateWindow.h Source/tDesign5200.h ../resources/OSC/OSCInputStream.h ../resources/OSC/OSCParameterInterface.cpp ../resources/OSC/OSCParameterInterface.h ../resources/OSC/OSCStatus.cpp ../resources/OSC/OSCStatus.h ../resources/OSC/OSCUtilities.h ../resources/NewtonApple/NewtonApple_hull3D.h ../resources/NewtonApple/NewtonApple_hull3D.cpp ../resources/efficientSHvanilla.cpp ) target_compile_definitions (${TARGET} PRIVATE JUCE_USE_CURL=0 JUCE_WEB_BROWSER=0 JUCE_USE_CUSTOM_PLUGIN_STANDALONE_APP=1 JUCE_USE_FLAC=0 JUCE_USE_OGGVORBIS=0 JUCE_USE_MP3AUDIOFORMAT=0 JUCE_USE_LAME_AUDIO_FORMAT=0 JUCE_USE_WINDOWS_MEDIA_FORMAT=0 JUCE_VST3_CAN_REPLACE_VST2=0) target_include_directories (${TARGET} PRIVATE Source) target_link_libraries (${TARGET} PRIVATE LAF_fonts IEM_logo juce::juce_audio_utils juce::juce_audio_plugin_client juce::juce_osc juce::juce_dsp juce::juce_opengl juce::juce_recommended_config_flags juce::juce_recommended_lto_flags) endforeach() IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/DirectionalCompressor/0000775002537200253720000000000015257173642027141 5ustar zmoelnigzmoelnigIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/DirectionalCompressor/Source/0000775002537200253720000000000015257173642030401 5ustar zmoelnigzmoelnig././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/DirectionalCompressor/Source/PluginProcessor.cppIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/DirectionalCompressor/Source/PluginP0000664002537200253720000007062415257173642031713 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #include "PluginProcessor.h" #include "PluginEditor.h" //============================================================================== DirectionalCompressorAudioProcessor::DirectionalCompressorAudioProcessor() : AudioProcessorBase ( #ifndef JucePlugin_PreferredChannelConfigurations BusesProperties() #if ! JucePlugin_IsMidiEffect #if ! JucePlugin_IsSynth .withInput ("Input", ((juce::PluginHostType::getPluginLoadedAs() == juce::AudioProcessor::wrapperType_VST3) ? juce::AudioChannelSet::ambisonic (1) : juce::AudioChannelSet::ambisonic (7)), true) #endif .withOutput ("Output", ((juce::PluginHostType::getPluginLoadedAs() == juce::AudioProcessor::wrapperType_VST3) ? juce::AudioChannelSet::ambisonic (1) : juce::AudioChannelSet::ambisonic (7)), true) #endif , #endif createParameterLayout()), //W (tDesignN), Y (tDesignN, 64), YH (64, tDesignN), tempMat (64, tDesignN), P1 (64, 64) { parameters.addParameterListener ("azimuth", this); parameters.addParameterListener ("elevation", this); parameters.addParameterListener ("width", this); parameters.addParameterListener ("orderSetting", this); orderSetting = parameters.getRawParameterValue ("orderSetting"); useSN3D = parameters.getRawParameterValue ("useSN3D"); preGain = parameters.getRawParameterValue ("preGain"); c1Enabled = parameters.getRawParameterValue ("c1Enabled"); c1DrivingSignal = parameters.getRawParameterValue ("c1DrivingSignal"); c1Apply = parameters.getRawParameterValue ("c1Apply"); c1Threshold = parameters.getRawParameterValue ("c1Threshold"); c1Knee = parameters.getRawParameterValue ("c1Knee"); c1Attack = parameters.getRawParameterValue ("c1Attack"); c1Release = parameters.getRawParameterValue ("c1Release"); c1Ratio = parameters.getRawParameterValue ("c1Ratio"); c1Makeup = parameters.getRawParameterValue ("c1Makeup"); c2Enabled = parameters.getRawParameterValue ("c2Enabled"); c2DrivingSignal = parameters.getRawParameterValue ("c2DrivingSignal"); c2Apply = parameters.getRawParameterValue ("c2Apply"); c2Threshold = parameters.getRawParameterValue ("c2Threshold"); c2Knee = parameters.getRawParameterValue ("c2Knee"); c2Attack = parameters.getRawParameterValue ("c2Attack"); c2Release = parameters.getRawParameterValue ("c2Release"); c2Ratio = parameters.getRawParameterValue ("c2Ratio"); c2Makeup = parameters.getRawParameterValue ("c2Makeup"); azimuth = parameters.getRawParameterValue ("azimuth"); elevation = parameters.getRawParameterValue ("elevation"); width = parameters.getRawParameterValue ("width"); listen = parameters.getRawParameterValue ("listen"); c1MaxGR = 0.0f; c2MaxGR = 0.0f; c1GR = 0.0f; c2GR = 0.0f; // calc Y for (int p = 0; p < tDesignN; ++p) SHEval (7, tDesignX[p], tDesignY[p], tDesignZ[p], Y.getRawDataPointer() + p * 64, false); Y *= std::sqrt (4 * juce::MathConstants::pi / tDesignN) / decodeCorrection (7); // reverting 7th order correction for (int r = 0; r < 64; ++r) for (int c = 0; c < tDesignN; ++c) YH (r, c) = Y (c, r); } DirectionalCompressorAudioProcessor::~DirectionalCompressorAudioProcessor() { } //============================================================================== int DirectionalCompressorAudioProcessor::getNumPrograms() { return 1; // NB: some hosts don't cope very well if you tell them there are 0 programs, // so this should be at least 1, even if you're not really implementing programs. } int DirectionalCompressorAudioProcessor::getCurrentProgram() { return 0; } void DirectionalCompressorAudioProcessor::setCurrentProgram (int index) { } const juce::String DirectionalCompressorAudioProcessor::getProgramName (int index) { return {}; } void DirectionalCompressorAudioProcessor::changeProgramName (int index, const juce::String& newName) { } void DirectionalCompressorAudioProcessor::parameterChanged (const juce::String& parameterID, float newValue) { if (parameterID == "azimuth" || parameterID == "elevation" || parameterID == "width") { updatedPositionData = true; paramChanged = true; } else if (parameterID == "orderSetting") { userChangedIOSettings = true; } } //============================================================================== void DirectionalCompressorAudioProcessor::prepareToPlay (double sampleRate, int samplesPerBlock) { checkInputAndOutput (this, *orderSetting, *orderSetting, true); juce::dsp::ProcessSpec spec; spec.sampleRate = sampleRate; spec.numChannels = 1; spec.maximumBlockSize = samplesPerBlock; compressor1.prepare (spec); compressor2.prepare (spec); omniW.setSize (1, samplesPerBlock); c1Gains.resize (samplesPerBlock); c2Gains.resize (samplesPerBlock); calcParams(); } void DirectionalCompressorAudioProcessor::releaseResources() { // When playback stops, you can use this as an opportunity to free up any // spare memory, etc. } void DirectionalCompressorAudioProcessor::processBlock (juce::AudioSampleBuffer& buffer, juce::MidiBuffer& midiMessages) { checkInputAndOutput (this, *orderSetting, *orderSetting); if (paramChanged) calcParams(); const int totalNumInputChannels = getTotalNumInputChannels(); const int totalNumOutputChannels = getTotalNumOutputChannels(); const int bufferSize = buffer.getNumSamples(); const int numCh = juce::jmin (input.getNumberOfChannels(), buffer.getNumChannels()); if (numCh == 0) return; // Compressor 1 settings if (*c1Ratio > 15.9f) compressor1.setRatio (INFINITY); else compressor1.setRatio (*c1Ratio); compressor1.setKnee (*c1Knee); compressor1.setAttackTime (*c1Attack / 1000.0f); compressor1.setReleaseTime (*c1Release / 1000.0f); compressor1.setThreshold (*c1Threshold); compressor1.setMakeUpGain (*c1Makeup); // Compressor 2 settings if (*c2Ratio > 15.9f) compressor2.setRatio (INFINITY); else compressor2.setRatio (*c2Ratio); compressor2.setKnee (*c2Knee); compressor2.setAttackTime (*c2Attack / 1000.0f); compressor2.setReleaseTime (*c2Release / 1000.0f); compressor2.setThreshold (*c2Threshold); compressor2.setMakeUpGain (*c2Makeup); drivingPointers[0] = maskBuffer.getReadPointer (0); drivingPointers[1] = buffer.getReadPointer (0); drivingPointers[2] = omniW.getReadPointer (0); // preGain - can be tweaked by adding gain to compressor gains float preGainLinear = juce::Decibels::decibelsToGain (preGain->load()); if (*useSN3D >= 0.5f) for (int i = 0; i < numCh; ++i) buffer.applyGain (i, 0, bufferSize, sn3d2n3d[i] * preGainLinear); else buffer.applyGain (juce::Decibels::decibelsToGain (preGain->load())); // --------- make copies of buffer omniW.copyFrom (0, 0, buffer, 0, 0, bufferSize); maskBuffer.clear(); maskBuffer.setSample (0, 0, 0.0f); for (int chIn = 0; chIn < numCh; ++chIn) { const float* readPtr = buffer.getReadPointer (chIn); for (int chOut = 0; chOut < numCh; ++chOut) { maskBuffer.addFrom (chOut, 0, readPtr, bufferSize, P1 (chOut, chIn)); } } /* This makes the buffer containing the negative mask */ for (int chIn = 0; chIn < numCh; ++chIn) juce::FloatVectorOperations::subtract (buffer.getWritePointer (chIn), maskBuffer.getReadPointer (chIn), bufferSize); // ------- clear not needed channels for (int i = totalNumInputChannels; i < totalNumOutputChannels; ++i) buffer.clear (i, 0, buffer.getNumSamples()); // =============== COMPRESSOR 1 ==================== { // set compressor driving signal const float* drivingSignalPtr = [this]() -> const float* { if (*c1DrivingSignal >= 0.5f && *c1DrivingSignal < 1.5f) return drivingPointers[0]; else if (*c1DrivingSignal >= 1.5f) return drivingPointers[1]; else return drivingPointers[2]; }(); compressor1.getGainFromSidechainSignal (drivingSignalPtr, c1Gains.getRawDataPointer(), bufferSize); c1MaxRMS = compressor1.getMaxLevelInDecibels(); c1MaxGR = juce::Decibels::gainToDecibels ( juce::FloatVectorOperations::findMinimum (c1Gains.getRawDataPointer(), bufferSize)) - *c1Makeup; } // =============== COMPRESSOR 2 ==================== { // set compressor driving signal const float* drivingSignalPtr = [this]() -> const float* { if (*c2DrivingSignal >= 0.5f && *c2DrivingSignal < 1.5f) return drivingPointers[0]; else if (*c2DrivingSignal >= 1.5f) return drivingPointers[1]; else return drivingPointers[2]; }(); compressor2.getGainFromSidechainSignal (drivingSignalPtr, c2Gains.getRawDataPointer(), bufferSize); c2MaxRMS = compressor2.getMaxLevelInDecibels(); c2MaxGR = juce::Decibels::gainToDecibels ( juce::FloatVectorOperations::findMinimum (c2Gains.getRawDataPointer(), bufferSize)) - *c2Makeup; } // =============== OUTPUT CALCULATIONS ==================== // REMEMBER: buffer contains negative mask content // apply gains from compressor 1 if (*c1Enabled >= 0.5f) { if (*c1Apply >= 0.5f && *c1Apply < 1.5f) //mask { for (int channel = 0; channel < numCh; ++channel) { float* writeData = maskBuffer.getWritePointer (channel); juce::FloatVectorOperations::multiply (writeData, c1Gains.getRawDataPointer(), bufferSize); } } else if (*c1Apply > 1.5f) //negative mask { for (int channel = 0; channel < numCh; ++channel) { float* writeData = buffer.getWritePointer (channel); juce::FloatVectorOperations::multiply (writeData, c1Gains.getRawDataPointer(), bufferSize); } } else { for (int channel = 0; channel < numCh; ++channel) { float* writeData = maskBuffer.getWritePointer (channel); juce::FloatVectorOperations::multiply (writeData, c1Gains.getRawDataPointer(), bufferSize); writeData = buffer.getWritePointer (channel); juce::FloatVectorOperations::multiply (writeData, c1Gains.getRawDataPointer(), bufferSize); } } } // apply gains from compressor 2 if (*c2Enabled >= 0.5f) { if (*c2Apply >= 0.5f && *c2Apply < 1.5f) //mask { for (int channel = 0; channel < numCh; ++channel) { float* writeData = maskBuffer.getWritePointer (channel); juce::FloatVectorOperations::multiply (writeData, c2Gains.getRawDataPointer(), bufferSize); } } else if (*c2Apply > 1.5f) //negative mask { for (int channel = 0; channel < numCh; ++channel) { float* writeData = buffer.getWritePointer (channel); juce::FloatVectorOperations::multiply (writeData, c2Gains.getRawDataPointer(), bufferSize); } } else { for (int channel = 0; channel < numCh; ++channel) { float* writeData = maskBuffer.getWritePointer (channel); juce::FloatVectorOperations::multiply (writeData, c2Gains.getRawDataPointer(), bufferSize); writeData = buffer.getWritePointer (channel); juce::FloatVectorOperations::multiply (writeData, c2Gains.getRawDataPointer(), bufferSize); } } } //add channels or replace if (*listen >= 0.5f && *listen < 1.5f) //mask { juce::FloatVectorOperations::copy (buffer.getWritePointer (0), maskBuffer.getReadPointer (0), numCh * bufferSize); } else if (*listen < 0.5f) { for (int chIn = 0; chIn < numCh; ++chIn) juce::FloatVectorOperations::add (buffer.getWritePointer (chIn), maskBuffer.getReadPointer (chIn), bufferSize); } if (*useSN3D >= 0.5f) for (int i = 0; i < numCh; ++i) buffer.applyGain (i, 0, bufferSize, n3d2sn3d[i]); } void DirectionalCompressorAudioProcessor::calcParams() { paramChanged = false; // convert azimuth and elevation to cartesian coordinates auto pos = Conversions::sphericalToCartesian ( Conversions::degreesToRadians (*azimuth), Conversions::degreesToRadians (*elevation)); pos = pos.normalised(); for (int point = 0; point < tDesignN; ++point) { dist[point] = pos.x * tDesignX[point] + pos.y * tDesignY[point] + pos.z * tDesignZ[point]; dist[point] /= std::sqrt (juce::square (tDesignX[point]) + juce::square (tDesignY[point]) + juce::square (tDesignZ[point])); dist[point] = std::acos (dist[point]); } float widthHalf = Conversions::degreesToRadians (*width) * 0.25f; // it's actually width fourth (symmetric mask) widthHalf = juce::jmax (widthHalf, juce::FloatVectorOperations::findMinimum (dist, tDesignN)); juce::FloatVectorOperations::clip (dist, dist, widthHalf, 3 * widthHalf, tDesignN); juce::FloatVectorOperations::add (dist, -widthHalf, tDesignN); juce::FloatVectorOperations::multiply (dist, 0.25f * juce::MathConstants::pi / widthHalf, tDesignN); for (int p = 0; p < tDesignN; ++p) { const float g = std::cos (dist[p]); for (int r = 0; r < 64; ++r) tempMat (r, p) = g * Y (p, r); } for (int r = 0; r < 64; ++r) for (int c = r; c < 64; ++c) { float sum = 0.0f; for (int i = 0; i < tDesignN; ++i) sum += tempMat (r, i) * YH (c, i); P1 (r, c) = sum; P1 (c, r) = sum; } } //============================================================================== bool DirectionalCompressorAudioProcessor::hasEditor() const { return true; // (change this to false if you choose to not supply an editor) } juce::AudioProcessorEditor* DirectionalCompressorAudioProcessor::createEditor() { return new DirectionalCompressorAudioProcessorEditor (*this, parameters); } //============================================================================== void DirectionalCompressorAudioProcessor::getStateInformation (juce::MemoryBlock& destData) { auto state = parameters.copyState(); auto oscConfig = state.getOrCreateChildWithName ("OSCConfig", nullptr); oscConfig.copyPropertiesFrom (oscParameterInterface.getConfig(), nullptr); std::unique_ptr xml (state.createXml()); copyXmlToBinary (*xml, destData); } void DirectionalCompressorAudioProcessor::setStateInformation (const void* data, int sizeInBytes) { std::unique_ptr xmlState (getXmlFromBinary (data, sizeInBytes)); if (xmlState.get() != nullptr) if (xmlState->hasTagName (parameters.state.getType())) { parameters.replaceState (juce::ValueTree::fromXml (*xmlState)); if (parameters.state.hasProperty ("OSCPort")) // legacy { oscParameterInterface.getOSCReceiver().connect ( parameters.state.getProperty ("OSCPort", juce::var (-1))); parameters.state.removeProperty ("OSCPort", nullptr); } auto oscConfig = parameters.state.getChildWithName ("OSCConfig"); if (oscConfig.isValid()) oscParameterInterface.setConfig (oscConfig); } } void DirectionalCompressorAudioProcessor::updateBuffers() { DBG ("IOHelper: input size: " << input.getSize()); DBG ("IOHelper: output size: " << output.getSize()); const int nChannels = input.getNumberOfChannels(); maskBuffer.setSize (nChannels, getBlockSize()); } //============================================================================== std::vector> DirectionalCompressorAudioProcessor::createParameterLayout() { // add your audio parameters here std::vector> params; params.push_back (OSCParameterInterface::createParameterTheOldWay ( "orderSetting", "Ambisonics Order", "", juce::NormalisableRange (0.0f, 8.0f, 1.0f), 0.0f, [] (float value) { if (value >= 0.5f && value < 1.5f) return "0th"; else if (value >= 1.5f && value < 2.5f) return "1st"; else if (value >= 2.5f && value < 3.5f) return "2nd"; else if (value >= 3.5f && value < 4.5f) return "3rd"; else if (value >= 4.5f && value < 5.5f) return "4th"; else if (value >= 5.5f && value < 6.5f) return "5th"; else if (value >= 6.5f && value < 7.5f) return "6th"; else if (value >= 7.5f) return "7th"; else return "Auto"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "useSN3D", "Normalization", "", juce::NormalisableRange (0.0f, 1.0f, 1.0f), 1.0f, [] (float value) { if (value >= 0.5f) return "SN3D"; else return "N3D"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "preGain", "Input Gain ", "dB", juce::NormalisableRange (-10.0f, 10.0f, 0.1f), 0.0f, [] (float value) { return juce::String (value, 1); }, nullptr)); // compressor 1 params.push_back (OSCParameterInterface::createParameterTheOldWay ( "c1Enabled", "Enable Compressor 1", "", juce::NormalisableRange (0.0f, 1.0f, 1.0f), 1.0, [] (float value) { if (value >= 0.5f) return "ON"; else return "OFF"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "c1DrivingSignal", "Compressor 1 Driving Signal", "", juce::NormalisableRange (0.0f, 2.0f, 1.0f), 1.0, [] (float value) { if (value >= 0.5f && value < 1.5f) return "Masked"; else if (value >= 1.5f) return "Unmasked"; else return "Full"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "c1Apply", "Apply compression 1 to", "", juce::NormalisableRange (0.0f, 2.0f, 1.0f), 1.0, [] (float value) { if (value >= 0.5f && value < 1.5f) return "Masked"; else if (value >= 1.5f) return "Unmasked"; else return "Full"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "c1Threshold", "Threshold 1", "dB", juce::NormalisableRange (-50.0f, 10.0f, 0.1f), -10.0, [] (float value) { return juce::String (value, 1); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "c1Knee", "Knee 1", "dB", juce::NormalisableRange (0.0f, 10.0f, 0.1f), 0.0f, [] (float value) { return juce::String (value, 1); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "c1Attack", "Attack Time 1", "ms", juce::NormalisableRange (0.0f, 100.0f, 0.1f), 30.0, [] (float value) { return juce::String (value, 1); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "c1Release", "Release Time 1", "ms", juce::NormalisableRange (0.0f, 500.0f, 0.1f), 150.0, [] (float value) { return juce::String (value, 1); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "c1Ratio", "Ratio 1", " : 1", juce::NormalisableRange (1.0f, 16.0f, .2f), 4.0, [] (float value) { if (value > 15.9f) return juce::String ("inf"); return juce::String (value, 1); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "c1Makeup", "MakeUp Gain 1", "dB", juce::NormalisableRange (-10.0f, 20.0f, 0.10f), 0.0, [] (float value) { return juce::String (value, 1); }, nullptr)); // compressor 2 params.push_back (OSCParameterInterface::createParameterTheOldWay ( "c2Enabled", "Enable Compressor 2", "", juce::NormalisableRange (0.0f, 1.0f, 1.0f), 1.0, [] (float value) { if (value >= 0.5f) return "ON"; else return "OFF"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "c2DrivingSignal", "Compressor 2 Driving Signal", "", juce::NormalisableRange (0.0f, 2.0f, 1.0f), 1.0, [] (float value) { if (value >= 0.5f && value < 1.5f) return "Masked"; else if (value >= 1.5f) return "Unmasked"; else return "Full"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "c2Apply", "Apply compression 2 to", "", juce::NormalisableRange (0.0f, 2.0f, 1.0f), 1.0, [] (float value) { if (value >= 0.5f && value < 1.5f) return "Masked"; else if (value >= 1.5f) return "Unmasked"; else return "Full"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "c2Threshold", "Threshold 2", "dB", juce::NormalisableRange (-50.0f, 10.0f, 0.1f), -10.0, [] (float value) { return juce::String (value, 1); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "c2Knee", "Knee 2", "dB", juce::NormalisableRange (0.0f, 10.0f, 0.1f), 0.0f, [] (float value) { return juce::String (value, 1); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "c2Attack", "Attack Time 2", "ms", juce::NormalisableRange (0.0f, 100.0f, 0.1f), 30.0, [] (float value) { return juce::String (value, 1); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "c2Release", "Release Time 2", "ms", juce::NormalisableRange (0.0f, 500.0f, 0.1f), 150.0, [] (float value) { return juce::String (value, 1); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "c2Ratio", "Ratio 2", " : 1", juce::NormalisableRange (1.0f, 16.0f, .2f), 4.0, [] (float value) { if (value > 15.9f) return juce::String ("inf"); return juce::String (value, 1); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "c2Makeup", "MakeUp Gain 2", "dB", juce::NormalisableRange (-10.0f, 20.0f, 0.10f), 0.0, [] (float value) { return juce::String (value, 1); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "azimuth", "Azimuth of mask", juce::CharPointer_UTF8 (R"(°)"), juce::NormalisableRange (-180.0f, 180.0f, 0.01f), 0.0, [] (float value) { return juce::String (value, 2); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "elevation", "Elevation of mask", juce::CharPointer_UTF8 (R"(°)"), juce::NormalisableRange (-180.0f, 180.0f, 0.01f), 0.0, [] (float value) { return juce::String (value, 2); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "width", "Width of mask", juce::CharPointer_UTF8 (R"(°)"), juce::NormalisableRange (10.0f, 180.0f, 0.01f), 40.0f, [] (float value) { return juce::String (value, 2); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "listen", "Listen to", "", juce::NormalisableRange (0.0f, 2.0f, 1.0f), 0.0, [] (float value) { if (value >= 0.5f && value < 1.5f) return "Masked"; else if (value >= 1.5f) return "Unmasked"; else return "Full"; }, nullptr)); return params; } //============================================================================== // This creates new instances of the plugin.. juce::AudioProcessor* JUCE_CALLTYPE createPluginFilter() { return new DirectionalCompressorAudioProcessor(); } ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/DirectionalCompressor/Source/PluginEditor.cppIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/DirectionalCompressor/Source/PluginE0000664002537200253720000006353415257173642031702 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #include "PluginEditor.h" #include "PluginProcessor.h" //============================================================================== DirectionalCompressorAudioProcessorEditor::DirectionalCompressorAudioProcessorEditor ( DirectionalCompressorAudioProcessor& p, juce::AudioProcessorValueTreeState& vts) : juce::AudioProcessorEditor (&p), processor (p), valueTreeState (vts), footer (p.getOSCParameterInterface()), sphereElem (*valueTreeState.getParameter ("azimuth"), valueTreeState.getParameterRange ("azimuth"), *valueTreeState.getParameter ("elevation"), valueTreeState.getParameterRange ("elevation")) { // Make sure that before the constructor has finished, you've set the // editor's size to whatever you need it to be. setSize (550, 445); setLookAndFeel (&globalLaF); addAndMakeVisible (&title); title.setTitle ("Directional", "Compressor"); title.setFont (globalLaF.robotoBold, globalLaF.robotoLight); addAndMakeVisible (&footer); addAndMakeVisible (&sphere); sphere.addElement (&sphereElem); cbNormalizationAtachement.reset ( new ComboBoxAttachment (valueTreeState, "useSN3D", *title.getInputWidgetPtr()->getNormCbPointer())); cbOrderAtachement.reset ( new ComboBoxAttachment (valueTreeState, "orderSetting", *title.getInputWidgetPtr()->getOrderCbPointer())); // ======== general components =========== addAndMakeVisible (&gcMask); gcMask.setText ("Spatial mask properties"); gcMask.setTextLabelPosition (juce::Justification::centredLeft); gcMask.setColour (juce::GroupComponent::outlineColourId, globalLaF.ClSeperator); gcMask.setColour (juce::GroupComponent::textColourId, juce::Colours::white); gcMask.setVisible (true); addAndMakeVisible (&gcSettings); gcSettings.setText ("General settings"); gcSettings.setTextLabelPosition (juce::Justification::centredLeft); gcSettings.setColour (juce::GroupComponent::outlineColourId, globalLaF.ClSeperator); gcSettings.setColour (juce::GroupComponent::textColourId, juce::Colours::white); gcSettings.setVisible (true); addAndMakeVisible (&slPreGain); slPreGainAttachment.reset (new SliderAttachment (valueTreeState, "preGain", slPreGain)); slPreGain.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); slPreGain.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); slPreGain.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[1]); slPreGain.setTooltip ("PreGain"); addAndMakeVisible (&slAzimuth); slAzimuthAttachment.reset (new SliderAttachment (valueTreeState, "azimuth", slAzimuth)); slAzimuth.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); slAzimuth.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); slAzimuth.setReverse (true); slAzimuth.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[0]); slAzimuth.setRotaryParameters (juce::MathConstants::pi, 3 * juce::MathConstants::pi, false); slAzimuth.setTooltip ("Azimuth angle of the spatial mask"); addAndMakeVisible (&slElevation); slElevationAttachment.reset (new SliderAttachment (valueTreeState, "elevation", slElevation)); slElevation.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); slElevation.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); slElevation.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[1]); slElevation.setRotaryParameters (0.5 * juce::MathConstants::pi, 2.5 * juce::MathConstants::pi, false); slElevation.setTooltip ("Elevation angle of the spatial mask"); addAndMakeVisible (&slWidth); slWidthAttachment.reset (new SliderAttachment (valueTreeState, "width", slWidth)); slWidth.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); slWidth.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); slWidth.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[2]); slWidth.setTooltip ("Width of the spatial mask"); addAndMakeVisible (&cbListen); cbListenAttachment.reset (new ComboBoxAttachment (valueTreeState, "listen", cbListen)); cbListen.setJustificationType (juce::Justification::centred); cbListen.addSectionHeading ("Listen to"); cbListen.addItem ("Full", 1); cbListen.addItem ("Masked", 2); cbListen.addItem ("Unmasked", 3); cbListen.setSelectedId (*valueTreeState.getRawParameterValue ("listen") + 1); // ======== compressor 1 components =========== bool isOn = *valueTreeState.getRawParameterValue ("c1Enabled"); addAndMakeVisible (&gcC1); gcC1.setText ("Compressor 1"); gcC1.setTextLabelPosition (juce::Justification::centredLeft); gcC1.setColour (juce::GroupComponent::outlineColourId, globalLaF.ClSeperator); gcC1.setColour (juce::GroupComponent::textColourId, juce::Colours::white); gcC1.setVisible (true); addAndMakeVisible (&tbC1); tbC1Attachment.reset (new ButtonAttachment (valueTreeState, "c1Enabled", tbC1)); tbC1.setColour (juce::ToggleButton::tickColourId, globalLaF.ClWidgetColours[0]); tbC1.setButtonText ("ON/OFF"); tbC1.setName ("C1"); tbC1.addListener (this); addAndMakeVisible (&cbC1Driving); cbC1DrivingAttachment.reset ( new ComboBoxAttachment (valueTreeState, "c1DrivingSignal", cbC1Driving)); cbC1Driving.setJustificationType (juce::Justification::centred); cbC1Driving.addSectionHeading ("Driving signa"); cbC1Driving.addItem ("Full", 1); cbC1Driving.addItem ("Masked", 2); cbC1Driving.addItem ("Unmasked", 3); cbC1Driving.setSelectedId (*valueTreeState.getRawParameterValue ("c1DrivingSignal") + 1); cbC1Driving.setEnabled (isOn); addAndMakeVisible (&cbC1Apply); cbC1ApplyAttachment.reset (new ComboBoxAttachment (valueTreeState, "c1Apply", cbC1Apply)); cbC1Apply.setJustificationType (juce::Justification::centred); cbC1Apply.addSectionHeading ("Apply to"); cbC1Apply.addItem ("Full", 1); cbC1Apply.addItem ("Masked", 2); cbC1Apply.addItem ("Unmasked", 3); cbC1Apply.setSelectedId (*valueTreeState.getRawParameterValue ("c1Apply") + 1); cbC1Apply.setEnabled (isOn); addAndMakeVisible (&slC1Threshold); slC1ThresholdAttachment.reset ( new SliderAttachment (valueTreeState, "c1Threshold", slC1Threshold)); slC1Threshold.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); slC1Threshold.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); slC1Threshold.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[2]); slC1Threshold.setTextValueSuffix (" dB"); slC1Threshold.setEnabled (isOn); addAndMakeVisible (&slC1Knee); slC1KneeAttachment.reset (new SliderAttachment (valueTreeState, "c1Knee", slC1Knee)); slC1Knee.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); slC1Knee.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); slC1Knee.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[2]); slC1Knee.setEnabled (isOn); addAndMakeVisible (&slC1Ratio); slC1RatioAttachment.reset (new SliderAttachment (valueTreeState, "c1Ratio", slC1Ratio)); slC1Ratio.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); slC1Ratio.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); slC1Ratio.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[3]); slC1Ratio.setTextValueSuffix (" : 1"); slC1Ratio.setEnabled (isOn); addAndMakeVisible (&slC1Attack); slC1AttackAttachment.reset (new SliderAttachment (valueTreeState, "c1Attack", slC1Attack)); slC1Attack.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); slC1Attack.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); slC1Attack.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[0]); slC1Attack.setTextValueSuffix (" ms"); slC1Attack.setEnabled (isOn); addAndMakeVisible (&slC1Release); slC1ReleaseAttachment.reset (new SliderAttachment (valueTreeState, "c1Release", slC1Release)); slC1Release.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); slC1Release.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); slC1Release.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[0]); slC1Release.setEnabled (isOn); addAndMakeVisible (&slC1Makeup); slC1MakeupAttachment.reset (new SliderAttachment (valueTreeState, "c1Makeup", slC1Makeup)); slC1Makeup.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); slC1Makeup.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); slC1Makeup.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[1]); slC1Makeup.setEnabled (isOn); addAndMakeVisible (&dbC1GRmeter); dbC1GRmeter.setMinLevel (-25.0f); dbC1GRmeter.setColour (juce::Colours::red.withMultipliedAlpha (0.8f)); dbC1GRmeter.setGainReductionMeter (true); dbC1GRmeter.setEnabled (isOn); addAndMakeVisible (&dbC1RMSmeter); dbC1RMSmeter.setMinLevel (-60.0f); dbC1RMSmeter.setColour (juce::Colours::green.withMultipliedAlpha (0.8f)); dbC1RMSmeter.setGainReductionMeter (false); dbC1RMSmeter.setEnabled (isOn); addAndMakeVisible (&lbC1Threshold); lbC1Threshold.setText ("Threshold"); lbC1Threshold.setEnabled (isOn); addAndMakeVisible (&lbC1Knee); lbC1Knee.setText ("Knee"); lbC1Knee.setEnabled (isOn); addAndMakeVisible (&lbC1Ratio); lbC1Ratio.setText ("Ratio"); lbC1Ratio.setEnabled (isOn); addAndMakeVisible (&lbC1Attack); lbC1Attack.setText ("Attack"); lbC1Attack.setEnabled (isOn); addAndMakeVisible (&lbC1Release); lbC1Release.setText ("Release"); lbC1Release.setEnabled (isOn); addAndMakeVisible (&lbC1Makeup); lbC1Makeup.setText ("MakeUp"); lbC1Makeup.setEnabled (isOn); // ======== compressor 2 components =========== isOn = *valueTreeState.getRawParameterValue ("c2Enabled"); addAndMakeVisible (&gcC2); gcC2.setText ("Compressor 2"); gcC2.setTextLabelPosition (juce::Justification::centredLeft); gcC2.setColour (juce::GroupComponent::outlineColourId, globalLaF.ClSeperator); gcC2.setColour (juce::GroupComponent::textColourId, juce::Colours::white); gcC2.setVisible (true); addAndMakeVisible (&tbC2); tbC2Attachment.reset (new ButtonAttachment (valueTreeState, "c2Enabled", tbC2)); tbC2.setColour (juce::ToggleButton::tickColourId, globalLaF.ClWidgetColours[0]); tbC2.setButtonText ("ON/OFF"); tbC2.setName ("C2"); tbC2.addListener (this); addAndMakeVisible (&cbC2Driving); cbC2DrivingAttachment.reset ( new ComboBoxAttachment (valueTreeState, "c2DrivingSignal", cbC2Driving)); cbC2Driving.setJustificationType (juce::Justification::centred); cbC2Driving.addSectionHeading ("Driving signal"); cbC2Driving.addItem ("Full", 1); cbC2Driving.addItem ("Masked", 2); cbC2Driving.addItem ("Unmasked", 3); cbC2Driving.setSelectedId (*valueTreeState.getRawParameterValue ("c2DrivingSignal") + 1); cbC2Driving.setEnabled (isOn); addAndMakeVisible (&cbC2Apply); cbC2ApplyAttachment.reset (new ComboBoxAttachment (valueTreeState, "c2Apply", cbC2Apply)); cbC2Apply.setJustificationType (juce::Justification::centred); cbC2Apply.addSectionHeading ("Apply to"); cbC2Apply.addItem ("Full", 1); cbC2Apply.addItem ("Masked", 2); cbC2Apply.addItem ("Unmasked", 3); cbC2Apply.setSelectedId (*valueTreeState.getRawParameterValue ("c2Apply") + 1); cbC2Apply.setEnabled (isOn); addAndMakeVisible (&slC2Threshold); slC2ThresholdAttachment.reset ( new SliderAttachment (valueTreeState, "c2Threshold", slC2Threshold)); slC2Threshold.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); slC2Threshold.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); slC2Threshold.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[2]); slC2Threshold.setTextValueSuffix (" dB"); slC2Threshold.setEnabled (isOn); addAndMakeVisible (&slC2Knee); slC2KneeAttachment.reset (new SliderAttachment (valueTreeState, "c2Knee", slC2Knee)); slC2Knee.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); slC2Knee.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); slC2Knee.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[2]); slC2Knee.setEnabled (isOn); addAndMakeVisible (&slC2Ratio); slC2RatioAttachment.reset (new SliderAttachment (valueTreeState, "c2Ratio", slC2Ratio)); slC2Ratio.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); slC2Ratio.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); slC2Ratio.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[3]); slC2Ratio.setTextValueSuffix (" : 1"); slC2Ratio.setEnabled (isOn); addAndMakeVisible (&slC2Attack); slC2AttackAttachment.reset (new SliderAttachment (valueTreeState, "c2Attack", slC2Attack)); slC2Attack.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); slC2Attack.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); slC2Attack.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[0]); slC2Attack.setTextValueSuffix (" ms"); slC2Attack.setEnabled (isOn); addAndMakeVisible (&slC2Release); slC2ReleaseAttachment.reset (new SliderAttachment (valueTreeState, "c2Release", slC2Release)); slC2Release.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); slC2Release.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); slC2Release.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[0]); slC2Release.setTextValueSuffix (" ms"); slC2Release.setEnabled (isOn); addAndMakeVisible (&slC2Makeup); slC2MakeupAttachment.reset (new SliderAttachment (valueTreeState, "c2Makeup", slC2Makeup)); slC2Makeup.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); slC2Makeup.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); slC2Makeup.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[1]); slC2Makeup.setTextValueSuffix (" dB"); slC2Makeup.setEnabled (isOn); addAndMakeVisible (&dbC2GRmeter); dbC2GRmeter.setMinLevel (-25.0f); dbC2GRmeter.setColour (juce::Colours::red.withMultipliedAlpha (0.8f)); dbC2GRmeter.setGainReductionMeter (true); dbC2GRmeter.setEnabled (isOn); addAndMakeVisible (&dbC2RMSmeter); dbC2RMSmeter.setMinLevel (-60.0f); dbC2RMSmeter.setColour (juce::Colours::green.withMultipliedAlpha (0.8f)); dbC2RMSmeter.setGainReductionMeter (false); dbC2RMSmeter.setEnabled (isOn); addAndMakeVisible (&lbC2Threshold); lbC2Threshold.setText ("Threshold"); lbC2Threshold.setEnabled (isOn); addAndMakeVisible (&lbC2Knee); lbC2Knee.setText ("Knee"); lbC2Knee.setEnabled (isOn); addAndMakeVisible (&lbC2Ratio); lbC2Ratio.setText ("Ratio"); lbC2Ratio.setEnabled (isOn); addAndMakeVisible (&lbC2Attack); lbC2Attack.setText ("Attack"); lbC2Attack.setEnabled (isOn); addAndMakeVisible (&lbC2Release); lbC2Release.setText ("Release"); lbC2Release.setEnabled (isOn); addAndMakeVisible (&lbC2Makeup); lbC2Makeup.setText ("MakeUp"); lbC2Makeup.setEnabled (isOn); // ===== LABELS ===== addAndMakeVisible (&lbPreGain); lbPreGain.setText ("Pre Gain"); addAndMakeVisible (&lbAzimuth); lbAzimuth.setText ("Azimuth"); addAndMakeVisible (&lbElevation); lbElevation.setText ("Elevation"); addAndMakeVisible (&lbWidth); lbWidth.setText ("Width"); startTimer (50); } DirectionalCompressorAudioProcessorEditor::~DirectionalCompressorAudioProcessorEditor() { setLookAndFeel (nullptr); } void DirectionalCompressorAudioProcessorEditor::buttonStateChanged (juce::Button* button) { bool isOn = button->getToggleState(); if (button->getName() == "C1") { slC1Threshold.setEnabled (isOn); slC1Knee.setEnabled (isOn); slC1Ratio.setEnabled (isOn); slC1Attack.setEnabled (isOn); slC1Release.setEnabled (isOn); slC1Makeup.setEnabled (isOn); lbC1Threshold.setEnabled (isOn); lbC1Knee.setEnabled (isOn); lbC1Ratio.setEnabled (isOn); lbC1Attack.setEnabled (isOn); lbC1Release.setEnabled (isOn); lbC1Makeup.setEnabled (isOn); cbC1Driving.setEnabled (isOn); cbC1Apply.setEnabled (isOn); ; } else if (button->getName() == "C2") { slC2Threshold.setEnabled (isOn); slC2Knee.setEnabled (isOn); slC2Ratio.setEnabled (isOn); slC2Attack.setEnabled (isOn); slC2Release.setEnabled (isOn); slC2Makeup.setEnabled (isOn); lbC2Threshold.setEnabled (isOn); lbC2Knee.setEnabled (isOn); lbC2Ratio.setEnabled (isOn); lbC2Attack.setEnabled (isOn); lbC2Release.setEnabled (isOn); lbC2Makeup.setEnabled (isOn); cbC2Driving.setEnabled (isOn); cbC2Apply.setEnabled (isOn); ; } }; //============================================================================== void DirectionalCompressorAudioProcessorEditor::paint (juce::Graphics& g) { // (Our component is opaque, so we must completely fill the background with a solid colour) g.fillAll (globalLaF.ClBackground); } void DirectionalCompressorAudioProcessorEditor::timerCallback() { // === update titleBar widgets according to available input/output channel counts auto sizes = processor.getMaxSize(); sizes.first = juce::jmin (sizes.first, sizes.second); sizes.second = sizes.first; title.setMaxSize (sizes); // ========================================== if (processor.updatedPositionData.get()) { processor.updatedPositionData = false; sphere.repaint(); } dbC1RMSmeter.setLevel (processor.c1MaxRMS); dbC1GRmeter.setLevel (processor.c1MaxGR); dbC2RMSmeter.setLevel (processor.c2MaxRMS); dbC2GRmeter.setLevel (processor.c2MaxGR); } void DirectionalCompressorAudioProcessorEditor::resized() { const int leftRightMargin = 30; const int headerHeight = 60; const int footerHeight = 25; const int sliderWidth = 45; // const int labelHeight = 15; // const int sliderHeight = 60; const int sliderSpacing = 15; juce::Rectangle area (getLocalBounds()); juce::Rectangle footerArea (area.removeFromBottom (footerHeight)); footer.setBounds (footerArea); area.removeFromLeft (leftRightMargin); area.removeFromRight (leftRightMargin); juce::Rectangle headerArea = area.removeFromTop (headerHeight); title.setBounds (headerArea); area.removeFromTop (10); juce::Rectangle temp; //work area juce::Rectangle sliderRow; juce::Rectangle comprRow; comprRow = area.removeFromBottom (200); // ======== compressor 1 { temp = comprRow.removeFromLeft (225); gcC1.setBounds (temp); sliderRow = temp.removeFromTop (15); sliderRow.removeFromRight (60); tbC1.setBounds (sliderRow.removeFromRight (40)); temp.removeFromTop (10); // dbMeters dbC1RMSmeter.setBounds (temp.removeFromLeft (20)); temp.removeFromLeft (10); dbC1GRmeter.setBounds (temp.removeFromRight (20)); temp.removeFromRight (10); // comboBoxes sliderRow = temp.removeFromTop (15); cbC1Driving.setBounds (sliderRow.removeFromLeft (75)); cbC1Apply.setBounds (sliderRow.removeFromRight (75)); temp.removeFromTop (5); //spacing //first juce::Sliders sliderRow = temp.removeFromTop (60); slC1Threshold.setBounds (sliderRow.removeFromLeft (45)); sliderRow.removeFromLeft (sliderSpacing); slC1Knee.setBounds (sliderRow.removeFromLeft (45)); sliderRow.removeFromLeft (sliderSpacing); slC1Makeup.setBounds (sliderRow.removeFromLeft (45)); sliderRow = temp.removeFromTop (15); lbC1Threshold.setBounds (sliderRow.removeFromLeft (50)); sliderRow.removeFromLeft (sliderSpacing - 5); lbC1Knee.setBounds (sliderRow.removeFromLeft (45)); sliderRow.removeFromLeft (sliderSpacing); lbC1Makeup.setBounds (sliderRow.removeFromLeft (45)); temp.removeFromTop (5); //spacing // next juce::Sliders sliderRow = temp.removeFromTop (60); slC1Ratio.setBounds (sliderRow.removeFromLeft (45)); sliderRow.removeFromLeft (sliderSpacing); slC1Attack.setBounds (sliderRow.removeFromLeft (45)); sliderRow.removeFromLeft (sliderSpacing); slC1Release.setBounds (sliderRow.removeFromLeft (45)); sliderRow = temp.removeFromTop (15); lbC1Ratio.setBounds (sliderRow.removeFromLeft (45)); sliderRow.removeFromLeft (sliderSpacing); lbC1Attack.setBounds (sliderRow.removeFromLeft (45)); sliderRow.removeFromLeft (sliderSpacing); lbC1Release.setBounds (sliderRow.removeFromLeft (45)); } // ======== compressor 2 { temp = comprRow.removeFromRight (225); gcC2.setBounds (temp); sliderRow = temp.removeFromTop (15); sliderRow.removeFromRight (60); tbC2.setBounds (sliderRow.removeFromRight (40)); temp.removeFromTop (10); // dbMeters dbC2RMSmeter.setBounds (temp.removeFromLeft (20)); temp.removeFromLeft (10); dbC2GRmeter.setBounds (temp.removeFromRight (20)); temp.removeFromRight (10); // comboBoxes sliderRow = temp.removeFromTop (15); cbC2Driving.setBounds (sliderRow.removeFromLeft (75)); cbC2Apply.setBounds (sliderRow.removeFromRight (75)); temp.removeFromTop (5); //spacing //first juce::Sliders sliderRow = temp.removeFromTop (60); slC2Threshold.setBounds (sliderRow.removeFromLeft (45)); sliderRow.removeFromLeft (sliderSpacing); slC2Knee.setBounds (sliderRow.removeFromLeft (45)); sliderRow.removeFromLeft (sliderSpacing); slC2Makeup.setBounds (sliderRow.removeFromLeft (45)); sliderRow = temp.removeFromTop (15); lbC2Threshold.setBounds (sliderRow.removeFromLeft (50)); sliderRow.removeFromLeft (sliderSpacing - 5); lbC2Knee.setBounds (sliderRow.removeFromLeft (45)); sliderRow.removeFromLeft (sliderSpacing); lbC2Makeup.setBounds (sliderRow.removeFromLeft (45)); temp.removeFromTop (5); //spacing // next juce::Sliders sliderRow = temp.removeFromTop (60); slC2Ratio.setBounds (sliderRow.removeFromLeft (45)); sliderRow.removeFromLeft (sliderSpacing); slC2Attack.setBounds (sliderRow.removeFromLeft (45)); sliderRow.removeFromLeft (sliderSpacing); slC2Release.setBounds (sliderRow.removeFromLeft (45)); sliderRow = temp.removeFromTop (15); lbC2Ratio.setBounds (sliderRow.removeFromLeft (45)); sliderRow.removeFromLeft (sliderSpacing); lbC2Attack.setBounds (sliderRow.removeFromLeft (45)); sliderRow.removeFromLeft (sliderSpacing); lbC2Release.setBounds (sliderRow.removeFromLeft (45)); } area.removeFromBottom (10); //spacing int height = area.getHeight(); sphere.setBounds (area.removeFromLeft (height)); area.removeFromLeft (10); //spacing temp = area.removeFromLeft (165); // MASK PROPERTIES gcMask.setBounds (temp); temp.removeFromTop (25); //spacing sliderRow = temp.removeFromTop (60); slAzimuth.setBounds (sliderRow.removeFromLeft (sliderWidth)); sliderRow.removeFromLeft (sliderSpacing); slElevation.setBounds (sliderRow.removeFromLeft (sliderWidth)); sliderRow.removeFromLeft (sliderSpacing); slWidth.setBounds (sliderRow.removeFromLeft (sliderWidth)); sliderRow = temp.removeFromTop (15); lbAzimuth.setBounds (sliderRow.removeFromLeft (sliderWidth)); sliderRow.removeFromLeft (sliderSpacing); lbElevation.setBounds (sliderRow.removeFromLeft (sliderWidth)); sliderRow.removeFromLeft (sliderSpacing); lbWidth.setBounds (sliderRow.removeFromLeft (sliderWidth)); area.removeFromLeft (30); //spacing // GENERAL SETTINGS gcSettings.setBounds (area); area.removeFromTop (25); //spacing temp = area.removeFromLeft (sliderWidth); sliderRow = temp.removeFromTop (60); slPreGain.setBounds (sliderRow.removeFromLeft (sliderWidth)); sliderRow = temp.removeFromTop (15); lbPreGain.setBounds (sliderRow.removeFromLeft (sliderWidth)); area.removeFromLeft (15); //spacing cbListen.setBounds (area.removeFromTop (15)); } ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/DirectionalCompressor/Source/PluginProcessor.hIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/DirectionalCompressor/Source/PluginP0000664002537200253720000001162315257173642031705 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once #include "../../resources/AudioProcessorBase.h" #include "../../resources/Compressor.h" #include "../../resources/Conversions.h" #include "../../resources/ambisonicTools.h" #include "../../resources/efficientSHvanilla.h" #include "../../resources/tDesignN7.h" #include "../JuceLibraryCode/JuceHeader.h" #define ProcessorClass DirectionalCompressorAudioProcessor //============================================================================== /** */ class DirectionalCompressorAudioProcessor : public AudioProcessorBase, IOTypes::Ambisonics<>> { public: constexpr static int numberOfInputChannels = 64; constexpr static int numberOfOutputChannels = 64; //============================================================================== DirectionalCompressorAudioProcessor(); ~DirectionalCompressorAudioProcessor(); //============================================================================== void prepareToPlay (double sampleRate, int samplesPerBlock) override; void releaseResources() override; void processBlock (juce::AudioSampleBuffer&, juce::MidiBuffer&) override; //============================================================================== juce::AudioProcessorEditor* createEditor() override; bool hasEditor() const override; //============================================================================== int getNumPrograms() override; int getCurrentProgram() override; void setCurrentProgram (int index) override; const juce::String getProgramName (int index) override; void changeProgramName (int index, const juce::String& newName) override; //============================================================================== void getStateInformation (juce::MemoryBlock& destData) override; void setStateInformation (const void* data, int sizeInBytes) override; //======= Parameters =========================================================== std::vector> createParameterLayout(); //============================================================================== void parameterChanged (const juce::String& parameterID, float newValue) override; float c1MaxRMS; float c1MaxGR; float c2MaxRMS; float c2MaxGR; void calcParams(); juce::Atomic updatedPositionData; private: //============================================================================== void updateBuffers() override; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DirectionalCompressorAudioProcessor) juce::AudioBuffer omniW; juce::AudioBuffer maskBuffer; juce::dsp::Matrix Y; juce::dsp::Matrix YH; juce::dsp::Matrix tempMat; juce::dsp::Matrix P1; float dist[tDesignN]; const float* drivingPointers[3]; juce::Array c1Gains; juce::Array c2Gains; float c1GR; float c2GR; std::atomic paramChanged { true }; iem::Compressor compressor1, compressor2; // == PARAMETERS == // settings and mask std::atomic* orderSetting; std::atomic* useSN3D; std::atomic* preGain; std::atomic* azimuth; std::atomic* elevation; std::atomic* width; std::atomic* listen; // compressor 1 std::atomic* c1Enabled; std::atomic* c1DrivingSignal; std::atomic* c1Apply; std::atomic* c1Threshold; std::atomic* c1Knee; std::atomic* c1Attack; std::atomic* c1Release; std::atomic* c1Ratio; std::atomic* c1Makeup; // compressor 2 std::atomic* c2Enabled; std::atomic* c2DrivingSignal; std::atomic* c2Apply; std::atomic* c2Threshold; std::atomic* c2Knee; std::atomic* c2Attack; std::atomic* c2Release; std::atomic* c2Ratio; std::atomic* c2Makeup; }; ././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/DirectionalCompressor/Source/PluginEditor.hIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/DirectionalCompressor/Source/PluginE0000664002537200253720000001130015257173642031662 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once #include "../JuceLibraryCode/JuceHeader.h" #include "PluginProcessor.h" #include "../../resources/customComponents/LevelMeter.h" #include "../../resources/customComponents/ReverseSlider.h" #include "../../resources/customComponents/SimpleLabel.h" #include "../../resources/customComponents/SpherePanner.h" #include "../../resources/customComponents/TitleBar.h" #include "../../resources/lookAndFeel/IEM_LaF.h" typedef ReverseSlider::SliderAttachment SliderAttachment; typedef juce::AudioProcessorValueTreeState::ComboBoxAttachment ComboBoxAttachment; typedef juce::AudioProcessorValueTreeState::ButtonAttachment ButtonAttachment; //============================================================================== /** */ class DirectionalCompressorAudioProcessorEditor : public juce::AudioProcessorEditor, private juce::Timer, private juce::Button::Listener { public: DirectionalCompressorAudioProcessorEditor (DirectionalCompressorAudioProcessor&, juce::AudioProcessorValueTreeState&); ~DirectionalCompressorAudioProcessorEditor(); //============================================================================== void paint (juce::Graphics&) override; void resized() override; void buttonStateChanged (juce::Button* button) override; void buttonClicked (juce::Button* button) override {}; private: LaF globalLaF; DirectionalCompressorAudioProcessor& processor; juce::AudioProcessorValueTreeState& valueTreeState; TitleBar, NoIOWidget> title; OSCFooter footer; SpherePanner sphere; SpherePanner::AzimuthElevationParameterElement sphereElem; int maxPossibleOrder = -1; std::unique_ptr cbNormalizationAtachement; std::unique_ptr cbOrderAtachement; void timerCallback() override; juce::GroupComponent gcMask; juce::GroupComponent gcSettings; juce::GroupComponent gcC1; juce::GroupComponent gcC2; juce::ToggleButton tbC1; juce::ToggleButton tbC2; ReverseSlider slPreGain, slAzimuth, slElevation, slWidth; ReverseSlider slC1Threshold, slC1Knee, slC1Ratio, slC1Attack, slC1Release, slC1Makeup; ReverseSlider slC2Threshold, slC2Knee, slC2Ratio, slC2Attack, slC2Release, slC2Makeup; juce::ComboBox cbC1Driving, cbC1Apply; juce::ComboBox cbC2Driving, cbC2Apply; juce::ComboBox cbListen; std::unique_ptr slPreGainAttachment, slAzimuthAttachment, slElevationAttachment, slWidthAttachment; std::unique_ptr slC1ThresholdAttachment, slC1KneeAttachment, slC1RatioAttachment; std::unique_ptr slC1AttackAttachment, slC1ReleaseAttachment, slC1MakeupAttachment; std::unique_ptr slC2ThresholdAttachment, slC2KneeAttachment, slC2RatioAttachment; std::unique_ptr slC2AttackAttachment, slC2ReleaseAttachment, slC2MakeupAttachment; std::unique_ptr cbC1DrivingAttachment, cbC1ApplyAttachment; std::unique_ptr cbC2DrivingAttachment, cbC2ApplyAttachment; std::unique_ptr cbListenAttachment; std::unique_ptr tbC1Attachment, tbC2Attachment; LevelMeter dbC1GRmeter, dbC1RMSmeter; LevelMeter dbC2GRmeter, dbC2RMSmeter; SimpleLabel lbPreGain, lbAzimuth, lbElevation, lbWidth; SimpleLabel lbC1Threshold, lbC1Knee, lbC1Ratio, lbC1Attack, lbC1Release, lbC1Makeup; SimpleLabel lbC2Threshold, lbC2Knee, lbC2Ratio, lbC2Attack, lbC2Release, lbC2Makeup; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DirectionalCompressorAudioProcessorEditor) }; IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/DirectionalCompressor/CMakeLists.txt0000664002537200253720000000375615257173642031714 0ustar zmoelnigzmoelnigset (PLUGIN_TARGET "") if (IEM_FORMATS) juce_add_plugin (DirectionalCompressor PLUGIN_MANUFACTURER_CODE IEMA PLUGIN_CODE DiCo ICON_BIG "../resources/Standalone/IEMPluginSuiteSmall.png" ICON_SMALL "../resources/Standalone/IEMPluginSuiteSmall.png" COMPANY_NAME "IEM" PRODUCT_NAME "DirectionalCompressor" FORMATS ${IEM_FORMATS} VERSION ${DirectionalCompressor_VERSION} LV2URI "http://plugins.iem.at/DirectionalCompressor" VST2_CATEGORY kPlugSurroundFx kPlugCategSpacializer kPlugCategEffect VST3_CATEGORIES Spatial Surround Dynamics Fx AAX_CATEGORY SoundField Dynamics) list (APPEND PLUGIN_TARGET DirectionalCompressor) endif() foreach (TARGET IN LISTS PLUGIN_TARGET) juce_generate_juce_header (${TARGET}) target_sources (${TARGET} PRIVATE Source/PluginEditor.cpp Source/PluginEditor.h Source/PluginProcessor.cpp Source/PluginProcessor.h ../resources/OSC/OSCInputStream.h ../resources/OSC/OSCParameterInterface.cpp ../resources/OSC/OSCParameterInterface.h ../resources/OSC/OSCStatus.cpp ../resources/OSC/OSCStatus.h ../resources/OSC/OSCUtilities.h ../resources/efficientSHvanilla.cpp ) target_compile_definitions (${TARGET} PRIVATE JUCE_USE_CURL=0 JUCE_WEB_BROWSER=0 JUCE_USE_CUSTOM_PLUGIN_STANDALONE_APP=1 JUCE_USE_FLAC=0 JUCE_USE_OGGVORBIS=0 JUCE_USE_MP3AUDIOFORMAT=0 JUCE_USE_LAME_AUDIO_FORMAT=0 JUCE_USE_WINDOWS_MEDIA_FORMAT=0 JUCE_VST3_CAN_REPLACE_VST2=0) target_include_directories (${TARGET} PRIVATE Source) target_link_libraries (${TARGET} PRIVATE LAF_fonts IEM_logo juce::juce_audio_utils juce::juce_audio_plugin_client juce::juce_osc juce::juce_dsp juce::juce_opengl juce::juce_recommended_config_flags juce::juce_recommended_lto_flags) endforeach() IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/BinauralDecoder/0000775002537200253720000000000015257173642025652 5ustar zmoelnigzmoelnigIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/BinauralDecoder/Source/0000775002537200253720000000000015257173642027112 5ustar zmoelnigzmoelnig././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/BinauralDecoder/Source/PluginProcessor.cppIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/BinauralDecoder/Source/PluginProcess0000664002537200253720000005232415257173642031640 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #include "PluginProcessor.h" #include "PluginEditor.h" #include #include const juce::StringArray BinauralDecoderAudioProcessor::headphoneEQs = juce::StringArray ("AKG-K141MK2", "AKG-K240DF", "AKG-K240MK2", "AKG-K271MK2", "AKG-K271STUDIO", "AKG-K601", "AKG-K701", "AKG-K702", "AKG-K1000-Closed", "AKG-K1000-Open", "AudioTechnica-ATH-M50", "Beyerdynamic-DT250", "Beyerdynamic-DT770PRO-250Ohms", "Beyerdynamic-DT880", "Beyerdynamic-DT990PRO", "Presonus-HD7", "Sennheiser-HD430", "Sennheiser-HD480", "Sennheiser-HD560ovationII", "Sennheiser-HD565ovation", "Sennheiser-HD600", "Sennheiser-HD650", "SHURE-SRH940"); //============================================================================== BinauralDecoderAudioProcessor::BinauralDecoderAudioProcessor() : AudioProcessorBase ( #ifndef JucePlugin_PreferredChannelConfigurations BusesProperties() #if ! JucePlugin_IsMidiEffect #if ! JucePlugin_IsSynth .withInput ("Input", ((juce::PluginHostType::getPluginLoadedAs() == juce::AudioProcessor::wrapperType_VST3) ? juce::AudioChannelSet::ambisonic (1) : juce::AudioChannelSet::ambisonic (7)), true) #endif .withOutput ("Output", juce::AudioChannelSet::stereo(), true) #endif , #endif createParameterLayout()) { // get pointers to the parameters inputOrderSetting = parameters.getRawParameterValue ("inputOrderSetting"); useSN3D = parameters.getRawParameterValue ("useSN3D"); applyHeadphoneEq = parameters.getRawParameterValue ("applyHeadphoneEq"); // add listeners to parameter changes parameters.addParameterListener ("inputOrderSetting", this); parameters.addParameterListener ("applyHeadphoneEq", this); // load IRs juce::AudioFormatManager formatManager; formatManager.registerBasicFormats(); juce::WavAudioFormat wavFormat; juce::MemoryInputStream* mis[7]; mis[0] = new juce::MemoryInputStream (IRData::irsOrd1_wav, IRData::irsOrd1_wavSize, false); mis[1] = new juce::MemoryInputStream (IRData::irsOrd2_wav, IRData::irsOrd2_wavSize, false); mis[2] = new juce::MemoryInputStream (IRData::irsOrd3_wav, IRData::irsOrd3_wavSize, false); mis[3] = new juce::MemoryInputStream (IRData::irsOrd4_wav, IRData::irsOrd4_wavSize, false); mis[4] = new juce::MemoryInputStream (IRData::irsOrd5_wav, IRData::irsOrd5_wavSize, false); mis[5] = new juce::MemoryInputStream (IRData::irsOrd6_wav, IRData::irsOrd6_wavSize, false); mis[6] = new juce::MemoryInputStream (IRData::irsOrd7_wav, IRData::irsOrd7_wavSize, false); for (int i = 0; i < 7; ++i) { irs[i].setSize (juce::square (i + 2), irLength); std::unique_ptr reader (wavFormat.createReaderFor (mis[i], true)); reader->read (&irs[i], 0, irLength, 0, true, false); irs[i].applyGain (0.3f); } } BinauralDecoderAudioProcessor::~BinauralDecoderAudioProcessor() { } int BinauralDecoderAudioProcessor::getNumPrograms() { return 1; // NB: some hosts don't cope very well if you tell them there are 0 programs, // so this should be at least 1, even if you're not really implementing programs. } int BinauralDecoderAudioProcessor::getCurrentProgram() { return 0; } void BinauralDecoderAudioProcessor::setCurrentProgram (int index) { } const juce::String BinauralDecoderAudioProcessor::getProgramName (int index) { return {}; } void BinauralDecoderAudioProcessor::changeProgramName (int index, const juce::String& newName) { } //============================================================================== void BinauralDecoderAudioProcessor::prepareToPlay (double sampleRate, int samplesPerBlock) { checkInputAndOutput (this, *inputOrderSetting, 0, true); juce::dsp::ProcessSpec convSpec; convSpec.sampleRate = sampleRate; convSpec.maximumBlockSize = samplesPerBlock; convSpec.numChannels = 2; // convolve two channels (which actually point two one and the same input channel) EQ.prepare (convSpec); } void BinauralDecoderAudioProcessor::releaseResources() { // When playback stops, you can use this as an opportunity to free up any // spare memory, etc. } void BinauralDecoderAudioProcessor::processBlock (juce::AudioBuffer& buffer, juce::MidiBuffer& midiMessages) { checkInputAndOutput (this, *inputOrderSetting, 0, false); juce::ScopedNoDenormals noDenormals; if (buffer.getNumChannels() < 2) { buffer.clear(); return; } const int nCh = juce::jmin (buffer.getNumChannels(), input.getNumberOfChannels()); const int L = buffer.getNumSamples(); const int ergL = overlapBuffer.getNumSamples(); const int overlap = irLengthMinusOne; const int copyL = juce::jmin (L, overlap); // copy max L samples of the overlap data if (*useSN3D >= 0.5f) for (int ch = 1; ch < nCh; ++ch) buffer.applyGain (ch, 0, buffer.getNumSamples(), sn3d2n3d[ch]); // clear accumulation buffers juce::FloatVectorOperations::clear (reinterpret_cast (accumMid.data()), fftLength + 2); juce::FloatVectorOperations::clear (reinterpret_cast (accumSide.data()), fftLength + 2); const int nZeros = fftLength - L; //compute mid signal in frequency domain for (int midix = 0; midix < nMidCh; ++midix) { const int ch = mix2cix[midix]; juce::FloatVectorOperations::copy (reinterpret_cast (fftBuffer.data()), buffer.getReadPointer (ch), L); juce::FloatVectorOperations::clear (reinterpret_cast (fftBuffer.data()) + L, nZeros); fft->performRealOnlyForwardTransform (reinterpret_cast (fftBuffer.data())); const auto tfMid = reinterpret_cast*> (irsFrequencyDomain.getReadPointer (ch)); for (int i = 0; i < fftLength / 2 + 1; ++i) accumMid[i] += fftBuffer[i] * tfMid[i]; } //compute side signal in frequency domain for (int sidix = 0; sidix < nSideCh; ++sidix) { const int ch = six2cix[sidix]; juce::FloatVectorOperations::copy (reinterpret_cast (fftBuffer.data()), buffer.getReadPointer (ch), L); juce::FloatVectorOperations::clear (reinterpret_cast (fftBuffer.data()) + L, nZeros); fft->performRealOnlyForwardTransform (reinterpret_cast (fftBuffer.data())); const auto tfSide = reinterpret_cast*> (irsFrequencyDomain.getReadPointer (ch)); for (int i = 0; i < fftLength / 2 + 1; ++i) accumSide[i] += fftBuffer[i] * tfSide[i]; } fft->performRealOnlyInverseTransform (reinterpret_cast (accumMid.data())); fft->performRealOnlyInverseTransform (reinterpret_cast (accumSide.data())); ///* MS -> LR */ juce::FloatVectorOperations::copy (buffer.getWritePointer (0), reinterpret_cast (accumMid.data()), L); juce::FloatVectorOperations::copy (buffer.getWritePointer (1), reinterpret_cast (accumMid.data()), L); juce::FloatVectorOperations::add (buffer.getWritePointer (0), reinterpret_cast (accumSide.data()), L); juce::FloatVectorOperations::subtract (buffer.getWritePointer (1), reinterpret_cast (accumSide.data()), L); juce::FloatVectorOperations::add (buffer.getWritePointer (0), overlapBuffer.getWritePointer (0), copyL); juce::FloatVectorOperations::add (buffer.getWritePointer (1), overlapBuffer.getWritePointer (1), copyL); if (copyL < overlap) // there is some overlap left, want some? { const int howManyAreLeft = overlap - L; //shift the overlap buffer to the left juce::FloatVectorOperations::copy (overlapBuffer.getWritePointer (0), overlapBuffer.getReadPointer (0, L), howManyAreLeft); juce::FloatVectorOperations::copy (overlapBuffer.getWritePointer (1), overlapBuffer.getReadPointer (1, L), howManyAreLeft); //clear the tail juce::FloatVectorOperations::clear (overlapBuffer.getWritePointer (0, howManyAreLeft), ergL - howManyAreLeft); juce::FloatVectorOperations::clear (overlapBuffer.getWritePointer (1, howManyAreLeft), ergL - howManyAreLeft); /* MS -> LR */ juce::FloatVectorOperations::add (overlapBuffer.getWritePointer (0), reinterpret_cast (accumMid.data()) + L, irLengthMinusOne); juce::FloatVectorOperations::add (overlapBuffer.getWritePointer (1), reinterpret_cast (accumMid.data()) + L, irLengthMinusOne); juce::FloatVectorOperations::add (overlapBuffer.getWritePointer (0), reinterpret_cast (accumSide.data()) + L, irLengthMinusOne); juce::FloatVectorOperations::subtract (overlapBuffer.getWritePointer (1), reinterpret_cast (accumSide.data()) + L, irLengthMinusOne); } else { /* MS -> LR */ juce::FloatVectorOperations::copy (overlapBuffer.getWritePointer (0), reinterpret_cast (accumMid.data()) + L, irLengthMinusOne); juce::FloatVectorOperations::copy (overlapBuffer.getWritePointer (1), reinterpret_cast (accumMid.data()) + L, irLengthMinusOne); juce::FloatVectorOperations::add (overlapBuffer.getWritePointer (0), reinterpret_cast (accumSide.data()) + L, irLengthMinusOne); juce::FloatVectorOperations::subtract (overlapBuffer.getWritePointer (1), reinterpret_cast (accumSide.data()) + L, irLengthMinusOne); } if (*applyHeadphoneEq >= 0.5f) { float* channelData[2] = { buffer.getWritePointer (0), buffer.getWritePointer (1) }; juce::dsp::AudioBlock sumBlock (channelData, 2, L); juce::dsp::ProcessContextReplacing eqContext (sumBlock); EQ.process (eqContext); } for (int ch = 2; ch < buffer.getNumChannels(); ++ch) buffer.clear (ch, 0, buffer.getNumSamples()); } //============================================================================== bool BinauralDecoderAudioProcessor::hasEditor() const { return true; // (change this to false if you choose to not supply an editor) } juce::AudioProcessorEditor* BinauralDecoderAudioProcessor::createEditor() { return new BinauralDecoderAudioProcessorEditor (*this, parameters); } //============================================================================== void BinauralDecoderAudioProcessor::getStateInformation (juce::MemoryBlock& destData) { auto state = parameters.copyState(); auto oscConfig = state.getOrCreateChildWithName ("OSCConfig", nullptr); oscConfig.copyPropertiesFrom (oscParameterInterface.getConfig(), nullptr); std::unique_ptr xml (state.createXml()); copyXmlToBinary (*xml, destData); } void BinauralDecoderAudioProcessor::setStateInformation (const void* data, int sizeInBytes) { std::unique_ptr xmlState (getXmlFromBinary (data, sizeInBytes)); if (xmlState.get() != nullptr) if (xmlState->hasTagName (parameters.state.getType())) { parameters.replaceState (juce::ValueTree::fromXml (*xmlState)); if (parameters.state.hasProperty ("OSCPort")) // legacy { oscParameterInterface.getOSCReceiver().connect ( parameters.state.getProperty ("OSCPort", juce::var (-1))); parameters.state.removeProperty ("OSCPort", nullptr); } auto oscConfig = parameters.state.getChildWithName ("OSCConfig"); if (oscConfig.isValid()) oscParameterInterface.setConfig (oscConfig); } } //============================================================================== void BinauralDecoderAudioProcessor::parameterChanged (const juce::String& parameterID, float newValue) { if (parameterID == "inputOrderSetting") userChangedIOSettings = true; else if (parameterID == "applyHeadphoneEq") { const int sel (juce::roundToInt (newValue)); if (sel > 0) { int sourceDataSize; juce::String name = headphoneEQs[sel - 1].replace ("-", "") + "_wav"; auto* sourceData = EQData::getNamedResource (name.toUTF8(), sourceDataSize); if (sourceData == nullptr) DBG ("error"); EQ.loadImpulseResponse (sourceData, sourceDataSize, juce::dsp::Convolution::Stereo::yes, juce::dsp::Convolution::Trim::no, 2048, juce::dsp::Convolution::Normalise::no); } } } void BinauralDecoderAudioProcessor::updateBuffers() { DBG ("IOHelper: input size: " << input.getSize()); DBG ("IOHelper: output size: " << output.getSize()); const double sampleRate = getSampleRate(); const int blockSize = getBlockSize(); int order = juce::jmax (input.getOrder(), 1); const int nCh = input .getNumberOfChannels(); // why not juce::jmin(buffer.....)? Is updateBuffers called before the first processBlock? DBG ("order: " << order); DBG ("nCh: " << nCh); int tmpOrder = sqrt (nCh) - 1; if (tmpOrder < order) { order = tmpOrder; } //get number of mid- and side-channels nSideCh = order * (order + 1) / 2; nMidCh = juce::square (order + 1) - nSideCh; //nMidCh = nCh - nSideCh; //nCh should be equalt to (order+1)^2 if (order < 1) order = 1; // just use first order filters juce::AudioBuffer resampledIRs; bool useResampled = false; irLength = 236; if (sampleRate != irsSampleRate && order != 0) // do resampling! { useResampled = true; double factorReading = irsSampleRate / sampleRate; irLength = juce::roundToInt (irLength / factorReading + 0.49); juce::MemoryAudioSource memorySource (irs[order - 1], false); juce::ResamplingAudioSource resamplingSource (&memorySource, false, nCh); resamplingSource.setResamplingRatio (factorReading); resamplingSource.prepareToPlay (irLength, sampleRate); resampledIRs.setSize (nCh, irLength); juce::AudioSourceChannelInfo info; info.startSample = 0; info.numSamples = irLength; info.buffer = &resampledIRs; resamplingSource.getNextAudioBlock (info); // compensate for more (correlated) samples contributing to output signal resampledIRs.applyGain (irsSampleRate / sampleRate); } irLengthMinusOne = irLength - 1; const int prevFftLength = fftLength; const int ergL = blockSize + irLength - 1; //max number of nonzero output samples fftLength = juce::nextPowerOfTwo (ergL); //fftLength >= ergL overlapBuffer.setSize (2, irLengthMinusOne); overlapBuffer.clear(); if (prevFftLength != fftLength) { const int fftOrder = std::log2 (fftLength); fft = std::make_unique (fftOrder); fftBuffer.resize (fftLength); accumMid.resize (fftLength); accumSide.resize (fftLength); } irsFrequencyDomain.setSize (nCh, 2 * (fftLength / 2 + 1)); irsFrequencyDomain.clear(); for (int i = 0; i < nCh; ++i) { float* inOut = reinterpret_cast (fftBuffer.data()); const float* src = useResampled ? resampledIRs.getReadPointer (i) : irs[order - 1].getReadPointer (i); juce::FloatVectorOperations::copy (inOut, src, irLength); juce::FloatVectorOperations::clear (inOut + irLength, fftLength - irLength); // zero padding fft->performRealOnlyForwardTransform (inOut); juce::FloatVectorOperations::copy (irsFrequencyDomain.getWritePointer (i), inOut, 2 * (fftLength / 2 + 1)); } } //============================================================================== std::vector> BinauralDecoderAudioProcessor::createParameterLayout() { // add your audio parameters here std::vector> params; params.push_back (OSCParameterInterface::createParameterTheOldWay ( "inputOrderSetting", "Input Ambisonic Order", "", juce::NormalisableRange (0.0f, 8.0f, 1.0f), 0.0f, [] (float value) { if (value >= 0.5f && value < 1.5f) return "0th"; else if (value >= 1.5f && value < 2.5f) return "1st"; else if (value >= 2.5f && value < 3.5f) return "2nd"; else if (value >= 3.5f && value < 4.5f) return "3rd"; else if (value >= 4.5f && value < 5.5f) return "4th"; else if (value >= 5.5f && value < 6.5f) return "5th"; else if (value >= 6.5f && value < 7.5f) return "6th"; else if (value >= 7.5f) return "7th"; else return "Auto"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "useSN3D", "Input Normalization", "", juce::NormalisableRange (0.0f, 1.0f, 1.0f), 1.0f, [] (float value) { if (value >= 0.5f) return "SN3D"; else return "N3D"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "applyHeadphoneEq", "Headphone Equalization", "", juce::NormalisableRange (0.0f, float (headphoneEQs.size()), 1.0f), 0.0f, [this] (float value) { if (value < 0.5f) return juce::String ("OFF"); else return juce::String (this->headphoneEQs[juce::roundToInt (value) - 1]); }, nullptr)); return params; } //============================================================================== // This creates new instances of the plugin.. juce::AudioProcessor* JUCE_CALLTYPE createPluginFilter() { return new BinauralDecoderAudioProcessor(); } ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/BinauralDecoder/Source/PluginEditor.cppIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/BinauralDecoder/Source/PluginEditor.0000664002537200253720000001024715257173642031524 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #include "PluginEditor.h" #include "PluginProcessor.h" //============================================================================== BinauralDecoderAudioProcessorEditor::BinauralDecoderAudioProcessorEditor ( BinauralDecoderAudioProcessor& p, juce::AudioProcessorValueTreeState& vts) : juce::AudioProcessorEditor (&p), processor (p), valueTreeState (vts), footer (p.getOSCParameterInterface()) { // ============== BEGIN: essentials ====================== // set GUI size and lookAndFeel setSize (450, 140); // use this to create a fixed-size GUI //setResizeLimits(500, 300, 800, 500); // use this to create a resizable GUI setLookAndFeel (&globalLaF); // make title and footer visible, and set the PluginName addAndMakeVisible (&title); title.setTitle ("Binaural", "Decoder"); title.setFont (globalLaF.robotoBold, globalLaF.robotoLight); addAndMakeVisible (&footer); // ============= END: essentials ======================== // create the connection between title component's comboBoxes and parameters cbOrderSettingAttachment.reset ( new ComboBoxAttachment (valueTreeState, "inputOrderSetting", *title.getInputWidgetPtr()->getOrderCbPointer())); cbNormalizationSettingAttachment.reset ( new ComboBoxAttachment (valueTreeState, "useSN3D", *title.getInputWidgetPtr()->getNormCbPointer())); addAndMakeVisible (lbEq); lbEq.setText ("Headphone Equalization"); addAndMakeVisible (cbEq); cbEq.addItem ("OFF", 1); cbEq.addItemList (processor.headphoneEQs, 2); cbEqAttachment.reset (new ComboBoxAttachment (valueTreeState, "applyHeadphoneEq", cbEq)); // start timer after everything is set up properly startTimer (20); } BinauralDecoderAudioProcessorEditor::~BinauralDecoderAudioProcessorEditor() { setLookAndFeel (nullptr); } //============================================================================== void BinauralDecoderAudioProcessorEditor::paint (juce::Graphics& g) { g.fillAll (globalLaF.ClBackground); } void BinauralDecoderAudioProcessorEditor::resized() { // ============ BEGIN: header and footer ============ const int leftRightMargin = 30; const int headerHeight = 60; const int footerHeight = 25; auto area = getLocalBounds(); auto footerArea (area.removeFromBottom (footerHeight)); footer.setBounds (footerArea); area.removeFromLeft (leftRightMargin); area.removeFromRight (leftRightMargin); auto headerArea = area.removeFromTop (headerHeight); title.setBounds (headerArea); area.removeFromTop (10); area.removeFromBottom (5); // =========== END: header and footer ================= auto sliderRow = area.removeFromTop (20); lbEq.setBounds (sliderRow.removeFromLeft (150)); cbEq.setBounds (sliderRow.removeFromLeft (120)); } void BinauralDecoderAudioProcessorEditor::timerCallback() { // === update titleBar widgets according to available input/output channel counts title.setMaxSize (processor.getMaxSize()); // ========================================== // insert stuff you want to do be done at every timer callback } ././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/BinauralDecoder/Source/PluginProcessor.hIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/BinauralDecoder/Source/PluginProcess0000664002537200253720000001056715257173642031643 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once #include "../../resources/AudioProcessorBase.h" #include #define ProcessorClass BinauralDecoderAudioProcessor class BinauralDecoderAudioProcessor : public AudioProcessorBase, IOTypes::AudioChannels<2>> { public: constexpr static int numberOfInputChannels = 64; constexpr static int numberOfOutputChannels = 2; //============================================================================== BinauralDecoderAudioProcessor(); ~BinauralDecoderAudioProcessor(); //============================================================================== void prepareToPlay (double sampleRate, int samplesPerBlock) override; void releaseResources() override; void processBlock (juce::AudioBuffer&, juce::MidiBuffer&) override; //============================================================================== juce::AudioProcessorEditor* createEditor() override; bool hasEditor() const override; //============================================================================== int getNumPrograms() override; int getCurrentProgram() override; void setCurrentProgram (int index) override; const juce::String getProgramName (int index) override; void changeProgramName (int index, const juce::String& newName) override; //============================================================================== void getStateInformation (juce::MemoryBlock& destData) override; void setStateInformation (const void* data, int sizeInBytes) override; //============================================================================== void parameterChanged (const juce::String& parameterID, float newValue) override; void updateBuffers() override; // use this to implement a buffer update method //======= Parameters =========================================================== std::vector> createParameterLayout(); //============================================================================== static const juce::StringArray headphoneEQs; private: // list of used audio parameters std::atomic* inputOrderSetting; std::atomic* useSN3D; std::atomic* applyHeadphoneEq; juce::dsp::Convolution EQ; int fftLength = -1; int irLength = 236; int irLengthMinusOne = irLength - 1; std::vector> fftBuffer; std::vector> accumMid; std::vector> accumSide; std::unique_ptr fft; juce::AudioBuffer overlapBuffer; juce::AudioBuffer irs[7]; juce::AudioBuffer irsFrequencyDomain; double irsSampleRate = 44100.0; //mapping between mid-channel index and channel index const int mix2cix[36] = { 0, 2, 3, 6, 7, 8, 12, 13, 14, 15, 20, 21, 22, 23, 24, 30, 31, 32, 33, 34, 35, 42, 43, 44, 45, 46, 47, 48, 56, 57, 58, 59, 60, 61, 62, 63 }; //mapping between side-channel index and channel index const int six2cix[28] = { 1, 4, 5, 9, 10, 11, 16, 17, 18, 19, 25, 26, 27, 28, 29, 36, 37, 38, 39, 40, 41, 49, 50, 51, 52, 53, 54, 55 }; int nMidCh; int nSideCh; //============================================================================== JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (BinauralDecoderAudioProcessor) }; ././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/BinauralDecoder/Source/PluginEditor.hIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/BinauralDecoder/Source/PluginEditor.0000664002537200253720000000662015257173642031524 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once #include "../JuceLibraryCode/JuceHeader.h" #include "PluginProcessor.h" //Plugin Design Essentials #include "../../resources/customComponents/TitleBar.h" #include "../../resources/lookAndFeel/IEM_LaF.h" //Custom juce::Components #include "../../resources/customComponents/ReverseSlider.h" #include "../../resources/customComponents/SimpleLabel.h" typedef ReverseSlider::SliderAttachment SliderAttachment; // all ReverseSliders will make use of the parameters' valueToText() function typedef juce::AudioProcessorValueTreeState::ComboBoxAttachment ComboBoxAttachment; typedef juce::AudioProcessorValueTreeState::ButtonAttachment ButtonAttachment; //============================================================================== /** */ class BinauralDecoderAudioProcessorEditor : public juce::AudioProcessorEditor, private juce::Timer { public: BinauralDecoderAudioProcessorEditor (BinauralDecoderAudioProcessor&, juce::AudioProcessorValueTreeState&); ~BinauralDecoderAudioProcessorEditor(); //============================================================================== void paint (juce::Graphics&) override; void resized() override; void timerCallback() override; private: // ====================== begin essentials ================== // lookAndFeel class with the IEM plug-in suite design LaF globalLaF; // stored references to the AudioProcessor and juce::ValueTreeState holding all the parameters BinauralDecoderAudioProcessor& processor; juce::AudioProcessorValueTreeState& valueTreeState; /* title and footer component title component can hold different widgets for in- and output: - NoIOWidget (if there's no need for an input or output widget) - AudioChannelsIOWidget - AmbisonicIOWidget - DirectivitiyIOWidget */ TitleBar, BinauralIOWidget> title; OSCFooter footer; // =============== end essentials ============ // Attachments to create a connection between IOWidgets comboboxes // and the associated parameters std::unique_ptr cbOrderSettingAttachment; std::unique_ptr cbNormalizationSettingAttachment; SimpleLabel lbEq; juce::ComboBox cbEq; std::unique_ptr cbEqAttachment; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (BinauralDecoderAudioProcessorEditor) }; IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/BinauralDecoder/Source/EQ/0000775002537200253720000000000015257173642027417 5ustar zmoelnigzmoelnig././@LongLink0000644000000000000000000000015500000000000011604 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/BinauralDecoder/Source/EQ/AKG-K271STUDIO.wavIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/BinauralDecoder/Source/EQ/AKG-K271ST0000664002537200253720000004013015257173642030633 0ustar zmoelnigzmoelnigRIFFP@WAVEfmt €»Ü factPEAKàc Y0DK?0DK?data@0DK?0DK?­"û½­"û½5Û(=5Û(=”ê²<”ê²<Ìžm¾Ìžm¾ÓؽÓؽß1µ¼ß1µ¼|ˆð<|ˆð<‡h½‡h½¿ÔÑ<¿ÔÑ<‰2†=‰2†=©êŸ=©êŸ=8Ó&=8Ó&=h×=h×=áDN»áDN»é߆¼é߆¼wx°»wx°»°iÎ;°iÎ;YÁý8YÁý8‡*k¼‡*k¼=g¼=g¼‡Ó :‡Ó :vÄ£ :(> :¾…‚9¾…‚9´hÞ9´hÞ9ªÝu9ªÝu9Êd:Êd:ÚVÞ9ÚVÞ9õ G:õ G:H›):H›):Ij:Ij:ÒZ&:ÒZ&:sB::sB::i—š9i—š9KG‰9KG‰9¹-C¹¹-C¹=/¹=/¹»�º»�º·Ž¤¹·Ž¤¹Çõ¹Çõ¹õ ¹õ ¹½5¹½5¹Ûd9Ûd9q¼49q¼49‰Ñ:‰Ñ:ü+Â9ü+Â9 : :sÓ9sÓ9R :R :NµÊ9NµÊ9‰`:‰`:ƒÌÚ9ƒÌÚ9ØF-:ØF-:Ëêÿ9Ëêÿ9^D?:^D?:êV :êV :ðJA:ðJA:òy:òy:ˆ�.:ˆ�.:«IÚ9«IÚ9Šô:Šô:±NÐ9±NÐ9w):w):ô :ô :ÒoV:ÒoV:sî<:sî<:À­ˆ:À­ˆ:­ós:­ós:ÎÛž:ÎÛž:Gâˆ:Gâˆ:z:¦:z:¦:Qˉ:Qˉ:祢:祢:X.„:X.„: B�: B�:4›€:4›€:[Rœ:[Rœ:)Y‚:)Y‚:cÓŸ:cÓŸ:1†:1†:_g¢:_g¢:øÁ†:øÁ†:^¡:^¡:d„:d„:àž:àž:Ù¬�:Ù¬�:[ל:[ל:æ�:æ�:#wž:#wž:Á_„:Á_„:™£ :™£ :€Í„:€Í„:Mž:Mž:ËŠ|:ËŠ|:éa“:éa“:f`:f`:Òƒ:Òƒ:½Q=:½Q=:º¤b:º¤b:@Œ:@Œ:ÓC:ÓC:”i:”i:6=,:6=,:Ç„Ö9Ç„Ö9É:É:UM¬9UM¬9’i:’i:•z9•z92ÅÒ92ÅÒ9Zq9Zq9mŸ¤9mŸ¤9D¥…8D¥…8jzt9jzt9;‹`·;‹`·«6&9«6&9]ð¸¸]𸸣©8£©8÷g3¹÷g3¹ · ·ÓuйÓuйGÛÕ¸GÛÕ¸÷ð¹¹÷ð¹¹ûkB¹ûkB¹øCà¹øC๦�¹¦�¹ Zù¹ Zù¹›8”¹›8”¹çºçºHE ¹HE ¹`Q º`Q º2ª¹2ª¹¡/º¡/ºÄ°³¹Ä°³¹¡Òº¡Òº-½¹-½¹ mº mºÇ¿Å¹Ç¿Å¹ô|ºô|ºx�͹x�͹hfºhfº7»Õ¹7»Õ¹Í³#ºÍ³#º?oÞ¹?oÞ¹‰¤'º‰¤'º{Åä¹{Åä¹Hä)ºHä)ºC[ç¹C[ç¹á!*ºá!*º5¶å¹5¶å¹Q?(ºQ?(º4à¹4à¹õÔ$ºõÔ$ºz"Ù¹z"Ù¹ø½!ºø½!º’3Ô¹’3Ô¹IìºI캥ҹ¥Ò¹3£º3£ºp3Ó¹p3Ó¹Ž!ºŽ!º ’×¹ ’×¹\À#º\À#ºiEݹiEݹXˆ&ºXˆ&º6¯â¹6¯â¹ê)ºê)º£@ç¹£@ç¹çô*ºçô*º¿깿ê¹ëù+ºëù+º†ë¹†ë¹0ˆ,º0ˆ,º–´ì¹–´ì¹,-º,-º�î¹�î¹Æñ-ºÆñ-º˜ü﹘üï¹÷/º÷/º×úò¹×úò¹ÿ0ºÿ0º*’÷¹*’÷¹Š¤3ºŠ¤3ºÿgý¹ÿgý¹u¨6ºu¨6ºš•ºš•º¾%9º¾%9º<’º<’ºÃ�:ºÃ�:º8Yº8Yº•Ÿ:º•Ÿ:º#·º#·ºÒP9ºÒP9ºÔºÔº%ø6º%ø6º6±¸>6±¸"û8"û8�©³¸�©³¸<+ù8<+ù8nµ¸nµ¸o ø8o ø8µÖµ¸µÖµ¸+Ž÷8+Ž÷8¶ ¶¸¶ ¶¸-f÷8-f÷8i,¶¸i,¶¸‰÷8‰÷8#„¶¸#„¶¸±ö8±ö8s¿¶¸s¿¶¸â–ö8â–ö8Ѝ¶¸Š¨¶¸s¼ö8s¼ö8ûH¶¸ûH¶¸öB÷8öB÷8{xµ¸{xµ¸tRø8tRø8Éþ³¸Éþ³¸ûú8ûú8.ñ¸.ñ¸0»ü80»ü8í ®¸í ®¸é9é9kɪ¸kɪ¸ð!9ð!9—k¦¸—k¦¸ b9 b9Þ»¡¸Þ»¡¸À9À9^ßœ¸^ßœ¸Í* 9Í* 9÷—¸÷—¸z� 9z� 9öó’¸öó’¸ó"9ó"9´�¸´�¸~Û9~Û9—釸—釸¢Ý9¢Ý9‚”�¸‚”�¸—9—9:µu¸:µu¸µ‡9µ‡9ÄŒg¸ÄŒg¸þ%9þ%9ǬX¸Ç¬X¸Ãã!9Ãã!9pI¸pI¸Y´%9Y´%9û÷9¸û÷9¸¹�)9¹�)9ðh*¸ðh*¸*d-9*d-9öJ¸öJ¸419419Ù¥ ¸Ù¥ ¸O¯49O¯49éü·éü·êW89êW89VGÞ·VGÞ·(<9(<9'À·'À·±Ø?9±Ø?9F ¡·F ¡·„›C9„›C9•�ƒ·•�ƒ·0OG90OG9L·L·bòJ9bòJ9]·]·§¡N9§¡N9ûBª¶ûBª¶¡fR9¡fR9ž õž õ•!V9•!V9ħ 6ħ 6q¯Y9q¯Y9‚¾´6‚¾´6µ]9µ]9ô7ô7ÙZ`9ÙZ`9c#D7c#D7Ò‘c9Ò‘c9Øx7Øx7wÎf9wÎf9’E–7’E–7j9j9,D°7,D°74Bm94Bm9ïÉ7ïÉ7×ep9×ep9aºâ7aºâ7 es9 es9‹+ú7‹+ú7v3v9v3v9I8I8ÇÔx9ÇÔx9 .8 .8„){9„){9·Ï8·Ï8ˆ}9ˆ}9€Ó!8€Ó!8x¢~9x¢~9 q'8 q'8)Þ9)Þ9Žõ+8Žõ+8o€9o€9Ú¼/8Ú¼/8ÎÛ€9ÎÛ€9Hä28Hä28`.�9`.�9J÷48J÷488ù>8Í1#¹Í1#¹">8">8—S#¹—S#¹@È=8@È=8�Y#¹�Y#¹žÍ=8žÍ=8ºI#¹ºI#¹Ž+>8Ž+>8Î!#¹Î!#¹ñø>8ñø>8ßÙ"¹ßÙ"¹”P@8”P@8?n"¹?n"¹‘9·>9ãT‘¸ãT‘¸Rà 9Rà 9K%Œ¸K%Œ¸1i 91i 9 '‡¸ '‡¸‹Ø9‹Ø9^‚¸^‚¸ñ,9ñ,9�–{¸�–{¸íe9íe9†Þr¸†Þr¸R„9R„9r�j¸r�j¸ˆ9ˆ9Šªb¸Šªb¸Cr9Cr90*[¸0*[¸¼B9¼B9�T¸�T¸«õ9«õ9$…M¸$…M¸¡…9¡…9°ƒG¸°ƒG¸Åñ 9Åñ 9kB¸kB¸§:"9§:"9½&=¸½&=¸†b#9†b#9J¼8¸J¼8¸°'9>°'9^ø)¸^ø)¸=7'9=7'9åõ+¸åõ+¸Ñ¬&9Ѭ&9=.¸=.¸³&9³&9'Ä0¸'Ä0¸Nf%9Nf%9_3¸_3¸G°$9G°$9“b6¸“b6¸ìñ#9ìñ#9Ÿa9¸Ÿa9¸=-#9=-#9o}<¸o}<¸_"9_"9¬Ã?¸¬Ã?¸‡!9‡!91C¸1C¸™¥ 9™¥ 9GÂF¸GÂF¸»9»9;zJ¸;zJ¸)Æ9)Æ9[N¸[N¸¤Ç9¤Ç9¦aR¸¦aR¸ü¿9ü¿9ȈV¸ÈˆV¸Ù±9Ù±9ÏÃZ¸ÏÃZ¸ïŸ9ïŸ9Ð _¸Ð _¸`‹9`‹9 \c¸ \c¸Åt9Åt90³g¸0³g¸„\9„\9Æl¸Æl¸ÖA9ÖA9©|p¸©|p¸f%9f%9\ët¸\ët¸¡9¡9eby¸eby¸›æ9›æ9Ãè}¸Ãè}¸£Â9£Â9:�¸:�¸Ùž9Ùž9~}ƒ¸~}ƒ¸e}9e}9ù…¸Ã¹…¸``9``9ó뇸ó뇸áH 9áH 92Џ2Џ 5 9 5 9Í6Œ¸Í6Œ¸5$ 95$ 9SޏSޏH 9H 9j�¸j�¸ð 9ð 9c|’¸c|’¸99ôˆ”¸ôˆ”¸Ýû9Ýû9ç‘–¸ç‘–¸.÷9.÷9w–˜¸w–˜¸ö9ö9j�š¸j�š¸êû9êû9g{œ¸g{œ¸î9î9×Xž¸×Xž¸´9´9S) ¸S) ¸×59×59Bò¡¸Bò¡¸ºQ9ºQ9—¶£¸—¶£¸ãßþ8ãßþ8wu¥¸wu¥¸›"ý8›"ý8ì.§¸ì.§¸óhû8óhû8U娸U娸¼³ù8¼³ù8ò•ª¸ò•ª¸ø8ø8€?¬¸€?¬¸^ö8^ö8Íà­¸Íà­¸£Àô8£Àô8w¯¸w¯¸….ó8….ó8ͱ¸Í±¸¤£ñ8¤£ñ8劲¸åв¸Ðð8Ðð8𠴸𠴸n�î8n�î8뉵¸ë‰µ¸!í8!í8·¸·¸O§ë8O§ë8c{¸¸c{¸¸"0ê8"0ê8 ð¹¸ ð¹¸!»è8!»è8Ic»¸Ic»¸’Iç8’Iç8¸Ñ¼¸¸Ñ¼¸ëÜå8ëÜå8";¾¸";¾¸!uä8!uä8+ ¿¸+ ¿¸™ã8™ã81Á¸1Á¸¿ªá8¿ªá8:k¸:k¸¹Aà8¹Aà8 Ôø Ôø5ÙÞ85ÙÞ8;Ÿ;ŸrÝ8rÝ8M¢Æ¸M¢Æ¸U Ü8U Ü8ò ȸò ȸcžÚ8cžÚ8kwɸkwɸÚ1Ù8Ú1Ù8wäʸwäʸ2Ä×82Ä×8‹Q̸‹Q̸óWÖ8óWÖ8ȼ͸ȼ͸ËìÔ8ËìÔ8ñ(ϸñ(ϸ,~Ó8,~Ó8¬šÐ¸¬šÐ¸f Ò8f Ò8Ò¸Ò¸k�Ð8k�Ð8®‹Ó¸®‹Ó¸ Ï8 Ï8ÜÕ¸ÜÕ¸£Í8£Í8—tÖ¸—tÖ¸ø4Ì8ø4Ì8gà׸gà׸—ÊÊ8—ÊÊ8ÁJÙ¸ÁJÙ¸¨`É8¨`É8CµÚ¸CµÚ¸âöÇ8âöÇ8ܸܸ—�Æ8—�Æ8ՂݸՂݸ-.Å8-.Å8KäÞ¸KäÞ¸¢ÎÃ8¢ÎÃ8ACà¸ACัqÂ8±qÂ8'Ÿá¸'Ÿá¸•Á8•Á8Yöâ¸Yöâ¸ôÅ¿8ôÅ¿8ÁDä¸ÁDä¸1~¾81~¾8Z‡å¸Z‡å¸3B½83B½8-¿æ¸-¿æ¸½¼8½¼8šî縚îç¸wåº8wåº8·鸷é¸ù8ù8â5ê¸â5긵§¸8µ§¸8xNë¸xNë¸f”·8f”·8:^ì¸:^ì¸j‹¶8j‹¶8übí¸übí¸J�µ8J�µ8¢\\î¸`›´8`›´8ŸI︟I︶³8¶³8­)ð¸­)ð¸tÞ²8tÞ²8Güð¸Güð¸r²8r²8Ãñ¸Ãñ¸®S±8®S±8Yò¸Yò¸Vž°8Vž°81ó¸1ó¸˜ó¯8˜ó¯8ÓØó¸ÓØó¸ýQ¯8ýQ¯8Ÿwô¸Ÿwô¸º®8º®8Ú õ¸Ú õ¸ .®8 .®8“õ¸“õ¸»¯­8»¯­8È ö¸È ö¸ÆA­8ÆA­8 rö¸ rö¸¶å¬8¶å¬8 Éö¸ Éö¸V˜¬8V˜¬8r÷¸r÷¸pW¬8pW¬8'N÷¸'N÷¸{&¬8{&¬8Õx÷¸Õx÷¸™¬8™¬8t’÷¸t’÷¸Xø«8Xø«8ý™÷¸ý™÷¸�ü«8�ü«8b�÷¸b�÷¸Û¬8Û¬8u÷¸u÷¸ 6¬8 6¬8J÷¸J÷¸ï¸î>ï¸àµ8àµ8$î¸$î¸=;¶8=;¶8fíì¸fíì¸;y·8;y·8qªë¸qªë¸ȸ8ȸ8¦W긦W긧%º8§%º8Óöè¸Óöè¸$‘»8$‘»8ç‡ç¸ç‡ç¸% ½8% ½8 æ¸ æ¸ú‘¾8ú‘¾8`‚ä¸`‚ä¸$À8$À8þîâ¸þî⸈ÀÁ8ˆÀÁ8âQá¸âQá¸ÊeÃ8ÊeÃ8¶¬ß¸¶¬ß¸¿Å8¿Å8oýݸoýݸ?ÍÆ8?ÍÆ8ìAܸìAܸ5“È85“È8‡zÚ¸‡zÚ¸GdÊ8GdÊ8†¨Ø¸†¨Ø¸¸?Ì8¸?Ì8TÍÖ¸TÍÖ¸ª"Î8ª"Î8#ìÔ¸#ìÔ¸Ó Ð8Ó Ð8PÓ¸PÓ¸c÷Ñ8c÷Ñ8_Ѹ_ѸØçÓ8ØçÓ8Û.ϸÛ.ϸÜÕ8ÜÕ8=͸=͸#Õ×8#Õ×8†F˸†F˸ªÒÙ8ªÒÙ8xKɸxKɸµÕÛ8µÕÛ8ãIǸãIǸàÝ8àÝ8Ù@ŸÙ@Ÿ9ñß89ñß8©2ø©2ø7â87â8Š!Á¸Š!Á¸ä8ä8'¿¸'¿¸Õ2æ8Õ2æ8;½¸;½¸mEè8mEè8Iõº¸Iõº¸ Vê8 Vê8‡ê¸¸‡ê¸¸Ôeì8Ôeì8šà¶¸šà¶¸puî8puî8jÖ´¸jÖ´¸6…ð86…ð8m̲¸m̲¸§”ò8§”ò8Eð¸Eð¸Ä¢ô8Ä¢ô8À»®¸À»®¸#¯ö8#¯ö8ß¶¬¸ß¶¬¸“·ø8“·ø8·ª¸·ª¸ºú8ºú8~¾¨¸~¾¨¸_´ü8_´ü8ÍΦ¸ÍΦ¸�¥þ8�¥þ8)褸)褸JG9JG9‰£¸‰£¸ì89ì89¯-¡¸¯-¡¸µ(9µ(9ºUŸ¸ºUŸ¸F9F9z€�¸z€�¸+9+9Ù¯›¸Ù¯›¸î9î9W晸W晸2Ô92Ô9é$˜¸é$˜¸úµ9úµ9®l–¸®l–¸)“9)“9¶½”¸¶½”¸ák9ák9 “¸ “¸ @ 9 @ 9êx‘¸êx‘¸â 9â 9ä�¸ä�¸±Ü 9±Ü 9mWޏmWŽ¸Ñ¤ 9Ѥ 9XÑŒ¸XÑŒ¸òi 9òi 9šQ‹¸šQ‹¸¥+ 9¥+ 9…Ù‰¸…Ù‰¸é 9é 98kˆ¸8kˆ¸¡9¡9 ‡¸ ‡¸ƒR9ƒR9J´…¸J´…¸…ý9…ý9�k„¸�k„¸£9£9#-ƒ¸#-ƒ¸…C9…C9®ù�¸®ù�¸0Þ90Þ9úÑ€¸úÑ€¸&s9&s9Új¸Új¸¯9¯9oG}¸oG}¸ÐŒ9ÐŒ9à9{¸à9{¸�9�9%By¸%By¸–�9–�9vcw¸vcw¸à9à91¡u¸1¡u¸z9z9Òús¸Òús¸žä9žä9ªmr¸ªmr¸,I9,I9Œ÷p¸Œ÷p¸C¨9C¨98—o¸8—o¸ß9ß9‰Mn¸‰Mn¸¨U9¨U9­m¸­m¸»£9»£9;ÿk¸;ÿk¸Óì9Óì9éõj¸éõj¸Y19Y19òþi¸òþi¸+q9+q9éi¸éi¸É«9É«9 Nh¸ Nh¸øà9øà9‘–g¸‘–g¸-9-9¢ñf¸¢ñf¸»<9»<9_f¸_f¸öc9öc9ÝÜe¸ÝÜe¸]‡9]‡9Ÿie¸Ÿie¸§9§9·e¸·e¸Ã9Ã9ƒ¯d¸ƒ¯d¸Ü9Ü9dd¸dd¸Wò9Wò9ù$d¸ù$d¸b9b9{óc¸{óc¸99Ïc¸Ïc¸h!9h!9±¹c¸±¹c¸à)9à)9)³c¸)³c¸/9/9 ¹c¸ ¹c¸*19*19PËc¸PËc¸"09"09(êc¸(êc¸‚,9‚,9Ûd¸Ûd¸Z'9Z'9|=d¸|=d¸» 9» 9§pd¸§pd¸S9S9™«d¸™«d¸Ü 9Ü 9pðd¸pðd¸�9�9Ae¸Ae¸‘ð9‘ð9ð›e¸ð›e¸!Þ9!Þ9gf¸gf¸aÉ9aÉ9’nf¸’nf¸J²9J²9 åf¸ åf¸™9™9ag¸ag¸™9™9àg¸àg¸˜e9˜e9ü^h¸ü^h¸ÐK9ÐK9-Ýh¸-Ýh¸é19é19%]i¸%]i¸^9^9ái¸ái¸zû9zû9±kj¸±kj¸ïÝ9ïÝ9/üj¸/üj¸X¿9X¿9k�k¸k�k¸[ 9[ 9?$l¸?$l¸�9�9¹l¸¹l¸Qb9Qb9×Jm¸×Jm¸ƒD9ƒD9˜Øm¸˜Øm¸¼'9¼'9Übn¸Übn¸º 9º 91ën¸1ën¸Åï9Åï9þuo¸þuo¸ÂÒ9ÂÒ9±p¸±p¸ª´9ª´9Æ™p¸Æ™p¸j•9j•933q¸33q¸Êt9Êt9Òq¸Òq¸S9S9€tr¸€tr¸©09©09ps¸ps¸Ó 9Ó 9b¿s¸b¿s¸ ë9 ë9ždt¸ždt¸_È9_È9 u¸ u¸¥9¥9öµu¸öµu¸)€9)€9Åhv¸Åhv¸Y9Y95%w¸5%w¸®/9®/9 êw¸ êw¸�9�9*µx¸*µx¸Ø9Ø9,†y¸,†y¸ª9ª9é\z¸é\z¸Èz9Èz9Õ7{¸Õ7{¸½J9½J9 |¸ |¸0909õ|¸õ|¸Oé9Oé9‹Ö}¸‹Ö}¸«·9«·9Ó¼~¸Ó¼~¸~„9~„9Aª¸Aª¸nO9nO9ŸN€¸ŸN€¸ø9ø9äÇ€¸äÇ€¸éÚ9éÚ9¨?�¸¨?�¸µ›9µ›9�µ�¸�µ�¸uY9uY9c)‚¸c)‚¸6969󚂸󚂸8Ì98Ì9¼ ƒ¸¼ ƒ¸«�9«�9.uƒ¸.uƒ¸ø49ø49°Üƒ¸°Üƒ¸æ9æ9Ê@„¸Ê@„¸¾”9¾”9Z¢„¸Z¢„¸„@9„@9=…¸=…¸Ùé9Ùé9®\…¸®\…¸ ‘9 ‘9´…¸´…¸h69h69à†¸à†¸Ú9Ú9øT†¸øT†¸*|9*|99ž†¸9ž†¸¾9¾9W↸W↸ï»9ï»9i!‡¸i!‡¸ªY9ªY9†[‡¸†[‡¸Íõ 9Íõ 9 ‘‡¸ ‘‡¸T� 9T� 9ÐÁ‡¸ÐÁ‡¸K) 9K) 9Þ퇸Þ퇸©À 9©À 9nˆ¸nˆ¸KV 9KV 9e8ˆ¸e8ˆ¸–ê 9–ê 9ÚUˆ¸ÚUˆ¸á} 9á} 9(mˆ¸(mˆ¸Ž 9Ž 9¹}ˆ¸¹}ˆ¸ä¢ 9ä¢ 9솈¸ì†ˆ¸5 95 9†‰ˆ¸†‰ˆ¸>Æ 9>Æ 9š†ˆ¸š†ˆ¸kV 9kV 9í}ˆ¸í}ˆ¸ßå9ßå9Ñnˆ¸Ñnˆ¸Át9Át9gYˆ¸gYˆ¸99u=ˆ¸u=ˆ¸í�9í�9ñˆ¸ñˆ¸G9G9ò‡¸ò‡¸4«94«9%‡¸%‡¸J89J89Ї¸Ї¸áÅ9áÅ9´I‡¸´I‡¸ÍS9ÍS9ñ‡¸ñ‡¸{á9{á9ü³†¸ü³†¸mn9mn9¨`†¸¨`†¸kú9kú9熸熸©…9©…9~©…¸~©…¸A9A9E…¸E…¸mš9mš9wÚ„¸wÚ„¸,$9,$9ði„¸ði„¸R­9R­9¥óƒ¸¥óƒ¸ 69 69wƒ¸wƒ¸�¾9�¾9Vô‚¸Vô‚¸‰F9‰F9Tl‚¸Tl‚¸Q›ÿ8Q›ÿ8¤ß�¸¤ß�¸§þ8§þ8^O�¸^O�¸e¯ý8e¯ý8,¼€¸,¼€¸6´ü86´ü8ƒ%€¸ƒ%€¸e¶û8e¶û8ñ¸ñ¸Üµú8ܵú8¶Ù}¸¶Ù}¸–²ù8–²ù8ò•|¸ò•|¸Ç¬ø8Ǭø8@K{¸@K{¸Ñ£÷8Ñ£÷8äúy¸äúy¸ƒ—ö8ƒ—ö8d¤x¸d¤x¸bˆõ8bˆõ8’Gw¸’Gw¸öuô8öuô8-æu¸-æu¸_ó8_ó8J�t¸J�t¸ÏDò8ÏDò8)s¸)s¸¼%ñ8¼%ñ8a®q¸a®q¸[ð8[ð8Ñ?p¸Ñ?p¸¥Ûî8¥Ûî8°Ën¸°Ën¸l²í8l²í8ñPm¸ñPm¸ô†ì8ô†ì8¡Ïk¸¡Ïk¸6Yë86Yë8THj¸THj¸½(ê8½(ê8¼h¸¼h¸uõè8uõè8s*g¸s*g¸€¿ç8€¿ç8Ú“e¸Ú“e¸Ð†æ8Іæ8�øc¸�øc¸=Kå8=Kå8ÎXb¸ÎXb¸× ä8× ä8Û´`¸Û´`¸ŒËâ8ŒËâ86 _¸6 _¸,ˆá8,ˆá85]]¸5]]¸fCà8fCà8.§[¸.§[¸^ýÞ8^ýÞ8bêY¸bêY¸!¶Ý8!¶Ý8ƒ&X¸ƒ&X¸²mÜ8²mÜ8Á\V¸Á\V¸Z#Û8Z#Û8.ŽT¸.ŽT¸ôÖÙ8ôÖÙ8öºR¸öºR¸�ˆØ8�ˆØ8IãP¸IãP¸í7×8í7×8ïO¸ïO¸åÕ8åÕ8w(M¸w(M¸6�Ô86�Ô8ÝDK¸ÝDK¸z9Ó8z9Ó8]I¸]I¸áÑ8áÑ8MpG¸MpG¸m‡Ð8m‡Ð8§~E¸§~E¸V,Ï8V,Ï8¼ˆC¸¼ˆC¸œÏÍ8œÏÍ8Q�A¸Q�A¸ÎpÌ8ÎpÌ8““?¸““?¸ZË8ZË8é–=¸é–=¸×ªÉ8תÉ8 ™;¸ ™;¸fCÈ8fCÈ8ž›9¸ž›9¸9ÙÆ89ÙÆ8gœ7¸gœ7¸°lÅ8°lÅ8´›5¸´›5¸ÖýÃ8ÖýÃ8Þ™3¸Þ™3¸zŒÂ8zŒÂ8‡—1¸‡—1¸ŒÁ8ŒÁ8œ”/¸œ”/¸0¢¿80¢¿8/‘-¸/‘-¸c)¾8c)¾8³�+¸³�+¸á­¼8á­¼8 ‹)¸ ‹)¸?/»8?/»8MŠ'¸MŠ'¸(­¹8(­¹8Ì‹%¸Ì‹%¸Ì'¸8Ì'¸8�#¸�#¸ŸŸ¶8ŸŸ¶81“!¸1“!¸µ8µ8¾—¸¾—¸vˆ³8vˆ³8Åœ¸Åœ¸‡ù±8‡ù±8£¸£¸øg°8øg°8q«¸q«¸»Ó®8»Ó®8õ¸Ãµ¸û<­8û<­8ÌÁ¸ÌÁ¸í£«8í£«8³Ï¸³Ï¸cª8cª89à¸9à¸j¨8j¨8Àó¸Àó¸?ɦ8?ɦ8¹ ¸¹ ¸V&¥8V&¥8>! ¸>! ¸Æ�£8Æ�£8: ¸: ¸¥Û¡8¥Û¡8~T¸~T¸½3 8½3 8gq¸gq¸²‰ž8²‰ž8˜‘¸˜‘¸LÝœ8LÝœ8dµ¸dµ¸².›8².›8xܸxܸ'~™8'~™8 þ· þ·ãË—8ãË—8gú·gú·è–8è–82Çö·2Çö·^b”8^b”8ú,ó·ú,󷃫’8ƒ«’8û—ï·û—ï·vó�8vó�8lì·lì·B:�8B:�8m~è·m~è·ë�8ë�8Æúä·Æúä·NÄ‹8NÄ‹8-~á·-~á·tŠ8tŠ8LÞ·LÞ·°Iˆ8°Iˆ8E˜Ú·E˜Ú·&‹†8&‹†8i.×·i.×·íË„8íË„8TÊÓ·TÊÓ·A ƒ8A ƒ8{kз{kзZL�8ZL�8¯Í·¯Í·—8—8ؼɷؼɷ�˜{8�˜{8ílÆ·ílÆ·x8x8Â"÷Â"÷L˜t8L˜t8­Þ¿·­Þ¿·2q82q8% ¼·% ¼·¦˜m8¦˜m8,g¹·,g¹·»j8»j8±3¶·±3¶·È›f8È›f8�³·�³·ôc8ôc8ݯ·ݯ·I£_8I£_8yº¬·yº¬·ñ(\8ñ(\8ž�©·ž�©·°X8°X8Ʀ·Ä†¦·Þ8U8Þ8U8 v£· v£·9ÃQ89ÃQ80l ·0l ·6ON86ON8õh�·õh�·3ÝJ83ÝJ8¿kš·¿kš·ÀmG8ÀmG8It—·It—·ÞD8ÞD8>ƒ”·>ƒ”·y–@8y–@8㘑·ã˜‘·¸.=8¸.=8QµŽ·QµŽ·¥É98¥É98õØ‹·õØ‹·Wg68Wg68ˆ‰·ˆ‰·@38@38Ý4†·Ý4†·c¬/8c¬/8‹mƒ·‹mƒ·§S,8§S,8æ­€·æ­€·Rþ(8Rþ(8çê{·çê{·´¬%8´¬%8„ˆv·„ˆv·ö^"8ö^"8p4q·p4q·]8]8†îk·†îk·øÏ8øÏ8ó·f·ó·f·¤Ž8¤Ž8w‘a·w‘a·ŒQ8ŒQ8²z\·²z\·ô8ô8—sW·—sW·å8å8&|R·&|R·õµ 8õµ 8”M·”M·ý‹8ý‹8m»H·m»H·Cg8Cg8"òC·"òC· H8 H8Ù7?·Ù7?·]þ7]þ7ØŒ:·ØŒ:·n5ø7n5ø7Çñ5·Çñ5·Zò7Zò7 g1· g1·ýì7ýì7¨ì,·¨ì,·Ýæ7Ýæ7‚(·‚(·’ à7’ à7ó&$·ó&$·^#Ú7^#Ú7«Û·«Û·ŽFÔ7ŽFÔ7 · ·�wÎ7�wÎ7ßs·ßs·Ä¶È7ĶÈ7W·W·©Ã7©Ã7öH·öH·Ía½7Ía½7«I ·«I ·<η7<η7ÊY·ÊY·J²7J²70y·0y·ûÕ¬7ûÕ¬7‡Nÿ¶‡Nÿ¶or§7or§7Ç÷¶Ç÷¶ù¢7ù¢7[ð¶[ð¶ßœ7ßœ7> é¶> é¶°—7°—7ÒÔá¶ÒÔá¶<“’7<“’7‰ºÚ¶‰ºÚ¶ôˆ�7ôˆ�7]ºÓ¶]ºÓ¶Æ‘ˆ7Æ‘ˆ7¸Ó̶¸Ó̶®ƒ7®ƒ7ƶƶš¼}7š¼}7{Q¿¶{Q¿¶BEt7BEt7Þµ¸¶Þµ¸¶³öj7³öj7*3²¶*3²¶ Ña7 Ña7 É«¶ É«¶¡ÖX7¡ÖX7�w¥¶�w¥¶9P79P7©>Ÿ¶©>Ÿ¶È`G7È`G7Å™¶Å™¶Åæ>7Åæ>7ñ“¶ñ“¶—˜67—˜677*�¶7*�¶Äv.7Äv.7²U‡¶²U‡¶®�&7®�&7vš�¶vš�¶Ï¹7Ϲ77ñw¶7ñw¶…7…7Îàl¶Îàl¶³7³7ðb¶ðb¶’t7’t7Ë^W¶Ë^W¶+d7+d7²ïL¶²ïL¶ õ6 õ6p¸B¶p¸B¶Íœç6Íœç6«¹8¶«¹8¶*“Ú6*“Ú6Òó.¶Òó.¶¾çÍ6¾çÍ6mg%¶mg%¶›Á6›Á6 ¶ ¶�­µ6�­µ6‡ý¶‡ý¶¼ª6¼ª6 ! ¶ ! ¶Æñž6Æñž6?‚¶?‚¶$”6$”6AòµAòµŠ¶‰6ж‰6;ûáµ;ûáµ S6 S6{5Òµ{5Òµ1úk61úk6rñµrñµFcY6FcY660´µ60´µ�G6�G6Øò¥µØò¥µV~66V~66;˜µ;˜µH1&6H1&6¶ ‹µ¶ ‹µ¨6¨6�È|µ�È|µÀâ6Àâ6¼“dµ¼“dµåÂó5åÂó5>{Mµ>{MµbHÙ5bHÙ5�ƒ7µ�ƒ7µÖUÀ5ÖUÀ5c±"µc±"µ ë¨5 ë¨5Q µQ µÊ“5Ê“5¿ù´¿ù´­W}5­W}5–’Ö´–’Ö´®W5®W5�s¶´�s¶´þ55þ55%̘´%̘´:‚5:‚5ÓK{´ÓK{´{úñ4{úñ4èJ´èJ´�¿4�¿4Í ´Í ´Ö’4Ö’4ä{î³ä{î³tV4tV4J„«³J„«³ÜÄ4ÜÄ4[ªf³[ªf³›7¾3›7¾3;* ³;* ³0ÁU30ÁU3¾ª�²¾ª�²ɽ2ɽ2tÎϱtÎϱ½�½1½�½1­Š9°­Š9°././@LongLink0000644000000000000000000000015200000000000011601 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/BinauralDecoder/Source/EQ/AKG-K271MK2.wavIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/BinauralDecoder/Source/EQ/AKG-K271MK0000664002537200253720000004013015257173642030614 0ustar zmoelnigzmoelnigRIFFP@WAVEfmt €»Ü factPEAKàc YiKI?iKI?data@iKI?iKI?½ ˽½ ˽Šü­=Šü­=m Œ;m Œ;½c•¾½c•¾w¾w¾¢Àp½¢Àp½Hª½;Hª½;IÀF½IÀF½¢—O=¢—O=R¼=R¼=€á=€á=]"g=]"g=/U§;/U§;E�½E�½t½¯½t½¯½0Ú3½0Ú3½aQÉ&†:>&†:x�:x�:…k’:…k’:ïo˜:ïo˜:—t™:—t™:e­Ÿ:e­Ÿ:øÔ¡:øÔ¡:²¨:²¨:Nœ¨:Nœ¨:�W­:�W­:4|®:4|®:Åáµ:Åáµ:û¸¹:û¸¹:=Â:=Â:WÕÄ:WÕÄ:µË:µË:‰SÎ:‰SÎ:l(Ö:l(Ö:ïÙ:ïÙ:*àÞ:*àÞ:jõÝ:jõÝ:•>à:•>à:—Ý:—Ý:)%ß:)%ß:Ü_Û:Ü_Û:™Ú:™Ú:ÝxÓ:ÝxÓ:%Ð:%Ð:y3È:y3È:±�Å:±�Å:¢T¾:¢T¾:$»:$»:ñt²:ñt²:ED®:ED®:”ÿ¥:”ÿ¥:�£:�£:ƒv›:ƒv›:$¾—:$¾—:½tŽ:½tŽ:ÒO‰:ÒO‰:Ø:Ø:‚îv:‚îv:ì¢e:ì¢e:dÚ\:dÚ\:6˜I:6˜I:{?:{?: ;,: ;,:_$:_$:ü”:ü”:¯” :¯” :ƒ¢ø9ƒ¢ø9£Àë9£Àë9¦­Ï9¦­Ï9‚íÉ9‚íÉ9é]´9é]´9`²9`²9ÿý�9ÿý�95�ž95�ž9‘9‘9u—š9u—š9Åê”9Åê”9¾+£9¾+£9D 9D 9Ýv±9Ýv±9Yæ³9Yæ³9¾9Ì9¾9Ì9°›Ó9°›Ó9näì9näì9p$ó9p$ó9ja:ja:¯ :¯ :` :` :Q- :Q- :½+/:½+/:)v4:)v4:¬.C:¬.C:�“I:�“I:vZ:vZ:Òca:Òca:=Œq:=Œq:Võw:Võw:a¼ƒ:a¼ƒ:º‡:º‡:üŽ:üŽ:å’:å’:‡ù˜:‡ù˜:}‰š:}‰š:�# :�# :äÉ :äÉ :|¸¥:|¸¥:‰|¥:‰|¥:ˆ©:ˆ©:^S§:^S§:“©:“©:Kä¦:Kä¦:v¢¨:v¢¨:”m¥:”m¥:÷J¦:÷J¦:5¢:5¢:?¢:?¢:·f�:·f�:ÔS�:ÔS�:§{˜:§{˜:0ê—:0ê—:ÌN’:ÌN’:@‘:@‘:Œ ‹:Œ ‹:¤‰:¤‰:wƒ:wƒ:ìª�:ìª�:åv:åv:Üùq:Üùq:š×d:š×d:·Ga:·Ga:<°T:<°T:æpQ:æpQ:�4E:�4E:†ÔB:†ÔB:È8:È8:‚{7:‚{7:@3.:@3.:%Ž.:%Ž.:e&:e&:i’':i’':Nµ :Nµ :c$:c$:ë:ë:ë":ë":Ù=:Ù=:×U#:×U#:ùÎ:ùÎ:m &:m &:=V#:=V#:¥*:¥*:?ž':?ž':(Ò.:(Ò.:CC-:CC-:1]5:1]5:[4:[4:;Œ<:;Œ<:ªr;:ªr;:v¯C:v¯C:IËB:IËB:T3K:T3K:ä;J:ä;J:HGR:HGR:œÐP:œÐP:áoX:áoX:‹�V:‹�V:϶]:϶]:H[:H[:˜a:˜a:OX]:OX]:ab:ab:%¾]:%¾]:Möa:Möa:ýy\:ýy\:ºÕ_:ºÕ_:’Y:’Y:ò8\:ò8\:ñ8U:ñ8U:NW:NW:µNO:µNO:´vP:´vP:íH:íH:Ä­H:Ä­H: ¼?: ¼?:�É?:�É?:�Z6:�Z6:ê6:ê6: K,: K,:N´+:N´+:¶!:¶!:·á :·á :d¿:d¿:iö:iö: : :ÖŒ :ÖŒ :Vé:Vé:æ¬:æ¬:à§ð9à§ð9¬úð9¬úð9&Iß9&Iß9¯¶à9¯¶à9¯%Ð9¯%Ð9 ¸Ò9 ¸Ò95^Ã95^Ã9,YÇ9,YÇ91”¹91”¹9»¿9»¿9ª‚²9ª‚²9\¹9\¹9“†­9“†­9Ö>µ9Ö>µ96«96«93´93´9d³ª9d³ª9¿$´9¿$´9«I«9«I«9zyµ9zyµ9«—­9«—­9±¸9±¸9fm±9fm±9Ìܼ9Ìܼ9ãµ9ãµ9ŒÓÁ9ŒÓÁ9 ˆ»9 ˆ»9ÕÈ9ÕÈ9ÀÕÁ9ÀÕÁ9»Î9»Î9´Ç9´Ç9ŽôÓ9ŽôÓ9nŸÍ9nŸÍ9ñ²Ù9ñ²Ù9nÇÒ9nÇÒ9ËüÝ9ËüÝ91Ö91Ö9,¾à9,¾à9?xØ9?xØ9%zâ9%zâ9–qÙ9–qÙ9 £â9 £â93ùØ93ùØ9Äá9Äá9hÆ×9hÆ×9úà9úà9�sÕ9�sÕ9øøÜ9øøÜ9q–Ñ9q–Ñ9X¬Ø9X¬Ø99úÌ99úÌ9Þ¥Ó9Þ¥Ó9�`Ç9�`Ç9uÍ9uÍ9ã¿À9ã¿À9Ì¡Æ9Ì¡Æ9ná¹9ná¹9£±¿9£±¿9—»²9—»²9‹R¸9‹R¸9ûa«9ûa«9È^±9È^±9c¥9c¥9øŠ«9øŠ«9Á~Ÿ9Á~Ÿ9'¦9'¦9™Sš9™Sš9Qt¡9Qt¡9ŒF–9ŒF–9,ù�9,ù�9õ“9õ“9"üš9"üš9kk�9kk�9>ܘ9>ܘ9“�9“�9Ô˜9Ô˜9*’Ž9*’Ž9Η9Η9£�Ž9£�Ž9¤U˜9¤U˜9Î�9Î�9ž2š9ž2š95’95’9æ´œ9æ´œ9UÞ”9UÞ”9 òŸ9 òŸ9U�˜9U�˜9dð£9dð£9æ’œ9æ’œ9ØÈ§9ØÈ§9‰I 9‰I 9ძ9ძ9z ¤9z ¤9-+¯9-+¯9Äf§9Äf§9N²9N²9 ü©9 ü©9ºy´9ºy´91¬91¬91p¶91p¶9ç½­9ç½­9#·9#·9ÔW®9ÔW®9º·9º·9l6®9l6®95·95·9Añ¬9Añ¬9'µ9'µ9¤Hª9¤Hª9/î±9/î±9Å™¦9Å™¦9”¦­9”¦­9—¡9—¡9áä§9áä§9¯:›9¯:›9"¡9"¡9C)”9C)”9é³™9é³™9÷=Œ9÷=Œ9ÜB‘9ÜB‘93fƒ93fƒ9/7ˆ9/7ˆ9l~t9l~t9~Ñ}9~Ñ}9Z[a9Z[a9j9j9ÿRM9ÿRM9¯%V9¯%V9#£99#£99â§B9â§B9(&9(&9bë.9bë.9“F9“F9tR9tR93.þ83.þ8°„9°„9UðØ8UðØ82ì82ì8×™´8×™´8ÚÙÈ8ÚÙÈ8U°’8U°’8�¨8�¨8#«e8#«e8V‰8V‰8w~)8w~)8ÏÞX8ÏÞX8Å>ç7Å>ç7Þ³%8Þ³%8¯c„7¯c„7#+ë7#+ë7¶[œ6¶[œ6j‡‘7j‡‘7ì¼¶ì¼¶<Éô6<Éô62ƒ·2ƒ·øS4¶øS4¶þæÕ·þæÕ·¿�N·¿�N·oU¸oU¸ µ· µ·09¸09¸‘"¸‘"¸³$_¸³$_¸ôY&¸ôY&¸‚¸‚¸R‡K¸R‡K¸§ •¸§ •¸ªor¸ªor¸ðº¨¸ðº¨¸ù�¸ù�¸�ÿ¼¸�ÿ¼¸Ü¢¸Ü¢¸ÆÆÒ¸ÆÆÒ¸”¸¸”¸¸€õ鸀õé¸í3иí3иÿ¹ÿ¹±è¸±è¸¹{ ¹¹{ ¹Œ¹Œ¹Ò=¹Ò=¹öÐ ¹öÐ ¹7'¹7'¹üŹüŹ24¹24¹šü'¹šü'¹ ‡A¹ ‡A¹�]5¹�]5¹¸çN¹¸çN¹–°B¹–°B¹J!\¹J!\¹ ÃO¹ ÃO¹Ï i¹Ï i¹|}\¹|}\¹MŠu¹MŠu¹¯­h¹¯­h¹î¯€¹î¯€¹ôt¹ôt¹k3†¹k3†¹¹~¹¹~¹mN‹¹mN‹¹ßC„¹ßC„¹Àý�¹Àý�¹Å´ˆ¹Å´ˆ¹Ó1”¹Ó1”¹¯Œ¹¯Œ¹‰ô—¹‰ô—¹^5�¹^5�¹o8›¹o8›¹ß.“¹ß.“¹´è�¹´è�¹¬ž•¹¬ž•¹¯! ¹¯! ¹òœ—¹òœ—¹RÞ¡¹RÞ¡¹|™¹|™¹€£¹€£¹Z#š¹Z#𹤹¤¹»ìš¹»ìš¹�¦¤¹�¦¤¹Ù^›¹Ù^›¹ùú¤¹ùú¤¹ê©›¹ê©›¹QI¥¹QI¥¹�÷›¹�÷›¹ñŒ¥¹ñŒ¥¹š)œ¹š)œ¹Õ³¥¹Õ³¥¹Qœ¹Qœ¹N䥹N䥹󄜹󄜹®¦¹®¦¹K­œ¹K­œ¹·@¦¹·@¦¹%휹%휹”›¦¹”›¦¹“]�¹“]�¹Ç§¹Ç§¹÷ñ�¹÷ñ�¹³Ó§¹³Ó§¹Ûž¹Ûž¹æ÷¨¹æ÷¨¹—3 ¹—3 ¹%zª¹%zª¹ýס¹ýס¹ÿC¬¹ÿC¬¹4Ë£¹4Ë£¹µa®¹µa®¹•¦¹•¦¹±°¹±°¹%a¨¹%a¨¹Æ³¹Æ³¹Ýߪ¹Ýߪ¹»²µ¹»²µ¹ƒŽ­¹ƒŽ­¹ël¸¹ël¸¹qL°¹qL°¹4»¹4»¹´(³¹´(³¹-¾¹-¾¹7¶¹7¶¹GÁ¹GÁ¹S¹¹S¹¹fĹfĹz¼¹z¼¹¢—ǹ¢—ǹ¡ª¿¹¡ª¿¹ä¹Ê¹ä¹Ê¹É·Â¹É·Â¹Á¸Í¹Á¸Í¹/¯Å¹/¯Å¹HªÐ¹HªÐ¹A�ȹA�ȹjpÓ¹jpÓ¹[7˹[7˹·Ö¹·Ö¹DÀ͹DÀ͹5‡Ø¹5‡Ø¹6й6йjãÚ¹jãÚ¹âuÒ¹âuÒ¹ƒݹƒݹ¯žÔ¹¯žÔ¹ë8ß¹ë8ß¹}ºÖ¹}ºÖ¹Ý@á¹Ý@á¹k©Ø¹k©Ø¹Ýã¹Ýã¹pƒÚ¹pƒÚ¹þøä¹þøä¹ÛPܹÛPܹǯæ¹Ç¯æ¹êëݹêëݹ¨6蹨6蹫gß¹«gß¹¶­é¹¶­é¹‡Ô็Ôà¹U ë¹U ë¹Wâ¹Wâ¹ýGì¹ýGì¹À\ã¹À\ã¹þ�í¹þ�í¹w¦ä¹w¦ä¹ñÔî¹ñÔî¹âå¹â幞 𹞠ð¹ç¹繊Oñ¹ŠOñ¹€_è¹€_è¹ú†ò¹ú†ò¹×ƒé¹×ƒé¹šó¹šó¹E‡ê¹E‡ê¹ÝŽô¹ÝŽô¹œg빜gë¹´Võ¹´Võ¹­ì¹­ì¹³óõ¹³óõ¹U©ì¹U©ì¹”�ö¹”�ö¹W*í¹W*í¹Âïö¹Âïö¹ƒí¹ƒí¹O9÷¹O9÷¹éÁí¹éÁí¹…o÷¹…o÷¹Žèí¹Žèí¹s÷¹s÷¹XÜí¹XÜí¹\÷¹\÷¹®¥í¹®¥í¹ƒ÷¹ƒ÷¹[=í¹[=í¹`…ö¹`…ö¹ã‹ì¹ã‹ì¹¤¶õ¹¤¶õ¹ë§ë¹ë§ë¹¥Âô¹¥Âô¹»œê¹»œê¹ü˜ó¹ü˜ó¹qRé¹qRé¹ 6ò¹ 6ò¹¶Ýç¹¶Ýç¹G±ð¹G±ð¹^@æ¹^@æ¹öî¹öî¹3eä¹3eä¹kí¹kí¹Maâ¹Maâ¹Ïïê¹Ïïê¹96à¹96๦¨è¹¦¨è¹ºÑݹºÑݹ6.æ¹6.æ¹ÚFÛ¹ÚFÛ¹(–ã¹(–ã¹èœØ¹èœØ¹Øà¹Øà¹1ÊÕ¹1ÊÕ¹Q÷ݹQ÷ݹßÒ¹ßÒ¹uÛ¹uÛ¹GÞϹGÞϹÅõ×¹Åõ×¹ÅÃ̹ÅÃ̹ÒÔ¹ÒÔ¹ž–ɹž–ɹ¢œÑ¹¢œÑ¹‚Vƹ‚VƹOSιOSι¦ù¦ù ˹ ˹*°¿¹*°¿¹h©Ç¹h©Ç¹‹V¼¹‹V¼¹–NĹ–NĹöú¸¹öú¸¹éõÀ¹éõÀ¹¤µ¹¤µ¹L ½¹L ½¹µL²¹µL²¹}Hº¹}Hº¹"ô®¹"ô®¹€ò¶¹€ò¶¹+¡«¹+¡«¹¦£³¹¦£³¹*S¨¹*S¨¹]W°¹]W°¹ ¥¹ ¥¹¬­¹¬­¹ÍÌ¡¹ÍÌ¡¹|᩹|᩹V£ž¹V£ž¹W¦¹W¦¹å�›¹å�›¹t¸£¹t¸£¹÷Œ˜¹÷Œ˜¹¿ ¹¿ ¹n–•¹n–•¹NË�¹NË�¹ˆ¤’¹ˆ¤’¹xÝš¹xÝš¹g¹�¹g¹�¹óõ—¹óõ—¹…ÓŒ¹…ÓŒ¹F•¹F•¹xó‰¹x󉹬7’¹¬7’¹ø‡¹ø‡¹9a�¹9a�¹ÚF„¹ÚF„¹]•Œ¹]•Œ¹$��¹$��¹OÕ‰¹OÕ‰¹ †}¹ †}¹b‡¹b‡¹Áx¹Áx¹a„¹a„¹öŸr¹öŸr¹�§�¹�§�¹9m¹9m¹fÃ}¹fÃ}¹Žg¹Žg¹E8x¹E8x¹�b¹�b¹±r¹±r¹Åv\¹Åv\¹Xm¹Xm¹ÌÞV¹ÌÞV¹Ç�g¹Ç�g¹ö\Q¹ö\Q¹úb¹úb¹^éK¹^éK¹‚ª\¹‚ª\¹­†F¹­†F¹‘YW¹‘YW¹¿DA¹¿DA¹—$R¹—$R¹û<¹û<¹›öL¹›öL¹Hé6¹Hé6¹ìØG¹ìØG¹ÏÔ1¹ÏÔ1¹ÌB¹ÌB¹rÇ,¹rÇ,¹Á=¹Á=¹PÁ'¹PÁ'¹§É8¹§É8¹øØ"¹øØ"¹(ñ3¹(ñ3¹µ¹µ¹§(/¹§(/¹'K¹'K¹Kƒ*¹Kƒ*¹µ»¹µ»¹þ&¹þ&¹rK¹rK¹£!¹£!¹ñ ¹ñ ¹ƒ[¹ƒ[¹[¹¹[¹¹Û-¹Û-¹ø‡¹ø‡¹zø¹zø¹ˆžþ¸ˆžþ¸TĹTĹ7;ö¸7;ö¸” ¹” ¹RÉí¸RÉí¸eS¹eS¹s=å¸s=帹¹Î¾Ü¸Î¾Ü¸ý£ÿ¸ý£ÿ¸X*Ô¸X*Ô¸E÷¸E÷¸Äz˸Äz˸„TTî¸ɸɸj’å¸j’å¸Öݹ¸Öݹ¸ò}ܸò}ܸO¡°¸O¡°¸ü)Ó¸ü)Ó¸Á.§¸Á.§¸¾“ɸ¾“ɸ€d�¸€d�¸¢�¿¸¢�¿¸\I“¸\I“¸ãsµ¸ãsµ¸z‰¸z‰¸˜*«¸˜*«¸æM}¸æM}¸<© ¸<© ¸u$h¸u$h¸Û–¸Û–¸ÃßR¸ÃßR¸b‹¸b‹¸H=¸H=¸ì€€¸ì€€¸i'¸i'¸Ò*k¸Ò*k¸‚Џ‚ЏÞ;U¸Þ;U¸7Ùö·7Ùö·ˆ?¸ˆ?¸Ä_Ê·Ä_Ê·]ñ(¸]ñ(¸u…ž·u…ž·)*¸)*¸Ñf·Ñf·îû·îû·Î1·Î1·´¿Ð·´¿Ð·“Òr¶“Òr¶Î�§·Î�§·=©5=©58î}·8î}·ŠË6ŠË67û.·7û.·‰%37‰%37PŶPŶ »~7 »~7¿>¿µ¿>¿µœV¤7œV¤7ðB6ðB6èÈ7èÈ7î6î6çê7çê7ë;7ë;7v8v8™~7™~7ÍÖ8ÍÖ8/Ÿ7/Ÿ7ÓÉ&8ÓÉ&8Ž¿7Ž¿7öX68öX68Q}Ý7Q}Ý7iRE8iRE8Ûòú7Ûòú7ëS8ëS8ÏÜ 8ÏÜ 8Ëb8Ëb8´8´8j³o8j³o80&'80&'8‘}8‘}8Yr48Yr48¥!…8¥!…8™ZA8™ZA8n�‹8n�‹8ËøM8ËøM8šË‘8šË‘8•mZ8•mZ8Þõ—8Þõ—8‹f8‹f8‹ó�8‹ó�8ägr8ägr8Þ£8Þ£8|~8|~8³ ©8³ ©8x¬„8x¬„8£'¯8£'¯8@Š8@Š8‰†´8‰†´8]_�8]_�8Ѱ¹8Ѱ¹8÷`”8÷`”8ê�¾8ê�¾8¦™8¦™8Í/Ã8Í/Ã8x™�8x™�8ø�Ç8ø�Ç88Ó¡88Ó¡8«Ë8«Ë8tÈ¥8tÈ¥8„Ï8„Ï8¡|©8¡|©8AÓ8AÓ8nݬ8nݬ8VKÖ8VKÖ8jã¯8jã¯8–(Ù8–(Ù8ËŽ²8ËŽ²8ë§Û8ë§Û8‡Ù´8‡Ù´8=ÅÝ8=ÅÝ8VŶ8VŶ8ÅŠß8ÅŠß8§]¸8§]¸8]üà8]üà8�£¹8�£¹8;"â8;"â8\¤º8\¤º8ã8ã8>`»8>`»8…Ÿã8…Ÿã8ˆÑ»8ˆÑ»8¿ðã8¿ðã83ü»83ü»8fúã8fúã8�Ú»8�Ú»8 µã8 µã8Ùn»8Ùn»8Œ0ã8Œ0ã8³Ìº8³Ìº8^wâ8^wâ8Fô¹8Fô¹8؈á8؈á8pì¸8pì¸8ítà8ítà8qÈ·8qÈ·8Hß8Hß8状8状8Þ8Þ8À;µ8À;µ8T±Ü8T±Ü84ܳ84ܳ8�KÛ8�KÛ8õh²8õh²8~ÔÙ8~ÔÙ8rè°8rè°83QØ83QØ8‘W¯8‘W¯8¹Ö8¹Ö8­²­8­²­8…Õ8…Õ8ë¬8ë¬8ÒdÓ8ÒdÓ8|Mª8|Mª8ŸªÑ8ŸªÑ8µ‹¨8µ‹¨8ÆíÏ8ÆíÏ8ŠÎ¦8ŠÎ¦8Ò5Î8Ò5Î8ê¥8ê¥8—rÌ8—rÌ8A£8A£8Ö¥Ê8Ö¥Ê8žp¡8žp¡8NØÈ8NØÈ8D™Ÿ8D™Ÿ87úÆ87úÆ8 ¬�8 ¬�8% Å8% Å8•²›8•²›8}Ã8}Ã8 ª™8 ª™8{ýÀ8{ýÀ8!Š—8!Š—8yÛ¾8yÛ¾8Èc•8Èc•8¶·¼8¶·¼8ž4“8ž4“8fº8fº8âê�8âê�8¼1¸8¼1¸80˜Ž80˜Ž8äãµ8äãµ8 BŒ8 BŒ8 ˆ³8 ˆ³8䨉8䨉8a±8a±8ùh‡8ùh‡8R°®8R°®8àñ„8àñ„8á2¬8á2¬8f‚8f‚8A¥©8A¥©8ë§8ë§8š§8š§8|z8|z8}¤8}¤88/u88/u8ÿס8ÿס8?áo8?áo8�8Ÿ8�8Ÿ8Éœj8Éœj8v™œ8v™œ8âYe8âYe8úš8úš8 D`8 D`8›‰—8›‰—8�N[8�N[8E•8E•8¢UV8¢UV8 �’8 �’8‹qQ8‹qQ8±5�8±5�8·œL8·œL8ÑË�8ÑË�8É»G8É»G8ýb‹8ýb‹8žòB8žòB8_ ‰8_ ‰8o@>8o@>8³¶†8³¶†8„–98„–98ól„8ól„8¬58¬58I7‚8I7‚8H£08H£08E€8E€8Â.,8Â.,8­�{8­�{8'Ä'8'Ä'8>w8>w8HW#8HW#86Ïr86Ïr8 Ø8 Ø8\n8\n8)j8)j8Zj8Zj8a 8a 8/®e8/®e8B±8B±8Ýda8Ýda8 r 8 r 8#@]8#@]8-L 8-L 8åY8åY8v 8v 8yU8yU8ý 8ý 80Q80Q8*ú7*ú7 M8 M8òò7òò7ÝI8ÝI8®,ê7®,ê7Q>E8Q>E8§vâ7§vâ7»gA8»gA8¹¹Ú7¹¹Ú7ï =8ï =83LÓ73LÓ7 :8 :8(Ì7(Ì7õ…68õ…68¯Å7¯Å7”38”38µm¾7µm¾7òå/8òå/88¸78¸7§Ê,8§Ê,8’å±7’å±7¢Õ)8¢Õ)8R"¬7R"¬7{'8{'8$©¦7$©¦7h$8h$8ÄS¡7ÄS¡7qÙ!8qÙ!8‹Vœ7‹Vœ7Ÿ{8Ÿ{8í°—7í°—7WD8WD8\“7\“7Ë<8Ë<8ßo�7ßo�7‘e8‘e8ÚЋ7ÚЋ7A¯8A¯8’|ˆ7’|ˆ7Š(8Š(8¶’…7¶’…7;Ò8;Ò8óñ‚7óñ‚7M—8M—8AŠ€7AŠ€7x‚8x‚8!ü|7!ü|7‰™8‰™8«ny7«ny7Ì8Ì8?Wv7?Wv7{&8{&8it7it7N²8N²8/Rr7/Rr7ØZ8ØZ8‹q7‹q7Ù"8Ù"8üPp7üPp7¥8¥8Ì p7Ì p788« p7« p7‡'8‡'8ÜŒp7ÜŒp75_85_8oq7oq7«8«8¸®r7¸®r7X8X8�t7�t7t§8t§8Eðv7Eðv7~_8~_8™þy7™þy7ÔA8ÔA8è«}7è«}7ÝE8ÝE8Þè€7Þè€7²g8²g8ž5ƒ7ž5ƒ7×£8×£8½°…7½°…7sõ8sõ8‹Zˆ7‹Zˆ7ñc8ñc8H‹7H‹7Yõ8Yõ8ÔxŽ7ÔxŽ7 ©8 ©8nø‘7nø‘7”‹8”‹8ÈÝ•7ÈÝ•7=Ÿ8=Ÿ8êš7êš7(Ú!8(Ú!8Q£ž7Q£ž7Å;$8Å;$8–x£7–x£7o¾&8o¾&877 X)8 X)8»¼­7»¼­7L,8L,8²;³7²;³7Óë.8Óë.8¹7¹7Wì18Wì18ç¿7ç¿7®58®58»vÅ7»vÅ7’X88’X88Ì7Ì7K°;8K°;8f­Ò7f­Ò7Ì?8Ì?8sÙ7sÙ7G…B8G…B8“5à7“5à7gîE8gîE8öæ7öæ7/[I8/[I8œ½í7œ½í7�ÆL8�ÆL8Òyô7Òyô7„-P8„-P8®9û7®9û74œS84œS8£8£8ùW8ùW8_8_8PiZ8PiZ8f´8f´8¢È]8¢È]8ä 8ä 8Sa8Sa8™F8™F85_d85_d8„~8„~8k¦g8k¦g85¾85¾8Öëj8Öëj8Øð8Øð8n!n8n!n8ÿ8ÿ8©Yq8©Yq8M8M8I•t8I•t8z!8z!8ÖÉw8ÖÉw8Ù§$8Ù§$8 {8 {8Nâ'8Nâ'8ÐM~8ÐM~8ˆ+8ˆ+89Ç€89Ç€8²U.8²U.8Ûo‚8Ûo‚8[¦18[¦18[„8[„8û48û48�Ï…8�Ï…8ÐV88ÐV88ᆇ8ᆇ8Â;8Â;8¤B‰8¤B‰8.?8.?8SþŠ8SþŠ8Ò B8Ò B8ðÀŒ8ðÀŒ8!F8!F8$†Ž8$†Ž8þœI8þœI8ÓG�8ÓG�8¶M8¶M8Š ’8Š ’8d•P8d•P8Ï“8Ï“8œ T8œ T8ñŽ•8ñŽ•8î‚W8î‚W8�O—8�O—8´÷Z8´÷Z8¿ ™8¿ ™8s[^8s[^8W¾š8W¾š8 ±a8 ±a8Fmœ8Fmœ8Œÿd8Œÿd8Éž8Éž8^6h8^6h8^¯Ÿ8^¯Ÿ8Yk8Yk8D¡8D¡8àrn8àrn8<Ñ¢8<Ñ¢8µtq8µtq8R¤8R¤8½ft8½ft8 Ð¥8 Ð¥8Vw8Vw8•I§8•I§83z83z8ø¨8ø¨8Â}8Â}8/'ª8/'ª8áÔ8áÔ8 ’«8 ’«8QK�8QK�8Ìô¬8Ìô¬8;§‚8;§‚8¶U®8¶U®8£„8£„8ó¯¯8ó¯¯8êO…8êO…88±88±8w›†8w›†8ŒS²8ŒS²8ùç‡8ùç‡8£¢³8£¢³8K.‰8K.‰8˜í´8˜í´8¼uŠ8¼uŠ8Ý=¶8Ý=¶8¨Â‹8¨Â‹8õ�·8õ�·8T �8T �89߸89߸8ŽWŽ8ŽWŽ88/º88/º8( �8( �8ny»8ny»8Àß�8Àß�8=º¼8=º¼8_’8_’8Òö½8Òö½8³L“8³L“8{,¿8{,¿8x”8x”8ãYÀ8ãYÀ8¬�•8¬�•8šƒÁ8šƒÁ8�¿–8�¿–8�§Â8�§Â8$Ù—8$Ù—86ÂÃ86ÂÃ8pê˜8pê˜8bÕÄ8bÕÄ8ò™8ò™8^ÚÅ8^ÚÅ8/èš8/èš8áÍÆ8áÍÆ8ÄΛ8ÄΛ8a³Ç8a³Ç8-§œ8-§œ8*‰È8*‰È8án�8án�8öOÉ8öOÉ80+ž80+ž8× Ê8× Ê8ŽÞž8ŽÞž8àÁÊ8àÁÊ81ˆŸ81ˆŸ8²mË8²mË88+ 88+ 8ºÌ8ºÌ8¤Ä 8¤Ä 8˜ªÌ8˜ªÌ8zO¡8zO¡895Í895Í8ÚΡ8ÚΡ8Ž´Í8Ž´Í8¢A¢8¢A¢8&Î8&Î8Ò¦¢8Ò¦¢8ŒÎ8ŒÎ8ç£8ç£85êÎ85êÎ8æV£8æV£8¦?Ï8¦?Ï8©¢£8©¢£8VŽÏ8VŽÏ8àè£8àè£8ì×Ï8ì×Ï8†)¤8†)¤8 Ð8 Ð8Ža¤8Ža¤8ZSÐ8ZSÐ8掤8掤8Q�Ð8Q�Ð8α¤8α¤8F¥Ð8F¥Ð8¿Ê¤8¿Ê¤8žÐ8žÐ8Mؤ8Mؤ8ÌÐ8ÌÐ8’Ù¤8’Ù¤8¥ÍÐ8¥ÍÐ8lϤ8lϤ8ŽÃÐ8ŽÃÐ8ø¤8ø¤8 ¬Ð8 ¬Ð8z”¤8z”¤8ˆ‡Ð8ˆ‡Ð8�c¤8�c¤8»UÐ8»UÐ8ª#¤8ª#¤8òÐ8òÐ8ÆÑ£8ÆÑ£8Ó¾Ï8Ó¾Ï8Ûo£8Ûo£8[Ï8[Ï8[ý¢8[ý¢8„åÎ8„åÎ8Ox¢8Ox¢8Ÿ]Î8Ÿ]Î8©á¡8©á¡8KÄÍ8KÄÍ8‡8¡8‡8¡8cÍ8cÍ8B| 8B| 8;YÌ8;YÌ8Œ°Ÿ8Œ°Ÿ8mŒË8mŒË8±Õž8±Õž8f¯Ê8f¯Ê8|ê�8|ê�8§ÃÉ8§ÃÉ8€òœ8€òœ8ÀËÈ8ÀËÈ8¡í›8¡í›8ÆÇ8ÆÇ8ëÚš8ëÚš8ž³Æ8ž³Æ8Ÿ¼™8Ÿ¼™8µ•Å8µ•Å8鑘8鑘8ÚjÄ8ÚjÄ8R[—8R[—8|6Ã8|6Ã8 –8 –8.úÁ8.úÁ8üÔ”8üÔ”8ú²À8ú²À8ÿ‚“8ÿ‚“8?d¿8?d¿8\+’8\+’8ˆ¾8ˆ¾8Ë�8Ë�8߯¼8߯¼8x`�8x`�8—H»8—H»8ãï�8ãï�8iÚ¹8iÚ¹8òuŒ8òuŒ8/a¸8/a¸8®ñŠ8®ñŠ8€à¶8€à¶8 h‰8 h‰8Yµ8Yµ8�Ó‡8�Ó‡8�ó8�ó8Æ0†8Æ0†8ü!²8ü!²8„„8„„8dv°8dv°8@Ë‚8@Ë‚8Ù¼®8Ù¼®8ÿ�8ÿ�8©ø¬8©ø¬8m~8m~8',«8',«8(»z8(»z8mS©8mS©8Üðv8Üðv8(p§8(p§8[s8[s8¢„¥8¢„¥8$%o8$%o8Œ£8Œ£8k8k8憡8憡8ùöf8ùöf8ÈvŸ8ÈvŸ8}¼b8}¼b8OY�8OY�8»g^8»g^8 1›8 1›8rZ8rZ8M™8M™8Ì�U8Ì�U8YÊ–8YÊ–8a Q8a Q8¬‹”8¬‹”8‘{L8‘{L8ŒH’8ŒH’8–àG8–àG8¯ý�8¯ý�8÷6C8÷6C8®�8®�8ˆ>8ˆ>8E[‹8E[‹8OÍ98OÍ98a‰8a‰8‹58‹58¡†8¡†8708708Ö@„8Ö@„8†d+8†d+8IÜ�8IÜ�8uŒ&8uŒ&8zð~8zð~8Œ¹!8Œ¹!8,z8,z8hå8hå8Dcu8Dcu83838ž›p8ž›p8F:8F:8PÔk8PÔk8Œ`8Œ`8'g8'g8û} 8û} 8-b8-b8O˜8O˜8ŽQ]8ŽQ]8qQÿ7qQÿ7ÃiX8ÃiX8*^õ7*^õ7ª}S8ª}S8­kë7­kë7P’N8P’N8·tá7·tá7W¢I8W¢I8Qu×7Qu×7ðD8ðD8êuÍ7êuÍ7½?8½?8ghÃ7ghÃ7é¾:8é¾:8zF¹7zF¹7߸58߸58¯7¯7dª08dª08þΤ7þΤ7.�+8.�+8Žmš7Žmš7Th&8Th&8„�7„�7Õ>!8Õ>!8t‹…7t‹…7n 8n 8,v7,v7>Û8>Û8Aa7Aa7©8©8ëL7ëL7¿q 8¿q 8¸é67¸é678:88:8Ô!7Ô!7Ú8Ú8¶ 7¶ 7$’ù7$’ù7-ï6-ï6Û#ï7Û#ï7 Å6 Å6Ûºä7Ûºä7â ›6â ›6nVÚ7nVÚ7ƒ€b6ƒ€b6ÛÐ7ÛÐ7äˆ6äˆ6ü¼Å7ü¼Å7: u5: u5rŽ»7rŽ»7®Ç ´®Ç ´È|±7È|±7=ûȵ=ûȵ‚§7‚§7R%4¶R%4¶Fœ�7Fœ�7·x�¶·x�¶>Ñ“7>Ñ“7û`¨¶û`¨¶N!Š7N!Š7ÀÔζÀÔζf‹€7f‹€7(Çô¶(Çô¶p)n7p)n7 ·Â ·%w[7%w[7CŠ·CŠ·—I7—I7Ŷ1·Å¶1·�Ì67�Ì67÷›C·÷›C·¢Ó$7¢Ó$7+DU·+DU·Â 7 75²f·5²f·z7z7�èw·�èw·Ò0à6Ò0à6"q„·"q„·-Þ½6-Þ½6QÍŒ·QÍŒ·úœ6úœ6´•·´•·Á-u6Á-u6é%�·é%�·&%36&%36'¥·'¥·´²ã5´²ã5A ­·A ­·©óE5©óE5Ê´·Ê´·ù[´ù[´a¼·a¼·KÅ—µKÅ—µÿÑ÷ÿÑ÷sÙ¶sÙ¶çË·çË·§PD¶§PD¶Ô"Ò·Ô"Ò·gc~¶gc~¶¬Ù·¬Ù·ü�›¶ü�›¶$³ß·$³ß· )·¶ )·¶á/æ·á/æ·ÄÒ¶ÄÒ¶2�ì·2�ì·&^ì¶&^ì¶Pžò·Pžò·zâ·zâ·ö|ø·ö|ø·�"·�"·!þ·!þ·óò·óò·Ó¸Ó¸åB&·åB&·WS¸WS¸/1·/1·æÅ¸æÅ¸�;·�;·É ¸É ¸žsE·žsE·®P ¸®P ¸O·O·;o ¸;o ¸�6X·�6X·1r¸1r¸�ü`·�ü`·òY¸òY¸áei·áei·¯)¸¯)¸¿pq·¿pq·IÞ¸IÞ¸Óy·Óy·Åx¸Åx¸é.€·é.€·ý¸ý¸Ÿ¨ƒ·Ÿ¨ƒ·äg¸äg¸ ò†· ò†·»¸»¸DŠ·DŠ·û¸û¸É�·É�·B$¸B$¸‚ä�·‚ä�· 7¸ 7¸Á’’·Á’’·e9¸e9¸¶•·¶•·Ø& ¸Ø& ¸“„—·“„—·åÿ ¸åÿ ¸ÄÈ™·ÄÈ™·¡È!¸¡È!¸Gí›·Gí›·#}"¸#}"¸è�·è�· #¸ #¸ÂÀŸ·ÂÀŸ· «#¸ «#¸®|¡·®|¡·©'$¸©'$¸£·£·�$¸�$¸íƒ¤·íƒ¤·)ç$¸)ç$¸Û¥·Û¥·‘-%¸‘-%¸I §·I §·W`%¸W`%¸T ¨·T ¨·Y„%¸Y„%¸+©·+©·í•%¸í•%¸¨ç©·¨ç©·y“%¸y“%¸N—ª·N—ª·Þ€%¸Þ€%¸=(«·=(«·m[%¸m[%¸u“«·u“«·ß"%¸ß"%¸#à«·#à«·Û$¸Û$¸ß¬·ß¬·�$¸�$¸7¬·7¬·‚$¸‚$¸é ¬·é ¬·Ÿ#¸Ÿ#¸½ç«·½ç«·Û#¸Û#¸%¢«·%¢«·µ€"¸µ€"¸ÇB«·ÇB«·»Û!¸»Û!¸ Ǫ· Ǫ·g%!¸g%!¸q)ª·q)ª·Ù] ¸Ù] ¸Mo©·Mo©·¯‡¸¯‡¸ã—¨·ã—¨·®Ÿ¸®Ÿ¸Pž§·Pž§·™§¸™§¸ðŒ¦·ðŒ¦·.¤¸.¤¸:f¥·:f¥·@“¸@“¸A$¤·A$¤·>t¸>t¸Ì¢·Ì¢·úI¸úI¸ ]¡· ]¡·1¸1¸ïÑŸ·ïÑŸ·¯Ê¸¯Ê¸a1ž·a1ž·cy¸cy¸�{œ·�{œ··¸·¸¬š·¬š· °¸ °¸ªË˜·ªË˜·=¸=¸ÊÛ–·ÊÛ–·©À¸©À¸¥Ú”·¥Ú”·À;¸À;¸`Í’·`Í’·^° ¸^° ¸R³�·R³�·¸ ¸¸ ¸‹Ž·‹Ž·¡‚ ¸¡‚ ¸¹ZŒ·¹ZŒ·ä¸ä¸o!Š·o!Š·1?¸1?¸݇·݇·§”¸§”¸œ�…·œ�…·~å¸~å¸';ƒ·';ƒ·U0¸U0¸“Û€·“Û€·�ìþ·�ìþ·íê|·íê|·@qû·@qû·ýx·ýx·pî÷·pî÷·¡0s·¡0s·ïfô·ïfô·Jn·Jn·}Ûð·}Ûð··[i··[i·ÚIí·ÚIí·Äbd·Äbd·û±é·û±é·õ`_·õ`_·#æ·#æ·;SZ·;SZ·Wnâ·Wnâ·k8U·k8U·ËÁÞ·ËÁÞ·nP·nP·JÛ·JÛ·�éJ·�éJ·[×·[×·’»E·’»E·4¤Ó·4¤Ó·y�@·y�@·�ìÏ·�ìÏ·µ_;·µ_;·44Ì·44Ì·Æ26·Æ26·~{È·~{È·ú1·ú1·EÁÄ·EÁÄ·×+·×+·«Á·«Á·%©&·%©&·óJ½·óJ½·Ó!·Ó!·/’¹·/’¹·»\·»\·¬Üµ·¬Üµ·�C·�C·æ,²·æ,²·è9·è9·D…®·D…®·™B ·™B ·¯æª·¯æª·Ã^·Ã^·Q§·Q§·<Œ·<Œ· ã· ã·½“ý¶½“ý¶= ·= ·ó1ô¶ó1ô¶œ¿œ·œ¿œ·²òê¶²òê¶®J™·®J™·úÚá¶úÚá¶Ûà•·Ûà•·¦óض¦óض�‚’·�‚’·'8ж'8ж/�·/�·ý«Ç¶ý«Ç¶Œè‹·Œè‹·úV¿¶úV¿¶å®ˆ·å®ˆ·%.·¶%.·¶8…·8…·ñ.¯¶ñ.¯¶æZ‚·æZ‚·Á\§¶Á\§¶]�~·]�~·¶¬Ÿ¶¶¬Ÿ¶']x·']x· ˜¶ ˜¶.Nr·.Nr·þ¿�¶þ¿�¶ Tl· Tl·_‚‰¶_‚‰¶®jf·®jf·•h‚¶•h‚¶æ•`·æ•`·¦ív¶¦ív¶ÛÓZ·ÛÓZ·�Gi¶�Gi¶Ð U·Ð U·�ß[¶�ß[¶Ñ€O·Ñ€O·ÄN¶ÄN¶�óI·�óI·èçA¶èçA¶ºvD·ºvD·“L5¶“L5¶ ?· ?·òÿ(¶òÿ(¶ý¸9·ý¸9·™¶™¶4z4·4z4·YZ¶YZ¶¤S/·¤S/·g ¶g ¶SD*·SD*· "öµ "öµ2J%·2J%·§Í൧ÍàµYh ·Yh ·ã3̵ã3̵už·už·‰:¸µ‰:¸µôé·ôé·g餵g餵øN·øN·êZ’µêZ’µæÌ ·æÌ ·æm€µæm€µ,` ·,` ·QN^µQN^µ« ·« ·ìT=µìT=µÕ·Õ·Z¡µZ¡µùcù¶ùcù¶~eþ´~eþ´(Pñ¶(Pñ¶xtÄ´xtÄ´mé¶mé¶LÑŒ´LÑŒ´þ°á¶þ°á¶ýÐ.´ýÐ.´S"Ú¶S"Ú¶ ’³ ’³@¾Ò¶@¾Ò¶(¨Æ2(¨Æ2}˶}˶ÅÍí3ÅÍí3ücĶücĶQ¡P4Q¡P4yq½¶yq½¶ñj“4ñj“4 ¶¶ ¶¶ÚƼ4ÚÆ¼4‹ô¯¶‹ô¯¶…ä4…ä4=n©¶=n©¶Fç5Fç5²£¶²£¶Fó5Fó5vÄœ¶vÄœ¶ó(5ó(5T¤–¶T¤–¶†s85†s85c¤�¶c¤�¶vþG5vþG5!ÉŠ¶!ÉŠ¶™V5™V5 …¶ …¶Â[d5Â[d5zÿ~¶zÿ~¶¢5u>¢5¸¯¶¸¯¶\|¢5\|¢5í÷µí÷µÏg¢5Ïg¢5;üêµ;üêµ²ÿ¡5²ÿ¡5‡Þµ‡ÞµLL¡5LL¡5F‰ÒµF‰ÒµM 5M 5³ǵ³ǵŒŸ5ŒŸ5Øñ»µØñ»µƒ�5ƒ�51E±µ1E±µ®È›5®È›5J§µJ§µ Ø™5 Ø™5�µ�µá¸—5ḗ5š“µš“µÇk•5Çk•5¹uе¹uеëñ’5ëñ’5Z®�µZ®�µN�5N�5š‡rµš‡rµË�5Ë�5‡mbµ‡mbµ‰Š5‰Š5eSµeSµòo‡5òo‡5$IDµ$IDµ°5„5°5„5Ò66µÒ66µÖÜ€5ÖÜ€5HÊ(µHÊ(µeÏz5eÏz5”µ”µ‚¬s5‚¬s5ißµißµhQl5hQl5ÑaµÑaµiÁd5iÁd5ó´ó´Žþ\5Žþ\5Z�Þ´Z�Þ´v U5v U5÷cË´÷cË´õL5õL5*X¹´*X¹´áºD5áºD5Ýp¨´Ýp¨´Äe<5Äe<5Õ ˜´Õ ˜´ü35ü35,à‰´,à‰´ô‚+5ô‚+5ŽIx´ŽIx´¿#5¿#5ÄÇ^´ÄÇ^´9{59{5‘,G´‘,G´Âö5Âö5ðc1´ðc1´oz 5oz 5áV´áV´L 5L 5ð ´ð ´lfñ4lfñ4¼(ô³¼(ô³zîà4zîà4ÇUÕ³ÇUÕ³¹»Ð4¹»Ð4ÂD¹³ÂD¹³ÒÚÀ4ÒÚÀ4Ÿ³Ÿ³‡Y±4‡Y±4Ψˆ³Î¨ˆ³T@¢4T@¢4…¼g³…¼g³à˜“4à˜“48B³8B³Xl…4Xl…4ÿj!³ÿj!³gƒo4gƒo4!H³!H³IGU4IGU4öŽÕ²öŽÕ²—8<4—8<4Oc©²Oc©²Ag$4Ag$4S–ƒ²S–ƒ²-ç 4-ç 4w@G²w@G²”ñ3”ñ3#4²#4²ñ>Ê3ñ>Ê3­Cα­Cα›ó¥3›ó¥3—#б—#бCÔ„3CÔ„3÷ ,±÷ ,±N3N3%-ð%-ðEN3EN33£:°3£:°¦×2¦×20y¯0y¯ðË2ðË2"Õ–+"Õ–+6262^$�.^$�.“I�1“I�1èb.èb.¥‘0¥‘0(¤-(¤-././@LongLink0000644000000000000000000000016400000000000011604 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/BinauralDecoder/Source/EQ/AudioTechnica-ATH-M50.wavIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/BinauralDecoder/Source/EQ/AudioTechn0000664002537200253720000004013015257173642031363 0ustar zmoelnigzmoelnigRIFFP@WAVEfmt €»Ü factPEAKàc Y�9W?�9W?data@�9W?�9W?Ú£‚½Ú£‚½Å·è<Å·è<'‚J½'‚J½ð¾ð¾€…b¾€…b¾µã|½µã|½•Jø=•Jø=�’ó=�’ó=ø(>ø(>~ŠÅ=~ŠÅ='ø$='ø$=7O687O68î{æ¼î{æ¼(aƽ(aÆ½ŠµÄ½ŠµÄ½&ì'½&ì'½"&<"&<Æ (=Æ (=�R.=�R.=—°;—°;r²½r²½Ñ7½Ñ7½—Çv¼—Çv¼6“„<6“„<ÔöÕ<ÔöÕ<{õ!<{õ!ô�:>ô�:ìÂ:ìÂ:–k�:–k�:øÂ:øÂ:>F�:>F�:;Â:;Â:Ý�:Ý�:ZOÂ:ZOÂ:*I�:*I�:À6Á:À6Á:²Ž:²Ž:Äõ¿:Äõ¿:ÝŒ:ÝŒ:•±¾:•±¾: S‹: S‹:ŸË¼:ŸË¼:5‰:5‰:¼Žº:¼Žº:ôö†:ôö†:E¸:E¸:Ñš„:Ñš„:çǵ:çǵ:Ž‚:Ž‚:FD³:FD³:¨F:¨F:ϰ:ϰ:Kz:Kz:OA®:OA®:>5u:>5u: »«: »«:‡Hp:‡Hp:º<©:º<©:¯4k:¯4k:”¦¦:”¦¦:1%f:1%f:½6¤:½6¤:¬a:¬a:ï!¢:ï!¢:X¨]:X¨]:í  :í  :ƒWY:ƒWY:Ò�:Ò�:ÈU:ÈU:‹Æ›:‹Æ›:šBQ:šBQ:û™:û™:_ÁM:_ÁM:å3˜:å3˜:æIJ:æIJ:g�–:g�–:\]G:\]G:�7•:�7•:QÕD:QÕD:?ó“:?ó“:‚dB:‚dB::Æ’::Æ’:(E@:(E@:·Ð‘:·Ð‘:D”>:D”>:c‘:c‘:ˆ=:ˆ=:ýK�:ýK�:Í;:Í;:B¯�:B¯�:9¬::9¬::<�:<�:°9:°9:x·Ž:x·Ž:8(9:8(9:S‡Ž:S‡Ž:Ôè8:Ôè8:=`Ž:=`Ž:¡•8:¡•8:“9Ž:“9Ž:}8:}8:è9Ž:è9Ž:ô†8:ô†8::/Ž::/Ž:@k8:@k8:h)Ž:h)Ž:Ÿ¯8:Ÿ¯8:³mŽ:³mŽ:ð_9:ð_9:º´Ž:º´Ž:cÈ9:cÈ9:¿×Ž:¿×Ž:$::$::£�:£�:¦©::¦©::ÇD�:ÇD�:=ÿ::=ÿ::–h�:–h�:èi;:èi;:-­�:-­�:›<:›<:�õ�:�õ�:fŽ<:fŽ<:¯(�:¯(�:ü<:ü<:@Y�:@Y�: Y=: Y=:€x�:€x�:Ú�=:Ú�=:C–�:C–�:ü=:ü=: Ù�: Ù�:7•>:7•>:'‘:'‘: ?: ?: U‘: U‘:z–?:z–?:–‘:–‘:6@:6@:ÇÉ‘:ÇÉ‘:Í{@:Í{@:Æù‘:Æù‘:úA:úA:™E’:™E’:w©A:w©A:’’:’’:OHB:OHB:Ãä’:Ãä’:BC:BC:,Q“:,Q“:péC:péC:~¡“:~¡“:ÿlD:ÿlD:Žà“:Žà“:1!E:1!E:úP”:úP”:¬%F:¬%F:Ë”:Ë”:°G:°G:¹;•:¹;•:ÔH:ÔH:áÌ•:áÌ•:vMI:vMI:–Z–:–Z–:œSJ:œSJ:ŽÓ–:ŽÓ–:ì_K:ì_K:µd—:µd—:KŸL:KŸL:Àÿ—:Àÿ—:êÓM:êÓM:—˜:—˜:±O:±O:±<™:±<™:¸gP:¸gP:¦Ñ™:¦Ñ™:Z}Q:Z}Q:!Pš:!Pš:ĉR:ĉR:§Ùš:§Ùš:P¦S:P¦S:[V:>[V:ošœ:ošœ:9W:9W:°íœ:°íœ:\ÁW:\ÁW:Ç;�:Ç;�:é]X:é]X:¶}�:¶}�:Ž×X:Ž×X:ß°�:ß°�:`AY:`AY:FÛ�:FÛ�:†Y:†Y:Kë�:Kë�:÷œY:÷œY:7ó�:7ó�:ÂY:ÂY:*ž:*ž:ŽÐY:ŽÐY:«ð�:«ð�:~�Y:~�Y:ÈÁ�:ÈÁ�:�:Y:�:Y:é”�:é”�:=ÛX:=ÛX:!P�:!P�:ž7X:ž7X:„ñœ:„ñœ:³…W:³…W:6™œ:6™œ:ãÚV:ãÚV:‡3œ:‡3œ:éõU:éõU:í®›:í®›:…åT:…åT:à›:à›:ÞÅS:ÞÅS:Ô‚š:Ô‚š:ƒR:ƒR:iØ™:iØ™:À:Q:À:Q:3™:3™:õO:õO:†˜:†˜:ð•N:ð•N:ÝÍ—:ÝÍ—:Ò,M:Ò,M:«—:«—:Ž¿K:Ž¿K:U–:U–:;=J:;=J:\�•:\�•:œÃH:œÃH:ªÔ”:ªÔ”:^\G:^\G:}”:}”:ñíE:ñíE:f^“:f^“: zD: zD:# ’:# ’:®C:®C:­ß‘:­ß‘:ö‹A:ö‹A:ƒ!‘:ƒ!‘:2@:2@:Oi�:Oi�:�¼>:�¼>:o¸�:o¸�:Om=:Om=:–�:–�:Ê-<:Ê-<:mŽ:mŽ:Íå::Íå::ôÁ�:ôÁ�:­š9:­š9:æ�:æ�:»j8:»j8: ‰Œ: ‰Œ:;Q7:;Q7:©ø‹:©ø‹:¤86:¤86:~j‹:~j‹:s/5:s/5:=èŠ:=èŠ:…;4:…;4:njŠ:njŠ:³C3:³C3:}è‰:}è‰:4L2:4L2:Éo‰:Éo‰:u1:u1:‰:‰:´0:´0:Ô£ˆ:Ô£ˆ:ö/:ö/:êAˆ:êAˆ:Î?/:Î?/:Ðå‡:Ðå‡:À”.:À”.:½Œ‡:½Œ‡:Eê-:Eê-:,4‡:,4‡:öD-:öD-::߆::߆:5¦,:5¦,:lŒ†:lŒ†:d,:d,:N9†:N9†:Çl+:Çl+:<é…:<é…:ÂÕ*:ÂÕ*:˜…:˜…:«6*:«6*:âB…:âB…:–):–):ñ„:ñ„:ý(:ý(:ž„:ž„:JW(:JW(: E„: E„:ѯ':ѯ':Uðƒ:Uðƒ:^':^':會:會:Mk&:Mk&:Z@ƒ:Z@ƒ:í·%:í·%:ëã‚:ëã‚:¬%:¬%:å…‚:å…‚:vJ$:vJ$:¶‚:¶‚:è}#:è}#:¢³�:¢³�:ñ²":ñ²":�I�:�I�:ã!:ã!:ûÚ€:ûÚ€:“ !:“ !:åi€:åi€:‘, :‘, :�å:�å:>=:>=:è~:è~:çF:çF:,ì}:,ì}:ÈS:ÈS:eì|:eì|:aT:aT::ß{::ß{:�N:�N:ÃÔz:ÃÔz:»N:»N:ÃÈy:ÃÈy:ñ>:ñ>:Ü£x:Ü£x:H:H:Lxw:Lxw:‡ú:‡ú:zPv:zPv:þÖ:þÖ:Pu:Pu:f¨:f¨:Oæs:Oæs:Ðv:Ðv:h©r:h©r:ò<:ò<:4bq:4bq:û:û:Œp:Œp:<¸:<¸:ÕÈn:ÕÈn:Cj:Cj:yom:yom:% :% :hl:hl:\Ì :\Ì :/¾j:/¾j:Án :Án :uQi:uQi:÷ :÷ :däg:däg:û¢:û¢:ïqf:ïqf:½.:½.:$îd:$îd:y±:y±:?kc:?kc:×6:×6:Näa:Näa:Н:Н:M`:M`:$:$:‚´^:‚´^:ký9ký9°]:°]:°åù9°åù9ðn[:ðn[:,™ö9,™ö9ÂY:ÂY:šRó9šRó9`X:`X:Úýï9Úýï9Â\V:Â\V:S–ì9S–ì9i¡T:i¡T:Õ.é9Õ.é9?âR:?âR:˜²å9˜²å9Q:Q:�â9�â9ßCO:ßCO:—�Þ9—�Þ9¦tM:¦tM: üÚ9 üÚ9qŸK:qŸK:¦]×9¦]×9’ÇI:’ÇI:#¼Ó9#¼Ó9ÓìG:ÓìG:äÐ9äÐ9" F:" F:±XÌ9±XÌ9®(D:®(D:…£È9…£È9�DB:�DB:–åÄ9–åÄ9/]@:/]@:+Á9+Á9_{>:_{>:6y½96y½9ž˜<:ž˜<:§º¹9§º¹9‡®::‡®::Æøµ9Æøµ9ÇÊ8:ÇÊ8:8H²98H²9èê6:èê6:†”®9†”®9©5:©5:“ãª9“ãª9í,3:í,3:ÿB§9ÿB§9U1:U1:�ž£9�ž£9pz/:pz/:ØüŸ9ØüŸ9³¥-:³¥-:hœ9hœ9Ó+:Ó+:͘9͘9hý):hý):M8•9M8•9.1(:.1(:d¸‘9d¸‘9­j&:­j&:7Ž97Ž9� $:� $:峊9峊9NÛ":NÛ":ïB‡9ïB‡97!:7!:‹Ýƒ9‹Ýƒ9e:e:?y€9?y€9j­:j­:×>z9×>z9’û:’û:(žs9(žs9àL:àL:Âÿl9Âÿl9Ûœ:Ûœ:š^f9š^f9î:î:cÉ_9cÉ_9ëC:ëC:IY9IY9À�:À�:DÑR9DÑR9á÷:á÷:`TL9`TL9>Q:>Q:‡ÝE9‡ÝE9z­:z­:ýp?9ýp?9� :� :ª 99ª 997k :7k :‡®29‡®29¸Ï :¸Ï :5h,95h,9Š7:Š7:ª#&9ª#&9ù�:ù�:ÏØ9ÏØ9ö:ö:’9’9îk:îk:W9W9 Ø: Ø:Ý- 9Ý- 9÷G:÷G:99'sý9'sý9äõ9äõ9­Xú9­Xú9mÆõ8mÆõ8ÍC÷9ÍC÷9ù¿é8ù¿é8A7ô9A7ô9ÕÔÝ8ÕÔÝ8I0ñ9I0ñ9²ÿÑ8²ÿÑ8Ê/î9Ê/î9NÆ8NÆ8¨:ë9¨:ë9ƺ8ƺ8$Jè9$Jè95¯85¯8ŸVå9ŸVå9¼´£8¼´£8ýoâ9ýoâ9°t˜8°t˜8T•ß9T•ß9‹C�8‹C�8n¸Ü9n¸Ü9{‚8{‚8ÇãÙ9ÇãÙ9Í9n8Í9n8Y×9Y×9H‘X8H‘X8SZÔ9SZÔ9ÇòB8ÇòB8i�Ñ9i�Ñ9–Å-8–Å-8ñÎ9ñÎ9Ãü8Ãü8@KÌ9@KÌ9ÙQ8ÙQ8íªÉ9íªÉ9Ïàß7Ïàß7µÇ9µÇ9/³·7/³·7¨†Ä9¨†Ä9UÜ�7UÜ�7UÿÁ9UÿÁ9ªEQ7ªEQ7Õ€¿9Õ€¿9”f7”f7½9½9’¾V6’¾V6l‹º9l‹º9x ¶µx ¶µ&¸9&¸9ßIŶßIŶ䭵9ä­µ9¡Â.·¡Â.·�C³9�C³9ð-y·ð-y·ºè°9ºè°9Ú,¡·Ú,¡·Å�®9Å�®9dÓÅ·dÓÅ·t9¬9t9¬9€ê·€ê·—ë©9—ë©9Æó¸Æó¸¡§9¡§9CŸCŸØ\¥9Ø\¥9çH*¸çH*¸Æ"£9Æ"£9`‘;¸`‘;¸hì 9hì 9+ÄL¸+ÄL¸K»ž9K»ž9 ½]¸ ½]¸y�œ9y�œ9_±n¸_±n¸Ñ`š9Ñ`š9Ó¬¸Ó¬¸ñ8˜9ñ8˜9鈸鈸ý–9ý–9Î8�¸Î8�¸c ”9c ”9AP˜¸AP˜¸Fú‘9Fú‘9 I ¸ I ¸(ñ�9(ñ�9A1¨¸A1¨¸ºè�9ºè�9Û°¸Û°¸å‹9å‹9ÍÓ·¸ÍÓ·¸í‰9í‰9­k¿¸­k¿¸Dû‡9Dû‡9nòƸnòƸô†9ô†9í]θí]θð'„9ð'„9WÀÕ¸WÀÕ¸jA‚9jA‚9½ݸ½ݸnc€9nc€9};ä¸};ä¸P#}9P#}9·@븷@ë¸Ä†y9Ćy9X6ò¸X6ò¸“üu9“üu9Óõø¸Óõø¸¸‰r9¸‰r9!¡ÿ¸!¡ÿ¸Bo9Bo9&)¹&)¹©k9©k9`j¹`j¹÷Zh9÷Zh9á“ ¹á“ ¹7e97e9Ó» ¹Ó» ¹ZØa9ZØa9DÔ¹DÔ¹»¯^9»¯^9,Ù¹,Ù¹"“[9"“[9ÁÖ¹ÁÖ¹¤X9¤X9¹Å¹¹Å¹”~U9”~U9�£¹�£¹ ‹R9 ‹R9Qt¹Qt¹ò¨O9ò¨O9/!¹/!¹/ÜL9/ÜL9|Ú#¹|Ú#¹ÂJ9ÂJ9$z&¹$z&¹ jG9 jG9 )¹ )¹ÎÒD9ÎÒD9€u+¹€u+¹yIB9yIB9:Ú-¹:Ú-¹¡Õ?9¡Õ?9Ù%0¹Ù%0¹µy=9µy=9±]2¹±]2¹â.;9â.;9‚4¹‚4¹Vþ89Vþ89/ˆ6¹/ˆ6¹Íç69Íç69L|8¹L|8¹0à490à49^:¹^:¹Žð29Žð29¨$<¹¨$<¹'19'19UØ=¹UØ=¹(R/9(R/9�{?¹�{?¹©¡-9©¡-9ôA¹ôA¹V,9V,9ãnB¹ãnB¹#�*9#�*9–ÎC¹–ÎC¹c)9c)9E¹E¹êÄ'9êÄ'9§IF¹§IF¹O�&9O�&9ühG¹ühG¹hS%9hS%9‹mH¹‹mH¹‹B$9‹B$9˜WI¹˜WI¹þE#9þE#9ž3J¹ž3J¹\U"9\U"9ŸK¹ŸK¹ùt!9ùt!9�¿K¹�¿K¹R¤ 9R¤ 9amL¹amL¹#ä9#ä9n M¹n M¹ï79ï79Õ‘M¹Õ‘M¹ñœ9ñœ9 N¹ N¹#9#9‡yN¹‡yN¹ÙŠ9ÙŠ9\ÞN¹\ÞN¹`9`9×6O¹×6O¹Á¤9Á¤9,ƒO¹,ƒO¹ºD9ºD9EÁO¹EÁO¹êó9êó9)ñO¹)ñO¹®9®9LP¹LP¹»i9»i9BDP¹BDP¹‡)9‡)9[fP¹[fP¹Zñ9Zñ9`€P¹`€P¹ À9 À9»•P¹»•P¹…’9…’9§P¹§P¹Mi9Mi9#³P¹#³P¹�F9�F9ºP¹ºP¹h%9h%9¬ÂP¹¬ÂP¹Ð9Ð9£ÊP¹£ÊP¹óä9óä9˜ÇP¹˜ÇP¹Ò9Ò9ÀP¹ÀP¹=¾9=¾9»P¹»P¹ˆª9ˆª9ͱP¹Í±P¹)�9)�9K¤P¹K¤P¹ô�9ô�90™P¹0™P¹™�9™�9z‹P¹z‹P¹px9px9ÒyP¹ÒyP¹Øo9Øo9�iP¹�iP¹Žg9Žg9…UP¹…UP¹£d9£d9G>P¹G>P¹ì`9ì`9ì)P¹ì)P¹ß\9ß\9|P¹|P¹Oa9Oa9HñO¹HñO¹§d9§d9Þ×O¹Þ×O¹]d9]d9»O¹»O¹?m9?m9q•O¹q•O¹@y9@y94sO¹4sO¹¹9¹9üRO¹üRO¹¼‰9¼‰9-O¹-O¹n–9n–9D O¹D O¹ 9 9åN¹åN¹å­9å­9È»N¹È»N¹/¿9/¿9ø‘N¹ø‘N¹vÏ9vÏ9&hN¹&hN¹·à9·à9?N¹?N¹Ùî9Ùî9¸N¹¸N¹.û9.û9CòM¹CòM¹F 9F 9’ÈM¹’ÈM¹Â9Â9o¦M¹o¦M¹ú 9ú 9†M¹†M¹“)9“)9ÃeM¹ÃeM¹>-9>-9’NM¹’NM¹!(9!(9¤;M¹¤;M¹À#9À#9�&M¹�&M¹è9è9°M¹°M¹a9a9¯M¹¯M¹õ 9õ 9ŽøL¹ŽøL¹Ýÿ9Ýÿ9­îL¹­îL¹#ï9#ï9�çL¹�çL¹ÄÝ9ÄÝ9 âL¹ âL¹È9È9âL¹âL¹Ô®9Ô®9âL¹âL¹Û—9Û—9˜áL¹˜áL¹o|9o|9.éL¹.éL¹ Z9 Z9¬óL¹¬óL¹ó79ó79^þL¹^þL¹ì9ì9ÇM¹ÇM¹šä9šä9Ì%M¹Ì%M¹r¹9r¹9î7M¹î7M¹½�9½�9 OM¹ OM¹\9\9riM¹riM¹r)9r)9£…M¹£…M¹°ò9°ò9�§M¹�§M¹7·97·9ŽÊM¹ŽÊM¹²}9²}9:íM¹:íM¹ @9 @9‚N¹‚N¹˜ý9˜ý9{@N¹{@N¹,½9,½9jN¹jN¹x9x9ŠœN¹ŠœN¹“*9“*9�ÓN¹�ÓN¹yÜ9yÜ9- O¹- O¹_Œ9_Œ9 FO¹ FO¹è59è59>‡O¹>‡O¹ÎÛ9ÎÛ9wËO¹wËO¹è}9è}9ëP¹ëP¹÷9÷9¦dP¹¦dP¹Ý¯9ݯ9ºP¹ºP¹ @9 @9òQ¹òQ¹:Í9:Í9¢qQ¹¢qQ¹[W9[W9ÑÓQ¹ÑÓQ¹ªÙ9ªÙ9_>R¹_>R¹6U96U9„­R¹„­R¹Í9Í9å!S¹å!S¹G=9G=9¡žS¹¡žS¹E§9E§9}T¹}T¹“9“9¢T¹¢T¹èo9èo9°0U¹°0U¹±Å 9±Å 9@ÇU¹@ÇU¹D 9D 9FbV¹FbV¹Õ` 9Õ` 9 W¹ W¹t£ 9t£ 9æ®W¹æ®W¹Uà 9Uà 9Š^X¹Š^X¹� 9� 9¢Y¹¢Y¹?A 9?A 9°ÙY¹°ÙY¹•d9•d9™£Z¹™£Z¹n€9n€9+u[¹+u[¹^”9^”9gN\¹gN\¹z¡9z¡9].]¹].]¹ý¦9ý¦9^¹^¹Ê¢9Ê¢9 _¹ _¹’•9’•9±`¹±`¹kƒ9kƒ9a¹a¹â8×>â8êtp¹êtp¹`ß8`ß8Ñq¹Ñq¹7xÜ87xÜ8ž1s¹ž1s¹V†Ù8V†Ù8à—t¹à—t¹>ŠÖ8>ŠÖ8Úv¹Úv¹ÏˆÓ8ψÓ8¥nw¹¥nw¹=€Ð8=€Ð8Ãßx¹Ãßx¹“oÍ8“oÍ8–Sz¹–Sz¹ÿ[Ê8ÿ[Ê8“É{¹“É{¹¤?Ç8¤?Ç8åE}¹åE}¹ÑÄ8ÑÄ8(Æ~¹(Æ~¹RìÀ8RìÀ80#€¹0#€¹ô½½8ô½½8“倹“倹i…º8i…º8§©�¹§©�¹'K·8'K·8ªm‚¹ªm‚¹ß ´8ß ´84ƒ¹4ƒ¹"ð8"ð8(ýƒ¹(ýƒ¹ u­8 u­8«Å„¹«Å„¹ä(ª8ä(ª8o�…¹o�…¹…Ò¦8…Ò¦8•[†¹•[†¹w£8w£8(‡¹(‡¹© 8© 8“õ‡¹“õ‡¹Ã¶œ8öœ8ÄĈ¹ÄĈ¹ÃP™8ÃP™8¹“‰¹¹“‰¹ ë•8 ë•8vcйvcйÍ’8Í’8U4‹¹U4‹¹Š�8Š�8Œ¹Œ¹'¦‹8'¦‹8äÖŒ¹äÖŒ¹.3ˆ8.3ˆ8p©�¹p©�¹øÂ„8øÂ„8lz޹lz޹æW�8æW�89K�¹9K�¹Ó{8Ó{8�¹�¹/ót8/ót8Ÿî�¹Ÿî�¹xn8xn8¯¿‘¹¯¿‘¹@g8@g8S�’¹S�’¹o`8o`8Å_“¹Å_“¹ä¥Y8ä¥Y8¿.”¹¿.”¹AßR8AßR8 ý”¹ ý”¹~"L8~"L8Ê•¹Ê•¹UjE8UjE8—–¹—–¹ˆ®>8ˆ®>8Ad—¹Ad—¹Ž88Ž88Ï-˜¹Ï-˜¹"r18"r18 ö˜¹ ö˜¹Mà*8Mà*8 ¾™¹ ¾™¹OZ$8OZ$8šƒš¹šƒš¹0æ80æ8âG›¹âG›¹gw8gw8J œ¹J œ¹Ñ8Ñ8ÖËœ¹ÖËœ¹íÏ 8íÏ 8-Š�¹-Š�¹k•8k•8²Fž¹²Fž¹�Úü7�Úü7H¥ð7H¥ð72ºŸ¹2ºŸ¹?�ä7?�ä7dq ¹dq ¹ó�Ø7ó�Ø7)%¡¹)%¡¹ùÌÌ7ùÌÌ7òÖ¡¹òÖ¡¹ù"Á7ù"Á7š†¢¹š†¢¹ä«µ7䫵7ã2£¹ã2£¹Ù]ª7Ù]ª7µÝ£¹µÝ£¹ Ÿ7 Ÿ70‡¤¹0‡¤¹2”72”7H-¥¹H-¥¹à&‰7à&‰7ÉÐ¥¹ÉÐ¥¹ñË|7ñË|7br¦¹br¦¹“g7“g7>§¹>§¹œ´R7œ´R7­§¹Â­§¹W>7W>7+H¨¹+H¨¹yË)7yË)7…ߨ¹…ߨ¹@ã7@ã7t©¹t©¹±R7±R7®ª¹®ª¹£_Þ6£_Þ6¸“ª¹¸“ª¹>ì¸6>ì¸6«¹«¹#”6#”6·§«¹·§«¹L%`6L%`6‰,¬¹‰,¬¹ï6ï6f®¬¹f®¬¹Ÿ)ª5Ÿ)ª5t-­¹t-­¹&zŽ4&zŽ4©­¹©­¹Ùï>µÙï>µh!®¹h!®¹å(ßµå(ßµ4–®¹4–®¹›¢-¶›¢-¶ˆ¯¹ˆ¯¹¼j¶¼j¶�u¯¹�u¯¹T’¶T’¶Õ߯¹Õ߯¹§¤®¶§¤®¶TF°¹TF°¹ßʶßʶ—©°¹—©°¹ƒªä¶ƒªä¶w±¹w±¹©ÿý¶©ÿý¶xb±¹xb±¹ · ·Å¸±¹Å¸±¹Ì·Ì·h ²¹h ²¹öñ!·öñ!·EY²¹EY²¹P~,·P~,·Î¢²¹Î¢²¹v�6·v�6·ƒè²¹ƒè²¹¤@·¤@·4)³¹4)³¹]æH·]æH·nd³¹nd³¹Ú Q·Ú Q·À›³¹À›³¹zéX·zéX·Kϳ¹Kϳ¹x%`·x%`·ëý³¹ëý³¹½¼f·½¼f·œ'´¹œ'´¹¤½l·¤½l·�L´¹�L´¹lr·lr·il´¹il´¹¯Øv·¯Øv·N‡´¹N‡´¹%{·%{·ú�´¹ú�´¹¢ ~·¢ ~·Ý¯´¹Ý¯´¹ÛÌ€·ÛÌ€·Š¼´¹Š¼´¹µö�·µö�·Ä´¹Ä´¹ˆÉ‚·ˆÉ‚·ïÅ´¹ïÅ´¹×Bƒ·×Bƒ·™Â´¹™Â´¹ènƒ·ènƒ·°º´¹°º´¹ Oƒ· Oƒ·�­´¹�­´¹¬×‚·¬×‚·0›´¹0›´¹­ ‚·­ ‚·�ƒ´¹�ƒ´¹ 쀷 쀷`f´¹`f´¹à~·à~·ÂC´¹ÂC´¹tG{·tG{·]´¹]´¹Þw·Þw·öï³¹öï³¹Ä9r·Ä9r·¾³¹¾³¹ÂÂl·ÂÂl·ˆ³¹ˆ³¹‘£f·‘£f·@L³¹@L³¹aÙ_·aÙ_·d ³¹d ³¹uX·uX·žÅ²¹žÅ²¹’bP·’bP·z²¹z²¹â£G·â£G·þ)²¹þ)²¹L^>·L^>·‹Õ±¹‹Õ±¹ w4· w4·T{±¹T{±¹XÖ)·XÖ)·±¹±¹ñ­·ñ­·¿¸°¹¿¸°¹/ë·/ë·ÝO°¹ÝO°¹ƒs·ƒs·â¯¹â¯¹£íò¶£íò¶]p¯¹]p¯¹Åç×¶Åç×¶Õù®¹Õù®¹•�»¶•�»¶`~®¹`~®¹"ž¶"ž¶Òþ­¹Òþ­¹Ä)¶Ä)¶>z­¹>z­¹ t?¶ t?¶óð¬¹óð¬¹Ñ‰ûµÑ‰ûµ;d¬¹;d¬¹WõhµWõhµ3Ó«¹3Ó«¹S_:4S_:4�=«¹�=«¹=)§5=)§5{¤ª¹{¤ª¹¢H6¢H6Jª¹Jª¹Mi6Mi6{e©¹{e©¹i·›6i·›6Ü¿¨¹Ü¿¨¹ ½Ã6 ½Ã62¨¹2¨¹ÄÐì6ÄÐì6lh§¹lh§¹[o 7[o 7鶦¹é¶¦¹óõ 7óõ 7ú¦¹ú¦¹s77s77ÉF¥¹ÉF¥¹v¤M7v¤M7üˆ¤¹üˆ¤¹=·d7=·d7ÊÆ£¹ÊÆ£¹ÑX|7ÑX|7±£¹±£¹ 2Š7 2Š7z7¢¹z7¢¹¡p–7¡p–7)j¡¹)j¡¹´ô¢7´ô¢7̘ ¹Ì˜ ¹ê²¯7겯7ýß¹ýß¹(®¼7(®¼7çêž¹çêž¹_ïÉ7_ïÉ7æ ž¹æ ž¹Sh×7Sh×7~-�¹~-�¹×å7×å7ÏHœ¹ÏHœ¹øó7øó7#`›¹#`›¹Ú¨8Ú¨8çsš¹çsš¹?ã8?ã8pƒ™¹pƒ™¹î?8î?82�˜¹2�˜¹¥¶8¥¶8Ñ——¹Ñ——¹ÕI8ÕI8kœ–¹kœ–¹Íþ%8Íþ%8*�•¹*�•¹,Î-8,Î-8òš”¹òš”¹)·58)·58•“¹•“¹Ì¿=8Ì¿=8l‹’¹l‹’¹”ãE8”ãE8Ë~‘¹Ë~‘¹_N8_N8øn�¹øn�¹uV8uV8*\�¹*\�¹á^8á^8¡F޹¡F޹œdg8œdg8ø-�¹ø-�¹ñp8ñp8›Œ¹›Œ¹×°x8×°x8¾ôй¾ôйŻ€8Å»€8ÑÓ‰¹ÑÓ‰¹í*…8í*…8”°ˆ¹”°ˆ¹Ý ‰8Ý ‰8Ó‹‡¹Ó‹‡¹oŽ8oŽ8ªd†¹ªd†¹.§’8.§’8Ë:…¹Ë:…¹_9—8_9—8Ü„¹Ü„¹üÒ›8üÒ›8‹à‚¹‹à‚¹ñq 8ñq 8å­�¹å­�¹†¥8†¥8Sw€¹Sw€¹:¹©8:¹©8#z~¹#z~¹g_®8g_®8fþ{¹fþ{¹–³8–³8òzy¹òzy¹²·8²·8Bðv¹Bðv¹Ý\¼8Ý\¼8Ô_t¹Ô_t¹Á8Á87Êq¹7Êq¹P«Å8P«Å8÷.o¹÷.o¹ÜOÊ8ÜOÊ8vŽl¹vŽl¹UñÎ8UñÎ8?éi¹?éi¹z�Ó8z�Ó82?g¹2?g¹o*Ø8o*Ø8Ê�d¹Ê�d¹%ÀÜ8%ÀÜ8üÞa¹üÞa¹±Oá8±Oá8÷)_¹÷)_¹Ùå8Ùå8Ÿq\¹Ÿq\¹L\ê8L\ê82¶Y¹2¶Y¹ëØî8ëØî8È÷V¹È÷V¹ÕNó8ÕNó8¥6T¹¥6T¹½÷8½÷8MsQ¹MsQ¹õ"ü8õ"ü8ù­N¹ù­N¹=@9=@9ªæK¹ªæK¹�j9�j9êI¹êI¹ù�9ù�9§SF¹§SF¹±9±9Œ‡C¹Œ‡C¹Í9Í9Ǻ@¹Çº@¹Æã 9Æã 9$î=¹$î=¹iô 9iô 9y ;¹y ;¹?9?9ôQ8¹ôQ8¹994„5¹4„5¹ 9 9Ÿ¶2¹Ÿ¶2¹£þ9£þ9¿è/¹¿è/¹·ñ9·ñ9S-¹S-¹&Ý9&Ý9.Q*¹.Q*¹DÂ9DÂ9 †'¹ †'¹Z¡9Z¡9á»$¹á»$¹øx9øx9žó!¹žó!¹'I 9'I 9ï,¹ï,¹ã"9ã"9Fh¹Fh¹ÏÒ#9ÏÒ#9ª¥¹ª¥¹-Œ%9-Œ%9,å¹,å¹q='9q='9e'¹e'¹—æ(9—æ(9l¹l¹È‡*9ȇ*9|³¹|³¹ ,9 ,9ßþ ¹ßþ ¹;¯-9;¯-9-M ¹-M ¹{6/9{6/9kž¹kž¹»´09»´09öó¹öó¹G)29G)29›M¹›M¹¨”39¨”39Wý¸Wý¸ÿõ49ÿõ49|ø¸|ø¸ÕL69ÕL69çíò¸çíò¸ô™79ô™79Èí¸Èí¸}Ü89}Ü89A®è¸A®è¸ù:9ù:9áŸã¸áŸã¸A;9A;9Ĝ޸Ĝ޸c<9c<9 §Ù¸ §Ù¸"y=9"y=9â¾Ô¸â¾Ô¸…>9…>9ÑàϸÑàϸ†?9†?91˸1˸Íz@9Íz@9PƸPƸ`dA9`dA9i›Á¸i›Á¸–BB9–BB95ö¼¸5ö¼¸ C9 C9Ù`¸¸Ù`¸¸ÜÙC9ÜÙC9+Ù³¸+Ù³¸”D9”D9Ia¯¸Ia¯¸”AE9”AE9úª¸úª¸äâE9äâE9P¢¦¸P¢¦¸úwF9úwF9T[¢¸T[¢¸hG9hG9È$ž¸È$ž¸ß|G9ß|G9Úý™¸Úý™¸=íG9=íG9®ç•¸®ç•¸QH9QH93⑸3⑸ê¨H9ê¨H9Tí�¸Tí�¸4ôH94ôH9/ Џ/ Џ3I93I9‹7†¸‹7†¸*fI9*fI9ät‚¸ät‚¸L�I9L�I9}‡}¸}‡}¸ÿ§I9ÿ§I9YGv¸YGv¸í¶I9í¶I9e(o¸e(o¸Ì¹I9̹I9y,h¸y,h¸´°I9´°I9Qa¸Qa¸‹œI9‹œI9�”Z¸�”Z¸ó|I9ó|I9‰úS¸‰úS¸ŒQI9ŒQI9J�M¸J�M¸/I9/I9¾'G¸¾'G¸hÙH9hÙH9ÿð@¸ÿð@¸ŒH9ŒH9šÚ:¸šÚ:¸=4H9=4H9ká4¸ká4¸öÑG9öÑG9„/¸„/¸·dG9·dG9©O)¸©O)¸íF9íF9Œµ#¸Œµ#¸ÈjF9ÈjF9§;¸§;¸ÞE9ÞE9à¸à¸–GE9–GE9P¡¸P¡¸L§D9L§D9¬€¸¬€¸8ýC98ýC9á| ¸á| ¸ÏIC9ÏIC9±•¸±•¸ÅŒB9ÅŒB9Pšÿ·Pšÿ·öÅA9öÅA9­Cö·­Cö·3ö@93ö@9 #í· #í·Ÿ@9Ÿ@9é9ä·é9ä·&9ìQ>9uÓ·uÓ·_=9_=9ÐËÊ·ÐËÊ·–c<9–c<92¿Â·2¿Â·ã_;9ã_;9纷纷T:9T:90D³·0D³·A@99A@991Ô«·1Ô«·À$89À$896—¤·6—¤·}79}797Ž�·7Ž�·ŒÖ59ŒÖ59§·–·§·–·Y¤49Y¤49"�·"�· k39 k39ˆ›‰·ˆ›‰·”*29”*29CWƒ·CWƒ·#ã09#ã09ì„z·ì„z·û”/9û”/9„¸n·„¸n·C@.9C@.9­Ic·­Ic·å,9å,9‡6X·‡6X·†ƒ+9†ƒ+9}M·}M·æ*9æ*97C·7C·®(9®(9â9·â9·D:'9D:'9¸o/·¸o/·ØÀ%9ØÀ%9&·&·B$9B$9 · ·«½"9«½"9Œf·Œf·Ì3!9Ì3!9  ·  ·Ô¤9Ô¤9"·"·ÿ9ÿ9ˆžø¶ˆžø¶Lx9Lx9+Ïé¶+Ïé¶ùÚ9ùÚ9C•Û¶C•Û¶q99q99SíͶSíͶ•“9•“9ãâÀ¶ãâÀ¶Aé9Aé9×p´¶×p´¶;9;9Á…¨¶Á…¨¶C‰9C‰9×#�¶×#�¶ÚÓ9ÚÓ99K’¶9K’¶99­ò‡¶­ò‡¶;_ 9;_ 99|¶9|¶3  93  9 ‹i¶ ‹i¶pÞ 9pÞ 9¯ÄW¶¯ÄW¶"9"9SìF¶SìF¶TS9TS9Ãò6¶Ãò6¶‰Š9‰Š9€¿'¶€¿'¶ë¿9ë¿9'b¶'b¶?ó9?ó9dÜ ¶dÜ ¶àIþ8àIþ82 þµ2 þµ³ªú8³ªú8ÏøåµÏøåµé÷8é÷8EϵEϵeó8eó8pÓ¹µpÓ¹µü¿ï8ü¿ï8Ñ–¥µÑ–¥µ´ì8´ì8í”’µí”’µtrè8trè8a½€µa½€µ¾Êä8¾Êä8÷_µ÷_µó"á8ó"á8¿{@µ¿{@µ�{Ý8�{Ý8YÝ"µYÝ"µûÔÙ8ûÔÙ8–&µ–&µ&/Ö8&/Ö8"zÚ´"zÚ´½ŠÒ8½ŠÒ8\ß©´\ß©´ÕçÎ8ÕçÎ8¼y´¼y´QFË8QFË8¢f&´¢f&´&§Ç8&§Ç8ø!°³ø!°³° Ä8° Ä8ѧy²Ñ§y²�pÀ8�pÀ8k•K3k•K3zÙ¼8zÙ¼8 Tâ3 Tâ3 F¹8 F¹8ö¥*4ö¥*4ܵµ8ܵµ8ºû^4ºû^4i)²8i)²8Rµ‡4Rµ‡4F¡®8F¡®8÷�4÷�4M«8M«8�$²4�$²4è�§8è�§8P®Ä4P®Ä4p#¤8p#¤8PrÕ4PrÕ4¼­ 8¼­ 8´Pä4´Pä4.=�8.=�8U¶ñ4U¶ñ4Ò™8Ò™8zŠý4zŠý4zl–8zl–8Æà5Æà5¨ “8¨ “8+i5+i5³�8³�8‘X 5‘X 5¤_Œ8¤_Œ8c�5c�5t‰8t‰8m65m65òË…8òË…8lU5lU50Œ‚80Œ‚8­ë5­ë5Ö¦~8Ö¦~8x5x5ÁCx8ÁCx8ùÂ5ùÂ5Iïq8Iïq8á5á5Ù©k8Ù©k8óä5óä5¬se8¬se8 U5 U5õL_8õL_8 m5 m5�6Y8�6Y8I5I5¨0S8¨0S8­Ð5­Ð56;M86;M8ð 5ð 5ðVG8ðVG8ï5ï5-„A8-„A82ñ 52ñ 5ÈÂ;8ÈÂ;8�ƒ 5�ƒ 5Z68Z68Yñ5Yñ5:v08:v08y/5y/5kë*8kë*8h>5h>5as%8as%8x25x25y 8y 8‡ ú4‡ ú4·¼8·¼8akó4akó4z~8z~8¾ ì4¾ ì4 T8 T8o£å4o£å4‰= 8‰= 8zÞ4zÞ4Y;8Y;8´D×4´D×4ÎM8ÎM8ÿÏ4ÿÏ4üéø7üéø7{£È4{£È4Gbï7Gbï7)>Á4)>Á4æ7æ7Éй4Éй4yÒÜ7yÒÜ7g]²4g]²4:ËÓ7:ËÓ7õª4õª4ÇïÊ7ÇïÊ7Ìš£4Ìš£4}@Â7}@Â7îPœ4îPœ4¹½¹7¹½¹7_•4_•4Ûg±7Ûg±7¶÷�4¶÷�4(?©7(?©7@ê†4@ê†4D¡7D¡7Ó÷4Ó÷4w™7w™7½br4½br4iØ‘7iØ‘7Êe4Êe4zhŠ7zhŠ7X!X4X!X4”'ƒ7”'ƒ7RxK4RxK4Ü+x7Ü+x7=?4=?4»gj7»gj7Ä34Ä34Ž]7Ž]7J~'4J~'4ùÿO7ùÿO7”L4”L4u]C7u]C77‚47‚4w77w77Ç4Ç4|=+7|=+7 8ú3 8ú3ûÀ7ûÀ7Èç3Èç3t§7t§7·¥Ô3·¥Ô3lñ 7lñ 7�&Ã3�&Ã3³>ÿ6³>ÿ6Zƒ²3Zƒ²3>cë6>cë6¾·¢3¾·¢3!QØ6!QØ6ñ·“3ñ·“3 Æ6 Æ6Gƒ…3Gƒ…3Å‹´6Å‹´6ûPp3ûPp3IÚ£6IÚ£6çGW3çGW3 õ“6 õ“6ÎÎ?3ÎÎ?3˜Ü„6˜Ü„6ðã)3ðã)3#m6#m6gy3gy3Í(R6Í(R6W�3W�3YË86YË86Z÷á2Z÷á2Ô !6Ô !6‡¼Á2‡¼Á2ë 6ë 6¹C¤2¹C¤2fÔì5fÔì5Ô�‰2Ô�‰2£Ç5£Ç5£b2£b2C•¤5C•¤5I72I72[…5[…5ù2ù2¢ÌR5¢ÌR5\ûÞ1\ûÞ1Qp!5Qp!50O¥10O¥1õFí4õFí4>‘i1>‘i1¡Ð¤4¡Ð¤4¥61¥61êS4êS4äÀ·0äÀ·0/mí3/mí3V{80V{80eS3eS3¤–‚/¤–‚/ÖS2ÖS2²úã-²úã-././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/BinauralDecoder/Source/EQ/Sennheiser-HD650.wavIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/BinauralDecoder/Source/EQ/Sennheiser0000664002537200253720000004013015257173642031443 0ustar zmoelnigzmoelnigRIFFP@WAVEfmt €»Ü factPEAKác Yá¸[?á¸[?data@á¸[?á¸[?­¬¾­¬¾¤D¾¤D¾ŠÆ¾ŠÆ¾o-ˆ¾o-ˆ¾–Ƚ–Ƚ?V>?V>–®'>–®'>É£I½É£I½h”Œ½h”Œ½í€½í€½%¿:%¿:Àí½»Àí½»P„Î9P„Î9:N ½:N ½'-½'-½«í\<«í\<ìÏ=ìÏ=TÆ—è„:>è„:{uˆ:{uˆ:g\‹:g\‹:8nŒ:8nŒ:&HŒ:&HŒ:/ä‹:/ä‹:�ì‹:�ì‹:³t�:³t�:ÜÓ�:ÜÓ�:çÛ”:çÛ”:" ˜:" ˜:O™:O™:Tɘ:Tɘ:£é—:£é—:îU˜:îU˜:W¬š:W¬š:Šñ�:Šñ�:x; :x; :dL :dL :¬¡ž:¬¡ž:Ÿìœ:Ÿìœ:§©œ:§©œ:)Î�:)Î�:æÎž:æÎž:#cž:#cž:ò¨œ:ò¨œ:½«š:½«š:!‹™:!‹™:ON™:ON™:ì˜:ì˜:c¶—:c¶—:Þ–:Þ–:f½”:f½”:vÉ“:vÉ“:/ï’:/ï’:>è‘:>è‘:Œ­�:Œ­�:Ž�:Ž�:§áŽ:§áŽ:8‰Ž:8‰Ž: Ž: Ž:‹[�:‹[�:ຌ:ຌ:¿sŒ:¿sŒ:囌:囌:0÷Œ:0÷Œ:a"�:a"�: �: �:váŒ:váŒ:„÷Œ:„÷Œ:þk�:þk�:Ž:Ž:‰�Ž:‰�Ž:4±Ž:4±Ž:%­Ž:%­Ž:ÃŽ:ÃŽ:Ÿ�:Ÿ�:�«�:�«�:™ �:™ �:mI�:mI�:K1�:K1�:ì�:ì�:Eí�:Eí�:é �:é �:5 �:5 �:Cñ�:Cñ�: i�: i�:mÃŽ:mÃŽ:YŽ:YŽ: UŽ: UŽ:ifŽ:ifŽ:â&Ž:â&Ž:ûn�:ûn�:£¢Œ:£¢Œ:?Œ:?Œ:ŸkŒ:ŸkŒ:‚¶Œ:‚¶Œ:U¦Œ:U¦Œ:ÐŒ:ÐŒ:UT‹:UT‹:ÄïŠ:ÄïŠ:ô‹:ô‹:y‹:y‹:µ‹:µ‹:n£‹:n£‹:Ði‹:Ði‹: U‹: U‹:‹�‹:‹�‹:ÀŒ:ÀŒ:ù’Œ:ù’Œ:+ûŒ:+ûŒ:ÀL�:ÀL�:¨Ž�:¨Ž�:Þ�:Þ�:1Ž:1Ž:ŠŽ:ŠŽ:5ãŽ:5ãŽ:ØI�:ØI�:’¥�:’¥�:Oç�:Oç�:Aü�:Aü�:C�:C�:°�:°�:´8�:´8�:‚q�:‚q�:n¢�:n¢�:|œ�:|œ�:fj�:fj�:ª�:ª�:K×�:K×�:n­�:n­�:¦ �:¦ �:…|�:…|�:V-�:V-�:窎:窎:åŽ:åŽ:E£�:E£�:�b�:�b�:&,�:&,�:mߌ:mߌ: jŒ: jŒ:Ðî‹:Ðî‹:'ˆ‹:'ˆ‹:™P‹:™P‹:U%‹:U%‹: íŠ: íŠ:i•Š:i•Š:„KŠ:„KŠ::)Š::)Š:~3Š:~3Š:„>Š:„>Š:ñ6Š:ñ6Š:BŠ:BŠ:“ñ‰:“ñ‰:}û‰:}û‰:9Š:9Š:o}Š:o}Š:¡±Š:¡±Š:jÅŠ:jÅŠ:�ÙŠ:�ÙŠ:ìýŠ:ìýŠ:êH‹:êH‹:u¡‹:u¡‹:¸û‹:¸û‹:`?Œ:`?Œ:5vŒ:5vŒ:Œ Œ:Œ Œ:ÏÙŒ:ÏÙŒ:�:�:;d�:;d�:¥�:¥�:$ä�:$ä�:5Ž:5Ž:27Ž:27Ž:™QŽ:™QŽ:ŸnŽ:ŸnŽ:AˆŽ:AˆŽ:ƒ²Ž:ƒ²Ž:FÙŽ:FÙŽ:¼õŽ:¼õŽ:`ôŽ:`ôŽ:ÜåŽ:ÜåŽ: ÐŽ: ÐŽ:üÍŽ:üÍŽ:JÐŽ:JÐŽ:®ÓŽ:®ÓŽ:ú½Ž:ú½Ž:L–Ž:L–Ž:]Ž:]Ž:ò/Ž:ò/Ž:ëŽ:ëŽ:—í�:—í�:¨Ç�:¨Ç�:›™�:›™�:–U�:–U�:Ñ�:Ñ�:ÇÍŒ:ÇÍŒ:t˜Œ:t˜Œ:aŒ:aŒ:©*Œ:©*Œ:èä‹:èä‹:w¡‹:w¡‹:±X‹:±X‹:ï‹:ï‹:WÙŠ:WÙŠ:QžŠ:QžŠ:\Š:\Š:"Š:"Š:lä‰:lä‰:j°‰:j°‰:@x‰:@x‰:˜B‰:˜B‰:œ‰:œ‰:�Lj:�Lj:j�ˆ:j�ˆ:Icˆ:Icˆ:#;ˆ:#;ˆ:�ˆ:�ˆ:+æ‡:+æ‡:Џ‡:Џ‡:鈇:鈇:Òf‡:Òf‡:7F‡:7F‡:¬/‡:¬/‡:‡:‡:�ø†:�ø†:ÎÕ†:ÎÕ†:8¶†:8¶†: ‘†: ‘†:êx†:êx†:jd†:jd†:S[†:S[†:«G†:«G†:X2†:X2†:à†:à†:*†:*†:Óò…:Óò…:-ò…:-ò…:ßæ…:ßæ…:”Ù…:”Ù…:öÂ…:öÂ…:¢´…:¢´…:€¤…:€¤…:�ž…:�ž…:;�…:;�…:Z„…:Z„…:øq…:øq…:¤i…:¤i…:P]…:P]…:jU…:jU…:ÌA…:ÌA…:·1…:·1…:ó…:ó…:s…:s…: …: …:¤…:¤…:�ê„:�ê„:^Ò„:^Ò„:}µ„:}µ„:Ö¥„:Ö¥„:W“„:W“„:̓„:̓„:Ôe„:Ôe„:ýH„:ýH„:á$„:á$„:² „:² „:óëƒ:óëƒ:E׃:E׃:¸¹ƒ:¸¹ƒ:¹�ƒ:¹�ƒ: wƒ: wƒ:MVƒ:MVƒ:Å1ƒ:Å1ƒ:îƒ:îƒ:Dù‚:Dù‚: Þ‚: Þ‚:X·‚:X·‚:£–‚:£–‚:Íq‚:Íq‚: V‚: V‚:â4‚:â4‚:h‚:h‚:Gö�:Gö�:Ü�:Ü�:*¾�:*¾�:Ù§�:Ù§�:ë‰�:ë‰�:Eq�:Eq�:XR�:XR�:–=�:–=�:%%�:%%�:(�:(�:Òô€:Òô€: Ý€: Ý€:àÀ€:àÀ€:S°€:S°€:⛀:⛀:•‹€:•‹€:�o€:�o€:tX€:tX€:Û>€:Û>€:£3€:£3€: %€: %€:a€:a€:u€:u€:#Ö:#Ö:°¢:°¢:~Š:~Š:…n:…n:^:^:36:36:::sä~:sä~:ÇÊ~:ÇÊ~:â«~:â«~:ùœ~:ùœ~:‡|~:‡|~:²b~:²b~:‰6~:‰6~:Ä~:Ä~:‡ö}:‡ö}:ºâ}:ºâ}:—À}:—À}:C¨}:C¨}:¬}}:¬}}:Wa}:Wa}:î;}:î;}:5'}:5'}:ô}:ô}:eç|:eç|:?¹|:?¹|: š|: š|:oq|:oq|:}W|:}W|:h+|:h+|:5|:5|:¬Ñ{:¬Ñ{:P¬{:P¬{:L}{:L}{:u]{:u]{:p-{:p-{:Ü{:Ü{:FÓz:FÓz:õ­z:õ­z:Áyz:Áyz:ßPz:ßPz:úz:úz:’ìy:’ìy:µy:µy:)Žy:)Žy:šWy:šWy:”)y:”)y:5éx:5éx:Ï·x:Ï·x:~x:~x:¾Yx:¾Yx:J*x:J*x:+x:+x:±Äw:±Äw:s�w:s�w:«Rw:«Rw:>,w:>,w:Îýv:Îýv:ÝÚv:ÝÚv:Å v:Å v:­mv:­mv:o-v:o-v:Lv:Lv:�Ïu:�Ïu:­u:­u:Ñxu:Ñxu:þLu:þLu:�u:�u:,ät:,ät:A­t:A­t:ì†t:ì†t:UQt:UQt:*'t:*'t:†ìs:†ìs:¦¿s:¦¿s:e…s:e…s:‘Ys:‘Ys:õs:õs:‘òr:‘òr:¸r:¸r:-Œr:-Œr:CRr:CRr:ó%r:ó%r:êq:êq:å¼q:å¼q:‚‚q:‚‚q:NVq:NVq:¢q:¢q:ðp:ðp:$¶p:$¶p:ȉp:ȉp:ÌNp:ÌNp:¶!p:¶!p:�æo:�æo:†»o:†»o:iƒo:iƒo:?Zo:?Zo:#o:#o:–ún:–ún:åÃn:åÃn:±›n:±›n:ñdn:ñdn:·=n:·=n:Ë n:Ë n: èm: èm:»µm:»µm:‘Žm:‘Žm:ÛUm:ÛUm:,m:,m:¦÷l:¦÷l:ˆÕl:ˆÕl:Ô¥l:Ô¥l:��l:��l:@Jl:@Jl:wl:wl:Rèk:Rèk:ZÃk:ZÃk:l’k:l’k:²ok:²ok:;k:;k:Tk:Tk:p×j:p×j:�¬j:�¬j:ttj:ttj:DLj:DLj:Øj:Øj:™íi:™íi:{µi:{µi:މi:މi:Ni:Ni:/#i:/#i:~ìh:~ìh:…Æh:…Æh:²‘h:²‘h:�hh:�hh:….h:….h: h: h:ØÍg:ØÍg:†¨g:†¨g:Atg:Atg: Mg: Mg: g: g:(ðf:(ðf:½f:½f:œ™f:œ™f:±ff:±ff:?Af:?Af:> f:> f:oée:oée:Q¸e:Q¸e:–e:–e:de:de:-?e:-?e:– e:– e:Bèd:Bèd:Ï·d:Ï·d: —d: —d:õfd:õfd:ŒCd:ŒCd:Îd:Îd:Ìêc:Ìêc:¸c:¸c:V•c:V•c:9dc:9dc:Ñ@c:Ñ@c:A c:A c:çäb:çäb:d¯b:d¯b:QŠb:QŠb:�Wb:�Wb:’3b:’3b:vÿa:vÿa:Ùa:Ùa:¤a:¤a:¹~a:¹~a:‘Ja:‘Ja:V$a:V$a:kî`:kî`:–Ç`:–Ç`:“`:“`:Vn`:Vn`:ò9`:ò9`:S`:S`:€Ú_:€Ú_: ²_: ²_:‡~_:‡~_:[_:[_:(_:(_:~_:~_:·É^:·É^:í ^:í ^:·T:>·T:ÅkT:ÅkT:ñ-T:ñ-T:üÞS:üÞS:HžS:HžS:çNS:çNS:WS:WS:LÀR:LÀR: R: R:ö,R:ö,R:,éQ:,éQ:I–Q:I–Q:ËRQ:ËRQ:£ÿP:£ÿP:éºP:éºP:&fP:&fP:ÛP:ÛP:ðÉO:ðÉO:ЂO:ЂO:¾+O:¾+O:þâN:þâN:OŠN:OŠN:Á@N:Á@N:ÍçM:ÍçM:,�M:,�M:éAM:éAM:°ôL:°ôL:Ä—L:Ä—L:ÀJL:ÀJL:)ïK:)ïK:U¢K:U¢K:ŽDK:ŽDK:œôJ:œôJ:=•J:=•J:FJ:FJ:;èI:;èI:w™I:w™I::I::I:¥èH:¥èH:•‡H:•‡H::6H::6H:ÖG:ÖG:E…G:E…G:i$G:i$G:ÚÑF:ÚÑF:€oF:€oF:ËF:ËF:<»E:<»E:RiE:RiE:ŽE:ŽE:â³D:â³D:äOD:äOD:sûC:sûC:w˜C:w˜C:�EC:�EC:óâB:óâB:�ŽB:�ŽB:t)B:t)B: ÓA: ÓA:ÀmA:ÀmA:àA:àA:µ@:µ@:ì_@:ì_@:1ú?:1ú?:À¢?:À¢?:;?:;?:@ä>:@ä>:+~>:+~>:…'>:…'>:#Á=:#Á=:Èi=:Èi=:o=:o=:Rª<:Rª<:¬B<:¬B<:Œê;:Œê;:ƒ;:ƒ;:‚,;:‚,;:ÍÅ::ÍÅ::¤m::¤m::::::ä«9:ä«9:îC9:îC9:˜ì8:˜ì8:†8:†8:n.8:n.8:|Æ7:|Æ7:Ëm7:Ëm7:7:7:É®6:É®6:eH6:eH6:zñ5:zñ5:ÈŠ5:ÈŠ5:“35:“35:Í4:Í4:Lv4:Lv4:Ù4:Ù4:¹3:¹3:ÌR3:ÌR3:Uü2:Uü2:“–2:“–2:l@2:l@2:€Ú1:€Ú1:@„1:@„1:¦1:¦1:ÈÈ0:ÈÈ0:Kc0:Kc0:p 0:p 0:¨/:¨/:˜R/:˜R/:™í.:™í.:ë—.:ë—.:2.:2.:‡Û-:‡Û-:eu-:eu-:y-:y-:]º,:]º,:¬d,:¬d,:Ÿþ+:Ÿþ+:ˆ§+:ˆ§+:~@+:~@+:‚é*:‚é*:{ƒ*:{ƒ*:t-*:t-*:dÇ):dÇ):p):p):T):T):°(:°(:qH(:qH(:Lñ':Lñ':ÚŠ':ÚŠ':Û3':Û3':@Ì&:@Ì&:‰s&:‰s&: &: &:³%:³%:6L%:6L%:nõ$:nõ$:QŽ$:QŽ$:*6$:*6$:ýÍ#:ýÍ#:v#:v#:B#:B#:x¸":x¸":�Q":�Q":$ú!:$ú!:)“!:)“!:eÛ9p>Û9¥vÚ9¥vÚ9ÞÏÙ9ÞÏÙ9Ù9Ù9Õ`Ø9Õ`Ø9Ú˜×9Ú˜×9!òÖ9!òÖ9+Ö9+Ö9^…Õ9^…Õ9þÔ9þÔ9 Ô9 Ô9�QÓ9�QÓ9Ô«Ò9Ô«Ò9¿åÑ9¿åÑ9í@Ñ9í@Ñ9;{Ð9;{Ð93ÖÏ93ÖÏ9$Ï9$Ï9lkÎ9lkÎ9]¦Í9]¦Í9ËÍ9ËÍ9…>Ì9…>Ì9P›Ë9P›Ë9(×Ê9(×Ê9û3Ê9û3Ê9ñoÉ9ñoÉ9mÍÈ9mÍÈ9… È9… È9(iÇ9(iÇ9á¦Æ9á¦Æ9HÆ9HÆ9ABÅ9ABÅ9€ Ä9€ Ä9IÞÃ9IÞÃ9Ñ=Ã9Ñ=Ã9Ÿ|Â9Ÿ|Â9jÜÁ9jÜÁ9ÅÁ9ÅÁ9zÀ9zÀ9V¸¿9V¸¿9Ø¿9Ø¿9…V¾9…V¾9½¶½9½¶½9ìõ¼9ìõ¼9V¼9V¼9Ž”»9Ž”»9äóº9äóº9'2º9'2º91’¹91’¹9…Ѹ9…Ѹ92¸92¸9Ôp·9Ôp·9Qж9Qж9m¶9m¶9.nµ9.nµ9&­´9&­´9‹ ´9‹ ´9YL³9YL³9¬²9¬²9rê±9rê±9–J±9–J±9䉰9䉰9 ê¯9 ê¯9¦)¯9¦)¯9°‰®9°‰®9‡È­9‡È­9n)­9n)­9ži¬9ži¬9LË«9LË«9% «9% «9lª9lª9‰«©9‰«©9 ©9 ©9ãM¨9ãM¨9Œ°§9Œ°§9 ñ¦9 ñ¦9ÆS¦9ÆS¦91”¥91”¥9aö¤9aö¤9´7¤9´7¤9%›£9%›£9gÝ¢9gÝ¢9 A¢9 A¢9à‚¡9à‚¡9Jæ 9Jæ 9‹( 9‹( 9ÏŒŸ9ÏŒŸ9ÒÏž9ÒÏž9€4ž9€4ž9–w�9–w�9XÜœ9XÜœ9¦œ9¦œ9ž„›9ž„›9Èš9Èš9T-š9T-š9Xq™9Xq™9pט9pט9<˜9<˜9¹‚—9¹‚—9dÇ–9dÇ–9Å-–9Å-–9·r•9·r•9äÙ”9äÙ”9ð”9ð”9ˆ“9ˆ“9CÎ’9CÎ’9î5’9î5’9Á{‘9Á{‘9Ðã�9Ðã�9Ò*�9Ò*�9”�9”�9ÙÛŽ9ÙÛŽ9YEŽ9YEŽ9��9��9ÙöŒ9ÙöŒ9}?Œ9}?Œ9iª‹9iª‹9©óŠ9©óŠ9Ú^Š9Ú^Š9J¨‰9J¨‰9ñ‰9ñ‰9)^ˆ9)^ˆ9xʇ9xʇ9Þ‡9Þ‡9C�†9C�†9Ì…9Ì…9l9…9l9…9o…„9o…„9�óƒ9�óƒ9ƒ?ƒ9ƒ?ƒ9J­‚9J­‚9kù�9kù�9Ch�9Ch�9½µ€9½µ€9g%€9g%€9§å~9§å~9ùÃ}9ùÃ}9q^|9q^|94>{94>{9Ûy9Ûy9мx9мx9öYw9öYw9–;v9–;v9ZÙt9ZÙt9"¼s9"¼s9™[r9™[r9Ð?q9Ð?q9ào9ào9ðÄn9ðÄn9>fm9>fm9½Ll9½Ll9¿ïj9¿ïj9 ×i9 ×i9q{h9q{h9dg9dg9 f9 f9Œód9Œód9ýšc9ýšc9ø‡b9ø‡b9î0a9î0a9ˆ`9ˆ`9üÇ^9üÇ^9·]9·]91c\91c\9wU[9wU[9ÿZ9ÿZ9F÷X9F÷X9¦W9¦W9PšV9PšV98KU98KU9?BT9?BT9™õR9™õR9XîQ9XîQ9ô¢P9ô¢P9 �O9 �O9SN9SN9ªNM9ªNM9L9L9WK9WK9î¼I9î¼I9m¼H9m¼H9�wG9�wG9´wF9´wF9û2E9û2E9ô3D9ô3D9ZñB9ZñB9CõA9CõA9÷´@9÷´@9«¹?9«¹?9ûx>9ûx>9ª}=9ª}=9w><9w><9ïE;9ïE;9K :9K :99999—Õ79—Õ79iÞ69iÞ69Þ¢59Þ¢59¦­49¦­49&t39&t39Ä€29Ä€29�H19�H19V09V09„/9„/9ì,.9ì,.9°ö,9°ö,9ç,9ç,9¡Ò*9¡Ò*9Pä)9Pä)9Ȱ(9Ȱ(9Ã'9Ã'9™�&9™�&9«¤%9«¤%9 t$9 t$9}‰#9}‰#9¹Y"9¹Y"9p!9p!9 A 9 A 9¾Y9¾Y9í,9í,9XF9XF9ƒ9ƒ9Ä49Ä49Ò 9Ò 9s%9s%9 ü9 ü9%9%9 ñ9 ñ999‰ç9‰ç9q9q9Sà9Sà999ØÜ9ØÜ9-ÿ9-ÿ9¿Û 9¿Û 9ˆþ 9ˆþ 9ÕÛ 9ÕÛ 9" 9" 9_ß 9_ß 9` 9` 9�å9�å9 9 9´ì9´ì9j9j9âö9âö9@ 9@ 9Ñ9Ñ9.9.9�9�9|þ8|þ8­Gü8­Gü8î ú8î ú8inø8inø8ÛÉö8ÛÉö8l™ô8l™ô8cöò8cöò8Çð8Çð8X%ï8X%ï8–÷ì8–÷ì8.Xë8.Xë8ç,é8ç,é8H�ç8H�ç8¼då8¼då8ÊÇã8ÊÇã8 žá8 žá8*à8*à8öÝÝ8öÝÝ8FÜ8FÜ8 Ú8 Ú8ŸˆØ8ŸˆØ8„cÖ8„cÖ8hÍÔ8hÍÔ8¿«Ò8¿«Ò8Ñ8Ñ8ÀøÎ8ÀøÎ8ºeÍ8ºeÍ8EË8EË8e³É8e³É82–Ç82–Ç8ÍÆ8ÍÆ8QîÃ8QîÃ8ŠaÂ8ŠaÂ8‘FÀ8‘FÀ8Uº¾8Uº¾8º¡¼8º¡¼8&»8&»8¨¹8¨¹8ˆ|·8ˆ|·8Þfµ8Þfµ8�ß³8�ß³8 ˱8 ˱8tF°8tF°8­4®8­4®8鱬8鱬8µ ª8µ ª8 ©8 ©8j §8j §8`Œ¥8`Œ¥8t}£8t}£8Ÿý¡8Ÿý¡8ïŸ8ïŸ8pož8pož8�aœ8�aœ8€ãš8€ãš8ט8ט8œY—8œY—8M•8M•8vÏ“8vÏ“8¦Ã‘8¦Ã‘8 H�8 H�8>Ž8>Ž8[ÃŒ8[ÃŒ8¹Š8¹Š8ç=‰8ç=‰84‡84‡8 º…8 º…8ˆ²ƒ8ˆ²ƒ83:‚83:‚8}2€8}2€8Lu}8Lu}8àgy8àgy8@{v8@{v8Èor8Èor8Þƒo8Þƒo8yk8yk8ä�h8ä�h8¸‰d8¸‰d8ˤa8ˤa8UŸ]8UŸ]8øZ8øZ84²V84²V8öÍS8öÍS8æÌO8æÌO8OîL8OîL8úîH8úîH8ýF8ýF8Þ B8Þ B8d.?8d.?8\0;8\0;8&U88&U88”Y48”Y48»~18»~18D‚-8D‚-8ô¦*8ô¦*8«&8«&8Ò#8Ò#8ר8ר8­8­8! 8! 8Ë28Ë28;;8;;8Zf8Zf8p 8p 8jœ8jœ8ã¦8ã¦8»Ô8»Ô8ÓÃû7ÓÃû7M%ö7M%ö7¥Aî7¥Aî7º¢è7º¢è7*¾à7*¾à7‘!Û7‘!Û7 DÓ7 DÓ7I±Í7I±Í7ÚÅ7ÚÅ7òGÀ7òGÀ7Im¸7Im¸71Ú²71Ú²7t«7t«7p{¥7p{¥7­�7­�7M&˜7M&˜7U�7U�7ÂËŠ7ÂËŠ75ý‚75ý‚7¶õz7¶õz7€ck7€ck7³``7³``79ËP79ËP7^ÊE7^ÊE7u:67u:67>+7>+7Ü­7Ü­7°7°7Ü!7Ü!7ÍVì6ÍVì6GÍ6GÍ6§_·6§_·6zH˜6zH˜68Z‚68Z‚6˜†F6˜†F6m¾6m¾6·C¹5·C¹5Ö‘C5Ö‘C5›rS´›rS´žÖcµžÖcµú'îµú'îµ5Ë"¶5Ë"¶zá`¶zá`¶×E†¶×E†¶J¥¶J¥¶þ»¶þ»¶ Ú¶ Ú¶xÎï¶xÎï¶¼a·¼a·€@·€@·eº!·eº!·,–,·,–,·2 <·2 <·ÉÞF·ÉÞF·ÌMV·ÌMV·�a·�a·ø�p·ø�p·_{·_{·2g…·2g…·ÌŠ·ÌŠ·Q}’·Q}’·QÜ—·QÜ—·é‹Ÿ·é‹Ÿ·Kí¤·Kí¤·k ¬·k ¬·™²·™²·®¹·®¹·¿·¿·D°Æ·D°Æ·O Ì·O Ì·¶Ó·¶Ó·áÙ·áÙ·L¼à·L¼à·…æ·…æ·>¸í·>¸í·\ ó·\ ó·*­ú·*­ú·±þÿ·±þÿ·3Ò¸3Ò¸µz¸µz¸uK ¸uK ¸Kð ¸Kð ¸·½¸·½¸­`¸­`¸f.¸f.¸ÒѸÒѸ¥ž¸¥ž¸? ¸? ¸/$¸/$¸?¥&¸?¥&¸ðl*¸ðl*¸° -¸° -¸›Ð0¸›Ð0¸°j3¸°j3¸.7¸.7¸5Ä9¸5Ä9¸ð„=¸ð„=¸”@¸”@¸ÎØC¸ÎØC¸¦jF¸¦jF¸o&J¸o&J¸Á´L¸Á´L¸ nP¸ nP¸AúR¸AúR¸•±V¸•±V¸;Y¸;Y¸'ï\¸'ï\¸…u_¸…u_¸Œ'c¸Œ'c¸×«e¸×«e¸Ê[i¸Ê[i¸NÝk¸NÝk¸6Šo¸6Šo¸·r¸·r¸‹³u¸‹³u¸0x¸0x¸ìØ{¸ìØ{¸1S~¸1S~¸ý€¸ý€¸<9‚¸<9‚¸Ó „¸Ó „¸åF…¸åF…¸@‡¸@‡¸íQˆ¸íQˆ¸_"Џ_"Џ\[‹¸\[‹¸ +�¸ +�¸¬bޏ¬bޏ³0�¸³0�¸„f‘¸„f‘¸V3“¸V3“¸œh”¸œh”¸35–¸35–¸”i—¸”i—¸„4™¸„4™¸šfš¸šfš¸¤/œ¸¤/œ¸¥`�¸¥`�¸N)Ÿ¸N)Ÿ¸•Y ¸•Y ¸Ë ¢¸Ë ¢¸£N£¸£N£¸@¥¸@¥¸?¦¸?¦¸Ò¨¸Ò¨¸ .©¸ .©¸íðª¸íðª¸"¬¸"¬¸IÚ­¸IÚ­¸ ¯¸ ¯¸Ý¿°¸Ý¿°¸汸汸¤³¸¤³¸È´¸È´¸<ƒ¶¸<ƒ¶¸�¤·¸�¤·¸N^¹¸N^¹¸ð~º¸ð~º¸È7¼¸È7¼¸\V½¸\V½¸q ¿¸q ¿¸|(À¸|(À¸ÝÁ¸ÝÁ¸ øÂ¸ øÂ¸§«Ä¸§«Ä¸ËÄŸËÄŸ vǸ vǸüŒÈ¸üŒÈ¸q<ʸq<ʸ§Q˸§Q˸„ÿ̸„ÿ̸ÎθÎθ½¾Ï¸½¾Ï¸4Ðи4Ðи€zÒ¸€zÒ¸ŠÓ¸ŠÓ¸32Õ¸32Õ¸S?Ö¸S?Ö¸så׸så׸ÞðظÞðظy•Ú¸y•Ú¸ážÛ¸ážÛ¸ Aݸ Aݸ¢GÞ¸¢GÞ¸Yç߸Yç߸íëà¸íëà¸ø‰â¸ø‰â¸xŒã¸xŒã¸(å¸(å¸Ý'æ¸Ý'æ¸èÀç¸èÀç¸>¾è¸>¾è¸AUê¸AU긆P븆Pë¸håì¸håì¸Þí¸Þí¸pï¸pï¸fð¸fð¸úõñ¸úõñ¸êéò¸êéò¸Éwô¸Éwô¸èhõ¸èhõ¸¼óö¸¼óö¸*â÷¸*â÷¸"kù¸"kù¸ÉWú¸ÉWú¸~Þû¸~Þû¸Èü¸Èü¸“Kþ¸“Kþ¸�2ÿ¸�2ÿ¸GZ¹GZ¹õ̹õ̹̌¹ÌŒ¹Úý¹Úý¹¼¹¼¹´+¹´+¹îè¹î蹦W¹¦W¹µ¹µ¹Ô€¹Ô€¹D;¹D;¹ä¦¹ä¦¹`¹`¹ƒÊ¹ƒÊ¹p‚¹p‚¹Zë¹Zë¹Ú¡ ¹Ú¡ ¹h ¹h ¹—¾ ¹—¾ ¹š$ ¹š$ ¹+Ø ¹+Ø ¹‡< ¹‡< ¹©î ¹©î ¹µQ ¹µQ ¹”¹”¹d¹d¹I¹I¹s¹s¹¼ ¹¼ ¹¹¹Œ+¹Œ+¹­ˆ¹­ˆ¹Ë3¹Ë3¹R�¹R�¹È8¹È8¹ ’¹ ’¹µ:¹µ:¹`“¹`“¹A:¹A:¹‘‘¹‘‘¹R6¹R6¹�й�й_,¹_,¹½}¹½}¹Î¹Î¹kk¹kk¹¾¹¾¹~S¹~S¹âì¹â칋5¹‹5¹Ð˹Ð˹m¹m¹Ö¤¹Ö¤¹ªç¹ªç¹Ex¹Ex¹ ¸¹ ¸¹hE¹hE¹÷�¹÷�¹D ¹D ¹êE¹êE¹e͹e͹¹¹Sˆ¹Sˆ¹µ»¹µ»¹º< ¹º< ¹m ¹m ¹ûê ¹ûê ¹7!¹7!¹ “!¹ “!¹½!¹½!¹µ4"¹µ4"¹Ÿ["¹Ÿ["¹Ð"¹Ð"¹íó"¹íó"¹;e#¹;e#¹í…#¹í…#¹ô#¹ô#¹œ$¹œ$¹…|$¹…|$¹Û–$¹Û–$¹wþ$¹wþ$¹�%¹�%¹ãy%¹ãy%¹Ã�%¹Ã�%¹Óî%¹Óî%¹Šÿ%¹Šÿ%¹d]&¹d]&¹ôj&¹ôj&¹qÅ&¹qÅ&¹¢Ï&¹¢Ï&¹¸&'¹¸&'¹À-'¹À-'¹º�'¹º�'¹¼…'¹¼…'¹_Ö'¹_Ö'¹ãÖ'¹ãÖ'¹Ö#(¹Ö#(¹ó (¹ó (¹¶j(¹¶j(¹ód(¹ód(¹œ«(¹œ«(¹ˆ¢(¹ˆ¢(¹}å(¹}å(¹ÜØ(¹ÜØ(¹p)¹p)¹é)¹é)¹�E)¹�E)¹þ2)¹þ2)¹ l)¹ l)¹V)¹V)¹­‹)¹­‹)¹zr)¹zr)¹ý¤)¹ý¤)¹Úˆ)¹Úˆ)¹!¸)¹!¸)¹Å˜)¹Å˜)¹™Ä)¹™Ä)¹ø¡)¹ø¡)¹tÊ)¹tÊ)¹Ð¤)¹Ð¤)¹9Ê)¹9Ê)¹¤¡)¹¤¡)¹ÉÃ)¹ÉÃ)¹˜)¹˜)¹Å¶)¹Å¶)¹Ù‡)¹Ù‡)¹X£)¹X£)¹gq)¹gq)¹°‰)¹°‰)¹ºT)¹ºT)¹¾i)¹¾i)¹�1)¹�1)¹0C)¹0C)¹ê)¹ê)¹K)¹K)¹&Ø(¹&Ø(¹kã(¹kã(¹5¢(¹5¢(¹ª(¹ª(¹še(¹še(¹4j(¹4j(¹ú"(¹ú"(¹‚$(¹‚$(¹KÚ'¹KÚ'¹jØ'¹jØ'¹ ‹'¹ ‹'¹†'¹†'¹ê5'¹ê5'¹â-'¹â-'¹ÞÚ&¹ÞÚ&¹wÏ&¹wÏ&¹ay&¹ay&¹÷j&¹÷j&¹e&¹e&¹)&¹)&¹º¥%¹º¥%¹‘%¹‘%¹°2%¹°2%¹'%¹'%¹Vº$¹Vº$¹! $¹! $¹¨<$¹¨<$¹A$¹A$¹é¸#¹é¸#¹‘˜#¹‘˜#¹Ä/#¹Ä/#¹Ä #¹Ä #¹Š¡"¹Š¡"¹¥{"¹¥{"¹¹ "¹¹ "¹Þä!¹Þä!¹nt!¹nt!¹çH!¹çH!¹-Ö ¹-Ö ¹ñ§ ¹ñ§ ¹°2 ¹°2 ¹– ¹– ¹Û‰¹Û‰¹V¹V¹Ü¹Ü¹º¥¹º¥¹f)¹f)¹Pð¹Pð¹¦q¹¦q¹ó5¹ó5¹µ¹µ¹¹v¹¹v¹‘ó¹‘ó¹¼²¹¼²¹u-¹u-¹,ê¹,ê¹½b¹½b¹Þ¹Þ¹D“¹D“¹ K¹ K¹–¿¹–¿¹u¹u¹–ç¹–ç¹—š¹—š¹ ¹ ¹Ð»¹Ð»¹‹*¹‹*¹.Ù¹.Ù¹ñE¹ñE¹$ò¹$ò¹ý\¹ý\¹!¹!¹jp¹jp¹�¹�¹÷¹÷¹Ç%¹Ç%¹q‹¹q‹¹™¸ú>™¸ø˜¸ø˜¸s·–¸s·–¸˜•¸˜•¸12”¸12”¸”“¸”“¸¤¯‘¸¤¯‘¸á‘�¸á‘�¸±/�¸±/�¸¨ޏ¨ޏS²Œ¸S²Œ¸Z–‹¸Z–‹¸.8Џ.8ЏP‰¸P‰¸!Á‡¸!Á‡¸8§†¸8§†¸M…¸M…¸_4„¸_4„¸„Ü‚¸„Ü‚¸Å�¸Å�¸}o€¸}o€¸§²~¸§²~¸ |¸ |¸aây¸aây¸i@w¸i@w¸€u¸€u¸V|r¸V|r¸rXp¸rXp¸XÀm¸XÀm¸}Ÿk¸}Ÿk¸F i¸F i¸Kîf¸Kîf¸ `d¸ `d¸fEb¸fEb¸¨¼_¸¨¼_¸�¥]¸�¥]¸"[¸"[¸*Y¸*Y¸Ø�V¸Ø�V¸lT¸lT¸×R¸×R¸WúO¸WúO¸|‡M¸|‡M¸¢~K¸¢~K¸@I¸@I¸ G¸ G¸‰¤D¸‰¤D¸ˆ£B¸ˆ£B¸ B@¸ B@¸IE>¸IE>¸Çé;¸Çé;¸ðð9¸ðð9¸s›7¸s›7¸ü¦5¸ü¦5¸ãW3¸ãW3¸ég1¸ég1¸/¸/¸e3-¸e3-¸Óð*¸Óð*¸Ü )¸Ü )¸åÍ&¸åÍ&¸¦ë$¸¦ë$¸¶"¸¶"¸‚Ø ¸‚Ø ¸”©¸”©¸íиíиͨ¸Í¨¸Õ¸Õ¸›³¸›³¸Èä¸Èä¸Ê¸Ê¸v¸v¸Âì¸Âì¸H( ¸H( ¸v ¸v ¸%\ ¸%\ ¸MV¸MV¸Oœ¸Oœ¸Š�¸Š�¸êè¸êè¸âÿ·âÿ·„ü·„ü·£ø·£ø·°Oõ·°Oõ·ÿ|ñ·ÿ|ñ·™4î·™4î·kpê·kpê·a3ç·a3ç·ó}ã·ó}ã·NLà·NLà·q¥Ü·q¥Ü·Ù·Ù·ÙæÕ·ÙæÕ·ÌÒ·ÌÒ·ÜBÏ·ÜBÏ·è3Ì·è3Ì·Š¹È·Š¹È·*¶Å·*¶Å·�J·�J·S¿·S¿·‹ö»·‹ö»· ¹· ¹·Ï½µ·Ï½µ·XÞ²·XÞ²· ¯· ¯·ŠÌ¬·ŠÌ¬·`�©·`�©·4Ö¦·4Ö¦·O¶£·O¶£·Yû ·Yû ·ˆê�·ˆê�·Â;›·Â;›·&:˜·&:˜·Ê—•·Ê—•·~¥’·~¥’·Š�·Š�·n,�·n,�·Ý¢Š·Ý¢Š·χ·χ·þQ…·þQ…·o�‚·o�‚·ê€·ê€·Ïz·Ïz·v·v·Úºp·Úºp· l· l·;Þf·;Þf·“Hb·“Hb·9]·9]·¤¼X·¤¼X·ƒËS·ƒËS·RhO·RhO·z•J·z•J·’KF·’KF·ñ–A·ñ–A·Pf=·Pf=·ÕÏ8·ÕÏ8·ˆ¸4·ˆ¸4·@0·@0· B,· B,·‹ç'·‹ç'·Ç$·Ç$·(Æ·(Æ·¯ú·¯ú·ÇÛ·ÇÛ·~)·~)·1(·1(·!� ·!� ·[«·[«·|+·|+· e· e·‡üû¶‡üû¶ªô¶ªô¶Êî¶Êî¶�öæ¶�öæ¶>�à¶>�à¶Ö®Ù¶Ö®Ù¶xwÓ¶xwÓ¶ Ò̶ Ò̶ÍÆ¶ÍƶpaÀ¶paÀ¶†�º¶†�º¶½Z´¶½Z´¶c¸®¶c¸®¶0¾¨¶0¾¨¶>M£¶>M£¶6‹�¶6‹�¶tK˜¶tK˜¶2Á’¶2Á’¶y²�¶y²�¶ª_ˆ¶ª_ˆ¶Ñ�ƒ¶Ñ�ƒ¶Ì|¶Ì|¶ªqs¶ªqs¶S§i¶S§i¶Ú­`¶Ú­`¶îOW¶îOW¶æ¶N¶æ¶N¶sÄE¶sÄE¶p‹=¶p‹=¶´5¶´5¶M*-¶M*-¶T %¶T %¶ô‘¶ô‘¶¿Ü¶¿Ü¶æÀ¶æÀ¶’s¶’s¶Áµ¶Áµ¶¢žóµ¢žóµóÝæµóÝæµåÜÙµåÜÙµ Ö͵ Ö͵¾žÁµ¾žÁµ‡P¶µ‡P¶µñવñવ?J µ?J µV •µV •µð¿‹µð¿‹µ…Ù�µ…Ù�µ?\qµ?\qµ _µ _µ±"Nµ±"Nµ±V=µ±V=µ1Ì-µ1Ì-µÿyµÿyµÁQµÁQµÖtµÖtµ Xë´ Xë´JÒ´JÒ´Þ¦»´Þ¦»´¦¥´¦¥´j�‘´j�‘´Kž|´Kž|´×°Y´×°Y´®Õ8´®Õ8´ã7´ã7´­¥ÿ³­¥ÿ³KòγKòγ�í¢³�í¢³¸Sy³¸Sy³�„6³�„6³TUý²TUý²áŠ¡²áŠ¡²®�5²®�5²Ø ±Ø ±…¼ °…¼ °€€././@LongLink0000644000000000000000000000017400000000000011605 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/BinauralDecoder/Source/EQ/Beyerdynamic-DT770PRO-250Ohms.wavIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/BinauralDecoder/Source/EQ/Beyerdynam0000664002537200253720000004013015257173642031437 0ustar zmoelnigzmoelnigRIFFP@WAVEfmt €»Ü factPEAKàc Y’¦^?’¦^?data@’¦^?’¦^?-.G=-.G=~ºa>~ºa>ì�>ì�>QÆc¾QÆc¾Ý ¾Ý ¾G|F½G|F½ŒSS½ŒSS½ËRC¾ËRC¾Æ Ê½Æ Ê½qÉϼqÉϼgR=gR=VT >VT >â >â >¡6‡<¡6‡<_ù!½_ù!½¨&_¼¨&_¼Øk¼Øk¼«1w¼«1w¼ô6Ò¼ô6Ò¼&x½&x½Èô޽Èô޽JŒl¼JŒl¼ß4=ß4=â¢w=â¢w=§‹I=§‹I=‰ìÓ<‰ìÓ<äOa;äOa;óóP¹óóP¹Üðl;Üðl;‡¼‡¼Ž弎强ܽºÜ½‘¥¼‘¥¼‹b‹;‹b‹;?Uß»¹ú>»ì~»ì~»©€~»©€~»¯4W»¯4W»¤K»¤K»ë'9ºë'9º5å:5å:«˜„:«˜„: �: �:Þà9Þà9�üι�üι�·Éº�·Éº)ß»)ß»ÅyB»ÅyB»Ý¨?»Ý¨?»—)»—)»¤îẤîáºó¯xºó¯xºåRÛ¸åRÛ¸A3•9A3•9&é:&é:mí/9mí/9ï™g¹ï™g¹(jº(jºýU¬ºýU¬ºw-áºw-áºöغöغ\µÆº\µÆº¡ñ…º¡ñ…ºÿ .ºÿ .ºQQ¹QQ¹É5ë¸É5ë¸Oÿ˜¸Oÿ˜¸-“à¹-“à¹2™Aº2™AºË/¦ºË/¦ºÍ ÈºÍ Èº‹¬ìº‹¬ìº£›Þº£›ÞºœϺœϺ@�•º@�•ºp°^ºp°^º\�ع\�عT˜Œ¹T˜Œ¹’«¸’«¸C“Z¹C“Z¹,‹k¹,‹k¹× æ¹× æ¹Ç%×¹Ç%×¹¨33î¹*‡9¹*‡9¹¨*8¨*8>::>::¥­S:¥­S:?¢:?¢: }´: }´:_yÐ:_yÐ:…ÔÆ:…ÔÆ:GÌ:GÌ:žïµ:žïµ:Ò ¼:Ò ¼:a¦²:a¦²:vÍ:vÍ:eƒÙ:eƒÙ:]Ö;]Ö;^Z ;^Z ;ä3;ä3;#R;#R;ÿ~%;ÿ~%;j;j;FÒ;FÒ;¡Î;¡Î;ø;ø;;;¬Ì;¬Ì;w/;w/;Ÿþ+;Ÿþ+;s¬0;s¬0; ”?; ”?;ì(?;ì(?;ZIG;ZIG;[Ö?;[Ö?;ögB;ögB;ìV8;ìV8;¯¦;;¯¦;;¨=5;¨=5;€ñ=;€ñ=;Í<;Í<;I;I;‘I;‘I;Ó×S;Ó×S;‡P;‡P;ÉU;ÉU;¨ÁL;¨ÁL;Ð=N;Ð=N;?%C;?%C;8øD;8øD;ÎL<;ÎL<;!öA;!öA;ØD=;ØD=;KÎE;KÎE;3B;3B;œØI;œØI;4ÂC;4ÂC;·&H;·&H;ˆã>;ˆã>;tÙ@;tÙ@;m`6;m`6;Ê­8;Ê­8;¨0;¨0;C5;C5;–/;–/;ÕÕ6;ÕÕ6;¹Ú1;¹Ú1; ^8; ^8;Ù±1;Ù±1;p 6;p 6;�-;�-;›[/;›[/;R8%;R8%;}';}';ûR;ûR;ÙX";ÙX";ôö;ôö;0 ;0 ;ªC;ªC;�&;�&;¦7;¦7;׿;׿;�a;�a;§;§;R‘;R‘;Þä ;Þä ;†;†;´ì;´ì;1Hù:1Hù:�Ï;�Ï;v›ñ:v›ñ:K•ù:K•ù:-“è:-“è:¬!ï:¬!ï:™Ü:™Ü:Jâ:Jâ:ô6Ï:ô6Ï:¥÷Ô:¥÷Ô:³úÂ:³úÂ:£Ê:£Ê:èe¹:èe¹:yÁ:yÁ:ëe±:ëe±:Ñ™¹:Ñ™¹:8A©:8A©:±:±:kZ :kZ :V³§:V³§:\˜–:\˜–:€ï�:€ï�:õ)�:õ)�:ë*•:ë*•:2…:2…:àÐ�:àÐ�:::w>:)I :)I :­23:­23::j::j:(:(:Å :Å :k»:k»:Ó2ù9Ó2ù9Ñÿ :Ñÿ :ê/Ý9ê/Ý9MÛÿ9MÛÿ9:”Á9:”Á9ºå9ºå9¶y©9¶y©9¢Ï9¢Ï9ƒ•9ƒ•9­ ¼9­ ¼9ÜB�9ÜB�9Q™§9Q™§9®X9®X9gZ‘9gZ‘9Èè)9Èè)90Îs90Îs9þÐö8þÐö8(¬G9(¬G9ÅW¦8ÅW¦8�#9�#9$sJ8$sJ8þ­9þ­9ö°7ö°7ëÒ8ëÒ8bü¶bü¶ãå‘8ãå‘8’þ'¸’þ'¸½%8½%8k›¸k›¸:=d6:=d6hïØ¸hïØ¸×;¾·×;¾·ÅP¹ÅP¹Ü{3¸Ü{3¸ ¹ ¹%�¸%�¸"ß,¹"ß,¹gÌ®¸gÌ®¸ÈíE¹ÈíE¹þå¸þå¸ËZb¹ËZb¹›Ó¹›Ó¹~}¹~}¹�&¹�&¹°cˆ¹°cˆ¹@u6¹@u6¹ �¹ �¹élB¹élB¹e)•¹e)•¹@eP¹@eP¹'�¹'�¹«÷a¹«÷a¹Ip¦¹Ip¦¹Ÿt¹Ÿt¹�H®¹�H®¹ˆ€¹ˆ€¹w9²¹w9²¹á ‚¹á ‚¹î³¹î³¹Ps‚¹Ps‚¹{�³¹{�³¹Æ£ƒ¹Æ£ƒ¹•Óµ¹•Óµ¹Qò†¹Qò†¹ºu¹¹ºu¹¹` й` й·C»¹·C»¹ß÷‰¹ß÷‰¹ ¹¹ ¹¹ŸÎ…¹ŸÎ…¹¢l³¹¢l³¹.Ê~¹.Ê~¹·­¹·­¹«Îs¹«Îs¹²�¨¹²�¨¹ñþk¹ñþk¹_§¤¹_§¤¹'Ub¹'Ub¹µ;ž¹µ;ž¹¶³Q¹¶³Q¹�㓹�㓹éi9¹éi9¹Â¦†¹Â¦†¹M¹M¹Â‹s¹Â‹s¹ø¹ø¹ðŽ^¹ðŽ^¹¯Åæ¸¯Åæ¸/ŸJ¹/ŸJ¹ÆÙ»¸ÆÙ»¸{ 2¹{ 2¹Ú�…¸Ú�…¸Èq¹Èq¹; ¸; ¸àå¸àå¸(‹²µ(‹²µœ¨¸œ¨¸jy×7jy×7®g¸®g¸ýN8ýN8r‚¸r‚¸†ê›8†ê›8�6޶�6޶éKÛ8éKÛ8¦eñ7¦eñ7kV9kV9Ö ‡8Ö ‡8— 79— 79KæÌ8KæÌ8ù]W9ù]W9S;9S;9ÜŠs9ÜŠs9è 9è 9y$ˆ9y$ˆ95Å>95Å>9©˜9©˜9ðÈa9ðÈa9Ûª9Ûª9Nƒ9Nƒ9ŒÒ¼9ŒÒ¼9.G”9.G”9 †Ì9 †Ì9ˆ«¢9ˆ«¢9ŸêÙ9ŸêÙ9£¥¯9£¥¯9ç9ç9ÏE½9ÏE½9Pkõ9Pkõ9‡{Ì9‡{Ì9û¦:û¦:ü´Ü9ü´Ü9è¦ :è¦ :|áë9|áë9+¤:+¤:‰—ø9‰—ø9z:z:Ñ:Ñ:jå:jå:R:R:± ":± ":þW :þW :aè(:aè(:¦¶:¦¶:Œ/:Œ/:t:t:¾64:¾64:*æ:*æ:8:8:‡S!:‡S!:@;:@;:ks$:ks$:){>:){>:åÚ':åÚ':tB:tB:vk+:vk+:&dE:&dE:0Z.:0Z.:غG:غG:C0:C0:íÆH:íÆH:Ÿ0:Ÿ0:²%I:²%I:%ô0:%ô0:2›I:2›I:„•1:„•1:E\J:E\J:Û[2:Û[2:�ùJ:�ùJ:Õ—2:Õ—2:ð¬J:ð¬J:O¶1:O¶1:GHI:GHI:Bö/:Bö/:ˆ[G:ˆ[G:G.:G.:œ~E:œ~E:CG,:CG,:¿ÙC:¿ÙC:»–*:»–*:×ìA:×ìA:*C(:*C(:!?:!?:Kå$:Kå$:N;:N;:xÝ :xÝ :¹.7:¹.7:É:É:ç;3:ç;3:jù:jù:Ï‚/:Ï‚/:ž<:ž<:`™+:`™+:Ýþ:Ýþ::÷&::÷&:£ý :£ý :­®!:­®!:†’:†’:E:E:RA:RA:':':£‡ø9£‡ø9;=:;=:#Íî9#Íî96? :6? :vUä9vUä9%·:%·:ø¿Ø9ø¿Ø9/Å:/Å:˜ÈÌ9˜ÈÌ9Y½÷9Y½÷9tVÁ9tVÁ9¢¹ì9¢¹ì9µ¶9µ¶9G\â9G\â9i¬9i¬9Òà×9Òà×9‡¡9‡¡9ˆÌ9ˆÌ9ßÄ•9ßÄ•9˜ƒÀ9˜ƒÀ9e¹‰9e¹‰9µ¯´9µ¯´9û’|9û’|9Á©9Á©9ïÆg9ïÆg9 ÄŸ9 ÄŸ9œ4T9œ4T9ø–9ø–9^e@9^e@9JÚ‹9JÚ‹9tœ+9tœ+9*T�9*T�9u 9u 9X?ô9>?ô9ô\Â9ô\Â9õwò9õwò9ë~À9ë~À9σð9σð9Ll¾9Ll¾9ÿLî9ÿLî9( ¼9( ¼9òÂë9òÂë9“Y¹9“Y¹9yñè9yñè9_l¶9_l¶9¸ðå9¸ðå9,\³9,\³94Ùâ94Ùâ9ú>°9ú>°9¶ß9¶ß9D ­9D ­9oÜ9oÜ9™§©9™§©9ŸëØ9ŸëØ9˜¦9˜¦9 4Õ9 4Õ9’:¢9’:¢9[Ñ9[Ñ9N[ž9N[ž98}Í98}Í9âš9âš9ë£É9ë£É9až–9až–98µÅ98µÅ91ž’91ž’9T¤Á9T¤Á9-zŽ9-zŽ9ãr½9ãr½9.>Š9.>Š93¹93¹9ÿ…9ÿ…9¥ý´9¥ý´9Ô�9Ô�9 ß°9 ß°9Ó~{9Ó~{9\Ь9\Ь9ÎWs9ÎWs9­¶¨9­¶¨9Mk9Mk9O‰¤9O‰¤9Í£b9Í£b9’R 9’R 9;Z9;Z9ù(œ9ù(œ9íR9íR9 ˜9 ˜9±J9±J9/2”9/2”9Z:B9Z:B9¢E�9¢E�9WP:9WP:9žJŒ9žJŒ9L29L29ÄEˆ9ÄEˆ9G*9G*9ÈQ„9ÈQ„9t†"9t†"99�€99�€9-29-29Iòy9Iòy9Ó!9Ó!9Sòr9Sòr9† 9† 9�èk9�èk9Ë 9Ë 9-Õd9-Õd9þ8þ8{ô]9{ô]9­ð8­ð8�…W9�…W9°9ä8°9ä8Š|Q9Š|Q9*^Ø8*^Ø8.œK9.œK9ŒÌ8ŒÌ8|£E9|£E9ÜpÀ8ÜpÀ8Q’?9Q’?9Éh´8Éh´8:¶99:¶99“©8“©8ÁJ49ÁJ49±«ž8±«ž8ûD/9ûD/98Ñ”88Ñ”8ó`*9ó`*9LêŠ8LêŠ8V[%9V[%9Lº€8Lº€8½A 9½A 9 8m8 8m8T9T9¯%Z8¯%Z8ðÄ9ðÄ9yªH8yªH8j�9j�9888888Tn9Tn9(U'8(U'8G. 9G. 9"8"8ââ9ââ9Ø$8Ø$8/È9/È9P³ê7P³ê7Dü8Dü8ÀüÍ7ÀüÍ7ˆ%õ8ˆ%õ8˜®²7˜®²7{Rî8{Rî8ñÝ–7ñÝ–7M>ç8M>ç8oøs7oøs7à8à8E€:7E€:7­Ù8­Ù8ç\7ç\7žˆÒ8žˆÒ8f0¤6f0¤6ìlÌ8ìlÌ8¾˜6¾˜6w_Æ8w_Æ8)±{µ)±{µ€À8€À8v¸…¶v¸…¶S·¹8S·¹8¶¥ê¶¶¥ê¶X™³8X™³8Äã$·Äã$·MÞ­8MÞ­8¡lQ·¡lQ·.x¨8.x¨8ÄG|·ÄG|·Ë£8Ë£8Û/”·Û/”·s�8s�8a«·a«·B¢—8B¢—84’·4’·ú‘8ú‘8v‰Ø·v‰Ø·ª¶Œ8ª¶Œ8q÷ì·q÷ì·¤Á‡8¤Á‡8Êc¸Êc¸¸¸‚8¸¸‚8�â ¸�â ¸¿Žz8¿Žz8«9¸«9¸6ÿn86ÿn8æ!¸æ!¸«vc8«vc8sC-¸sC-¸öqX8öqX8È8¸È8¸EñM8EñM8 �B¸ �B¸ :C8 :C8âºM¸âºM¸Œ˜78Œ˜78NâY¸NâY¸4++84++8#|f¸#|f¸¶8¶8¦´r¸¦´r¸â8â8kH~¸kH~¸aˆ8aˆ8VÞ„¸VÞ„¸’÷7’÷7 ‹¸ ‹¸¥«Ý7¥«Ý7õÜ‘¸õÜ‘¸ �Á7 �Á7ÿ™¸ÿ™¸W¥7W¥7Û ¸Û ¸X~‰7X~‰7šÝ¦¸šÝ¦¸TL]7TL]7¦­¸¦­¸iÏ%7iÏ%7‚å´¸‚å´¸ûËÒ6ûËÒ6Zż¸Zż¸ b#6 b#6ßúĸßúĸÆ[ŵÆ[ŵÈ͸È͸¯±¶¯±¶_Õ¸_Õ¸�·�·1ݸ1ݸÐBY·ÐBY·×Šå¸×Šå¸ÿÉ�·ÿÉ�·Þ¯î¸Þ¯î¸5µ·5µ·È3ø¸È3ø¸^`Û·^`Û·Aà¹Aà¹ä ¸ä ¸÷™¹÷™¹Py¸Py¸^ ¹^ ¹oÜ&¸oÜ&¸±[¹±[¹W;¸W;¸už¹už¹´³P¸´³P¸†¹†¹‚Zf¸‚Zf¸4r¹4r¹£ä{¸£ä{¸çÑ$¹çÑ$¹5§ˆ¸5§ˆ¸s6*¹s6*¹›Š“¸›Š“¸Ä/¹Ä/¹oÖž¸oÖž¸‡5¹‡5¹À|ª¸À|ª¸“i;¹“i;¹jB¶¸jB¶¸ûLA¹ûLA¹­ôÁ¸­ôÁ¸J#G¹J#G¹ü—͸ü—͸ZÿL¹ZÿL¹§fÙ¸§fÙ¸¦þR¹¦þR¹_Šå¸_Šå¸�'Y¹�'Y¹Šðñ¸Šðñ¸3d_¹3d_¹8^þ¸8^þ¸X–e¹X–e¹�S¹�S¹Þµk¹Þµk¹—¹Z>—¹¸ÔM¹¸ÔM¹qš¹qš¹YdS¹YdS¹éÕœ¹éÕœ¹ÓæX¹ÓæX¹ó™Ÿ¹ó™Ÿ¹Zm^¹Zm^¹Ž^¢¹Ž^¢¹Üêc¹Üêc¹¥¹¥¹A@i¹A@i¹è´§¹è´§¹jVn¹jVn¹¾1ª¹¾1ª¹…2s¹…2s¹U˜¬¹U˜¬¹½ïw¹½ïw¹ö®¹ö®¹J£|¹J£|¹¤N±¹¤N±¹3£€¹3£€¹–™³¹–™³¹ß‚¹ß‚¹Nǵ¹Nǵ¹où„¹où„¹ÈÒ·¹ÈÒ·¹õ†¹õ†¹Zƹ¹Zƹ¹¯ßˆ¹¯ßˆ¹“®»¹“®»¹õйõй*�½¹*�½¹þ›Œ¹þ›Œ¹Ì`¿¹Ì`¿¹S\޹S\޹èÁ¹èÁ¹ãø�¹ãø�¹³žÂ¹³žÂ¹®s‘¹®s‘¹0Ĺ0ŕג¹•×’¹ömŹömŹQ0”¹Q0”¹lÃÆ¹lÃÆ¹¿|•¹¿|•¹¸ȹ¸ȹl±–¹l±–¹W.ɹW.ɹÜ×¹Ü×¹‡0ʹ‡0ʹò³˜¹ò³˜¹˹˹ô�™¹ô�™¹ˆë˹ˆë˹A\š¹A\š¹ª¶Ì¹ª¶Ì¹�›¹�›¹èq͹èq͹|Ë›¹|Ë›¹UιUιPZœ¹PZœ¹Ž”Î¹Ž”Î¹šÍœ¹šÍœ¹ºÿιºÿι¥.�¹¥.�¹q\Ϲq\Ϲ©ƒ�¹©ƒ�¹7®Ï¹7®Ï¹ïÌ�¹ïÌ�¹CñϹCñϹ‘й‘й¨ž¹¨ž¹3.й3.йë#ž¹ë#ž¹Œ-йŒ-й�ž¹�ž¹Æ Ð¹Æ Ð¹xž¹xž¹Ö Ð¹Ö Ð¹uç�¹uç�¹’åϹ’åϹñ·�¹ñ·�¹{®Ï¹{®Ï¹^u�¹^u�¹@fϹ@fϹ©$�¹©$�¹4Ϲ4ϹýËœ¹ýËœ¹î¹Î¹î¹Î¹œmœ¹œmœ¹PZιPZι�œ¹�œ¹yñ͹yñ͹]–›¹]–›¹*|͹*|͹8›¹8›¹ý̹ý̹•š¹•š¹æy̹æy̹Øš¹Øš¹ìô˹ìô˹~†™¹~†™¹œm˹œm˹½ú˜¹½ú˜¹XáʹXáʹi˜¹i˜¹qNʹqNʹqЗ¹qЗ¹¶µÉ¹¶µÉ¹Û3—¹Û3—¹´ɹ´ɹZ––¹Z––¹šȹšȹù•¹ù•¹ÁäǹÁäǹò[•¹ò[•¹JǹJǹ‚¾”¹‚¾”¹@®Æ¹@®Æ¹²”¹²”¹˜ƹ˜ƹ7�“¹7�“¹úvŹúvŹãå’¹ãå’¹­ßĹ­ßĹœN’¹œN’¹üMĹüMĹ¹½‘¹¹½‘¹ÆÂùÆÂùì2‘¹ì2‘¹ß;ùß;ùUª�¹Uª�¹Ÿ¶Â¹Ÿ¶Â¹œ#�¹œ#�¹Y3¹Y3¹+Ÿ�¹+Ÿ�¹Ã²Á¹Ã²Á¹ø�¹ø�¹Ù6Á¹Ù6Á¹(£Ž¹(£Ž¹ÁÁÀ¹ÁÁÀ¹ä-޹ä-޹hPÀ¹hPÀ¹ìº�¹ìº�¹d࿹d࿹åH�¹åH�¹lq¿¹lq¿¹ØŒ¹ØŒ¹C¿¹C¿¹äjŒ¹äjŒ¹ �¾¹ �¾¹Œ¹Œ¹q=¾¹q=¾¹d¥‹¹d¥‹¹©á½¹©á½¹H‹¹H‹¹u‡½¹u‡½¹R늹R늹#-½¹#-½¹�ŽŠ¹�ŽŠ¹1Ó¼¹1Ó¼¹å2йå2йÉ{¼¹É{¼¹Û‰¹Û‰¹Š(¼¹Š(¼¹/‡‰¹/‡‰¹ÀØ»¹ÀØ»¹C5‰¹C5‰¹ýˆ»¹ýˆ»¹ÔሹÔሹƒ6»¹ƒ6»¹ÉŠˆ¹ÉŠˆ¹ູູù/ˆ¹ù/ˆ¹¯†º¹¯†º¹¸Ó‡¹¸Ó‡¹‡-º¹‡-º¹�x‡¹�x‡¹BÕ¹¹BÕ¹¹y‡¹y‡¹4|¹¹4|¹¹†À†¹†À†¹Á¹¹Á¹¹;^†¹;^†¹7¼¸¹7¼¸¹ ô…¹ ô…¹cQ¸¹cQ¸¹@„…¹@„…¹Ôâ·¹Ôâ·¹1…¹1…¹çr·¹çr·¹úž„¹úž„¹c·¹c·¹³(„¹³(„¹ж¹ж¹Y©ƒ¹Y©ƒ¹ü¶¹ü¶¹æƒ¹æƒ¹‹wµ¹‹wµ¹Z†‚¹Z†‚¹‘à´¹‘à´¹’ê�¹’ê�¹LF´¹LF´¹‰L�¹‰L�¹r©³¹r©³¹ê©€¹ê©€¹c³¹c³¹fö¹fö¹ÖP²¹ÖP²¹Rz~¹Rz~¹†Ž±¹†Ž±¹�ä|¹�ä|¹Â°¹Â°¹Ê?{¹Ê?{¹Uð¯¹U𯹘’y¹˜’y¹t¯¹t¯¹†Öw¹†Öw¹C8®¹C8®¹Mÿu¹Mÿu¹éF­¹éF­¹rt¹rt¹±D¬¹±D¬¹îq¹îq¹#7«¹#7«¹âÆo¹âÆo¹Ë#ª¹Ë#ª¹²”m¹²”m¹Ï ©¹Ï ©¹´Pk¹´Pk¹Êã§¹Êã§¹¯îh¹¯îh¹­¦¹­¦¹7jf¹7jf¹0f¥¹0f¥¹*Ëc¹*Ëc¹+¤¹+¤¹a¹a¹¬¾¢¹¬¾¢¹ýd^¹ýd^¹b¡¹b¡¹‚œ[¹‚œ[¹’úŸ¹’úŸ¹´¸X¹´¸X¹ƒƒž¹ƒƒž¹´´U¹´´U¹ýœ¹ýœ¹(•R¹(•R¹!k›¹!k›¹7cO¹7cO¹±Ñ™¹±Ñ™¹)$L¹)$L¹q1˜¹q1˜¹jÓH¹jÓH¹Ž…–¹Ž…–¹ gE¹ gE¹„Ê”¹„Ê”¹<ÛA¹<ÛA¹…“¹…“¹35>¹35>¹¸+‘¹¸+‘¹ã~:¹ã~:¹QQ�¹QQ�¹´¿6¹´¿6¹)r�¹)r�¹´ô2¹´ô2¹b‹‹¹b‹‹¹º/¹º/¹×™‰¹×™‰¹°!+¹°!+¹¤œ‡¹¤œ‡¹“'¹“'¹%—…¹%—…¹à#¹à#¹-Žƒ¹-Žƒ¹[è¹[è¹uƒ�¹uƒ�¹ùȹùȹ>è~¹>è~¹¥œ¹¥œ¹¹z¹¹z¹™]¹™]¹õvv¹õvv¹t ¹t ¹^(r¹^(r¹· ¹· ¹ÌØm¹ÌØm¹Lb¹Lb¹¡Ši¹¡Ši¹_ ¹_ ¹[7e¹[7e¹XZù¸XZù¸³×`¹³×`¹ãð¸ãð¸fj\¹fj\¹ä�ç¸ä�ç¸x÷W¹x÷W¹® Þ¸® Þ¸&ŠS¹&ŠS¹`ÂÕ¸`ÂÕ¸%O¹%O¹Æî̸Æî̸5ÁJ¹5ÁJ¹áĸáĸ×VF¹×VF¹F+»¸F+»¸åA¹åA¹—9²¸—9²¸/u=¹/u=¹ÁU©¸ÁU©¸Ï9¹Ï9¹�� ¸�� ¸Øº4¹Øº4¹ÏÞ—¸ÏÞ—¸·j0¹·j0¹\0�¸\0�¸Š,¹Š,¹É|†¸É|†¸ÐÅ'¹ÐÅ'¹—ž{¸—ž{¸L{#¹L{#¹ÿzj¸ÿzj¸ÉB¹ÉB¹,¦Y¸,¦Y¸½¹½¹“ I¸“ I¸(¹(¹9†8¸9†8¸Mç¹Mç¹{(¸{(¸€Ó¹€Ó¹¤¹¸¤¹¸¸Ì ¹¸Ì ¹Ä®¸Ä®¸_ݹ_ݹdð·dð·,¹,¹ÜXÑ·ÜXÑ·œuþ¸œuþ¸˜î²·˜î²·´îö¸´îö¸V´”·V´”·�uï¸�u︮‘m·®‘m·ðè¸ð踦 3·¦ 3·]ñà¸]ñà¸;5ô¶;5ô¶â÷Ù¸â÷Ù¸Zß„¶Zß„¶§Ó¸§Ó¸Ù8µÙ8µWX̸WX̸È_+6È_+6¿£Å¸¿£Å¸ŽùÀ6ŽùÀ6￸￸üÍ7üÍ7�®¸¸�®¸¸JsG7JsG7”€²¸”€²¸R°x7R°x7Ív¬¸Ív¬¸ï‰”77¾�¦¸¾�¦¸gu¬7gu¬7µž ¸µž ¸jÄ7jÄ7Ûš¸Ûš¸cõÚ7cõÚ7¾F•¸¾F•¸Fñ7Fñ7�å�¸�å�¸ÈA8ÈA8"¨Š¸"¨Š¸d 8d 8Ý~…¸Ý~…¸)"8)"83f€¸3f€¸Š["8Š["8±Ìv¸±Ìv¸UR,8UR,8àm¸àm¸Gñ58Gñ58ýÅc¸ýÅc¸ÇE?8ÇE?8a©Z¸a©Z¸¹iH8¹iH8ßµQ¸ßµQ¸jQ8jQ8²ãH¸²ãH¸DZ8DZ8¼E@¸¼E@¸èÙb8èÙb8eø7¸eø7¸¾k8¾k83ü/¸3ü/¸És8És8{=(¸{=(¸iÛz8iÛz8¢ ¸¢ ¸ÕC�8ÕC�8C"¸C"¸• …8• …8¡Í¸¡Í¸´ˆ8´ˆ8Ù· ¸Ù· ¸Ã=Œ8Ã=Œ8á¸á¸²«�8²«�8-nú·-nú·á“8á“8NJí·NJí·/]–8/]–8NKà·NKà·¤¤™8¤¤™8;”Ó·;”Ó·ÎÔœ8ÎÔœ8«LÇ·«LÇ·oçŸ8oçŸ8üt»·üt»·Yâ¢8Yâ¢8ù㯷ù㯷•Ñ¥8•Ñ¥8Er¤·Er¤·»º¨8»º¨8ý™·ý™·&™«8&™«8¯Ž·¯Ž·7b®87b®8óZƒ·óZƒ·Ã±8ñ81r·1r·×¥³8×¥³84&^·4&^·ó3¶8ó3¶8S?J·S?J·À¸8À¸8¼n6·¼n6·ËD»8ËD»8 #· #·`µ½8`µ½8òq·òq·( À8( À8•"ý¶•"ý¶ÿPÂ8ÿPÂ8Ú¶Ú¶\‘Ä8\‘Ä8·¶·¶;ÓÆ8;ÓÆ8O”¶O”¶aÉ8aÉ8;´c¶;´c¶à5Ë8à5Ë8}c"¶}c"¶¡DÍ8¡DÍ8‹Çǵ‹Çǵ‰AÏ8‰AÏ8AµAµì:Ñ8ì:Ñ8áS´4áS´4L7Ó8L7Ó8Åç§5Åç§5æ.Õ8æ.Õ88æ68æ6Y×8Y×8²>I6²>I6¾åØ8¾åØ8æ€6æ€6r¦Ú8r¦Ú8ÄÏš6ÄÏš6?cÜ8?cÜ88¥µ68¥µ6 "Þ8 "Þ8CnÐ6CnÐ6«Ûß8«Ûß8a“ê6a“ê6]†á8]†á8sÏ7sÏ7cã8cã8Ó 7Ó 7h«ä8h«ä8•7•7¢3æ8¢3æ8àI%7àI%7Œºç8Œºç8-ç07-ç07^;é8^;é80;<70;<7ø°ê8ø°ê88%G78%G75ì85ì8“ Q7“ Q7Ysí8Ysí8ÅÍ[7ÅÍ[7åÇî8åÇî8È×e7È×e7ð8ð8«µo7«µo7`añ8`añ8ÜIy7ÜIy7_Ÿò8_Ÿò8[=�7[=�7'Ðó8'Ðó8Pž…7Pž…7Òóô8Òóô8ßЉ7ßЉ7y ö8y ö8‹à�7‹à�7<÷8<÷8ºÏ‘7ºÏ‘7((ø8((ø8˜•7˜•7Ú&ù8Ú&ù8V6™7V6™7ßú8ßú8ᦜ7ᦜ7fû8fû8`ãŸ7`ãŸ7!Þû8!Þû8ªø¢7ªø¢7„±ü8„±ü8pí¥7pí¥7|ý8|ý877×<þ8×<þ8a«7a«7¦òþ8¦òþ8ˆÕ­7ˆÕ­7˜›ÿ8˜›ÿ8 °7 °7Ý9Ý9Ò7²7Ò7²7h9h955´755´7i®9i®9Ķ7Ķ7Sï9Sï9 ®·7 ®·7Ô)9Ô)9»¹7»¹7"]9"]9UOº7UOº7Š9Š9MU»7MU»7:±9:±9á+¼7á+¼7]Ò9]Ò9¦Ð¼7¦Ð¼7+í9+í9ª@½7ª@½7 9 9 w½7 w½7:9:9®½7®½7X9X9ða½7ða½7¾9¾9½7½7Ÿ9Ÿ9%£¼7%£¼7u9u9Tï»7Tï»7Ùý9Ùý9»7»7úå9úå9Ç×¹7Ç×¹7}Ç9}Ç9[¸7[¸7+£9+£9�õ¶7�õ¶7Mx9Mx9ì4µ7ì4µ7­F9­F9 A³7 A³7Ñ9Ñ9j±7j±7ÆÏ9ÆÏ9*´®7*´®7׉9׉9¬7¬7¦=9¦=9S©7S©7%×ÿ8%×ÿ8‹_¦7‹_¦7î)ÿ8î)ÿ8šI£7šI£7‡sþ8‡sþ8Ç  7Ç  7)±ý8)±ý8t•œ7t•œ7Öáü8Öáü8Ÿî˜7Ÿî˜7ëü8ëü8•7•7F û8F û8…$‘7…$‘7ˆ5ú8ˆ5ú8Ö �7Ö �7Fù8Fù8_‰7_‰7ÙLø8ÙLø8À®„7À®„7E÷8E÷8Ç€7Ç€7ë.ö8ë.ö8¾v7¾v7õ8õ8ºm7ºm7Áîó8Áîó8F]c7F]c7·Êò8·Êò8¨|Y7¨|Y71žñ81žñ8“?O7“?O7rdð8rdð8È•D7È•D7@ï8@ï8ôœ97ôœ97rÇí8rÇí8Q‹.7Q‹.7xoì8xoì8�„#7�„#7óë8óë8_m7_m7ô®é8ô®é8˜ 7˜ 7;è8;è8‘\7‘\7v¹æ8v¹æ8ßê6ßê6e0å8e0å8²Ó6²Ó6 §ã8 §ã8õ’»6õ’»6ûâ8ûâ8©6¤6©6¤6á�à8á�à8û Œ6û Œ6øÞ8øÞ8ÜEi6ÜEi6ŽVÝ8ŽVÝ8‘×86‘×86_°Û8_°Û8ØÌ6ØÌ6, Ú8, Ú8¥T³5¥T³5ÕjØ8ÕjØ8¸Ê,5¸Ê,5(ÈÖ8(ÈÖ8w™Q³w™Q³Õ8Õ8ƒèHµƒèHµþmÓ8þmÓ8ôúµôúµø¸Ñ8ø¸Ñ8ÎU¶ÎU¶0Ð80Ð8ü'>¶ü'>¶WXÎ8WXÎ8òñj¶òñj¶�¬Ì8�¬Ì8mª‹¶mª‹¶ýÊ8ýÊ8»ù¡¶»ù¡¶>GÉ8>GÉ8®U¸¶®U¸¶\�Ç8\�Ç8übζübζÛÅ8ÛÅ8ûÒã¶ûÒã¶ç-Ä8ç-Ä8Ø™ø¶Ø™ø¶…Â8…Â8R·R·;ÜÀ8;ÜÀ8s¬·s¬·/¿8/¿8•з•зX�½8X�½8àÀ$·àÀ$·Ù»8Ù»8UU.·UU.·±9º8±9º8æ…7·æ…7·Æ ¸8Æ ¸8.~@·.~@·Î·8η8 iI· iI·!lµ8!lµ8¸@R·¸@R·‡Ñ³8‡Ñ³8—ÚZ·—ÚZ·”=²8”=²8�c·�c·³°8³°8üãj·üãj·~.¯8~.¯8®ƒr·®ƒr·Ÿ©­8Ÿ©­8·z··z· "¬8 "¬8ïÍ€·ïÍ€·7›ª87›ª8"p„·"p„·�©8�©8„ᇷ„ᇷ�¤§8�¤§8í%‹·í%‹·«2¦8«2¦8ßSŽ·ßSŽ·ú¿¤8ú¿¤8�~‘·�~‘·J£8J£8– ”·– ”·“Õ¡8“Õ¡8M¤—·M¤—·Ÿg 8Ÿg 8¬xš·¬xš·.Ÿ8.Ÿ8§�·§�·£�8£�8¯ªŸ·¯ªŸ·QDœ8QDœ8þ-¢·þ-¢·Îãš8Îãš8¿¤¤·¿¤¤·¼…™8¼…™8çù¦·çù¦·=.˜8=.˜8§#©·§#©·{Þ–8{Þ–8Ù#«·Ù#«·×“•8ד•8Ý ­·Ý ­·�H”8�H”8(ô®·(ô®·û’8û’8Úΰ·Úΰ·„¯‘8„¯‘8¹Œ²·¹Œ²·øi�8øi�8' ´·' ´·,�8,�82‹µ·2‹µ·Oó�8Oó�88ß¶·8ß¶·»Œ8»Œ8ù(¸·ù(¸·<‚‹8<‚‹8Sd¹·Sd¹·%LŠ8%LŠ8wº·wº·ß‰8߉8ân»·ân»·põ‡8põ‡8Æ7¼·Æ7¼·ÃÒ†8ÃÒ†8|ë¼·|ë¼·M°…8M°…8Ë—½·Ë—½·½Œ„8½Œ„8�7¾·�7¾·Ìkƒ8Ìkƒ8ä·¾·ä·¾·½Q‚8½Q‚8<¿·<¿·&?�8&?�8ý?¿·ý?¿·41€841€8ú\¿·ú\¿·eG~8eG~8‚r¿·‚r¿·+|8+|8Öy¿·Öy¿·ûz8ûz8qb¿·qb¿·à x8à x8g#¿·g#¿·ðv8ðv8c¾¾·c¾¾·Ð"t8Ð"t8×B¾·×B¾·º5r8º5r8I¾½·I¾½·˜Hp8˜Hp8È*½·È*½·îan8îan8uy¼·uy¼·Ôˆl8Ôˆl8Õž»·Õž»·iÀj8iÀj8Ÿœº·Ÿœº·i8i8Ô�¹·Ô�¹·ŽKg8ŽKg8=[¸·=[¸·�”e8�”e8Ð%··Ð%··‡ãc8‡ãc8·Ôµ··Ôµ·/?b8/?b8m^´·m^´·ª`8ª`8oò·oò·ª _8ª _8º±·º±·pœ]8pœ]8"O¯·"O¯·ë\8ë\8t�­·t�­·¯œZ8¯œZ8›«·›«·%+Y8%+Y8Q’©·Q’©·nÈW8nÈW8f§·f§·qV8qV8ù"¥·ù"¥·¢U8¢U8@Ö¢·@Ö¢·„ÌS8„ÌS8õ ·õ ·ˆ~R8ˆ~R8•ž·•ž·°:Q8°:Q8õŠ›·õŠ›·ûP8ûP8㘷㘷"×N8"×N8ˆ'–·ˆ'–·í­M8í­M8¤d“·¤d“·&…L8&…L8”™�·”™�·Ÿ_K8Ÿ_K8ý½�·ý½�·cBJ8cBJ8’ÉŠ·’ÉŠ·˜/I8˜/I8x½‡·x½‡· $H8 $H8m¤„·m¤„·G8G8é†�·é†�· F8 F8òÆ|·òÆ|· E8 E8,bv·,bv·• D8• D8[Óo·[Óo·ºC8ºC8"i·"i·0 B80 B8ÿbb·ÿbb·M-A8M-A8\£[·\£[·’9@8’9@8ÞÛT·ÞÛT·0H?80H?8àýM·àýM·`\>8`\>8µG·µG·¿u=8¿u=8@÷?·@÷?·.�<8.�<8mê8·mê8·œ¨;8œ¨;8.ã1·.ã1·+¿:8+¿:8¯Û*·¯Û*·ŸÖ98ŸÖ98ÝÆ#·ÝÆ#·çñ88çñ88ÚŸ·ÚŸ·8888¡r·¡r·\-78\-78N·N·öF68öF68…8·…8·]58]58¢+·¢+·Qr48Qr48o7ò¶o7ò¶ýˆ38ýˆ38–ä¶–ä¶äŸ28äŸ28ëïÕ¶ëïÕ¶E´18E´18�ðǶ�ðǶ*Ä08*Ä08̺¶Ìº¶MÏ/8MÏ/8Œj¬¶Œj¬¶×.8×.8aÑž¶aÑž¶WÝ-8WÝ-8xG‘¶xG‘¶â,8â,8ÐÕƒ¶ÐÕƒ¶„ã+8„ã+8äm¶äm¶Ãß*8Ãß*8™õR¶™õR¶|Ö)8|Ö)8¼29¶¼29¶–È(8–È(8¶¶�·'8�·'8ô޶ô޶¤&8¤&8BGÛµBGÛµ`Œ%8`Œ%8?Eªµ?EªµÜn$8Ün$8«ƒtµ«ƒtµŒJ#8ŒJ#8²µ²µV"8V"8³ƒk´³ƒk´Çî 8Çî 8¹Bú3¹Bú3·¹8·¹8xuï4xuï4H8H8ä,N5ä,N5|>8|>8¥'‘5¥'‘5ö8ö8Yõ¹5Yõ¹50¦80¦8Ÿ˜á5Ÿ˜á5PP8PP8�6�6õ8õ8 ï6 ï6”8”8Œ/)6Œ/)6u,8u,8§Ð:6§Ð:6<½8<½8ÁÇK6ÁÇK6­F8­F8\6\6|É8|É8Ük6Ük6éE8éE8üz6üz6‹» 8‹» 8üº„6üº„6ê) 8ê) 8« ‹6« ‹6È� 8È� 8v-’6v-’6ð8ð8Bb˜6Bb˜6}H8}H8(Cž6(Cž6=š8=š8ÅÏ£6ÅÏ£6$å8$å8v©6v©6i)8i)8zç­6zç­6Zg8Zg8Ýu²6Ýu²6>ý7>ý7¡¯¶6¡¯¶6á ù7á ù7ü”º6ü”º6÷õ7÷õ7,#¾6,#¾6‰@ò7‰@ò7/[Á6/[Á6~î7~î7¤@Ä6¤@Ä6�°ê7�°ê7<ÓÆ6<ÓÆ6½×æ7½×æ7É6É6ôâ7ôâ7BÿÊ6BÿÊ6Iß7Iß7$˜Ì6$˜Ì6< Û7< Û7dáÍ6dáÍ6- ×7- ×7ˆÞÎ6ˆÞÎ6¨ÿÒ7¨ÿÒ7I�Ï6I�Ï6—ìÎ7—ìÎ7ÌòÏ6ÌòÏ6,ÑÊ7,ÑÊ7Õ Ð6Õ Ð6ç­Æ7ç­Æ7åÖÏ6åÖÏ6úƒÂ7úƒÂ7¶^Ï6¶^Ï6�T¾7�T¾7¤Î6¤Î65 º75 º7¦Í6¦Í6£æµ7£æµ7ŽdÌ6ŽdÌ6P¨±7P¨±7ŠáÊ6ŠáÊ6,f­7,f­7ó É6ó É6‰!©7‰!©7w'Ç6w'Ç6ŠÛ¤7ŠÛ¤7†÷Ä6†÷Ä6ˆ” 7ˆ” 7W�Â6W�Â6dLœ7dLœ7æñ¿6æñ¿6¹˜7¹˜7x½6x½6½»“7½»“7‹º6‹º6ºu�7ºu�7ð¶6ð¶6¶2‹7¶2‹7š³6š³6áò†7áò†7y°6y°6=¶‚7=¶‚7Go¬6Go¬6Øú|7Øú|7–ž¨6–ž¨6?“t7?“t7!¬¤6!¬¤6O8l7O8l7œ 6œ 6úëc7úëc7upœ6upœ6ÿ®[7ÿ®[7)˜6)˜6Å�S7Å�S7È“6È“6oeK7oeK7ÜN�6ÜN�6"\C7"\C7Š6Š6]h;7]h;7J&†6J&†6aŒ37aŒ37+~�6+~�6;É+7;É+7•y6•y6s$7s$7ˆp6ˆp6 �7 �7‹f6‹f6ß7ß7×ô\6×ô\6nÈ 7nÈ 7©^S6©^S6Ü”7Ü”7ÎI6ÎI6¹ÿ6¹ÿ6¾E@6¾E@63)ñ63)ñ6æÆ66æÆ66­’ã6­’ã67U-67U-6;FÖ6;FÖ6=÷#6=÷#6%HÉ6%HÉ6µ´6µ´6Hœ¼6Hœ¼6Z“6Z“6lE°6lE°6m–6m–6E¤6E¤6°ÿ5°ÿ5ל˜6ל˜6g%î5g%î5aO�6aO�6w)Ý5w)Ý5+`‚6+`‚6˜Ì5˜Ì5¥o6¥o6þz¼5þz¼5xQ[6xQ[6?ج5?ج5ÝÈG6ÝÈG6g´�5g´�5¾56¾56N�5N�5Ú'#6Ú'#6è�5è�5¶6¶6ng5ng5é6é6dqM5dqM5¡6å5¡6å5B55B55ódÈ5ódÈ5C5C5•d­5•d­5íX5íX58=”58=”5<è4<è4mîy5mîy5§ÀÂ4§ÀÂ4c4O5c4O5ÒV 4ÒV 4BY(5BY(5�4�4£h5£h5øJ4øJ4àÛÌ4àÛÌ4¢�4¢�4úé–4úé–4ciÛ3ciÛ3%R4%R4†Š“3†Š“3%Ô4%Ô4…G33…G33_ ˜3_ ˜3,²·2,²·2|w3|w3æÆ2æÆ2eÃ2eÃ2éæl0éæl0././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/BinauralDecoder/Source/EQ/Sennheiser-HD565ovation.wavIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/BinauralDecoder/Source/EQ/Sennheiser0000664002537200253720000004013015257173642031443 0ustar zmoelnigzmoelnigRIFFP@WAVEfmt €»Ü factPEAKác YQ9R?Q9R?data@Q9R?Q9R?¢¦1¾¢¦1¾?7¾?7¾áô[½áô[½Ÿ8¾Ÿ8¾*¿+½*¿+½ ¬ë< ¬ë<Ìø=Ìø=ÜÂ<ÜÂ;¯>;‘T–:‘T–:åæ;åæ;˜ ”:˜ ”:j;j;ªŽŽ:ªŽŽ:п;п;áÊ‹:áÊ‹:Öˆ;Öˆ;4 �:4 �:I;I;O�:O�:«‘;«‘;Žý‹:Žý‹:¹å;¹å;-‹:-‹:l;l;‹âŒ:‹âŒ:Õ;Õ;Ó)Ž:Ó)Ž:öÈ;öÈ;/2�:/2�:A;A;a§Œ:a§Œ:õ;;õ;;uÖ�:uÖ�:9Á;9Á;„Ž:„Ž: š; š;lÇ�:lÇ�:t;t;ÕÁŒ:ÕÁŒ:_;_;‹:‹:U™;U™;å-Š:å-Š:Eå;Eå;(øˆ:(øˆ:[";[";Rt‡:Rt‡:¾>;¾>;†:†:›‘;›‘;® …:® …:èø;èø;3ȃ:3ȃ:æ;æ;u0‚:u0‚:F ;F ;‡Í€:‡Í€:QŽ ;QŽ ;{o:{o:‹ ;‹ ;>~:>~:C² ;C² ;ºl}:ºl}:äi ;äi ;€J|:€J|:¾ô ;¾ô ;�Öz:�Öz:x’ ;x’ ;Öæy:Öæy:T< ;T< ;þ¼x:þ¼x:[× ;[× ;ßÃw:ßÃw:å– ;å– ;7.w:7.w:õ> ;õ> ;·€u:·€u:Ëž;Ëž;)os:)os:#;#;—pr:—pr:¶Þ;¶Þ;”q:”q:[k;[k;io:io:`£;`£;]l:]l:&Ì;&Ì;Ó·i:Ó·i:s+;s+;õðg:õðg:Ež;Ež;Œe:Œe:M²;M²;”†a:”†a:Κ;Κ;Ë ^:Ë ^:Qâ;Qâ;}@\:}@\:pV;pV;�çY:�çY:žy;žy;`ZV:`ZV:Xÿ:Xÿ:N^S:N^S:¦§ý:¦§ý:]lQ:]lQ:à–ü:à–ü:‘O:‘O:>Vû:>Vû:'M:'M:ÜÚù:ÜÚù:ÿ¤J:ÿ¤J:„¡ø:„¡ø:DI:DI:ÏÑ÷:ÏÑ÷:%ØG:%ØG:Pïö:Pïö:ÑF:ÑF:’Àõ:’Àõ:•!D:•!D:9Áô:9Áô:ƒÓB:ƒÓB:›ô:›ô:Þ®A:Þ®A:].ó:].ó:H.@:H.@:-ò:-ò:nq>:nq>:Óñ:Óñ:’¨<:’¨<:¹ð:¹ð: ;: ;:è2ï:è2ï:Ñ·9:Ñ·9:ƒ;î:ƒ;î:bë7:bë7:Ôí:Ôí:‡é5:‡é5:žåë:žåë:Ûë3:Ûë3:öµê:öµê:4Í1:4Í1:dé:dé:˜a/:˜a/:Øüç:Øüç:†ÿ,:†ÿ,:Kªæ:Kªæ:ªÇ*:ªÇ*:ïdå:ïdå:0Š(:0Š(:æä:æä:ëÕ%:ëÕ%:\â:\â:GÛ":GÛ":ØÇà:ØÇà:[ :[ :|ß:|ß:Ô1:Ô1:‡&Þ:‡&Þ:Œ”:Œ”:a‡Ü:a‡Ü:Š•:Š•:IéÚ:IéÚ:“ù:“ù:�“Ù:�“Ù:cÐ:cÐ:ÞHØ:ÞHØ:ÛN:ÛN:ä°Ö:ä°Ö:ŠG:ŠG:®Õ:®Õ:j‡ :j‡ : Ó: Ó:AT :AT :‚cÒ:‚cÒ:h:h:¤ûÐ:¤ûÐ:ïl:ïl:°nÏ:°nÏ:k¼:k¼:àüÍ:àüÍ:™»þ9™»þ9û°Ì:û°Ì:5Mú95Mú9{^Ë:{^Ë:Guõ9Guõ95óÉ:5óÉ:Ñ–ð9Ñ–ð9>¢È:>¢È:Yì9Yì9êsÇ:êsÇ:ÈYè9ÈYè9 ?Æ: ?Æ:Øä9Øä9´òÄ:´òÄ:ñxß9ñxß9ÿ¨Ã:ÿ¨Ã:�.Û9�.Û9¬vÂ:¬vÂ:>E×9>E×9|WÁ:|WÁ:µÓ9µÓ9]6À:]6À:�•Ï9�•Ï9Š ¿:Š ¿:Ê£Ë9Ê£Ë9sí½:sí½:@È9@È9Kç¼:Kç¼:æ¨Ä9æ¨Ä9ÿÖ»:ÿÖ»:¼÷À9¼÷À9¶½º:¶½º:/^½9/^½9÷µ¹:÷µ¹:�º9�º9u¼¸:u¼¸:çß¶9çß¶9àÀ·:àÀ·:¦’³9¦’³9ƒ¾¶:ƒ¾¶:Q5°9Q5°9~¾µ:~¾µ:í­9í­9ÀÍ´:ÀÍ´: ÿ©9 ÿ©9Wß³:Wß³:TÔ¦9TÔ¦9ìà²:ìà²:K‡£9K‡£9ìê±:ìê±:ë� 9ë� 9 ±: ±:¥¬�9¥¬�9°:°:£kš9£kš9â¯:â¯:¼—9¼—9Y®:Y®:Y ”9Y ”9|<­:|<­:,U‘9,U‘9Ðb¬:Ðb¬:øzŽ9øzŽ9½s«:½s«:-6‹9-6‹9÷nª:÷nª:(Ö‡9(Ö‡9¡v©:¡v©:ÖÙ„9ÖÙ„9³”¨:³”¨:Tú�9Tú�9E©§:E©§:£}9£}9à­¦:à­¦:ñ%w9ñ%w9縥:縥:` q9` q9<Τ:<Τ:' k9' k9´ß£:´ß£:ÅÆd9ÅÆd9 æ¢: æ¢: (^9 (^9hæ¡:hæ¡:ÀªW9ÀªW9_ô :_ô :!¦Q9!¦Q9  :  :cnK9cnK9DŸ:DŸ:�ºD9�ºD9Ò ž:Ò ž:>>9>>9ï�:ï�:£�79£�79çœ:çœ:ðÍ09ðÍ093 ›:3 ›:+*9+*9± š:± š:‹i#9‹i#9{ ™:{ ™:3½93½9¹ ˜:¹ ˜:´ó9´ó9Ô—:Ô—:Ä9Ä9yú•:yú•:ò9ò9>ï”:>ï”:Ý÷9Ý÷9±å“:±å“:Ãíó8Ãíó8ŒÛ’:ŒÛ’:€æ8€æ8Gב:Gב:x�Ø8x�Ø8ŒÒ�:ŒÒ�:9›Ê89›Ê8~Ã�:~Ã�: ¼8 ¼8ϰŽ:ϰŽ:gí8gí84¦�:4¦�:ÖŸ8ÖŸ8 œŒ: œŒ:C³‘8C³‘8:�‹::�‹:S˜ƒ8S˜ƒ8c…Š:c…Š:Dik8Dik8ƒ~‰:ƒ~‰:¿åO8¿åO8Ìxˆ:Ìxˆ:1^481^48™q‡:™q‡:®ˆ8®ˆ8ïh†:ïh†:»Üù7»Üù7!f…:!f…:ÃuÄ7ÃuÄ7Fh„:Fh„:òZ�7òZ�7¾iƒ:¾iƒ:ôª47ôª47n‚:n‚:h»™6h»™6Rv�:Rv�:{PÔµ{PÔµ©{€:©{€:¥·¥·Mÿ~:Mÿ~:ñÑk·ñÑk·}:}:xh¨·xh¨·ô/{:ô/{:è2Ú·è2Ú·¦Qy:¦Qy:¬Â¸¬Â¸ sw: sw:Ÿª¸Ÿª¸ú�u:ú�u:U®7¸U®7¸C°s:C°s:´0P¸´0P¸Ûq:Ûq:åh¸åh¸M p:M p:)ܸ)ܸy¹”Ù>¹ÎŒG:ÎŒG:}˜D¹}˜D¹@ÓE:@ÓE:ñ(J¹ñ(J¹Æ D:Æ D:´¶O¹´¶O¹jB:jB:ÔZU¹ÔZU¹®°@:®°@:ãöZ¹ãöZ¹Ný>:Ný>:Øt`¹Øt`¹)Q=:)Q=:Ýe¹Ýe¹5§;:5§;:nPk¹nPk¹Bö9:Bö9:^àp¹^àp¹³C8:³C8:óVv¹óVv¹œ�6:œ�6:‰—{¹‰—{¹Ö5:Ö5:ph€¹ph€¹�_3:�_3:ôƒ¹ôƒ¹¹1:¹1:ÆÀ…¹ÆÀ…¹Ã0:Ã0:›cˆ¹›cˆ¹†x.:†x.:P÷йP÷йÁß,:Áß,:úŽ�¹úŽ�¹²B+:²B+:*�¹*�¹#ª):#ª):p°’¹p°’¹÷(:÷(:)&•¹)&•¹T’&:T’&:¨—¹¨—¹åÿ$:åÿ$:z-š¹z-š¹èr#:èr#:±žœ¹±žœ¹�ð!:�ð!:óŸ¹óŸ¹Fq :Fq :Ùc¡¹Ùc¡¹–ñ:–ñ:1£¹1£¹Äw:Äw:¡¦¹¡¦¹6:6:ÍQ¨¹ÍQ¨¹Æ—:Æ—:Ø–ª¹Ø–ª¹5$:5$:+㬹+㬹(³:(³:N¯¹N¯¹N:N:E±¹E±¹ì:ì:~r³¹~r³¹Ú„:Ú„:浹æµ¹9:9:Ï·¹Ï·¹ØÀ:ØÀ:Qì¹¹Qì¹¹Áe:Áe:ò¼¹ò¼¹a :a :ú$¾¹ú$¾¹�­ :�­ :AÀ¹AÀ¹‡U :‡U :üM¹üM¹; :; :ÅRĹÅRĹ�³:�³:âaƹâaƹ¨]:¨]:(pȹ(pȹr :r :¹mʹ¹mʹ‡Å:‡Å:?_̹?_̹-€:-€:$Sι$Sι�7:�7:?Mй?Mй_î:_î:ö@Ò¹ö@Ò¹Yÿ9Yÿ9É Ô¹É Ô¹Dèü9Dèü9zöÕ¹zöÕ¹Tvú9Tvú9bÔ×¹bÔ×¹_þ÷9_þ÷9a¯Ù¹a¯Ù¹Û’õ9Û’õ9lzÛ¹lzÛ¹’4ó9’4ó9›>ݹ›>ݹŒ×ð9Œ×ð9·ß¹·ß¹Þxî9Þxî91Êà¹1Êà¹Àì9Àì9.‡â¹.‡â¹IÐé9IÐé9.8ä¹.8ä¹9‹ç99‹ç9 åå¹ åå¹}Eå9}Eå9æ”ç¹æ”ç¹Ùþâ9Ùþâ9Aé¹Aé¹Àà9Àà9�åê¹�åê¹…Þ9…Þ9PŠì¹PŠì¹JÜ9JÜ9°+î¹°+Ú9¦Ú9�Ãï¹�Ãï¹kì×9kì×9‘Tñ¹‘Tñ¹vÆÕ9vÆÕ9Ýãò¹Ýãò¹¦ Ó9¦ Ó9ósô¹ósô¹p{Ñ9p{Ñ9„ÿõ¹„ÿõ¹9`Ï99`Ï9=~÷¹=~÷¹@PÍ9@PÍ9À÷ø¹À÷ø¹÷>Ë9÷>Ë9vú¹vú¹À+É9À+É9$ïû¹$ïû¹Ð$Ç9Ð$Ç9Zý¹Zý¹m(Å9m(Å9ìÀþ¹ìÀþ¹á+Ã9á+Ã9lºlº80Á980Á9€Æº€Æº-<¿9-<¿9DsºDsº7S½97S½9~º~ºk»9k»9LǺLǺ¢€¹9¢€¹9÷qº÷qº}›·9}›·9°º°º3Áµ93Áµ9ß¹ºß¹º"è³9"è³9¹]º¹]ºš ²9š ²9æºæº�2°9�2°9Ä¢ºÄ¢º¤a®9¤a®91@º1@º•¬9•¬9÷ܺ÷ܺKȪ9KȪ9æyºæyºöû¨9öû¨9X ºX ºç1§9ç1§9± º± ºl¥9l¥9ÅI ºÅI ºžª£9žª£9sà ºsà º ì¡9 ì¡9©v º©v ºœ- 9œ- 9š ºš ºdqž9dqž9¥  º¥  º�ºœ9�ºœ9Þ1 ºÞ1 ºñ›9ñ›9È ºÈ ºíR™9íR™9`Uº`Uº„œ—9„œ—9)çº)çºë•9ë•9|uº|uºÕ@”9Õ@”9>º>º¨˜’9¨˜’9a�ºa�ºXï�9Xï�9}º}º$H�9$H�9Á¤�9Á¤�9ú,ºú,ºŒ9Œ9jµºjµºÔcŠ9ÔcŠ9<º<ºÂLj9ÂLj9+º+º ,‡9 ,‡9ÄGºÄGº¬’…9¬’…9̺̺‡ûƒ9‡ûƒ9¹Oº¹Oº‡e‚9‡e‚9ÔÒºÔÒºNÑ€9NÑ€9ÈTºÈTº^~9^~9¦Õº¦Õº·`{9·`{9OUºOUº Gx9 Gx9#Ôº#Ôºš/u9š/u9vRºvRºšr9šr9øÎºøÎºo9o9�Iº�Iº_ l9_ l9MĺMĺxi9xi9.>º.>ºí f9í f9E´ºE´ºÉc9Éc9¬(º¬(ºz/`9z/`9›�º›�º-B]9-B]9eºeºñ^Z9ñ^Z9‚º‚º|‡W9|‡W9¯ðº¯ðºŸµT9ŸµT9R^ºR^ºøçQ9øçQ9�ʺ�ʺ#O9#O9ö3ºö3ºkL9kL9 ›º ›ºçµI9çµI9׺׺ºþF9ºþF9XiºXiº¡VD9¡VD9ãʺãʺKÀA9KÀA9è) ºè) º»,?9»,?9\‰ º\‰ ºH˜<9H˜<9è ºè ºÐ :9Ð :9!D!º!D!º‹79‹79’�!º’�!ºT59T59_õ!º_õ!º* 29* 29NL"ºNL"ºÞ209Þ209 "ºÂ "ºÔÓ-9ÔÓ-9Œñ"ºŒñ"º%€+9%€+9ò@#ºò@#ºq.)9q.)9 �#º �#º§à&9§à&9rÝ#ºrÝ#º œ$9 œ$9b($ºb($º]b"9]b"9Šp$ºŠp$º3 93 9ï¶$ºï¶$º 9 9×ü$º×ü$ºÈß9Èß9A%ºA%º9Ã99Ã9‚%º‚%º±9±9ãÁ%ºãÁ%ºkŸ9kŸ9Š&ºŠ&ºI”9I”9/>&º/>&ºì—9ì—9Œw&ºŒw&ºH¥9H¥9·¯&º·¯&ºº³ 9º³ 9è&ºè&º]Ä 9]Ä 9‡'º‡'º/â 9/â 9ïP'ºïP'º‚9‚9f€'ºf€'ºŒC9ŒC9T°'ºT°'ºt9t9¨ß'º¨ß'º¯9¯9# (º# (ºù9ù94(º4(º �þ8 �þ8 ](º ](ºd.û8d.û8…(º…(º/Ü÷8/Ü÷8¢ª(º¢ª(ºÃ ô8àô8sÍ(ºsÍ(ºÖwñ8Öwñ8øî(ºøî(º'Rî8'Rî8�)º�)ºU1ë8U1ë8v0)ºv0)ºV$è8V$è8ÛM)ºÛM)ºL(å8L(å8 j)º j)º1â81â8§…)º§…)ºKDß8KDß8™Ÿ)º™Ÿ)ºÄeÜ8ÄeÜ8¸)º¸)ºs’Ù8s’Ù8EÏ)ºEÏ)º|ÆÖ8|ÆÖ8îå)ºîå)ºâÔ8âÔ8_û)º_û)º�JÑ8�JÑ8‹*º‹*º:§Î8:§Î8á*ºá*ºt Ì8t Ì8û0*ºû0*ºsÉ8sÉ8gA*ºgA*ºæÆ8æÆ8åO*ºåO*ºÃhÄ8ÃhÄ8ï\*ºï\*ºÚòÁ8ÚòÁ8ˆi*ºˆi*º£�¿8£�¿8 u*º u*ºÞ½8Þ½80~*º0~*ºaѺ8aѺ8ƒ…*ºƒ…*º�‹¸8�‹¸8®Œ*º®Œ*ºðB¶8ðB¶8D”*ºD”*º)ý³8)ý³8}š*º}š*ºʱ8ʱ8ž*ºž*º�©¯8�©¯8R *ºR *ºbŽ­8bŽ­8Z¢*ºZ¢*º%v«8%v«8—£*º—£*º±i©8±i©8î¢*ºî¢*º6n§86n§8œ *ºœ *º'z¥8'z¥8&ž*º&ž*ºÉ†£8Ɇ£8+›*º+›*º´ž¡8´ž¡8–*º–*ºáÊŸ8áÊŸ8¾Ž*º¾Ž*ºŸž8Ÿž8¨†*º¨†*º?œ8?œ8Â~*ºÂ~*º1|š81|š8¦u*º¦u*ºëʘ8ëʘ8 j*º j*º�+—8�+—8]*º]*º]�•8]�•8P*ºP*º³ø“8³ø“8öA*ºöA*ºÝp’8Ýp’8º1*ºº1*º™ö�8™ö�8’ *º’ *º€�8€�83*º3*º Ž8 Ž8ý)ºý)º)¥Œ8)¥Œ8#é)º#é)ºML‹8ML‹8äÓ)ºäÓ)º+ù‰8+ù‰8x¾)ºx¾)ºë§ˆ8마8~¨)º~¨)º`‡8`‡8‘)º‘)ºj#†8j#†8Ñx)ºÑx)ºöé„8öé„8N`)ºN`)ºú¶ƒ8ú¶ƒ8]F)º]F)º{“‚8{“‚8­*)º­*)ºây�8ây�8u)ºu)ºëb€8ëb€8Éñ(ºÉñ(º§~8§~8ãÓ(ºãÓ(º% |8% |8v´(ºv´(º*³z8*³z8²“(º²“(ºÍÕx8ÍÕx8kr(ºkr(ºEw8Ew8�P(º�P(º-a8œ>a8 E%º E%ºà›`8à›`8ë%ºë%ºè`8è`8ªÛ$ºªÛ$º•_8•_8Ù¥$ºÙ¥$ºM"_8M"_8\o$º\o$ºK½^8K½^88$º8$ºzd^8zd^8!$º!$º^8^8ñÆ#ºñÆ#º2é]82é]8‡Œ#º‡Œ#ºÆÅ]8ÆÅ]8¢Q#º¢Q#º©]8©]8L#ºL#ºû—]8û—]8Ú"ºÚ"º:˜]8:˜]8Ýœ"ºÝœ"ºÚ§]8Ú§]8ó^"ºó^"ºƒ¿]8ƒ¿]8Ó "ºÓ "º0Ü]80Ü]8 â!º â!º@^8@^8¢¡!º¢¡!º"X^8"X^8~`!º~`!º8£^88£^8«!º«!ºFî^8Fî^8MÞ ºMÞ ºKL_8KL_8Ÿ› ºŸ› ºl½_8l½_8#X º#X º9`89`8$ º$ º+¾`8+¾`8‘Ϻ‘ϺDOa8DOa83Šº3Šºïa8ïa8 Dº Dº¨™b8¨™b8qýºqýºƒMc8ƒMc8 ¶º ¶º’d8’d8amºamºîd8îd8$º$ºeÎe8eÎe8]Úº]Úº^¸f8^¸f8ß�ºß�ºõ³g8õ³g8MDºMDºcÀh8cÀh8ê÷ºê÷ºzØi8zØi8üªºüªºJùj8Jùj8–]º–]ºº#l8º#l8†º†º‹\m8‹\m8†Àº†Àº½¤n8½¤n8ßpºßpºŒóo8Œóo8!º!ºIHq8IHq8šÐºšÐº¨«r8¨«r85º5º…t8…t8÷,º÷,ºŽžu8Žžu8_Úº_Úºn!w8n!w8‰‡º‰‡º6®x86®x8È3ºÈ3ºyNz8yNz8èÞºèÞºBý{8Bý{8�‰º�‰ºÓ®}8Ó®}824º24ºi8i8ÞݺÞݺ|›€8|›€8p†ºp†º]‰�8]‰�8œ.ºœ.ºªx‚8ªx‚8¯Öº¯ÖºŸkƒ8Ÿkƒ8ï}ºï}ºƒh„8ƒh„8ï#ºï#ºïm…8ïm…8mɺmɺ?t†8?t†8 oº oºµ{‡8µ{‡8/º/ºŒŠˆ8ŒŠˆ8A¸ºA¸º«¢‰8«¢‰8j[ºj[ºÐ¿Š8пŠ8bþºbþºÚÝ‹8ÚÝ‹8!¡º!¡º-�8-�8ùBºùBº-Ž8-Ž8òãºòãº"^�8"^�8­„º­„º��8��8M%ºM%ºßÅ‘8ßÅ‘8+ź+źV“8V“88dº8dº±F”8±F”8˺˺÷Œ•8÷Œ•8!¡º!¡ºÂÖ–8ÂÖ–8Ö>ºÖ>º(˜8(˜8™Ûº™Ûº:€™8:€™8æwºæwº£Ùš8£Ùš8OºOºá3œ8á3œ8J°ºJ°º:•�8:•�8CKºCKº¡þž8¡þž8‘å º‘å º^k 8^k 8´ º´ ºIÚ¡8IÚ¡8y ºy ºþM£8þM£8˜² º˜² º&Ȥ8&Ȥ8ðJ ºðJ º]H¦8]H¦8Öâ ºÖâ º·Ê§8·Ê§8•z º•z ºKP©8KP©8· º· ºݪ8ݪ8ú§ ºú§ º(p¬8(p¬8½= º½= º�®8�®8)Ó º)Ó º¡¯8¡¯8 h º h ºw@±8w@±8qüºqüºþã²8þã²8`�º`�ºº‹´8º‹´8ê#ºê#º¶6¶8¶6¶8·º·ºæ·8æ·8ŸIºŸIºÞ›¹8Þ›¹8“Ûº“Ûº.T»8.T»8‹mº‹mºÆ ½8Æ ½8JÿºJÿº“ʾ8“ʾ88�º8�ºV�À8V�À8� º� ºWÂ8WÂ8Ó°ºÓ°º’Ä8’Ä8ê@ºê@ºðëÅ8ðëÅ8UкUк•¿Ç8•¿Ç8ò^ºò^º˜É8˜É8píºpíºhoË8hoË8&|º&|º!HÍ8!HÍ8B ºB º{)Ï8{)Ï8I—ºI—º‰Ñ8‰Ñ8$º$º€ùÒ8€ùÒ8簺簺ëâÔ8ëâÔ8T=ºT=º4ÒÖ84ÒÖ8’ÿ¹’ÿ¹ªÆØ8ªÆØ8Ĩþ¹Ä¨þ¹¦½Ú8¦½Ú8¿ý¹¿ý¹�¶Ü8�¶Ü8ÝÔü¹ÝÔü¹«³Þ8«³Þ8céû¹céû¹Q¶à8Q¶à8ýú¹ýú¹´ºâ8´ºâ8Ìú¹Ìú¹u¿ä8u¿ä84$ù¹4$ù¹æÇæ8æÇæ8™6ø¹™6ø¹lÔè8lÔè8gH÷¹gH÷¹Nãê8Nãê8ŸYö¹ŸYö¹¶õì8¶õì8.jõ¹.jõ¹ ï8 ï8˜zô¹˜zô¹Îñ8Îñ8™Šó¹™Šó¹Y8ó8Y8ó8ý™ò¹ý™ò¹ÊSõ8ÊSõ8Шñ¹Ð¨ñ¹r÷8r÷8·ð¹·ð¹’“ù8’“ù8�Äï¹�Äï¹Å·û8Å·û8¬ÑÑî¹CÞý8CÞý8IÞí¹IÞí¹°9°9lêì¹lêì¹W9W9"öë¹"öë¹U09U093ë¹3ë¹àH9àH9Æ ê¹Æ ê¹[á¹>[á¹s9s9âbà¹âbà¹l•9l•9æiß¹æiß¹¹9¹9ÁpÞ¹ÁpÞ¹´Ü9´Ü9§wݹ§wݹ99~ܹ~ܹü&9ü&9íƒÛ¹íƒÛ¹ËM9ËM9°‰Ú¹°‰Ú¹Ùt9Ùt9s�Ù¹s�Ù¹Dœ9Dœ9%•ع%•عÄ9Ä9¿š×¹¿š×¹}ì9}ì9 Ö¹ Ö¹í9í9ò¤Õ¹ò¤Õ¹†@9†@9Ÿ©Ô¹Ÿ©Ô¹k9k9»®Ó¹»®Ó¹Ô”9Ô”9(´Ò¹(´Ò¹å¾9å¾9;¹Ñ¹;¹Ñ¹Nê 9Nê 9ê½Ð¹ê½Ð¹ô"9ô"9þÂϹþÂϹÇ@#9Ç@#9†Èι†Èιxk$9xk$9ðÍ͹ðÍ͹(—%9(—%9õÒ̹õÒ̹gÃ&9gÃ&96ØË¹6ØË¹ãî'9ãî'9ÞʹÞʹú)9ú)9ËãɹËãɹîE*9îE*90éȹ0éȹ¤r+9¤r+9¤îǹ¤îǹîž,9îž,9ŽôƹŽôƹ­Ê-9­Ê-9¸úʏúŹö.9ö.9âŹâʍ"09¨"09ĹĹ%O19%O19% ù% ù�{29�{29�¹�¹ŧ39ŧ39'Á¹'Á¹Ô49Ô49à À¹Ã À¹p69p69¦'¿¹¦'¿¹0,790,79/¾¹/¾¹„W89„W896½¹6½¹.ƒ99.ƒ99ê=¼¹ê=¼¹¯:9¯:9E»¹E»¹ŒÚ;9ŒÚ;9ŸMº¹ŸMº¹ñ=9ñ=9gV¹¹gV¹¹�.>9�.>9k_¸¹k_¸¹€X?9€X?9oh·¹oh·¹G‚@9G‚@9êq¶¹êq¶¹«A9«A9í{µ¹í{µ¹—ÓB9—ÓB9ÿ…´¹ÿ…´¹3üC93üC9g�³¹g�³¹Ó#E9Ó#E9”›²¹”›²¹QJF9QJF9:§±¹:§±¹�pG9�pG9³°¹³°¹Ó–H9Ó–H9ô¾¯¹ô¾¯¹è¼I9è¼I9LË®¹LË®¹âJ9âJ9QØ­¹QØ­¹YL9YL9”嬹”嬹ì*M9ì*M9Òò«¹Òò«¹UON9UON9­«¹­«¹"rO9"rO9{ª¹{ª¹ð“P9ð“P9v©¹v©¹F¶Q9F¶Q9I-¨¹I-¨¹ÄØR9ÄØR9w<§¹w<§¹3úS93úS9�L¦¹�L¦¹ãU9ãU9ƒ]¥¹ƒ]¥¹µ8V9µ8V9¸n¤¹¸n¤¹¨WW9¨WW9€£¹€£¹vX9vX9’¢¹’¢¹³’Y9³’Y9>¥¡¹>¥¡¹!®Z9!®Z9¸¸ ¹¸¸ ¹gÉ[9gÉ[9‰ÌŸ¹‰ÌŸ¹¢ã\9¢ã\9Láž¹Láž¹ü]9ü]9óö�¹óö�¹o_9o_9 �¹ �¹L*`9L*`9�#œ¹�#œ¹§@a9§@a9˜:›¹˜:›¹—Ub9—Ub9®Rš¹®Rš¹Íhc9Íhc9vk™¹vk™¹ƒ{d9ƒ{d9�„˜¹�„˜¹·�e9·�e93ž—¹3ž—¹Zžf9Zžf9븖¹ë¸–¹n­g9n­g9LÔ•¹LÔ•¹Ó»h9Ó»h9 𔹠ð”¹rÉi9rÉi9Š ”¹Š ”¹Öj9Öj9Â)“¹Â)“¹Ýàk9Ýàk9 H’¹ H’¹êl9êl9 g‘¹ g‘¹~òm9~òm9|†�¹|†�¹ún9ún9º¦�¹º¦�¹Þÿo9Þÿo9!ÈŽ¹!ÈŽ¹¹q9¹q9sê�¹sê�¹Pr9Pr9o �¹o �¹Ûs9Ûs9(1Œ¹(1Œ¹êt9êt9ÛU‹¹ÛU‹¹7u97u9†{й†{йv9v9ᡉ¹á¡‰¹ ÿv9 ÿv9ãȈ¹ãȈ¹]ùw9]ùw9/ñ‡¹/ñ‡¹3ñx93ñx9 ‡¹ ‡¹Åçy9Åçy9ƒD†¹ƒD†¹áÝz9áÝz9în…¹în…¹“Ò{9“Ò{9tš„¹tš„¹Å|9Å|9ǃ¹ǃ¹¶}9¶}9sô‚¹sô‚¹¦~9¦~9z"‚¹z"‚¹¢”9¢”9œQ�¹œQ�¹s@€9s@€9ù�€¹ù�€¹¸µ€9¸µ€9âe¹âe¹Š*�9Š*�9êÇ}¹êÇ}¹×œ�9ל�9u'|¹u'|¹h ‚9h ‚9Ø„z¹Ø„z¹{v‚9{v‚9Kßx¹Kßx¹bÞ‚9bÞ‚9Á6w¹Á6w¹áBƒ9áBƒ9Œu¹Œu¹©£ƒ9©£ƒ9Fßs¹Fßs¹ê„9ê„9ü/r¹ü/r¹ÙZ„9ÙZ„9:~p¹:~p¹3±„93±„9âÊn¹âÊn¹•…9•…9\m¹\m¹R…9R…9`k¹`k¹ �…9 �…9ާi¹Ž§i¹µä…9µä…9<íg¹<íg¹�(†9�(†9Þ1f¹Þ1f¹Hh†9Hh†9®ud¹®ud¹¤†9¤†9Q¸b¹Q¸b¹=܆9=܆9|ù`¹|ù`¹±‡9±‡9ˆ9_¹ˆ9_¹'ˆ9>'ˆ9Ú#Q¹Ú#Q¹a8ˆ9a8ˆ9—_O¹—_O¹jEˆ9jEˆ9�›M¹�›M¹oNˆ9oNˆ9X×K¹X×K¹�Sˆ9�Sˆ9;J¹;J¹§Tˆ9§Tˆ9ƒOH¹ƒOH¹©Qˆ9©Qˆ9>ŒF¹>ŒF¹›Jˆ9›Jˆ9iÉD¹iÉD¹�?ˆ9�?ˆ9 C¹ C¹p0ˆ9p0ˆ9ŒEA¹ŒEA¹ ˆ9 ˆ9ä„?¹ä„?¹Öˆ9Öˆ9²Ä=¹²Ä=¹©ê‡9©ê‡9T<¹T<¹Kˇ9Kˇ9eG:¹eG:¹µ§‡9µ§‡9ˆŠ8¹ˆŠ8¹1€‡91€‡9ŒÎ6¹ŒÎ6¹­T‡9­T‡9Þ5¹Þ5¹%‡9%‡9�Z3¹�Z3¹[ñ†9[ñ†9‘¢1¹‘¢1¹Â¹†9¹†9Êë/¹Êë/¹:~†9:~†9J6.¹J6.¹Ê>†9Ê>†9N‚,¹N‚,¹Xû…9Xû…9ãÏ*¹ãÏ*¹ ´…9 ´…9Û)¹Û)¹äh…9äh…9xo'¹xo'¹Õ…9Õ…9ÂÁ%¹ÂÁ%¹ûÆ„9ûÆ„9‰$¹‰$¹jp„9jp„9üj"¹üj"¹û„9û„9~ ¹~ ¹±·ƒ9±·ƒ9¿¹¿¹ÍUƒ9ÍUƒ9�v¹�v¹:ð‚9:ð‚9”Ó¹”ӹφ‚9φ‚9Á2¹Á2¹®‚9®‚9쓹쓹ò¨�9ò¨�9÷¹÷¹¨4�9¨4�9/\¹/\¹Í¼€9ͼ€9žÃ¹žÃ¹8A€98A€9—-¹—-¹ „9 „9´™¹´™¹õ~~9õ~~9Á¹Á¹s}9s}94x ¹4x ¹(`|9(`|9.ë ¹.ë ¹VF{9VF{9�` ¹�` ¹Í%z9Í%z95ع5عîþx9îþx9æQ¹æQ¹¿Ñw9¿Ñw9ιιÑ�v9Ñ�v9ÿL¹ÿL¹ccu9ccu95ι5ι#t9#t9vQ¹vQ¹ÙÜr9ÙÜr9i®ÿ¸i®ÿ¸O�q9O�q9l¿ü¸l¿ü¸‘=p9‘=p9‘Õù¸‘Õù¸ån9ån9Xðö¸Xðö¸ã†m9ã†m9Îô¸Îô¸ #l9 #l9Ü4ñ¸Ü4ñ¸)¹j9)¹j9µ__Ii9ªIi9G�ë¸G�ë¸Õg9Õg9eÃè¸eÃè¸D[f9D[f9ùüå¸ùüå¸ñÛd9ñÛd90<ã¸0<ã¸[Wc9[Wc9«€à¸«€à¸¿Ía9¿Ía9BÊݸBÊݸD?`9D?`9óÛ¸óÛ¸ø«^9ø«^9ñlظñlظæ]9æ]9ÆÕ¸ÆÕ¸bw[9bw[9ð#Ó¸ð#Ó¸ˆÖY9ˆÖY9‡Ð¸‡Ð¸ 1X9 1X9ð͸ð͸‡V9‡V9÷]˸÷]˸EÙT9EÙT9vÐȸvÐȸž'S9ž'S9íGƸíGƸüqQ9üqQ9ÀÄøÀÄøp¸O9p¸O9§FÁ¸§FÁ¸XûM9XûM9+;¸+;¸å:L9å:L9‡X¼¸‡X¼¸ævJ9ævJ9l鹸l鹸I¯H9I¯H9Ž·¸Ž·¸•äF9•äF9µ¸µ¸ E9 E9¹²¸¹²¸¯FC9¯FC9W]°¸W]°¸sA9sA9÷®¸÷®¸¼œ?9¼œ?99µ«¸9µ«¸èÃ=9èÃ=9!h©¸!h©¸‘è;9‘è;9 §¸ §¸£ :9£ :98ݤ¸8ݤ¸]*89]*89𞢸𞢸"H69"H69e ¸e ¸öc49öc49Ü/ž¸Ü/ž¸¶}29¶}29àÿ›¸àÿ›¸q•09q•09¿Ô™¸¿Ô™¸‡«.9‡«.9ö­—¸ö­—¸7À,97À,9‰‹•¸‰‹•¸tÓ*9tÓ*9ôm“¸ôm“¸ å(9 å(9_U‘¸_U‘¸nõ&9nõ&9]A�¸]A�¸·%9·%9�1�¸�1�¸#9#97&‹¸7&‹¸ !9 !9ĉ¸Ä‰¸ê,9ê,9懸懸·89·89$ …¸$ …¸ D9 D9¨&ƒ¸¨&ƒ¸÷N9÷N9 2�¸ 2�¸7Y97Y9„~¸„~¸Cc9Cc9¬z¸¬z¸\m9\m9cÜv¸cÜv¸fw9fw9Äs¸Äs¸c�9c�9èWo¸èWo¸Ÿ‹ 9Ÿ‹ 9ú¡k¸ú¡k¸K– 9K– 9Eôg¸Eôg¸L¡ 9L¡ 9™Od¸™Od¸¢¬9¢¬9¥³`¸¥³`¸¥¸9¥¸9]¸]¸¬Å9¬Å9Ü‘Y¸Ü‘Y¸‘Ó9‘Ó9T V¸T V¸gÄÿ8gÄÿ8W‘R¸W‘R¸Òãû8Òãû8ÏO¸ÏO¸Ûø8Ûø8ƯK¸Æ¯K¸{*ô8{*ô8²JH¸²JH¸¸Qð8¸Qð8˜íD¸˜íD¸á{ì8á{ì8˜A¸˜A¸D©è8D©è8"J>¸"J>¸ÿÙä8ÿÙä8ô;¸ô;¸á8á8¶Å7¸¶Å7¸ÌEÝ8ÌEÝ8êŽ4¸êŽ4¸��Ù8��Ù8O_1¸O_1¸wÁÕ8wÁÕ8I7.¸I7.¸‡Ò8‡Ò8Ù+¸Ù+¸NÎ8NÎ8Æý'¸Æý'¸$›Ê8$›Ê8ì$¸ì$¸íÆ8íÆ8‚á!¸‚á!¸ DÃ8 DÃ8AÞ¸AÞ¸$ ¿8$ ¿8Oâ¸O⸎¼8޼8\í¸\í¸­h¸8­h¸8ÿ¸ÿ¸™Õ´8™Õ´8¸¸2H±82H±8Q8¸Q8¸ÀÀ­8ÀÀ­8}_ ¸}_ ¸¢?ª8¢?ª8G� ¸G� ¸Å¦8Ŧ8ØÁ¸ØÁ¸àP£8àP£8jý¸jý¸PãŸ8PãŸ8@¸@¸‘|œ8‘|œ8hÿ·hÿ·ë™8ë™8/²ù·/²ù·KÄ•8KÄ•88`ô·8`ô·Ár’8Ár’8ÿï·ÿï·°(�8°(�8šäé·šäé·Bæ‹8Bæ‹8¾ºä·¾ºä·X«ˆ8X«ˆ8Ÿß·Ÿß·x…8x…8‘Ú·‘Ú·«L‚8«L‚8†�Õ·†�Õ·¥R~8¥R~8M�зM�з9x89x8©·Ë·©·Ë·3öq83öq8¹ßÆ·¹ßÆ·Îàk8Îàk8K·K·kÜe8kÜe81X½·1X½·3é_83é_8¹¨¸·¹¨¸·GZ8GZ8Í´·Í´·ñ6T8ñ6T8hr¯·hr¯·UxN8UxN8¯ëª·¯ëª·¦ËH8¦ËH8xr¦·xr¦·:1C8:1C8š¢·š¢·+©=8+©=8“¨�·“¨�·n388n388‡X™·‡X™·KÐ28KÐ28+•·+•· €-8 €-8gá�·gá�·áB(8áB(8>ºŒ·>ºŒ·é#8é#8÷ ˆ·÷ ˆ·&8&8Ï•„·Ï•„·µþ8µþ8±˜€·±˜€·×8×8Sy·Sy·«28«28ê�q·ê�q·Lj 8Lj 8úêi·úêi·áµ8áµ8\ab·\ab·�8�8QôZ·QôZ·„ù7„ù7ì£S·ì£S·’"ð7’"ð7>pL·>pL·I[ç7I[ç7±YE·±YE·È¼Þ7ȼÞ7I`>·I`>·YGÖ7YGÖ7„7·„7·0ûÍ70ûÍ7óÄ0·óÄ0·�ØÅ7�ØÅ7+#*·+#*·qß½7qß½7èž#·èž#·¶7¶7}8·}8·pj®7pj®7ð·ð·½î¦7½î¦7�Å·�Å·+�Ÿ7+�Ÿ7-¹ ·-¹ ·Óu˜7Óu˜7Ë·Ë·¹x‘7¹x‘7Òöý¶Òöý¶ã¥Š7㥊7$•ò¶$•ò¶sýƒ7sýƒ7épç¶épç¶ÿz7ÿz7zŠÜ¶zŠÜ¶KXn7KXn7{âѶ{âѶ„b7„b7IyǶIyǶã V7ã V7þN½¶þN½¶’bJ7’bJ7åc³¶åc³¶{?7{?7¸¸©¶¸¸©¶w47w47øM ¶øM ¶Œk)7Œk)7¾#—¶¾#—¶Ý7Ý7%:޶%:޶h7h7µ‘…¶µ‘…¶ër 7ër 7fVz¶fVz¶5757ì j¶ì j¶�@ò6�@ò6'JZ¶'JZ¶Gìà6Gìà6© K¶© K¶+AÐ6+AÐ6ÉS<¶ÉS<¶�>À6�>À6–#.¶–#.¶\ä°6\ä°6R{ ¶R{ ¶B2¢6B2¢6›[¶›[¶Î'”6Î'”6šÅ¶šÅ¶ZĆ6ZĆ6¨tõµ¨tõµØt6Øt6�tÞµ�tÞµWá[6Wá[6+ŒÈµ+ŒÈµ&ÿD6&ÿD6.½³µ.½³µÒf/6Òf/6Ï  µÏ  µý6ý6xs�µxs�µ–6–6¥öwµ¥öwµ¬˜ì5¬˜ì5%FWµ%FWµp�Ë5p�Ë5ÐØ8µÐØ8µ˜(­5˜(­5j±µj±µE7‘5E7‘5ßÒµßÒµ Œo5 Œo5¥€Ö´¥€Ö´ä¤A5ä¤A5�ù«´�ù«´´°5´°5X†´X†´ÀRé4ÀRé4³¸I´³¸I´ù«4ù«4™¢´™¢´am4am4RëÁ³RëÁ³vh4vh4ój³ój³ïö©3ïö©3äð²äð²´¿3´¿3~-²~-²vj2vj2¾š°¾š°././@LongLink0000644000000000000000000000015500000000000011604 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/BinauralDecoder/Source/EQ/AKG-K1000-Open.wavIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/BinauralDecoder/Source/EQ/AKG-K1000-0000664002537200253720000004013015257173642030510 0ustar zmoelnigzmoelnigRIFFP@WAVEfmt €»Ü factPEAKßc Y#GN?#GN?data@#GN?#GN?@©$½@©$½�7ß=�7ß=ºšH½ºšH½,E�¾,E�¾†äh¼†äh¼ðœ=ðœ=^¬É=^¬É=$žØ;$žØ;J>î¼J>î¼É Á½É Á½‹Qô;‹Qô;™Ð¦=™Ð¦=‘Ñ=‘Ñ=R–=R–= ˜¶< ˜¶<"ͨ¼"ͨ¼,®¼,®¼¯Uñ»¯Uñ»ÿI©»ÿI©»Ÿ-¼Ÿ-¼c‹Ô¼c‹Ô¼ù| ½ù| ½…8Ù¼…8Ù¼Q ó»Q ó»ë3><ë3><*‚³<*‚³<¨•<¨•<‡-·;‡-·;U7лU7л¬2¼¬2¼È�ý»È�ý»ëpáºëpáºI.I:I.I:,^,»,^,»â¼â¼{Ô;¼{Ô;¼e¼e¼=§|»=§|»£‚:£‚:~Á;~Á;I ô¹I ô¹$Yu»$Yu»)ë§»)ë§»­y|»­y|»Yó±ºYó±ºc6é9c6é9>C:>C:Ô7Ô7t¹ºt¹ºôȹôȹºøà9ºøà9y¸˜:y¸˜:h'®:h'®:@"l:@"l:î%Á9î%Á9¡ …9¡ …9Œ8:Œ8:³E¾:³E¾:{Ö;{Ö;_(;_(;­Æ:­Æ:ü8w:ü8w:°÷:°÷:–i :–i :fX:fX:ùŒ:ùŒ:ü9ü9 G©9 G©9‡—9‡—9MMä9MMä96v7:6v7:"}:"}:ªŒ’:ªŒ’:ÄV’:ÄV’:tÿƒ:tÿƒ:Ûd:Ûd:N:N:VL:VL:“ÞZ:“ÞZ:¸£j:¸£j:¥Ùr:¥Ùr:¢x:¢x:À��:À��:ì`�:ì`�:­Zž:­Zž:`«:`«:X­:X­:G¦:G¦:mÛ™:mÛ™:Ê–‘:Ê–‘:9£‘:9£‘:U–:U–:’V›:’V›: &œ: &œ:&ö˜:&ö˜:g–:g–:A·—:A·—:X4ž:X4ž:g§:g§:°M­:°M­:"¯:"¯:ÄS­:ÄS­:àÝ«:àÝ«:¢¬:¢¬: °: °:~!µ:~!µ:£Å¹:£Å¹:ܼ:ܼ:ù½¾:ù½¾:T-¿:T-¿:H@¿:H@¿:kZ¿:kZ¿:º¿:º¿:6*¾:6*¾:s�¼:s�¼:½7º:½7º:㬸:㬸:'Q¸:'Q¸: Õ¸: Õ¸:”D¹:”D¹:7¹:7¹:t ¸:t ¸:Ô“·:Ô“·:/æ·:/æ·:»ä¸:»ä¸:³¹:³¹:GLº:GLº:ᵺ:ᵺ:pÁ»:pÁ»:”Œ½:”Œ½:‚¹¿:‚¹¿:˜UÁ:˜UÁ:$+Â:$+Â:˜Â:˜Â:ÜÁ:ÜÁ: Â: Â:·¿Â:·¿Â:¦PÃ:¦PÃ:IåÃ:IåÃ:9 Ä:9 Ä:Œ9Æ:Œ9Æ:ž~È:ž~È:jË:jË:ÜÍ:ÜÍ:š�Î:š�Î:ë“Ï:ë“Ï:¤ÅÐ:¤ÅÐ:IÒ:IÒ:•NÔ:•NÔ:h†Ö:h†Ö:.½Ø:.½Ø:~wÚ:~wÚ:{øÛ:{øÛ:£YÝ:£YÝ:lß:lß: á: á: Óâ: Óâ:‘ßã:‘ßã:`Nä:`Nä:Ä`ä:Ä`ä:¯éä:¯éä: êå: êå:>Fç:>Fç:/rè:/rè:DHé:DHé:�²é:�²é:Ëê:Ëê:]%ê:]%ê:õSê:õSê:­dê:­dê:Ôyê:Ôyê:æ`ê:æ`ê:¼8ê:¼8ê:ŸÞé:ŸÞé:™‘é:™‘é:Oé:Oé:–Zé:–Zé:Bué:Bué:`’é:`’é:>Dé:>Dé:Ä–è:Ä–è:ž™ç:ž™ç:±¯æ:±¯æ:‚µå:‚µå:j¿ä:j¿ä:åmã:åmã:�õá:�õá:ïtà:ïtà:¥4ß:¥4ß:¾Þ:¾Þ:çÖÜ:çÖÜ:¼MÛ:¼MÛ:�Ù:�Ù:hÏ×:hÏ×:¹4Ö:¹4Ö:­­Ô:­­Ô:ÍEÓ:ÍEÓ:@³Ñ:@³Ñ:–Ð:–Ð:©OÎ:©OÎ:yºÌ:yºÌ:ãHË:ãHË:ï%Ê:ï%Ê:ïÉ:ïÉ:¼ÁÇ:¼ÁÇ:{5Æ:{5Æ:˜�Ä:˜�Ä: Ã: Ã:wÑÁ:wÑÁ:t¬À:t¬À:`Œ¿:`Œ¿:Í0¾:Í0¾:V¼:V¼:¦K»:¦K»:¯º:¯º:w ¹:w ¹:¢¸:¢¸:_ ·:_ ·:Þâµ:Þâµ:¿˜´:¿˜´:ñl³:ñl³:E²:E²:æ7±:æ7±:— °:— °:kØ®:kØ®:øn­:øn­:ݬ:ݬ:Éyª:Éyª:"©:"©:µ§:µ§:Zˆ¦:Zˆ¦:M¥:M¥:÷¤:÷¤:ï‚¢:ï‚¢:£ð :£ð :_QŸ:_QŸ:ÂÛ�:ÂÛ�:ºcœ:ºcœ:S÷š:S÷š:›\™:›\™:"·—:"·—:hö•:hö•:ÿJ”:ÿJ”:e’’:e’’:1æ�:1æ�:ù�:ù�:u9�:u9�:€D‹:€D‹:a‰:a‰:ñt‡:ñt‡:^ …:^ …:εƒ:εƒ:ÿÕ�:ÿÕ�:ŸÁ:ŸÁ:j|:j|:P>W:>>W:âÁS:âÁS:UP:UP:¢ÐL:¢ÐL:Ç�I:Ç�I:·MF:·MF:Ô1C:Ô1C:»ç?:»ç?:¦°<:¦°<:%_9:%_9:éM6:éM6:çE3:çE3:r‡0:r‡0:¢¶-:¢¶-:%+:%+:r%(:r%(:ƒf%:ƒf%:õ™":õ™":0 :0 :!w:!w:Ù:Ù:¿—:¿—: 8: 8:¤¹:¤¹:×f:×f:^ :^ :bï :bï :ï¾ :ï¾ :0¢:0¢:@K:@K:ñ:ñ:¹¦:¹¦:ÿ9ÿ9¸´ú9¸´ú9s®ö9s®ö9}Qò9}Qò9Òî9Òî9:¡é9:¡é9¬ƒå9¬ƒå9eUá9eUá9ä€Ý9ä€Ý9(oÙ9(oÙ9‡‹Õ9‡‹Õ9ÄKÑ9ÄKÑ9AÍ9AÍ9%ðÈ9%ðÈ9³ØÄ9³ØÄ9£ƒÀ9£ƒÀ9õw¼9õw¼9C¸9C¸9Ëq´9Ëq´9É~°9É~°9 Ö¬9 Ö¬9\è¨9\è¨9ì'¥9ì'¥9C ¡9C ¡9í�9í�9Ré˜9Ré˜9“û”9“û”9Îá�9Îá�9Æ�9Æ�9Ìæˆ9Ìæˆ9½Þ„9½Þ„9³‡€9³‡€9‘ùx9‘ùx9² p9² p9háh9háh9¤~`9¤~`9…^X9…^X9®œO9®œO9jG9jG9ñö>9ñö>9ÞE79ÞE79Ì6/9Ì6/9b£'9b£'9²y9²y9j©9j©9ÏN9ÏN9©p9©p9E&þ8E&þ8­mî8­mî8�³Ý8�³Ý8éòÍ8éòÍ8Óg½8Óg½8Ë®8Ë®8çž8çž8u�8u�8ö,~8ö,~8Ú«_8Ú«_8/Ô>8/Ô>8¾·8¾·8>ªý7>ªý7«hÀ7«hÀ7Zò7Zò7¸T7¸T7šæ)5šæ)5sôѶsôѶOeb·Oeb·kÛ©·kÛ©·›Ñæ·›Ñæ·=1¸=1¸Ì¦.¸Ì¦.¸›zJ¸›zJ¸) g¸) g¸M�¸M�¸jÇ�¸jÇ�¸3�¸3�¸?0«¸?0«¸G®·¸G®·¸p´Ä¸p´Ä¸ÞŸÐ¸ÞŸÐ¸|›Ý¸|›Ý¸ò´é¸ò´é¸¼ö¸¼ö¸îO¹îO¹{–¹{–¹æ< ¹æ< ¹]7¹]7¹ ’¹ ’¹šO¹šO¹C|#¹C|#¹« )¹« )¹¢ .¹¢ .¹ b3¹ b3¹T#8¹T#8¹ÎH=¹ÎH=¹ÂãA¹ÂãA¹°ìF¹°ìF¹)iK¹)iK¹CP¹CP¹h�T¹h�T¹‹Y¹‹Y¹+]¹+]¹ �a¹ �a¹f~e¹f~e¹õºi¹õºi¹0]m¹0]m¹.eq¹.eq¹Êìt¹Êìt¹Þðx¹Þðx¹Ïˆ|¹Ïˆ|¹O€¹O€¹û‚¹û‚¹,„¹,„¹¬£…¹¬£…¹Þr‡¹Þr‡¹Ô‰¹Ô‰¹;ÞŠ¹;ÞŠ¹ÕzŒ¹ÕzŒ¹®L޹®L޹`Ô�¹`Ô�¹[‘‘¹[‘‘¹ï“¹ï“¹˜ï”¹˜ï”¹-’–¹-’–¹…k˜¹…k˜¹|õ™¹|õ™¹î¨›¹î¨›¹Z�¹Z�¹ Íž¹ Íž¹ÅJ ¹ÅJ ¹»¢¹»¢¹áˆ£¹áˆ£¹D¥¹D¥¹eƦ¹eƦ¹®Š¨¹®Š¨¹Óª¹Óª¹Ö׫¹Ö׫¹ÁV­¹ÁV­¹t¯¹t¯¹Àt°¹Àt°¹²¹²¹í€³¹í€³¹c$µ¹c$µ¹'‹¶¹'‹¶¹£(¸¹£(¸¹½ƒ¹¹½ƒ¹¹K»¹K»¹d¼¹d¼¹Hî½¹Hî½¹M7¿¹M7¿¹‰³À¹‰³À¹àëÁ¹àëÁ¹ûXùûXùy‡Ä¹y‡Ä¹�òŹ�òŹ\"ǹ\"ǹ&�ȹ&�ȹߵɹߵɹ9 ˹9 ˹�̹�̹±Q͹±Q͹±Hι±Hι¯{Ϲ¯{Ϲ¢tй¢tй|§Ñ¹|§Ñ¹ã•Ò¹ã•Ò¹ª´Ó¹ª´Ó¹�Ô¹�ԹСչСչzÖ¹zÖ¹^�×¹^�×¹t\عt\عçWÙ¹çWÙ¹ Ú¹ Ú¹­äÚ¹­äÚ¹ü†Û¹ü†Û¹jܹjܹXݹXݹôݹôݹ݉޹݉޹êMß¹êMß¹–Îß¹–Îß¹‰à¹‰à¹:á¹:á¹Ûºá¹Ûºá¹M)â¹M)â¹ Éâ¹ É⹘&㹘&ã¹r¿ã¹r¿ã¹‡乇ä¹2¼ä¹2¼ä¹®å¹®å¹®å¹®å¹ðÿå¹ðÿ幊湊æ¹z׿¹z׿¹Ô]ç¹Ô]ç¹|¤ç¹|¤ç¹±!è¹±!è¹D_è¹D_è¹'Õè¹'Õè¹É é¹É é¹&€é¹&€é¹J·é¹J·é¹½+ê¹½+ê¹Ceê¹Ceê¹cØê¹cØê¹ ë¹ ë¹oyë¹oyë¹1©ë¹1©ë¹Fì¹Fì¹5>ì¹5>ì¹Øžì¹Øžì¹Àì¹Àì¹]í¹]í¹AAí¹AAí¹n¥í¹n¥í¹nÍí¹nÍí¹N+î¹N+î¹ÚFî¹ÚFî¹x—î¹x—î¹éúî¹éúî¹Rï¹Rï¹ß_ï¹ß_ï¹}pï¹}pï¹�·ï¹�·ï¹Áï¹Áï¹Lð¹Lð¹~ð¹~ð¹ødð¹ødð¹Êxð¹Êxð¹ÙÂð¹ÙÂð¹$Éð¹$Éð¹gñ¹gñ¹&üð¹&üð¹Ô1ñ¹Ô1ñ¹l0ñ¹l0ñ¹£kñ¹£kñ¹¯hñ¹¯hñ¹T›ñ¹T›ñ¹��ñ¹��ñ¹U¹ñ¹U¹ñ¹«ñ¹«ñ¹ÂÖñ¹ÂÖñ¹ºÃñ¹ºÃñ¹cæñ¹cæñ¹<Èñ¹<Èñ¹¶áñ¹¶áñ¹×½ñ¹×½ñ¹ÆÒñ¹ÆÒñ¹ «ñ¹ «ñ¹~»ñ¹~»ñ¹ÀŒñ¹ÀŒñ¹�”ñ¹�”ñ¹­]ñ¹­]ñ¹¶_ñ¹¶_ñ¹H%ñ¹H%ñ¹#ñ¹#ñ¹Üàð¹Üàð¹ŒÓð¹ŒÓð¹j†ð¹j†ð¹éqð¹éqð¹L!ð¹L!ð¹× ð¹× 𹊲﹊²ï¹ö�ï¹ö�ï¹o-ï¹o-ï¹Éï¹Éï¹+›î¹+›î¹kî¹kî¹Çùí¹Çùí¹h½í¹h½í¹ÿAí¹ÿAí¹jí¹jí¹áƒì¹áƒì¹ @ì¹ @ì¹g¼ë¹g¼ë¹{më¹{më¹DÞê¹DÞê¹�‡ê¹�‡ê¹©ô鹩ôé¹²›é¹²›é¹êé¹êé¹0¨è¹0¨è¹” è¹” è¹P©ç¹P©ç¹Nç¹Nç¹®Ÿæ¹®Ÿæ¹•ù幕ùå¹I‹å¹I‹å¹Þä¹Þ乬f乬fä¹…®ã¹…®ã¹Î+ã¹Î+ã¹áiâ¹áiâ¹;àá¹;àá¹#á¹#á¹@Žà¹@Žà¹ Æß¹ Æß¹6ß¹6ß¹ggÞ¹ggÞ¹ÇÎݹÇÎݹyöܹyöܹìUܹìUܹÅxÛ¹ÅxÛ¹”ÕÚ¹”ÕÚ¹˜õÙ¹˜õÙ¹LÙ¹LÙ¹XcعXcعf±×¹f±×¹.ÂÖ¹.ÂÖ¹þ Ö¹þ Ö¹NÕ¹NÕ¹§[Ô¹§[Ô¹Ú_Ó¹Ú_Ó¹¾›Ò¹¾›Ò¹k™Ñ¹k™Ñ¹žÎйžÎйÓÅϹÓÅϹoõιoõι–è͹–è͹¶͹¶͹�̹�̹Ù,˹Ù,˹|ʹ|ʹE6ɹE6ɹ¸ȹ¸ȹ9ǹ9ǹCƹCƹ§2ʧ2Źæ Ĺæ ĹÁùÁù¤ðÁ¹¤ðÁ¹”þÀ¹”þÀ¹#п¹#п¹)Ù¾¹)Ù¾¹Å¢½¹Å¢½¹)£¼¹)£¼¹qf»¹qf»¹Qeº¹Qeº¹Â)¹¹Â)¹¹œ'¸¹œ'¸¹Ôæ¶¹Ôæ¶¹¾Ûµ¹¾Ûµ¹I‘´¹I‘´¹p³¹p³¹F1²¹F1²¹±¹±¹K̯¹K̯¹v³®¹v³®¹“\­¹“\­¹j>¬¹j>¬¹Ò㪹Ò㪹5é¹5鹓e¨¹“e¨¹¥?§¹¥?§¹êÚ¥¹êÚ¥¹K®¤¹K®¤¹lE£¹lE£¹*¢¹*¢¹«­ ¹«­ ¹1~Ÿ¹1~Ÿ¹åž¹åž¹ßœ¹ßœ¹_o›¹_o›¹X9š¹X9š¹.ǘ¹.ǘ¹xŽ—¹xŽ—¹Ã–¹Ã–¹¾Û”¹¾Û”¹Da“¹Da“¹w ’¹w ’¹Z¤�¹Z¤�¹–c�¹–c�¹%è�¹%è�¹c§Œ¹c§Œ¹m*‹¹m*‹¹ææ‰¹ææ‰¹hfˆ¹hfˆ¹Æ‡¹Æ‡¹×�…¹×�…¹‚W„¹‚W„¹†Ö‚¹†Ö‚¹ª��¹ª��¹Á €¹Á €¹B‚}¹B‚}¹êuz¹êuz¹háw¹háw¹6Øt¹6Øt¹$Dr¹$Dr¹¾6o¹¾6o¹S�l¹S�l¹8Ži¹8Ži¹|÷f¹|÷f¹Ðëc¹Ðëc¹óTa¹óTa¹pD^¹pD^¹¬§[¹¬§[¹ä”X¹ä”X¹ûU¹ûU¹6îR¹6îR¹³XP¹³XP¹éJM¹éJM¹©°J¹©°J¹ážG¹ážG¹ºE¹ºE¹÷A¹÷A¹Bb?¹Bb?¹OW<¹OW<¹ØÁ9¹ØÁ9¹Å´6¹Å´6¹«4¹«4¹i1¹i1¹K‚.¹K‚.¹ö€+¹ö€+¹ú(¹ú(¹…ý%¹…ý%¹Ðu#¹Ðu#¹Ow ¹Ow ¹˜ñ¹˜ñ¹ú¹ú¹~~¹~~¹È�¹È�¹¹¹0-¹0-¹\º ¹\º ¹íÔ ¹íÔ ¹j¹j¹´‹¹´‹¹;%¹;%¹•H¹•H¹LÆû¸LÆû¸¼ö¸¼ö¸ÐNñ¸ÐNñ¸@ªë¸@ªë¸Qþæ¸Qþæ¸~oá¸~oá¸ûÔܸûÔܸ:P׸:P׸J¼Ò¸J¼Ò¸î?͸î?͸¶È¸¶È¸ßDøßDøpž¸pž¸…\¹¸…\¹¸…è´¸…è´¸%‘¯¸%‘¯¸B3«¸B3«¸”ò¥¸”ò¥¸h¦¡¸h¦¡¸rqœ¸rqœ¸0/˜¸0/˜¸½“¸½“¸åÐŽ¸åÐŽ¸Ì´‰¸Ì´‰¸IŒ…¸IŒ…¸ýz€¸ýz€¸À¹x¸À¹x¸W®n¸W®n¸cŒf¸cŒf¸JŸ\¸JŸ\¸XžT¸XžT¸·ÌJ¸·ÌJ¸ÞB¸ÞB¸ñ9¸ñ9¸’01¸’01¸Ì{'¸Ì{'¸b·¸b·¸Z-¸Z-¸‘¸‘¸ˆ ¸ˆ ¸æ"û·æ"û·�bè·�bè·Ž„Ù·Ž„Ù·¥ Ç·¥ Ç·pœ¸·pœ¸·®p¦·®p¦·$˜·$˜· è…· è…·¿Go·¿Go·¡K·¡K·ø»/·ø»/·ù– ·ù– ·5ûá¶5ûá¶áœ¶áœ¶U_J¶U_J¶ÿ¹~µÿ¹~µX~05X~05’‘46’‘46r�6r�6f\Ò6f\Ò6¯87¯87sŒ$7sŒ$77,>77,>7cö^7cö^7“x7“x7Q$Œ7Q$Œ7Gr˜7Gr˜7Ê`¨7Ê`¨7Ñx´7Ñx´7"6Ä7"6Ä7ñ&Ð7ñ&Ð7ÇÅß7ÇÅß7é”ë7é”ë71û71û7;L8;L8„ç 8„ç 8×™8×™8-"8-"8ZÂ8ZÂ8q3%8q3%8à·*8à·*8™ 28™ 284z784z78À¿>8À¿>8a D8a D8¢WK8¢WK8²¥P8²¥P8#ÆW8#ÆW8¾ú\8¾ú\8Ød8Ød8@i8@i8| p8| p8u8u8èï{8èï{8hw€8hw€8Bäƒ8Bäƒ8ø\†8ø\†8—¿‰8—¿‰8x,Œ8x,Œ8+„�8+„�8‹æ‘8‹æ‘8P3•8P3•8}Š—8}Š—8³Ëš8³Ëš8õ�8õ�8ðS 8ðS 8õœ¢8õœ¢8µÔ¥8µÔ¥8î¨8î¨8ÐG«8ÐG«8)€­8)€­8 ¢°8 ¢°8CͲ8CͲ8ãµ8ãµ8­¸8­¸8à »8à »8­½8­½8=À8=À8#"Â8#"Â8ÄÅ8ÄÅ8ÅÇ8ÅÇ8ýÉ8ýÉ8ßîË8ßîË8VÌÎ8VÌÎ8ñ²Ð8ñ²Ð8…ƒÓ8…ƒÓ8Ð[Õ8Ð[Õ8™Ø8™Ø8éÙ8éÙ8…¡Ü8…¡Ü80fÞ80fÞ8èá8èá8÷Ôâ8÷Ôâ8Ãyå8Ãyå8Î$ç8Î$ç8'ºé8'ºé8ñZë8ñZë8œëí8œëí8œˆï8œˆï8Êò8Êò8x¢ó8x¢ó8eö8eö8.¢÷8.¢÷8&ú8&ú8—û8—û8!þ8!þ8P~ÿ8P~ÿ8Âð9Âð9�¦9�¦9ÐÒ9ÐÒ96„96„9]¬9]¬9MY9MY9¾|9¾|9û$9û$9D9D9Õç9Õç9Y 9Y 9œ¡ 9œ¡ 9À· 9À· 9ƒR 9ƒR 9hc 9hc 9ì÷ 9ì÷ 9€9€9¸‘9¸‘9^˜9^˜9¬#9¬#9%9%9—©9—©9¤9¤9$#9$#9®9®9ø”9ø”9ކ9ކ9"û9"û9™å9™å9êS9êS9¾99¾99€¤9€¤9S†9S†9´ë9´ë9Ç9Ç9r%9r%9"ú9"ú9¤R9¤R9A"9A"9 v9 v9°@9°@9ÃŽ9ÃŽ9ÛS 9ÛS 9E� 9E� 9´^!9´^!9b¤!9b¤!9Ã`"9Ã`"9§Ÿ"9§Ÿ"9„T#9„T#9³Œ#9³Œ#9o<$9o<$94p$94p$9H%9H%91I%91I%9œí%9œí%9i&9i&9Õ´&9Õ´&9_Ø&9_Ø&9Ês'9Ês'9:’'9:’'9C'(9C'(9—>(9—>(9VÌ(9VÌ(9Ý(9Ý(96e)96e)9äp)9äp)9Mô)9Mô)9Õú)9Õú)9™x*9™x*9Hy*9Hy*9°ñ*9°ñ*9rí*9rí*9Ã`+9Ã`+9hV+9hV+9^Â+9^Â+9B°+9B°+9Ñ,9Ñ,9õþ+9õþ+9‚`,9‚`,9ñD,9ñD,9S ,9S ,9Ú},9Ú},9 Ó,9 Ó,9>«,9>«,9”û,9”û,9„Î,9„Î,9®-9®-9«ä,9«ä,9¨'-9¨'-9Žì,9Žì,9w)-9w)-9Õé,9Õé,9v#-9v#-9’à,9’à,9Å-9Å-9ÐÌ,9ÐÌ,9iû,9iû,9“¬,9“¬,9šÖ,9šÖ,9äƒ,9äƒ,9Ô©,9Ô©,9óQ,9óQ,9íq,9íq,9þ,9þ,9©.,9©.,9?Ì+9?Ì+9³â+9³â+9f{+9f{+9Œ+9Œ+9W+9W+9)+9)+9.¶*9.¶*9м*9м*9ƒE*9ƒE*9bG*9bG*9’Ë)9’Ë)9ØÈ)9ØÈ)9êH)9êH)9ŠB)9ŠB)9¸¾(9¸¾(9ʳ(9ʳ(9¨*(9¨*(9j(9j(9ÜŒ'9ÜŒ'9y'9y'9Wé&9Wé&9µÒ&9µÒ&9–=&9–=&9!&9!&9}†%9}†%9Ðe%9Ðe%9 È$9 È$9ë£$9ë£$9‚$9‚$90Ø#90Ø#9À0#9À0#9U#9U#9©X"9©X"9&("9&("9¹y!9¹y!9 D!9 D!9ë� 9ë� 9ØV 9ØV 9Ÿ9Ÿ9áa9áa9D§9D§9g9g9©9©99e99e9q£9q£9÷[9÷[9~–9~–9¸K9¸K9Nƒ9Nƒ9š59š59j9j9Å9Å9]I9]I9êô9êô9ò"9ò"9KÌ9KÌ9ñ÷9ñ÷9dž9dž9¸Æ9¸Æ9'j9'j9ñ�9ñ�9V19V19;U9;U9¡ô9¡ô999Û²9Û²9°Ñ9°Ñ9 l9 l9¦ˆ9¦ˆ9ÿ 9ÿ 9–; 9–; 9=Ò 9=Ò 9Në 9Në 9d€ 9d€ 9¶— 9¶— 9î* 9î* 90@ 90@ 9„Ñ9„Ñ9çä9çä9lt9lt9†9†9ž9ž9#9#9÷®9÷®9D½9D½9¥H9¥H9¥V9¥V93á93á9Oí9Oí9vu9vu9¦þþ8¦þþ8N þ8N þ8õü8õü8Ë+û8Ë+û8Š<ù8Š<ù8ÖFø8ÖFø8EUö8EUö8p^õ8p^õ8/ló8/ló8!tò8!tò8nð8nð8Єï8Єï8UŽí8UŽí8ù’ì8ù’ì8…›ê8…›ê8%žé8%žé8…£ç8…£ç8n£æ8n£æ8§ä8§ä8|§ã8|§ã8¶«á8¶«á8 «à8 «à8…­Þ8…­Þ8-«Ý8-«Ý8p¬Û8p¬Û8ЩÚ8ЩÚ8A«Ø8A«Ø8â¨×8â¨×8 ªÕ8 ªÕ8ž¦Ô8ž¦Ô8µ¥Ò8µ¥Ò8? Ñ8? Ñ8ë�Ï8ë�Ï8Š˜Î8Š˜Î8e—Ì8e—Ì8N“Ë8N“Ë8—’É8—’É8ŽÈ8ŽÈ80ŒÆ80ŒÆ8‡Å8‡Å8E…Ã8E…Ã8Ç€Â8Ç€Â8hÀ8hÀ8Ëz¿8Ëz¿8Æx½8Æx½8t¼8t¼8Örº8Örº8p¹8p¹8q·8q·8ëo¶8ëo¶8øp´8øp´8·n³8·n³8,n±8,n±85k°85k°8›k®8›k®8Ÿk­8Ÿk­8:o«8:o«8uqª8uqª8Óu¨8Óu¨8—x§8—x§8Ô~¥8Ô~¥8V…¤8V…¤8T�¢8T�¢8r˜¡8r˜¡8j£Ÿ8j£Ÿ8­ž8­ž8a¹œ8a¹œ8ûÅ›8ûÅ›8Ö™8Ö™8¼æ˜8¼æ˜8–ú–8–ú–8²–8²–8Q%”8Q%”8<“8<“8U‘8U‘8|n�8|n�8~ŠŽ8~ŠŽ8ô¦�8ô¦�8´Å‹8´Å‹8kåŠ8kåŠ8 ‰8 ‰8³,ˆ8³,ˆ8]T†8]T†8"}…8"}…8†§ƒ8†§ƒ8žÒ‚8žÒ‚8§ÿ€8§ÿ€8´.€8´.€8Á|8Á|8Ä({8Ä({8æ“w8æ“w8kv8kv8«qr8«qr8yæp8yæp8<`m8<`m8^ßk8^ßk8ñah8ñah8<èf8<èf8§pc8§pc8šýa8šýa8–�^8–�^8/#]8/#]8"¼Y8"¼Y8×ZX8×ZX8ÖûT8ÖûT8¢S8¢S8%JP8%JP8…øN8…øN8�©K8�©K8DaJ8DaJ8QG8QG8ÙE8ÙE8ð˜B8ð˜B8Ø_A8Ø_A8)>8)>8Lú<8Lú<8Í98Í98e§88e§88‰‚58‰‚58™e48™e48QJ18QJ18u808u808�(-8�(-8Í!,8Í!,8ä)8ä)8R(8R(8 %8 %8Ã"$8Ã"$80,!80,!8Ã@ 8Ã@ 8fV8fV8Cv8Cv8U•8U•8P¾8P¾8bç8bç888JQ8JQ8c‘8c‘8jÏ8jÏ8“8“8Ò^ 8Ò^ 8~³ 8~³ 8ƒ 8ƒ 8ôl8ôl8ÓÎ8ÓÎ8‡;8‡;8t¥8t¥8ô8ô8é"ý7é"ý7!)ü7!)ü7*÷7*÷76Bö76Bö73Sñ73Sñ7Õ~ð7Õ~ð7–§ë7–§ë7Úîê7Úîê7S1æ7S1æ7hŽå7hŽå7Æâà7Æâà7-Qà7-Qà7×·Û7×·Û7¼;Û7¼;Û7y¸Ö7y¸Ö7ASÖ7ASÖ7ÆæÑ7ÆæÑ7+™Ñ7+™Ñ7ËCÍ7ËCÍ7D Í7D Í7èÌÈ7èÌÈ7YªÈ7YªÈ7:}Ä7:}Ä7 oÄ7 oÄ7êVÀ7êVÀ7<`À7<`À7`¼7`¼7Ö�¼7Ö�¼7ñ˜¸7ñ˜¸7óи7óи7ˆü´7ˆü´7Jµ7Jµ7«‹±7«‹±74ð±74ð±7�G®7�G®7þ¿®7þ¿®7(«7(«7›±«7›±«7Ü+¨7Ü+¨7§Ê¨7§Ê¨7u\¥7u\¥7•¦7•¦7Ô¾¢7Ô¾¢7�Ž£7�Ž£7ÝL 7ÝL 7¼.¡7¼.¡7äþ�7äþ�7`õž7`õž73Ü›73Ü›7Zêœ7Zêœ7 å™7 å™7#›7#›7˜7˜7$B™7$B™7jd–7jd–7B°—7B°—7|ç”7|ç”7ÑD–7ÑD–74‹“74‹“7)ù”7)ù”7 Q’7 Q’7nÑ“7nÑ“7i:‘7i:‘7ÃË’7ÃË’7F�7F�7Ôê‘7Ôê‘7Èx�7Èx�7q1‘7q1‘7·ÐŽ7·ÐŽ7à™�7à™�7¶IŽ7¶IŽ7à$�7à$�7æ�7æ�77Ñ�77Ñ�7TŸ�7TŸ�7*˜�7*˜�7¾u�7¾u�7Y��7Y��7‡r�7‡r�7:‘�7:‘�7“�7“�7ÙÁ�7ÙÁ�7ÍÒ�7ÍÒ�7*�7*�7õ3Ž7õ3Ž74…�74…�7[¸Ž7[¸Ž7G‘7G‘7ä[�7ä[�7\Ì‘7\Ì‘7�7�7vŸ’7vŸ’7¨‘7¨‘7Ö“7Ö“7h’7h’7ª”7ª”7c)“7c)“7ÐÚ•7ÐÚ•7»i”7»i”7%+—7%+—7hÉ•7hÉ•7Ž›˜7Ž›˜7ºJ—7ºJ—7·-š7·-š7 ì˜7 ì˜7~Þ›7~Þ›7Ä«š7Ä«š7N®�7N®�7"‹œ7"‹œ7�Ÿ7�Ÿ777¨¡7¨¡7ž  7ž  7�Ï£7�Ï£7lÖ¢7lÖ¢7¸¦7¸¦72(¥72(¥76t¨76t¨7U—§7U—§7°òª7°òª7b#ª7b#ª7]‹­7]‹­79Ȭ79Ȭ7ü>°7ü>°7$Œ¯7$Œ¯7­³7­³7zq²7zq²7r¶7r¶7Ìoµ7Ìoµ7º¹7º¹7̈¸7̈¸7ÿ:¼7ÿ:¼7¿»7¿»7ô}¿7ô}¿7 ¿7 ¿7ÕÕÂ7ÕÕÂ7ËnÂ7ËnÂ7ìEÆ7ìEÆ7QïÅ7QïÅ7ˆØÉ7ˆØÉ7Š‘É7Š‘É7ö†Í7ö†Í7óGÍ7óGÍ7FÑ7FÑ7ùÑ7ùÑ7ºÕ7ºÕ7aúÔ7aúÔ7¡Ù7¡Ù7×þØ7×þØ7'Ý7'Ý72Ý72Ý7åQá7åQá7†Uá7†Uá7ì›å7ì›å7 ¬å7 ¬å7Ëüé7Ëüé7”ê7”ê7qî7qî7Å–î7Å–î7Kó7Kó7Ã7ó7Ã7ó7K²÷7K²÷7¢ô÷7¢ô÷7ä{ü7ä{ü7Ëü7Ëü7y°8y°8ôÞ8ôÞ8›08›08¦d8¦d8¸»8¸»8tõ8tõ8†S8†S8Ê”8Ê”8ðú 8ðú 8>C 8>C 8ü¯ 8ü¯ 8#þ 8#þ 8q8q8�Å8�Å8@?8@?8š8š8<8<8{8{8Ì8Ì8(i8(i8òö8òö8Ùd8Ùd8#ù8#ù8çl8çl8k"8k"80�"80�"8N"%8N"%8‹¢%8‹¢%8rJ(8rJ(8æÐ(8æÐ(8ã~+8ã~+8¹ ,8¹ ,8r¾.8r¾.8:P/8:P/8 28 28¤28¤28úe58úe58–68–68�Ë88�Ë88þn98þn986<<86<<8væ<8væ<8²º?8²º?8Gj@8Gj@8…BC8…BC8KõC8KõC8EÒF8EÒF8I‹G8I‹G8ôoJ8ôoJ8ø/K8ø/K8·N8·N8±ßN8±ßN8ÐQ8ÐQ8›R8›R8<’U8<’U8DcV8DcV8æ_Y8æ_Y8~5Z8~5Z87]87]8ß^8ß^8Èa8Èa8äúa8äúa8ëe8ëe8œîe8œîe8ºi8ºi8>êi8>êi8¥m8¥m8dñm8dñm8£q8£q8 r8 r8B(u8B(u8§!v8§!v8�Iy8�Iy85Hz85Hz8v}8v}8Öy~8Öy~8EÖ€8EÖ€8#Z�8#Z�8§õ‚8§õ‚8¾{ƒ8¾{ƒ8Ë…8Ë…8W¢…8W¢…8 C‡8 C‡8ü͇8ü͇85q‰85q‰8Zþ‰8Zþ‰8Æ£‹8Æ£‹8×2Œ8×2Œ8sÚ�8sÚ�8ËkŽ8ËkŽ8 �8 �8Ä©�8Ä©�8@V’8@V’8Ïë’8Ïë’8‹š”8‹š”8g2•8g2•8€ã–8€ã–8}—8}—8»/™8»/™8ÄÊ™8ÄÊ™8ƒ›8ƒ›8àœ8àœ8#Ô�8#Ô�8„sž8„sž8Ÿ, 8Ÿ, 8¦Í 8¦Í 8Ĉ¢8Ĉ¢8¼+£8¼+£8ùè¤8ùè¤8¯�¥8¯�¥8¯L§8¯L§8óò§8óò§8ó©8ó©8Í[ª8Í[ª8œ¬8œ¬8PȬ8PȬ8¶Œ®8¶Œ®8‘7¯8‘7¯8Sý°8Sý°8œ©±8œ©±8Cq³8Cq³8Q´8Q´8²èµ8²èµ8÷—¶8÷—¶8œb¸8œb¸8¹8¹8Uߺ8Uߺ8b‘»8b‘»8S_½8S_½8‰¾8‰¾8�á¿8�á¿8¬•À8¬•À8fÂ8fÂ8•Ã8•Ã8 íÄ8 íÄ8ƒ¤Å8ƒ¤Å8úwÇ8úwÇ80È80È8’Ê8’Ê8 ½Ê8 ½Ê8"’Ì8"’Ì8úJÍ8úJÍ8Û Ï8Û Ï8ÒÚÏ8ÒÚÏ8#²Ñ8#²Ñ8mÒ8mÒ8AEÔ8AEÔ8 Õ8 Õ8WÙÖ8WÙÖ8*•×8*•×8‘nÙ8‘nÙ8³*Ú8³*Ú8®Ü8®Ü8&ÀÜ8&ÀÜ8R˜Þ8R˜Þ8ÁQß8ÁQß8"(á8"(á8Êßá8Êßá8³´ã8³´ã8«jä8«jä8«=æ8«=æ8%ñæ8%ñæ8_Áè8_Áè8Ñqé8Ñqé89?ë89?ë8üìë8üìë8Ú·í8Ú·í8ûbî8ûbî8+ð8+ð8=Óð8=Óð8]˜ò8]˜ò8ˆ=ó8ˆ=ó8£ÿô8£ÿô8Á¡õ8Á¡õ8™`÷8™`÷87ÿ÷87ÿ÷8gºù8gºù8VUú8VUú8Ì ü8Ì ü8'¤ü8'¤ü8ÞWþ8ÞWþ8iëþ8iëþ8…M9…M9=•9=•9ðj9ðj9©°9©°9R„9R„9 È9 È9„™9„™9 Û9 Û9(ª9(ª9mé9mé95¶95¶9>ó9>ó9¦½9¦½9`ø9`ø9LÀ9LÀ9³ø9³ø9+¾9+¾95ô95ô9· 9· 9}ê 9}ê 9~ª 9~ª 9AÛ 9AÛ 9€˜ 9€˜ 9ÅÆ 9ÅÆ 9[� 9[� 9 ­ 9 ­ 9±d 9±d 9‰� 9‰� 9+B9+B9Nh9Nh999}=9}=9 ì9 ì9w 9w 9Ì·9Ì·97Õ97Õ9š}9š}9v˜9v˜9ø=9ø=9öU9öU9ø9ø9Ú 9Ú 9™«9™«9}½9}½9)Y9)Y9*h9*h9v9v9F 9F 9¡9¡9ë©9ë©9ˆ;9ˆ;9aA9aA9•Ï9•Ï9<Ò9<Ò9Ö\9Ö\96\96\98ã98ã9mß9mß9 c9 c9J\9J\9‹Ü9‹Ü9®Ò9®Ò9[O9[O9KB9KB9v»9v»9U«9U«9!9!9± 9± 9®9®9i9i9m×9m×9¶½9¶½9”(9”(9À 9À 9ör9ör9ÓR9ÓR9N¶9N¶9ò’9ò’9Èò9Èò91Ì91Ì9D(9D(9[þ9[þ9°V9°V9›)9›)9X~9X~9)N9)N9?Ÿ9?Ÿ9¿k9¿k9ì¸9ì¸9 ‚9 ‚9lË9lË9g‘9g‘9&×9&×9×™9×™9¡Û9¡Û9æš9æš9æØ9æØ9•9•9‡Ï9‡Ï9„ˆ9„ˆ9õ¾9õ¾9~t9~t9§9§9XY9XY9&ˆ9&ˆ9@79@79,b9,b9ö 9ö 9 59 59¬Ý9¬Ý999¢¦9¢¦9OÆ9OÆ9«h9«h9|„9|„9Ÿ#9Ÿ#9§;9§;9³×9³×9ì9ì93…93…9ø•9ø•9ù+9ù+9÷89÷89ÜË9ÜË9-Õ9-Õ9e9e9Éj9Éj9±÷9±÷9©ù9©ù9�ƒ9�ƒ9ì�9ì�9ô9ô9Ë9Ë9ø‡9ø‡9>9>9„9„95ô95ô9§r9§r9ãb9ãb9�Þ9�Þ9dË9dË9UD9UD9¡-9¡-9è£9è£9ñ‰9ñ‰9¾ý9¾ý9„à9„à9­Q9­Q91919‰Ÿ9‰Ÿ9™{9™{9¦ç9¦ç9À9À9 *9 *9šÿ9šÿ9©f9©f99999Ï�9Ï�9)m9)m9™Ï9™Ï9á›9á›9 ü 9 ü 9KÅ 9KÅ 95# 95# 9né 9né 9E 9E 9[ 9[ 9ìa 9ìa 9V" 9V" 9ëy 9ëy 9“7 9“7 93� 93� 9H 9H 9±›9±›9ÀS9ÀS9j¥9j¥9ÀZ9ÀZ9Œª9Œª9<]9<]9<«9<«9U[9U[9š§9š§9,U9,U9ÌŸ9ÌŸ9íJ9íJ9ó“9ó“9¤<9¤<9„9„9O*9O*9,p9,p999ñ°þ8ñ°þ87ôý87ôý8Bzü8Bzü8¹û8¹û8r<ú8r<ú8âvù8âvù8�÷÷8�÷÷8®-÷8®-÷8Õ«õ8Õ«õ8ÇÝô8ÇÝô8”Yó8”Yó8…‡ò8…‡ò8ñ8ñ80+ð80+ð8´¢î8´¢î8ùÈí8ùÈí8y>ì8y>ì8ú`ë8ú`ë8xÔé8xÔé8Bóè8Bóè8Ýdç8Ýdç8 €æ8 €æ8ðä8ðä8ä8ä8‘vâ8‘vâ8E‹á8E‹á8Døß8Døß8´ ß8´ ß8AuÝ8AuÝ8�ƒÜ8�ƒÜ8àíÚ8àíÚ8GùÙ8GùÙ8ŠbØ8ŠbØ8k×8k×8HÓÕ8HÓÕ8 ÙÔ8 ÙÔ8j@Ó8j@Ó8±CÒ8±CÒ8jªÐ8jªÐ8:«Ï8:«Ï8>Î8>Î8‰Í8‰Í8ßtË8ßtË8ÉpÊ8ÉpÊ8°ÕÈ8°ÕÈ8‚ÏÇ8‚ÏÇ874Æ874Æ8,Å8,Å8~�Ã8~�Ã8=†Â8=†Â8�êÀ8�êÀ8cÞ¿8cÞ¿8»B¾8»B¾8ð4½8ð4½8h™»8h™»8뉺8뉺8Œî¸8Œî¸8�Ý·8�Ý·8B¶8B¶80µ80µ8‡•³8‡•³8Å�²8Å�²8¾ç°8¾ç°8ÒÒ¯8ÒÒ¯8�9®8�9®8¤#­8¤#­8+‹«8+‹«84tª84tª8ŒÜ¨8ŒÜ¨8·Ä§8·Ä§8.¦8.¦8š¥8š¥8€£8€£8íf¢8íf¢8�Ò 8�Ò 8߸Ÿ8߸Ÿ8ç%ž8ç%ž8È �8È �8Hz›8Hz›8Û_š8Û_š8ÖϘ8ÖϘ8µ—8µ—8¡&–8¡&–8 •8 •8“8“8Kd’8Kd’8ƒÙ�8ƒÙ�8á¾�8á¾�8 6Ž8 6Ž8¥�8¥�8蔋8蔋8æzŠ8æzŠ8Zöˆ8Zöˆ8É܇8É܇8sZ†8sZ†8`A…8`A…8]Áƒ8]Áƒ8ó¨‚8ó¨‚8s+�8s+�8Û€8Û€8é1}8é1}8s{8s{8Õx8Õx8èu8èu8çür8çür8cÓp8cÓp8îm8îm8ýÆk8ýÆk8~çh8~çh8ÒÂf8ÒÂf87éc87éc8BÇa8BÇa8ô^8ô^8"Õ\8"Õ\8QZ8QZ8bìW8bìW8î%U8î%U8% S8% S8eMP8eMP88N88N87K87K8nmI8nmI8h»F8h»F8>­D8>­D8@B8@B8ð÷?8ð÷?8+T=8+T=8×M;8×M;8`±88`±88)¯68)¯68&48&48B28B28ÝŽ/8ÝŽ/8a•-8a•-8š+8š+8’)8’)8†œ&8†œ&8.¬$8.¬$86"86"8žJ 8žJ 8�Ü8�Ü8ö8ö8 �8 �8‘®8‘®8ÚP8ÚP8—t8—t8+8+8)H8)H8û 8û 8o) 8o) 8Ïä8Ïä8·8·8±Ü8±Ü8C8C8Þâ8Þâ89Dþ79Dþ7®îù7®îù7®xö7®xö7§4ò7§4ò7‘Êî7‘Êî7P˜ê7P˜ê7G:ç7G:ç7Áã7Áã7ÓÇß7ÓÇß7.¹Û7.¹Û7¯sØ7¯sØ7)wÔ7)wÔ7<>Ñ7<>Ñ7ÂSÍ7ÂSÍ7f'Ê7f'Ê7 OÆ7 OÆ7ˆ/Ã7ˆ/Ã7Œi¿7Œi¿7W¼7W¼7u£¸7u£¸7žµ7žµ7¯ü±7¯ü±7e¯7e¯7�u«7�u«7ŽŠ¨7ŽŠ¨7+¥7+¥7£0¢7£0¢7ÃÆž7ÃÆž7Ãö›7Ãö›7yŸ˜7yŸ˜7*Ý•7*Ý•7ƒ˜’7ƒ˜’7îã�7îã�7Ô±Œ7Ô±Œ7ú Š7ú Š7në†7në†7nR„7nR„7xE�7xE�7Ðt}7Ðt}7 €w7 €w7â…r7â…r7:¶l7:¶l7*Øg7*Øg7—-b7—-b7»k]7»k]7*æW7*æW7�@S7�@S7ÜßM7ÜßM7…VI7…VI7šD7šD7Ÿ­?7Ÿ­?7b–:7b–:7ÅE67ÅE67S17S17Û-7Û-7“P(7“P(7Ü8$7Ü8$7ÜŽ7ÜŽ7•“7•“7¬ 7¬ 7Ó.7Ó.7ÎÌ7ÎÌ7Y 7Y 7Ì7Ì7÷%7÷%7`þ6`þ6÷6÷6ï6ï6S9è6S9è6‹�à6‹�à6NîÙ6NîÙ60‹Ò60‹Ò6E!Ì6E!Ì6BÅ6BÅ6yѾ6yѾ6ø·6ø·6-þ±6-þ±6½h«6½h«6¦¦¥6¦¦¥6¬TŸ6¬TŸ6'Ê™6'Ê™6»“6»“6égŽ6égŽ6›ˆ6›ˆ6ú~ƒ6ú~ƒ6tç{6tç{6žr6žr6ï‡g6ï‡g6 *^6 *^6éT6éT6g$K6g$K6t�A6t�A6µ 96µ 96‚ò/6‚ò/6Æ×'6Æ×'6À<6À<6BŒ6BŒ6ík6ík6ÿ$6ÿ$6Ú}6Ú}6i?ó5i?ó5Ràä5Ràä5 ô×5 ô×5�Ê5�Ê5Sc¾5Sc¾5GÙ±5GÙ±5Zˆ¦5Zˆ¦5èãš5èãš5^�5^�5í›…5í›…5÷¾w5÷¾w5Eøc5Eøc5†R5†R5Äþ?5Äþ?5Å /5Å /5)A5)A5Ck5Ck5·´5·´58Æè48Æè4"�Î4"�Î4)û¶4)û¶4ý 4ý 4µ_‹4µ_‹4(o4(o4K»K4K»K4ÕU*4ÕU*4w½ 4w½ 4ÏÙâ3ÏÙâ3­2³3­2³3°€ˆ3°€ˆ3‡H3‡H3;‹ 3;‹ 3K±2K±2�mF2�mF2dV°1dV°1Pl¯0Pl¯0././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/BinauralDecoder/Source/EQ/Presonus-HD7.wavIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/BinauralDecoder/Source/EQ/Presonus-H0000664002537200253720000004013015257173642031343 0ustar zmoelnigzmoelnigRIFFP@WAVEfmt €»Ü factPEAKác YÞkQ?ÞkQ?data@ÞkQ?ÞkQ?è㟽è㟽ˆ Ë=ˆ Ë=ªÔ=ªÔ=Id0¾Id0¾®É¶º®É¶ºfm=fm=%ö�½%ö�½ÓNñ½ÓNñ½JÏŠ=JÏŠ=ZżZżÛ}=Û}=bï>bï> ¢ = ¢ =íE“¼íE“¼(Eļ(Eļߩ<½ß©<½gKþ¼gKþ¼C¹C¹o–.¼o–.¼Œ6”¼Œ6”¼tW:¹tW:¹¸’<¸’<*Ìø<*Ìø’]9>’]9yÒžºyÒžº�ª/º�ª/ºH8H80”60”6\=»\=»ÖR¢»ÖR¢»¸!›»¸!›»‘qº‘qºsÎU;sÎU;/€¾;/€¾;ï�};ï�};­T$9­T$9À:z»À:z»àv£»àv£» ù�» ù�»Ò»Ò»M—•ºM—•º~ŽÚ7~ŽÚ7QÏ9QÏ9%±:%±:Þ•±:Þ•±:½L“:½L“:�íá¹�íá¹+줺+줺åµÓºåµÓºK¯ç¸K¯ç¸§ ª:§ ª:(‰6;(‰6;z®(;z®(;Ç. ;Ç. ;<¨[:<¨[:_:_:ã?¸ã?¸…>…9…>…9NT´8NT´8†Q:†Q:� :� :V²;V²;1,-;1,-;“¤8;“¤8;Gnâ:Gnâ:)2‰:)2‰:�kÄ8�kÄ8hvÉ9hvÉ9Á‹!:Á‹!:3ãÑ:3ãÑ:ùjê:ùjê:Û;Û;iå:iå:BÒÚ:BÒÚ:qƒl:qƒl:ÜóK:ÜóK::ûn9:ûn9)ø:)ø:¬À+:¬À+:¿õÃ:¿õÃ:”5×:”5×:"×;"×;Á6Ì:Á6Ì:€×¾:€×¾:îæJ:îæJ:�$g:�$g:~R":~R":Ýp‘:Ýp‘:¶àŒ:¶àŒ:Ýæ×:Ýæ×:Ì[É:Ì[É:wö:wö:3e¾:3e¾:¬Â:¬Â:ó"k:ó"k:3T†:3T†:¶ÒB:¶ÒB:!Õ¡:!Õ¡:¥Bž:¥Bž:Yƒä:Yƒä:KdÌ:KdÌ:bsð:bsð:�a·:�a·:ì€Æ:ì€Æ:)ߊ:)ߊ:ž!ª:ž!ª:Àz‹:Àz‹:0vÉ:0vÉ:6�½:6�½:8ú:8ú:cyÙ:cyÙ:Ó„÷:Ó„÷:Ò½:Ò½:?AÒ:?AÒ:-›ž:-›ž:ª™Ã:ª™Ã:åk¤:åk¤:?çÙ:?çÙ:¾Â:¾Â:í?ô:í?ô:ÔÎ:ÔÎ:Άí:Άí:ÅÔ¶:ÅÔ¶:ÈÍ:ÈÍ:X š:X š:;¾:;¾:ð†œ:ð†œ:­YÍ:­YÍ:»O®:»O®:[�×:[�×:�1«:�1«:NÇ:NÇ:LÍ’:LÍ’:Ó¢­:Ó¢­:ì {:ì {:2¶¡:2¶¡:ÖWy:ÖWy:*º¨:*º¨:†:†:$}­:$}­:éY�:éY�:ÑlŸ:ÑlŸ:9×\:9×\:%Ž�:%Ž�:ǰC:ǰC:©‘‡:©‘‡:oœC:oœC:Nµ‹:Nµ‹:¶�O:¶�O:ã‘�:ã‘�:óQ:óQ:k‹:k‹:�=:�=:%“€:%“€:ed/:ed/:×e€:×e€:mÂ::mÂ::¥{ˆ:¥{ˆ:¶ H:¶ H:^í‹:^í‹:ºH:ºH:X܉:X܉:gB:gB:^φ:^φ:šä?:šä?:Ÿ]‰:Ÿ]‰:¨ªM:¨ªM:DÜ’:DÜ’:é`:é`:Åð˜:Åð˜:Ø÷c:Ø÷c:-9˜:-9˜:ª¡b:ª¡b:±½™:±½™:âõk:âõk:%¡:%¡:޲}:޲}:QQª:QQª:˜À‡:˜À‡:%M²:%M²:P;Ž:P;Ž:÷·:÷·:G‘‘:G‘‘:ÉVº:ÉVº:`¢–:`¢–:ìúÁ:ìúÁ:QR :QR :\ßË:\ßË:*†¨:*†¨:aŸÑ:aŸÑ:·5¬:·5¬:8DÔ:8DÔ:øý®:øý®:„É×:„É×:&‰³:&‰³:ÇxÝ:ÇxÝ:7º:7º:MÄã:MÄã:iõ¾:iõ¾:”]æ:”]æ:ë¿:ë¿:Ç!å:Ç!å:ß¾:ß¾:êä:êä:£‘¾:£‘¾:‹”å:‹”å:·¾:·¾:å:å:t´½:t´½:¦dã:¦dã:õöº:õöº:9Sß:9Sß:zöµ:zöµ:QÚ:QÚ:�ر:�ر:|A×:|A×:ªK¯:ªK¯:•6Ô:•6Ô:³«:³«:¸£Î:¸£Î:»Š¤:»Š¤:c°Ç:c°Ç:ãœ�:ãœ�:„Á:„Á:ff—:ff—:Õ}»:Õ}»:à„’:à„’::̶::̶:vt�:vt�:þÛ°:þÛ°:–ª†:–ª†:-Ω:-Ω:À8€:À8€:3w¤:3w¤:¬Æw:¬Æw:R˜ :R˜ :ªÖo:ªÖo:¡4œ:¡4œ:ì‹f:ì‹f:þ’—:þ’—:`“]:`“]:Â=“:Â=“:ÈgU:ÈgU:‰ˆ�:‰ˆ�:OO:OO:ÌÏŒ:ÌÏŒ:´õI:´õI:× Š:× Š:{³C:{³C:Aµ†:Aµ†:MP=:MP=:líƒ:líƒ:ÁË8:ÁË8:z ‚:z ‚:Ä~5:Ä~5:Ùk€:Ùk€:Œù1:Œù1:V¼|:V¼|:W$-:W$-:Ow:Ow:¾':¾':‰—r:‰—r:œ9$:œ9$:èüo:èüo:.œ!:.œ!:ºdl:ºdl:m²:m²:ärf:ärf:‰�:‰�:»´`:»´`:}]:}]:gÖ[:gÖ[:i¨ :i¨ :ÑW:ÑW:g¾:g¾:½»Q:½»Q:g°:g°:9âJ:9âJ:´áô9´áô9Ù®C:Ù®C:5‡ç95‡ç9«=:«=:HÜ9HÜ98ø7:8ø7:FÐ9FÐ9În1:În1:Ò#Â9Ò#Â9šç):šç):mš²9mš²9‡5":‡5":6d¤96d¤9\õ:\õ:~�™9~�™9—í:—í:ÿ?�9ÿ?�9¿=:¿=:m¶‚9m¶‚9‡ :‡ :U‡j9U‡j97:7:ŒT9ŒT9½Mÿ9½Mÿ9,QE9,QE9/ ø9/ ø9¼Î59¼Î59~aï9~aï9ï;#9ï;#9 æ9 æ9�„9�„9«üÞ9«üÞ9e9e9ökÚ9ökÚ9íÿ8íÿ8KìÖ9KìÖ9äð8äð8ÖïÒ9ÖïÒ9ñoß8ñoß8™ƒÎ9™ƒÎ9‡ÝÏ8‡ÝÏ8t•Ë9t•Ë9²^É8²^É8ÐøÊ9ÐøÊ9þÉ8þÉ8¾ÅÊ9¾ÅÊ9–Æ8–Æ8Ý©É9Ý©É9uÁ8uÁ8œmÈ9œmÈ9k=¾8k=¾8ÁÈ9ÁÈ9 ˆ¾8 ˆ¾8•^È9•^È9¬Ë¿8¬Ë¿8d8È9d8È9ø™¼8ø™¼8VÇÆ9VÇÆ9­(¶8­(¶8®qÅ9®qÅ9¡³8¡³8È7Å9È7Å9}²8}²8ÕÄ9ÕÄ9/÷©8/÷©8vhÁ9vhÁ9ÿž8ÿž8Ÿ¾9Ÿ¾90Š“80Š“8’ƒ»9’ƒ»9¹Å†8¹Å†8¼B¸9¼B¸9X¢r8X¢r8Cl´9Cl´9°SN8°SN8s¯9s¯9(Õ8(Õ80©90©9 ræ7 ræ7…У9…У9ÔÝ‘7ÔÝ‘7½Ež9½Ež9Ñ¥Î6Ñ¥Î66Ü—96Ü—9‹Ùì¶‹Ùì¶ÄU�9ÄU�9öå¹·öå¹·Mˆ9Mˆ9_¸_¸É�9É�9d0P¸d0P¸.Ít9.Ít9Ã2„¸Ã2„¸Ò‘e9Ò‘e9.7¤¸.7¤¸v>U9v>U9,ĸ,ĸìùE9ìùE9^Ýà¸^Ýà¸%489%489ûèú¸ûèú¸(Ž+9(Ž+9d ¹d ¹;j9;j9hù¹hù¹°9°9Ñg&¹Ñg&¹Po9Po9ÝØ1¹ÝØ1¹öÍð8öÍð8ô<;¹ô<;¹ý<Ý8ý<Ý82„E¹2„E¹ëçÇ8ëçÇ8Õ P¹Õ P¹rj³8rj³8/ÇY¹/ÇY¹Iä 8Iä 8b¹b¹ g’8 g’8Ych¹Ych¹<†8<†8Nýn¹Nýn¹ô[n8ô[n8‘¹v¹‘¹v¹«P8«P87Œ}¹7Œ}¹„.78„.78¥�¹¥�¹ë» 8ë» 8çT„¹çT„¹%� 8%� 8Hñ†¹Hñ†¹ðŠë7ðŠë7IÁ‰¹IÁ‰¹\´¼7\´¼7‡Œ¹‡Œ¹ë²“7벓7 ÓŽ¹ ÓŽ¹'Á`7'Á`7 ‘¹ ‘¹›7›7&Ü“¹&Ü“¹&‘A6&‘A6Í–¹Í–¹W‡6¶W‡6¶d«™¹d«™¹�Ñ ·�Ñ ·Uyœ¹Uyœ¹täc·täc·YRŸ¹YRŸ¹§h£·§h£·µ ¢¹µ ¢¹ÈÛ·ÈÛ·"¦¹"¦¹ÝS¸ÝS¸“ ©¹“ ©¹Æ ¸Æ ¸ìW¬¹ìW¬¹Q=¸Q=¸P'°¹P'°¹é#\¸é#\¸uÚ³¹uÚ³¹= y¸= y¸,i·¹,i·¹r‹¸r‹¸ »¹ »¹=¤™¸=¤™¸œœ¾¹œœ¾¹§D¨¸§D¨¸¦e¹¦e¹§N¸¸§N¸¸moƹmoƹ7ȸ7ȸʹʹ^(Ö¸^(Ö¸â͹â͹¿ë㸿ë㸠úй úй‚ò¸‚ò¸�{Ô¹�{Ô¹ì%¹ì%¹âü×¹âü×¹v¹v¹ËLÛ¹ËLÛ¹õp ¹õp ¹RHÞ¹RHÞ¹’j¹’j¹ÆSá¹ÆSá¹/Ϲ/Ϲ£‡ä¹£‡ä¹ô# ¹ô# ¹¬„繬„ç¹óï%¹óï%¹˜L깘Lê¹»a+¹»a+¹ÎÙì¹ÎÙì¹$D0¹$D0¹ü+ï¹ü+ï¹îÿ4¹îÿ4¹åŽñ¹åŽñ¹ç9¹ç9¹ñó¹ñó¹_Ž>¹_Ž>¹y"ö¹y"ö¹AÖB¹AÖB¹8!ø¹8!ø¹4¤F¹4¤F¹Äéù¹Äéù¹.@J¹.@J¹¶¾û¹¶¾û¹-2N¹-2N¹ˆ¹ý¹ˆ¹ý¹9R¹9R¹õpÿ¹õpÿ¹¢U¹¢U¹ÆbºÆbººÅW¹ºÅW¹�º�º¢ÉZ¹¢ÉZ¹ÛºÛºj^¹j^¹¡¥º¡¥º)a¹)a¹WºWº!Ìc¹!Ìc¹ÏòºÏòºe;f¹e;f¹Ì†ºÌ†ºa•h¹a•h¹aºaºÈùj¹Èùj¹X±ºX±º_gm¹_gm¹’?º’?ºr~o¹r~o¹M³ºM³º68q¹68q¹±º±º+ør¹+ør¹ïŒºïŒº_àt¹_àt¹MÿºMÿº<�v¹<�v¹ÑVºÑVº\»w¹\»w¹8’º8’º–¦x¹–¦x¹ÆºÆºáƒy¹áƒy¹÷úº÷úºƒqz¹ƒqz¹/0 º/0 ºo6{¹o6{¹™M º™M º3s{¹3s{¹\L º\L º¢z{¹¢z{¹–N º–N ºT¦{¹T¦{¹²T º²T º¯º{¹¯º{¹µO ºµO ºÈ¢{¹È¢{¹ > º > ºã8{¹ã8{¹Ü ºÜ ºXz¹Xz¹JкJкî˜y¹î˜y¹¼¨º¼¨ºoy¹oy¹ý{ºý{º 6x¹ 6x¹.º.ºÐèv¹Ðèv¹ÆÔºÆÔº¼¦u¹¼¦u¹ˆºˆºô§t¹ô§t¹ Kº Kº�Ès¹�Ès¹ººêwr¹êwr¹È˜ºÈ˜º¯Ÿp¹¯Ÿp¹GºGºgãn¹gãn¹¦µº¦µººvm¹ºvm¹NUºNUº†èk¹†èk¹xãºxãºFj¹Fj¹«hº«hº98h¹98h¹ðëºðëº6Yf¹6Yf¹“rº“rºƒ—d¹ƒ—d¹†º†ºPãb¹Pãb¹oˆºoˆº}Ú`¹}Ú`¹ÙøºÙøº<§^¹<§^¹]lº]lºÖ™\¹Ö™\¹çºçºA“Z¹A“Z¹î_ºî_º³ƒX¹³ƒX¹w¨ÿ¹w¨ÿ¹èEV¹èEV¹zqþ¹zqþ¹õÚS¹õÚS¹;ý¹;ý¹¢Q¹¢Q¹¡!ü¹¡!ü¹osO¹osO¹÷îú¹÷îú¹zôL¹zôL¹)šù¹)šù¹‹ZJ¹‹ZJ¹–Jø¹–Jø¹öÌG¹öÌG¹Sõö¹Sõö¹¡%E¹¡%E¹•õ¹•õ¹GrB¹GrB¹ˆ.ô¹ˆ.ô¹J”?¹J”?¹ Ÿò¹ Ÿò¹i^<¹i^<¹Föð¹Föð¹Î49¹Î49¹«j﹫jï¹0<6¹0<6¹¶Þí¹¶Þí¹£3¹£3¹L)ì¹L)ì¹T’/¹T’/¹÷Xê¹÷Xê¹Tø+¹Tø+¹½ƒè¹½ƒè¹²d(¹²d(¹°·æ¹°·æ¹çä$¹çä$¹¼éä¹¼é乨2!¹Ø2!¹^ìâ¹^ìâ¹ó¹ó¹Èà¹Èโ繂ç¹&¼Þ¹&¼Þ¹Ò¹Ò¹hËܹhËܹ0¹0¹ÂÏÚ¹ÂÏÚ¹Ó* ¹Ó* ¹¹²Ø¹¹²Ø¹ÔÛ¹ÔÛ¹~xÖ¹~xÖ¹Íz¹Íz¹òLÔ¹òLÔ¹CX¹CX¹ÿ?Ò¹ÿ?Ò¹™”ø¸™”ø¸E!йE!йCçï¸Cçï¸Gß͹Gß͹çïæ¸çïæ¸»ŸË¹»ŸË¹ <Þ¸ <Þ¸írɹírɹÁÕ¸ÁÕ¸ÇRǹÇRǹs͸s͸5Ź5Ź£îĸ£îĸ§ü¹§ü¹Â¼¸Â¼¸W¾À¹W¾À¹Ek³¸Ek³¸Ž ¾¹Ž ¾¹.2«¸.2«¸ò‡¼¹ò‡¼¹�Ö¢¸�Ö¢¸9eº¹9eº¹jš¸jš¸ßB¸¹ßB¸¹Œú‘¸Œú‘¸Y¶¹Y¶¹‘‰¸‘‰¸m´¹m´¹|ƒ�¸|ƒ�¸²¹²¹a3s¸a3s¸‘ø¯¹‘ø¯¹*Úb¸*Úb¸'ä­¹'ä­¹„ŸR¸„ŸR¸~Þ«¹~Þ«¹„ C¸„ C¸R쩹R쩹Ú3¸Ú3¸O¨¹O¨¹)¦$¸)¦$¸j¦¹j¦¹¤[¸¤[¸†$¤¹†$¤¹ç«¸ç«¸²S¢¹²S¢¹ÂKñ·ÂKñ·”� ¹”� ¹Ô<Õ·Ô<Õ·óÀž¹óÀž¹ Ò¸· Ò¸·üóœ¹üóœ¹fÊœ·fÊœ·R3›¹R3›¹g¸�·g¸�·°€™¹°€™¹ü™N·ü™N·ÍÔ—¹ÍÔ—¹‹·‹·9&–¹9&–¹{Ýɶ{Ýɶyu”¹yu”¹Õ*A¶Õ*A¶7Ó’¹7Ó’¹ãm¿3ãm¿3óF‘¹óF‘¹ F6 F6Þ»�¹Þ»�¹¾óÅ6¾óÅ6› ޹› ޹17173~Œ¹3~Œ¹ æH7 æH7åꊹåꊹIÊx7IÊx7;o‰¹;o‰¹$]“7$]“7¡ô‡¹¡ô‡¹î«7î«7/h†¹/h†¹L°Ã7L°Ã7´Ù„¹´Ù„¹d®Û7d®Û7ü[ƒ¹ü[ƒ¹ {ò7 {ò74í�¹4í�¹´}8´}8îv€¹îv€¹J8J8Ú}¹Ú}¹hn8hn82Êz¹2Êz¹c7(8c7(8:Öw¹:Öw¹L±38L±38Åìt¹Åìt¹V?8V?8;r¹;r¹¬ŽJ8¬ŽJ8o o¹o o¹½|V8½|V8Àûk¹Àûk¹nCb8nCb8úi¹úi¹Bfm8Bfm8Ù>f¹Ù>f¹æ¢x8æ¢x8 Oc¹ Oc¹ý/‚8ý/‚8„K`¹„K`¹…ˆ8…ˆ8„L]¹„L]¹Áð�8Áð�8TZ¹TZ¹vÅ“8vÅ“8öWW¹öWW¹C­™8C­™82MT¹2MT¹-´Ÿ8-´Ÿ897Q¹97Q¹ Â¥8 Â¥8A&N¹A&N¹–À«8–À«8„K¹„K¹Äܱ8Äܱ8©ìG¹©ìG¹Þ¸8Þ¸8Õ¾D¹Õ¾D¹xW¾8xW¾8ŒŽA¹ŒŽA¹Ï²Ä8ϲÄ8E>¹E>¹¦8Ë8¦8Ë8¾ò:¹¾ò:¹îÀÑ8îÀÑ8É›7¹É›7¹ócØ8ócØ814¹14¹,ß8,ß8Q¾0¹Q¾0¹|óå8|óå8�I-¹�I-¹ÆËì8ÆËì8ÎÇ)¹ÎÇ)¹D¾ó8D¾ó8J>&¹J>&¹ »ú8 »ú8Hª"¹Hª"¹”ì9”ì9ï¹ï¹h‚9h‚9àe¹àe¹¤9¤9'¼¹'¼¹+¿ 9+¿ 9Œù¹Œù¹„w9„w9ö5¹ö5¹)(9)(9Ðx ¹Ðx ¹$Ù9$Ù9~·¹~·¹�9�9'÷¹'÷¹ÖA9ÖA9â+¹â+¹j "9j "9¦–ú¸¦–ú¸à%9à%9Üò¸Üò¸™§)9™§)9•8븕8ë¸\l-9\l-9R‹ã¸R‹ã¸¸919¸919!ÎÛ¸!ÎÛ¸•59•59�øÓ¸�øÓ¸éð89éð89"!̸"!̸eÅ<9eÅ<9�rĸ�rĸø‰@9ø‰@97ü¸7ü¸Ø_D9Ø_D9�å´¸�å´¸]FH9]FH92­¸2­¸%L9%L9`/¥¸`/¥¸ÔP9ÔP9}U�¸}U�¸áS9áS9„•¸„•¸M¹W9M¹W9P³�¸P³�¸$�[9$�[9‡º…¸‡º…¸%’_9%’_9?t{¸?t{¸„}c9„}c9§¯k¸§¯k¸Ë\g9Ë\g9Ëþ[¸Ëþ[¸y=k9y=k9J~8„>~8ì”®9ì”®9~8~8ß‚®9ß‚®9Æl}8Æl}8Øa®9Øa®9y^|8y^|8À5®9À5®9À{8À{8¤®9¤®9ø³y8ø³y8pÏ­9pÏ­9 x8 x8¨�­9¨�­9Sv8Sv8oE­9oE­9/Äs8/Äs8 ñ¬9 ñ¬9n:q8n:q8š¬9š¬9ݸn8ݸn8ÃC¬9ÃC¬9†l8†l8Èâ«9Èâ«9>i8>i8u«9u«9 «e8 «e8=«9=«9­Sb8­Sb8ö’ª9ö’ª99í^89í^8�ª9�ª9R_[8R_[8£©9£©9¡ŠW8¡ŠW8~©9~©9“|S8“|S8£–¨9£–¨9+uO8+uO8p¨9p¨9ûvK8ûvK8Ч9Ч9ü¦9>ü¦9$ôB8$ôB8Ih¦9Ih¦9 j>8 j>8QÏ¥9QÏ¥9ÓÍ98ÓÍ98õ7¥9õ7¥9_K58_K58¢¤9¢¤9r±08r±08©¤9©¤9¹Ó+8¹Ó+8¿a£9¿a£9é&8é&8ê¿¢9ê¿¢9 "8 "8Æ¢9Æ¢9F8F8Ów¡9Ów¡9¥þ8¥þ8šÌ 9šÌ 9Z¹8Z¹8N 9N 9cZ 8cZ 8RkŸ9RkŸ9#8#8¶ºž9¶ºž9Nš8Nš8©ž9©ž9øú7øú7¸L�9¸L�9)Èî7)Èî7Ë‘œ9Ë‘œ9Yã7Yã7¯Ó›9¯Ó›9 µ×7 µ×7B›9B›9(óË7(óË7QPš9QPš9äî¿7äî¿7އ™9އ™9p’³7p’³7:¼˜9:¼˜9€?§7€?§7Šò—9Šò—9+çš7+çš7š$—9š$—9gŽ7gŽ7dO–9dO–9>þ€7>þ€7¬w•9¬w•9\›g7\›g7%Ÿ”9%Ÿ”9I+M7I+M7€Æ“9€Æ“9;¥27;¥27Äê’9Äê’9ÑJ7ÑJ7„’9„’96ö66ö6> ‘9> ‘9ä\¾6ä\¾6=�9=�9¬†6¬†6¶V�9¶V�9^/6^/6ÑjŽ9ÑjŽ9%ò5%ò5C{�9C{�9pežµpežµÀ‰Œ9À‰Œ9îBE¶îBE¶‚™‹9‚™‹9 W�¶ W�¶Ö¨Š9Ö¨Š9ðÑØ¶ðÑØ¶#³‰9#³‰9,Ö ·,Ö ·õ¸ˆ9õ¸ˆ9——)·——)·Ì½‡9̽‡9$VH·$VH·lÆ9lÆ99g·9g·cÈ…9cÈ…9ჷჷ¡È„9¡È„9ÞÞ’·ÞÞ’·÷Ã9÷Ã9t墷t墷H¿‚9H¿‚9Üײ·Üײ·(»�9(»�9"â·"â·³³€9³³€9¾,Ó·¾,Ó·>Q9>Q9ã¤ã·ã¤ã·í5}9í5}9Qô·Qô·D{9D{9ÿ–¸ÿ–¸¦íx9¦íx9Ô ¸Ô ¸CÈv9CÈv9%€¸%€¸n›t9n›t95!¸5!¸Jfr9Jfr9Ù$¸Ù$¸7-p97-p9Í�-¸Í�-¸ºñm9ºñm9Fj6¸Fj6¸-´k9-´k9�D?¸�D?¸„pi9„pi9â>H¸â>H¸š%g9š%g9GOQ¸GOQ¸ZÖd9ZÖd9KnZ¸KnZ¸wƒb9wƒb9žc¸žc¸G,`9G,`9´àl¸´àl¸ÒÏ]9ÒÏ]9A8v¸A8v¸$o[9$o[9«š¸«š¸ù Y9ù Y99‚„¸9‚„¸0§V90§V9B‰¸B‰¸A;T9A;T9“ ޏ“ ޏÆËQ9ÆËQ9”Ü’¸”Ü’¸)YO9)YO9δ—¸Î´—¸§áL9§áL9蕜¸è•œ¸öfJ9öfJ9+}¡¸+}¡¸íèG9íèG9/j¦¸/j¦¸ÑhE9ÑhE9~Y«¸~Y«¸¿èB9¿èB9ÃH°¸ÃH°¸g@9g@9ì<µ¸ì<µ¸ùâ=9ùâ=9è8º¸è8º¸ÔZ;9ÔZ;9ó9¿¸ó9¿¸Ñ89Ñ89€=ĸ€=ĸŠF69ŠF69™Aɸ™AɸG¼39G¼39EθEθ¨119¨119ýJÓ¸ýJÓ¸Á¥.9Á¥.9ë8Ý>ë8ö]$¹ö]$¹³•æ8³•æ8‘©&¹‘©&¹óòá8óòá8¯ñ(¹¯ñ(¹ÑWÝ8ÑWÝ8"5+¹"5+¹�ÊØ8�ÊØ8o-¹o-¹ÑRÔ8ÑRÔ8Ÿ/¹Ÿ/¹êÏ8êÏ8…Ê1¹…Ê1¹é‡Ë8é‡Ë8ÿñ3¹ÿñ3¹é0Ç8é0Ç8í6¹í6¹ŽìÂ8ŽìÂ8»'8¹»'8¹²½¾8²½¾8ì2:¹ì2:¹à º8à º8q7<¹q7<¹´�¶8´�¶8 7>¹ 7>¹ˆ²8ˆ²8Œ,@¹Œ,@¹< ®8< ®8<B¹<B¹ÆÐª8ÆÐª8<ðC¹<ðC¹˜ §8˜ §8qÈE¹qÈE¹³W£8³W£8Ÿ•G¹Ÿ•G¹×ºŸ8׺Ÿ8­WI¹­WI¹J5œ8J5œ86 K¹6 K¹°È˜8°È˜85¸L¹5¸L¹îj•8îj•8æ]N¹æ]N¹"’8"’8¨ùO¹¨ùO¹FãŽ8FãŽ8‹‡Q¹‹‡Q¹Æ‹8Æ‹8— S¹— S¹ë¼ˆ8뼈8xƒT¹xƒT¹FÇ…8FÇ…8ÃóU¹ÃóU¹‡á‚8‡á‚8I[W¹I[W¹€8€8+´X¹+´X¹=Æz8=Æz8¤Z¹¤Z¹e†u8e†u8áG[¹áG[¹]p8]p8í†\¹í†\¹bk8bk8W¸]¹W¸]¹|žf8|žf8ÁÜ^¹ÁÜ^¹Z b8Z b8¢ö_¹¢ö_¹Å›]8Å›]8òa¹òa¹ROY8ROY8b¹b¹¡-U8¡-U8Ü c¹Ü c¹Õ@Q8Õ@Q8ûc¹ûc¹�~M8�~M8 âd¹ âd¹LØI8LØI8¡Áe¹¡Áe¹�UF8�UF8J—f¹J—f¹ÕüB8ÕüB8Óag¹Óag¹$Ô?8$Ô?8Àh¹Àh¹ËÛ<8ËÛ<8ôÓh¹ôÓh¹ü:8ü:8S�i¹S�i¹cG78cG78ö#j¹ö#j¹òÀ48òÀ48¬¹j¹¬¹j¹²h28²h28°Ek¹°Ek¹91089108|Êk¹|Êk¹Í.8Í.8ýGl¹ýGl¹,8,8Žºl¹Žºl¹X*8X*8åm¹åm¹†Á(8†Á(8›|m¹›|m¹zD'8zD'8Óm¹Óm¹ªæ%8ªæ%8în¹în¹²´$8²´$8Áan¹Áan¹x¬#8x¬#8ó™n¹ó™n¹ëÆ"8ëÆ"8�Ên¹�Ên¹¨ý!8¨ý!8côn¹côn¹ÁO!8ÁO!8¶o¹¶o¹RÄ 8RÄ 8/o¹/o¹èe 8èe 8Ro¹•>o¹\ 8\ 8-o¹-o¹ê] 8ê] 8o¹o¹ 8 8òn¹òn¹Á7!8Á7!8ýÌn¹ýÌn¹sÈ!8sÈ!8¿Ÿn¹¿Ÿn¹b~"8b~"8~hn¹~hn¹‰\#8‰\#8%(n¹%(n¹X$8X$8xâm¹xâm¹ed%8ed%8‘˜m¹‘˜m¹ ˆ&8 ˆ&8¹Fm¹¹Fm¹‡Ð'8‡Ð'8�ël¹�ël¹>;)8>;)8q‰l¹q‰l¹½*8½*8B"l¹B"l¹‘Q,8‘Q,8R¶k¹R¶k¹Äü-8Äü-8�Ck¹�Ck¹WÇ/8WÇ/8áÈj¹áÈj¹Þ¬18Þ¬18‚Ij¹‚Ij¹iŸ38iŸ38õÆi¹õÆi¹i£58i£58“>i¹“>i¹:Ã78:Ã78e¯h¹e¯h¹Œú98Œú98`h¹`h¹B<8B<8Ùƒg¹Ùƒg¹ö–>8ö–>8(éf¹(éf¹éú@8éú@8rIf¹rIf¹­wC8­wC8º£e¹º£e¹ÂF8ÂF8Ëûd¹Ëûd¹™H8™H8ÝQd¹ÝQd¹´;K8´;K8·¢c¹·¢c¹YóM8YóM8™ïb¹™ïb¹à¶P8à¶P8ˆ9b¹ˆ9b¹ˆS8ˆS8@€a¹@€a¹'bV8'bV8 Æ`¹ Æ`¹'?Y8'?Y8• `¹• `¹œ/\8œ/\8èF_¹èF_¹Ç6_8Ç6_8„€^¹„€^¹„Eb8„Eb8׸]¹×¸]¹[e8[e8ï\¹ï\¹lzh8lzh8Ø"\¹Ø"\¹È£k8È£k8¨S[¹¨S[¹Ün8Ün8 €Z¹ €Z¹!r8!r8ó«Y¹ó«Y¹ýfu8ýfu8k×X¹k×X¹‚°x8‚°x8cX¹cX¹â |8â |8$%W¹$%W¹aq8aq85GV¹5GV¹‹p�8‹p�8hU¹hU¹a)ƒ8a)ƒ8*‰T¹*‰T¹Ìá„8Ìá„8D©S¹D©S¹ÞŸ†8ÞŸ†8qÅR¹qÅR¹jeˆ8jeˆ8œßQ¹œßQ¹q+Š8q+Š87úP¹7úP¹±ñ‹8±ñ‹8àP¹àP¹Üº�8ܺ�8R,O¹R,O¹O†�8O†�8èBN¹èBN¹ûW‘8ûW‘81VM¹1VM¹.“8.“8'iL¹'iL¹“•8“•8L|K¹L|K¹àÙ–8àÙ–8R�J¹R�J¹à´˜8à´˜8c�I¹c�I¹3‘š83‘š8D¬H¹D¬H¹:qœ8:qœ8…¹G¹…¹G¹ÇRž8ÇRž8 ÇF¹ ÇF¹Î3 8Î3 8úÓE¹úÓE¹¢8¢8ÇÞD¹ÇÞD¹;¤8;¤8�èC¹�èC¹Æé¥8Æé¥8BñB¹BñB¹„Ö§8„Ö§8\øA¹\øA¹ƒÅ©8ƒÅ©8Yÿ@¹Yÿ@¹–³«8–³«8^@¹^@¹¤­8¤­8c ?¹c ?¹±˜¯8±˜¯8%>¹%>¹ ޱ8 ޱ8Þ=¹Þ=¹“„³8“„³8Š<¹Š<¹·}µ8·}µ8Ú;¹Ú;¹z·8z·8k:¹k:¹=z¹8=z¹8P9¹P9¹û{»8û{»8}8¹}8¹g}½8g}½8Â7¹Â7¹3ƒ¿83ƒ¿8’ 6¹’ 6¹ŒÁ8ŒÁ8\5¹\5¹¯“Ã8¯“Ã8b4¹b4¹ �Å8 �Å8Ñù2¹Ñù2¹á©Ç8á©Ç8éñ1¹éñ1¹™¸É8™¸É8^é0¹^é0¹ÂÇË8ÂÇË8Eà/¹Eà/¹;ÓÍ8;ÓÍ8Ô.¹Ô.¹†ÛÏ8†ÛÏ8“Ã-¹“Ã-¹YâÑ8YâÑ8¦®,¹¦®,¹[æÓ8[æÓ8e–+¹e–+¹¾åÕ8¾åÕ8š{*¹š{*¹´Þ×8´Þ×8ú^)¹ú^)¹ÇÐÙ8ÇÐÙ8ü?(¹ü?(¹¿Û8¿Û8Ë'¹Ë'¹}«Ý8}«Ý8÷õ%¹÷õ%¹î‘ß8î‘ß8Î$¹Î$¹oá8oá8X¥#¹X¥#¹Eã8Eã8ýy"¹ýy"¹úå8úå87K!¹7K!¹žäæ8žäæ8$ ¹$ ¹·ªè8·ªè8iè¹iè¹çfê8çfê8%¶¹%¶¹`ì8`ì8Ÿ�¹Ÿ�¹ Ëí8 Ëí8§I¹§I¹Ãwï8Ãwï8l¹l¹ñ8ñ8ôÔ¹ôÔ¹ƒµò8ƒµò8œš¹œš¹öEô8öEô8‚^¹‚^¹¾Ñõ8¾Ñõ8K¹K¹/Y÷8/Y÷8èݹèݹ|Øø8|Øø8‡œ¹‡œ¹•Lú8•Lú8±[¹±[¹·û8·û8M¹M¹&ý8&ý8½Ó¹½Ó¹~þ8~þ8`� ¹`� ¹;Óÿ8;Óÿ8ÜH ¹ÜH ¹Ó�9Ó�9n ¹n ¹f.9f.9¾ ¹¾ ¹èË9èË9vv¹vv¹e9e9À.¹À.¹Fù9Fù9‹ç¹‹ç¹·‡9·‡9{¡¹{¡¹ 9 9?[¹?[¹¸•9¸•9,¹,¹99;ι;ιÖ�9Ö�92ÿ¸2ÿ¸š9š9Í�ü¸Í�ü¸-r9-r9yú¸yú¸‘Ü9‘Ü9¶€÷¸¶€÷¸œA9œA9þô¸þô¸AŸ9AŸ9™€ò¸™€ò¸ýö9ýö9yð¸yð¸†J9†J9«†í¸«†í¸“˜9“˜9‹ 븋 ë¸à9à9T˜è¸T˜è¸€! 9€! 9’&渒&æ¸] 9] 9·ã¸·ã¸¡“ 9¡“ 9XHá¸XHá¸Å 9Å 9^ÝÞ¸^ÝÞ¸¤ï 9¤ï 90xܸ0xܸ¶ 9¶ 9ÇÚ¸ÇÚ¸ð2 9ð2 9n´×¸n´×¸#M 9#M 9VÕ¸VÕ¸�a 9�a 9¡ûÒ¸¡ûÒ¸¾o 9¾o 9¥и¥иew 9ew 9UθUθJy 9Jy 9̸̸ôv 9ôv 9ŸɸŸɸ›n 9›n 9.rǸ.rǸú^ 9ú^ 9Î0ŸÎ0ŸJ 9J 9¶ñ¸¶ñ¸0 90 9¶À¸¶À¸w 9w 9~¾¸~¾¸^ë 9^ë 9õJ¼¸õJ¼¸¿¿ 9¿¿ 9Þº¸Þº¸7Ž 97Ž 9ïó·¸ïó·¸ X 9 X 9´Ìµ¸´Ìµ¸q 9q 9¯ª³¸¯ª³¸®Ú9®Ú9Pޱ¸Pޱ¸Ã’9Ã’9Šw¯¸Šw¯¸óD9óD9ïd­¸ïd­¸…ò9…ò9ÅT«¸ÅT«¸$›9$›9$J©¸$J©¸=9=9G§¸G§¸›Ø9›Ø9åH¥¸åH¥¸do9do9N£¸N£¸'9'9hX¡¸hX¡¸�9�9TiŸ¸TiŸ¸„9„9c��¸c��¸Í‘9Í‘9DŸ›¸DŸ›¸N 9N 9Ö¿™¸Ö¿™¸¼‚9¼‚9ãä—¸ãä—¸/ó9/ó9ꖸꖸA]9A]9E”¸E”¸�Â9�Â9$|’¸$|’¸<#9<#9±·�¸±·�¸8989aøŽ¸aøŽ¸½«ÿ8½«ÿ8á?�¸á?�¸zMþ8zMþ8z�‹¸z�‹¸Uæü8Uæü8Þ‰¸Þ‰¸xû8xû8‹2ˆ¸‹2ˆ¸Mú8Mú8�†¸�†¸i~ø8i~ø8 털 털móö8móö8çQƒ¸çQƒ¸6`õ86`õ8—º�¸—º�¸ÔÅó8ÔÅó8–&€¸–&€¸$ò8$ò8K.}¸K.}¸¢yð8¢yð8äz¸äz¸çÆî8çÆî8\w¸\w¸ç í8ç í8¦ t¸¦ t¸ÃKë8ÃKë8ðq¸ðq¸‘ƒé8‘ƒé8¹n¸¹n¸ó³ç8ó³ç8ê1k¸ê1k¸Ýå8Ýå88Ph¸8Ph¸ðÿã8ðÿã8ue¸ue¸Çâ8Çâ8¢b¸¢b¸Ï2à8Ï2à8`Ø_¸`Ø_¸BÞ8BÞ8]¸]¸%KÜ8%KÜ8h]Z¸h]Z¸lNÚ8lNÚ8˜«W¸˜«W¸¼KØ8¼KØ8+U¸+U¸CÖ8CÖ8"aR¸"aR¸Í4Ô8Í4Ô8bÇO¸bÇO¸�!Ò8�!Ò8‰4M¸‰4M¸g Ð8g Ð8)©J¸)©J¸ìÍ8ìÍ8ý%H¸ý%H¸PÉË8PÉË8†«E¸†«E¸e¡É8e¡É8š8C¸š8C¸\uÇ8\uÇ8‘Ë@¸‘Ë@¸›EÅ8›EÅ8+e>¸+e>¸UÃ8UÃ8¬<¸¬<¸ ØÀ8 ØÀ8}²9¸}²9¸›¾8›¾8ab7¸ab7¸©[¼8©[¼8Ä5¸Ä5¸xº8xº8çÑ2¸çÑ2¸jÓ·8jÓ·86•0¸6•0¸«‰µ8«‰µ8-_.¸-_.¸…=³8…=³8Ø-,¸Ø-,¸Zï°8Zï°8þ*¸þ*¸Òž®8Òž®8áÛ'¸áÛ'¸LL¬8LL¬8»%¸»%¸Ã÷©8Ã÷©83 #¸3 #¸=¡§8=¡§8kŠ!¸kŠ!¸ÀI¥8ÀI¥8Ix¸Ix¸zñ¢8zñ¢8Ój¸Ój¸ò— 8ò— 8”b¸”b¸e=ž8e=ž83_¸3_¸éá›8éá›8Ñ`¸Ñ`¸ù…™8ù…™8«e¸«e¸Ÿ*—8Ÿ*—8Qm¸Qm¸KÏ”8KÏ”8úy¸úy¸ks’8ks’8N‹¸N‹¸Ý�8Ý�8íŸ ¸íŸ ¸½�8½�8ç· ¸ç· ¸c‹8c‹8,Ó ¸,Ó ¸ê ‰8ê ‰8ò¸ò¸•±†8•±†8¸¸ Z„8 Z„8Æ;¸Æ;¸ø‚8ø‚8ðd¸ðd¸Þ_8Þ_8i�¸i�¸w»z8w»z8ÿ}ý·ÿ}ý·sv8sv8üáù·üáù· }q8 }q8üKö·üKö·uäl8uäl8ιò·Î¹ò·�Qh8�Qh8]+ï·]+ï·ôÃc8ôÃc8£ë·£ë·$;_8$;_8¯è·¯è·ç¸Z8ç¸Z8Оä·Ðžä·\=V8\=V8®"á·®"á·÷ÇQ8÷ÇQ8†ªÝ·†ªÝ·'ZM8'ZM8€4Ú·€4Ú·ñóH8ñóH8õÂÖ·õÂÖ·µ”D8µ”D8UÓ·UÓ·í=@8í=@8ÙèÏ·ÙèÏ·Òï;8Òï;8+€Ì·+€Ì·½©78½©78É·É·yl38yl38¬¸Å·¬¸Å·`8/8`8/8)Y·)Y·Ÿ +8Ÿ +8ü¾·ü¾·Ãì&8Ãì&8`¡»·`¡»·�Õ"8�Õ"8mJ¸·mJ¸·ôÇ8ôÇ8ìõ´·ìõ´·XÅ8XÅ8j¢±·j¢±·ÑÍ8ÑÍ8šQ®·šQ®·œà8œà8o«·o«·þ8þ8Ú¹§·Ú¹§·' 8' 8Sq¤·Sq¤·°[8°[8}*¡·}*¡·sœ8sœ8Ñå�·Ñå�·ÃÑÿ7ÃÑÿ7Ϥš·Ï¤š·��ø7��ø7àf—·àf—·RJñ7RJñ7¿*”·¿*”·Í,ê7Í,ê7™ð�·™ð�·)ã7)ã7è¸�·è¸�·‘>Ü7‘>Ü7ù„Š·ù„Š·ylÕ7ylÕ7jU‡·jU‡·ø³Î7ø³Î79(„·9(„·VÈ7VÈ7åü€·åü€·¾•Á7¾•Á7«{·«{·Ù-»7Ù-»7zeu·zeu·rà´7rà´7Ž'o·Ž'o·g®®7g®®7³ðh·³ðh·]˜¨7]˜¨7¥Àb·¥Àb·Tž¢7Tž¢7š™\·š™\·¿œ7¿œ79~V·9~V·–ú–7–ú–7=mP·=mP·NR‘7NR‘7ÕdJ·ÕdJ·ØÆ‹7ØÆ‹7ãeD·ãeD·­W†7­W†7br>·br>·B�7B�7š‹8·š‹8·)™w7)™w7l±2·l±2·Ëbm7Ëbm7Ùâ,·Ùâ,·~fc7~fc7œ '·œ '·£Y7£Y7ªl!·ªl!·àP7àP7zÇ·zÇ·ÁÅF7ÁÅF7“0·“0·†­=7†­=7¨·¨·[Ï47[Ï47Ü. ·Ü. ·…*,7…*,7LÆ·LÆ·�¾#7�¾#7ön·ön·é‹7é‹7šQö¶šQö¶“7“7[èë¶[èë¶ÒÓ 7ÒÓ 78¤á¶8¤á¶¡M7¡M7‡×¶‡×¶Óú6Óú6®‘Ͷ®‘Ͷ­Øë6­Øë6¹Äö¹Äöø"Þ6ø"Þ6u!º¶u!º¶ßÐ6ßÐ6ò©°¶ò©°¶¬ Ä6¬ Ä6`§¶`§¶s¨·6s¨·6½Dž¶½Dž¶cµ«6cµ«6%Y•¶%Y•¶ú1 6ú1 6ꞌ¶êžŒ¶O•6O•6„¶„¶EvŠ6EvŠ6LŒw¶LŒw¶I<€6I<€6Ug¶Ug¶PÞl6PÞl6oŒW¶oŒW¶AZ6AZ6ˆ6H¶ˆ6H¶°/H6°/H6UW9¶UW9¶‡76‡76ò*¶ò*¶gÏ&6gÏ&6+ ¶+ ¶>Y6>Y6ƒŸ¶ƒŸ¶ú±6ú±6Z¹¶Z¹¶Á¬õ5Á¬õ5‹µìµ‹µìµóˆÛ5óˆÛ5® Õµ® Õµ0öÂ50öÂ5–}¾µ–}¾µ¦ð«5¦ð«5©µ©µ}s–5}s–5kÈ”µkÈ”µsy‚5sy‚5á°�µá°�µ”ü_5”ü_57œ_µ7œ_µ ý=5 ý=5L>µL>µ ë5 ë5aµaµk¼5k¼51Cµ1Cµ“ÐÒ4“ÐÒ4QGÓ´QGÓ´ÓË¥4ÓË¥4øY¥´øY¥´5±|45±|4S­y´S­y´ É84 É84:¬3´:¬3´Áqÿ3Áqÿ3ùÃñ³ùÃñ³|¶¢3|¶¢3Ÿû’³Ÿû’³C/63C/63<¸³<¸³-¡2-¡2ÛZ²ÛZ²{i 1{i 1“ǰ“ǰ././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/BinauralDecoder/Source/EQ/AKG-K240DF.wavIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/BinauralDecoder/Source/EQ/AKG-K240DF0000664002537200253720000004013015257173642030572 0ustar zmoelnigzmoelnigRIFFP@WAVEfmt €»Ü factPEAKàc YwõK?wõK?data@wõK?wõK?T ¾T ¾ó=ó=m—³=m—³=… ¾… ¾á`�½á`�½5½5½koܺ�>ºkó̹kó̹ךº×šº&ñع&ñع2/º2/º¾Rã¹¾Rã¹=º=ºPÉì¹PÉì¹Ü¦#ºÜ¦#º:‘õ¹:‘õ¹Fà'ºFà'ºÌ¥ý¹Ì¥ý¹½¡+º½¡+ºT-ºT-ºÂ}.ºÂ}.ºéˆºéˆº`T0º`T0ºnÕºnÕºZ1ºZ1ºK*ºK*ºä1ºä1ºöºöºÐ­0ºÐ­0ºCMºCMºQË/ºQË/ºŸ/ºŸ/ºÒp.ºÒp.ºÐ�ºÐ�ºç¡,ºç¡,º„‹º„‹ºéA*ºéA*º¤ºû¹¤ºû¹L'ºL'ºVõ¹Võ¹yÝ#ºyÝ#ºôî¹ôî¹B ºB ºèoæ¹èo湃<ºƒ<ºŽ­Þ¹Ž­Þ¹[º[º*×Ö¹*×Ö¹s[ºs[ºÕÆÎ¹ÕÆÎ¹2Tº2Tº@·Æ¹@·Æ¹‹? º‹? ºÒl¾¹Òl¾¹’º’ºÉæµ¹Éæµ¹®Ãº®Ãº4|­¹4|­¹¬Kÿ¹¬Kÿ¹·‡¥¹·‡¥¹ «÷¹ «÷¹ÈFž¹ÈFž¹sÆð¹sÆð¹5½—¹5½—¹?Šê¹?Šê¹Å‘¹Å‘¹‚À乂Àä¹D!Œ¹D!Œ¹&Eß¹&Eß¹m冹m冹HMÚ¹HMÚ¹Ù-‚¹Ù-‚¹ÏÕ¹ÏÕ¹%è{¹%è{¹;Ûѹ;ÛѹŒ¡t¹Œ¡t¹dŠÎ¹dŠÎ¹ðŸn¹ðŸn¹2Ò˹2Ò˹¯Øi¹¯Øi¹õ»É¹õ»É¹s&f¹s&f¹S ȹS ȹ<c¹<c¹…ƹ…ƹDû_¹Dû_¹�Ź�ŹO]¹O]¹6¢Ã¹6¢Ã¹ÈyZ¹ÈyZ¹äi¹äi¹gxX¹gxX¹ƒ©Á¹ƒ©Á¹)`W¹)`W¹6Á¹6Á¹‘ˆV¹‘ˆV¹ÕºÀ¹ÕºÀ¹Ñ`U¹Ñ`U¹À¹À¹‰ÆS¹‰ÆS¹ü¿¹ü¿¹‰Q¹‰Q¹—»½¹—»½¹‡N¹‡N¹Ÿ(¼¹Ÿ(¼¹~GK¹~GK¹¨wº¹¨wº¹?ÃG¹?ÃG¹( ¸¹( ¸¹€÷C¹€÷C¹Ñ¦¶¹Ñ¦¶¹žÓ?¹žÓ?¹Rl´¹Rl´¹ôñ:¹ôñ:¹ƒ®±¹ƒ®±¹ëÎ4¹ëÎ4¹›J®¹›J®¹üŒ-¹üŒ-¹—yª¹—yª¹ˆ %¹ˆ %¹üd¦¹üd¦¹©e¹©e¹ËC¢¹ËC¢¹-¹-¹%ž¹%ž¹O¨ ¹O¨ ¹¬·™¹¬·™¹=†¹=†¹ð”¹ð”¹á8ó¸á8ó¸IÊ�¹IÊ�¹2êݸ2êݸ…Qй…QйHÞǸHÞǸ¡Ô„¹¡Ô„¹Ù5²¸Ù5²¸Zø~¹Zø~¹$.�¸$.�¸ÑŸt¹ÑŸt¹(͈¸(͈¸úsj¹úsj¹:Çh¸:Çh¸·(`¹·(`¹ƒ8Z>ƒ8€k9€k9èB‚8èB‚8Zæj9Zæj9â߀8â߀8&j9&j9”Z~8”Z~8m5i9m5i9¤¤z8¤¤z8lAh9lAh9W¼v8W¼v8(8g9(8g9êVr8êVr8¦ f9¦ f9DSm8DSm8±­d9±­d9�pg8�pg8¬c9¬c9�È`8�È`8;[a9;[a9O§Y8O§Y8ˆ_9ˆ_95R85R8²ž]9²ž]9ÌuJ8ÌuJ8§[9§[9—zB8—zB8ë›Y9ë›Y9¡ :8¡ :8RsW9RsW9ª518ª518a$U9a$U9Ö¿'8Ö¿'8P¸R9P¸R9ìå8ìå8v4P9v4P9ȱ8ȱ8� M9� M9Üe 8Üe 8ô K9ô K9w2þ7w2þ7âuH9âuH97gé77gé7íÕE9íÕE9P9Ô7P9Ô7„'C9„'C9ûŸ¾7ûŸ¾7wm@9wm@9•¥¨7•¥¨7§=9§=9 p’7 p’7åâ:9åâ:9?y7?y7�(89�(89!ÉM7!ÉM7 y59 y59 #7 #7šÊ29šÊ29€ð6€ð6x09x09Й6Й6X-9X-9!6!6•*9•*9(U9µ(U9µ%Ô'9%Ô'9&]¶&]¶D%9D%9á#Ķá#Ķàt"9àt"9Ξ ·Îž ·Ì9Ì9ïü6·ïü6·ß%9ß%9+_a·+_a·E}9E}95ú…·5ú…·ÚÏ9ÚÏ9Œ{›·Œ{›·×9×98 ±·8 ±·f9f9›½Æ·›½Æ·ó³9ó³9£%Ü·£%Ü· 9 9¤añ·¤añ·²` 9²` 9Û]¸Û]¸ ¯9 ¯9ö?¸ö?¸/í9/í9 _¸ _¸¼!9¼!9‡‡$¸‡‡$¸°þ8°þ8ã£/¸ã£/¸Ì&ù8Ì&ù86¦:¸6¦:¸8¦ó88¦ó8)¦E¸)¦E¸�"î8�"î8–µP¸–µP¸�è8�è8‚û[¸‚û[¸êÞâ8êÞâ8Ö\g¸Ö\g¸(Ý8(Ý8OÕr¸OÕr¸"e×8"e×8’^~¸’^~¸iœÑ8iœÑ8©ö„¸©ö„¸LÙË8LÙË8‹°Š¸‹°Š¸2"Æ82"Æ8áf�¸áf�¸+hÀ8+hÀ8p"–¸p"–¸J©º8J©º87à›¸7à›¸Õê´8Õê´8�ž¡¸�ž¡¸X)¯8X)¯8c^§¸c^§¸8a>8çŸó¸çŸó¸Ñ C8Ñ C8ªüð¸ªüð¸ØýH8ØýH8WJî¸WJuN8±uN8ô‹ë¸ô‹ë¸ÝT8ÝT8 Â踠Âè¸ã£Y8ã£Y8zöå¸zöå¸^G_8^G_8"%ã¸"%㸱÷d8±÷d8„MคMà¸`¶j8`¶j8 mݸ mݸTŠp8TŠp8y€Ú¸y€Ú¸’wv8’wv8¯‡×¸¯‡×¸@}|8@}|85ƒÔ¸5ƒÔ¸ÔJ�8ÔJ�8™xѸ™xѸþY„8þY„8JoθJoθ c‡8 c‡8+m˸+m˸ÿgŠ8ÿgŠ8 mȸ mȸül�8ül�8EjŸEjŸÔv�8Ôv�8 a¸ a¸8†“88†“8,T¿¸,T¿¸ ™–8 ™–8+G¼¸+G¼¸l¥™8l¥™8«E¹¸«E¹¸E¥œ8E¥œ8ÌO¶¸ÌO¶¸ê˜Ÿ8ꘟ8¹f³¸¹f³¸–‚¢8–‚¢8Ùƒ°¸Ùƒ°¸-h¥8-h¥8£­¸£­¸¼M¨8¼M¨8/ê¸/ê¸"/«8"/«8¿ê§¸¿ê§¸ì®8ì®8ò¥¸ò¥¸Sа8Sа8c¢¸c¢¸�…³8�…³8x»Ÿ¸x»Ÿ¸+¶8+¶8 �¸ �¸¹Æ¸8¹Æ¸8ÓŒš¸ÓŒš¸.\»8.\»8hþ—¸hþ—¸Ùí½8Ùí½8s•¸s•¸°{À8°{À8¡î’¸¡î’¸½þÂ8½þÂ8Çw�¸Çw�¸ŸsÅ8ŸsÅ8MޏMޏ ÙÇ8 ÙÇ8y¶‹¸y¶‹¸{1Ê8{1Ê8 g‰¸ g‰¸ÈƒÌ8ȃÌ8[‡¸[‡¸ÖÎ8ÖÎ81΄¸1΄¸ %Ñ8 %Ñ8߇‚¸ß‡‚¸ulÓ8ulÓ8ÑJ€¸ÑJ€¸”©Õ8”©Õ8ø0|¸ø0|¸ÕÛ×8ÕÛ×8»áw¸»áw¸ÊÚ8ÊÚ8Ž s¸Ž s¸¸(Ü8¸(Ü8ho¸ho¸HÞ8HÞ8˜8k¸˜8k¸^dà8^dà8` g¸` g¸€â8€â8`äb¸`äb¸Ä–ä8Ä–ä8åÇ^¸åÇ^¸¥¦æ8¥¦æ8›½Z¸›½Z¸^¬è8^¬è8qÇV¸qÇV¸‘©ê8‘©ê8ÁÝR¸ÁÝR¸­¢ì8­¢ì8túN¸túN¸S˜î8S˜î8f K¸f K¸Pˆð8Pˆð8)SG¸)SG¸%qò8%qò8#—C¸#—C¸COô8COô8Öõ?¸Öõ?¸Eö8Eö8r<¸r<¸¬à÷8¬à÷89¸9¸Ÿ˜ù8Ÿ˜ù8"¬5¸"¬5¸\Eû8\Eû8Di2¸Di2¸îçü8îçü8?=/¸?=/¸¯}þ8¯}þ8u,,¸u,,¸Š9Š9ï:)¸ï:)¸Ô½9Ô½9\l&¸\l&¸Žp9Žp9À#¸À#¸6969]9!¸]9!¸»9»9MÒ¸MÒ¸®T9®T9•†¸•†¸”ç9”ç9…X¸…X¸ëq9ëq9P¸P¸~ò9~ò9bq¸bq¸ãg9ãg9¶¿¸¶¿¸‘Ò9‘Ò9K7¸K7¸“39“39ѸѸe�9e�9 „¸ „¸òà9òà9�R¸�R¸E-9E-9£>¸£>¸²q9²q9£M ¸£M ¸ï¬9ï¬9û� ¸û� ¸óÞ9óÞ9Ú ¸Ú ¸´9´99O ¸9O ¸B,9B,9wÛ ¸wÛ ¸àI9àI9 ¸ ¸ b9 b9Ü3 ¸Ü3 ¸sv9sv9 ¸ ¸.„9.„9Sæ ¸Sæ ¸�Š9�Š9cë ¸cë ¸Ñ‰9щ9 ¸ ¸�ƒ9�ƒ9»: ¸»: ¸Äy9Äy9w ¸w ¸+m9+m9¿ ¸¿ ¸Ñ]9Ñ]9! ¸! ¸�J9�J9{ ¸{ ¸¯19¯19aû ¸aû ¸|9|9g” ¸g” ¸¯í9¯í9 B ¸ B ¸Ä9Ä9ä¸ä¸w–9w–9Ñ͸Ñ͸pf9pf9ÿ¥¸ÿ¥¸529529’‘¸’‘¸4ù94ù9¹�¸¹�¸Óº9Óº9¯§¸¯§¸òu9òu9ºÛ¸ºÛ¸‰)9‰)9�*¸�*¸ù×9ù×9Û‰¸Û‰¸§‚9§‚9ø¸ø¸Ž)9Ž)91w¸1w¸~Ë9~Ë9¸¸„f9„f9eĸeĸ-ù9-ù9T›¸T›¸ˆ„9ˆ„9ªŒ ¸ªŒ ¸µ 9µ 9ñ•"¸ñ•"¸‰9‰9cµ$¸cµ$¸8989”ê&¸”ê&¸‰w9‰w9ø8)¸ø8)¸ å9 å9¤+¸¤+¸bK9bK9,.¸,.¸¸Tÿ8¸Tÿ8³Ñ0¸³Ñ0¸|þ8|þ8­‘3¸­‘3¸z¨ü8z¨ü8dg6¸dg6¸Bû8Bû8ÓQ9¸ÓQ9¸WÑù8WÑù8¥P<¸¥P<¸{Vø8{Vø81e?¸1e?¸°Ïö8°Ïö8“B¸“B¸Å<õ8Å<õ8sÖE¸sÖE¸¤ ó8¤ ó8ð*I¸ð*I¸Füñ8Füñ80�L¸0�L¸ÓPð8ÓPð8¹ÿO¸¹ÿO¸ÊŸî8ÊŸî8Ä|S¸Ä|S¸»çì8»çì87W¸7W¸Õ(ë8Õ(ë8P Z¸P Z¸tdé8tdé8ÞB^¸ÞB^¸Íšç8Íšç8Eïa¸Eïa¸8Íå88Íå8ñ¡e¸ñ¡e¸�ýã8�ýã8¶Vi¸¶Vi¸2-â82-â8am¸am¸ªZà8ªZà8nÊp¸nÊp¸b†Þ8b†Þ8ƒŠt¸ƒŠt¸¿¯Ü8¿¯Ü8ŽNx¸ŽNx¸’ØÚ8’ØÚ81|¸1|¸�Ù8�Ù8ÉѸÉѸÂ-×8Â-×8È�¸È�¸ØYÕ8ØYÕ8¦ƒ¸¦ƒ¸+ˆÓ8+ˆÓ8¦�…¸¦�…¸¸Ñ8¸Ñ8p\‡¸p\‡¸µèÏ8µèÏ8L6‰¸L6‰¸Î8Î8‹¸‹¸OÌ8OÌ8È䌸È䌸}„Ê8}„Ê8v¹Ž¸v¹Ž¸R¼È8R¼È8Ù‹�¸Ù‹�¸ öÆ8 öÆ8Û\’¸Û\’¸z1Å8z1Å8q+”¸q+”¸pÃ8pÃ8çö•¸çö•¸‹±Á8‹±Á8R¿—¸R¿—¸¼ö¿8¼ö¿8_„™¸_„™¸>¾8>¾8äG›¸äG›¸v‡¼8v‡¼8p �¸p �¸kÒº8kÒº8&Éž¸&Éž¸W ¹8W ¹8_… ¸_… ¸“q·8“q·8s>¢¸s>¢¸]Ƶ8]Ƶ8ô£¸ô£¸$´8$´8D§¥¸D§¥¸ x²8 x²8pX§¸pX§¸'Ô°8'Ô°8®©¸®©¸î1¯8î1¯87µª¸7µª¸ò‘­8ò‘­8`¬¸`¬¸•õ«8•õ«8<®¸<®¸{^ª8{^ª8f§¯¸f§¯¸æË¨8æË¨8žD±¸žD±¸=§8=§8™Þ²¸™Þ²¸±¥8±¥8Ÿu´¸Ÿu´¸8(¤88(¤8í ¶¸í ¶¸•¢¢8•¢¢8�™·¸�™·¸É"¡8É"¡8k#¹¸k#¹¸‰¨Ÿ8‰¨Ÿ8Ù§º¸Ù§º¸ý3ž8ý3ž8�&¼¸�&¼¸&Åœ8&Åœ82Ÿ½¸2Ÿ½¸0]›80]›8濸濸§û™8§û™8Ä|À¸Ä|À¸ ˜8 ˜8YâÁ¸YâÁ¸)K—8)K—8AøAøœý•8œý•8˜Ä¸˜Ä¸¸”8¸”8“æÅ¸“æÅ¸è{“8è{“8Z+ǸZ+Ǹ^I’8^I’8OgȸOgȸã‘8ã‘8�›É¸�›É¸^ü�8^ü�8©Çʸ©ÇʸUâŽ8UâŽ8;ë˸;ë˸žÐ�8žÐ�8Â͸Â͸MÇŒ8MÇŒ8�θ�θðÆ‹8ðÆ‹8L#ϸL#ϸЊ8Њ8(#и(#и¦ã‰8¦ã‰8AѸAѸü‰8ü‰8BÒ¸BÒ¸Ù)ˆ8Ù)ˆ8HåÒ¸HåÒ¸KZ‡8KZ‡8¿Ó¸¿Ó¸&“†8&“†8a�Ô¸a�Ô¸™Ô…8™Ô…8¯XÕ¸¯XÕ¸Ù…8Ù…8¿Ö¸¿Ö¸æu„8æu„8‰ÉÖ¸‰ÉÖ¸¢×ƒ8¢×ƒ8»p׸»p׸‰Dƒ8‰Dƒ8à Ø¸à ظ@º‚8@º‚8k£Ø¸k£Ø¸ü6‚8ü6‚8Ù1Ù¸Ù1ٸǻ�8Ç»�8Œ·Ù¸Œ·Ù¸žI�8žI�8Þ3Ú¸Þ3Ú¸Ÿá€8Ÿá€8±¥Ú¸±¥Ú¸L„€8L„€8Ý Û¸Ý Û¸/1€8/1€8kÛ¸kÛ¸'Ì8'Ì8£ÁÛ¸£ÁÛ¸|E8|E8ïܸïܸ Ì~8 Ì~8ZܸZܸi_~8i_~8AœÜ¸AœÜ¸Ú~8Ú~8ÿÔܸÿÔܸž»}8ž»}8ݸݸ`ˆ}8`ˆ}8ü'ݸü'ݸ!g}8!g}8÷ܸ>÷ܸ¢W8¢W82Éܸ2Éܸ‚Ü8‚Ü8¥“ܸ¥“ܸ�8€8�8€8ÎUܸÎUܸ‚‹€8‚‹€8XܸXܸç€8ç€8?ÀÛ¸?ÀÛ¸|K�8|K�8îhÛ¸îhÛ¸·�8·�8¤ Û¸¤ Û¸>(‚8>(‚8~¨Ú¸~¨Ú¸�Ÿ‚8�Ÿ‚8;?Ú¸;?Ú¸{ƒ8{ƒ8ïÎÙ¸ïÎٸ٢ƒ8Ù¢ƒ83WÙ¸3WÙ¸ÿ/„8ÿ/„8*ר¸*ר¸ Å„8 Å„8jOظjOظ?b…8?b…8Á׸Á׸´†8´†8þ+׸þ+׸e¯†8e¯†81‘Ö¸1‘Ö¸ê^‡8ê^‡8jðÕ¸jðÕ¸çˆ8çˆ8ÌHÕ¸ÌHÕ¸Öш8Öш8͚Ը͚Ըö”‰8ö”‰8GæÓ¸GæÓ¸9_Š89_Š8ª*Ó¸ª*Ó¸C0‹8C0‹8íhÒ¸íhÒ¸ÙŒ8ÙŒ8W¢Ñ¸W¢Ñ¸ïáŒ8ïáŒ8‡×и‡×иjÁ�8jÁ�8&и&иΥŽ8Î¥Ž8j3ϸj3ϸ{��8{��8XθXθ\��8\��8Nw͸Nw͸mw‘8mw‘8¹‘̸¹‘̸Ìq’8Ìq’8”¨Ë¸”¨Ë¸No“8No“8°¼Ê¸°¼Ê¸¦o”8¦o”8ÌÍɸÌÍɸcs•8cs•8(Ûȸ(Ûȸq{–8q{–8äǸäǸև—8Ö‡—8úèÆ¸úèÆ¸4˜˜84˜˜8\êŸ\ꟕ«™8•«™8éĸéĸŸÀš8ŸÀš8CçøCçøëÖ›8ëÖ›8Ýâ¸Ý⸛ìœ8›ìœ8 ÙÁ¸ ÙÁ¸>ž8>ž8SÉÀ¸SÉÀ¸|Ÿ8|Ÿ8³¿¸³¿¸ˆ) 8ˆ) 8€–¾¸€–¾¸=¡8=¡8`t½¸`t½¸iN¢8iN¢8…N¼¸…N¼¸Q\£8Q\£8Ð%»¸Ð%»¸zf¤8zf¤8~ù¹¸~ù¹¸bn¥8bn¥8Bȸ¸Bȸ¸åt¦8åt¦8h‘·¸h‘·¸…z§8…z§8øT¶¸øT¶¸�~¨8�~¨8µ¸µ¸Ã©8é8-г¸-г¸±|ª8±|ª8¸ï‰²¸‹u«8‹u«8A±¸A±¸šj¬8šj¬8êô¯¸êô¯¸Ä\­8Ä\­8Õ¤®¸Õ¤®¸oL®8oL®8vP­¸vP­¸Î9¯8Î9¯8ø«¸ø«¸:$°8:$°8~œª¸~œª¸À ±8À ±8Ù>©¸Ù>©¸_ì±8_ì±8ßß§¸ßß§¸¡È²8¡È²8ަ¸Ž¦¸0 ³80 ³8Ø¥¸Ø¥¸[t´8[t´8y¶£¸y¶£¸·Eµ8·Eµ8"M¢¸"M¢¸É¶8ɶ8⠸⠸àÚ¶8àÚ¶8 vŸ¸ vŸ¸�·8�·8› ž¸› ž¸:Y¸8:Y¸8/�œ¸/�œ¸¹8¹80›¸0›¸²¿¹8²¿¹8úÁ™¸úÁ™¸Ïjº8Ïjº8*S˜¸*S˜¸»8»8eã–¸eã–¸§°»8§°»8ks•¸ks•¸:J¼8:J¼8w”¸w”¸ñÛ¼8ñÛ¼8——’¸——’¸`e½8`e½8Â,‘¸Â,‘¸Äæ½8Äæ½8¨Ã�¸¨Ã�¸“`¾8“`¾8ß[ޏß[ޏÓ¾8Ó¾8võŒ¸võŒ¸>¿8>¿8¼�‹¸¼�‹¸ß ¿8ß ¿8Ó.ЏÓ.Џ{ú¿8{ú¿8oЈ¸oЈ¸LJÀ8LJÀ8[v‡¸[v‡¸�À8�À8¡ÌÀ8¡ÌÀ8ÏÌ„¸ÏÌ„¸=Á8=Á8‘|ƒ¸‘|ƒ¸�+Á8�+Á8û.‚¸û.‚¸éMÁ8éMÁ87倸7倸SfÁ8SfÁ8i@¸i@¸tÁ8tÁ8¢À|¸¢À|¸:wÁ8:wÁ8«Jz¸«Jz¸ËoÁ8ËoÁ8ÏÞw¸ÏÞw¸E^Á8E^Á8/{u¸/{u¸zCÁ8zCÁ8Gs¸Gs¸9Á89Á8ÔËp¸ÔËp¸rñÀ8rñÀ8s€n¸s€n¸JºÀ8JºÀ8'>l¸'>l¸ÈxÀ8ÈxÀ8–j¸–j¸õ,À8õ,À8dØg¸dØg¸“׿8“׿8ɲe¸É²e¸y¿8y¿83•c¸3•c¸W¿8W¿8¨a¸¨a¸Ê ¾8Ê ¾8þq_¸þq_¸.'¾8.'¾8Im]¸Im]¸ç£½8磽8Hr[¸Hr[¸%½8%½8v€Y¸v€Y¸�¼8�¼8´—W¸´—W¸ìá»8ìá»8Ö¶U¸Ö¶U¸x:»8x:»8(ÝS¸(ÝS¸ýŠº8ýŠº8S R¸S R¸lÓ¹8lÓ¹8÷>P¸÷>P¸}¹8}¹8|N¸|N¸ J¸8 J¸8hÂL¸hÂL¸ìx·8ìx·8BK¸BK¸üž¶8üž¶8†gI¸†gI¸S½µ8S½µ8¤ÄG¸¤ÄG¸?Ô´8?Ô´8æ'F¸æ'F¸øã³8øã³86’D¸6’D¸Éë²8Éë²8TC¸TC¸îë±8îë±8È}A¸È}A¸uä°8uä°8ãþ?¸ãþ?¸KÕ¯8KÕ¯8“‡>¸“‡>¸ö¾®8ö¾®8=¸=¸b¢­8b¢­8•©;¸•©;¸®¬8®¬86B:¸6B:¸°V«8°V«8êà8¸êà8¸î&ª8î&ª8À†7¸À†7¸þï¨8þï¨846¸46¸<²§8<²§8¾ç4¸¾ç4¸qn¦8qn¦8X 3¸X 3¸#%¥8#%¥8|]2¸|]2¸“Ö£8“Ö£8›1¸›1¸ü‚¢8ü‚¢8ä/¸ä/¸ *¡8 *¡8£®.¸£®.¸†ËŸ8†ËŸ8ä~-¸ä~-¸Mgž8Mgž8´T,¸´T,¸½ýœ8½ýœ8B/+¸B/+¸}�›8}�›8÷ *¸÷ *¸cš8cš8#í(¸#í(¸z§˜8z§˜8ãÏ'¸ãÏ'¸É-—8É-—8ȵ&¸Èµ&¸ò¯•8ò¯•8{Ÿ%¸{Ÿ%¸Õ-”8Õ-”8C�$¸C�$¸�§’8�§’8Š~#¸Š~#¸»‘8»‘8r"¸r"¸ö��8ö��8ÿf!¸ÿf!¸¯Ž8¯Ž8ä\ ¸ä\ ¸ÛoŒ8ÛoŒ8³T¸³T¸ÛŠ8ÛŠ8ÏN¸ÏN¸mC‰8mC‰8sK¸sK¸ë¨‡8먇8J¸J¸ÿ †8ÿ †81J¸1J¸ól„8ól„8WK¸WK¸Ì‚8Ì‚8WM¸WM¸m)�8m)�8(P¸(P¸E 8E 8øS¸øS¸P¾{8P¾{8šX¸šX¸•ox8•ox8Ì]¸Ì]¸bu8bu8Xc¸Xc¸Ëq8Ëq87É>7ON·ON·¶k87¶k870wH·0wH·è,27è,27S©B·S©B·! ,7! ,7Dæ<·Dæ<·% &7% &7Õ.7·Õ.7·—# 7—# 7©ƒ1·©ƒ1·£[7£[7å+·å+·V±7V±7vS&·vS&·©$7©$7yÏ ·yÏ ·tµ 7tµ 7úY·úY·c7c7ô·ô·Zþ6Zþ6§ž·§ž·æ%ô6æ%ô6BZ ·BZ ·*ê6*ê6,'·,'·«fà6«fà6Ó·Ó·ÄÛÖ6ÄÛÖ6eí÷¶eí÷¶óˆÍ6óˆÍ6õí¶õí¶¿mÄ6¿mÄ6ã#ä¶ã#ä¶€‰»6€‰»6o{Ú¶o{Ú¶ÃÛ²6ÃÛ²6ÿüжÿüж7dª67dª6I©Ç¶I©Ç¶ #¢6 #¢60�¾¶0�¾¶#š6#š6n…µ¶n…µ¶•C’6•C’6í¶¬¶í¶¬¶¥Š6¥Š6Ф¶Ð¤¶B<ƒ6B<ƒ6/¦›¶/¦›¶Šx6Šx64f“¶4f“¶xj6xj6ßW‹¶ßW‹¶ �\6 �\6ó{ƒ¶ó{ƒ¶=WO6=WO6M¦w¶M¦w¶!—B6!—B6A¼h¶A¼h¶˜@66˜@66n;Z¶n;Z¶[S*6[S*6Œ%L¶Œ%L¶ÁÎ6ÁÎ6¤|>¶¤|>¶;²6;²6vB1¶vB1¶bý6bý6‘x$¶‘x$¶û_ý5û_ý5F ¶F ¶W”é5W”é5¦: ¶¦: ¶¾—Ö5¾—Ö5 ɶ ɶâiÄ5âiÄ5ƒ™ëµƒ™ëµP ³5P ³5hŽÖµhŽÖµwx¢5wx¢5csµcsµø³’5ø³’5ýJ¯µýJ¯µu¼ƒ5u¼ƒ5~�µ~�µÊ#k5Ê#k5ØÚ‹µØÚ‹µìhP5ìhP5h-wµh-wµôH75ôH75…™Xµ…™Xµ Ä5 Ä5Åý;µÅý;µÚ 5Ú 5ñ]!µñ]!µ›ë4›ë4S½µS½µš­Å4š­Å4‰=ä´‰=ä´H}£4H}£4q »´q »´~†„4~†„4äâ•´äâ•´€•Q4€•Q4(�i´(�i´ò– 4ò– 4¼¡/´¼¡/´÷(ì3÷(ì33·û³3·û³È"¤3È"¤3Ò¤¨³Ò¤¨³gDR3gDR3¶3L³¶3L³j¾ì2j¾ì2 ‡Ð² ‡Ð²AœR2AœR2h@²h@² ÈR1 ÈR1$¦…°$¦…°././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/BinauralDecoder/Source/EQ/Beyerdynamic-DT250.wavIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/BinauralDecoder/Source/EQ/Beyerdynam0000664002537200253720000004013015257173642031437 0ustar zmoelnigzmoelnigRIFFP@WAVEfmt €»Ü factPEAKàc Y{ßH?{ßH?data@{ßH?{ßH?B’Z¾B’Z¾­}¾­}¾Ú÷ž½Ú÷ž½V¾V¾Öä¼Öä¼S,ñ=S,ñ=Þ²'>Þ²'>ižÒ¼ižÒ¼MVv½MVv½µŽ¼¼µŽ¼¼Ëb'=Ëb'=@¼@¼©š!½©š!½Ìq ½Ìq ½çY :çY :ÅÉ4=ÅÉ4=4ž�=4ž�=Ñ3=Ñ3=Ùj/½Ùj/½ÚI®½ÚI®½S¯P½S¯P½Ÿ<Ÿ<•è,=•è,=Já=Já=ùVV<ùVV*,:>*,:é$:é$:„l :„l :`:`:^ž#:^ž#:žu,:žu,:%y5:%y5:‹ô::‹ô::�­A:�­A:“:>“:¦’:¦’:8Z’:8Z’:YÕ‘:YÕ‘:ƒ\‘:ƒ\‘:z�:z�:‡«�:‡«�:»Ž:»Ž:¤Ž:¤Ž:Gg�:Gg�:líŒ:líŒ:�$Œ:�$Œ:&O‹:&O‹:+$Š:+$Š:•.‰:•.‰: ˆ: ˆ:> ‡:> ‡:Q†:Q†:@…:@…:|9„:|9„:U€ƒ:U€ƒ:{Í‚:{Í‚:ho‚:ho‚:†à�:†à�:ßx�:ßx�:àã€:àã€: ¢€: ¢€:{r€:{r€:¬¿€:¬¿€:T �:T �:â‹�:â‹�:£à�:£à�:ˆ‚:ˆ‚:±<ƒ:±<ƒ:Þ[„:Þ[„:Ib…:Ib…:¼ž†:¼ž†:�·‡:�·‡:ä‰:ä‰:BƒŠ:BƒŠ:ÄBŒ:ÄBŒ:�Û�:�Û�:€��:€��:Qÿ�:Qÿ�:t´’:t´’:[R”:[R”:Æ.–:Æ.–:áÞ—:áÞ—:ñµ™:ñµ™:_<›:_<›:ÑÔœ:ÑÔœ:*ž:*ž:U›Ÿ:U›Ÿ:ò¼ :ò¼ :ø¡:ø¡:—ö¢:—ö¢:²¤:²¤:�þ¤:�þ¤:Íö¥:Íö¥:ì’¦:ì’¦:-§:-§:mk§:mk§:fħ:fħ:ùã§:ùã§:j'¨:j'¨:þ"¨:þ"¨:(?¨:(?¨:þ!¨:þ!¨:6*¨:6*¨:Wî§:Wî§:(̧:(̧:Û^§:Û^§:{§:{§:[“¦:[“¦:\¦:\¦:Þ¦:Þ¦:Lì¥:Lì¥:‹œ¥:‹œ¥:»v¥:»v¥:Z¥:Z¥:Úæ¤:Úæ¤:²�¤:²�¤:ï~¤:ï~¤:ÑJ¤:ÑJ¤:jT¤:jT¤:>¤:>¤:´i¤:´i¤:Ym¤:Ym¤:¥¤:¥¤:=¬¤:=¬¤:4ã¤:4ã¤:,è¤:,è¤:¸'¥:¸'¥:qH¥:qH¥:ƨ¥:ƨ¥:cߥ:cߥ:uJ¦:uJ¦:ú}¦:ú}¦:ÙÓ¦:ÙÓ¦:î¦:î¦:j5§:j5§:±E§:±E§:性:性:Mˆ§:Mˆ§:ƒ¿§:ƒ¿§:žÃ§:žÃ§:‰õ§:‰õ§:6ì§:6ì§:W¨:W¨:áØ§:áØ§:“Ò§:“Ò§:ã�§:ã�§:jm§:jm§:w§:w§:;è¦:;è¦:õЦ:õЦ:…[¦:…[¦:Ìð¥:Ìð¥:d§¥:d§¥:�¥:�¥:õĤ:õĤ:-9¤:-9¤:¼Ü£:¼Ü£:?J£:?J£:“â¢:“â¢:F¢:F¢:[Ü¡:[Ü¡:pB¡:pB¡:pÖ :pÖ :à5 :à5 :>ÆŸ:>ÆŸ:ý(Ÿ:ý(Ÿ:PÆž:PÆž:°;ž:°;ž:©á�:©á�:~M�:~M�: åœ: åœ:£Oœ:£Oœ:ñ›:ñ›:Äi›:Äi›:›:›:`›š:`›š:¯Oš:¯Oš:MÚ™:MÚ™:¤ž™:¤ž™:À1™:À1™:+ð˜:+ð˜:Äy˜:Äy˜:à6˜:à6˜:Ê—:Ê—:6š—:6š—:$D—:$D—:¿%—:¿%—:×–:×–:†·–:†·–:°d–:°d–:‰C–:‰C–:Ÿó•:Ÿó•:…Ù•:…Ù•:”•:”•:Ø…•:Ø…•:ŽJ•:ŽJ•:‚E•:‚E•:å•:å•:í•:í•:\ã”:\ã”:+ß”:+ß”:嬔:嬔:9±”:9±”:抔:抔:h�”:h�”:õ�”:õ�”:y—”:y—”:ä|”:ä|”:Œ—”:Œ—”:b‚”:b‚”:✔:✔:Ò„”:Ò„”:¡”:¡”:+“”:+“”:m¿”:m¿”:ÎÀ”:ÎÀ”:Rô”:Rô”:œñ”:œñ”:µ•:µ•:â•:â•:ÐK•:ÐK•:¦O•:¦O•:郕:郕:¹…•:¹…•:šº•:šº•:!•:!•:¡ÿ•:¡ÿ•:Ç –:Ç –:mF–:mF–:žF–:žF–:™�:>™�:?J�:?J�:‰Ê€:‰Ê€:º~€:º~€:q€:q€: z: z:*Œ~:*Œ~:b~:b~:±}:±}:À„|:À„|:¾—{:¾—{:˜{:˜{:ð,z:ð,z:·®y:·®y:gÎx:gÎx:OSx:OSx:°uw:°uw:[þv:[þv:R#v:R#v:J¬u:J¬u:îÒt:îÒt:{at:{at:÷Žs:÷Žs:G#s:G#s:ìUr:ìUr:Çïq:Çïq:Q(q:Q(q:HÇp:HÇp:�p:�p:%¢o:%¢o:¶Ýn:¶Ýn:¤€n:¤€n:}Äm:}Äm:³pm:³pm:¹l:¹l:ƒel:ƒel:Þ®k:Þ®k:&_k:&_k:­j:­j:Raj:Raj:ô±i:ô±i:›fi:›fi:·h:·h:jnh:jnh:"Ãg:"Ãg:{g:{g:òËf:òËf:of:of:«Ìe:«Ìe:ø}e:ø}e: Ìd: Ìd:Çd:Çd:ÃÍc:ÃÍc:‘~c:‘~c:æÈb:æÈb:~ub:~ub:‡ºa:‡ºa:Åaa:Åaa:Ü¡`:Ü¡`:ID`:ID`:†€_:†€_:W!_:W!_:�]^:�]^:qþ]:qþ]:}8]:}8]:wÓ\:wÓ\:–\:–\:š[:š[:~ÈZ:~ÈZ:½[Z:½[Z:á‰Y:á‰Y:�Y:�Y:zFX:zFX:ˆÕW:ˆÕW:OÿV:OÿV:€ŒV:€ŒV:ƱU:ƱU:Í8U:Í8U:ƒXT:ƒXT:.ÝS:.ÝS:±þR:±þR:X†R:X†R:0§Q:0§Q:Á)Q:Á)Q:ZDP:ZDP:FÂO:FÂO:dÚN:dÚN:3WN:3WN:êlM:êlM:æäL:æäL:öK:öK:ÙkK:ÙkK:pzJ:pzJ:ëI:ëI:óH:óH:Ô\H:Ô\H:É^G:É^G:ÛÄF:ÛÄF:[ÄE:[ÄE:­&E:­&E:n D:n D:R|C:R|C:pB:pB:’ÆA:’ÆA:gµ@:gµ@:]@:]@:�ñ>:�ñ>:È>>:È>>:Ã$=:Ã$=:†o<:†o<:YT;:YT;:Õœ::Õœ::‰|9:‰|9:­¾8:­¾8:™™7:™™7:ìÙ6:ìÙ6:¼µ5:¼µ5:Mø4:Mø4:íÔ3:íÔ3:v3:v3:\ï1:\ï1:1/1:1/1:à 0:à 0:"J/:"J/:Ó$.:Ó$.:e-:e-:ö?,:ö?,:n‚+:n‚+:Nb*:Nb*:�ª):�ª):(�(:(�(:OÔ':OÔ':×´&:×´&:˜û%:˜û%:ìÝ$:ìÝ$:W($:W($:ù#:ù#:³\":³\":ŸE!:ŸE!:[– :[– :ß‚:ß‚:¾Õ:¾Õ::Â::Â: : :É:É:¥V:¥V:äG:äG:©¡:©¡:×–:×–:’ò:’ò:“è:“è:nE:nE:à<:à<:š:š:¦’:¦’:¹ñ:¹ñ:�ì:�ì:.P:.P:»O:»O:‡¶:‡¶:d¶:d¶:Ì:Ì: : :… :… :¤‰ :¤‰ :ïõ :ïõ :+ý :+ý :Úk :Úk :Cu:Cu:ç:ç:Eô:Eô:Þh:Þh:–w:–w:7î:7î:O:O:{:{:Ô‘:Ô‘:5:5:ç*:ç*:v«:v«:hŒÿ9hŒÿ9:’þ9:’þ9ÈÎü9ÈÎü9ŸÜû9ŸÜû9G ú9G ú9‹3ù9‹3ù9S{÷9S{÷9Ç’ö9Ç’ö9ˆßô9ˆßô9Æüó9Æüó9ÉNò9ÉNò9Äoñ9Äoñ9›Äï9›Äï9téî9téî9MCí9MCí99mì99mì9LËê9LËê9õ÷é9õ÷é9ËVè9ËVè9˜„ç9˜„ç9Ñæå9Ñæå9Îå9Îå9|~ã9|~ã9¦´â9¦´â9Xá9Xá9Zà9Zà9ØÇÞ9ØÇÞ9ƒÞ9ƒÞ9ïoÜ9ïoÜ9«Û9«Û9ÍÚ9ÍÚ9\Ù9\Ù9ÇÑ×9ÇÑ×9˜×9˜×9 �Õ9 �Õ9½×Ô9½×Ô9'RÓ9'RÓ9Ó›Ò9Ó›Ò9|Ñ9|Ñ9Ú^Ð9Ú^Ð9ÙÎ9ÙÎ97$Î97$Î9q£Ì9q£Ì9ÑóË9ÑóË9¾vÊ9¾vÊ9KÈÉ9KÈÉ9§9s>§9ÙÈ¥9ÙÈ¥9Š$¥9Š$¥9€°£9€°£9 £9 £9Ëš¡9Ëš¡9Žú 9Žú 9+‹Ÿ9+‹Ÿ9}ìž9}ìž9�}�9�}�96ßœ96ßœ9îq›9îq›9úך9úך9Ep™9Ep™9(Ú˜9(Ú˜9|s—9|s—9ÜÝ–9ÜÝ–9Fy•9Fy•9…ç”9…ç”9¢†“9¢†“9d÷’9d÷’9Q˜‘9Q˜‘9m ‘9m ‘9T¯�9T¯�9×%�9×%�9^Ì�9^Ì�9�C�9�C�9…é‹9…é‹9Óa‹9Óa‹9 Š9 Š9߆‰9߆‰9¶2ˆ9¶2ˆ9_°‡9_°‡9.\†9.\†9�Ø…9�Ø…9>„„9>„„9"„9"„9Ë®‚9Ë®‚9ÿ,‚9ÿ,‚9jÚ€9jÚ€9RZ€9RZ€9~9~9x}9x}9þvz9þvz9yy9yy9ìÕv9ìÕv9„Öu9„Öu95s95s9+9r9+9r9I›o9I›o9t¢n9t¢n9?l9?l9Ìk9Ìk9rth9rth9üg9üg9Ôèd9Ôèd9göc9göc99_a99_a9Úm`9Úm`9ÌÚ]9ÌÚ]9Sï\9Sï\9 aZ9 aZ9 zY9 zY9nïV9nïV9‡ V9‡ V9yƒS9yƒS9x¤R9x¤R93!P93!P9ZCO9ZCO9½ÀL9½ÀL95åK95åK9�fI9�fI9Ù�H9Ù�H9ÖF9ÖF9yEE9yEE9“ÍB9“ÍB9âüA9âüA9ʇ?9ʇ?9šº>9šº>9 H<9 H<9{;9{;9L99L99à889à889åÇ59åÇ59ô59ô59ö”29ö”29(Ï19(Ï19‡`/9‡`/97˜.97˜.9è),9è),9ud+9ud+9Rø(9Rø(9É2(9É2(9èÄ%9èÄ%9ÿ$9ÿ$9(“"9(“"9¢Ð!9¢Ð!9Üf9Üf9I¤9I¤9j89j89és9és9é9é9qE9qE9UÛ9UÛ9±9±9ʯ9ʯ9øî9øî9—…9—…9„Ä9„Ä9ÍY 9ÍY 9:— 9:— 9�+ 9�+ 9ói9ói9Í9Í9´A9´A9ºØ9ºØ9q9q9p\ÿ8p\ÿ8�Úý8�Úý8¨ù8¨ù8¯ƒ÷8¯ƒ÷8±ò8±ò8%4ñ8%4ñ8Oeì8Oeì8õîê8õîê8Ñ'æ8Ñ'æ8�¶ä8�¶ä8Iðß8Iðß8^~Þ8^~Þ8�¶Ù8�¶Ù8FØ8FØ8C†Ó8C†Ó8($Ò8($Ò8ëpÍ8ëpÍ8˜Ì8˜Ì8eÇ8eÇ8Ü Æ8Ü Æ8ÃaÁ8ÃaÁ8cÀ8cÀ8Éo»8Éo»8°&º8°&º8‚ˆµ8‚ˆµ8%F´8%F´8˜²¯8˜²¯8/}®8/}®8tò©8tò©8•À¨8•À¨8 8¤8 8¤8 £8 £8Œž8Œž8gj�8gj�8 õ˜8 õ˜8ÎÜ—8ÎÜ—8fm“8fm“8øZ’8øZ’8µñ�8µñ�8ÔãŒ8ÔãŒ8}ˆ8}ˆ8?u‡8?u‡8ƒ8ƒ8ø‚8ø‚8ʼn{8ʼn{8žy8žy8ßÿp8ßÿp8‰o8‰o8}‹f8}‹f8|¸d8|¸d81\81\8øfZ8øfZ8§ëQ8§ëQ8š4P8š4P80ÏG80ÏG8z-F8z-F8òÖ=8òÖ=8ò><8ò><8>ï38>ï38‰a28‰a28ê *8ê *8Ц(8Ц(8x 8x 888Æ÷8Æ÷8M¦8M¦8,� 8,� 8)Z 8)Z 8a8a8w/8w/8ߊö7ߊö7ÎIô7ÎIô7Mšä7Mšä7Q€â7Q€â7øúÒ7øúÒ7»Ñ7»Ñ7n­Á7n­Á7)Ú¿7)Ú¿7?ް7?ް7ÂØ®7ÂØ®7Y«Ÿ7Y«Ÿ7Qž7Qž7Ë �7Ë �7þ™�7þ™�77S}77S}7"—z7"—z7È\7È\7ÄZ7ÄZ7›k<7›k<7kþ97kþ97t™7t™7åp7åp7®iú6®iú6ÓHö6ÓHö6õ»6õ»6Џ6Џ6­ü{6­ü{6œ°t6œ°t6ÊÜ6ÊÜ6ô5ô5nÞ3nÞ3ô:«2ô:«2fðàµfðàµDqêµDqêµBÛf¶BÛf¶†¿k¶†¿k¶�¬®¶�¬®¶×ð¶×ð¶Ÿé¶Ÿé¶ü†ê¶ü†ê¶ú-·ú-·ÏÁ·ÏÁ·:|-·:|-·á×-·á×-·IcI·IcI·�I·�I·�e·�e·ÁJe·ÁJe·HY€·HY€·W€·W€·ë�·ë�·§Ë�·§Ë�·ÔN›·ÔN›·t'›·t'›·€¬¨·€¬¨·†¨·†¨·D¶·D¶·`Ôµ·`Ôµ·kO÷kO÷\÷\÷îŠÐ·îŠÐ·ØEзØEзްݷްݷ3lÝ·3lÝ·•ßê·•ßê·$§ê·$§ê·š%ø·š%ø·Oê÷·Oê÷·°¸°¸õޏõޏÆI ¸ÆI ¸ž( ¸ž( ¸¬ä¸¬ä¸AĸAĸy�¸y�¸§a¸§a¸–"¸–"¸¸¸aÊ#¸aÊ#¸&«#¸&«#¸˜h*¸˜h*¸E*¸E*¸¤1¸¤1¸å0¸å0¸[§7¸[§7¸8†7¸8†7¸4D>¸4D>¸>¸>¸Í×D¸Í×D¸­±D¸­±D¸tnK¸tnK¸üCK¸üCK¸¿ýQ¸¿ýQ¸àÑQ¸àÑQ¸…‹X¸…‹X¸ _X¸ _X¸}_¸}_¸!ã^¸!ã^¸ ‘e¸ ‘e¸¹Ve¸¹Ve¸Îl¸Îl¸ÔÑk¸ÔÑk¸s„r¸s„r¸ÞJr¸ÞJr¸ øx¸ øx¸¥¸x¸¥¸x¸vd¸vd¸×$¸×$¸h炸h炸ÎÄ‚¸ÎÄ‚¸D†¸D†¸˜ö…¸˜ö…¸­M‰¸­M‰¸T.‰¸T.‰¸ …Œ¸ …Œ¸ÆbŒ¸ÆbŒ¸v¶�¸v¶�¸³‘�¸³‘�¸#æ’¸#æ’¸ÍÃ’¸ÍÃ’¸r–¸r–¸hø•¸hø•¸áO™¸áO™¸d.™¸d.™¸¿…œ¸¿…œ¸Æbœ¸Æbœ¸³¸Ÿ¸³¸Ÿ¸ú’Ÿ¸ú’Ÿ¸K梸K梸D¿¢¸D¿¢¸¦¸¦¸Æî¥¸Æî¥¸ÛD©¸ÛD©¸}©¸}©¸Gq¬¸Gq¬¸™E¬¸™E¬¸…”¯¸…”¯¸Úf¯¸Úf¯¸�µ²¸�µ²¸Û†²¸Û†²¸\Ôµ¸\Ôµ¸¤µ¸¤µ¸€ð¸¸€ð¸¸¾¸¸¾¸¸D¼¸D¼¸éÏ»¸éÏ»¸¶¿¸¶¿¸Ú¾¸Ú¾¸%¸%¸ãÁ¸ãÁ¸&Ÿ&Ÿ?èĸ?èĸê(ȸê(ȸéǸéǸÒ(˸Ò(˸çʸçʸù#θù#θÞ͸Þ͸ѸѸÑиÑиõ Ô¸õ Ô¸œÄÓ¸œÄÓ¸oýÖ¸oýÖ¸²Ö¸²Ö¸(èÙ¸(èٸݛٸݛٸ¦Òܸ¦Òܸ­…ܸ­…ܸUºß¸Uºß¸¡i߸¡i߸g›â¸g›â¸ŠH⸊Hâ¸yå¸y帑$帑$å¸2Tè¸2Tè¸Fþç¸Fþç¸y,ë¸y,ë¸7Ôê¸7Ôê¸î¸¤í¸ˆ¤í¸ÔÍð¸ÔÍð¸ëoð¸ëoð¸—ó¸—ó¸ò5ó¸ò5ó¸+[ö¸+[ö¸2ùõ¸2ùõ¸Jù¸Jù¸Ùºø¸Ùºø¸@Þû¸@Þû¸xû¸xû¸d˜þ¸d˜þ¸!/þ¸!/þ¸-§¹-§¹ÿq¹ÿq¹@¹@¹¨Ë¹¨Ë¹ÂZ¹ÂZ¹~$¹~$¹$³¹$³¹p|¹p|¹ù ¹ù ¹ÈÓ¹ÈÓ¹Ëa¹Ëa¹ª)¹ª)¹)·¹)·¹›~¹›~¹ ¹ ¹zÓ ¹zÓ ¹a ¹a ¹É' ¹É' ¹[´ ¹[´ ¹ z ¹ z ¹�¹�¹$Ì ¹$Ì ¹~X¹~X¹q¹q¹3©¹3©¹ m¹ m¹�ø¹�ø¹C¼¹C¼¹!G¹!G¹Œ ¹Œ ¹Ú“¹Ú“¹ìU¹ìU¹ìß¹ìß¹1¡¹1¡¹š*¹š*¹ë¹ë¹ñs¹ñs¹Ò3¹Ò3¹h¼¹h¼¹`{¹`{¹þ¹þ¹äÀ¹äÀ¹!H¹!H¹Ž¹Ž¹?Œ¹?Œ¹�H¹�H¹QιQι�‰¹�‰¹Ú ¹Ú ¹æÉ¹æÉ¹O!¹O!¹·!¹·!¹ò‹"¹ò‹"¹³C"¹³C"¹'Æ#¹'Æ#¹„}#¹„}#¹%%¹%%¹&·$¹&·$¹ß8&¹ß8&¹Jî%¹Jî%¹o'¹o'¹µ#'¹µ#'¹Â£(¹Â£(¹W(¹W(¹ÚÕ)¹ÚÕ)¹æ‡)¹æ‡)¹`+¹`+¹¡¸*¹¡¸*¹â7,¹â7,¹ûé+¹ûé+¹2h-¹2h-¹Z-¹Z-¹÷”.¹÷”.¹ËC.¹ËC.¹ì¿/¹ì¿/¹\n/¹\n/¹Wê0¹Wê0¹"˜0¹"˜0¹ 2¹ 2¹ÊÀ1¹ÊÀ1¹Í;3¹Í;3¹Âç2¹Âç2¹^a4¹^a4¹€ 4¹€ 4¹Åƒ5¹Åƒ5¹á,5¹á,5¹Û¤6¹Û¤6¹RM6¹RM6¹_Ä7¹_Ä7¹!k7¹!k7¹Žà8¹Žà8¹­…8¹­…8¹ú9¹ú9¹¦�9¹¦�9¹x;¹x;¹I²:¹I²:¹À#<¹À#<¹LÄ;¹LÄ;¹Ô4=¹Ô4=¹°Ó<¹°Ó<¹B>¹B>¹[Þ=¹[Þ=¹æJ?¹æJ?¹³å>¹³å>¹OQ@¹OQ@¹•ê?¹•ê?¹YTA¹YTA¹Uë@¹Uë@¹…SB¹…SB¹éA¹éA¹åOC¹åOC¹ãB¹ãB¹€GD¹€GD¹[ØC¹[ØC¹R;E¹R;E¹6ËD¹6ËD¹q-F¹q-F¹k»E¹k»E¹IG¹IG¹­¦F¹­¦F¹tH¹tH¹¤�G¹¤�G¹¾éH¹¾éH¹qH¹qH¹€ËI¹€ËI¹ÝPI¹ÝPI¹½©J¹½©J¹O-J¹O-J¹J„K¹J„K¹NK¹NK¹ÂYL¹ÂYL¹þ×K¹þ×K¹P*M¹P*M¹�¦L¹�¦L¹d÷M¹d÷M¹ŽqM¹ŽqM¹ñ¿N¹ñ¿N¹ 7N¹ 7N¹¯‚O¹¯‚O¹÷N¹÷N¹R@P¹R@P¹Ö±O¹Ö±O¹løP¹løP¹üfP¹üfP¹ÛªQ¹ÛªQ¹¾Q¹¾Q¹lXR¹lXR¹IÁQ¹IÁQ¹qÿR¹qÿR¹~dR¹~dR¹¶ŸS¹¶ŸS¹S¹S¹X;T¹X;T¹c›S¹c›S¹ÐÑT¹ÐÑT¹:.T¹:.T¹–aU¹–aU¹5»T¹5»T¹ìU¹ìU¹ƒBU¹ƒBU¹ipV¹ipV¹ÄU¹ÄU¹ðV¹ðV¹¯AV¹¯AV¹–kW¹–kW¹lºV¹lºV¹páW¹páW¹-W¹-W¹¥QX¹¥QX¹ÎšW¹ÎšW¹ø¼X¹ø¼X¹tX¹tX¹#Y¹#Y¹¯gX¹¯gX¹w…Y¹w…Y¹ÚÆX¹ÚÆX¹òáY¹òáY¹ Y¹ Y¹,8Z¹,8Z¹csY¹csY¹"‰Z¹"‰Z¹”ÁY¹”ÁY¹ÔZ¹ÔZ¹¯ Z¹¯ Z¹[¹[¹#KZ¹#KZ¹»W[¹»W[¹ù…Z¹ù…Z¹l�[¹l�[¹4ºZ¹4ºZ¹¡À[¹¡À[¹HèZ¹HèZ¹Ñë[¹Ñë[¹[¹[¹R\¹R\¹Á0[¹Á0[¹%-\¹%-\¹�I[¹�I[¹ºB\¹ºB\¹1\[¹1\[¹îR\¹îR\¹fi[¹fi[¹]\¹]\¹¶o[¹¶o[¹È_\¹È_\¹Æn[¹Æn[¹‹[\¹‹[\¹þf[¹þf[¹£P\¹£P\¹ëX[¹ëX[¹â?\¹â?\¹/E[¹/E[¹U)\¹U)\¹c+[¹c+[¹n \¹n \¹â [¹â [¹rè[¹rè[¹ ãZ¹ ãZ¹|½[¹|½[¹ µZ¹ µZ¹ÞŒ[¹ÞŒ[¹��Z¹��Z¹’V[¹’V[¹¤GZ¹¤GZ¹õ[¹õ[¹6Z¹6Z¹?ÔZ¹?ÔZ¹¾Y¹¾Y¹&‰Z¹&‰Z¹‘oY¹‘oY¹L7Z¹L7Z¹AY¹AY¹ßY¹ßY¹œ¾X¹œ¾X¹€Y¹€Y¹ñ[X¹ñ[X¹åY¹åY¹òW¹òW¹%­X¹%­X¹Y‚W¹Y‚W¹t:X¹t:X¹" W¹" W¹ôÀW¹ôÀW¹�V¹�V¹§@W¹§@W¹† V¹† V¹^ºV¹^ºV¹‚U¹‚U¹ý-V¹ý-V¹™òT¹™òT¹À›U¹À›U¹]T¹]T¹U¹U¹õÀS¹õÀS¹dT¹dT¹+S¹+S¹ ÀS¹ ÀS¹oxR¹oxR¹·S¹·S¹ýËQ¹ýËQ¹]gR¹]gR¹‡Q¹‡Q¹,²Q¹,²Q¹*aP¹*aP¹ìöP¹ìöP¹ø¢O¹ø¢O¹T6P¹T6P¹ÊßN¹ÊßN¹ípO¹ípO¹ŒN¹ŒN¹‡¥N¹‡¥N¹cHM¹cHM¹AÓM¹AÓM¹)sL¹)sL¹©ûL¹©ûL¹þ˜K¹þ˜K¹L¹L¹P¹J¹P¹J¹Y¹ ’>¹ù>¹ù>¹‰p=¹‰p=¹ÜÕ=¹ÜÕ=¹—K<¹—K<¹i¯<¹i¯<¹(#;¹(#;¹;…;¹;…;¹÷9¹÷9¹ÇW:¹ÇW:¹ÊÇ8¹ÊÇ8¹°&9¹°&9¹…”7¹…”7¹¿ñ7¹¿ñ7¹¹]6¹¹]6¹€¹6¹€¹6¹¢#5¹¢#5¹¤}5¹¤}5¹wå3¹wå3¹¡=4¹¡=4¹�£2¹�£2¹(ú2¹(ú2¹î]1¹î]1¹†²1¹†²1¹ö0¹ö0¹žf0¹žf0¹çÅ.¹çÅ.¹ä/¹ä/¹.t-¹.t-¹]Ã-¹]Ã-¹g,¹g,¹¨k,¹¨k,¹‚Ä*¹‚Ä*¹+¹+¹ g)¹ g)¹ö°)¹ö°)¹Â(¹Â(¹ßM(¹ßM(¹Ñ &¹Ñ &¹Øç&¹Øç&¹|9%¹|9%¹;%¹;%¹èÎ#¹èÎ#¹ $¹ $¹a"¹a"¹F¤"¹F¤"¹+ñ ¹+ñ ¹o3!¹o3!¹à~¹à~¹À¹À¹‡ ¹‡ ¹;K¹;K¹””¹””¹PÔ¹PÔ¹3¹3¹çZ¹çZ¹Ï¡¹Ï¡¹Bà¹B่&¹ˆ&¹sd¹sd¹Ã©¹Ã©¹!ç¹!ç¹£+¹£+¹¤h¹¤h¹X¬¹X¬¹«è¹«è¹]+¹]+¹Tg¹Tg¹~©¹~©¹5å¹5幫&¹«&¹õa¹õa¹–¢ ¹–¢ ¹Ý ¹Ý ¹‘ ¹‘ ¹OX ¹OX ¹Í— ¹Í— ¹AÒ ¹AÒ ¹ ¹ ¹K ¹K ¹‰¹‰¹ð¹ð¹ž¹ž¹r:¹r:¹Äw¹Äw¹ð°¹ð°¹“칓ì¹t$¹t$¹m^¹m^¹è”¹è”¹·šÿ¸·šÿ¸Ã¹Ã¹ tü¸ tü¸0Ýü¸0Ýü¸ÊIù¸ÊIù¸!±ù¸!±ù¸]ö¸]ö¸È€ö¸È€ö¸éò¸éò¸¦Ló¸¦Ló¸ê²ï¸ê²ï¸íð¸íð¸ãyì¸ãyì¸þÚì¸þÚì¸W?é¸W?é¸ÚŸé¸ÚŸé¸Sæ¸Sæ¸pbæ¸pb渑Ä⸑Äâ¸�"ã¸�"㸄߸„߸Vá߸Vá߸�Bܸ�Bܸ\ŸÜ¸\ŸÜ¸€Ù¸€Ù¸Å\Ù¸Å\Ù¸ì½Õ¸ì½Õ¸°Ö¸°Ö¸‹zÒ¸‹zÒ¸`ÕÒ¸`ÕÒ¸<6ϸ<6ϸ×�ϸ×�ϸSò˸Sò˸M̸M̸v¯È¸v¯È¸7 ɸ7 ɸ0mŸ0mŸrÇŸrÇŸß*¸ß*¸´„¸´„¸ð辸ð辸5C¿¸5C¿¸]©»¸]©»¸Y¼¸Y¼¸ûk¸¸ûk¸¸,Ǹ¸,Ǹ¸;0µ¸;0µ¸—‹µ¸—‹µ¸*ö±¸*ö±¸äQ²¸äQ²¸"¾®¸"¾®¸/¯¸/¯¸¨ˆ«¸¨ˆ«¸櫸櫸ŽW¨¸ŽW¨¸¶¨¸¶¨¸Ø)¥¸Ø)¥¸µˆ¥¸µˆ¥¸Yþ¡¸Yþ¡¸^¢¸^¢¸×Öž¸×Öž¸(8Ÿ¸(8Ÿ¸4´›¸4´›¸«œ¸«œ¸·•˜¸·•˜¸jù˜¸jù˜¸¾{•¸¾{•¸¼à•¸¼à•¸Kf’¸Kf’¸…Ì’¸…Ì’¸ŒU�¸ŒU�¸O½�¸O½�¸*JŒ¸*JŒ¸…³Œ¸…³Œ¸ D‰¸ D‰¸Ö®‰¸Ö®‰¸.C†¸.C†¸l¯†¸l¯†¸¥Gƒ¸¥Gƒ¸¥µƒ¸¥µƒ¸=R€¸=R€¸€¸€¸¤Åz¸¤Åz¸�¨{¸�¨{¸|òt¸|òt¸EØu¸EØu¸{*o¸{*o¸Np¸Np¸Kni¸Kni¸9[j¸9[j¸ŽÀc¸ŽÀc¸¿±d¸¿±d¸3 ^¸3 ^¸C_¸C_¸e‹X¸e‹X¸¡‚Y¸¡‚Y¸µS¸µS¸ÿS¸ÿS¸ŠM¸ŠM¸-‰N¸-‰N¸¸H¸¸H¸™"I¸™"I¸´ÃB¸´ÃB¸jÌC¸jÌC¸åw=¸åw=¸›ƒ>¸›ƒ>¸P98¸P98¸ûI9¸ûI9¸˜ 3¸˜ 3¸B#4¸B#4¸Ùñ-¸Ùñ-¸¢ /¸¢ /¸‡æ(¸‡æ(¸g*¸g*¸?í#¸?í#¸”%¸”%¸£¸£¸–/ ¸–/ ¸/¸/¸Æ^¸Æ^¸ïk¸ïk¸¡¸¡¸Ôº¸Ôº¸ˆô¸ˆô¸– ¸– ¸ðX ¸ðX ¸:Œ¸:Œ¸-и-иà¸à¸¥Y¸¥Y¸+Ný·+Ný·=èÿ·=èÿ·œô·œô·™>÷·™>÷· ì· ì··î··î·Tžã·Tžã··Ræ··Ræ·^UÛ·^UÛ·[Þ·[Þ·0Ó·0Ó·tõÕ·tõÕ·!+Ë·!+Ë·Û÷Í·Û÷Í·‚G÷‚G÷ãÆ·ãÆ·¡‡»·¡‡»·Ie¾·Ie¾·ãê³·ãê³·½Ñ¶·½Ñ¶·rs¬·rs¬·Gb¯·Gb¯·T¥·T¥· ¨· ¨·&ç�·&ç�·Cä ·Cä ·;Ö–·;Ö–·”Ü™·”Ü™·�é�·�é�·Îõ’·Îõ’·ã‰·ã‰·–0Œ·–0Œ·ór‚·ór‚·ýŒ…·ýŒ…·ÚÒw·ÚÒw·:~·:~·]k·]k·´Qq·´Qq·!y^·!y^·žÔd·žÔd·¡-R·¡-R·ò�X·ò�X·PF·PF·Ÿ‡L·Ÿ‡L· H:· H:·®¿@·®¿@·Fµ.·Fµ.·S55·S55·)]#·)]#·’ä)·’ä)·r>·r>·RË·RË·AV ·AV ·ké·ké·w§·w§·xB ·xB ·íið¶íið¶ñ­ý¶ñ­ý¶ öÛ¶ öÛ¶Aé¶Aé¶îéǶîéǶ¿=Õ¶¿=Õ¶#L´¶#L´¶«Á¶«Á¶û¡¶û¡¶ï‡®¶ï‡®¶4a޶4a޶8Ó›¶8Ó›¶à#x¶à#x¶:Œ‰¶:Œ‰¶—[T¶—[T¶C[o¶C[o¶i1¶i1¶ÂzL¶ÂzL¶T¶T¶‚s*¶‚s*¶S*ܵS*ܵŸ; ¶Ÿ; ¶æE›µæE›µ+¬Ñµ+¬ÑµI&8µI&8µ%�’µ%�’µ/t´/t´*µ*µ€¶k4€¶k4—H´—H´Õ/5Õ/5L¢…4L¢…4Tì�5Tì�5/á45/á45)mÈ5)mÈ5Ÿð‘5Ÿð‘5îfþ5îfþ5ŸòÇ5ŸòÇ5®w6®w6/‘ü5/‘ü5z 36z 36øì6øì6–ûK6–ûK6­é06­é06顿3>¡æ3›Á3›Á3=W›3=W›3 Py3 Py3´=3´=3— 3— 3õÂ2õÂ22?|22?|2Œ 2Œ 2¢®}1¢®}1³G{0³G{0././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/BinauralDecoder/Source/EQ/Beyerdynamic-DT880.wavIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/BinauralDecoder/Source/EQ/Beyerdynam0000664002537200253720000004013015257173642031437 0ustar zmoelnigzmoelnigRIFFP@WAVEfmt €»Ü factPEAKàc YIM?IM?data@IM?IM?)Šì½)Šì½[ÛD=[ÛD= 8P= 8P=)D¾)D¾Ç¿¥½Ç¿¥½ö´¥¼ö´¥¼aW;aW;ìÁô½ìÁô½»µM½»µM½†Îß<†Îß<¤úŸ=¤úŸ=j ñú;'>ú;Ìö;Ìö;¹sD;¹sD;´ô.»´ô.»±¼»±¼»Çþª»Çþª»)Q»)Q»‚뺂ëº �°º �°ºWïºWïºîðp:îðp:^1;^1;ÜU!;ÜU!;Ý^æ:Ý^æ:,t{:,t{:ã‰:ã‰:˜<;˜<;çšD;çšD;†[;†[;}P;}P;B9;B9;l›);l›);¤z ;¤z ;BÃ:BÃ:ŽÓ9:ŽÓ9:*®9*®9Mx 9Mx 9c®Å9c®Å9Y=:Y=:¦–A:¦–A:øK:øK:—}:—}:Ne�:Ne�:¾çÀ:¾çÀ:´Ô:´Ô:ÆFï:ÆFï:kC;kC;j¢;j¢;ð;ð;¶Ì!;¶Ì!;lß;lß;¬Æ;¬Æ;þá ;þá ;ÓÎ;ÓÎ;A& ;A& ;ÔF ;ÔF ;…Î ;…Î ;vÙ ;vÙ ;îÛ;îÛ;mä;mä;Ž;Ž;M"ÿ:M"ÿ:v ò:v ò: �ï: �ï:=æ:=æ:Ò}ã:Ò}ã:¸ Ø:¸ Ø:,fÓ:,fÓ:t‚Æ:t‚Æ:å=À:å=À:TŸ±:TŸ±:n8«:n8«:BtŸ:BtŸ:/Üž:/Üž:@“›:@“›:õØ£:õØ£:yˤ:yˤ:­;«:­;«:·á¨:·á¨:[¡­:[¡­:•å©:•å©:ƒy­:ƒy­:�ø©:�ø©:˜ï­:˜ï­:‹Fª:‹Fª:DS¯:DS¯:s)­:s)­:€Û°:€Û°: ¹«: ¹«:Ã~¯:Ã~¯::/®::/®:(޶:(޶:Pñ¸:Pñ¸:Q°Ã:Q°Ã:&“Æ:&“Æ:pÐ:pÐ:žÒ:žÒ:jKÚ:jKÚ:êPÙ:êPÙ:¸£Þ:¸£Þ:œôÛ:œôÛ:« á:« á:DYÞ:DYÞ:ˆâ:ˆâ:FeÜ:FeÜ:¯ÞÜ:¯ÞÜ:$eÔ:$eÔ:ØhÒ:ØhÒ:ö}È:ö}È:GÆ:GÆ:¥¾¼:¥¾¼:œÙ»:œÙ»:ÿ:µ:ÿ:µ:p·:p·:à²:à²:9´:9´:Ì®:Ì®:û ±:û ±:¾z­:¾z­:[„±:[„±:�,®:�,®: ƒ²: ƒ²:Ÿ °:Ÿ °:h¶:h¶:‘ºµ:‘ºµ:[?¼:[?¼:a˜º:a˜º:Ì\À:Ì\À:]¶¾:]¶¾:˜ºÄ:˜ºÄ:²òÂ:²òÂ:huÈ:huÈ:‹=Æ:‹=Æ:ü™Ë:ü™Ë:ùSÉ:ùSÉ:�VÎ:�VÎ: "Ë: "Ë:-õÎ:-õÎ:i Ë:i Ë:CÏ:CÏ:„Ë:„Ë:zHÎ:zHÎ:´pÉ:´pÉ:÷úË:÷úË:ŒãÆ:ŒãÆ:)}É:)}É:6�Ä:6�Ä:›Ç:›Ç: ÑÁ: ÑÁ:Â3Ä:Â3Ä:Â+¿:Â+¿:0ÀÁ:0ÀÁ:ž¼:ž¼:è¿:è¿:cº:cº:Û÷¼:Û÷¼:øs¸:øs¸:ꜻ:ꜻ:æ ·:æ ·:¯1º:¯1º:”ѵ:”ѵ:¦=¹:¦=¹:Uµ:Uµ:õY¸:õY¸:´:´:È�·:È�·:Ë‚³:Ë‚³:Zí¶:Zí¶:w„²:w„²:öˆµ:öˆµ:u±:u±:r†´:r†´:�•°:�•°:4&´:4&´: ÷¯: ÷¯:pQ³:pQ³:E ¯:E ¯:µP²:µP²:þÕ­:þÕ­:·°:·°:¡Ñ«:¡Ñ«:O‰®:O‰®:hÀ©:hÀ©:U‹¬:U‹¬:c §:c §:­4ª:­4ª:Ã"¥:Ã"¥:L§§:L§§:á–¢:á–¢:ù%¥:ù%¥:0 :0 :¶£:¶£:v{ž:v{ž:xÁ¡:xÁ¡:è�:è�: Ã : Ã :.Sœ:.Sœ:3‚Ÿ:3‚Ÿ:Â5›:Â5›:±”ž:±”ž:ì_š:ì_š:úÔ�:úÔ�:gÅ™:gÅ™:Pb�:Pb�:|™:|™:$>�:$>�:R^™:R^™:J�:J�:¯L™:¯L™:Ô3�:Ô3�:Ø€™:Ø€™: l�: l�:ÈÓ™:ÈÓ™:¼î�:¼î�:Ü{š:Ü{š:• ž:• ž: ›: ›:-ûž:-ûž:A4›:A4›:cŸ:cŸ:9›:9›:!ýž:!ýž:›:›:rÞž:rÞž:#›:#›:Øôž:Øôž:â*›:â*›:Ëçž:Ëçž:‚ýš:‚ýš:°¯ž:°¯ž:•Óš:•Óš:§ž:§ž:±äš:±äš:L³ž:L³ž:àš:àš:-®ž:-®ž:Þš:Þš:ù ž:ù ž:ÎÈš:ÎÈš:k•ž:k•ž:vÆš:vÆš:Ã�ž:Ã�ž:|¶š:|¶š:ñlž:ñlž:Šwš:Šwš:‡ž:‡ž:É$š:É$š:Ï�:Ï�:«Ü™:«Ü™:ψ�:ψ�:ø–™:ø–™:&<�:&<�:f9™:f9™:éÉœ:éÉœ:£²˜:£²˜:‰,œ:‰,œ:±ÿ—:±ÿ—:Ít›:Ít›:BX—:BX—:îßš:îßš:1Å–:1Å–:º=š:º=š:•–:•–:À]™:À]™:ß •:ß •:IP˜:IP˜: õ“: õ“:6—:6—:Û’:Û’:¯–:¯–:�¹‘:�¹‘:™â”:™â”:í^�:í^�:üs“:üs“:�æŽ:�æŽ:¥ø‘:¥ø‘:¥o�:¥o�:Œ‹�:Œ‹�:€ Œ:€ Œ:Ù,�:Ù,�:b´Š:b´Š:Ü�:Ü�:—^‰:—^‰:‰Œ:‰Œ:Έ:Έ: 1‹: 1‹:ƒÇ†:ƒÇ†:_Š:_Š:n­…:n­…:~óˆ:~óˆ:?œ„:?œ„:¬ê‡:¬ê‡:2•ƒ:2•ƒ:z׆:z׆:Øp‚:Øp‚:ª…:ª…: H�: H�:¹’„:¹’„:D€:D€:y™ƒ:y™ƒ:,�~:,�~:�¨‚:�¨‚:É¿|:É¿|: ´�: ´�:šÃz:šÃz:K³€:K³€:ŽÖx:ŽÖx:Á¥:Á¥:=Bw:=Bw:é&~:é&~:‹Âu:‹Âu:á¤|:á¤|:ðCt:ðCt:x({:x({:Ár:Ár:ìšy:ìšy:·0q:·0q:…x:…x:.Éo:.Éo: Ãv: Ãv:vn:vn:€ou:€ou:¯!m:¯!m:i$t:i$t:ßèk:ßèk:†ör:†ör:j´j:j´j:®»q:®»q:qi:qi:@�p:@�p:ÃTh:ÃTh:Áeo:Áeo:-/g:-/g:–Ln:–Ln:ñ1f:ñ1f:oqm:oqm:“de:“de: šl: šl:d:d:¯k:¯k:Å�c:Å�c:O¼j:O¼j:•›b:•›b:Íi:Íi:E¹a:E¹a:Ðõh:Ðõh:+Þ`:+Þ`:Üh:Üh:´Ø_:´Ø_:Íôf:Íôf:—Æ^:—Æ^:Êêe:Êêe:ÿ¾]:ÿ¾]:räd:räd:™Ã\:™Ã\:Þùc:Þùc:-ß[:-ß[:‘c:‘c:ýèZ:ýèZ:ß b:ß b:^ÛY:^ÛY:[ÿ`:[ÿ`:šÒX:šÒX:«ó_:«ó_:-ÂW:-ÂW:Èæ^:Èæ^:ѹV:ѹV:(Ú]:(Ú]: U: U:ͳ\:ͳ\:ÊrT:ÊrT:´ˆ[:´ˆ[:uOS:uOS:‰kZ:‰kZ:¯/R:¯/R:ÂEY:ÂEY:5Q:5Q:ùX:ùX:JÛO:JÛO:òáV:òáV:�N:�N:C�U:C�U:JCM:JCM:êTT:êTT:îL:îL:™,S:™,S:èêJ:èêJ:$R:$R: ÀI: ÀI:GÖP:GÖP:3“H:3“H:%­O:%­O:ÂuG:ÂuG: žN: žN:�nF:�nF:ô—M:ô—M:5dE:5dE:?‡L:?‡L:�LD:�LD:mjK:mjK:{(C:{(C:"=J:"=J:DöA:DöA:bI:bI:ÝÏ@:ÝÏ@:éG:éG:Ä¢?:Ä¢?:!¹F:!¹F:{q>:{q>:e‡E:e‡E:@>=:@>=:gOD:gOD:Ÿý;:Ÿý;:® C:® C:Kº::Kº::ÔÈA:ÔÈA:tv9:tv9:8…@:8…@:Å58:Å58:ÚH?:ÚH?:wü6:wü6:)>:)>:%Ã5:%Ã5:×<:×<:Š4:Š4:îŸ;:îŸ;:`S3:`S3:�j::�j::Á2:Á2:²:9:²:9:Áô0:Áô0:D8:D8:OÍ/:OÍ/:xæ6:xæ6:ô”.:ô”.:œ¤5:œ¤5:�N-:�N-:a4:a4:º,:º,:ž%3:ž%3:¥Ô*:¥Ô*:èé1:èé1::–)::–):¸¨0:¸¨0:šP(:šP(:¹]/:¹]/:':':l.:l.: ³%: ³%:±Á,:±Á,:h$:h$:Ÿy+:Ÿy+:G #:G #:2*:2*:úÙ!:úÙ!:¯í(:¯í(:^– :^– :8®':8®':K]:K]:ž{&:ž{&:3/:3/:7R%:7R%:w:w:ð-$:ð-$:1è:1è:Ð#:Ð#:ëÔ:ëÔ:Ÿ":Ÿ":nÈ:nÈ:`þ :`þ :}Ç:}Ç:œ :œ :|Ì:|Ì:£:£:òÑ:òÑ:Ú:Ú:ýÙ:ýÙ: : :3ß:3ß:å:å:*ã:*ã:g":g":Zí:Zí:Ó,:Ó,:ù:ù:k<:k<: : :9P:9P:" :" :eh:eh:1=:1=:µ�:µ�:i:i:4»:4»:’ :’ :²ß:²ß:#´ :#´ :a:a:é× :é× :Þ(:Þ(:Ï :Ï : U: U:Û0 :Û0 :šŠ:šŠ:Ci :Ci :ØÃ:ØÃ:D£:D£: : :`å:`å:˜F:˜F:*:*:JŒ:JŒ:,q:,q:ØÕ :ØÕ :„º:„º:_ :_ :`û:`û:’Y :’Y :€7:€7:\– :\– :Õq:Õq:~Í :~Í :M§:M§:£ :£ :ß:ß:Î; :Î; :™:™:Ãm:Ãm:C:C:Þ�:Þ�:Âæþ9Âæþ9_Ì:_Ì:ç;ý9ç;ý9Ÿõ:Ÿõ:½Œû9½Œû9Y:Y:EÙù9EÙù9›C:›C:—%ø9—%ø9l:l:ì|ö9ì|ö9£š:£š:Ùô9Ùô9ÙÇ:ÙÇ:$1ó9$1ó9ró:ró:.„ñ9.„ñ9 : :ÆÏï9ÆÏï9̓þ9̓þ9ø î9ø î99Øü99Øü9~qì9~qì9"û9"û9¾²ê9¾²ê9°_ù9°_ù9åïè9åïè9` ÷9` ÷9î2ç9î2ç9éõ9éõ9‚å9‚å9ò>ô9ò>ô9-Øã9-Øã9Ø‘ò9Ø‘ò9�#â9�#â9#Ùð9#Ùð9‚jà9‚jà9ù#ï9ù#ï9Ê´Þ9Ê´Þ9´kí9´kí9øÜ9øÜ9ø¬ë9ø¬ë9~6Û9~6Û9•êé9•êé9QpÙ9QpÙ9•!è9•!è9_¦×9_¦×99\æ99\æ9¬âÕ9¬âÕ9$˜ä9$˜ä9Ô9Ô9lÒâ9lÒâ9OWÒ9OWÒ9á9á9f–Ð9f–Ð9 Pß9 Pß9ûÓÎ9ûÓÎ9Ç�Ý9Ç�Ý9rÍ9rÍ9•ÖÛ9•ÖÛ9�[Ë9�[Ë9tÚ9tÚ9@ŸÉ9@ŸÉ9¤`Ø9¤`Ø9SåÇ9SåÇ9Ÿ§Ö9Ÿ§Ö9 ,Æ9 ,Æ9rïÔ9rïÔ9ÃqÄ9ÃqÄ9ê3Ó9ê3Ó9(³Â9(³Â9¾sÑ9¾sÑ9ýðÀ9ýðÀ9ã³Ï9ã³Ï9j2¿9j2¿9¨öÍ9¨öÍ9Gt½9Gt½9W:Ì9W:Ì9¸»9¸»9Ê9Ê9Ÿû¹9Ÿû¹9pÂÈ9pÂÈ9¹;¸9¹;¸9kÇ9kÇ92{¶92{¶9FÅ9FÅ9ˆÂ´9ˆÂ´9G�Ã9G�Ã9\ ³9\ ³9”ÖÁ9”ÖÁ9µN±9µN±97À97À9Z‘¯9Z‘¯9‰^¾9‰^¾9šÖ­9šÖ­9¸¨¼9¸¨¼9 %¬9 %¬9Ñúº9Ñúº9‘uª9‘uª9ÖI¹9ÖI¹9«À¨9«À¨9‚’·9‚’·9l§9l§9 Úµ9 Úµ9eP¥9eP¥9+)´9+)´9ꢣ9ꢣ9R€²9R€²99û¡99û¡9Ù°9Ù°9ÅP 9ÅP 9î-¯9î-¯9Š¥ž9Š¥ž9m†­9m†­9#�9#�9�æ«9�æ«9:a›9:a›9;Fª9;Fª9»¿™9»¿™9⦨9⦨9v˜9v˜9;§9;§9`~–9`~–9i¥9i¥9Ýã”9Ýã”9!Ó£9!Ó£9?P“9?P“9ÓA¢9ÓA¢9о‘9о‘9ã² 9ã² 9ã0�9ã0�9º&Ÿ9º&Ÿ9¤£Ž9¤£Ž9C›�9C›�9E�9E�9Ìœ9Ìœ9â‹‹9â‹‹9⃚9⃚9®ü‰9®ü‰9ƒõ˜9ƒõ˜9˜nˆ9˜nˆ9Êi—9Êi—9Áâ†9Áâ†9Äß•9Äß•9Z…9Z…9X\”9X\”9ÒÚƒ9ÒÚƒ9Êá’9Êá’9ä`‚9ä`‚9´i‘9´i‘9-é€9-é€9üô�9üô�9Në~9Në~9'ƒŽ9'ƒŽ9Ï|9Ï|9�9�9´y9´y9ü—‹9ü—‹9Y$v9Y$v9Š9Š9ç0s9ç0s9Ô§ˆ9Ô§ˆ9vDp9vDp9&3‡9&3‡9»9>»9aý9aý9Áóú8Áóú8;¿9;¿99sô89sô8#9#9Õéí8Õéí8=9=9gç8gç8€9€9hîà8hîà85Ê95Ê9E„Ú8E„Ú8™ 9™ 9ÜÔ8ÜÔ84j94j9¡½Í8¡½Í8~;9~;9Ì`Ç8Ì`Ç899sÁ8sÁ8©Ýý8©Ýý8•ƺ8•ƺ8³™÷8³™÷8q~´8q~´8QWñ8QWñ8˜8®8˜8®8ë8ë8Æó§8Æó§8«Ùä8«Ùä8O¸¡8O¸¡8x§Þ8x§Þ8Ž„›8Ž„›8þzØ8þzØ8òV•8òV•8hTÒ8hTÒ8û*�8û*�8Ï*Ì8Ï*Ì8›ûˆ8›ûˆ8gÆ8gÆ8Ý΂8Ý΂8ßÜ¿8ßÜ¿8šVy8šVy8ÐÁ¹8ÐÁ¹8•!m8•!m8×±³8×±³8Ìý`8Ìý`8W¤­8W¤­8@ØT8@ØT8‚•§8‚•§8¯H8¯H8®†¡8®†¡8¨�<8¨�<8g€›8g€›8&ƒ08&ƒ08‚ƒ•8‚ƒ•8Ô†$8Ô†$8µŒ�8µŒ�8&•8&•8”š‰8”š‰83© 83© 8W¬ƒ8W¬ƒ8DÒ8DÒ8± {8± {8ÀIê7ÀIê7ç p8ç p8†Ó7†Ó7˜yd8˜yd8_æ»7_æ»7:òX8:òX8˜Æ¤7˜Æ¤7agM8agM8È��7È��7±ÑA8±ÑA8)¢l7)¢l7a=68a=68Â,>7Â,>7Ū*8Ū*8=À7=À7¦8¦8f Â6f Â6…8…8NK6NK6Âê8Âê81‰41‰4Q¾ø7Q¾ø7в'¶Ð²'¶ºá7ºá7žM°¶žM°¶¬Ê7¬Ê7ýj·ýj·˜¢³7˜¢³7‘˜4·‘˜4·î¤œ77®b·Â®b·“½…7“½…7Ñ;ˆ·Ñ;ˆ·B÷]7B÷]7(Ÿ·(Ÿ·ób07ób07Íìµ·Íìµ·½ú7½ú7²ŸÌ·²ŸÌ·—â«6—â«6äã·äã·Œ%%6Œ%%6tsù·tsù·)LG´)LG´<Þ¸<Þ¸B“>¶B“>¶o¸o¸N¸¶N¸¶ù/¸ù/¸´k·´k·¥I)¸¥I)¸i¬4·i¬4·Id4¸Id4¸å`·å`·�z?¸�z?¸’Œ†·’Œ†·Æ”J¸Æ”J¸â©œ·â©œ·a¤U¸a¤U¸ß—²·ß—²·c›`¸c›`¸»jÈ·»jÈ·Z�k¸Z�k¸š.Þ·š.Þ·žrv¸žrv¸£×ó·£×󷤥€¸¤¥€¸(´¸(´¸Y †¸Y †¸o¸o¸Œj‹¸Œj‹¸s¸s¸MÇ�¸MÇ�¸ØÇ$¸ØÇ$¸}–¸}–¸˜]/¸˜]/¸®h›¸®h›¸oã9¸oã9¸a­ ¸a­ ¸ÉZD¸ÉZD¸饸饸¿¼N¸¿¼N¸ð«¸ð«¸tY¸tY¸¡M°¸¡M°¸Mdc¸Mdc¸rµ¸rµ¸²”m¸²”m¸¶‰º¸¶‰º¸w®w¸w®w¸.–¿¸.–¿¸VØ€¸VØ€¸¬—ĸ¬—ĸ"Ñ…¸"Ñ…¸Ñ“ɸѓɸ”ÄŠ¸”ÄŠ¸Æ†Î¸Æ†Î¸Ì«�¸Ì«�¸ŠoÓ¸ŠoÓ¸UŒ”¸UŒ”¸¤Qظ¤Qظód™¸ód™¸˜-ݸ˜-ݸ;ž¸;ž¸“ ⸓ â¸y£¸y£¸Yßæ¸Yßæ¸cا¸cا¸¥ë¸¥ë¸†”¬¸†”¬¸1cð¸1cð¸G±¸G±¸ßõ¸ßõ¸¦îµ¸¦îµ¸q¼ù¸q¼ù¸‰º¸‰º¸)Uþ¸)Uþ¸½¿¸½¿¸7p¹7p¹£–ø£–øe²¹e²¹ÛȸÛȸ"ï¹"﹇}̸‡}̸ô$¹ô$¹ÞÝиÞÝиiU ¹iU ¹B4Õ¸B4Õ¸6� ¹6� ¹›‚Ù¸›‚ٸة¹Ø©¹$Ëݸ$Ëݸ€Î¹€Î¹‚⸂â¸oë¹oë¹~4æ¸~4æ¸>¹>¹âXê¸âX긒¹’¹Kuî¸Kuî¸*$¹*$¹+ˆò¸+ˆò¸ .¹ .¹�ö¸�ö¸k0¹k0¹†ú¸†ú¸+¹+¹ñoþ¸ñoþ¸Î !¹Î !¹9)¹9)¹s#¹s#¹/¹/¹%¹%¹Ëÿ¹Ëÿ¹Äé&¹Äé&¹£à¹£à¹GÊ(¹GÊ(¹Å»¹Å»¹â¥*¹â¥*¹�‘ ¹�‘ ¹ª{,¹ª{,¹#a ¹#a ¹J.¹J.¹4(¹4(¹0¹0¹_ç¹_繑Î1¹‘Î1¹óŸ¹óŸ¹ë‡3¹ë‡3¹VT¹VT¹z=5¹z=5¹Q¹Q¹xï6¹xï6¹«±¹«±¹œ8¹œ8¹×X¹×X¹ÛC:¹ÛC:¹!û¹!û¹îæ;¹îæ;¹l™¹l™¹™†=¹™†=¹ò3¹ò3¹F!?¹F!?¹[ȹ[ȹ™µ@¹™µ@¹¶V ¹¶V ¹VDB¹VDB¹à!¹à!¹%ÎC¹%ÎC¹®c#¹®c#¹ÙQE¹ÙQE¹Õá$¹Õá$¹>ÐF¹>ÐF¹ÇY&¹ÇY&¹HH¹HH¹´Ë'¹´Ë'¹8ºI¹8ºI¹-8)¹-8)¹u'K¹u'K¹uŸ*¹uŸ*¹�ŽL¹�ŽL¹Õ,¹Õ,¹fñM¹fñM¹_-¹_-¹ÔPO¹ÔPO¹=¹.¹=¹.¹Í«P¹Í«P¹â0¹â0¹ŒR¹ŒR¹8`1¹8`1¹íSS¹íSS¹Õª2¹Õª2¹UžT¹UžT¹‹ï3¹‹ï3¹ äU¹ äU¹£/5¹£/5¹s$W¹s$W¹.j6¹.j6¹‡_X¹‡_X¹Ÿ7¹Ÿ7¹8”Y¹8”Y¹Í8¹Í8¹®ÁZ¹®ÁZ¹Hô9¹Hô9¹4ê[¹4ê[¹ò;¹ò;¹†]¹†]¹Ý5<¹Ý5<¹d,^¹d,^¹!M=¹!M=¹C_¹C_¹Á\>¹Á\>¹cR`¹cR`¹úe?¹úe?¹ã\a¹ã\a¹¹k@¹¹k@¹”cb¹”cb¹¬kA¹¬kA¹Çbc¹Çbc¹dB¹dB¹h[d¹h[d¹’VC¹’VC¹*Ne¹*Ne¹/CD¹/CD¹„;f¹„;f¹ +E¹ +E¹3$g¹3$g¹Y F¹Y F¹ h¹ h¹èF¹èF¹¥àh¹¥àh¹K¼G¹K¼G¹ÿ´i¹ÿ´i¹ŠH¹ŠH¹ƒj¹ƒj¹RI¹RI¹€Kk¹€Kk¹J¹J¹ l¹ l¹êÍJ¹êÍJ¹ûÅl¹ûÅl¹€K¹€K¹}xm¹}xm¹3,L¹3,L¹Œ$n¹Œ$n¹_ÑL¹_ÑL¹Ên¹Ên¹qM¹qM¹Ýjo¹Ýjo¹á N¹á N¹Âp¹Âp¹$ N¹$ N¹lšp¹lšp¹Œ.O¹Œ.O¹ )q¹ )q¹–¶O¹–¶O¹Ð±q¹Ð±q¹ç9P¹ç9P¹y6r¹y6r¹œ¸P¹œ¸P¹kµr¹kµr¹Â0Q¹Â0Q¹.s¹.s¹�£Q¹�£Q¹´¡s¹´¡s¹ÝR¹ÝR¹Ãt¹Ãt¹–yR¹–yR¹Czt¹Czt¹�ÞR¹�ÞR¹?àt¹?àt¹H>S¹H>S¹<@u¹<@u¹Ò—S¹Ò—S¹Yšu¹Yšu¹,ëS¹,ëS¹gíu¹gíu¹7T¹7T¹r9v¹r9v¹k|T¹k|T¹v¹v¹l»T¹l»T¹¾v¹¾v¹dôT¹dôT¹ý÷v¹ý÷v¹?'U¹?'U¹ +w¹ +w¹ySU¹ySU¹­Ww¹­Ww¹ýyU¹ýyU¹‚w¹‚w¹À›U¹À›U¹¦¡w¹¦¡w¹3·U¹3·U¹Ö½w¹Ö½w¹ÍU¹ÍU¹Ôw¹Ôw¹ŒÝU¹ŒÝU¹Õåw¹Õåw¹¾èU¹¾èU¹‘òw¹‘òw¹(ðU¹(ðU¹=ûw¹=ûw¹nòU¹nòU¹qþw¹qþw¹’ïU¹’ïU¹nüw¹nüw¹÷æU¹÷æU¹bôw¹bôw¹=ØU¹=ØU¹æw¹æw¹ÃU¹ÃU¹1Ñw¹1Ñw¹§U¹§U¹2µw¹2µw¹8„U¹8„U¹A“w¹A“w¹ì[U¹ì[U¹³kw¹³kw¹Ò-U¹Ò-U¹Œ>w¹Œ>w¹qúT¹qúT¹c w¹c w¹sÂT¹sÂT¹ÕÕv¹ÕÕv¹u…T¹u…T¹`™v¹`™v¹GBT¹GBT¹ñVv¹ñVv¹@ùS¹@ùS¹ïv¹ïv¹%«S¹%«S¹'Âu¹'Âu¹WXS¹WXS¹õpu¹õpu¹GS¹GS¹u¹u¹Þ¤R¹Þ¤R¹®¿t¹®¿t¹@CR¹@CR¹‹_t¹‹_t¹�ÝQ¹�ÝQ¹(üs¹(üs¹ uQ¹ uQ¹¸•s¹¸•s¹ÀQ¹ÀQ¹­*s¹­*s¹—P¹—P¹Õ¹r¹Õ¹r¹ãP¹ãP¹UDr¹UDr¹¹¤O¹¹¤O¹#Ëq¹#Ëq¹í%O¹í%O¹>Nq¹>Nq¹2£N¹2£N¹!Íp¹!Íp¹ßN¹ßN¹Gp¹Gp¹y�M¹y�M¹V¼o¹V¼o¹%ÿL¹%ÿL¹.o¹.o¹-kL¹-kL¹í›n¹í›n¹-ÓK¹-ÓK¹øn¹øn¹—7K¹—7K¹Mlm¹Mlm¹ô—J¹ô—J¹tÎl¹tÎl¹lôI¹lôI¹K-l¹K-l¹ïMI¹ïMI¹‰k¹‰k¹¤H¹¤H¹˜áj¹˜áj¹X÷G¹X÷G¹N7j¹N7j¹‹GG¹‹GG¹¡‰i¹¡‰i¹O”F¹O”F¹/Ùh¹/Ùh¹ßE¹ßE¹ª&h¹ª&h¹Ò&E¹Ò&E¹Rpg¹Rpg¹§jD¹§jD¹†¶f¹†¶f¹š«C¹š«C¹úe¹úe¹†éB¹†éB¹I:e¹I:e¹M$B¹M$B¹hwd¹hwd¹O[A¹O[A¹°c¹°c¹Ž@¹Ž@¹%åb¹%åb¹³½?¹³½?¹©b¹©b¹Ûê>¹Ûê>¹CGa¹CGa¹é>¹é>¹âs`¹âs`¹à;=¹à;=¹�_¹�_¹_<¹_<¹sÂ^¹sÂ^¹ö~;¹ö~;¹å]¹å]¹œ:¹œ:¹¡]¹¡]¹äµ9¹äµ9¹ê \¹ê \¹œÌ8¹œÌ8¹n:[¹n:[¹¾à7¹¾à7¹GQZ¹GQZ¹{ò6¹{ò6¹›fY¹›fY¹6¹6¹AzX¹AzX¹C5¹C5¹'‹W¹'‹W¹Û4¹Û4¹ šV¹ šV¹ë&3¹ë&3¹:§U¹:§U¹§.2¹§.2¹ý±T¹ý±T¹e41¹e41¹ÒºS¹ÒºS¹•70¹•70¹¢ÀR¹¢ÀR¹8/¹8/¹ŠÄQ¹ŠÄQ¹7.¹7.¹êÆP¹êÆP¹:4-¹:4-¹ ÇO¹ ÇO¹/,¹/,¹ôÄN¹ôÄN¹h'+¹h'+¹ì¿M¹ì¿M¹”*¹”*¹B¸L¹B¸L¹ö)¹ö)¹¯K¹¯K¹¸(¹¸(¹Z¤J¹Z¤J¹ò&¹ò&¹K˜I¹K˜I¹<á%¹<á%¹U‹H¹U‹H¹vÏ$¹vÏ$¹c}G¹c}G¹½#¹½#¹EoF¹EoF¹iª"¹iª"¹U`E¹U`E¹{–!¹{–!¹úOD¹úOD¹#� ¹#� ¹k>C¹k>C¹Ëj¹Ëj¹ä+B¹ä+B¹tS¹tS¹ŒA¹ŒA¹X;¹X;¹@¹@¹�!¹�!¹Þí>¹Þí>¹È¹È¹…×=¹…×=¹ì¹ì¹äÀ<¹äÀ<¹‘й‘й\©;¹\©;¹6´¹6´¹Ø�:¹Ø�:¹y–¹y–¹žv9¹žv9¹w¹w¹.[8¹.[8¹íV¹íV¹7?7¹7?7¹]6¹]6¹ù"6¹ù"6¹y¹y¹5¹5¹…ó¹…ó¹ðç3¹ðç3¹XйXйÉ2¹É2¹ý¬¹ý¬¹Cª1¹Cª1¹½‰ ¹½‰ ¹T‹0¹T‹0¹f ¹f ¹·k/¹·k/¹qA ¹qA ¹8K.¹8K.¹÷ ¹÷ ¹Ý)-¹Ý)-¹éõ¹éõ¹f,¹f,¹ôϹôϹíæ*¹íæ*¹¼©¹¼©¹âÄ)¹âÄ)¹§‚¹§‚¹¢(¹¢(¹ýZ¹ýZ¹®~'¹®~'¹Ö2¹Ö2¹[&¹[&¹g ¹g ¹ì6%¹ì6%¹}á¹}á¹l$¹l$¹Apÿ¸Apÿ¸’í"¹’í"¹lý¸lý¸ØÈ!¹ØÈ!¹’Êú¸’Êú¸÷£ ¹÷£ ¹Bwø¸Bwø¸Û~¹Û~¹«#ö¸«#ö¸ÊY¹ÊY¹bÐó¸bÐó¸5¹5¹å}ñ¸å}ñ¸©¹©¹ ,ï¸ ,ï¸Wì¹Wì¹AÙì¸AÙì¸GǹGǹp…ê¸p…ê¸*¢¹*¢¹ý1è¸ý1è¸Y}¹Y}¹ßå¸ßå¸pX¹pX¹&‹ã¸&‹ã¸3¹3¹¿6ḿ6Ḙ ¹˜ ¹qâÞ¸qâÞ¸£è¹£è¹Û�ܸÛ�ܸyĹyĹk>Ú¸k>Ú¸¿ ¹¿ ¹ší׸ší׸I}¹I}¹A�Õ¸A�Õ¸÷Y¹÷Y¹àLÓ¸àLÓ¸Â6 ¹Â6 ¹¨ýи¨ýи‚ ¹‚ ¹ß¯Î¸ß¯Î¸pò ¹pò ¹b̸b̸«Ð ¹«Ð ¹{ʸ{ʸ¤¯¹¤¯¹IÊǸIÊǸ7�¹7�¹i€Å¸i€Å¸ào¹ào¹e9øe9øÁQ¹ÁQ¹±óÀ¸±óÀ¸ 4¹ 4¹Ñ®¾¸Ñ®¾¸¨¹¨¹+j¼¸+j¼¸\ù¹\ù¹÷%º¸÷%º¸…ܹ…ܹ2ã·¸2ã·¸�ÿ¸�ÿ¸›¡µ¸›¡µ¸aIý¸aIý¸à_³¸à_³¸û¸û¸±¸±¸ãÛø¸ãÛø¸ß®¸ß®¸§ö¸§ö¸ˆ¡¬¸ˆ¡¬¸otô¸otô¸fª¸fª¸ÛCò¸ÛCò¸Â+¨¸Â+¨¸pð¸pð¸Ró¥¸Ró¥¸hçí¸hçí¸ ½£¸ ½£¸C¼ë¸C¼ë¸²ˆ¡¸²ˆ¡¸0“é¸0“鸠VŸ¸ VŸ¸Ylç¸Ylç¸&�¸&�¸¡F帡Få¸éöš¸éöš¸®"㸮"ã¸Yɘ¸Yɘ¸¸ÿุÿà¸Kœ–¸Kœ–¸²ÝÞ¸²ÝÞ¸óp”¸óp”¸•½Ü¸•½Ü¸äF’¸äF’¸1žÚ¸1žÚ¸y�¸y�¸ÎظÎظdõ�¸dõ�¸ÐbÖ¸ÐbÖ¸e΋¸e΋¸øFÔ¸øFÔ¸D©‰¸D©‰¸Å-Ò¸Å-ҸƇ¸Ã†‡¸«и«иªe…¸ªe…¸ŠÎ¸ŠÎ¸›Eƒ¸›Eƒ¸ùë˸ùë˸K'�¸K'�¸ÙɸÙɸ�~¸�~¸dÈǸdÈǸ%áy¸%áy¸º¹Å¸º¹Å¸¦¯u¸¦¯u¸¬Ã¸¬Ã¸_€q¸_€q¸d Á¸d Á¸+Vm¸+Vm¸—¿¸—¿¸è/i¸è/i¸È�½¸È�½¸ e¸ e¸ÊŠ»¸ÊŠ»¸}ð`¸}ð`¸°‡¹¸°‡¹¸TÖ\¸TÖ\¸h†·¸h†·¸‘¿X¸‘¿X¸G†µ¸G†µ¸Í©T¸Í©T¸�†³¸�†³¸Ð•P¸Ð•P¸gˆ±¸gˆ±¸°…L¸°…L¸C‹¯¸C‹¯¸…uH¸…uH¸!Œ­¸!Œ­¸4dD¸4dD¸ãŠ«¸ãŠ«¸ŠQ@¸ŠQ@¸Ì‡©¸Ì‡©¸ˆ><¸ˆ><¸’ƒ§¸’ƒ§¸-8¸-8¸Ì~¥¸Ì~¥¸§4¸§4¸äx£¸äx£¸é 0¸é 0¸Ôq¡¸Ôq¡¸ý+¸ý+¸8iŸ¸8iŸ¸aí'¸aí'¸Ÿ_�¸Ÿ_�¸²ß#¸²ß#¸@V›¸@V›¸ÁÕ¸ÁÕ¸M™¸M™¸_θ_θÀC—¸ÀC—¸ÀɸÀɸI:•¸I:•¸‚Ǹ‚ǸÒ0“¸Ò0“¸—ȸ—ȸ®'‘¸®'‘¸XÍ ¸XÍ ¸þ�¸þ�¸Õ¸Õ¸à�¸à�¸”Þ¸”Þ¸k ‹¸k ‹¸êÔÿ·êÔÿ·ë‰¸ë‰¸Éó÷·Éó÷·ú†¸ú†¸îð·îð·Ìñ„¸Ìñ„¸ñHè·ñHè·n邸n邸Ázà·Ázà·©à€¸©à€¸`²Ø·`²Ø·†°}¸†°}¸ˆñзˆñз8¡y¸8¡y¸t:É·t:É·ò“u¸ò“u¸ŒÁ·ŒÁ·ä‡q¸ä‡q¸úä¹·úä¹·�|m¸�|m¸§F²·§F²·¬ti¸¬ti¸�·ª·�·ª·âqe¸âqe¸17£·17£·Àra¸Àra¸NÁ›·NÁ›·ˆu]¸ˆu]¸NU”·NU”·àzY¸àzY¸ÙóŒ·ÙóŒ·Ù‚U¸Ù‚U¸ž…·ž…·rŽQ¸rŽQ¸fª|·fª|·€�M¸€�M¸70n·70n·Ú¯I¸Ú¯I¸Ï_·Ï_·ÅÅE¸ÅÅE¸Ï…Q·Ï…Q·ËÞA¸ËÞA¸ÉTC·ÉTC·ôû=¸ôû=¸Ô@5·Ô@5·:¸:¸C'·C'·ý@6¸ý@6¸Ø]·Ø]·i2¸i2¸” ·” ·!•.¸!•.¸–Çû¶–Çû¶ÈÄ*¸ÈÄ*¸™™à¶™™à¶6ø&¸6ø&¸@›Å¶@›Å¶/#¸/#¸ŽÔª¶ŽÔª¶Ak¸Ak¸×N�¶×N�¶Ì¬¸Ì¬¸l¶l¶³ò¸³ò¸úã7¶úã7¶Ä=¸Ä=¸…>¶…>¶]ޏ]ޏ2C¢µ2C¢µÁå ¸Áå ¸põ´põ´ÔD ¸ÔD ¸Â"š4Â"š4e©¸e©¸”w‰5”w‰5Þ¸Þ¸úbë5úbë5qý·qý·,&6,&6Zìõ·Zìõ·_6V6_6V6ßî·ßî·$ß‚6$ß‚69Üç·9Üç·'lš6'lš6Wâà·Wâà·%½±6%½±6»ôÙ·»ôÙ·(ÇÈ6(ÇÈ6ÖÓ·ÖÓ·gŒß6gŒß6¹@Ì·¹@Ì·ö6ö6’{Å·’{Å·Ó7Ó7¨Ã¾·¨Ã¾·�7�77¸·7¸·ÚÚ7ÚÚ7§�±·§�±·¹‚&7¹‚&7 õª· õª· 17 17Ew¤·Ew¤·Øc;7Øc;7hž·hž·¼œE7¼œE7ݦ—·Ý¦—·â¬O7â¬O7°V‘·°V‘·j•Y7j•Y7ó‹·ó‹·šZc7šZc73á„·3á„·=úl7=úl7Hx}·Hx}·÷tv7÷tv7WMq·WMq·.Å7.Å7òEe·òEe·Iv„7Iv„7r\Y·r\Y· øˆ7 øˆ7k�M·k�M·Ïf�7Ïf�73ãA·3ãA·—Á‘7—Á‘7V6·V6·¹–7¹–7ýê*·ýê*·Ž;š7Ž;š7»�·»�·1]ž71]ž7zl·zl·l¢7l¢7¶\ ·¶\ ·‹e¦7‹e¦7râü¶râü¶EJª7EJª7Oç¶O綦®7¦®7„þѶ„þѶÄ×±7Ä×±7jï¼¶jï¼¶êµ7êµ7ø*¨¶ø*¨¶N¹7N¹7í®“¶í®“¶p�¼7p�¼7˜æ~¶˜æ~¶Àû¿7Àû¿70ñV¶0ñV¶�SÃ7�SÃ7Â�/¶Â�/¶÷–Æ7÷–Æ7¦¶¦¶¾ÄÉ7¾ÄÉ79¸Äµ9¸ÄµsÞÌ7sÞÌ7î^rµî^rµ»äÏ7»äÏ7Äܺ´Äܺ´þÖÒ7þÖÒ78U48U4ì´Õ7ì´Õ7”ÐE5”ÐE5~Ø7~Ø7ý©5ý©5 2Û7 2Û7óêï5óêï5ÑÝ7ÑÝ7V6V6 [à7 [à7O"<6O"<63Ðâ73Ðâ7\]6\]6ÿ0å7ÿ0å7}~6}~6„|ç7„|ç7t�6t�6+³é7+³é7gÁž6gÁž6 Õë7 Õë71®61®6ìáí7ìáí7IT½6IT½6éÙï7éÙï7 *Ì6 *Ì6¼ñ7¼ñ7Ä­Ú6Ä­Ú6»‡ó7»‡ó7Þè6Þè6ý<õ7ý<õ7 ¼ö6 ¼ö69Üö79Üö7Þ$7Þ$7Xfø7Xfø7ÌÄ7ÌÄ7RÛù7RÛù7ž<7ž<7V:û7V:û7Š7Š7…‚ü7…‚ü7h¬7h¬7ü³ý7ü³ý7ÿ£!7ÿ£!7öÎþ7öÎþ7q'7q'7ÙÓÿ7ÙÓÿ7¸-7¸-7ha8ha8H�27H�27^Í8^Í8uÙ77uÙ77û-8û-8gû<7gû<7êƒ8êƒ8 ôA7 ôA7\Ï8\Ï8¡ÅF7¡ÅF7B8B8ÝkK7ÝkK7¼E8¼E8�åO7�åO7(p8(p8Z5T7Z5T7ü�8ü�81[X71[X7ø¤8ø¤8FV\7FV\7?¯8?¯8|'`7|'`7Ý®8Ý®8Îc7Îc7Ê£8Ê£8¡Jg7¡Jg77Ž87Ž8�j7�j7 n8 n8çÄm7çÄm7@C8@C8`Âp7`Âp788‚•s7‚•s7$Î8$Î8’=v7’=v7Ûƒ8Ûƒ8(¼x7(¼x7u/8u/8Â{7Â{7'Ñ8'Ñ8-?}7-?}7i8i8ýC7ýC7¿íÿ7¿íÿ7 �€7 �€7Ñôþ7Ñôþ7­g�7­g�7Ãèý7Ãèý7),‚7),‚7øÈü7øÈü7/Ü‚7/Ü‚7ý•û7ý•û7Ixƒ7Ixƒ7Pú7Pú7i„7i„7:÷ø7:÷ø7÷t„7÷t„7¸Œ÷7¸Œ÷7ׄ7ׄ7Äö7Äö7e&…7e&…7eƒô7eƒô7c…7c…7™äò7™äò7·Œ…7·Œ…7ü3ñ7ü3ñ7,£…7,£…7 rï7 rï7Q§…7Q§…7“Ÿí7“Ÿí7Õ˜…7Õ˜…7º»ë7º»ë7|w…7|w…7,Çé7,Çé7ÿC…7ÿC…7:Âç7:Âç71þ„71þ„7ô¬å7ô¬å7w¦„7w¦„7ˆã7ˆã7=„7=„7Tá7Tá7pÃ7pÃ7_ß7_ß7Ö8ƒ7Ö8ƒ7HÀÜ7HÀÜ7‰�‚7‰�‚7â`Ú7â`Ú7ò�7ò�7óó×7óó×7á6�7á6�7¬yÕ7¬yÕ7Ük€7Ük€7&òÒ7&òÒ7ú"7ú"7^Ð7^Ð7ÚO}7ÚO}7J½Í7J½Í7j^{7j^{7XË7XË7ÕOy7ÕOy7¿WÈ7¿WÈ7u$w7u$w7«“Å7«“Å7Ýt7Ýt7áÄÂ7áÄÂ7ßzr7ßzr7Ÿë¿7Ÿë¿7§ýo7§ýo7ø½7ø½7fm7fm7�º7�º7é´j7é´j7«#·7«#·72ëg72ëg7 $´7 $´7À e7À e7î±7î±7œb7œb7p ®7p ®7z_7z_7Jóª7Jóª7¶Ú[7¶Ú[7Ô§7Ô§7 X7 X7,®¤7,®¤7KQU7KQU7‚¡7‚¡7âîQ7âîQ7æOž7æOž7,yN7,yN7.›7.›7xñJ7xñJ7·Û—7·Û—7BYG7BYG78›”78›”7r±C7r±C7W‘7W‘7Zú?7Zú?7VŽ7VŽ7�4<7�4<7©ÄŠ7©ÄŠ7a87a87¯w‡7¯w‡7�47�47Ø(„7Ø(„7 •07 •07ˆØ€7ˆØ€7Ä�,7Ä�,70{70{7Ø›(7Ø›(7jt7jt7q�$7q�$7NÆm7NÆm7} 7} 7@$g7@$g7«b7«b7Æ„`7Æ„`7ýA7ýA7ßèY7ßèY7î7î7žQS7žQS7‘ñ7‘ñ7:ÀL7:ÀL7íà 7íà 7Ë5F7Ë5F7í“7í“7F³?7F³?7qb7qb7Ñ997Ñ9973aþ63aþ6¨Ê27¨Ê27&ÿõ6&ÿõ6!g,7!g,7× í6× í65&75&7Hå6Hå6 Ç7 Ç7åöÜ6åöÜ6ŸŒ7ŸŒ7*¯Ô6*¯Ô6,b7,b7sÌ6sÌ6ÕH 7ÕH 7±DÄ6±DÄ6œA7œA7Â%¼6Â%¼6²M7²M7™´6™´6pÜö6pÜö6!¬6!¬6¦Hë6¦Hë6˜;¤6˜;¤6gâß6gâß6øoœ6øoœ6Å«Ô6Å«Ô64¾”64¾”6§É6§É6](�6](�6XÖ¾6XÖ¾6p°…6p°…6á;´6á;´6±°|6±°|6ÛÙ©6ÛÙ©6RDn6RDn6g²Ÿ6g²Ÿ6�`6�`6­Ç•6­Ç•6kFR6kFR6ÝŒ6ÝŒ6ü¼D6ü¼D6%±‚6%±‚6÷†76÷†76 s6 s6@¨*6@¨*6ENa6ENa6�$6�$6òP6òP6ªÿ6ªÿ6_t?6_t?6™=6™=6»g/6»g/6×Ãõ5×Ãõ5¾õ6¾õ62àß52àß5U"6U"6�×Ê5�×Ê5`ñ6`ñ6ç°¶5ç°¶5¨Íê5¨Íê5Ês£5Ês£5. Ñ5. Ñ5ë&‘5ë&‘5Z¨¸5Z¨¸5{¡5{¡5f¦¡5f¦¡5ð^5ð^5®Œ5®Œ5G@5G@5›Ðo5›Ðo5[³#5[³#5ŒtJ5ŒtJ5¥A 5¥A 5¤(5¤(5|üá4|üá4NÄ5NÄ5$ëµ4$ëµ4¹Ù4¹Ù4JgŽ4JgŽ4î¦4î¦4IW4IW4ŸUv4ŸUv4JÉ4JÉ4­È+4­È+4÷KÐ3÷KÐ3æÉÜ3æÉÜ3/G}3/G}3ócy3ócy3çÛ3çÛ3�Þ2�Þ2†å;2†å;2#lß1#lß1öͧ0öͧ0././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/BinauralDecoder/Source/EQ/AKG-K601.wavIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/BinauralDecoder/Source/EQ/AKG-K601.w0000664002537200253720000004013015257173642030626 0ustar zmoelnigzmoelnigRIFFP@WAVEfmt €»Ü factPEAKàc YÌqD?ÌqD?data@ÌqD?ÌqD?â2¾â2¾ÿ¹S»ÿ¹S»{!<{!<«=¾«=¾gŽ©¼gŽ©¼�K=�K=Îþe=Îþe=¦j›½¦j›½ü’œ¼ü’œ¼ØÝ<ØÝ< ì…= ì…=»Y=»Y=lË–:lË–:£4½£4½êP°¼êP°¼ã<ã<„œ=„œ=fœ§ºfœ§ºµF(½µF(½L˜D½L˜D½q ²¼q ²¼¶½J<¶½J<¥–<¥–<2¯é¹2¯é¹ØIœ»ØIœ»Îtr·Îtr·é5Ô;é5Ô;O#½;O#½;f“ºf“ºäî»äî»ú+Û»ú+Û»JÓºJÓº4™B;4™B;zˆV;zˆV;ÿ£¿:ÿ£¿:¨F$:¨F$:Ç;Ç;Þ–†;Þ–†;ß±‰;ß±‰;…Ç;…Ç;š" :š" :î¸K¹î¸K¹òÌp9òÌp9Àæ9Àæ9J$N¹J$N¹½€ú¹½€ú¹Û2Ì9Û2Ì9:Õ¸::Õ¸:º;º;Bä;Bä;Í;Í;m%;m%;]P;]P;°˜H;°˜H;w ";w ";æ2º:æ2º:dÀ‘:dÀ‘:ã+’:ã+’:g“Ã:g“Ã:ÿl¥:ÿl¥:ô�:ô�:õ�:õ�:€–Þ:€–Þ:Ç>;Ç>;ˆ+;;ˆ+;;�–);�–);è2;è2;åq;åq;] %;] %;¾_#;¾_#;};};ÎPá:ÎPá:™¿:™¿:Ó«:Ó«:1Ý:1Ý:IZã:IZã:ÿð:ÿð:¨ºÍ:¨ºÍ:¹nÞ:¹nÞ:j7â:j7â:U·;U·;0n÷:0n÷:QÕò:QÕò:ÄQÈ:ÄQÈ:€Î:€Î:¶2¼:¶2¼: öÉ: öÉ:û¨©:û¨©:~‡©:~‡©:œÚ�:œÚ�: îª: îª:nÒ©:nÒ©:½:Æ:½:Æ:±Eµ:±Eµ:}Ä:}Ä:ж:ж:EÑ:EÑ:'{Ç:'{Ç:o>Ù:o>Ù:9òÁ:9òÁ:¼Ï:¼Ï:E3¿:E3¿:ëÕ:ëÕ:ÅkÈ:ÅkÈ:¦IÛ:¦IÛ:ï—Ë:ï—Ë:Xã:Xã:È\Ü:È\Ü:pãø:pãø:Wcï:Wcï:�å;�å;¾óø:¾óø:—_;—_;ÿÈ;ÿÈ;%œ ;%œ ;ÄÀ;ÄÀ;w;w;þk;þk;¹ý;¹ý;>ü ;>ü ;g±;g±;Œ! ;Œ! ;š“;š“;k( ;k( ;Bã;Bã;L~;L~;@½;@½;¹Ý;¹Ý;C3;C3;ôŠ÷:ôŠ÷:§k;§k;øQæ:øQæ:]ªî:]ªî:&ªÔ:&ªÔ:«@Þ:«@Þ:.ÑÄ:.ÑÄ:$&Î:$&Î:žµ:žµ:JŒÀ:JŒÀ:õ¢ª:õ¢ª:Õ$¸:Õ$¸:P¢:P¢:.¯:.¯:þ¸š:þ¸š:퉪:퉪: Š˜: Š˜:í�©:í�©:$y—:$y—:èĨ:èĨ:ý`˜:ý`˜:€7¬:€7¬:W—�:W—�:EÛ±:EÛ±:bF£:bF£:þQ¸:þQ¸:ô «:ô «:réÀ:réÀ:)³:)³:ÖŒÇ:ÖŒÇ:õ¸:õ¸:WsÍ:WsÍ:1ô¾:1ô¾:óîÒ:óîÒ:yEÃ:yEÃ:&%Ö:&%Ö:DÆ:DÆ:«KÙ:«KÙ:Í”É:Í”É: wÜ: wÜ:ûÑË:ûÑË:M³Ý:M³Ý:Ï~Ì:Ï~Ì:”Þ:”Þ:†-Ì:†-Ì:˜­Ü:˜­Ü:ÇÉ:ÇÉ:Ö Ù:Ö Ù:¥}Æ:¥}Æ:AÖ:AÖ:´Â:´Â:­MÒ:­MÒ:?)¿:?)¿:ÁÏ:ÁÏ:EÖ»:EÖ»:ïOË:ïOË:QÉ·:QÉ·:§NÇ:§NÇ:‚þ³:‚þ³:5gÃ:5gÃ:!…¯:!…¯:¡^¾:¡^¾:@�ª:@�ª:¤º:¤º:Ññ¦:Ññ¦:ˆ¶:ˆ¶: £: £:³œ²:³œ²:žÏŸ:žÏŸ:jg°:jg°:y3ž:y3ž: À®: À®:„Iœ:„Iœ:#Ȭ:#Ȭ:䛚:䛚:ˆ«:ˆ«:©œ™:©œ™:)Ÿª:)Ÿª:¾í˜:¾í˜:Åkª:Åkª:¹L™:¹L™:73«:73«:¥=š:¥=š:Ö?¬:Ö?¬:ƒ™›:ƒ™›:®:®:ÛÆ�:ÛÆ�:E°:E°:ÿŸ:ÿŸ:8²:8²:[œ¡:[œ¡:X´:X´:{ª£:{ª£:nùµ:nùµ:µI¥:µI¥:gr·:gr·:ð½¦:ð½¦:ظ:ظ:3¨:3¨:�÷¹:�÷¹:tþ¨:tþ¨:µÃº:µÃº:­}©:­}©:×Úº:×Úº:œ6©:œ6©:IZº:IZº:Ĉ¨:Ĉ¨:d¹:d¹:”1§:”1§:ó²·:ó²·:ÇP¥:ÇP¥:̵:̵:Ïc£:Ïc£:Ÿ®³:Ÿ®³:*ö :*ö :é±:é±:ÏSž:ÏSž:Œ®:Œ®:Bå›:Bå›:Uô«:Uô«:J™:J™:—©:—©:ðW–:ðW–:‹¦:‹¦:éê“:éê“:h¤:h¤:Ä…‘:Ä…‘:â¡:â¡: ‘�: ‘�:‰1 :‰1 :u Ž:u Ž:AÄž:AÄž:,·Œ:,·Œ:æ��:æ��:(©‹:(©‹:Ò£œ:Ò£œ:ìÜŠ:ìÜŠ:ïù›:ïù›:P]Š:P]Š:�¥›:�¥›:d(Š:d(Š:=~›:=~›:B Š:B Š:>k›:>k›:º Š:º Š:ÕŽ›:ÕŽ›:JŠ:JŠ:uÉ›:uÉ›:ƒjŠ:ƒjŠ:³Í›:³Í›:gŠ:gŠ:Q×›:Q×›:m|Š:m|Š:&ä›:&ä›:ëtŠ:ëtŠ:=È›:=È›:GŠ:GŠ:ƒ›:ƒ›:×á‰:×á‰:Ãøš:Ãøš:p6‰:p6‰:e/š:e/š:ÞPˆ:ÞPˆ:s1™:s1™::B‡::B‡:ݘ:ݘ:—†:—†:Lê–:Lê–: ã„: ã„:>˜•:>˜•:à{ƒ:à{ƒ:Á”:Á”:+ø�:+ø�:S�’:S�’:žW€:žW€:`à�:`à�:IF}:IF}:§0�:§0�:Ëþy:Ëþy: ”�: ”�:'Æv:'Æv:Ïø‹:Ïø‹:¥s:¥s:"|Š:"|Š:$Øp:$Øp:”‰:”‰:n:n:¼³‡:¼³‡:�Gk:�Gk:<\†:<\†:X¨h:X¨h:a …:a …:îf:îf:äу:äу:§Ðc:§Ðc:3Å‚:3Å‚:½Ça:½Ça:IÈ�:IÈ�:nð_:nð_:°ð€:°ð€:®S^:®S^:ˆ€:ˆ€:Ù”\:Ù”\:Ýu~:Ýu~:vìZ:vìZ:Õë|:Õë|:jY:jY:†V{:†V{:%ÇW:%ÇW:x½y:x½y:KV:KV:ŠYx:ŠYx:\éT:\éT:“év:“év:7uS:7uS:Su:Su:LR:LR:@t:@t:îˆP:îˆP:rnr:rnr:åéN:åéN:|ìp:|ìp:u„M:u„M:£‡o:£‡o:¿ L:¿ L:…n:…n:n�J:n�J:n±l:n±l:}VI:}VI:Ÿek:Ÿek:H:H:Àj:Àj:ÞÃF:ÞÃF:(àh:(àh:æ‹E:æ‹E:’¦g:’¦g:Ë[D:Ë[D:Á…f:Á…f:ÅFC:ÅFC:¾re:¾re:(7B:(7B:Êpd:Êpd:CKA:CKA:b’c:b’c:Âm@:Âm@:O´b:O´b: œ?: œ?:øa:øa:ªõ>:ªõ>:\a:\a: [>: [>:ÿÆ`:ÿÆ`:ŒÔ=:ŒÔ=:éK`:éK`:ã]=:ã]=:>Ñ_:>Ñ_:íà<:íà<:Ó\_:Ó\_:Ý€<:Ý€<:R _:R _:O2<:O2<:;·^:;·^:†Ý;:†Ý;:ãk^:ãk^:™;:™;:Ê^:Ê^:r&;:r&;:,‰]:,‰]:W�::W�::àô\:àô\:Æû9:Æû9: U\: U\:|D9:|D9:I‹[:I‹[:Ev8:Ev8:µ¾Z:µ¾Z:e¤7:e¤7:×Y:×Y:c 6:c 6:è»X:è»X:ûw5:ûw5:�‡W:�‡W:D34:D34:š-V:š-V:¸È2:¸È2:n¸T:n¸T:¯K1:¯K1:&2S:&2S:ˆ½/:ˆ½/:q�Q:q�Q:H$.:H$.:ØúO:ØúO:8q,:8q,:®3N:®3N:èš*:èš*:çRL:çRL:³²(:³²(:º`J:º`J:¼´&:¼´&:[H:[H:Ò²$:Ò²$:8aF:8aF:Ô¼":Ô¼":gD:gD:¹¾ :¹¾ :qkB:qkB:yË:yË:%|@:%|@:¯Ù:¯Ù:d…>:d…>:,ä:,ä:Š—<:Š—<:":":Òº::Òº::±,:±,:|ô8:|ô8:fy:fy:ÍV7:ÍV7:ãî:ãî:‘Ö5:‘Ö5:�s:�s:5`4:5`4:K:K:Ø3:Ø3:F¹:F¹:’¹1:’¹1::o::o:Os0:Os0:¾6 :¾6 :QN/:QN/:a$ :a$ :F.:F.:œ :œ : D-: D-:& :& :qV,:qV,:7A :7A :tr+:tr+:™[:™[:c‹*:c‹*:Àv:Àv:Sª):Sª):Åš:Åš:YÔ(:YÔ(:úÌ:úÌ:x(:x(:Ì:Ì:NV':NV':¢[:¢[:j¥&:j¥&:®¬:®¬:Àù%:Àù%:O:O:´V%:´V%:e:e:ô¶$:ô¶$:mÉ:mÉ:ê $:ê $:è8:è8:<’#:<’#:u«:u«:#:#:Ø&:Ø&:³†":³†":†Kÿ9†Kÿ9":":¡Bþ9¡Bþ9�!:�!:ÍDý9ÍDý9â!:â!:¨<ü9¨<ü9Hx :Hx :Ù%û9Ù%û9Yé:Yé:ûüù9ûüù9 N: N:;Àø9;Àø9�°:�°:úˆ÷9úˆ÷9Â:Â:ÎAö9ÎAö9i:i:õêô9õêô9¾:¾: ’ó9 ’ó9 : :wò9wò9‹C:‹C:“ð9“ð9Hv:Hv:Ïáî9Ïáî9ˆ¢:ˆ¢:u.í9u.í9µÄ:µÄ:së9së9è:è:]¸é9]¸é9E:E:Œïç9Œïç9 : :”æ9”æ9­0:­0:,ä9,ä9»0:»0:ï'â9ï'â9û/:û/:ý&à9ý&à9r*:r*: Þ9 Þ9ú:ú:ºöÛ9ºöÛ9::ÚÙ9ÚÙ9þú:þú:g ×9g ×9»Ú :»Ú :Ÿ]Õ9Ÿ]Õ9M¶ :M¶ :ž Ó9ž Ó9R† :R† :i¥Ð9i¥Ð9ºU :ºU :IÎ9IÎ98' :8' :çË9çË9Îó:Îó:{�É9{�É9Ã:Ã:ú Ç9ú Ç9w�:w�:ɶÄ9ɶÄ9ŠY:ŠY:›GÂ9›GÂ9š!:š!:ÞØ¿9ÞØ¿9?ì:?ì:ãv½9ãv½9&À:&À:¾%»9¾%»9 1ÿ9 1ÿ9/׸9/׸9Uäü9Uäü9°Ž¶9°Ž¶9YŸú9YŸú9GJ´9GJ´9Yø9Yø9/²9/²9ªö9ªö9)Ó¯9)Ó¯9!ïó9!ïó9¦¨­9¦¨­9¸Éñ9¸Éñ9žŽ«9žŽ«9§½ï9§½ï9´Œ©9´Œ©9 ¾í9 ¾í9ù‹§9ù‹§9¾ë9¾ë9™’¥9™’¥9�Ëé9�Ëé9|¡£9|¡£9®Öç9®Öç9B©¡9B©¡9¥áå9¥áå9�¾Ÿ9�¾Ÿ9Çÿã9Çÿã9·Þ�9·Þ�9æâ9æâ9 ý›9 ý›9ó?à9ó?à99#š99#š9yeÞ9yeÞ9iD˜9iD˜9]„Ü9]„Ü9xe–9xe–9”§Ú9”§Ú9Ї”9Ї”9ÆØ9ÆØ9€¢’9€¢’9:àÖ9:àÖ9®¿�9®¿�9:Õ9:Õ9gàŽ9gàŽ9·Ó9·Ó9PþŒ9PþŒ9Œ<Ñ9Œ<Ñ9s‹9s‹9òWÏ9òWÏ9Ï5‰9Ï5‰9�sÍ9�sÍ9WP‡9WP‡9·ŠË9·ŠË9jc…9jc…9à›É9à›É95vƒ95vƒ9l±Ç9l±Ç9†Œ�9†Œ�9†ÆÅ9†ÆÅ9@@9@@9#ÚÃ9#ÚÃ9™m{9™m{9âõÁ9âõÁ9º¬w9º¬w9;À9;À9Més9Més9“2¾9“2¾9$p9$p9ßR¼9ßR¼9&fl9&fl9vqº9vqº9žœh9žœh9‰Œ¸9‰Œ¸9cÛd9cÛd9º±¶9º±¶9£+a9£+a9~Ù´9~Ù´9¢w]9¢w]9Ùþ²9Ùþ²9,ÃY9,ÃY9ž$±9ž$±9 V9 V9§D¯9§D¯9ÏCR9ÏCR9S_­9S_­9dtN9dtN9–t«9–t«9Œ–J9Œ–J9 ‚©9 ‚©9S­F9S­F97ާ97ާ9zÉB9zÉB9Ûœ¥9Ûœ¥9á>9á>9P¤£9P¤£9´è:9´è:9C§¡9C§¡9`í69`í69°¦Ÿ9°¦Ÿ9Öà29Öà29Qœ�9Qœ�9»Ë.9»Ë.9O•›9O•›9ßÃ*9ßÃ*9!’™9!’™9º&9º&9쌗9쌗9Ô³"9Ô³"9!�•9!�•9Á¶9Á¶9«Ž“9«Ž“9J¹9J¹9‘‘9‘‘9³À9³À9‰–�9‰–�9FÎ9FÎ9àŸ�9àŸ�9ææ9ææ9 ¯‹9 ¯‹9ü 9ü 9ÃÁ‰9ÃÁ‰9O39O39ÛÛ‡9ÛÛ‡9 o9 o9�ü…9�ü…9 cÿ8 cÿ8i„9i„9Éð÷8Éð÷8]F‚9]F‚9¤ð8¤ð8Çv€9Çv€9+gé8+gé8ŸO}9ŸO}9t1â8t1â8«½y9«½y9yÛ8yÛ8†5v9†5v9 Ô8 Ô8P®r9P®r9FÿÌ8FÿÌ8Î+o9Î+o9ªôÅ8ªôÅ8Ê¡k9Ê¡k9ؾ8ؾ8ðh9ðh9t¿·8t¿·8“†d9“†d9¦”°8¦”°8Ãì`9Ãì`9da©8da©8ôY]9ôY]9ˆA¢8ˆA¢8ZÆY9ZÆY9¨›8¨›8)#V9)#V9ż“8ż“8€R9€R9ÄpŒ8ÄpŒ8.ÕN9.ÕN9â…8â…84%K94%K9ºh{8ºh{8œzG9œzG9ï¶l8ï¶l8DÍC9DÍC9Z^8Z^8Ì%@9Ì%@9vO8vO8ð„<9ð„<9bå@8bå@8›ß89›ß89*Q28*Q28€=59€=59MÃ#8MÃ#8s˜19s˜19ö'8ö'8aö-9aö-9<¶8<¶8E_*9E_*9²®ð7²®ð7�Ç&9�Ç&9ÂíÓ7ÂíÓ73#93#9ÄT·7ÄT·7ÓŸ9ÓŸ9¦‹š7¦‹š7 9 9Æùz7Æùz7­a9­a9/ó@7/ó@7ÛÀ9ÛÀ9—7—7H9H9ó�—6ó�—65j 95j 9}F…5}F…55¶ 95¶ 9Ìø*¶Ìø*¶·ÿ9·ÿ9ïä̶ïä̶±>9±>99#·9#·Eãü8Eãü8É÷_·É÷_·-Iõ8-Iõ8-‡Ž·-‡Ž·ž›í8ž›í8õu­·õu­·½Þå8½Þå8êmÌ·êmÌ·qÞ8qÞ8³ªë·³ªë·ýBÖ8ýBÖ8í£¸í£¸ð\Î8ð\Î8|¸|¸0hÆ80hÆ8Qˆ%¸Qˆ%¸ØZ¾8ØZ¾8nª5¸nª5¸ O¶8 O¶8áÊE¸áÊE¸<:®8<:®8DV¸DV¸$¦8$¦8IJf¸IJf¸¨þ�8¨þ�8ïŠv¸ïŠv¸Ý•8Ý•8{lƒ¸{lƒ¸¼º�8¼º�8ü‹‹¸ü‹‹¸q¥…8q¥…8—�“¸—�“¸C6{8C6{8§›¸§›¸ª1k8ª1k8ô§£¸ô§£¸+;[8+;[8÷¥«¸÷¥«¸ªEK8ªEK8Ø ³¸Ø ³¸ª_;8ª_;8§‘»¸§‘»¸±�+8±�+8#yø#yøyÐ8yÐ8T˸T˸++ 8++ 8N&Ó¸N&Ó¸¿*ù7¿*ù7£ðÚ¸£ðÚ¸þÚ7þÚ7–¼â¸–¼â¸6àº76àº7“�긓�ê¸î¶›7î¶›74Uò¸4Uò¸ëhy7ëhy7 ú¸ ú¸¡p;7¡p;7ì¹ì¹1bû61bû6‹Ç¹‹Ç¹Q@€6Q@€6À¢¹À¢¹® 4® 4ð} ¹ð} ¹(l¶(l¶PX¹PX¹f-ñ¶f-ñ¶Ê2¹Ê2¹w6·w6·s ¹s ¹Ds·Ds·MÖ¹MÖ¹iË—·iË—·ÔŸ¹ÔŸ¹ú¶·ú¶·Ód#¹Ód#¹NæÓ·NæÓ·M'¹M'¹²‰ñ·²‰ñ·7Ó*¹7Ó*¹�¸�¸á�.¹á�.¹D#¸D#¸?#2¹?#2¹l’$¸l’$¸k¾5¹k¾5¹Âé2¸Âé2¸Q9¹Q9¹JA¸JA¸MØ<¹MØ<¹žO¸žO¸0W@¹0W@¹ñö\¸ñö\¸ŸÊC¹ŸÊC¹�¦j¸�¦j¸s4G¹s4G¹d7x¸d7x¸+–J¹+–J¹îÏ‚¸îÏ‚¸ïìM¹ïìM¹µp‰¸µp‰¸¯;Q¹¯;Q¹Þ�¸Þ�¸zT¹zT¹Su–¸Su–¸µW¹µW¹øÑœ¸øÑœ¸DáZ¹DáZ¹,£¸,£¸^¹^¹TL©¸TL©¸Ïa¹Ïa¹h¯¸h¯¸"d¹"d¹‚oµ¸‚oµ¸/#g¹/#g¹>f»¸>f»¸+j¹+j¹{KÁ¸{KÁ¸� m¹� m¹‚Ǹ‚Ǹïo¹ïo¹$Ñ̸$Ñ̸õÈr¹õÈr¹QtÒ¸QtÒ¸û–u¹û–u¹LظLظð_x¹ð_x¹¾ŽÝ¸¾ŽÝ¸¢#{¹¢#{¹=ã¸=ã¸0Û}¹0Û}¹Ihè¸Ih踜F€¹œF€¹¶Àí¸¶Àí¸š�¹š�¹Æúò¸Æúò¸¬æ‚¹¬æ‚¹�ø¸�ø¸,.„¹,.„¹++ý¸++ý¸øo…¹øo…¹Y¹Y¹7­†¹7­†¹9†¹9†¹»æ‡¹»æ‡¹¢ð¹¢ð¹Ê‰¹Ê‰¹.N¹.N¹GйGŠ¹ÄŸ ¹ÄŸ ¹Cm‹¹Cm‹¹šá ¹šá ¹2ŒŒ¹2ŒŒ¹³¹³¹+§�¹+§�¹G¹G¹ª¼Ž¹ª¼Ž¹bi¹bi¹‰Ì�¹‰Ì�¹@‚¹@‚¹´×�¹´×�¹™Ž¹™Ž¹êÚ‘¹êÚ‘¹jйjйג¹×’¹¡z¹¡z¹‹Í“¹‹Í“¹^¹^¹ ½”¹ ½”¹Û4¹Û4¹“§•¹“§•¹ü!¹ü!¹”Œ–¹”Œ–¹kÃ"¹kÃ"¹-l—¹-l—¹Øz$¹Øz$¹+F˜¹+F˜¹f$&¹f$&¹�™¹�™¹ÇÀ'¹ÇÀ'¹K晹K晹XU)¹XU)¹:¯š¹:¯š¹0Þ*¹0Þ*¹dr›¹dr›¹t],¹t],¹h1œ¹h1œ¹)Ó-¹)Ó-¹€êœ¹€êœ¹V¤¹>¤¹¾p=¹¾p=¹¦¤¹¦¤¹-8>¹-8>¹Š ¥¹Š ¥¹.ø>¹.ø>¹¾h¥¹¾h¥¹o­?¹o­?¹ Â¥¹ Â¥¹“W@¹“W@¹U¦¹U¦¹â÷@¹â÷@¹’e¦¹’e¦¹ŽA¹ŽA¹Å¯¦¹Å¯¦¹ðB¹ðB¹Ïô¦¹Ïô¦¹œB¹œB¹{5§¹{5§¹ÀC¹ÀC¹¡q§¹¡q§¹´…C¹´…C¹Ý¨§¹Ý¨§¹ùëC¹ùëC¹JÛ§¹JÛ§¹�HD¹�HD¹Ø¨¹Ø¨¹˜›D¹˜›D¹Ú1¨¹Ú1¨¹WåD¹WåD¹V¨¹V¨¹ç%E¹ç%E¹v¨¹v¨¹#_E¹#_E¹“¨¹“¨¹ë’E¹ë’E¹J­¨¹J­¨¹=ÀE¹=ÀE¹–è¹–è¹’äE¹’äE¹:Õ¨¹:Õ¨¹F¹F¹Þ⨹Þ⨹šF¹šF¹쨹쨹wF¹wF¹Ãð¨¹Ãð¨¹@ F¹@ F¹¡ò¨¹¡ò¨¹ÐF¹ÐF¹�ð¨¹�ð¨¹ZF¹ZF¹꨹꨹ºûE¹ºûE¹bߨ¹bߨ¹`ÝE¹`ÝE¹,Ϩ¹,Ϩ¹Ê³E¹Ê³E¹&º¨¹&º¨¹�‚E¹�‚E¹«¡¨¹«¡¨¹£IE¹£IE¹÷„¨¹÷„¨¹7 E¹7 E¹Çe¨¹Çe¨¹hÅD¹hÅD¹TD¨¹TD¨¹3zD¹3zD¹T¨¹T¨¹±&D¹±&D¹0õ§¹0õ§¹ÛÍC¹ÛÍC¹ ɧ¹ ɧ¹¦mC¹¦mC¹™§¹™§¹…C¹…C¹/g§¹/g§¹–�B¹–�B¹Ë2§¹Ë2§¹Á-B¹Á-B¹žû¦¹žû¦¹…¹A¹…¹A¹o¦¹o¦¹ñ?A¹ñ?A¹Ä…¦¹Ä…¦¹ð¾@¹ð¾@¹µE¦¹µE¦¹Ã7@¹Ã7@¹£¦¹£¦¹ƒª?¹ƒª?¹Å¼¥¹Å¼¥¹‘?¹‘?¹Ét¥¹Ét¥¹³�>¹³�>¹Ø)¥¹Ø)¥¹»ä=¹»ä=¹9ܤ¹9ܤ¹ÂB=¹ÂB=¹©‹¤¹©‹¤¹n™<¹n™<¹J7¤¹J7¤¹ùé;¹ùé;¹ÈࣹÈࣹg6;¹g6;¹u‡£¹u‡£¹µ{:¹µ{:¹£*£¹£*£¹W»9¹W»9¹tË¢¹tË¢¹ßõ8¹ßõ8¹Oi¢¹Oi¢¹Q*8¹Q*8¹¢¹¢¹éY7¹éY7¹êœ¡¹êœ¡¹Ÿ‚6¹Ÿ‚6¹¶1¡¹¶1¡¹8¥5¹8¥5¹LÄ ¹LÄ ¹ÔÃ4¹ÔÃ4¹4T ¹4T ¹>Û3¹>Û3¹fàŸ¹fàŸ¹ðì2¹ðì2¹ÑjŸ¹ÑjŸ¹Œû1¹Œû1¹çòž¹çòž¹–1¹–1¹©wž¹©wž¹‚0¹‚0¹ƒú�¹ƒú�¹!/¹!/¹lz�¹lz�¹-ý-¹-ý-¹˜÷œ¹˜÷œ¹èð,¹èð,¹Œrœ¹Œrœ¹Uß+¹Uß+¹Â꛹Â꛹ É*¹ É*¹a›¹a›¹É®)¹É®)¹ÅÔš¹ÅÔš¹wŽ(¹wŽ(¹ÉEš¹ÉEš¹ži'¹ži'¹h´™¹h´™¹±>&¹±>&¹‡™¹‡™¹B %¹B %¹!ˆ˜¹!ˆ˜¹˜×#¹˜×#¹^î—¹^î—¹œ"¹œ"¹…Q—¹…Q—¹øZ!¹øZ!¹²–¹²–¹8 ¹8 ¹o–¹o–¹aƹaƹ4i•¹4i•¹Ÿq¹Ÿq¹Š¿”¹Š¿”¹ì¹ì¹š”¹š”¹6´¹6´¹àb“¹àb“¹1M¹1M¹…°’¹…°’¹¹à¹¹à¹’û‘¹’û‘¹Îo¹Îo¹°D‘¹°D‘¹ªú¹ªú¹9‹�¹9‹�¹è¹è¹jÏ�¹jÏ�¹ø¹ø¹V�¹V�¹¯€¹¯€¹&S޹&S޹�û¹�û¹´’�¹´’�¹¼t ¹¼t ¹aÑŒ¹aÑŒ¹ ë ¹ ë ¹ÒŒ¹ÒŒ¹S` ¹S` ¹JK‹¹JK‹¹…Ò¹…Ò¹†Š¹†Š¹¼@¹¼@¹ç¾‰¹ç¾‰¹¨«¹¨«¹*öˆ¹*öˆ¹½¹½¹B+ˆ¹B+ˆ¹Ìu¹Ìu¹Ï^‡¹Ï^‡¹ZÖ¹ZÖ¹‘†¹‘†¹vgþ¸vgþ¸vÁ…¹vÁ…¹,û¸,û¸øï„¹øï„¹Æ÷¸Æ÷¸¿„¹¿„¹Œiô¸Œiô¸Gƒ¹Gƒ¹óñ¸óñ¸Wo‚¹Wo‚¹8—í¸8—í¸�–�¹�–�¹”%긔%ê¸ì»€¹ì»€¹5¬æ¸5¬æ¸I¿¹I¿¹Ã-ã¸Ã-㸴~¹´~¹ «ß¸ «ß¸sG|¹sG|¹Î!ܸÎ!ܸ͆z¹Í†z¹D’ظD’ظoÃx¹oÃx¹ßýÔ¸ßýÔ¸Úýv¹Úýv¹DeѸDeѸf6u¹f6u¹uÉ͸uÉ͸±ms¹±ms¹©+ʸ©+ʸ¤q¹¤q¹ ‹Æ¸ ‹Æ¸ˆØo¹ˆØo¹«æÂ¸«æÂ¸ n¹ n¹@¿¸@¿¸}=l¹}=l¹Ë–»¸Ë–»¸þmj¹þmj¹ë·¸ë·¸ê�h¹ê�h¹a?´¸a?´¸úÍf¹úÍf¹º’°¸º’°¸ýd¹ýd¹Á䬸Á䬸C,c¹C,c¹Z7©¸Z7©¸?[a¹?[a¹À‡¥¸À‡¥¸Ðˆ_¹Ðˆ_¹uÖ¡¸uÖ¡¸d¶]¹d¶]¹±%ž¸±%ž¸Þã[¹Þã[¹èsš¸èsš¸QZ¹QZ¹0Ä–¸0Ä–¸^@X¹^@X¹1“¸1“¸ënV¹ënV¹Ïe�¸Ïe�¸�T¹�T¹·‹¸·‹¸`ÌR¹`ÌR¹þˆ¸þˆ¸/ûP¹/ûP¹ZZ„¸ZZ„¸ +O¹ +O¹@°€¸@°€¸3]M¹3]M¹Ûz¸Ûz¸Ñ�K¹Ñ�K¹"Är¸"Är¸×ÃI¹×ÃI¹Ó}k¸Ó}k¸ùG¹ùG¹Î:d¸Î:d¸l/F¹l/F¹Uþ\¸Uþ\¸—gD¹—gD¹pÈU¸pÈU¸|¡B¹|¡B¹úšN¸úšN¸Þ@¹Þ@¹ÙxG¸ÙxG¸6?¹6?¹‘_@¸‘_@¸^^=¹^^=¹íM9¸íM9¸ƒ¡;¹ƒ¡;¹oD2¸oD2¸åæ9¹åæ9¹E+¸E+¸e/8¹e/8¹IT$¸IT$¸z{6¹z{6¹ìn¸ìn¸Ê4¹Ê4¹•¸•¸i3¹i3¹T̸T̸†r1¹†r1¹9 ¸9 ¸Ë/¹Ë/¹Ã\¸Ã\¸±'.¹±'.¹hx÷·hx÷·¸‡,¹¸‡,¹Kê·Kê·hê*¹hê*¹~:Ý·~:Ý·@Q)¹@Q)¹»Eз»Eз…º'¹…º'¹ob÷ob÷Ä&&¹Ä&&¹›¶·›¶·#–$¹#–$¹Bå©·Bå©·F#¹F#¹¬B�·¬B�·Â{!¹Â{!¹Öº�·Öº�·óò¹óò¹2D„·2D„·el¹el¹MÅo·MÅo·¶è¹¶è¹�-W·�-W·‹g¹‹g¹-¾>·-¾>·eé¹eé¹Þ‡&·Þ‡&·o¹o¹ýˆ·ýˆ·Þ÷¹Þ÷¹Ý€í¶Ý€í¶³„¹³„¹{¾¶{¾¶Ì¹Ì¹Ïñ�¶Ïñ�¶±ª¹±ª¹AÅC¶AÅC¶qC¹qC¹z,ѵz,ѵãß¹ãß¹Óf´Óf´¹€¹¹€¹Ü\•5Ü\•5 & ¹ & ¹²"6²"6šÏ ¹šÏ ¹Ý…y6Ý…y6y~ ¹y~ ¹”Œ§6”Œ§6l1 ¹l1 ¹‰éÑ6‰éÑ6è¹è¹—ºû6—ºû6†£¹†£¹¹y7¹y7xc¹xc¹ˆÐ&7ˆÐ&7ë'¹ë'¹jß:7jß:7Ïð¹Ïð¹C¨N7C¨N7=¾¹=¾¹š&b7š&b7B�¹B�¹+au7+au7yÌþ¸yÌþ¸¢.„7¢.„7ú€ü¸ú€ü¸Á‡�7Á‡�7¶>ú¸¶>ú¸ž¿–7ž¿–7îø¸îø¸ˆÚŸ7ˆÚŸ7%Ñõ¸%Ñõ¸[Ò¨7[Ò¨7§ó¸§ó¸B«±7B«±7ùƒñ¸ùƒñ¸¨iº7¨iº7hï¸h︵Ã7µÃ7¦Tí¸¦Tí¸o†Ë7o†Ë7’H븒Hë¸ÃçÓ7ÃçÓ77Dé¸7Dé¸~*Ü7~*Ü7Gç¸G縛Sä7›Sä7På¸På¸pbì7pbì7ˆ`㸈`ã¸îPô7îPô7Cyá¸Cyá¸cü7cü7šß¸šß¸—æ8—æ8JÃݸJÃݸӬ8Ó¬8tôÛ¸tôÛ¸ÿc 8ÿc 8b-Ú¸b-Ú¸\ 8\ 8nظnظ?¤8?¤8´µÖ¸´µÖ¸ /8 /8XÕ¸XÕ¸ô§8ô§8B^Ó¸B^Ó¸Œ8Œ8 ¿Ñ¸ ¿Ñ¸¸h8¸h8'и'иk³!8k³!8û•θû•θÂñ$8Âñ$8— ͸— ͸=%(8=%(8é„˸é„˸rL+8rL+8åʸåʸ8f.88f.8|�ȸ|�ȸ‘s18‘s18üǸüǸ¤u48¤u48D®Å¸D®Å¸Èk78Èk78’Gĸ’GĸŽW:8ŽW:8Éä¸Éä¸C==8C==8²…Á¸²…Á¸�@8�@8â,À¸â,À¸§èB8§èB8yؾ¸yؾ¸5°E85°E8Ò‰½¸Ò‰½¸†iH8†iH8CB¼¸CB¼¸K8K8¬þº¸¬þº¸­¾M8­¾M8À¹¸À¹¸8ZP88ZP8Á†¸¸Á†¸¸BíR8BíR8pQ·¸pQ·¸¢vU8¢vU8"¶¸"¶¸ÍóW8ÍóW86ø´¸6ø´¸îgZ8îgZ8ÝÒ³¸ÝÒ³¸ÁÑ\8ÁÑ\8ù²²¸ù²²¸.2_8.2_8—±¸—±¸T‹a8T‹a8L°¸L°¸oÚc8oÚc8ãl¯¸ãl¯¸\ f8\ f8f^®¸f^®¸§^h8§^h8™T­¸™T­¸á‘j8á‘j8sP¬¸sP¬¸�»l8�»l8ŽP«¸ŽP«¸TÜn8TÜn8µUª¸µUª¸Róp8Róp83_©¸3_©¸5s85s8]m¨¸]m¨¸u8u8%€§¸%€§¸mw8mw8•–¦¸•–¦¸bùx8bùx8Ú±¥¸Ú±¥¸Žåz8Žåz8¤Ð¤¸¤Ð¤¸†Ë|8†Ë|8;ó£¸;ó£¸w¨~8w¨~8L£¸L£¸e?€8e?€8ÅC¢¸ÅC¢¸ñ'�8ñ'�89q¡¸9q¡¸Í ‚8Í ‚8º¢ ¸º¢ ¸í‚8í‚8IÖŸ¸IÖŸ¸´Ëƒ8´Ëƒ8´ Ÿ¸´ Ÿ¸ ¦„8 ¦„8Iž¸Iž¸O}…8O}…8[‡�¸[‡�¸ Q†8 Q†8¾Éœ¸¾Éœ¸$!‡8$!‡8䜸䜸Jï‡8Jï‡8KV›¸KV›¸iºˆ8iºˆ8¡š¸¡š¸ù‚‰8ù‚‰8£í™¸£í™¸ÃIŠ8ÃIŠ8Ý<™¸Ý<™¸Y ‹8Y ‹8$�˜¸$�˜¸ÆÎ‹8ÆÎ‹8㗸㗸…ŽŒ8…ŽŒ8â8—¸â8—¸üL�8üL�8o�–¸o�–¸÷ Ž8÷ Ž8±æ•¸±æ•¸ÈŽ8ÈŽ8É>•¸É>•¸É„�8É„�8|—”¸|—”¸c@�8c@�8£ñ“¸£ñ“¸±ú�8±ú�8ÂK“¸ÂK“¸³‘8³‘8袒¸è¢’¸¦h’8¦h’8r÷‘¸r÷‘¸f“8f“8I‘¸I‘¸XË“8XË“8X˜�¸X˜�¸äw”8äw”8{å�¸{å�¸â •8â •8å0�¸å0�¸£Å•8£Å•86{ޏ6{ޏDf–8Df–8BÃ�¸BÃ�¸4—84—8z�¸z�¸Ÿ—8Ÿ—8¢KŒ¸¢KŒ¸Q6˜8Q6˜8qŒ‹¸qŒ‹¸nʘ8nʘ8RËŠ¸RËŠ¸sZ™8sZ™8÷Џ÷Џfæ™8fæ™8šD‰¸šD‰¸4oš84oš8Å}ˆ¸Å}ˆ¸õš8õš81´‡¸1´‡¸Zx›8Zx›8^熸^熸Pù›8Pù›8­†¸­†¸˜wœ8˜wœ8þD…¸þD…¸šóœ8šóœ8ön„¸ön„¸hm�8hm�8Ö•ƒ¸Ö•ƒ¸Ñä�8Ñä�8‡¹‚¸‡¹‚¸Zž8Zž8ðÙ�¸ðÙ�¸Íž8Íž8åö€¸åö€¸¬>Ÿ8¬>Ÿ8œ€¸œ€¸Ð®Ÿ8ЮŸ8%J~¸%J~¸/ 8/ 8ðo|¸ðo|¸‡ 8‡ 8]�z¸]�z¸´ï 8´ï 8Í©x¸Í©x¸ìT¡8ìT¡8–Àv¸–Àv¸·¡8·¡8¢Ñt¸¢Ñt¸¢8¢8^Ýr¸^Ýr¸°s¢8°s¢8xåp¸xåp¸RÍ¢8RÍ¢8Lèn¸Lèn¸H$£8H$£8ìæl¸ìæl¸Íw£8Íw£8(âj¸(âj¸ÕÇ£8ÕÇ£8Úh¸Úh¸\¤8\¤8FÎf¸FÎf¸&^¤8&^¤8Á¼d¸Á¼d¸«¥¤8«¥¤8[¦b¸[¦b¸Pê¤8Pê¤8‹`¸‹`¸Û,¥8Û,¥8ii^¸ii^¸Jm¥8Jm¥8«B\¸«B\¸_«¥8_«¥8ÂZ¸ÂZ¸Æç¥8Æç¥8¼âW¸¼âW¸."¦8."¦85©U¸5©U¸`[¦8`[¦8hS¸hS¸M“¦8M“¦8; Q¸; Q¸Ôɦ8Ôɦ8ÏÐN¸ÏÐN¸ÿ¦8ÿ¦8²©8>²©8l¼õ·l¼õ·µ¥©8µ¥©8tð·tð·ß–©8ß–©8f_ê·f_ê·›„©8›„©8o°ä·o°ä·¡o©8¡o©8}þÞ·}þÞ· X©8 X©8WLÙ·WLÙ·1=©81=©8©šÓ·©šÓ·<©8<©8|êÍ·|êÍ·{ý¨8{ý¨8 ?È· ?È·™×¨8™×¨8ë—·ë—·魨8é­¨8§ô¼·§ô¼·y€¨8y€¨8U··U··hO¨8hO¨8|¹±·|¹±·Ž¨8ލ8ë"¬·ë"¬·½á§8½á§8’¦·’¦·Ó¤§8Ó¤§8H¡·H¡·Žc§8Žc§8†›·†›·§8§8± –·± –·vÔ¦8vÔ¦8“–�·“–�·Õ†¦8Õ†¦8Ë(‹·Ë(‹·u5¦8u5¦8ÓÁ…·ÓÁ…·åߥ8åߥ8Æc€·Æc€·ô…¥8ô…¥8ßv·ßv·ž'¥8ž'¥8Ƈk·Æ‡k·ÃĤ8ÃĤ8Va·Va·]¤8]¤8U˜V·U˜V·ôñ£8ôñ£8›>L·›>L·ó�£8ó�£8ÃúA·ÃúA·– £8– £8bÌ7·bÌ7· ”¢8 ”¢8E¸-·E¸-·¢¢8¢¢8¤¿#·¤¿#·À“¡8À“¡8�â·�â·Û ¡8Û ¡8É"·É"·ß~ 8ß~ 8´€·´€·ÚìŸ8ÚìŸ8˜úù¶˜úù¶ŸUŸ8ŸUŸ85ç¶5ç¶¹ž8¹ž8Ô²Ô¶Ô²Ô¶ž8ž8Ìx¶Ìx¶lo�8lo�8‰°¶‰°¶9œ89œ8Láž¶Láž¶£œ8£œ8²ƒ�¶²ƒ�¶\W›8\W›8ìx¶ìx¶V™š8V™š8ÊlW¶ÊlW¶ÏÕ™8ÏÕ™8k‹6¶k‹6¶‹ ™8‹ ™8áN¶áN¶¬=˜8¬=˜8{eíµ{eíµ7i—87i—8åy¯µåy¯µ7�–87�–8U˜eµU˜eµð¯•8ð¯•8ǘݴǘݴ Ë”8 Ë”8e©2e©2¬à“8¬à“8z¥í4z¥í4ñ’8ñ’8E¬e5E¬e5Êû‘8Êû‘8àè¨5àè¨5`‘8`‘8÷´Ý5÷´Ý5Þ�8Þ�8©•6©•6ýŽ8ýŽ8‘¡!6‘¡!6ÿò�8ÿò�8ÿý96ÿý96²ãŒ8²ãŒ8t§Q6t§Q6#Ï‹8#Ï‹8æœh6æœh6fµŠ8fµŠ8®Þ~6®Þ~6…–‰8…–‰8R5Š6R5Š6„rˆ8„rˆ8¦Ÿ”6¦Ÿ”6WI‡8WI‡8êž6êž6߆8߆8½V¨6½V¨6Qç„8Qç„8棱6棱6Œ®ƒ8Œ®ƒ8ÊŽº6ÊŽº6°p‚8°p‚8VÃ6VÃ6ÿ-�8ÿ-�8-IË6-IË6<Ì8<Ì8 Ó6 Ó6¶2}8¶2}8§}Ú6§}Ú6â�z8â�z8»ˆá6»ˆá6iãw8iãw8)4è6)4è6 .u8 .u8­ƒî6­ƒî6áor8áor8uô6uô6(©o8(©o8W ú6W ú6hÚl8hÚl88Jÿ68Jÿ6Cj8Cj8û7û72$g82$g8Y7Y7Ù=d8Ù=d8 q7 q7àOa8àOa8@\7@\7îZ^8îZ^8¯ 7¯ 7ˆ_[8ˆ_[8¸´ 7¸´ 7r]X8r]X8ù 7ù 7UU8UU8ûc7ûc7ßFR8ßFR84~74~73O83O8tp7tp7ßL8ßL8+;7+;7²ûH8²ûH8pß7pß7ðØE8ðØE8Ä]7Ä]7”±B8”±B8jµ7jµ7â…?8â…?8è7è7TV<8TV<8Ïõ7Ïõ7Þ"98Þ"98¹Þ7¹Þ7ì58ì58ú¤7ú¤7A²28A²28ñG7ñG7fu/8fu/8#È7#È7 6,8 6,8.'7.'7sô(8sô(8ðd7ðd7ذ%8ذ%8ß‚7ß‚7Úk"8Úk"8e‚7e‚7°%8°%8¦c 7¦c 7´Þ8´Þ80( 70( 7X—8X—8ŠÐ 7ŠÐ 7ÓO8ÓO8¼] 7¼] 7®8®8_Ñ7_Ñ7LÂ8LÂ8 ,7 ,7ö| 8ö| 8ûn7ûn7<98<98ó›7ó›7ˆ÷8ˆ÷8m³7m³7¸8¸8 lý6 lý6Döü7Döü7/Jù6/Jù6†‚ö7†‚ö7aõ6aõ6•ð7•ð7Ý™ð6Ý™ð6G°é7G°é7Kì6Kì6€Sã7€Sã7Ñhç6Ñhç6ÔÿÜ7ÔÿÜ7m¤â6m¤â6ŵÖ7ŵÖ7ÕÄÝ6ÕÄÝ6vÐ7vÐ7zÌØ6zÌØ6šAÊ7šAÊ7 ½Ó6 ½Ó6ßÄ7ßÄ7µ˜Î6µ˜Î6Õü½7Õü½7BbÉ6BbÉ6;î·7;î·7\Ä6\Ä6¾í±7¾í±7cƾ6cƾ6.ü«7.ü«7-e¹6-e¹6¦7¦7)ù³6)ù³6 H 7 H 7¢„®6¢„®6‡š7‡š7ì ©6ì ©6Í×”7Í×”7H‹£6H‹£6ò:�7ò:�7Ö ž6Ö ž6>±‰7>±‰7|Š˜6|Š˜6R;„7R;„7ç “6ç “6¦³}7¦³}7"‘�6"‘�6ås7ås7ˆ6ˆ6Ž­h7Ž­h7+®‚6+®‚6þl^7þl^7É“z6É“z6“ZT7“ZT7xáo6xáo6`wJ7`wJ7ÓHe6ÓHe6»Ä@7»Ä@7§ÍZ6§ÍZ6¼C77¼C77‘rP6‘rP6€õ-7€õ-7M;F6M;F6HÛ$7HÛ$7ü*<6ü*<6ö7ö7iD26iD26ÿF7ÿF7öŠ(6öŠ(6$Ï 7$Ï 7\6\6x�7x�7mª6mª6õ6õ6C‰ 6C‰ 6Óyå6Óyå6o 6o 6ØWÖ6ØWÖ6Éäõ5Éäõ5®Ç6®Ç6[å5[å5%~¹6%~¹6È Ô5È Ô5ÅÉ«6ÅÉ«6ÂÄ5ÂÄ5È’ž6È’ž6Þkµ5Þkµ5«Ú‘6«Ú‘6롦5롦5ø¢…6ø¢…6rh˜5rh˜5FÚs6FÚs6«ÂŠ5«ÂŠ5Õt]6Õt]6¸g{5¸g{5VH6VH6£~b5£~b5 Ç36 Ç36<ÏJ5<ÏJ5xƒ 6xƒ 6Z_45Z_45ªO6ªO6ã35ã35E[ú5E[ú5ÐP 5ÐP 5t>Ú5t>Ú5tñ4tñ42L¼52L¼5—äÎ4—äÎ4e‡ 5e‡ 5Æø®4Æø®4øò†5øò†5vµ‘4vµ‘4Î"_5Î"_54Ãj>4ß5ß5„ù4„ù4ÇÊÚ4ÇÊÚ4ËÑÝ3ËÑÝ3ø¾ 4ø¾ 4¸pž3¸pž3—=_4—=_4Ô�S3Ô�S3~Ù4~Ù4÷7ÿ2÷7ÿ2ª 3ª 32Ì�22Ì�2ˆÃ3ˆÃ3bBº1bBº1ij2ij2Yñ$0Yñ$0././@LongLink0000644000000000000000000000015200000000000011601 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/BinauralDecoder/Source/EQ/AKG-K240MK2.wavIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/BinauralDecoder/Source/EQ/AKG-K240MK0000664002537200253720000004013015257173642030610 0ustar zmoelnigzmoelnigRIFFP@WAVEfmt €»Ü factPEAKàc YeN?eN?data@eN?eN?Ü›½Ü›½ÝG =ÝG =˜¦¨¼˜¦¨¼O¥˜¾O¥˜¾©fÀ½©fÀ½�Îe=�Îe=òÂ=òÂ=lÁ*½lÁ*½¦þ»¦þ»·ÕL;·ÕL;¼Æ.<¼Æ.<jͼjͼuUû¼uUû¼Á+€½Á+€½¡ö޽¡ö޽�†�¼�†�¼ôf=ôf=œÆš=œÆš=‡"=‡"=Ýö”»Ýö”»G§ ½G§ ½FÂ#½FÂ#½F"¢¼F"¢¼°ÀÛ;°ÀÛ;Ÿ˜5<Ÿ˜5<æêÈ:æêÈ:ÚÓ‡;ÚÓ‡;�†¨<�†¨<Ý"=Ý"=‰Oú<‰Oú<ßLq<ßLq.;Õ>.; S; S;dYó:dYó:­ç:­ç:“šã:“šã:áÿ:áÿ:_³;_³;ð<;ð<;£G;£G;ó˜;ó˜;‰7;‰7;CF!;CF!;’ý;’ý;ƒâ;ƒâ;Á2;Á2;”3;”3;0có:0có:j„ø:j„ø:>Mì:>Mì:üañ:üañ:¼9æ:¼9æ:‡½ñ:‡½ñ: …ì: …ì:ö×ö:ö×ö:Chë:Chë:iÎî:iÎî:S1Ü:S1Ü:•RØ:•RØ:¯Ò¿:¯Ò¿:†!¸:†!¸:už:už:k™:k™:J†:J†:8Š:8Š:Nm€:Nm€:°^Œ:°^Œ:ÀM‰:ÀM‰:y›:y›:{�:{�:¹‡°:¹‡°:J ±:J ±:”IÃ:”IÃ:ÓÁÂ:ÓÁÂ:´°Ô:´°Ô:óæÔ:óæÔ:R…æ:R…æ:‰ä:‰ä:Äåô:Äåô:J}ô:J}ô:ú›;ú›;Mø;Mø;æN ;æN ;Åà ;Åà ; x; x;V;V;CH;CH;§ˆ;§ˆ;Áß;Áß;âD;âD;K;K;"?;"?;Äè;Äè;1x;1x;É ;É ;Œf;Œf;,M;,M;�É;�É;Z: ;Z: ;¬ ;¬ ;$ );$ );D‚(;D‚(;D¬0;D¬0;Om/;Om/;É7;É7;àx5;àx5;s<;s<;ù¼9;ù¼9;á?;á?;b =;b =;ÁhC;ÁhC;¡�@;¡�@;4F;4F;Ð B;Ð B;m=F;m=F;pÕ@;pÕ@;”5D;”5D;�ú=;�ú=;¨@;¨@;.8;.8;š9;š9;zè0;zè0;Óý1;Óý1;T*;T*; 5+; 5+;@"#;@"#;åF$;åF$;å¸;å¸;?š;?š;š];š];ƒñ;ƒñ;p;p;;;cæ ;cæ ;éö ;éö ;Dø;Dø;Fò;Fò;:h÷::h÷:ù:ù:ßè:ßè:ÏYë:ÏYë:ô/Ü:ô/Ü:üWß:üWß:î Ð:î Ð::ÉÒ::ÉÒ: {Ã: {Ã:¡Æ:¡Æ:�À·:�À·:»:»:yæ«:yæ«: ë®: ë®:å :å :Õ,¤:Õ,¤:A»–:A»–:mþ›:mþ›:äq�:äq�:ì�•:ì�•:+)Š:+)Š:Q¢‘:Q¢‘:¯g‡:¯g‡:Q®�:Q®�:;÷…:;÷…:Š«Ž:Š«Ž:F™…:F™…:4C�:4C�:[‡:[‡:Ýí�:Ýí�:=¨ˆ:=¨ˆ:èÜ’:èÜ’:IL‹:IL‹:“]–:“]–:Ý��:Ý��:6ûš:6ûš:n”:n”:¶ŠŸ:¶ŠŸ:‰™:‰™: ¥: ¥:CÚž:CÚž:ÿÔª:ÿÔª:h�¤:h�¤:ÚŽ°:ÚŽ°: ¡ª: ¡ª:?A·:?A·: é±: é±:Ѿ:Ѿ:.‰¹:.‰¹:ý‰Æ:ý‰Æ:K„Á:K„Á:ƒÔÎ:ƒÔÎ:ŠïÉ:ŠïÉ:6×:6×:õÊÑ:õÊÑ:ñtÞ:ñtÞ:åÎØ:åÎØ:`å:`å:“¬ß:“¬ß:€áë:€áë:͉å:͉å:ø$ñ:ø$ñ:+dê:+dê:€»õ:€»õ:šÉî:šÉî:qÔù:qÔù:÷Lò:÷Lò:ù˜ü:ù˜ü:_hô:_hô:Ãþ:Ãþ:ƒ;õ:ƒ;õ:_ þ:_ þ:fô:fô:}ü:}ü:ªò:ªò:¦Ÿù:¦Ÿù:²¬î:²¬î:8�õ:8�õ:hÜé:hÜé:¹ð:¹ð:F¿ã:F¿ã:"mé:"mé:+«Ü:+«Ü:ãá:ãá:бÔ:бÔ:²†Ù:²†Ù:r Ì:r Ì:ÛµÐ:ÛµÐ:½Ã:½Ã:ŒEÇ:ŒEÇ:®¹:®¹:¦½:¦½:x²®:x²®:³„²:³„²:¤:¤:ï®§:ï®§:�™:�™:Ÿ|œ:Ÿ|œ:\Ó�:\Ó�:{v‘:{v‘:�õ‚:�õ‚:„´†:„´†:J¨p:J¨p:ù�x:ù�x:^\:^\:„êd:„êd:ãcI:ãcI:›�R:›�R:[¥7:[¥7:á™A:á™A:š´':š´': Ä2: Ä2:Øö:Øö:Ù(&:Ù(&:Ž…:Ž…:ðâ:ðâ:|:|:ã":ã":®×ý9®×ý9Ŧ:Ŧ:+õ9+õ9H :H :bð9bð9ù¥ :ù¥ :Æ î9Æ î9Ýå :Ýå :Çñ9Çñ9Y :Y :B÷9B÷9©þ:©þ:4k:4k:+¾:+¾:o :o :†:†:¿:¿:—‹%:—‹%:UÕ:UÕ:B¼.:B¼.:Ëa!:Ëa!:Þ™8:Þ™8:†„+:†„+:¼øB:¼øB:T6:T6:\ÈM:\ÈM:ÇA:ÇA:ÕÐX:ÕÐX: L: L:þ›c:þ›c:Þ–V:Þ–V:Ëàm:Ëàm:Õ›`:Õ›`:5�w:5�w:‚Äi:‚Äi:^ €:^ €: ¤q: ¤q:ù¢ƒ:ù¢ƒ:� x:� x:J‹†:J‹†:ë6}:ë6}:Á«ˆ:Á«ˆ:,Q€:,Q€:°Š:°Š:£L�:£L�:0šŠ:0šŠ:„r�:„r�:8AŠ:8AŠ:˜€:˜€:qöˆ:qöˆ:Vå}:Vå}:øû†:øû†:†/y:†/y:W6„:W6„:Ör:Ör:i²€:i²€:‰7k:‰7k:\.y:\.y:X]b:X]b:š°o:š°o:¸IX:¸IX:/!e:/!e:)VM:)VM:uÉY:uÉY:hˆA:hˆA:͆M:͆M:Qæ4:Qæ4:>˜@:>˜@:¹':¹':<3:<3:l2:l2:ÃŒ%:ÃŒ%:Kr :Kr :ä:ä:2ëý92ëý9“ :“ :¡ã9¡ã9dGû9dGû9FÊ9FÊ9Í�â9Í�â9 O²9 O²9dË9dË9Åà›9Åà›9²³µ9²³µ9 ‡9 ‡9|¢9|¢9¨i9¨i90‘90‘9WxJ9WxJ9Qá‚9Qá‚9Q€09Q€09�·n9�·n9â”9â”9ö»]9ö»]9Â9Â9ü?Q9ü?Q9¶�9¶�9¶.I9¶.I9œIü8œIü8§XF9§XF9W[û8W[û8jöG9jöG9c9c9N9N9Æ, 9Æ, 9]Y9]Y9�9�9Ôh9Ôh9PY(9PY(9e{9e{9�<9�<9IOˆ9IOˆ9�S9�S9ëê“9ëê“9óôj9óôj9^J 9^J 9ƒJ‚9ƒJ‚9Šw­9Šw­9Û½�9Û½�9p»9p»9�k�9�k�9âÇÈ9âÇÈ9«9«9Á<Ö9Á<Ö9ƒ*¸9ƒ*¸9äâ9äâ9SÄ9SÄ9ß�î9ß�î9üƒÏ9üƒÏ9‰>ù9‰>ù9•Ù9•Ù9�N:�N:|Eâ9|Eâ9�T:�T:Y¤é9Y¤é9¢:¢:¥[ï9¥[ï9 : :¶*ó9¶*ó9~w :~w :B*õ9B*õ9·ú :·ú :ƒ"õ9ƒ"õ9ñm :ñm :”ó9”ó9âû :âû :örï9örï9Ó:Ó:Þ\ê9Þ\ê9Óß:Óß:A¦ã9A¦ã9Ì':Ì':¨�Û9¨�Û9e‰û9e‰û9uÒ9uÒ9<;ñ9<;ñ9qúÆ9qúÆ9�å9�å9Óº9Óº9µûØ9µûØ9 Ç­9 Ç­9r|Ë9r|Ë9ßîŸ9ßîŸ9 i½9 i½98±‘98±‘9‡¯9‡¯9ø?ƒ9ø?ƒ9"ƒ 9"ƒ 9>i9>i9æë‘9æë‘9ML9ML9nšƒ9nšƒ9»ø/9»ø/9_=k9_=k9�w9�w9#_P9#_P9ºµô8ºµô8ƒ79ƒ79þ³Ã8þ³Ã8l9l9ñ^–8ñ^–8éé 9éé 9‚[8‚[8ûxí8ûxí8ÿ8ÿ8Š‹Ë8Š‹Ë8(÷§7(÷§7Æi®8Æi®8:ô6:ô6—–8—–8K\X¶K\X¶{~‚8{~‚8V¯=·V¯=·~vh8~vh8~á�·~á�·«ÆU8«ÆU8dÇ©·dÇ©·7‚L87‚L8¹´ç>¹tÒí¸tÒí¸s¬A¹s¬A¹d-ò¸d-ò¸¡XC¹¡XC¹tô¸tô¸œèC¹œèC¹¦`ô¸¦`ô¸ËUC¹ËUC¹¢>ò¸¢>ò¸¥ÒA¹¥ÒA¹«FFî¸#[?¹#[?¹Ò[è¸Ò[踸û;¹¸û;¹ìà¸ìà¸Üü7¹Üü7¹ûTظûTظ™d3¹™d3¹Ë™Î¸Ë™Î¸æ_.¹æ_.¹ºfĸºfĸ A)¹ A)¹º¸º¸¬$¹¬$¹²£¯¸²£¯¸Õ×¹Õ×¹ÃJ¥¸ÃJ¥¸âɹâɹ«T›¸«T›¸1Þ¹1Þ¹r›‘¸r›‘¸J%¹J%¹–—ˆ¸–—ˆ¸jò ¹jò ¹ÝÏ€¸ÝÏ€¸M[¹M[¹Hdt¸Hdt¸Fg¹Fg¹‘1j¸‘1j¸ôM¹ôM¹†c¸†c¸F¹F¹C,`¸C,`¸E¤¹E¤¹ù#`¸ù#`¸>¹>¹·c¸·c¸ýg¹ýg¹Ôsj¸Ôsj¸ ‚¹ ‚¹F�t¸F�t¸~¹~¹=�¸=�¸eK ¹eK ¹DZ‰¸DZ‰¸lÀ¹lÀ¹¿è’¸¿è’¸ÚÛ¹ÚÛ¹_¬�¸_¬�¸Œ€¹Œ€¹µn©¸µn©¸¥!¹¥!¹h6¶¸h6¶¸»J(¹»J(¹ñøñøAZ/¹AZ/¹ñXÒ¸ñXÒ¸6¸6¹6¸6¹…fḅfḼc>¹¼c>¹ÎÖð¸ÎÖð¸çF¹çF¹¹¹Õ®M¹Õ®M¹'�¹'�¹¥!U¹¥!U¹kè¹kè¹ýR\¹ýR\¹™é¹™é¹l/c¹l/c¹†Ÿ¹†Ÿ¹‹¿i¹‹¿i¹ú"¹ú"¹éÙo¹éÙo¹(Ç(¹(Ç(¹ eu¹ eu¹¨.¹¨.¹7uz¹7uz¹�Ø2¹�Ø2¹3ë~¹3ë~¹¾ö6¹¾ö6¹Ù\�¹Ù\�¹äx:¹äx:¹ý‚¹ý‚¹õp=¹õp=¹BU„¹BU„¹MÔ?¹MÔ?¹ýe…¹ýe…¹ñµA¹ñµA¹×9†¹×9†¹ÆC¹ÆC¹ˆ¹ˆ¹DöC¹DöC¹"‡¹"‡¹ìND¹ìND¹ü(‡¹ü(‡¹ 6D¹ 6D¹°‡¹°‡¹ÅC¹ÅC¹!¾†¹!¾†¹mC¹mC¹ÊX†¹ÊX†¹s/B¹s/B¹œÝ…¹œÝ…¹Ç%A¹Ç%A¹GT…¹GT…¹Z@¹Z@¹ÞÁ„¹ÞÁ„¹ùÙ>¹ùÙ>¹Ü+„¹Ü+„¹Ë«=¹Ë«=¹˜ƒ¹˜ƒ¹[�<¹[�<¹Mƒ¹Mƒ¹–;¹–;¹›¥‚¹›¥‚¹‹×:¹‹×:¹]Z‚¹]Z‚¹ h:¹ h:¹#:‚¹#:‚¹šP:¹šP:¹çD‚¹çD‚¹æŽ:¹æŽ:¹Ù|‚¹Ù|‚¹.;¹.;¹É点É点H5<¹H5<¹ø†ƒ¹ø†ƒ¹§=¹§=¹]„¹]„¹ò‡?¹ò‡?¹#j…¹#j…¹6ÓA¹6ÓA¹{©†¹{©†¹{~D¹{~D¹àˆ¹àˆ¹—ƒG¹—ƒG¹­¯‰¹­¯‰¹æØJ¹æØJ¹çp‹¹çp‹¹n€N¹n€N¹%X�¹%X�¹;oR¹;oR¹c�¹c�¹k¦V¹k¦V¹’‘¹’‘¹Î#[¹Î#[¹…ß“¹…ß“¹´Ë_¹´Ë_¹W:–¹W:–¹}‹d¹}‹d¹£˜¹£˜¹'di¹'di¹›¹›¹³:n¹³:n¹’z�¹’z�¹$s¹$s¹ÝŸ¹ÝŸ¹.½w¹.½w¹15¢¹15¢¹øS|¹øS|¹Sv¤¹Sv¤¹ß^€¹ß^€¹¢¦¹¢¦¹E}‚¹E}‚¹<³¨¹<³¨¹Sz„¹Sz„¹·œª¹·œª¹M†¹M†¹F\¬¹F\¬¹ö‡¹ö‡¹´ð­¹´ð­¹©q‰¹©q‰¹›U¯¹›U¯¹¬¼Š¹¬¼Š¹а¹а¹ñ׋¹ñ׋¹¡Ž±¹¡Ž±¹¤ÀŒ¹¤ÀŒ¹ž]²¹ž]²¹¶u�¹¶u�¹³¹³¹©޹©޹³{³¹³{³¹i޹i޹3ͳ¹3ͳ¹Û£Ž¹Û£Ž¹ýö³¹ýö³¹e»Ž¹e»Ž¹Šý³¹Šý³¹n«Ž¹n«Ž¹ÿÚ³¹ÿÚ³¹xu޹xu޹«–³¹«–³¹¸!޹¸!޹$8³¹$8³¹»´�¹»´�¹ê¿²¹ê¿²¹"1�¹"1�¹Ã7²¹Ã7²¹K¢Œ¹K¢Œ¹†¤±¹†¤±¹�Œ¹�Œ¹×±¹×±¹C`‹¹C`‹¹¬^°¹¬^°¹§ºŠ¹§ºŠ¹s»¯¹s»¯¹ÉйÉйñ¯¹ñ¯¹+u‰¹+u‰¹¢€®¹¢€®¹ý∹ý∹&÷­¹&÷­¹r^ˆ¹r^ˆ¹.{­¹.{­¹Ë臹Ë臹÷­¹÷­¹“‡‡¹“‡‡¹ º¬¹ º¬¹^7‡¹^7‡¹Ît¬¹Ît¬¹±ú†¹±ú†¹TF¬¹TF¬¹&؆¹&؆¹‰2¬¹‰2¬¹�͆¹�͆¹P3¬¹P3¬¹µ×†¹µ×†¹nK¬¹nK¬¹,ù†¹,ù†¹@w¬¹@w¬¹*‡¹*‡¹)°¬¹)°¬¹üh‡¹üh‡¹ú¬¹ú¬¹É¹‡¹É¹‡¹JS­¹JS­¹°ˆ¹°ˆ¹ú¶­¹ú¶­¹q~ˆ¹q~ˆ¹�'®¹�'®¹¾ôˆ¹¾ôˆ¹5¥®¹5¥®¹Cs‰¹Cs‰¹*&¯¹*&¯¹mó‰¹mó‰¹:ª¯¹:ª¯¹ÓwйÓwй^0°¹^0°¹GùйGùйp®°¹p®°¹¹o‹¹¹o‹¹c!±¹c!±¹ Ü‹¹ Ü‹¹‘‰±¹‘‰±¹5:Œ¹5:Œ¹Ìß±¹Ìß±¹_…Œ¹_…Œ¹$²¹$²¹¿Œ¹¿Œ¹£U²¹£U²¹F㌹F㌹>o²¹>o²¹\\«r²¹«r²¹‚挹‚挹Ž_²¹Ž_²¹ÄŒ¹ÄŒ¹b1²¹b1²¹Ç‡Œ¹Ç‡Œ¹÷ë±¹÷ë±¹ú5Œ¹ú5Œ¹²�±¹²�±¹YÌ‹¹YÌ‹¹ƒ±¹ƒ±¹ÈK‹¹ÈK‹¹*”°¹*”°¹C¶Š¹C¶Š¹èò¯¹èò¯¹ййB6¯¹B6¯¹:‰¹:‰¹wa®¹wa®¹·Wˆ¹·Wˆ¹Ïs­¹Ïs­¹WZ‡¹WZ‡¹ l¬¹ l¬¹WG†¹WG†¹kS«¹kS«¹ô%…¹ô%…¹d-ª¹d-ª¹°÷ƒ¹°÷ƒ¹!û¨¹!û¨¹X¾‚¹X¾‚¹ ¿§¹ ¿§¹Ù{�¹Ù{�¹�y¦¹�y¦¹"/€¹"/€¹ë)¥¹ë)¥¹|´}¹|´}¹$Õ£¹$Õ£¹Ì{¹Ì{¹î¢¹î¢¹Xx¹Xx¹Ä*¡¹Ä*¡¹Æªu¹Æªu¹ØŸ¹ØŸ¹ds¹ds¹·‰ž¹·‰ž¹Lip¹Lip¹Ó>�¹Ó>�¹õÑm¹õÑm¹¡ö›¹¡ö›¹aCk¹aCk¹¹´š¹¹´š¹dÂh¹dÂh¹�z™¹�z™¹PUf¹PUf¹·K˜¹·K˜¹Äþc¹Äþc¹6(—¹6(—¹¿a¹¿a¹[–¹[–¹©’_¹©’_¹Žÿ”¹Žÿ”¹Ýv]¹Ýv]¹@÷“¹@÷“¹Nj[¹Nj[¹÷÷’¹÷÷’¹8sY¹8sY¹*’¹*’¹’W¹’W¹á‘¹á‘¹™ÆU¹™ÆU¹¥<�¹¥<�¹!T¹!T¹“g�¹“g�¹JgR¹JgR¹æ–Ž¹æ–Ž¹·ÅP¹·ÅP¹6Ê�¹6Ê�¹7*O¹7*O¹sþŒ¹sþŒ¹9ŽM¹9ŽM¹`2Œ¹`2Œ¹TñK¹TñK¹°e‹¹°e‹¹úRJ¹úRJ¹ï—Š¹ï—Š¹–²H¹–²H¹ÆÉ‰¹ÆÉ‰¹cG¹cG¹]øˆ¹]øˆ¹�bE¹�bE¹Àˆ¹Àˆ¹É¥C¹É¥C¹L@‡¹L@‡¹ìÜA¹ìÜA¹¹Z†¹¹Z†¹`@¹`@¹hl…¹hl…¹L>¹L>¹Hu„¹Hu„¹° <¹° <¹”uƒ¹”uƒ¹B:¹B:¹{j‚¹{j‚¹²ë7¹²ë7¹²S�¹²S�¹Ú®5¹Ú®5¹I1€¹I1€¹ W3¹ W3¹ìþ}¹ìþ}¹ß0¹ß0¹Ë|{¹Ë|{¹L.¹L.¹òáx¹òáx¹ZŸ+¹ZŸ+¹¸*v¹¸*v¹:Õ(¹:Õ(¹Xs¹Xs¹ ó%¹ ó%¹Öop¹Öop¹ û"¹ û"¹ånm¹ånm¹¬ç¹¬ç¹ØSj¹ØSj¹¿¹¿¹¦'g¹¦'g¹ÿ„¹ÿ„¹)çc¹)çc¹N6¹N6¹Ò•`¹Ò•`¹ùÛ¹ùÛ¹=]¹=]¹7|¹7|¹vÞY¹vÞY¹µ ¹µ ¹•zV¹•zV¹Í¬¹Í¬¹JS¹JS¹)A¹)A¹´«O¹´«O¹^й^йé=L¹é=L¹÷½ü¸÷½ü¸-ÓH¹-ÓH¹€áõ¸€áõ¸jE¹jE¹b ï¸b ︘B¹˜B¹áHè¸áHè¸1²>¹1²>¹� á¸� á¸Ðf;¹Ðf;¹nÛ¸nÛ¸Ö$8¹Ö$8¹ÚˆÔ¸ÚˆÔ¸ð4¹ð4¹ñθñθxÄ1¹xÄ1¹zÊǸzÊǸk¦.¹k¦.¹˜Á¸˜Á¸°›+¹°›+¹à‹»¸à‹»¸ ¢(¹ ¢(¹®›µ¸®›µ¸µ%¹µ%¹«Æ¯¸«Æ¯¸Õ"¹Õ"¹:ª¸:ª¸hû¹hû¹¬M¤¸¬M¤¸t(¹t(¹•§ž¸•§ž¸M_¹M_¹ñ™¸ñ™¸·›¹·›¹Ó†“¸Ó†“¸¨Ý¹¨Ý¹=ޏ=ޏä$¹ä$¹‚�ˆ¸‚�ˆ¸k¹k¹b ƒ¸b ƒ¸¥ª ¹¥ª ¹™óz¸™óz¸Ÿä ¹Ÿä ¹#µo¸#µo¸ç¹ç¹�Hd¸�Hd¸Î9¹Î9¹þÃX¸þÃX¸Ô[¹Ô[¹Û,M¸Û,M¸:ëü¸:ëü¸IdA¸IdA¸Ì÷¸Ì÷¸šk5¸šk5¸Üñ¸Üñ¸"3)¸"3)¸;Üê¸;Ü긜¥¸œ¥¸@Œä¸@Œä¸aѸaѸøÞ¸øÞ¸ ´¸ ´¸"׸"׸pqê·pqê·i¸Ð¸i¸Ð¸×éη×éη£Îɸ£Îɸ2ɲ·2ɲ·Â¹Â¸Â¹Â¸ò•·ò•·æy»¸æy»¸¼q·¼q·´¸´¸h5·h5·>’¬¸>’¬¸KMð¶KMð¶sò¤¸sò¤¸ýÿi¶ýÿi¶©=�¸©=�¸±"r4±"r4Yu•¸Yu•¸6…66…6»Ÿ�¸»Ÿ�¸±¾7±¾7«À…¸«À…¸|5A7|5A7è­{¸è­{¸ˆz€7ˆz€7-Ïk¸-Ïk¸ra 7ra 7¶ñ[¸¶ñ[¸#BÀ7#BÀ7«L¸«L¸¥à7¥à7a<¸a<¸ïzÿ7ïzÿ7 Ì,¸ Ì,¸�V8�V8èW¸èW¸™Í8™Í8• ¸• ¸5.85.8üýý·üýý·ø=8ø=8DQà·DQà·åK8åK8â&÷â&÷äeZ8äeZ8§¦·§¦·c’h8c’h8ÅŠ·ÅŠ·eqv8eqv8Æ _·Æ _·.ÿ�8.ÿ�8MÁ)·MÁ)·í¡ˆ8í¡ˆ8Rÿê¶Rÿê¶@&�8@&�8cZ„¶cZ„¶ž‹•8ž‹•8,}µ,}µåÒ›8åÒ›8U06U06ø¡8ø¡8Q±£6Q±£6Eü§8Eü§8±7±7Lß­8Lß­8d/7d/7§¥³8§¥³8mâ\7mâ\7²V¹8²V¹8óâ„7óâ„7÷ó¾8÷ó¾8j›7j›7T}Ä8T}Ä8.Û°7.Û°7oøÉ8oøÉ8°…Æ7°…Æ7¬hÏ8¬hÏ8PÜ7PÜ7ÎÔ8ÎÔ8ƒ\ñ7ƒ\ñ7ì-Ú8ì-Ú8W8W8ôŒß8ôŒß8üý 8üý 8Äíä8Äíä8°8°89Uê89Uê8=o#8=o#8“Äï8“Äï8i>.8i>.8%:õ8%:õ8‘98‘988·ú88·ú8ŽD8ŽD8g9g9­ûN8­ûN8Iã9Iã9ÆZ8ÆZ8É­9É­9"e8"e8ü|9ü|9{Mp8{Mp8¸N 9¸N 9R�{8R�{8"9"9D[ƒ8D[ƒ8 ô9 ô9ñˆ8ñˆ8Ä9Ä9‡„Ž8‡„Ž8�“9�“9Ý”8Ý”8î`9î`9›¡™8›¡™8¾*9¾*9©'Ÿ8©'Ÿ8�ò9�ò9¨¤8¨¤8Òµ!9Òµ!9æª8æª8�o$9�o$96x¯86x¯89 '99 '9{´8{´8UÄ)9UÄ)9{ï¹8{ï¹8dY,9dY,99¿89¿8Åá.9Åá.9KøÃ8KøÃ8ú[19ú[19ùÍÈ8ùÍÈ88Ã398Ã39L~Í8L~Í8¼69¼69¶ Ò8¶ Ò8™Z89™Z89@kÖ8@kÖ8'…:9'…:9î�Ú8î�Ú8^š<9^š<9ò§Þ8ò§Þ8çš>9çš>9 ‡â8 ‡â8F†@9F†@9U>æ8U>æ8å^B9å^B9zÐé8zÐé8Ö#D9Ö#D9à7í8à7í8ÕÒE9ÕÒE9>uð8>uð88nG98nG9µŒó8µŒó8töH9töH9}ö8}ö8ŸkJ9ŸkJ9QJù8QJù8öÐK9öÐK9Öùû8Öùû8‰'M9‰'M9I‹þ8I‹þ8UoN9UoN9€€9€€90ªO90ªO9²®9²®9MØP9MØP9"Ð9"Ð9?úQ9?úQ9äæ9äæ9ƒS9ƒS9/ö9/ö9g%T9g%T9óý9óý9>0U9>0U9¼ÿ9¼ÿ9¤6V9¤6V9þ9þ9å8W9å8W9˜ö9˜ö95X95X9Âê 9Âê 95/Y95/Y9mÞ 9mÞ 9")Z9")Z9åÐ 9åÐ 98![98![9¢Â 9¢Â 97\97\9&µ 9&µ 9^]9^]9n¥9n¥9^9^9”9”9)ý^9)ý^9ñ�9ñ�9!ð_9!ð_9>l9>l92ß`92ß`9¢S9¢S9ÎÌa9ÎÌa9Ê99Ê99à·b9à·b9?9?9•Ÿc9•Ÿc9Bü9Bü9[…d9[…d9Ú9Ú9|ge9|ge9t²9t²93Df93Df9™†9™†9ôg9ôg9©U9©U9 ïg9 ïg9™9™9Ò·h9Ò·h9�Ù9�Ù9¿vi9¿vi9fŒ9fŒ9™*j9™*j9p39p39Òj9Òj9qÎ9qÎ9Pnk9Pnk9H]9H]9uýk9uýk9/Þ9/Þ9‰}l9‰}l9P9P9=ïl9=ïl9A³9A³9Qm9Qm9‡9‡9Ô¡m9Ô¡m9öF9öF9 âm9 âm9x9x9±n9±n91˜91˜9ì0n9ì0n9©9©9SAn9SAn9˜ª9˜ª9Bn9Bn9-œ9-œ9´2n9´2n9=~9=~9Šn9Šn9kQ9kQ9çm9çm9‚9‚9Ž«m9Ž«m9@Ì9@Ì9©bm9©bm9,u9,u9“ m9“ m9È9È9µ¦l9µ¦l9¡�9¡�9Ç5l9Ç5l9G9G9”¸k9”¸k9B•9B•9£0k9£0k9C9C9£Ÿj9£Ÿj9$e9$e9j9j9xÁ9xÁ9Þfi9Þfi9>9>9•¿h9•¿h9‘d9‘d9Nh9Nh9å¬9å¬9ì^g9ì^g9.ï9.ï9ó¥f9ó¥f9�,9�,9Éèe9Éèe9f9f9Æ'e9Æ'e9€›9€›9rbd9rbd9ÒÌ9ÒÌ9È™c9È™c9jû9jû9‰Îb9‰Îb9='9='9Vb9Vb9üO9üO9W/a9W/a9Uv9Uv9Ú[`9Ú[`9Ž™9Ž™9â„_9â„_9N¹9N¹9¨ª^9¨ª^9+Ö 9+Ö 9ÖÍ]9ÖÍ]9ÿï 9ÿï 9Kí\9Kí\9î 9î 9 \9 \9P 9P 9h![9h![9Ü& 9Ü& 95Z95Z9¾/ 9¾/ 9’BY9’BY9N29N290IX90IX9D-9D-9úGW9úGW9w 9w 9€?V9€?V9þ 9þ 9m0U9m0U9>ò9>ò9LT9LT9æÎ9æÎ9lùR9lùR9¯¢9¯¢9/ÐQ9/ÐQ9Il9Il9oœP9oœP9CWþ8CWþ8ê^O9ê^O9.Ãû8.Ãû8N9N9ù8ù8­ÆL9­ÆL99_ö89_ö8ÇlK9ÇlK9Y“ó8Y“ó8I J9I J9´ð8´ð8�H9�H9<¾í8<¾í8/%G9/%G9@µê8@µê8Ç£E9Ç£E9E—ç8E—ç8qD9qD9Ûdä8Ûdä8V‚B9V‚B9 #á8 #á8×å@9×å@9�ÑÝ8�ÑÝ8Ò@?9Ò@?9únÚ8únÚ8/”=9/”=9‰þÖ8‰þÖ8}à;9}à;9à~Ó8à~Ó8%:9%:9HðÏ8HðÏ8áb89áb89¹VÌ8¹VÌ8fœ69fœ69§´È8§´È8 Ñ49 Ñ49sÅ8sÅ8#39#39ìSÁ8ìSÁ8/-19/-19—½8—½8«T/9«T/99й89й8�w-9�w-9m¶8m¶8Õ—+9Õ—+9"/²8"/²8Hµ)9Hµ)9\W®8\W®8pÑ'9pÑ'9‘~ª8‘~ª8„í%9„í%9.¥¦8.¥¦8Æ$9Æ$9ëÉ¢8ëÉ¢8Ç#"9Ç#"9sïž8sïž8(? 9(? 9r›8r›8­Y9­Y9�7—8�7—8ÿs9ÿs9N\“8N\“8’�9’�9\‚�8\‚�8^«9^«9#ª‹8#ª‹8>É9>É92ׇ82ׇ8^é9^é9Є8Є8% 9% 9õ7€8õ7€8Q,9Q,9üØx8üØx8ÐO9ÐO9¬Cq8¬Cq8 s 9 s 9<­i8<­i8o– 9o– 9b8b8í¹ 9í¹ 9£�Z8£�Z8ÝÜ9ÝÜ9JéR8JéR8ðÿ9ðÿ9”SK8”SK8Œ#9Œ#9h½C8h½C8�F9�F9R$<8R$<8Bi9Bi9JŒ48JŒ48¨ý8¨ý8…ó,8…ó,8Ñ]ù8Ñ]ù8šY%8šY%87£õ87£õ8SÁ8SÁ8´éñ8´éñ8@)8@)8¿.î8¿.î8ÚŒ8ÚŒ8rê8rê8Ðì8Ðì8ܲæ8ܲæ8ŸŒþ7ŸŒþ7ðâ8ðâ8ë3ï7ë3ï7z,ß8z,ß8áÝß7áÝß7kiÛ8kiÛ8¤…Ð7¤…Ð7S¥×8S¥×8Û*Á7Û*Á7ªáÓ8ªáÓ8Ô±7Ô±7‘Ð8‘Ð8{¢7{¢7UZÌ8UZÌ8ì“7ì“7•È8•È8X¼ƒ7X¼ƒ7ÍÄ8ÍÄ8õh7õh7µÁ8µÁ8„J7„J7v8½8v8½8¤p+7¤p+7œn¹8œn¹8›ö 7›ö 7v¤µ8v¤µ8%Ý6%Ý60Ú±80Ú±8˜‹ 6˜‹ 6m®8m®8¤IH6¤IH6ÎEª8ÎEª8P 5P 5q¦8q¦8h,µh,µÿ½¢8ÿ½¢8ô7¶ô7¶ÎŸ8Ο8Ò"‰¶Ò"‰¶ÙK›8ÙK›8uöuöŸ›—8Ÿ›—8gzü¶gzü¶uñ“8uñ“8£¤·£¤·êM�8êM�8D·6·D·6·S²Œ8S²Œ8pR·pR·S‰8S‰8šÄm·šÄm·-–…8-–…8·W„··W„·u‚8u‚8½–‘·½–‘·TE}8TE}8h£ž·h£ž·Ænv8Ænv8ô|«·ô|«·ž«o8ž«o8 "¸· "¸·'ýh8'ýh8¹‘Ä·¹‘Ä·cb8cb8ÈÉзÈÉзQà[8Qà[8�ÅÜ·�ÅÜ·`uU8`uU8x…è·x…è·y!O8y!O8ž ô·ž ô·ãH8ãH8y\ÿ·y\ÿ·»B8»B8p;¸p;¸¥<8¥<8œ° ¸œ° ¸¢68¢68) ¸) ¸0µ080µ08|I¸|I¸³Ü*8³Ü*8.o¸.o¸C%8C%87|¸7|¸vc8vc8No$¸No$¸mÃ8mÃ8~K)¸~K)¸«38«38m.¸m.¸·¶8·¶8,¼2¸,¼2¸1L 81L 8hP7¸hP7¸ãó8ãó8öÊ;¸öÊ;¸aý7aý7Þ*@¸Þ*@¸*ó7*ó7[sD¸[sD¸”Ãè7”Ãè7î£H¸î£H¸^ªÞ7^ªÞ7D¾L¸D¾L¸ °Ô7 °Ô7iÂP¸iÂP¸ºÚÊ7ºÚÊ7`¬T¸`¬T¸61Á761Á7ëzX¸ëzX¸9±·79±·7õ.\¸õ.\¸^®7^®7‰Å_¸‰Å_¸4<¥74<¥7:>c¸:>c¸ôGœ7ôGœ7©›f¸©›f¸<�“7<�“7PÛi¸PÛi¸ƒëŠ7ƒëŠ7Ûýl¸Ûýl¸Ìƒ‚7̃‚7çp¸çp¸éšt7éšt7`ér¸`ér¸,¡d7,¡d7_­u¸_­u¸¬U7¬U7ÚRx¸ÚRx¸¦æE7¦æE7âØz¸âØz¸ )77 )778>}¸8>}¸ŒÕ(7ŒÕ(7 …¸ …¸Ûã7Ûã7ÑÖ€¸ÑÖ€¸^e 7^e 7ŒÙ�¸ŒÙ�¸V7V7ßÌ‚¸ßÌ‚¸tZç6tZç6*°ƒ¸*°ƒ¸%ðÎ6%ðÎ6w‚„¸w‚„¸w]·6w]·6F…¸F…¸€Œ 6€Œ 6uú…¸uú…¸“Š6“Š6Ÿ†¸Ÿ†¸FÔj6FÔj6…4‡¸…4‡¸}B6}B6;º‡¸;º‡¸ã'6ã'6Ó/ˆ¸Ó/ˆ¸ÿŸë5ÿŸë5ö–ˆ¸ö–ˆ¸»÷£5»÷£5›ïˆ¸›ïˆ¸×�>5×�>5»:‰¸»:‰¸°Ij4°Ij4§y‰¸§y‰¸êê¬‰¸¬‰¸©=>µ©=>µIÒ‰¸IÒ‰¸Ê®™µÊ®™µ%퉸%퉸ÉѵÉѵ¸û‰¸¸û‰¸À¨¶À¨¶Eþ‰¸Eþ‰¸ÇD¶ÇD¶Xö‰¸Xö‰¸l×5¶l×5¶Ì㉸Ì㉸ÔQM¶ÔQM¶õƉ¸õƉ¸^Ïc¶^Ïc¶b ‰¸b ‰¸ñIy¶ñIy¶No‰¸No‰¸éІ¶éІ¶‰3‰¸‰3‰¸N�¶N�¶ÛÛîˆ¸š¹™¶š¹™¶™ ˆ¸™ ˆ¸|u¢¶|u¢¶Iˆ¸Iˆ¸ê¶ê¶s釸s釸K¨²¶K¨²¶»€‡¸»€‡¸Î º¶Î º¶!‡¸!‡¸ìÀ¶ìÀ¶¡‘†¸¡‘†¸xCǶxCÇ¶Ç †¸Ç †¸DͶDͶ/z…¸/z…¸fÒ¶fÒ¶ᄸᄸ I×¶ I×¶Ø>„¸Ø>„¸È­Û¶È­Û¶i“ƒ¸i“ƒ¸)šß¶)šß¶ÿÞ‚¸ÿÞ‚¸Äã¶Äã¶!‚¸!‚¸­òå¶­òå¶{Y�¸{Y�¸[è¶[è¶¿ˆ€¸¿ˆ€¸:Fê¶:Fê¶Î]¸Î]¸ƒ¸ë¶ƒ¸ë¶`™}¸`™}¸Ø¼ì¶Ø¼ì¶ Å{¸ Å{¸ATí¶ATí¶;ày¸;ày¸9xí¶9xí¶$ëw¸$ëw¸l.í¶l.í¶æu¸æu¸(xì¶(xì¶ãÑs¸ãÑs¸Þ[ë¶Þ[ë¶N¯q¸N¯q¸éâé¶éâé¶¼o¸¼o¸âè¶âè¶@Cm¸@Cm¸éå¶éå¶új¸új¸šjã¶šjã¶¿¤h¸¿¤h¸Xšà¶Xšà¶ÖCf¸ÖCf¸Ë~ݶË~ݶuØc¸uØc¸ Ú¶ Ú¶†ca¸†ca¸a‚Ö¶a‚Ö¶ßå^¸ßå^¸ü­Ò¶ü­Ò¶U`\¸U`\¸î¦Î¶î¦Î¶MÓY¸MÓY¸›oʶ›oʶ_?W¸_?W¸ ƶ ƶ-¥T¸-¥T¸(‚Á¶(‚Á¶-R¸-R¸óÔ¼¶óÔ¼¶p`O¸p`O¸í ¸¶í ¸¶Ç·L¸Ç·L¸—.³¶—.³¶ J¸ J¸�=®¶�=®¶]G¸]G¸;8©¶;8©¶ïªD¸ïªD¸ !¤¶ !¤¶RöA¸RöA¸™úž¶™úž¶U??¸U??¸³Ä™¶³Ä™¶þ…<¸þ…<¸Ÿ}”¶Ÿ}”¶'Ê9¸'Ê9¸—'�¶—'�¶Å 7¸Å 7¸ŒÈ‰¶ŒÈ‰¶âM4¸âM4¸\\„¶\\„¶j�1¸j�1¸²Ï}¶²Ï}¶™Ì.¸™Ì.¸.èr¶.èr¶ò ,¸ò ,¸ úg¶ úg¶èJ)¸èJ)¸½]¶½]¶Š&¸Š&¸UR¶UR¶üÈ#¸üÈ#¸¾ G¶¾ G¶M!¸M!¸&û;¶&û;¶2F¸2F¸aó0¶aó0¶û…¸û…¸~æ%¶~æ%¶Æ¸Æ¸ÑÚ¶ÑÚ¶v¸v¸pÛ¶pÛ¶[J¸[J¸"á¶"á¶YޏYޏšÜóµšÜóµoÔ ¸oÔ ¸c#Þµc#Þµò ¸ò ¸Ü–ȵܖȵWh¸Wh¸G³µG³µ ·¸ ·¸ÑBžµÑBžµ§ ¸§ ¸VŒ‰µVŒ‰µ `¸ `¸\Pjµ\Pjµ|uû·|uû·l?Bµl?Bµà3ö·à3ö·ŠçµŠçµ>ûð·>ûð·^—è´^—è´²Ìë·²Ìë·!�´!�´ª¨æ·ª¨æ·q‘&´q‘&´ÞŽá·ÞŽá·¶R²²¶R²²€€Ü·€€Ü·:Rì3:Rì3‘}×·‘}×·oA4oA4‰…Ò·‰…Ò·úRÂ4úRÂ4ãšÍ·ãšÍ·‹F5‹F5n¾È·n¾È·KL 5KL 5Eï÷Eï÷æ2>5æ2>5Ð.¿·Ð.¿·LÏZ5LÏZ5~}º·~}º·ÇKv5ÇKv5óÙµ·óÙµ·^Qˆ5^Qˆ5øE±·øE±·|Õ”5|Õ”5µÁ¬·µÁ¬· 5 5'L¨·'L¨·ß¬5߬5&棷&棷áÚ¶5áÚ¶5¢�Ÿ·¢�Ÿ·' Á5' Á5H›·H›·”ªÊ5”ªÊ5 —· —·ó³Ó5ó³Ó5Óç’·Óç’·N2Ü5N2Ü5�ÎŽ·�ÎŽ·,ä5,ä5­ÄŠ·­ÄŠ·Ç™ë5Ç™ë5]ʆ·]ʆ·w„ò5w„ò5ß‚·ß‚·Þòø5Þòø5Ä~·Ä~·Tßþ5Tßþ5œlv·œlv·F&6F&6Tòn·Tòn· œ6 œ6E˜g·E˜g·ìÎ6ìÎ6ì]`·ì]`·þÅ6þÅ6çAY·çAY·àƒ 6àƒ 6›DR·›DR·^ 6^ 6[eK·[eK·ÜZ 6ÜZ 6¤D·¤D·u6u6q>·q>·xU6xU6_€7·_€7·Èÿ6Èÿ6Z1·Z1·«r6«r6£Ú*·£Ú*·­6­6··$···$·Ë³6˳6 ´· ´·h†6h†6×з×зY!6Y!6^·^·H‡6H‡6…l ·…l ··6·6ðë·ðë·Y± 6Y± 6Œ·Œ·Ãz 6Ãz 6b˜ú¶b˜ú¶ 6 6Yð¶Y𶃀 6ƒ€ 6Zæ¶Zæ¶'¿6'¿6ٚܶٚܶ*Ò6*Ò6ÏÓ¶ÏÓ¶ˆ¹6ˆ¹6ñÜɶñÜɶêw6êw6?ÝÀ¶?ÝÀ¶%þ5%þ5‰¸¶‰¸¶]ù5]ù5y™¯¶y™¯¶e¥ó5e¥ó5}S§¶}S§¶«î5«î5ŠJŸ¶ŠJŸ¶´+è5´+è5"~—¶"~—¶4â54â5…í�¶…í�¶ÏÛ5ÏÛ5d—ˆ¶d—ˆ¶…ZÕ5…ZÕ5Ìz�¶Ìz�¶¿Î5¿Î5G-u¶G-u¶ëÈ5ëÈ5ÎÔg¶ÎÔg¶*'Á5*'Á5ƒêZ¶ƒêZ¶ó3º5ó3º5ÈlN¶ÈlN¶È,³5È,³5 ZB¶ ZB¶é¬5é¬5õ²6¶õ²6¶ïð¤5ïð¤5:t+¶:t+¶0Å�50Å�5� ¶� ¶Ç––5Ç––5|+¶|+¶—j�5—j�5  ¶  ¶"Eˆ5"Eˆ5Žs¶Žs¶*�5*�5¹Uòµ¹Uòµ89t589t5¥†àµ¥†àµB?f5B?f5xϵxϵ~mX5~mX5Þ'¿µÞ'¿µºÊJ5ºÊJ5µï“¯µ&^=5&^=5æ¹ µæ¹ µA005A005Ü–’µÜ–’µ%H#5%H#5ñ(…µñ(…µ³¬5³¬5ÏÛpµÏÛpµ^d 5^d 5‘ÈXµ‘ÈXµèü4èü4BBµBBµêÄå4êÄå4¼,µÂ¼,µámÏ4ámÏ4κµÎºµ„ï¹4„ï¹4I µI µ§W¥4§W¥4Sé´Sé´T³‘4T³‘4Q#É´Q#É´,~4,~4~«´~«´˜òZ4˜òZ4{Y�´{Y�´Áþ94Áþ94(Yo´(Yo´L]4L]4ˆÚB´ˆÚB´äVþ3äVþ3$"´$"´µ Ë3µ Ë3Ó:ð³Ó:ð³¢�3¢�3©s³³©s³³Œi3Œi3‘³‘³Ld#3Ld#3À(*³À(*³Ó2Ó2˜ÆÌ²˜ÆÌ²b´o2b´o2�ÚO²�ÚO²±þÖ1±þÖ1šß”±šß”±-äØ0-äØ0\¦°\¦°././@LongLink0000644000000000000000000000016400000000000011604 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/BinauralDecoder/Source/EQ/Beyerdynamic-DT990PRO.wavIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/BinauralDecoder/Source/EQ/Beyerdynam0000664002537200253720000004013015257173642031437 0ustar zmoelnigzmoelnigRIFFP@WAVEfmt €»Ü factPEAKàc YrE\?rE\?data@rE\?rE\?§0=§0=¿56>¿56>D�=D�=ßT}¾ßT}¾²(�½²(�½Ÿ÷¼Ÿ÷¼…ÞO¼…ÞO¼}þ–½}þ–½‚œà¼‚œà¼.é½.é½^}=^}=TL®£:t>£:“O¥:“O¥:âÕž:âÕž: G¡: G¡:mN›:mN›:*ž:*ž:¬Q˜:¬Q˜:Ê›:Ê›:ÔJ•:ÔJ•:ÿ`˜:ÿ`˜:ÿ’:ÿ’:³]–:³]–:Ãþ�:Ãþ�:ŒQ”:ŒQ”:J%�:J%�:¥ù’:¥ù’:WVŽ:WVŽ:øk’:øk’:ŽË�:ŽË�: ’: ’: Þ�: Þ�:�Ñ’:�Ñ’:‹c�:‹c�:{¹”:{¹”:I‘:I‘: {–: {–:ú’:ú’:S0˜:S0˜:6Ç”:6Ç”:7š:7š:cÝ–:cÝ–:iœ:iœ:CV™:CV™:3üž:3üž:ô›:ô›:¤¡:¤¡:¸ºž:¸ºž:Ŧ¤:Ŧ¤:¯ÿ¡:¯ÿ¡:’ ¨:’ ¨:¡X¥:¡X¥:<«:<«:uW¨:uW¨:k®:k®:|ûª:|ûª:…{°:…{°:1+­:1+­:Ûi²:Ûi²:Û®:Û®:ië³:ië³:19°:19°:ø)µ:ø)µ:ø^±:ø^±:"3¶:"3¶:68²:68²:öÕ¶:öÕ¶:û¯²:û¯²:+·:+·:êÚ²:êÚ²:R·:R·:n²:n²:RZ¶:RZ¶:«ˆ±:«ˆ±:ügµ:ügµ: ‹°: ‹°:ž?´:ž?´:ª¯:ª¯:¨~²:¨~²:˜*­:˜*­:®Œ°:®Œ°:®:«:®:«:ÍŽ®:ÍŽ®:Ä!©:Ä!©:‚[¬:‚[¬:€à¦:€à¦:ª:ª:v›¤:v›¤:-§:-§:@+¢:@+¢:UG¥:UG¥:3·Ÿ:3·Ÿ:CÞ¢:CÞ¢:S�:S�:x :x :'áš:'áš:Œö�:Œö�:ƒW˜:ƒW˜:½p›:½p›:Ãß•:Ãß•:ß ™:ß ™:‹“:‹“:&¾–:&¾–:±7‘:±7‘:„^”:„^”:5ËŽ:5ËŽ:¾ì‘:¾ì‘:dŒ:dŒ:R �:R �:i8Š:i8Š:O‹�:O‹�:a#ˆ:a#ˆ:[i‹:[i‹:›ú…:›ú…:ŒG‰:ŒG‰:Ãíƒ:Ãíƒ:]V‡:]V‡:J‚:J‚:ªŠ…:ªŠ…:üO€:üO€:æÌƒ:æÌƒ:ã+}:ã+}:Ù‚:Ù‚:gºy:gºy:G_€:G_€:Äbv:Äbv:}:}:Bs:Bs:•„z:•„z:ûgp:ûgp:˜½w:˜½w:ʯm:ʯm:hu:hu:û*k:û*k:[Ár:[Ár: i: i:.Àp:.Àp:g:g:[ón:[ón:ime:ime:¢km:¢km:Qd:Qd:¼Hl:¼Hl:$ c:$ c:Ýrk:Ýrk:Ùib:Ùib:Ièj:Ièj:¬b:¬b:@¹j:@¹j:fb:fb:õÂj:õÂj:òb:òb:‚öj:‚öj:óab:óab:À@k:À@k:o·b:o·b:G­k:G­k:NEc:NEc:»^l:»^l:—d:—d:HEm:HEm:¦e:¦e:¼On:¼On:f:f:|Do:|Do:^ñf:^ñf:ø p:ø p:½g:½g:˜ßp:˜ßp:Ú‡h:Ú‡h:®“q:®“q:€i:€i:a r:a r:¨„i:¨„i:£gr:£gr:?Íi:?Íi:Öšr:Öšr:{æi:{æi:bšr:bšr:HÈi:HÈi:úQr:úQr:™Gi:™Gi:ì—q:ì—q:™ah:™ah:Ê•p:Ê•p:[Fg:[Fg:¿Xo:¿Xo:×e:×e:x¯m:x¯m:Lûc:Lûc:N°k:N°k:yáa:yáa:‚|i:‚|i:Æ‘_:Æ‘_:g:g:% ]:% ]:Óhd:Óhd:i:Z:i:Z:�ra:�ra:"W:"W:K>^:K>^:ÖS:ÖS:†àZ:†àZ:ÄkP:ÄkP:spW:spW:ÁøL:ÁøL:-øS:-øS: wI: wI:žnP:žnP:‹íE:‹íE:«îL:«îL:RvB:RvB:Æ{I:Æ{I:#?:#?: F: F:õ˜;:õ˜;:µ§B:µ§B:Y;8:Y;8:ÑO?:ÑO?:èë4:èë4:<:<:Ã1:Ã1:ñý8:ñý8:úÁ.:úÁ.:“6:“6:^ì+:^ì+:xZ3:xZ3:¾W):¾W):aà0:aà0:—í&:—í&:»‚.:»‚.:²¤$:²¤$:[,:[,:s¡":s¡":}w*:}w*:ýÔ :ýÔ :$À(:$À(:¿6:¿6:�@':�@':5Ö:5Ö:_ü%:_ü%:Ш:Ш:Vå$:Vå$:Œ«:Œ«:%$:%$: æ: æ:qX#:qX#:¡L:¡L:ˆÍ":ˆÍ":¼Ï:¼Ï:‘a":‘a": x: x:b!":b!":FM:FM:B":B":î?:î?:þ":þ":FB:FB:×":×":Y[:Y[:­1":­1":a�:a�:O_":O_":u¸:u¸:`¡":`¡":K:K:±î":±î":P:P:±=#:±=#:“Ÿ:“Ÿ:Ž‹#:Ž‹#:´å:´å:1Ç#:1Ç#:ï:ï:wï#:wï#:ä5:ä5:º$:º$:˜?:˜?:ƒ$:ƒ$:W::W::¡û#:¡û#:3(:3(:áÛ#:áÛ#:‰ô:‰ô:¢’#:¢’#:÷–:÷–:Í$#:Í$#:::%•":%•":ps:ps:ÁØ!:ÁØ!:ƒ£:ƒ£:oû :oû :ø¹:ø¹:¡ :¡ :ô®:ô®:¤ä:¤ä:N~:N~:C§:C§:’5:’5:ˆQ:ˆQ:ÒÍ:ÒÍ:ƒÕ:ƒÕ:é;:é;:0:0:P†:P†:ºm:ºm:«· :«· :ô“:ô“:°Ò :°Ò :V¥:V¥:îÙ :îÙ :z£:z£:\Ï:\Ï:q‘:q‘:2¶:2¶:ûr :ûr :®‘:®‘:NH :NH :{`:{`:È :È :ÅNþ9ÅNþ9é×:é×:×ù9×ù9#ž:#ž:ùkõ9ùkõ9‹n:‹n:?ñ9?ñ9ÑE:ÑE:üÇì9üÇì9}Gü9}Gü9ú�è9ú�è9gø9gø9¥mä9¥mä9»ô9»ô9¤eà9¤eà9ã ð9ã ð9€sÜ9€sÜ9¡'ì9¡'ì9¤£Ø9¤£Ø9ãvè9ãvè9rÕ9rÕ9nå9nå9š¾Ñ9š¾Ñ9ûÉá9ûÉá9ǘÎ9ǘÎ9�ÀÞ9�ÀÞ9«Ë9«Ë9ìÛ9ìÛ9=êÈ9=êÈ9l?Ù9l?Ù9RÆ9RÆ9A¿Ö9A¿Ö9ççÃ9ççÃ9ýiÔ9ýiÔ9E¤Á9E¤Á9:Ò9:Ò9nŠ¿9nŠ¿9Þ<Ð9Þ<Ð9ºª½9ºª½9fzÎ9fzÎ9÷¼9÷¼9’ëÌ9’ëÌ9ô‡º9ô‡º9XƒË9XƒË9B-¹9B-¹9£7Ê9£7Ê9*ò·9*ò·9 É9 É9CÙ¶9CÙ¶9vÈ9vÈ9#Òµ9#Òµ9Ç9Ç9Áâ´9Áâ´9š'Æ9š'Æ9æ´9æ´9}_Å9}_Å9lN³9lN³9£Ä9£Ä91˜²91˜²9óÃ9óÃ9ê±9ê±9.FÃ9.FÃ9{=±9{=±9ß�Â9ß�Â9H˜°9H˜°9úÁ9úÁ9Üï¯9Üï¯9LÁ9LÁ9¯;¯9¯;¯9 ”À9 ”À9º~®9º~®92Ô¿92Ô¿9Þ·­9Þ·­9‘¿9‘¿9MÞ¬9MÞ¬9"¾9"¾9ƒð«9ƒð«9.½9.½9o÷ª9o÷ª9P2¼9P2¼9õ©9õ©97'»97'»9cܨ9cܨ9gº9gº9ȧ§9ȧ§9ݾ¸9ݾ¸9€U¦9€U¦9*`·9*`·9\ë¤9\ë¤9iîµ9iîµ9p£9p£9h´9h´9˜Ú¡9˜Ú¡94Ʋ94Ʋ9³. 9³. 9î±9î±9yž9yž9&Z¯9&Z¯9)²œ9)²œ9Ɉ­9Ɉ­9äÕš9äÕš9룫9룫9Kå˜9Kå˜9S§©9S§©9ËÛ–9ËÛ–9`–§9`–§9„Å”9„Å”97~¥97~¥9}¨’9}¨’9Ÿ[£9Ÿ[£9¸~�9¸~�9ý.¡9ý.¡9OŽ9OŽ9 þž9 þž9ÂŒ9ÂŒ9¬Çœ9¬Çœ9¹à‰9¹à‰9 Œš9 Œš9¯ ‡9¯ ‡9H˜9H˜9¹W…9¹W…96þ•96þ•9,ƒ9,ƒ9ȸ“9ȸ“9Ë€9Ë€9Ky‘9Ky‘9�}9�}9Ö<�9Ö<�9Ñ x9Ñ x9-�9-�9.8t9.8t9ÆÖŠ9ÆÖŠ9 äo9 äo9\¯ˆ9\¯ˆ9¶”k9¶”k9ˆŠ†9ˆŠ†9ïRg9ïRg9Îq„9Îq„9N/c9N/c91g‚91g‚9Õ"_9Õ"_9šh€9šh€9ß4[9ß4[9@ø|9@ø|9XmW9XmW9&By9&By9(ÁS9(ÁS9Ó¢u9Ó¢u9`,P9`,P9ür9ür9ϱL9ϱL9U¬n9U¬n9‚CI9‚CI9_Hk9_Hk9ßëE9ßëE9 h9 h9Õ»B9Õ»B9Üçd9Üçd9…¦?9…¦?9ÄÜa9ÄÜa9G¢<9G¢<9Ìã^9Ìã^9“±99“±992\92\9µ×69µ×69T3Y9T3Y9p49p49ytV9ytV9æS19æS19¤ºS9¤ºS9®›.9®›.9? Q9? Q9¦ö+9¦ö+9¹tN9¹tN9Me)9Me)9éK9éK97Ù&97Ù&9`I9`I9µO$9µO$9‡ØF9‡ØF9vÂ!9vÂ!9©GD9©GD9¯,9¯,9.µA9.µA9Žš9Žš9B$?9B$?999ï‹<9ï‹<9 h9 h9æó99æó99tÒ9tÒ9èc79èc79JA9JA98Ó498Ó49«9«9®;29®;29  9  9µŸ/9µŸ/9èn 9èn 9'ý,9'ý,9ÛÃ9ÛÃ90M*90M*9� 9� 9�”'9�”'9#O9#O9�Õ$9�Õ$9&ÿ8&ÿ8± "9± "9Æmù8Æmù8 99 99ïÄó8ïÄó8e9e9Pî8Pî8#ˆ9#ˆ9@Jè8@Jè8Ž£9Ž£9–wâ8–wâ8¶¸9¶¸9À‘Ü8À‘Ü8ƒÀ9ƒÀ9Ü�Ö8Ü�Ö8ûº 9ûº 9TqÐ8TqÐ8‚¦ 9‚¦ 9€8Ê8€8Ê8�ˆ9�ˆ9îóÃ8îóÃ8Ae9Ae9퟽8퟽8ë99ë99.E·8.E·8P"ü8P"ü8Yò°8Yò°8ëÏõ8ëÏõ8¤�ª8¤�ª8 fï8 fï8j¤8j¤8yðè8yðè8ž�8ž�83tâ83tâ8Ÿ—8Ÿ—8uîÛ8uîÛ8^Œ�8^Œ�8üeÕ8üeÕ8ý‰8ý‰8Á×Î8Á×Î8ðhƒ8ðhƒ8KÈ8KÈ8ѹy8ѹy8ÈÁ8ÈÁ8\²l8\²l8ˆK»8ˆK»8ˆ¶_8ˆ¶_8"Ô´8"Ô´8g¼R8g¼R8IX®8IX®8®ºE8®ºE8 á§8 á§8ºÖ88ºÖ88 ¡8 ¡8V,8V,8 /›8 /›8¼…8¼…8ò”8ò”8³8³8²ÉŽ8²ÉŽ8ÔÈ8ÔÈ8P§ˆ8P§ˆ8õ7õ7…�‚8…�‚8[¨Ü7[¨Ü7} y8} y8øŽÄ7øŽÄ7Ú m8Ú m8 ‰¬7 ‰¬7a8a8ã�”7ã�”7Á9U8Á9U8_ñy7_ñy7€„I8€„I8³'K7³'K7°Ü=8°Ü=8�Z7�Z7i628i628Õ�Û6Õ�Û6­&8­&8Ç×~6Ç×~6Í58Í58’Ž5’Ž5+Ì8+Ì8åÞµåÞµ¹z8¹z8”m’¶”m’¶yQò7yQò7í¶í¶ÔÛ7ÔÛ7‡s#·‡s#·p„Å7p„Å7%:P·%:P·©/¯7©/¯75}·5}·½é˜7½é˜7^Ì”·^Ì”·Ýº‚7ݺ‚7ç «·ç «·º)Y7º)Y7.9Á·.9Á·Õ-7Õ-7#Y×·#Y×·_õ7_õ7Ÿrí·Ÿrí·Zï©6Zï©6ޏ¸Ž¸¸Šc%6Šc%6‘� ¸‘� ¸¹mü³¹mü³]{¸]{¸˜L5¶˜L5¶{^"¸{^"¸”z±¶”z±¶»@-¸»@-¸····8¸8¸ÂU/·ÂU/·õôB¸õôB¸¿Z·¿Z·ŠÇM¸ŠÇM¸À΂·À΂·˜X¸˜X¸ÛY˜·ÛY˜·fc¸fc¸ïÞ­·ïÞ­·)2n¸)2n¸dj÷dj÷t y¸t y¸Ú&Ù·Ú&Ù·lÿ�¸lÿ�¸½ï·½ï·à|‡¸à|‡¸ v¸ v¸3�¸3�¸©� ¸©� ¸]‘’¸]‘’¸oŸ¸oŸ¸8(˜¸8(˜¸ÃÈ#¸ÃÈ#¸ùÄ�¸ùÄ�¸?ý.¸?ý.¸;g£¸;g£¸@:¸@:¸ì©¸ì©¸c E¸c E¸ßÒ®¸ßÒ®¸Å#Q¸Å#Q¸ �´¸ �´¸¦®\¸¦®\¸Cfº¸Cfº¸ü4h¸ü4h¸Ù1À¸Ù1À¸�Ês¸�Ês¸EƸEƸ´^¸´^¸¸Î˸¸Î˸Œs…¸Œs…¸à™Ñ¸à™Ñ¸g<‹¸g<‹¸¹h׸¹h׸‘¸‘¸R2ݸR2ݸhÆ–¸hÆ–¸¯ùⸯù⸖‡œ¸–‡œ¸½è¸½è¸¶@¢¸¶@¢¸ªuuî¸ccJ#ô¸J#ô¸Á�­¸Á�­¸VÃù¸VÃù¸"³¸"³¸ºOÿ¸ºOÿ¸LŸ¸¸LŸ¸¸šd¹šd¹§ ¾¸§ ¾¸ë¹ë¹âføâføtƹtƹQµÈ¸QµÈ¸êk ¹êk ¹Œð͸Œð͸< ¹< ¹Ó¸Ó¸œ¹œ¹ç9ظç9ظã+¹ã+¹™Lݸ™Lݸ§³¹§³¹mMâ¸mMâ¸>2¹>2¹V=ç¸V=ç¸ô©¹ô©¹ð!ì¸ð!ì¸ç¹ç¹vøð¸vøð¸…¹…¹{ºõ¸{ºõ¸¦ã ¹¦ã ¹âhú¸âhú¸ý8#¹ý8#¹,ÿ¸,ÿ¸6…%¹6…%¹ýȹýȹŒÍ'¹ŒÍ'¹ ¹ ¹t*¹t*¹oI¹oI¹ŒK,¹ŒK,¹Ñ|¹Ñ|¹).¹).¹w« ¹w« ¹<­0¹<­0¹¥Ñ ¹¥Ñ ¹ªÐ2¹ªÐ2¹:í¹:í¹Çê4¹Çê4¹š¹š¹eý6¹eý6¹5 ¹5 ¹õ 9¹õ 9¹"¹"¹„;¹„;¹Ó¹Ó¹®=¹®=¹ù ¹ù ¹ì?¹ì?¹Oú¹Oú¹Rò@¹Rò@¹õß¹õß¹yÖB¹yÖB¹'½¹'½¹ä²D¹ä²D¹ý’ ¹ý’ ¹i‡F¹i‡F¹‡`"¹‡`"¹�TH¹�TH¹-($¹-($¹ŒJ¹ŒJ¹Ïé%¹Ïé%¹¹ÜK¹¹ÜK¹Ž¢'¹Ž¢'¹†”M¹†”M¹@T)¹@T)¹9FO¹9FO¹Êÿ*¹Êÿ*¹äðP¹äðP¹‚£,¹‚£,¹ã“R¹ã“R¹'@.¹'@.¹o0T¹o0T¹Z×/¹Z×/¹ßÈU¹ßÈU¹/k1¹/k1¹]W¹]W¹•ø2¹•ø2¹:éX¹:éX¹â}4¹â}4¹ZnZ¹ZnZ¹Rý5¹Rý5¹Îí[¹Îí[¹Qv7¹Qv7¹€f]¹€f]¹é8¹é8¹"Ù^¹"Ù^¹+U:¹+U:¹‡D`¹‡D`¹Ö¹;¹Ö¹;¹Ô¨a¹Ô¨a¹Þ=¹Þ=¹Šc¹Šc¹)o>¹)o>¹±]d¹±]d¹0À?¹0À?¹s®e¹s®e¹ A¹ A¹l÷f¹l÷f¹¨LB¹¨LB¹Ã:h¹Ã:h¹%‹C¹%‹C¹ zi¹ zi¹áÃD¹áÃD¹d±j¹d±j¹„óE¹„óE¹;àk¹;àk¹=G¹=G¹Q m¹Q m¹?H¹?H¹Œ+n¹Œ+n¹tZI¹tZI¹½Fo¹½Fo¹�oJ¹�oJ¹¨[p¹¨[p¹/}K¹/}K¹Ìgq¹Ìgq¹‚L¹‚L¹¡lr¹¡lr¹#�M¹#�M¹ls¹ls¹ìyN¹ìyN¹ûct¹ûct¹…jO¹…jO¹ÄSu¹ÄSu¹ÃSP¹ÃSP¹,=v¹,=v¹$7Q¹$7Q¹å w¹å w¹½R¹½R¹ãþw¹ãþw¹íR¹íR¹OØx¹OØx¹@ÁS¹@ÁS¹­y¹­y¹£�T¹£�T¹d{z¹d{z¹ŠWU¹ŠWU¹=C{¹=C{¹ÂV¹ÂV¹P|¹P|¹bÓV¹bÓV¹ ¿|¹ ¿|¹Ý‡W¹Ý‡W¹¦s}¹¦s}¹â5X¹â5X¹Ô!~¹Ô!~¹@ÞX¹@ÞX¹`Ë~¹`Ë~¹Ã‚Y¹Ã‚Y¹8q¹8q¹ý"Z¹ý"Z¹ì€¹ì€¹á¼Z¹á¼Z¹ÃU€¹ÃU€¹*P[¹*P[¹•Ÿ€¹•Ÿ€¹wÝ[¹wÝ[¹?怹?怹Kd\¹Kd\¹þ)�¹þ)�¹næ\¹næ\¹Ök�¹Ök�¹e]¹e]¹¿«�¹¿«�¹ß]¹ß]¹Wé�¹Wé�¹ U^¹ U^¹á$‚¹á$‚¹ñÅ^¹ñÅ^¹k]‚¹k]‚¹|0_¹|0_¹ï’‚¹ï’‚¹Ñ•_¹Ñ•_¹+Æ‚¹+Æ‚¹\ö_¹\ö_¹¾ö‚¹¾ö‚¹²Q`¹²Q`¹C%ƒ¹C%ƒ¹ª`¹ª`¹QRƒ¹QRƒ¹cþ`¹cþ`¹­|ƒ¹­|ƒ¹«La¹«La¹7¤ƒ¹7¤ƒ¹–a¹–a¹IɃ¹IɃ¹žÙa¹žÙa¹,냹,냹b¹b¹Y „¹Y „¹…Ob¹…Ob¹õ&„¹õ&„¹q‚b¹q‚b¹Ì@„¹Ì@„¹P°b¹P°b¹zX„¹zX„¹MÚb¹MÚb¹n„¹n„¹ëþb¹ëþb¹b€„¹b€„¹£c¹£c¹.�„¹.�„¹\3c¹\3c¹Êš„¹Êš„¹MDc¹MDc¹�£„¹�£„¹(Oc¹(Oc¹ ©„¹ ©„¹6Sc¹6Sc¹3«„¹3«„¹ÈPc¹ÈPc¹ª„¹ª„¹IGc¹IGc¹]¥„¹]¥„¹œ7c¹œ7c¹ž„¹ž„¹Á"c¹Á"c¹¿“„¹¿“„¹àc¹àc¹Í…„¹Í…„¹Fäb¹Fäb¹ít„¹ít„¹k¼b¹k¼b¹‹a„¹‹a„¹»�b¹»�b¹ÓK„¹ÓK„¹^b¹^b¹N3„¹N3„¹&b¹&b¹€„¹€„¹Qèa¹Qèa¹cùƒ¹cùƒ¹w¦a¹w¦a¹ÿ؃¹ÿ؃¹â^a¹â^a¹gµƒ¹gµƒ¹da¹da¹�ƒ¹�ƒ¹2À`¹2À`¹ªgƒ¹ªgƒ¹Gj`¹Gj`¹%=ƒ¹%=ƒ¹!`¹!`¹Zƒ¹Zƒ¹¼¯_¹¼¯_¹`Ⴙ`ႹèK_¹èK_¹N°‚¹N°‚¹Xä^¹Xä^¹s}‚¹s}‚¹Ëx^¹Ëx^¹aH‚¹aH‚¹—^¹—^¹ç‚¹ç‚¹`“]¹`“]¹ÙÖ�¹ÙÖ�¹]¹]¹Šš�¹Šš�¹Ýš\¹Ýš\¹*\�¹*\�¹‰\¹‰\¹Ü�¹Ü�¹�Ž[¹�Ž[¹%×€¹%×€¹n[¹n[¹€‘€¹€‘€¹7pZ¹7pZ¹šI€¹šI€¹3ÚY¹3ÚY¹¡þ¹¡þ¹€?Y¹€?Y¹Le¹Le¹öŸX¹öŸX¹Ç~¹Ç~¹GûW¹GûW¹x#~¹x#~¹-QW¹-QW¹¥z}¹¥z}¹D¢V¹D¢V¹vÍ|¹vÍ|¹3ïU¹3ïU¹F|¹F|¹E8U¹E8U¹Tg{¹Tg{¹«}T¹«}T¹�®z¹�®z¹†¾S¹†¾S¹Nðy¹Nðy¹eùR¹eùR¹f,y¹f,y¹L/R¹L/R¹ècx¹ècx¹t`Q¹t`Q¹8–w¹8–w¹ŒP¹ŒP¹PÃv¹PÃv¹G³O¹G³O¹’ìu¹’ìu¹ÇÖN¹ÇÖN¹Au¹Au¹ÕöM¹ÕöM¹>4t¹>4t¹|M¹|M¹)Qs¹)Qs¹Ë(L¹Ë(L¹ÿhr¹ÿhr¹t:K¹t:K¹_|q¹_|q¹‡GJ¹‡GJ¹øŠp¹øŠp¹ÑOI¹ÑOI¹:•o¹:•o¹\TH¹\TH¹$œn¹$œn¹°UG¹°UG¹ÒŸm¹ÒŸm¹ÀSF¹ÀSF¹R l¹R l¹ÀNE¹ÀNE¹¸�k¹¸�k¹ FD¹ FD¹ž–j¹ž–j¹™8C¹™8C¹B‹i¹B‹i¹¶'B¹¶'B¹}h¹}h¹àA¹àA¹?kg¹?kg¹»û?¹»û?¹?Uf¹?Uf¹kà>¹kà>¹D=e¹D=e¹ÑÃ=¹ÑÃ=¹ $d¹ $d¹r¥<¹r¥<¹nc¹nc¹a„;¹a„;¹Cêa¹Cêa¹ a:¹ a:¹ Ê`¹ Ê`¹×;9¹×;9¹<¨_¹<¨_¹c8¹c8¹�…^¹�…^¹'î6¹'î6¹Úa]¹Úa]¹yÅ5¹yÅ5¹U<\¹U<\¹òš4¹òš4¹\[¹\[¹Zo3¹Zo3¹~íY¹~íY¹¶B2¹¶B2¹;ÄX¹;ÄX¹}1¹}1¹�™W¹�™W¹<å/¹<å/¹nV¹nV¹ì´.¹ì´.¹=AU¹=AU¹ƒ-¹ƒ-¹T¹T¹ûO,¹ûO,¹HãR¹HãR¹+¹+¹Ÿ±Q¹Ÿ±Q¹Xä)¹Xä)¹z~P¹z~P¹"¬(¹"¬(¹jIO¹jIO¹Šq'¹Šq'¹éN¹éN¹à4&¹à4&¹ÎØL¹ÎØL¹�ö$¹�ö$¹s�K¹s�K¹dµ#¹dµ#¹7_J¹7_J¹Åq"¹Åq"¹ßI¹ßI¹Ì+!¹Ì+!¹°ÛG¹°ÛG¹Ìâ¹Ìâ¹¼•F¹¼•F¹t—¹t—¹”ME¹”ME¹iI¹iI¹D¹D¹Ö÷¹Ö÷¹O³B¹O³B¹D£¹D£¹ÏaA¹ÏaA¹L¹L¹¬ @¹¬ @¹!ò¹!ò¹™¶>¹™¶>¹6•¹6•¹É\=¹É\=¹ë5¹ë5¹<¹<¹úÔ¹úÔ¹·£:¹·£:¹]r¹]r¹“D9¹“D9¹¬ ¹¬ ¹ã7¹ã7¹b¦¹b¦¹6¹6¹þ<¹þ<¹g5¹g5¹2Ò ¹2Ò ¹G²3¹G²3¹–e ¹–e ¹I2¹I2¹#÷ ¹#÷ ¹ÁÞ0¹ÁÞ0¹ˆ¹ˆ¹Ès/¹Ès/¹î¹î¹.¹.¹˜¦¹˜¦¹]š,¹]š,¹™4¹™4¹L,+¹L,+¹:Á¹:Á¹ñ¼)¹ñ¼)¹+M¹+M¹€M(¹€M(¹5²ÿ¸5²ÿ¸ÏÝ&¹ÏÝ&¹hÉü¸hÉü¸n%¹n%¹áù¸áù¸¥þ#¹¥þ#¹,ùö¸,ùö¸^�"¹^�"¹äô¸äô¸Ì !¹Ì !¹{,ñ¸{,ñ¸³¹³¹Hî¸HE¹£E¹…d븅dë¸ÑØ¹ÑØ¹‚踂è¸{l¹{l¹Æ å¸Æ å¸¹¹úÁâ¸úÁâ¸!—¹!—¹$æß¸$æß¸‚.¹‚.¹³ ݸ³ ݸ"ǹ"ǹä5Ú¸ä5Ú¸.a¹.a¹ëa׸ëa׸{ü¹{ü¹ë�Ô¸ë�Ô¸Š˜¹Š˜¹¿Ñ¸¿Ñ¸65¹65¹æïθæïθÓ¹Ó¹œ#̸œ#̸Tr ¹Tr ¹”Yɸ”Yɸ³ ¹³ ¹L’ƸL’Ƹ®´ ¹®´ ¹ÎøÎø¹W ¹¹W ¹Â Á¸Â Á¸û¹û¹aH¾¸aH¾¸Ÿ¹Ÿ¹A‡»¸A‡»¸|C¹|C¹iƸ¸iƸ¸×ç¹×ç¹¶¸¶¸×‹¹×‹¹!C³¸!C³¸Ç/¹Ç/¹h�°¸h�°¸¨§ÿ¸¨§ÿ¸w¿­¸w¿­¸'ïü¸'ïü¸æüª¸æüª¸M6ú¸M6ú¸:¨¸:¨¸Î|÷¸Î|÷¸¬u¥¸¬u¥¸úÀô¸úÀô¸Ç®¢¸Ç®¢¸5ò¸5ò¸¶æŸ¸¶æŸ¸ÏDï¸ÏDï¸Û�¸Û�¸ù„ì¸ù„ì¸ Sš¸ Sš¸?Ãé¸?Ã鸥†—¸¥†—¸^ç¸^ç¸G¹”¸G¹”¸x<ä¸x<ä¸ÚꑸÚꑸªwḪwḗ�¸—�¸á±Þ¸á±Þ¸ìJŒ¸ìJŒ¸ˆêÛ¸ˆêÛ¸Ûx‰¸Ûx‰¸L"Ù¸L"Ù¸Ÿ¦†¸Ÿ¦†¸�ZÖ¸�ZÖ¸îÔƒ¸îÔƒ¸+“Ó¸+“Ó¸š�¸š�¸JÌиJÌиÂe|¸Âe|¸PθPθãÆv¸ãÆv¸B˸B˸,q¸,q¸óȸóȸ¯”k¸¯”k¸¿Å¸¿Å¸žÿe¸žÿe¸øÿ¸øÿ¸Ip`¸Ip`¸ÉDÀ¸ÉDÀ¸`éZ¸`éZ¸w�½¸w�½¸þhU¸þhU¸ Ùº¸ Ùº¸0îO¸0îO¸¯'¸¸¯'¸¸zJ¸zJ¸ yµ¸ yµ¸& E¸& E¸ýβ¸ýβ¸,¦?¸,¦?¸Õ(°¸Õ(°¸°I:¸°I:¸y‡­¸y‡­¸uö4¸uö4¸²êª¸²êª¸å¬/¸å¬/¸rS¨¸rS¨¸’o*¸’o*¸YÂ¥¸YÂ¥¸=%¸=%¸™5£¸™5£¸‹ ¸‹ ¸l¬ ¸l¬ ¸Ôî¸Ôî¸k(ž¸k(ž¸5Ö¸5ָĨ›¸Ä¨›¸QŸQŸf-™¸f-™¸œ¾ ¸œ¾ ¸—·–¸—·–¸€Â¸€Â¸}F”¸}F”¸àθàθÏÙ‘¸ÏÙ‘¸ƒÉù·ƒÉù·¿q�¸¿q�¸[ð·[ð·r �¸r �¸øPæ·øPæ·Œ­Š¸Œ­Š¸;¯Ü·;¯Ü·9Rˆ¸9Rˆ¸7Ó·7Ó·»ú…¸»ú…¸h›É·h›É·Ï¦ƒ¸Ï¦ƒ¸Æ&À·Æ&À·>V�¸>V�¸ ¿¶· ¿¶·@~¸@~¸ãe­·ãe­·Ty¸Ty¸ ¤· ¤·�ñt¸�ñt¸Öš·Öš··hp¸·hp¸Œž‘·Œž‘·Åæk¸Åæk¸€tˆ·€tˆ·Ájg¸Ájg¸Ä¨~·Ä¨~·/ób¸/ób¸’xl·’xl·�^¸�^¸ýXZ·ýXZ·fZ¸fZ¸þJH·þJH·?¥U¸?¥U¸™I6·™I6·ÿ?è·>?è·ƒfW7ƒfW7ë4à·ë4à·ZÎg7ZÎg7Û7Ø·Û7Ø·ëx7ëx7·Iз·Iз$„7$„7IhÈ·IhÈ·7,Œ77,Œ7d‘À·d‘À·®!”7®!”7@ȸ·@ȸ·Gœ7Gœ7° ±·° ±·7Σ77Σ7a©·a©·þ…«7þ…«7K¡·K¡· )³7 )³723š·23š·!´º7!´º7�¶’·�¶’·1'Â71'Â7 J‹· J‹·÷„É7÷„É7샷샷ÂÌÐ7ÂÌÐ7ú=y·ú=y·Æü×7Æü×70Æj·0Æj·‹ß7‹ß7;q\·;q\·øæ7øæ7 DN· DN·Ëùì7Ëùì7J?@·J?@·±Äó7±Äó7±_2·±_2·7wú77wú7D£$·D£$·!‰8!‰8,·,·Ë8Ë8Ï� ·Ï� ·Ï8Ï8xø¶xø¶'* 8'* 8Þ¶Þ¶þF 8þF 8xĶxĶ(W8(W8NCª¶NCª¶^Z8^Z8¶Í�¶¶Í�¶£P8£P8b?o¶b?o¶û;8û;8|Q=¶|Q=¶2828êá ¶êá ¶7ò87ò8J!¶µJ!¶µ#º!8#º!8˜S+µ˜S+µv$8v$8Ð�š3Ð�š3ÿ$'8ÿ$'8èlO5èlO5åÆ)8åÆ)8[™Ä5[™Ä5ñ\,8ñ\,8ä26ä26°æ.8°æ.8¦=6¦=6þc18þc18¨Bj6¨Bj64Ö384Ö38@B‹6@B‹6³<68³<68æ¡6æ¡6o–88o–885 ¶65 ¶6)ã:8)ã:8YÙË6YÙË6~#=8~#=8ÃÊà6ÃÊà6ïW?8ïW?8Îrõ6Îrõ6ßA8ßA8Ýç7Ýç7Ù›C8Ù›C8:ó7:ó7Þ«E8Þ«E8rÙ7rÙ7l¯G8l¯G8õ˜"7õ˜"7*¦I8*¦I8@0,7@0,7Ò�K8Ò�K8zŸ57zŸ57êlM8êlM8=é>7=é>7Á=O8Á=O8ñ H7ñ H7ØQ8ØQ8ÐQ7ÐQ7¨¼R8¨¼R8éïY7éïY7µiT8µiT8’¤b7’¤b7t V8t V8Ð1k7Ð1k7ôœW8ôœW8—˜s7—˜s7Q#Y8Q#Y82Ó{72Ó{7æ›Z8æ›Z8Kò�7Kò�7ñ\8ñ\8Ýæ…7Ýæ…7Zf]8Zf]8¨Ä‰7¨Ä‰73·^83·^8´Ž�7´Ž�7Ùû_8Ùû_8kD‘7kD‘7z2a8z2a8â”7â”7³Zb8³Zb8^i˜7^i˜7Tuc8Tuc81Ú›71Ú›7›�d8›�d8Ì2Ÿ7Ì2Ÿ7e8e8°r¢7°r¢7­mf8­mf8¢š¥7¢š¥7Ng8Ng8Õª¨7Õª¨7­h8­h8_¢«7_¢«7›âh8›âh8‚®7‚®7‚—i8‚—i8´J±7´J±7@>j8@>j8ˆû³7ˆû³7ÂÖj8ÂÖj8•¶7•¶7Eak8Eak83¹73¹7®Ýk8®Ýk8æ�»7æ�»7%Ll8%Ll8SÕ½7SÕ½7p¬l8p¬l8dÀ7dÀ7@þl8@þl8Ñ3Â7Ñ3Â7’Bm8’Bm86AÄ76AÄ7†ym8†ym8(8Æ7(8Æ7X£m8X£m8ÓÈ7ÓÈ7JÀm8JÀm8øäÉ7øäÉ7@Ïm8@Ïm8M˜Ë7M˜Ë7ÿÐm8ÿÐm8f7Í7f7Í7ëÆm8ëÆm8ÂÎ7ÂÎ7ì¯m8ì¯m8 6Ð7 6Ð7XŒm8XŒm8—Ñ7—Ñ7]m8]m8IäÒ7IäÒ7"m8"m8ÂÔ7ÂÔ7`Ûl8`Ûl8WCÕ7WCÕ7‡ˆl8‡ˆl8ÝSÖ7ÝSÖ7V)l8V)l8üO×7üO×7™¾k8™¾k8¯9Ø7¯9Ø7IIk8IIk8öÙ7öÙ7dÉj8dÉj8EØÙ7EØÙ7Å>j8Å>j8ÉŒÚ7ÉŒÚ7Þ©i8Þ©i8ž0Û7ž0Û7 i8 i8ŽÃÛ7ŽÃÛ7ùah8ùah8EÜ7EÜ7™®g8™®g8 µÜ7 µÜ7ñf8ñf8^Ý7^Ý7*f8*f8—dÝ7—dÝ7ZZe8ZZe8¦Ý7¦Ý7Œ�d8Œ�d8Ï×Ý7Ï×Ý7ƒŸc8ƒŸc8-úÝ7-úÝ7~´b8~´b8 Þ7 Þ7NÀa8NÀa8Þ7Þ7ÔÂ`8ÔÂ`8FÞ7FÞ7e¼_8e¼_8AçÝ7AçÝ7Z­^8Z­^8ô¼Ý7ô¼Ý7(–]8(–]8¬„Ý7¬„Ý7§v\8§v\8V=Ý7V=Ý7FN[8FN[8DæÜ7DæÜ7Z8Z8ïÜ7ïÜ7BãX8BãX8? Ü7? Ü7À W8À W8…Û7…Û7˜UV8˜UV8�ðÚ7�ðÚ7éU8éU8MÚ7MÚ7 ¦S8 ¦S8îšÙ7îšÙ7BR8BR8çÙØ7çÙØ7¢ÕP8¢ÕP8µ Ø7µ Ø7aO8aO8+×7+×7ÆäM8ÆäM8,>Ö7,>Ö7b`L8b`L8ÈAÕ7ÈAÕ7‘ÓJ8‘ÓJ86Ô76Ô7Ô>I8Ô>I8NÓ7NÓ7©¢G8©¢G8ÞôÑ7ÞôÑ7DÿE8DÿE8ÀÐ7ÀÐ7§TD8§TD8|}Ï7|}Ï7ä¢B8ä¢B8.Î7.Î7Šê@8Šê@8(ÒÌ7(ÒÌ7�+?8�+?8’iË7’iË7f=8f=8¿ôÉ7¿ôÉ73š;83š;8¾sÈ7¾sÈ7È98È98ÑæÆ7ÑæÆ7ð78ð78$OÅ7$OÅ7È68È68»¬Ã7»¬Ã7à/48à/48AÿÁ7AÿÁ7{G28{G282GÀ72GÀ7ýY08ýY08…¾7…¾7cg.8cg.8K¸¼7K¸¼7›o,8›o,8Háº7Háº7 s*8 s*8ß¹7ß¹7#r(8#r(8˜·7˜·7m&8m&8k%µ7k%µ7Çc$8Çc$8Ì*³7Ì*³7ÈV"8ÈV"8/(±7/(±7#F 8#F 8“¯7“¯72828™ ­7™ ­7°8°8 òª7 òª7Ûÿ8Ûÿ8’Ш7’Ш7åá8åá8€¨¦7€¨¦7gÁ8gÁ8Mz¤7Mz¤7fž8fž8òE¢7òE¢7 y8 y8  7  7ÜQ8ÜQ8þÌ�7þÌ�7ó( 8ó( 8«‰›7«‰›7Éþ 8Éþ 8-B™7-B™7DÓ8DÓ8Tö–7Tö–7Ÿ¦8Ÿ¦8#§”7#§”7my8my8U’7U’7²K8²K8!�7!�7¦8¦8©�7©�7¢ßû7¢ßû7”P‹7”P‹7’„÷7’„÷7wöˆ7wöˆ7B*ó7B*ó7+›†7+›†7XÑî7XÑî7?„7?„71zê71zê7ˆâ�7ˆâ�7%æ7%æ7U 7U 7ƒÒá7ƒÒá7GRz7GRz7ƒÝ7ƒÝ7"šu7"šu7Ç6Ù7Ç6Ù7Æâp7Æâp7êíÔ7êíÔ7‚-l7‚-l75©Ð75©Ð7¤zg7¤zg7ŽhÌ7ŽhÌ7!Êb7!Êb7p,È7p,È7L^7L^7|õÃ7|õÃ7otY7otY7«Ã¿7«Ã¿7§ÏT7§ÏT7l—»7l—»7Ö/P7Ö/P7q·7q·7!•K7!•K7àP³7àP³7üÿF7üÿF77¯77¯7åpB7åpB7$«7$«7Ùç=7Ùç=7®§7®§7Je97Je97~£7~£7–é47–é47¥Ÿ7¥Ÿ7u07u07‡›7‡›7Œ,7Œ,7f0—7f0—7å£'7å£'7QJ“7QJ“7_G#7_G#7©l�7©l�7Ôó7Ôó7Ú—‹7Ú—‹7…©7…©7éˇ7éˇ7;h7;h7ç„7ç„7M07M073O€73O€7O7O7#>y7#>y7�Þ 7�Þ 7™ñq7™ñq7¡Å7¡Å7‚¹j7‚¹j7é·7é·7–c7–c7djû6djû6:‡\7:‡\7{ó6{ó6�U7�U7ñ¢ë6ñ¢ë6x©N7x©N7‚âã6‚âã6uÛG7uÛG7U:Ü6U:Ü6$A7$A7ˆ«Ô6ˆ«Ô6ìƒ:7ìƒ:7Ï6Í6Ï6Í6ƒû37ƒû37ÝÅ6ÝÅ6n‹-7n‹-7ëž¾6ëž¾6ì3'7ì3'7o|·6o|·64õ 74õ 7õu°6õu°6¶Ï7¶Ï7HŒ©6HŒ©6øÃ7øÃ7+À¢6+À¢6{Ò7{Ò7Eœ6Eœ6©û7©û7/ƒ•6/ƒ•6û?7û?7 �6 �6Ë?û6Ë?û6FĈ6FĈ6Ã7ð6Ã7ð6›•‚6›•‚6Uhå6Uhå6¸y6¸y65ÒÚ65ÒÚ6Q7m6Q7m6KvÐ6KvÐ6*£a6*£a6CUÆ6CUÆ6TV6TV6äo¼6äo¼6LKK6LKK6߯²6߯²6g‰@6g‰@6ËZ©6ËZ©6_66_66[, 6[, 6×Ý+6×Ý+6ü;—6ü;—6:õ!6:õ!6-ŠŽ6-ŠŽ6;V6;V6…†6…†6w6w6îÈ{6îÈ{6W÷6W÷6ââk6ââk6¦pú5¦pú5´}\6´}\6b‰é5b‰é5šM6šM6`9Ù5`9Ù5œ8?6œ8?6/�É5/�É5òY16òY16ä`º5ä`º5þ#6þ#6ߨ«5ߨ«5ô&6ô&6©é�5©é�5ÔÓ 6ÔÓ 6C“�5C“�5ñ þ5ñ þ5­Õƒ5­Õƒ5sxç5sxç5ao5ao5»ðÑ5»ðÑ5ÙHX5ÙHX5–t½5–t½5zaB5zaB5ª5ª5‡ª-5‡ª-5² —5² —5V#5V#5£I†5£I†5~Ë5~Ë5~ÿk5~ÿk5ðDí4ðDí4·†M5·†M5ôNÍ4ôNÍ4/)15/)15¨²¯4¨²¯4úæ5úæ5ûm”4ûm”4¿€ý4¿€ý4þv4þv4kÑ4kÑ4FÇI4FÇI4�©4�©4ú2!4ú2!4Oæ…4Oæ…4wú3wú3oìL4oìL4¶»3¶»3+x4+x4œ†3œ†3µÛÐ3µÛÐ3Q33Q33 •…3 •…3ï-Ø2ï-Ø2Ù,3Ù,3" \2" \2 d…2 d…2Õž1Õž1—I…1—I…1M 0M 0././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/BinauralDecoder/Source/EQ/AKG-K1000-Closed.wavIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/BinauralDecoder/Source/EQ/AKG-K1000-0000664002537200253720000004013015257173642030510 0ustar zmoelnigzmoelnigRIFFP@WAVEfmt €»Ü factPEAKßc Ykvg?kvg?data@kvg?kvg?×€¾×€¾bqö¼bqö¼�‡Ä=�‡Ä=7îо7îо}�¾}�¾#@>#@>P"8"Y>'='=~“<~“<lj–=lj–=­w<­wÛ;>Û;‰s;‰s;”Õ;”Õ;§e;§e;Êd;Êd;I“;I“;f”;f”;;N;;N;»@;»@;"=;"=;Xp;Xp;”ê;”ê;‘;‘;¸ ;¸ ;_& ;_& ;@5 ;@5 ;ö7 ;ö7 ;­\ ;­\ ; ; ;“V ;“V ;¨;¨;WX ;WX ;üÙ;üÙ;+ß ;+ß ;‹t ;‹t ;Æs ;Æs ;^K ;^K ;µ¸ ;µ¸ ;ž8 ;ž8 ;Ë>;Ë>;Ù¤;Ù¤;pï;pï;n€;n€;GZ;GZ;áß;áß;«;«;;;è†;è†;û¬;û¬;†H;†H;dˆ;dˆ;{-;{-;•™;•™;ây;ây;n;n;;;B;B;ºð;ºð;ùá;ùá;ð;;ð;;ïj;ïj;é%;é%;¬v;¬v;ÛÕ;ÛÕ;…Â;…Â;Z;Z;æ;æ;{;{;‹ ;‹ ;ìß ;ìß ;Çü ;Çü ;Dv ;Dv ;ñt ;ñt ;}¯ ;}¯ ;!_ ;!_ ;F_ ;F_ ;¢? ;¢? ;;­ ;;­ ;ÚÖ ;ÚÖ ;Í` ;Í` ;ky ;ky ;-Ó ;-Ó ;ãÏ;ãÏ;þ! ;þ! ;È;È;H†;H†;/«;/«;�;�;Á;Á;©W;©W;²;²;wN;wN;š';š';õL;õL;0";0";ˆT;ˆT;­6;­6;›œ;›œ;ʳ;ʳ;‡;‡;¶;¶;‘Y;‘Y;ÖC;ÖC;6Ÿ;6Ÿ;<¨;<¨;­;­;šïÿ:šïÿ:Ý6;Ý6;Ëþ:Ëþ:È@þ:È@þ:¸—û:¸—û:!‡û:!‡û:æø:æø:N,ù:N,ù:öØö:öØö:dE÷:dE÷:ƒÕô:ƒÕô:´úô:´úô:+‹ò:+‹ò:6ó:6ó:ÙÖð:ÙÖð:vqñ:vqñ:P.ï:P.ï:¢aï:¢aï:¥¼ì:¥¼ì:n²ì:n²ì:¤Ýé:¤Ýé:ÍÑé:ÍÑé:”ç:”ç:à+ç:à+ç:Z˜ä:Z˜ä:~®ä:~®ä:°îá:°îá:½Øá:½Øá:òß:òß:�ß:�ß:liÜ:liÜ:² Ü:² Ü:ï/Ú:ï/Ú:ËtÚ:ËtÚ:oæ×:oæ×:ië×:ië×:EÕ:EÕ:fÕ:fÕ:OÒ:OÒ:ŠnÒ:ŠnÒ:ÄâÏ:ÄâÏ:fÿÏ:fÿÏ:áHÍ:áHÍ:8=Í:8=Í:¶{Ê:¶{Ê:ŸŒÊ:ŸŒÊ:"È:"È:>LÈ:>LÈ:mäÅ:mäÅ:56Æ:56Æ:‘ÆÃ:‘ÆÃ:•þÃ:•þÃ:ÛlÁ:ÛlÁ:ŒÁ:ŒÁ:/ì¾:/ì¾:· ¿:· ¿:Xˆ¼:Xˆ¼:qż:qż:ŠVº:ŠVº:û§º:û§º:-4¸:-4¸:Ky¸:Ky¸:Ä ¶:Ä ¶:œO¶:œO¶:9â³:9â³:·5´:·5´:pÕ±:pÕ±:A²:A²:ˆ÷¯:ˆ÷¯:”T°:”T°:Uã­:Uã­:9®:9®:" «:" «:î«:î«:똩:똩:ðª:ðª:À³§:À³§:2¨:2¨:ލ¥:ލ¥:êð¥:êð¥:<ƒ£:<ƒ£:«Î£:«Î£:h¡:h¡:ÛÈ¡:ÛÈ¡: oŸ: oŸ:‚ÒŸ:‚ÒŸ:Lv�:Lv�:8Æ�:8Æ�:ÙZ›:ÙZ›:í²›:í²›:žV™:žV™:sÀ™:sÀ™:Jp—:Jp—:Í—:Í—:éf•:éf•:>»•:>»•:šR“:šR“:’¬“:’¬“:)R‘:)R‘:c´‘:c´‘:n`�:n`�:OÇ�:OÇ�: a�: a�:Ó§�:Ó§�:ô0‹:ô0‹:ù~‹:ù~‹:f&‰:f&‰:š‰:š‰:P‡:P‡:>»‡:>»‡:Hb…:Hb…:c¼…:c¼…:’Xƒ:’Xƒ:ú³ƒ:ú³ƒ:lR�:lR�:�²�:�²�:O¹~:O¹~:Ђ:Ђ:øÑz:øÑz:`“{:`“{:ØÈv:ØÈv:ûzw:ûzw:K»r:K»r:Fvs:Fvs:'Án:'Án:Šo:Šo:�Ój:�Ój:E—k:E—k:öÙf:öÙf:Œg:Œg:ÆÀb:ÆÀb:Urc:Urc:b±^:b±^:w_:w_:(ÄZ:(ÄZ:�„[:�„[:]¼V:]¼V:ŸjW:ŸjW:}�R:}�R:áNS:áNS: ŠN: ŠN:;JO:;JO:­ŸJ:­ŸJ:Ë„K:Ë„K:ðF:ðF:ªÉG:ªÉG:C:C:ß½C:ß½C:—ó>:—ó>:´?:´?:¬;:¬;:ÛÑ;:ÛÑ;:�7:�7:bë7:bë7:õ:3:õ:3:S 4:S 4:K`/:K`/:%60:%60:ÿ”+:ÿ”+:„,:„,:•í':•í':@Ø(:@Ø(:y@$:y@$:Ù%:Ù%:•{ :•{ :W`!:W`!:ÁÈ:ÁÈ:ì³:ì³:!:!:º :º :Px:Px:¿k:¿k:‘á:‘á:—Ù:—Ù:SZ:SZ:¤b:¤b:7î :7î :…ÿ :…ÿ :ñ‹:ñ‹:*–:*–:Ã":Ã":É/:É/:Šº:Šº:¢Ë:¢Ë:(´ú9(´ú9ãÒü9ãÒü9îó9îó9£üõ9£üõ9§õì9§õì9 øî9 øî9xæ9xæ9§7è9§7è9(‰ß9(‰ß9Aæá9Aæá9b/Ù9b/Ù9qtÛ9qtÛ9œ§Ò9œ§Ò9âÔ9âÔ9FÌ9FÌ9jVÎ9jVÎ9ï‚Å9ï‚Å9ý¼Ç9ý¼Ç9�î¾9�î¾9 *Á9 *Á9{]¸9{]¸9½’º9½’º99½±99½±9 ´9 ´9M«9M«92«­92«­95¥95¥9[d§9[d§9³³ž9³³ž9¡9¡9�r˜9�r˜9@Ùš9@Ùš9×:’9×:’9§§”9§§”9oŒ9oŒ9ulŽ9ulŽ9Þ½…9Þ½…9Lj9Lj9ƒî~9ƒî~9ºã�9ºã�9¦’r9¦’r9îŽw9îŽw9·of9·of9v|k9v|k9uZ9uZ9¦“_9¦“_9ËžN9ËžN9hØS9hØS9[ìB9[ìB9wH9wH9¢79¢79Â:<9Â:<9 ;+9 ;+9z09z09A¬9A¬9R%9R%9Ú^9Ú^9’Ã9’Ã9�í9�í9ç=9ç=9Üú8Üú8ðâ9ðâ9È•ä8È•ä8ÛØï8ÛØï8ýÅÎ8ýÅÎ8ˆÚ8ˆÚ8é¸8é¸8MÄ8MÄ8�g£8�g£8³ì®8³ì®8Ž8Ž8¥¡™8¥¡™8G¾q8G¾q8N�„8N�„8ÉÄG8ÉÄG8cP_8cP_8B8B8ºŽ58ºŽ58úèè7úèè7¿d 8¿d 87b—77b—7íÈ7íÈ7" 7" 7ºo7ºo7—:“µ—:“µ£ 6£ 6oq0·oq0·#3š¶#3š¶Dw¦·Dw¦·3*h·3*h·•Íò·•Íò·ú(¿·ú(¿·qÕ¸qÕ¸É*¸É*¸ý…D¸ý…D¸µä*¸µä*¸j¸j¸Š)P¸Š)P¸«‡¸«‡¸ORu¸ORu¸qš¸qš¸výŒ¸výŒ¸½^¬¸½^¬¸Å-Ÿ¸Å-Ÿ¸×w¾¸×w¾¸¿õ°¸¿õ°¸€¿Ï¸€¿Ï¸ùÔÁ¸ùÔÁ¸äeà¸äeà¸uuÒ¸uuÒ¸•:ñ¸•:ñ¸inã¸in㸟¹Ÿ¹—Eô¸—Eô¸‹f ¹‹f ¹"P¹"P¹…¹…¹…j ¹…j ¹I§¹I§¹Ü�¹Ü�¹RÝ!¹RÝ!¹…¶¹…¶¹âÇ)¹âÇ)¹ j"¹ j"¹CP1¹CP1¹å)¹å)¹GË8¹GË8¹ R1¹ R1¹Ä$@¹Ä$@¹0�8¹0�8¹ûIG¹ûIG¹ß±?¹ß±?¹mN¹mN¹´ÎF¹´ÎF¹R‘U¹R‘U¹R÷M¹R÷M¹l·\¹l·\¹U¹U¹¢µc¹¢µc¹Uë[¹Uë[¹²uj¹²uj¹”b¹”b¹[q¹[q¹¨i¹¨i¹5pw¹5pw¹fo¹fo¹¼¹}¹¼¹}¹´¡u¹´¡u¹ó�¹ó�¹ÕÂ{¹ÕÂ{¹¹…¹¹…¹ô€¹ô€¹äˆ¹äˆ¹Ñ „¹Ñ „¹³+‹¹³+‹¹‡¹‡¹Ó%޹Ó%޹HйHй< ‘¹< ‘¹«ÙŒ¹«ÙŒ¹ÐÕ“¹ÐÕ“¹!˜�¹!˜�¹B�–¹B�–¹8M’¹8M’¹Ý=™¹Ý=™¹žï”¹žï”¹�Õ›¹�Õ›¹1ƒ—¹1ƒ—¹ºož¹ºož¹ã'š¹ã'𹇡¹‡¡¹·Òœ¹·Òœ¹„¾£¹„¾£¹|gŸ¹|gŸ¹‡D¦¹‡D¦¹’Ý¡¹’Ý¡¹�­¨¹�­¨¹J@¤¹J@¤¹H«¹H«¹ë¡¦¹ë¡¦¹úl­¹úl­¹Êñ¨¹Êñ¨¹‘¬¯¹‘¬¯¹4#«¹4#«¹’×±¹’×±¹°M­¹°M­¹=´¹=´¹g�¯¹g�¯¹R:¶¹R:¶¹å®±¹å®±¹e^¸¹e^¸¹¤Ä³¹¤Ä³¹„iº¹„iº¹6ʵ¹6ʵ¹óm¼¹óm¼¹%η¹%η¹"l¾¹"l¾¹r¼¹¹r¼¹¹VKÀ¹VKÀ¹w�»¹w�»¹ê¹ê¹>V½¹>V½¹ýØÃ¹ýØÃ¹ˆ¿¹ˆ¿¹®“Ź®“ŹxËÀ¹xËÀ¹~Eǹ~Eǹár¹ár¹ãȹãȹ<Ĺ<ĹUrʹUrʹl’Źl’ʬ÷˹¬÷˹Á ǹÁ ǹ5i͹5i͹êtȹêtȹ­Éι­Éι7Îɹ7Îɹíйíй%˹%˹kZѹkZѹ�N̹�N̹�Ò¹�Ò¹Ý}͹Ý}͹µÓ¹µÓ¹¨—ι¨—ι»ÄÔ¹»ÄÔ¹Z�ϹZ�ϹDÆÕ¹DÆÕ¹ò›Ð¹ò›Ð¹n½Ö¹n½Ö¹ÇˆÑ¹ÇˆÑ¹ ×¹ ×¹ú^Ò¹ú^Ò¹½nع½nع(Ó¹(Ó¹2Ù¹2Ù¹æÓ¹æÓ¹/éÙ¹/éÙ¹’�Ô¹’�Ô¹]‡Ú¹]‡Ú¹Î!Õ¹Î!Õ¹Ê Û¹Ê Û¹õ Õ¹õ Õ¹)‰Û¹)‰Û¹Ö¹Ö¹zýÛ¹zýÛ¹ñ‡Ö¹ñ‡Ö¹ fܹ fܹÂåÖ¹ÂåÖ¹ð¸Ü¹ð¸Ü¹~,×¹~,×¹øÜ¹øÜ¹íf×¹íf×¹Á.ݹÁ.ݹ™×¹™×¹[ݹ[ݹͺ׹ͺ׹€qݹ€qݹbÄ×¹bÄ×¹‚pݹ‚pݹ¼×¹¼×¹dݹdݹV«×¹V«×¹”Pݹ”Pݹg“×¹g“×¹d3ݹd3ݹ\n×¹\n×¹^ݹ^ݹÿ9×¹ÿ9×¹ØÎܹØÎܹ×¹×¹ö“ܹö“ܹŒ¾Ö¹Œ¾Ö¹¤Fܹ¤Fܹ}dÖ¹}dÖ¹´âÛ¹´âÛ¹½øÕ¹½øÕ¹ÂpÛ¹ÂpÛ¹Õ¹Õ¹ÑñÚ¹ÑñÚ¹èüÔ¹èüÔ¹pnÚ¹pnÚ¹ívÔ¹ívÔ¹"åÙ¹"åÙ¹õçÓ¹õçÓ¹ÚRÙ¹ÚRÙ¹�TÓ¹�TÓ¹ÿ¿Ø¹ÿ¿Ø¹¯¿Ò¹¯¿Ò¹ž&عž&ع¤Ò¹¤Ò¹œy×¹œy×¹{gѹ{gѹ˜¿Ö¹˜¿Ö¹©Ð¹©Ð¹ÙýÕ¹ÙýÕ¹¡áϹ¡áϹ¯1Õ¹¯1Õ¹ñϹñϹn\Ô¹n\Ô¹7ι7ιm‚Ó¹m‚Ó¹Þ]͹Þ]͹þ«Ò¹þ«Ò¹?ˆÌ¹?ˆÌ¹/Óѹ/Óѹ€©Ë¹€©Ë¹MñйMñйRÄʹRÄʹû йû йÔÛɹÔÛɹËϹËϹšçȹšçȹ¯$ι¯$ι;éǹ;éǹÜ"͹Ü"͹ 对 对Š̹Š̹FáŹFáŹþ˹þ˹áĹáĹ.ʹ.ʹ¡Üù¡Üù¼ɹ¼ɹXÓ¹XÓ¹x ȹx ȹ[ÅÁ¹[ÅÁ¹»ùƹ»ùƹưÀ¹Æ°À¹kãŹkãŹ€˜¿¹€˜¿¹ôÊĹôÊĹŸ|¾¹Ÿ|¾¹K¬Ã¹K¬Ã¹Ñ[½¹Ñ[½¹(ŠÂ¹(ŠÂ¹î7¼¹î7¼¹êeÁ¹êeÁ¹»¹»¹0AÀ¹0AÀ¹yï¹¹yï¹¹O ¿¹O ¿¹å̸¹å̸¹yû½¹yû½¹�£·¹�£·¹íμ¹íμ¹Bt¶¹Bt¶¹¦�»¹¦�»¹O@µ¹O@µ¹Biº¹Biº¹ ´¹ ´¹ÿ1¹¹ÿ1¹¹Ѳ¹Ѳ¹Þö·¹Þö·¹I“±¹I“±¹�¹¶¹�¹¶¹±V°¹±V°¹ µ¹ µ¹¬¯¹¬¯¹ B´¹ B´¹ÍÛ­¹ÍÛ­¹³¹³¹­›¬¹­›¬¹±¹±¹àX«¹àX«¹ã{°¹ã{°¹æª¹æª¹(1¯¹(1¯¹¯Ã¨¹¯Ã¨¹æ­¹æ­¹]v§¹]v§¹d–¬¹d–¬¹i#¦¹i#¦¹êA«¹êA«¹ô̤¹ô̤¹)멹)멹v£¹v£¹ç•¨¹ç•¨¹² ¢¹² ¢¹„?§¹„?§¹´Æ ¹´Æ ¹Ç⥹Ç⥹¶gŸ¹¶gŸ¹"„¤¹"„¤¹³ž¹³ž¹€%£¹€%£¹%©œ¹%©œ¹íÄ¡¹íÄ¡¹E›¹E›¹³] ¹³] ¹�Ù™¹�Ù™¹ðž¹ðž¹'k˜¹'k˜¹è‚�¹è‚�¹ý–¹ý–¹Aœ¹Aœ¹ÿˆ•¹ÿˆ•¹ ›š¹ ›š¹¼ ”¹¼ ”¹Ü™¹Ü™¹�’’¹�’’¹…¦—¹…¦—¹Ç‘¹Ç‘¹‡+–¹‡+–¹;›�¹;›�¹ˆ«”¹ˆ«”¹û޹û޹$“¹$“¹TŒŒ¹TŒŒ¹I˜‘¹I˜‘¹ÿйÿй† �¹† �¹]n‰¹]n‰¹¹w޹¹wŽ¹ÔØ‡¹Ô؇¹ŽáŒ¹ŽáŒ¹ŠB†¹ŠB†¹L‹¹L‹¹O«„¹O«„¹§³‰¹§³‰¹:ƒ¹:ƒ¹'ˆ¹'ˆ¹p�¹p�¹¦t†¹¦t†¹¦–¹¦–¹¦Î„¹¦Î„¹²F|¹²F|¹L%ƒ¹L%ƒ¹ßðx¹ßðx¹�y�¹�y�¹d“u¹d“u¹3’¹3’¹¾,r¹¾,r¹)|¹)|¹©Ân¹©Ân¹zÁx¹zÁx¹ÐZk¹ÐZk¹8[u¹8[u¹�òg¹�òg¹Vñq¹Vñq¹Ëƒd¹Ëƒd¹·}n¹·}n¹a¹a¹Òþj¹Òþj¹õ…]¹õ…]¹Š{g¹Š{g¹ÈÿY¹ÈÿY¹Uóc¹Uóc¹½qV¹½qV¹Æb`¹Æb`¹çÜR¹çÜR¹(Í\¹(Í\¹"HO¹"HO¹E¹Ý>¹þþê¸þþê¸×Ýþ¸×Ýþ¸A^ã¸A^ã¸ËA÷¸ËA÷¸DÃÛ¸DÃÛ¸Wªï¸Wªï¸'Ô¸'Ô¸rè¸rè¸sŠÌ¸sŠÌ¸‚uขuà¸OïĸOïĸôÞØ¸ôÞØ¸rY½¸rY½¸PѸPѸ®Ìµ¸®Ìµ¸ÆÉ¸ÆÉ¸Ù=®¸Ù=®¸8¸8¸٭¦¸Ù­¦¸C¯º¸C¯º¸Š*Ÿ¸Š*Ÿ¸µ2³¸µ2³¸Å­—¸Å­—¸_º«¸_º«¸Ø2�¸Ø2�¸:C¤¸:C¤¸ˆ¼ˆ¸ˆ¼ˆ¸ÅМ¸ÅМ¸iK�¸iK�¸h•¸h•¸7És¸7És¸$ޏ$Ž¸Ë e¸Ë e¸r®†¸r®†¸â\V¸â\V¸NÀ~¸NÀ~¸¦ÇG¸¦ÇG¸8p¸8p¸V?9¸V?9¸"µa¸"µa¸lº*¸lº*¸g;S¸g;S¸æ=¸æ=¸ÆD¸ÆD¸ÔÌ ¸ÔÌ ¸di6¸di6¸Åÿ·Åÿ·¦9(¸¦9(¸Ž®â·Ž®â·b¸b¸2jÆ·2jÆ·Ž ¸Ž ¸¼Pª·¼Pª·ü·ü·èrŽ·èrŽ·È^à·È^à·"že·"že·êÎÄ·êÎÄ·¯j.·¯j.·9?©·9?©·œî¶œî¶9Þ�·9Þ�·‡²�¶‡²�¶ê«e·ê«e·[Ž.µ[Ž.µ$é/·$é/·+Š+6+Š+6ò�ô¶ò�ô¶6®À66®À6”sж”sж’-7’-7h †µh †µkƒI7kƒI7úh 6úh 6Á˜}7Á˜}7+Œ®6+Œ®6v½˜7v½˜7þà 7þà 7qs²7qs²7Ôë=7Ôë=7nÜË7nÜË7hp7hp7b å7b å7Ç>‘7Ç>‘7þ7þ7ª7ª7„i 8„i 8{¼Â7{¼Â7¾®8¾®8ÓÛ7ÓÛ7þØ#8þØ#8ºTó7ºTó7>í/8>í/8P§8P§8 Û;8 Û;8«8«8¬G8¬G8EA8EA8#dS8#dS8�Ý(8�Ý(85î^85î^8fL48fL48²Nj8²Nj8š™?8š™?8¿”u8¿”u8dÍJ8dÍJ8¶`€8¶`€8�æU8�æU8/è…8/è…8šâ`8šâ`8Áa‹8Áa‹8ª¿k8ª¿k8sÊ�8sÊ�8Æ{v8Æ{v8m"–8m"–89Š€89Š€8h›8h›89Â…89Â…8þ˜ 8þ˜ 8íèŠ8íèŠ8º¥8º¥8çþ�8çþ�8§Éª8§Éª84•84•8Ư8Ư8õ™8õ™8w¶´8w¶´8NÜž8NÜž8˜¹8˜¹8a°£8a°£8Äd¾8Äd¾8q¨8q¨8qÃ8qÃ8š­8š­8×ÇÇ8×ÇÇ8(½±8(½±8_Ì8_Ì8ÇH¶8ÇH¶8CãÐ8CãÐ8 Áº8 Áº82VÕ82VÕ8¶(¿8¶(¿8B¹Ù8B¹Ù8ò�Ã8ò�Ã8˜ Þ8˜ Þ8~ÇÇ8~ÇÇ8mJâ8mJâ8µùË8µùË8�væ8�væ8šÐ8šÐ8³�ê8³�ê8ö(Ô8ö(Ô8_˜î8_˜î8º"Ø8º"Ø8å‰ò8å‰ò8oÜ8oÜ8^hö8^hö8ÝÛß8ÝÛß8Ì7ú8Ì7ú8fžã8fžã8{òý8{òý8ELç8ELç8sÍ9sÍ9\ìê8\ìê8Õ›9Õ›9÷|î8÷|î8Â_9Â_9Ïõñ8Ïõñ8Ë9Ë9ñXõ8ñXõ8îÅ9îÅ9¬¨ø8¬¨ø8k 9k 9jéû8jéû8M 9M 9õÿ8õÿ8� 9� 9á9á9%9%9œ9œ9û¦9û¦9R9R9/!9/!9RŒ9RŒ9¼�9¼�9Ûó9Ûó9€ó9€ó9�Q9�Q9N9N9š§ 9š§ 9ƒ¢9ƒ¢9õõ 9õõ 9Wí9Wí9È9 9È9 9.-9.-9ƒs 9ƒs 9Þc9Þc9N¤9N¤9¨‘9¨‘9åË9åË9Z¶9Z¶9'ë9'ë9ÄÒ9ÄÒ9³9³9-æ9-æ9ò9ò9§ð9§ð999.ó 9.ó 9Ü9Ü9í!9í!9±9±9¬Ý"9¬Ý"97ï97ï9ïÄ#9ïÄ#9¸Ð9¸Ð9œ¤$9œ¤$9D«9D«9ê{%9ê{%9”{9”{9¾G&9¾G&9>A9>A9= '9= '9÷9÷9ÕË'9ÕË'9½9½9”„(9”„(9p9p9Ñ4)9Ñ4)9í9í9;Û)9;Û)9ɺ9ɺ9áy*9áy*9BT9BT9ü+9ü+9å9å9gž+9gž+9m9m9v$,9v$,9ƒî9ƒî9Ť,9Ť,9Qj 9Qj 9-9-9-à 9-à 9“’-9“’-9ÉM!9ÉM!9Àý-9Àý-9¤³!9¤³!9ça.9ça.9Ÿ"9Ÿ"9ÿ¿.9ÿ¿.9Ök"9Ök"9/9/9hº"9hº"9a/9a/9ñ#9ñ#9u§/9u§/96D#96D#9Äè/9Äè/9>�#9>�#9y$09y$098¸#98¸#94Y094Y09¾ç#9¾ç#9-‡09-‡09$9$9Ó®09Ó®09~3$9~3$9”Î09”Î09dM$9dM$9èå09èå09!_$9!_$9¦õ09¦õ09~j$9~j$9319319\q$9\q$9Ž19Ž19[s$9[s$9Þ19Þ19õn$9õn$9ÿ19ÿ19¸d$9¸d$9Õõ09Õõ09@U$9@U$9å09å09u?$9u?$9ÂÌ09ÂÌ09a!$9a!$9]¬09]¬094ü#94ü#9G†09G†09(Ò#9(Ò#9t[09t[09ö¢#9ö¢#9 *09 *09lm#9lm#9ýó/9ýó/93#93#9š¹/9š¹/9õ"9õ"9Šz/9Šz/9u±"9u±"9{5/9{5/9}g"9}g"9˜é.9˜é.9"9"9–.9–.9ݽ!9ݽ!92=.92=.9§a!9§a!9á-9á-9�!9�!9?-9?-9¹š 9¹š 9-9-9R. 9R. 9\ª,9\ª,9 ¾9 ¾9n9,9n9,9(I9(I9ŠÃ+9ŠÃ+9yÎ9yÎ9XG+9XG+9@M9@M9ŠÄ*9ŠÄ*9VÆ9VÆ9/=*9/=*9;9;9 ±)9 ±)9Cª9Cª9Ë)9Ë)9Ô9Ô9÷‡(9÷‡(9Hy9Hy9Lí'9Lí'9ÔÚ9ÔÚ9ÅM'9ÅM'9À69À69C¨&9C¨&9IŒ9IŒ9óü%9óü%9\Ý9\Ý9âM%9âM%9Ò*9Ò*9›š$9›š$9£r9£r9 á#9 á#9Ç´9Ç´9{"#9{"#9mò9mò9Ì_"9Ì_"9¶+9¶+9Š˜!9Š˜!9`9`9RË 9RË 9FŽ9FŽ9!ù9!ù9ð¸9ð¸9³$9³$9Ká9Ká9L9L9Í9Í9â7>â7†S_7†S_7¬ Ö7¬ Ö7Ë4G7Ë4G7ÃÊ7ÃÊ7õ6/7õ6/7Â,¾7Â,¾7Q7Q7O²7O²7[÷þ6[÷þ6Â|¦7Â|¦7˜�Ï6˜�Ï6¿š7¿š7²„ 6²„ 6�7�7��c6��c6–ƒ7–ƒ7y6y6�õo7�õo7/›(5/›(5ìY7ìY7­‰Fµ­‰FµZB7ZB7àÎ ¶àÎ ¶]Ä+7]Ä+7hqg¶hqg¶eK7eK7EÑ ¶EÑ ¶ýôý6ýôý6O…ͶO…Ͷ(·Ñ6(·Ñ6HÞù¶HÞù¶ŒÈ¥6ŒÈ¥6ö·ö·_dt6_dt6¶Ë(·¶Ë(·—ÿ6—ÿ6Yo>·Yo>·ÉÁ�5ÉÁ�5ÉáS·ÉáS·ÃÎG´ÃÎG´(i·(i·(uÁµ(uÁµ=G~·=G~·EO4¶EO4¶"œ‰·"œ‰·]Žƒ¶]Žƒ¶3ú“·3ú“·‰¬¶‰¬¶Q>ž·Q>ž·`%Õ¶`%Õ¶Jm¨·Jm¨·ný¶ný¶è„²·è„²·@£·@£·º{¼·º{¼·+K&·+K&·àSÆ·àSÆ·ëÀ9·ëÀ9· з зô M·ô M·²ÂÙ·²ÂÙ·p$`·p$`·ÀRã·ÀRã·Ùs·Ùs·\Åì·\Åì·6Ô‚·6Ô‚·Šö·Šö·Œ·Œ·©dÿ·©dÿ·x6•·x6•· E¸ E¸ 8ž· 8ž·íǸíǸX§·X§·u? ¸u? ¸hð¯·hð¯·<ª¸<ª¸>£¸·>£¸·Š¸Š¸ç3Á·ç3Á·fM¸fM¸¤É·¤É·Õ†¸Õ†¸ÅúÑ·ÅúÑ·³"¸³"¸6Ú·6Ú·óÍ&¸óÍ&¸WNâ·WNâ· Ö*¸ Ö*¸ìCê·ìCê·ÌÌ.¸ÌÌ.¸Øò·Øò·ú°2¸ú°2¸ŽÉù·ŽÉù·›�6¸›�6¸Xª¸Xª¸4?:¸4?:¸}^¸}^¸Rê=¸Rê=¸ù¸ù¸¡ƒA¸¡ƒA¸»“ ¸»“ ¸> E¸> E¸¥¸¥¸’}H¸’}H¸‚¸‚¸bÞK¸bÞK¸SÞ¸SÞ¸¡+O¸¡+O¸`'¸`'¸dR¸dR¸]¸]¸ ˆU¸ ˆU¸Í~¸Í~¸P—X¸P—X¸O�"¸O�"¸e’[¸e’[¸I‰%¸I‰%¸z^¸z^¸&r(¸&r(¸]Ma¸]Ma¸ÈG+¸ÈG+¸. d¸. d¸– .¸– .¸P·f¸P·f¸º0¸º0¸Ni¸Ni¸ÑU3¸ÑU3¸ñÎk¸ñÎk¸*Ü5¸*Ü5¸•8n¸•8n¸L8¸L8¸ð‹p¸ð‹p¸¨:¸¨:¸‹Ër¸‹Ër¸^ò<¸^ò<¸2øt¸2øt¸)?¸)?¸w¸w¸²JA¸²JA¸y¸y¸>WC¸>WC¸•úz¸•úz¸ñPE¸ñPE¸ùÑ|¸ùÑ|¸A6G¸A6G¸’~¸’~¸cI¸cI¸K€¸K€¸g½J¸g½J¸+瀸+瀸´bL¸´bL¸ ¦�¸ ¦�¸ òM¸ òM¸‹Y‚¸‹Y‚¸ÔlO¸ÔlO¸Ìƒ¸Ìƒ¸CÔP¸CÔP¸�¡ƒ¸�¡ƒ¸'R¸'R¸f5„¸f5„¸eS¸eS¸9¾„¸9¾„¸‹�T¸‹�T¸º;…¸º;…¸¡U¸¡U¸£®…¸£®…¸ V¸ V¸0†¸0†¸ÚˆW¸ÚˆW¸¡r†¸¡r†¸í]X¸í]X¸.ņ¸.ņ¸»Y¸»Y¸è ‡¸è ‡¸ÊËY¸ÊËY¸I‡¸I‡¸çaZ¸çaZ¸Jz‡¸Jz‡¸ìãZ¸ìãZ¸¡‡¸¡‡¸ R[¸ R[¸m½‡¸m½‡¸Y¬[¸Y¬[¸Wχ¸Wχ¸6ò[¸6ò[¸fÖ‡¸fÖ‡¸ö#\¸ö#\¸‰Ó‡¸‰Ó‡¸AC\¸AC\¸òƇ¸òƇ¸ÔO\¸ÔO\¸?°‡¸?°‡¸ÜH\¸ÜH\¸W�‡¸W�‡¸Ý-\¸Ý-\¸ýc‡¸ýc‡¸±ÿ[¸±ÿ[¸Ê.‡¸Ê.‡¸é¾[¸é¾[¸žï†¸žï†¸3j[¸3j[¸t¦†¸t¦†¸5[¸5[¸˜T†¸˜T†¸‘�Z¸‘�Z¸�ù…¸�ù…¸�Z¸�Z¸H•…¸H•…¸ikY¸ikY¸v(…¸v(…¸ÁX¸ÁX¸+²„¸+²„¸2X¸2X¸º2„¸º2„¸37W¸37W¸Õªƒ¸Õªƒ¸ØYV¸ØYV¸Vƒ¸Vƒ¸lU¸lU¸~�‚¸~�‚¸ oT¸ oT¸Œà�¸Œà�¸–bS¸–bS¸ž7�¸ž7�¸üFR¸üFR¸Ø†€¸Ø†€¸fQ¸fQ¸Ã›¸Ã›¸‡âO¸‡âO¸Ð~¸Ð~¸›N¸›N¸Ø‹|¸Ø‹|¸âEM¸âEM¸Díz¸Díz¸¢áK¸¢áK¸Ÿ?y¸Ÿ?y¸×oJ¸×oJ¸~„w¸~„w¸õñH¸õñH¸Ü¼u¸Ü¼u¸UhG¸UhG¸Nès¸Nès¸šÑE¸šÑE¸{r¸{r¸�-D¸�-D¸3p¸3p¸h}B¸h}B¸—n¸—n¸ÐÁ@¸ÐÁ@¸'l¸'l¸?û>¸?û>¸Èûi¸Èûi¸î(=¸î(=¸ëÚg¸ëÚg¸vK;¸vK;¸ ¯e¸ ¯e¸]e9¸]e9¸{c¸{c¸¯u7¸¯u7¸B;a¸B;a¸Ûz5¸Ûz5¸ð^¸ð^¸v3¸v3¸›\¸›\¸²h1¸²h1¸b=Z¸b=Z¸£S/¸£S/¸`×W¸`×W¸A6-¸A6-¸ßgU¸ßgU¸¬+¸¬+¸ïR¸ïR¸rá(¸rá(¸oP¸oP¸Ì¬&¸Ì¬&¸¶çM¸¶çM¸Üp$¸Üp$¸^XK¸^XK¸—-"¸—-"¸�ÁH¸�ÁH¸õã¸õã¸�$F¸�$F¸ì”¸ì”¸˜�C¸˜�C¸S@¸S@¸`Ø@¸`Ø@¸æå¸æå¸Z)>¸Z)>¸´†¸´†¸¹u;¸¹u;¸ë#¸ë#¸â½8¸â½8¸Á¼¸Á¼¸ 6¸ 6¸çP¸çP¸;?3¸;?3¸á ¸á ¸yy0¸yy0¸7n ¸7n ¸ë°-¸ë°-¸ù¸ù¸œå*¸œå*¸¦�¸¦�¸ê(¸ê(¸‹¸‹¸ŒH%¸ŒH%¸<ޏ<ޏ¸w"¸¸w"¸à%ü·à%ü·~¥¸~¥¸-÷·-÷·Ò¸Ò¸¥2ò·¥2ò·šý¸šý¸K7í·K7í·•(¸•(¸å;è·å;è·ÁS¸ÁS¸ÀAã·ÀAã·e¸e¸ÅIÞ·ÅIÞ·ÿ«¸ÿ«¸ÍTÙ·ÍTÙ·—Ú ¸—Ú ¸ÖdÔ·ÖdÔ·e ¸e ¸‚yÏ·‚yÏ·ë=¸ë=¸Y‘Ê·Y‘Ê·¿q¸¿q¸ ¬Å· ¬Å·C§¸C§¸„ÌÀ·„ÌÀ·¨Àû·¨Àû·çô»·çô»·ö9ö·ö9ö·È#··È#··)¹ð·)¹ð·žY²·žY²·(@ë·(@ë·Ž˜­·Ž˜­·Ñå·Ñå·ÌᨷÌᨷŠkà·Škà·4¤·4¤·û Û·û Û·,ŽŸ·,ŽŸ· ¹Õ· ¹Õ·�òš·�òš·‰oз‰oз»b–·»b–·1Ë·1Ë·IÝ‘·IÝ‘·þüÅ·þüÅ·c�·c�·GÕÀ·GÕÀ·Döˆ·Döˆ·o»»·o»»·_—„·_—„·„¯¶·„¯¶·'F€·'F€·ô°±·ô°±·x·x·¿¬·¿¬·Ú”o·Ú”o·…Û§·…Û§·yDg·yDg·/£·/£·i_·i_·Ž@ž·Ž@ž·ô÷V·ô÷V·þˆ™·þˆ™·“ÿN·“ÿN·Tâ”·Tâ”·Û(G·Û(G·éL�·éL�·t?·t?·…È‹·…È‹·÷ß7·÷ß7·oT‡·oT‡·l0·l0·Bñ‚·Bñ‚·Æ)·Æ)·f>}·f>}·¤è!·¤è!·{¼t·{¼t·|Ù·|Ù· ^l· ^l· í· í·Ê"d·Ê"d·# ·# ·´ \·´ \·ï|·ï|·’T·’T·ª÷ÿ¶ª÷ÿ¶ÖNL·ÖNL·õ=ó¶õ=󶋨D·‹¨D·ƒÌæ¶ƒÌæ¶Þ'=·Þ'=·Ë£Ú¶Ë£Ú¶çÌ5·çÌ5·™Åζ™Åζ½˜.·½˜.·Z0öZ0ör‰'·r‰'·ká·¶ká·¶�Ÿ ·�Ÿ ·Þ¬¶Þ¬¶ Þ· Þ·ò&¢¶ò&¢¶ÙB·ÙB·x·—¶x·—¶Í ·Í ·’�¶’�¶ · ·X¸ƒ¶X¸ƒ¶=X·=X·2Rt¶2Rt¶]°ô¶]°ô¶Èa¶Èa¶™ýè¶™ýè¶‚ÏO¶‚ÏO¶`˜Ý¶`˜Ý¶l>¶l>¶Û�Ò¶Û�Ò¶úž-¶úž-¶&¹Ç¶&¹Ç¶hb¶hb¶=½¶=½¶$· ¶$· ¶Ö ³¶Ö ³¶¬=ýµ¬=ýµ²,©¶²,©¶À0àµÀ0àµT˜Ÿ¶T˜Ÿ¶åAĵåAĵ/O–¶/O–¶Õn©µÕn©µ›R�¶›R�¶½�µ½�µ £„¶ £„¶{Pnµ{Pnµˆ{x¶ˆ{x¶PI?µPI?µJCh¶JCh¶ºaµºaµ°œX¶°œX¶r-Ï´r-Ï´š‡I¶š‡I¶U¦{´U¦{´T;¶T;¶Ý¢Â³Ý¢Â³ÿ-¶ÿ-¶ÒñB3ÒñB3c¬¶c¬¶’™:4’™:4³Ô¶³Ô¶°?ž4°?ž4!†¶!†¶ßKÛ4ßKÛ4=€õµ=€õµ†9 5†9 5QßµQßµ2ï$52ï$5ՃɵՃɵ0×=50×=5SµµSµµ†íT5†íT5)‹¡µ)‹¡µÝ3j5Ý3j5Š�µŠ�µ¸´}5¸´}5+{µ+{µX½‡5X½‡5�úYµ�úYµŽË�5ŽË�5ð³:µð³:µ. —5. —5 <µ <µò€�5ò€�5:ˆµ:ˆµ3£53£5 Ï´ Ï´š(¨5š(¨59xž´9xž´Žf¬5Žf¬5^Cb´^Cb´ˆï¯5ˆï¯5’´’´ÏȲ5ÏȲ5¥a€³¥a€³ïø´5ïø´5Ç'ó1Ç'ó1B‡¶5B‡¶5Ë“3Ë“3"z·5"z·5A³4A³4È×·5È×·5mb<4mb<4 §·5 §·5†Ëm4†Ëm4ûð¶5ûð¶5þ�4þ�4ï¹µ5ï¹µ5rÀ 4rÀ 4,´5,´5) ²4) ²4�Û±5�Û±5•Á4•Á4ÇA¯5ÇA¯5HÌÍ4HÌÍ4?¬5?¬5¢|Ø4¢|Ø42Û¨52Û¨5k/á4k/á4È¥5È¥5ÿç4ÿç4Œ ¡5Œ ¡5í4í4©«œ5©«œ5Í\ð4Í\ð4<˜5<˜5kò4kò4G“5G“5>Kò4>Kò4 û�5 û�5íñ4íñ4:¥ˆ5:¥ˆ5Å”î4Å”î4ó!ƒ5ó!ƒ5oÙê4oÙê4ïz5ïz5+ýå4+ýå4Yo5Yo5üà4üà4£�c5£�c5ÉLÙ4ÉLÙ4RŸW5RŸW56§Ñ46§Ñ4u“K5u“K5æBÉ4æBÉ4`y?5`y?5ö8À4ö8À4R]35R]35Óž¶4Óž¶4³J'5³J'5‹¬4‹¬4äL5äL5?¢4?¢4p5p5ÏP—4ÏP—4Â5Â5ˆ\Œ4ˆ\Œ4Š›ð4Š›ð4dI�4dI�4÷:Ú4÷:Ú4ÅXl4ÅXl4úyÄ4úyÄ4(9V4(9V4×o¯4×o¯4._@4._@4¤2›4¤2›4ô*4ô*4!ׇ4!ׇ4/4/4Fãj4Fãj4W4W4^0H4^0H4Õ¬Ý3Õ¬Ý3"¿'4"¿'4¡h¹3¡h¹3P¶ 4P¶ 4®Š—3®Š—3 {Ü3 {Ü3¾p3¾p3”÷ª3”÷ª3b]83b]83óY~3óY~3r€3r€3›Ç23›Ç23 `·2 `·2‹ç2‹ç2 Éa2 Éa2X½ƒ2X½ƒ2uTê1uTê1êÑì1êÑì1‚€+1‚€+1udï0udï0üàš/üàš/././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/BinauralDecoder/Source/EQ/Sennheiser-HD480.wavIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/BinauralDecoder/Source/EQ/Sennheiser0000664002537200253720000004013015257173642031443 0ustar zmoelnigzmoelnigRIFFP@WAVEfmt €»Ü factPEAKác Y•oI?•oI?data@•oI?•oI?-¼@¾-¼@¾¢“½¢“½éÏ@½éÏ@½×¬†¾×¬†¾¡t¾¡t¾gbؤg8>èÅž=èÅž=P®9=P®9=Ì;Ì;Œ×Ú¼Œ×Ú¼@Dí½@Dí½ë~¥½ë~¥½ñÛ»ñÛ»ì;ëºì;뺕¼•¼g=g=âÑ»=âÑ»=ØË=ØË=KOϼKOϼÙÚ?½ÙÚ?½p`½p`½)<½)<½ ˜‹» ˜‹»D¼=D¼=A±ò‚û:>‚û:\";\";NEú:NEú:d@;d@;Õ;Õ;¾²';¾²';5k;5k;#�$;#�$;ØY;ØY;|;|;%Œü:%Œü:ºÁ;ºÁ;XÇ;XÇ;†“ ;†“ ;Y;Y;!";!";½þ;½þ;_{;_{;ðü;ðü;ZX;ZX;ŽW;ŽW;3™;3™;¨š;¨š;¤;¤;Ì;Ì;;;ÜÙ;ÜÙ;ê›;ê›;2Ô;2Ô;%9;%9;EP;EP;”;”;Ð×;Ð×;1¾;1¾;ó~;ó~;Nñ;Nñ; ; ;²;²;A€;A€;x;x;¤;¤;”,;”,;%Ñ;%Ñ;G;G;;;#©;#©;Éfû:Éfû:Zí;Zí;Oaý:Oaý:¶`;¶`; #ÿ: #ÿ:fk;fk;N“ý:N“ý: ; ;ÒGû:ÒGû:k�;k�;Öú:Öú:~z;~z; kû: kû:NÕ;NÕ; aû: aû:cF;cF;~Uù:~Uù:XÚ;XÚ;n˜ö:n˜ö: B; B;e÷:e÷:ŸÜ;ŸÜ;j}÷:j}÷:Ýu;Ýu;¥ö:¥ö:Çý;Çý;~‡õ:~‡õ:ê\;ê\;*éó:*éó:BU;BU;Ê4ò:Ê4ò:;ñ;;ñ;výñ:výñ:¶Ç;¶Ç;íkñ:íkñ:ƒG;ƒG;Äëï:Äëï:�‡;�‡;°ï:°ï:/L;/L;Rqî:Rqî:ŠÍ;ŠÍ;±@í:±@í:Ä?;Ä?;iÈì:iÈì:å=;å=;³[ì:³[ì:V¢;V¢;íòê:íòê:³;³;»Sê:»Sê:pô;pô;S7ê:S7ê:¢Ì;¢Ì;Z¬é:Z¬é:·};·};.é:.é:ð7;ð7;ð^è:ð^è:ô­ ;ô­ ;¡eç:¡eç:^ ;^ ;Ã1ç:Ã1ç:Ýa ;Ýa ;Ü*ç:Ü*ç:" ;" ;“:æ:“:æ:Q¦ ;Q¦ ;lxå:lxå:I. ;I. ;ÃLä:ÃLä:¤¯ ;¤¯ ;h¸ã:h¸ã:�y ;�y ;=iã:=iã:AL ;AL ;9¬â:9¬â:± ;± ;ìmá:ìmá:å% ;å% ;¶sà:¶sà:"± ;"± ;R¯ß:R¯ß:¢Q ;¢Q ;úÞ:úÞ:è ;è ;>›Þ:>›Þ:Â;Â;™Ý:™Ý:););£4Ü:£4Ü:ex;ex;ÔYÛ:ÔYÛ:ñ1;ñ1;ºóÚ:ºóÚ:ßâ;ßâ;ü Ú:ü Ú:åh;åh;ýGÙ:ýGÙ:H;H;{IØ:{IØ:©x;©x;¸P×:¸P×:Z;Z;8‚Ö:8‚Ö:R«;R«;éËÕ:éËÕ:Ï.;Ï.;·ÇÔ:·ÇÔ:к;к;^óÓ:^óÓ:†J;†J;ðÓ:ðÓ:+Î;+Î;ÈøÑ:ÈøÑ:a8;a8;ÃêÐ:ÃêÐ:•»;•»;ûøÏ:ûøÏ:Ð=;Ð=;Ï:Ï:`¾;`¾;ÄöÍ:ÄöÍ:¦-;¦-;ÈÌ:ÈÌ:«ÿ:«ÿ:“nË:“nË:HÔý:HÔý:GmÊ:GmÊ:0Ãü:0Ãü:Ç5É:Ç5É:rû:rû:ÀçÇ:ÀçÇ:ÿú:ÿú: †Æ: †Æ:Ô¼ø:Ô¼ø:„EÅ:„EÅ:{÷:{÷:;Ä:;Ä:@Oö:@Oö:ÉÝÂ:ÉÝÂ:©ìô:©ìô:ÅTÁ:ÅTÁ:¤Ió:¤Ió:­³¿:­³¿:˜»ñ:˜»ñ:’[¾:’[¾:õ†ð:õ†ð:N,½:N,½:®?ï:®?ï:£Ü»:£Ü»:D×í:D×í:zYº:zYº:¢Bì:¢Bì:.и:.и:ä¶ê:ä¶ê:¥P·:¥P·:–Lé:–Lé:Sÿµ:Sÿµ:©ýç:©ýç:S¿´:S¿´:¹æ:¹æ:_³:_³:×,å:×,å:Ìα:Ìα:™¬ã:™¬ã:vm°:vm°:“Yâ:“Yâ:œ)¯:œ)¯: á: á:Uð­:Uð­:W×ß:W×ß:™£¬:™£¬:«lÞ:«lÞ:G/«:G/«:WôÜ:WôÜ:üÅ©:üÅ©:F�Û:F�Û:ù‘¨:ù‘¨:ñyÚ:ñyÚ:«u§:«u§:„JÙ:„JÙ:•5¦:•5¦:]ù×:]ù×:Uæ¤:Uæ¤: ¥Ö: ¥Ö:U›£:U›£:M_Õ:M_Õ:Ú`¢:Ú`¢:¸)Ô:¸)Ô:îA¡:îA¡:þÓ:þÓ:# :# :›áÑ:›áÑ:køž:køž:ȯÐ:ȯÐ:½Ç�:½Ç�:ýƒÏ:ýƒÏ:x©œ:x©œ:¡VÎ:¡VÎ:gs›:gs›:Ï#Í:Ï#Í:€Yš:€Yš:¼Ì:¼Ì:¾U™:¾U™:—Ë:—Ë:5<˜:5<˜:[ÝÉ:[ÝÉ:ÿ—:ÿ—:¿¿È:¿¿È:¶þ•:¶þ•:Ž—Ç:Ž—Ç:Êß”:Êß”:%†Æ:%†Æ:ã“:ã“:͈Å:͈Å:–ä’:–ä’:l{Ä:l{Ä:&Α:&Α:€WÃ:€WÃ:´�:´�:¾EÂ:¾EÂ:¸¬�:¸¬�:€<Á:€<Á:4­Ž:4­Ž:X7À:X7À:½¥�:½¥�:î*¿:î*¿:ñ�Œ:ñ�Œ:c¾:c¾:þ†‹:þ†‹:/½:/½: ‡Š: ‡Š:B¼:B¼:.†‰:.†‰:�ùº:�ùº:—{ˆ:—{ˆ:³ß¹:³ß¹:Ûa‡:Ûa‡:BǸ:BǸ:”Q†:”Q†:°·:°·:×A…:×A…:�§¶:�§¶:ŽG„:ŽG„:¿©µ:¿©µ:eFƒ:eFƒ:1”´:1”´:é!‚:é!‚:%a³:%a³:Àù€:Àù€:¾A²:¾A²:aÊ:aÊ:“)±:“)±:�§}:�§}:Ò°:Ò°:‚�{:‚�{:¯:¯:._y:._y:|Ö­:|Ö­:nîv:nîv:_š¬:_š¬: ™t: ™t:ñv«:ñv«:—`r:—`r:CTª:CTª:±p:±p:<%©:<%©:—»m:—»m:Òò§:Òò§:ï^k:ï^k:²¸¦:²¸¦: îh: îh:‚�¥:‚�¥:êŽf:êŽf:sL¤:sL¤:i/d:i/d:ÿ£:ÿ£:gÁa:gÁa:LÕ¡:LÕ¡:KC_:KC_:V“ :V“ :_Å\:_Å\:�NŸ:�NŸ:pDZ:pDZ:& ž:& ž:ìËW:ìËW:ƒÎœ:ƒÎœ:‡YU:‡YU:N‰›:N‰›:HÎR:HÎR:¾>š:¾>š:w@P:w@P:4ñ˜:4ñ˜:‚¨M:‚¨M:.Ÿ—:.Ÿ—:pK:pK:T–:T–:N�H:N�H:Ç•:Ç•:oF:oF:[Ï“:[Ï“:‰C:‰C:H~’:H~’:©î@:©î@:.‘:.‘:’Z>:’Z>:Eà�:Eà�:¦Ç;:¦Ç;:G–Ž:G–Ž: K9: K9:œW�:œW�:«Ð6:«Ð6:ÒŒ:ÒŒ:½=4:½=4:qÀŠ:qÀŠ:E³1:E³1:¥~‰:¥~‰:ƒ=ˆ:>=ˆ:rÁ,:rÁ,:¯ú†:¯ú†:T@*:T@*:«¶…:«¶…:¸È':¸È':Ïv„:Ïv„:RL%:RL%:6ƒ:6ƒ:ÃÞ":ÃÞ":¤þ�:¤þ�:¾x :¾x :yÅ€:yÅ€: : :»:»:$�:$�:Ü¢|:Ü¢|:8<:8<:¨:Kå>:´8¹9´8¹9ÍÜ<:ÍÜ<:¬)µ9¬)µ9-É::-É::V±9V±9§·8:§·8:]­9]­9ܧ6:ܧ6:Ïó¨9Ïó¨9I”4:I”4:Îà¤9Îà¤90‰2:0‰2:ÎÝ 9ÎÝ 9\z0:\z0:°Éœ9°Éœ9ëg.:ëg.:η˜9η˜9ÕY,:ÕY,:N´”9N´”9ûO*:ûO*:ë¨�9ë¨�9j>(:j>(:Ÿ”Œ9Ÿ”Œ9l,&:l,&:Ù€ˆ9Ù€ˆ9<$:<$:Àk„9Àk„9( ":( ":Xh€9Xh€9© :© :ù×x9ù×x9ù:ù:$²p9$²p9ôá:ôá:"sh9"sh9©Ì:©Ì:®Q`9®Q`9¯À:¯À:THX9THX9ô´:ô´:¸9P9¸9P9ø©:ø©:”)H9”)H9L›:L›:H @9H @9d‹:d‹:0ì790ì79?~ :?~ : ë/9 ë/9Xv :Xv :7à'97à'9‚i :‚i :WÍ9WÍ9Í^:Í^:�Ò9�Ò9úX:úX:#Ï9#Ï9dN:dN:øÐ9øÐ9=J:=J:Éÿ8Éÿ8ߌþ9ߌþ9±êï8±êï8t†ú9t†ú9à8à8k†ö9k†ö9ógÐ8ógÐ8G‡ò9G‡ò9#œÀ8#œÀ8Æ…î9Æ…î9¿ø°8¿ø°8•ê9•ê9—†¡8—†¡8iªæ9iªæ9’8’8R¾â9R¾â9™¯‚8™¯‚8DÚÞ9DÚÞ9©g8©g8æþÚ9æþÚ9¹�H8¹�H8$×9$×9 ‡*8 ‡*81[Ó91[Ó9�ì 8�ì 8þ˜Ï9þ˜Ï9yrÞ7yrÞ7nÎË9nÎË9%ø¢7%ø¢7uÈ9uÈ9àQ7àQ7�]Ä9�]Ä9\P»6\P»6f¹À9f¹À9„U£µ„U£µ~½9~½9S ·S ·Q‰¹9Q‰¹9‚|v·‚|v·éµ9éµ9+ú³·+ú³·eW²9eW²9‹bë·‹bë·HÜ®9HÜ®9‰Ç¸‰Ç¸Ùl«9Ùl«9ö»+¸ö»+¸.¨9.¨9Ç F¸Ç F¸N‘¤9N‘¤9ö“a¸ö“a¸h*¡9h*¡9?ù{¸?ù{¸×�9×�9­ìЏ­ìЏ5‘š95‘š9¾—¸¾—¸žI—9žI—9j¢¤¸j¢¤¸ ”9 ”9cS±¸cS±¸Î�9Î�9Z彸Z彸™¡�9™¡�9%=ʸ%=ʸw€Š9w€Š9FqÖ¸FqÖ¸Žc‡9Žc‡9û½â¸û½â¸ø?„9ø?„9ãâî¸ãâî¸3�93�9MÁú¸MÁú¸Â]|9Â]|9ÓC¹ÓC¹ç]v9ç]v9T ¹T ¹3np93np9jè¹jè¹R…j9R…j9Ʊ¹Æ±¹ž¢d9ž¢d9El¹El¹âÔ^9âÔ^9ï ¹ï ¹íY9íY9À¤%¹À¤%¹jeS9jeS99+¹9+¹!»M9!»M9¬¾0¹¬¾0¹¦H9¦H9ú<6¹ú<6¹Í„B9Í„B9Ê©;¹Ê©;¹¿ý<9¿ý<9’ A¹’ A¹“‡79“‡79ó]F¹ó]F¹P29P29G±K¹G±K¹ü£,9ü£,9ðÿP¹ðÿP¹Â>'9Â>'9®Î4>Î4Ô¼¹Ô¼¹‰V¶‰V¶"Ó½¹"Ó½¹‚Éá¶‚Éá¶ûœ¿¹ûœ¿¹²f+·²f+·×ZÁ¹×ZÁ¹³Ld·³Ld·3ù3ù(OŽ·(OŽ·æÀĹæÀĹÿ©·ÿ©·XiƹXiƹFÅ·FÅ·ŒȹŒȹ¹ß·¹ß·JžÉ¹JžÉ¹2¦ù·2¦ù·*˹*˹Ș ¸È˜ ¸U²Ì¹U²Ì¹oC¸oC¸8ι8ι1Å"¸1Å"¸±Ï¹±Ï¹uÂ.¸uÂ.¸ÙѹÙѹ–„:¸–„:¸«ƒÒ¹«ƒÒ¹Œ F¸Œ F¸GãÓ¹GãÓ¹9mQ¸9mQ¸Õ?Õ¹Õ?Õ¹ »\¸ »\¸•—Ö¹•—Ö¹u¾g¸u¾g¸•â×¹•â×¹œ[r¸œ[r¸Ò#Ù¹Ò#Ù¹ð¿|¸ð¿|¸Í^Ú¹Í^Ú¹a}ƒ¸a}ƒ¸œ•Û¹œ•Û¹P†ˆ¸P†ˆ¸&Çܹ&Çܹ¥€�¸¥€�¸ÞóݹÞóݹ‘U’¸‘U’¸Ìß¹Ìß¹H—¸H—¸m-à¹m-à¹@“›¸@“›¸=Bá¹=Bá¹× ¸× ¸ØOâ¹ØOâ¹z¤¸z¤¸#Zã¹#Zã¹3Ò¨¸3Ò¨¸ö\ä¹ö\ä¹P­¸P­¸ Uå¹ U幸±¸¸±¸ÁHæ¹ÁHæ¹�µ¸�µ¸9ç¹9ç¹ìÿ¸¸ìÿ¸¸#è¹#è¹$μ¸$μ¸‡鹇鹄À¸„À¸¼áé¹¼áé¹�#ĸ�#ĸ÷¶ê¹÷¶ê¹h¤Ç¸h¤Ç¸¿‡ë¹¿‡ë¹¤˸¤˸„U칄Uì¹Ã~θÃ~θ�í¹�í¹¾Ñ¸¾Ñ¸$Úí¹$Úí¹yêÔ¸yêÔ¸•••î¹ظظˆJ﹈Jï¹­Û¸­Û¸„ú﹄úï¹*öݸ*öݸh¦ð¹h¦ð¹jÑà¸jÑà¸ÄJñ¹ÄJñ¹ Šã¸ Šã¸Žèñ¹Žèñ¹5æ¸5æ¸Èƒò¹Èƒò¹Ñè¸Ñ踺ó¹ºó¹@]ë¸@]ë¸q­ó¹q­ó¹ÝÔí¸ÝÔí¸ú9ô¹ú9ô¹ï,ð¸ï,ð¸¾ô¹¾ô¹pò¸pò¸VAõ¹VAõ¹è¯ô¸è¯ô¸WÀõ¹WÀõ¹ Øö¸ Øö¸–9ö¹–9ö¹Øäø¸Øäø¸~«ö¹~«ö¹ Ýú¸ Ýú¸ï÷¹ï÷¹NÃü¸NÃü¸ãƒ÷¹ãƒ÷¹” þ¸” þ¸4ì÷¹4ì÷¹+7¹+7¹iNø¹iNø¹=¹=¹e¨ø¹e¨ø¹l×¹l×¹½üø¹½üø¹ ›¹ ›¹ Pù¹ Pù¹;[¹;[¹€ ù¹€ ù¹í¹í¹´êù¹´êù¹Z»¹Z»¹?0ú¹?0ú¹ú\¹ú\¹¯oú¹¯oú¹|ð¹|ð¹-ªú¹-ªú¹~¹~¹áú¹áú¹&¹&¹eû¹eû¹x¹x¹áAû¹áAû¹¢ò¹¢ò¹¡lû¹¡lû¹e]¹e]¹m‘û¹m‘û¹×½¹×½¹8±û¹8±û¹] ¹] ¹Ëû¹Ëû¹Å\ ¹Å\ ¹'áû¹'áû¹°Ÿ ¹°Ÿ ¹›óû¹›óû¹‰Ü ¹‰Ü ¹<ü¹<ü¹M ¹M ¹ú ü¹ú ü¹Š9 ¹Š9 ¹§ü¹§ü¹jV ¹jV ¹­ü¹­ü¹i ¹i ¹ßü¹ßü¹>u ¹>u ¹#ü¹#ü¹$z ¹$z ¹oòû¹oòû¹ u ¹ u ¹¹àû¹¹àû¹%f ¹%f ¹UÈû¹UÈû¹½K ¹½K ¹¯¬û¹¯¬û¹n+ ¹n+ ¹�û¹�û¹ ¹ ¹Žhû¹Žhû¹"Ï ¹"Ï ¹:@û¹:@û¹s• ¹s• ¹Çû¹Çû¹dR ¹dR ¹.ãú¹.ãú¹¡ ¹¡ ¹i®ú¹i®ú¹”´¹”´¹öuú¹öuú¹©Y¹©Y¹ø8ú¹ø8ú¹cö¹cö¹,ùù¹,ùù¹õ޹õ޹{¶ù¹{¶ù¹¹¹­mù¹­mù¹ ¡¹ ¡¹† ù¹† ù¹Þ¹Þ¹vÒø¹vÒø¹ƒ›¹ƒ›¹?�ø¹?�ø¹'¹'¹+ø¹+ø¹Èw¹Èw¹7Ñ÷¹7Ñ÷¹FÚ¹FÚ¹Xs÷¹Xs÷¹È4¹È4¹~÷¹~÷¹ý‹¹ý‹¹Ö°ö¹Ö°ö¹Jà¹Jà¹UKö¹UKö¹…'¹…'¹ ßõ¹ ßõ¹Af¹Af¹õpõ¹õpõ¹5Cÿ¸5Cÿ¸põ¹põ¹±ý¸±ý¸XŽô¹XŽô¹¿ü¸¿ü¸ ô¹ ô¹1mú¸1mú¸RŸó¹RŸó¹2­ø¸2­ø¸‘ ó¹‘ ó¹¿âö¸¿âö¸æ ò¹æ ò¹ªõ¸ªõ¸? ò¹? ò¹\?ó¸\?󸮛ñ¹®›ñ¹0Zñ¸0Zñ¸±ñ¹±ñ¹iï¸iï¸2‰ð¹2‰ð¹:gí¸:gí¸Xûï¹Xûï¹;`ë¸;`ë¸Elï¹Elï¹°R鸰R鸈ÚÚî¹í4ç¸í4縰Dî¹°Dî¹T å¸T å¸­í¹­í¹×Úâ¸×Úâ¸Ìí¹Ìí¹l à¸l à¸ðvì¹ðvì¹_Þ¸_Þ¸ÑØë¹ÑØë¹ÜܸÜܸ½7ë¹½7ë¹y·Ù¸y·Ù¸v’ê¹v’ê¹ØS׸ØS׸àìé¹àìé¹ëêÔ¸ëêÔ¸@Eé¹@Eé¹;{Ò¸;{Ò¸ª›è¹ª›è¹JиJиƒð繃ðç¹0ƒÍ¸0ƒÍ¸eBç¹eBç¹!õʸ!õʸV‘æ¹V‘æ¹É]ȸÉ]ȸ4Þå¹4Þå¹&ÁŸ&ÁŸ*å¹*å¹ÖøÖøºs乺sä¹tÀ¸tÀ¸½ã¹½ã¹„ޏ„ޏKã¹Kã¹ï»¸ï»¸žF⹞Fâ¹åC¸¸åC¸¸Åˆá¹Åˆá¹„|µ¸„|µ¸ÉÉà¹ÉÉà¹F«²¸F«²¸|à¹|à¹Sׯ¸Sׯ¸æFß¹æFß¹oû¬¸oû¬¸‚Þ¹‚Þ¹½ª¸½ª¸¦ºÝ¹¦ºÝ¹%§¸%§¸¥óܹ¥óܹy8¤¸y8¤¸í*ܹí*ܹ�?¡¸�?¡¸v_Û¹v_Û¹=ž¸=ž¸„‘Ú¹„‘Ú¹ 2›¸ 2›¸+ÂÙ¹+ÂÙ¹®"˜¸®"˜¸òعòعÍ•¸Í•¸>!ع>!عù‘¸ù‘¸pM×¹pM×¹AÓŽ¸AÓŽ¸™vÖ¹™vֹ㣋¸ã£‹¸�žÕ¹�žÕ¹tˆ¸tˆ¸œÆÔ¹œÆÔ¹ÏA…¸ÏA…¸|íÓ¹|íÓ¹ô‚¸ô‚¸Ó¹Ó¹"‰}¸"‰}¸½3Ò¹½3Ò¹Iív¸Iív¸ðSѹðSѹ Mp¸ Mp¸tйtйê©i¸ê©i¸K“ϹK“Ϲ‘ûb¸‘ûb¸Ë°Î¹Ë°Î¹�=\¸�=\¸jÌ͹jÌ͹qqU¸qqU¸(æÌ¹(æÌ¹m•N¸m•N¸|þ˹|þ˹ͶG¸Í¶G¸W˹W˹§Ù@¸§Ù@¸'/ʹ'/ʹí9¸í9¸)Eɹ)EɹØõ2¸Øõ2¸ZȹZȹñ+¸ñ+¸ lǹ lǹ\Þ$¸\Þ$¸Ñ~ƹÑ~ƹ‘̸‘̸ï�Źï�Ź´¹¸´¹¸ ¢Ä¹ ¢Ä¹¾š¸¾š¸²Ã¹²Ã¹:l¸:l¸À¹À¹T4¸T4¸¶ÍÁ¹¶ÍÁ¹zûó·zûó·ÙÚÀ¹ÙÚÀ¹€wå·€wå·äæ¿¹äæ¿¹ßëÖ·ßëÖ·"ò¾¹"ò¾¹ñJÈ·ñJÈ·ü½¹ü½¹ –¹· –¹·î½¹î½¹ÎÖª·ÎÖª·« ¼¹« ¼¹Àœ·Àœ·$»¹$»¹ÈJ�·ÈJ�·[º¹[º¹EÔ|·EÔ|·—#¹¹—#¹¹›ø^·›ø^· )¸¹ )¸¹%û@·%û@·l-·¹l-·¹4ó"·4ó"·42¶¹42¶¹Xä·Xä·Ü5µ¹Ü5µ¹®pͶ®pͶû8´¹û8´¹¤Ç�¶¤Ç�¶™:³¹™:³¹(¶(¶w<²¹w<²¹åo9µåo9µï=±¹ï=±¹©¼–5©¼–5å>°¹å>°¹+«E6+«E6Û>¯¹Û>¯¹¤, 6¤, 6 >®¹ >®¹JžÝ6JžÝ6´=­¹´=­¹ÿp 7ÿp 7R=¬¹R=¬¹®.,7®.,7)<«¹)<«¹RùJ7RùJ7‹:ª¹‹:ª¹]Üi7]Üi7!8©¹!8©¹ºl„7ºl„75¨¹5¨¹µé“7µé“7ë2§¹ë2§¹]£7]£7¡0¦¹¡0¦¹ײ7ײ7½-¥¹½-¥¹q`Â7q`Â7B*¤¹B*¤¹ÓèÑ7ÓèÑ7w&£¹w&£¹í†á7í†á7‘!¢¹‘!¢¹ ñ7 ñ7᡹᡹¸T8¸T8” ¹” ¹»8»8ÇŸ¹ÇŸ¹jó8jó8xž¹xž¹NÆ8NÆ8 �¹ �¹˜˜8˜˜8»œ¹»œ¹²g'8²g'8z›¹z›¹4/84/8ñý™¹ñý™¹á 78á 78¬÷˜¹¬÷˜¹´é>8´é>8»ñ—¹»ñ—¹Ì¿F8Ì¿F8햹햹 �N8 �N8ˆè•¹ˆè•¹"`V8"`V8Ð㔹Ð㔹£3^8£3^8’Þ“¹’Þ“¹ f8 f8 Ù’¹ Ù’¹Ýâm8Ýâm8<Ô‘¹<Ô‘¹Ã²u8òu8Ð�¹Ð�¹ä€}8ä€}8ÏË�¹ÏË�¹B¨‚8B¨‚8•ÇŽ¹•ÇŽ¹ª�†8ª�†8UÃ�¹UÃ�¹–wŠ8–wŠ8¿Œ¹¿Œ¹ø^Ž8ø^Ž8;»‹¹;»‹¹ÍC’8ÍC’8é·Š¹é·Š¹Þ(–8Þ(–83´‰¹3´‰¹hš8hš8󰈹󰈹Âð�8Âð�8›®‡¹›®‡¹aÑ¡8aÑ¡8᫆¹á«†¹6´¥86´¥8N©…¹N©…¹ƒ•©8ƒ•©8¹¦„¹¹¦„¹›w­8›w­86¤ƒ¹6¤ƒ¹æW±8æW±8Ô¢‚¹Ô¢‚¹h2µ8h2µ8¢�¹¢�¹7¹87¹8œ €¹œ €¹Üì¼8Üì¼8«>¹«>¹)ÉÀ8)ÉÀ8)=}¹)=}¹£Ä8£Ä8B<{¹B<{¹¥|È8¥|È8¨u¹ >u¹oÔ8oÔ8@s¹@s¹FÔ×8FÔ×8ÍBq¹ÍBq¹V§Û8V§Û8ˆEo¹ˆEo¹Ïyß8Ïyß8ËIm¹ËIm¹ÛHã8ÛHã8ÐNk¹ÐNk¹òç8òç8ñTi¹ñTi¹„ãê8„ãê8P[g¹P[g¹ž®î8ž®î8àbe¹àbe¹âxò8âxò8˜jc¹˜jc¹Aö8Aö86ta¹6ta¹yú8yú8­_¹­_¹-Çý8-Çý8]‹]¹]‹]¹æÄ9æÄ9Ù—[¹Ù—[¹¼£9¼£9½¦Y¹½¦Y¹£�9£�9h¶W¹h¶W¹É]9É]9öÇU¹öÇU¹ÿ89ÿ89MÚS¹MÚS¹ 9 9ÐíQ¹ÐíQ¹íë 9íë 9ZP¹ZP¹t 9t 9®N¹®N¹’—9’—9²3L¹²3L¹Kk9Kk9·MJ¹·MJ¹Ì=9Ì=9;iH¹;iH¹<9<9†F¹†F¹6Þ96Þ9Ô¥D¹Ô¥D¹c«9c«9‘ÆB¹‘ÆB¹†w9†w9§è@¹§è@¹4B94B9Ì ?¹Ì ?¹P 9P 9:3=¹:3=¹ÏÐ9ÏÐ9^[;¹^[;¹»•!9»•!9m„9¹m„9¹ËY#9ËY#9Z¯7¹Z¯7¹—%9—%9CÜ5¹CÜ5¹gÛ&9gÛ&9å 4¹å 4¹,˜(9,˜(9>2¹>2¹¨S*9¨S*9�p0¹�p0¹ê,9ê,9í£.¹í£.¹¥È-9¥È-9¤Ù,¹¤Ù,¹ˆ/9ˆ/9a+¹a+¹º319º319TM)¹TM)¹=æ29=æ29º‰'¹º‰'¹„—49„—49Ç%¹Ç%¹=H69=H69d$¹d$¹ñö79ñö79ÊF"¹ÊF"¹D¢99D¢99c‹ ¹c‹ ¹OK;9OK;9ѹѹÍó<9Íó<9ʹʹòš>9òš>95`¹5`¹í?@9í?@9ûª¹ûª¹äâA9äâA9÷÷¹÷÷¹<ƒC9<ƒC9bG¹bG¹Ù!E9Ù!E9x˜¹x˜¹Æ¾F9ƾF9>ë¹>빜YH9œYH9·@¹·@¹#òI9#òI9헹헹ëˆK9ëˆK96ñ ¹6ñ ¹©M9©M9¿L ¹¿L ¹ý¯N9ý¯N9›ª ¹›ª ¹+@P9+@P9î ¹î ¹³ÍQ9³ÍQ9Ñm¹Ñm¹YS9YS9³Ò¹³Ò¹-âT9-âT9�:¹�:¹KhV9KhV9椹椹†ìW9†ìW9®¹®¹oY9oY9¨ýþ¸¨ýþ¸®îZ9®îZ9Øáû¸Øáû¸ìj\9ìj\9BËø¸BËø¸ˆä]9ˆä]9‰¹õ¸‰¹õ¸æ[_9æ[_9ª¬ò¸ª¬ò¸WÑ`9WÑ`9`¢ï¸`¢ï¸óDb9óDb9pŸì¸pŸì¸ç³c9ç³c9¹¤é¸¹¤é¸öe9öe9P®æ¸P®æ¸SŠf9SŠf9¶»ã¸¶»ã¸òg9òg9kÏà¸kÏà¸÷Vi9÷Vi9ŽèݸŽèݸý¸j9ý¸j9íÛ¸íÛ¸ l9 l9c-ظc-ظïsm9ïsm9"XÕ¸"XÕ¸<În9<În9ɆҸɆҸ2%p92%p9f½Ï¸f½Ï¸ºxq9ºxq9bú̸bú̸;Ér9;Ér9¹<ʸ¹<ʸ=t9=t9ý„Ǹý„ǸTbu9Tbu9¸Ñĸ¸Ñĸ„«v9„«v9E$¸E$¸áðw9áðw9 ~¿¸ ~¿¸¢2y9¢2y9õß¼¸õß¼¸�qz9�qz9íEº¸íEº¸þ­{9þ­{9̱·¸Ì±·¸Ãç|9Ãç|9Š"µ¸Š"µ¸Å~9Å~9Uš²¸Uš²¸×Q9×Q9&°¸&°¸Ñ@€9Ñ@€9až­¸až­¸Ó×€9Ó×€9((«¸((«¸ m�9 m�9y¸¨¸y¸¨¸ý‚9ý‚9?N¦¸?N¦¸N“‚9N“‚9e룸e룸Ë#ƒ9Ë#ƒ9Œ�¡¸Œ�¡¸Á²ƒ9Á²ƒ9û8Ÿ¸û8Ÿ¸‡@„9‡@„9ë眸ë眸·Ì„9·Ì„9£�š¸£�š¸EW…9EW…9øY˜¸øY˜¸8à…98à…9Ô–¸Ô–¸lg†9lg†9!瓸!瓸í†9í†9(¶‘¸(¶‘¸™q‡9™q‡9‹�¸‹�¸`ô‡9`ô‡9Ýg�¸Ýg�¸8uˆ98uˆ9�K‹¸�K‹¸‹ôˆ9‹ôˆ9�5‰¸�5‰¸_r‰9_r‰9ó$‡¸ó$‡¸ãî‰9ãî‰9'…¸'…¸ñiŠ9ñiŠ9>ƒ¸>ƒ¸ØâŠ9ØâŠ9u�¸u�¸îY‹9îY‹9”L~¸”L~¸ÎÏ‹9ÎÏ‹9nlz¸nlz¸9½¡>94²Û·4²Û·Lˆ<9Lˆ<9øuÜ·øuÜ·bm:9bm:9Ý6Ý·Ý6Ý·eQ89eQ89¬óÝ·¬óÝ·f469f469n«Þ·n«Þ·…49…49Á_ß·Á_ß·À÷19À÷195à·5à·=Ø/9=Ø/9¿ºà·¿ºà·¸-9¸-9`á·`á·¯—+9¯—+9dþá·dþá·w)9w)96–â·6–â·1V'91V'9Y(ã·Y(ã·5%95%9ž´ã·ž´ã·#9#999ä·99ä·7ó 97ó 9õ´ä·õ´ä·áÒ9áÒ9Ê'å·Ê'å·³9³9`’å·`’å·Ž“9Ž“9ßõå·ßõå·“t9“t9Qæ·Qæ·iV9iV9¢æ·¢æ·@99@99>èæ·>èæ·Q9Q9Y#ç·Y#ç·n9n9ýUç·ýUç·—è 9—è 9ç·ç·Ð 9Ð 9p�ç·p�ç· ¹ 9 ¹ 9 ¯ç· ¯ç·Ó£9Ó£9†´ç·†´ç·F�9F�9i¯ç·i¯ç·j~9j~9ªžç·ªžç·on9on9f‚ç·f‚ç·îÀþ8îÀþ8§Xç·§Xç·œ©ú8œ©ú8·!ç··!ç·«–ö8«–ö8ÐÞæ·ÐÞæ·&ˆò8&ˆò8M�æ·M�æ·¶~î8¶~î8[1æ·[1æ·ozê8ozê8–Æå·–Æå·K{æ8K{æ8zNå·zNå·ª�â8ª�â8õÇä·õÇä·Ü�Þ8Ü�Þ8D4ä·D4ä·vŸÚ8vŸÚ8v“ã·v“ã·W·Ö8W·Ö8(ãâ·(ãâ·“ÕÒ8“ÕÒ8}$â·}$â·HúÎ8HúÎ8oWá·oWá·}%Ë8}%Ë89|à·9|à·RWÇ8RWÇ8Ÿ“ß·Ÿ“ß·Û�Ã8Û�Ã80œÞ·0œÞ·¨Ï¿8¨Ï¿8œ•Ý·œ•Ý·î¼8î¼8AÜ·AÜ·–e¸8–e¸8ˆ[Û·ˆ[Û·�»´8�»´8g)Ú·g)Ú·±8±8%騷%騷‰~­8‰~­8Ÿ™×·Ÿ™×·ì©8ì©8¤:Ö·¤:Ö·b¦8b¦8\ÍÔ·\ÍÔ·åߢ8åߢ8ARÓ·ARÓ·)fŸ8)fŸ8iÈÑ·iÈÑ·õ›8õ›8'0з'0зwŒ˜8wŒ˜8¡‰Î·¡‰Î·Á,•8Á,•8DÔÌ·DÔÌ·Ö‘8Ö‘8~Ë·~Ë·ó‡Ž8ó‡Ž8CAÉ·CAÉ·C‹8C‹8‘bÇ·‘bÇ·Œˆ8Œˆ8AvÅ·AvÅ·"Õ„8"Õ„8"}÷"}÷¬�8¬�8KvÁ·KvÁ·}8}8ec¿·ec¿·}ìv8}ìv8 D½· D½·:Óp8:Óp8”»·”»·ªÍj8ªÍj8ÍÞ¸·ÍÞ¸·WÛd8WÛd8¯š¶·¯š¶·]ü^8]ü^8/K´·/K´·1Y81Y8fð±·fð±·�yS8�yS8ôН·ôН·ÔÕM8ÔÕM8s­·s­·VFH8VFH8ŽŸª·ŽŸª·ÆÊB8ÆÊB8.¨·.¨·c=8c=8Ÿ�¥·Ÿ�¥·†88†88÷¢·÷¢·Ð28Ð28´W ·´W ·$¥-8$¥-8m¯�·m¯�·®Ž(8®Ž(8Sÿš·Sÿš·bŒ#8bŒ#8 H˜· H˜·`ž8`ž8lj•·Ç‰•·»Ä8»Ä8áÄ’·áÄ’·”ÿ8”ÿ8qù�·qù�· O8 O8ù'�·ù'�·ò² 8ò² 8‡QŠ·‡QŠ· +8 +8{v‡·{v‡·©·8©·8•–„·•–„·Ê±ü7ʱü7ƒ²�·ƒ²�·Eô7Eô7³•}·³•}·�±ë7�±ë7~Àw·~Àw·lnã7lnã7äæq·äæq·µSÛ7µSÛ7ðl·ðl·*bÓ7*bÓ7¢&f·¢&f· ™Ë7 ™Ë7°A`·°A`·–ùÃ7–ùÃ7ç[Z·ç[Z·Ä�¼7Ä�¼7øuT·øuT·R2µ7R2µ7—�N·—�N·D ®7D ®7f¬H·f¬H·Ÿ §7Ÿ §7XÊB·XÊB·66 766 7Ñë<·Ñë<·’‡™7’‡™7-7·-7·É“7É“7¾=1·¾=1·È¡Œ7È¡Œ7ºo+·ºo+·oj†7oj†7©%·©%·lZ€7lZ€7ë·ë·Pãt7Pãt7š6·š6·ç_i7ç_i7zŒ·zŒ·˜*^7˜*^7Äí·Äí·¾BS7¾BS7u[ ·u[ ·÷§H7÷§H7×·×·¤Y>7¤Y>7Âü¶Âü¶«W47«W47{õñ¶{õñ¶ƒ¡*7ƒ¡*7øIç¶øIç¶Ô6!7Ô6!7²Áܶ²Áܶ77ê^Ò¶ê^Ò¶­A7­A7Õ#ȶÕ#ȶ2¶72¶7K¾¶K¾¶Oèü6Oèü6\,´¶\,´¶Möì6Möì6ësª¶ësª¶%•Ý6%•Ý6Gë ¶Gë ¶ÖÃÎ6ÖÃÎ6l”—¶l”—¶�À6�À6¦q޶¦q޶¯Ë²6¯Ë²6ׄ…¶×„…¶¹¢¥6¹¢¥6ÓŸy¶ÓŸy¶1™61™6Ç©h¶Ç©h¶ÙñŒ6ÙñŒ6”+X¶”+X¶cg�6cg�6¥)H¶¥)H¶=Él6=Él6ͧ8¶Í§8¶gÐW6gÐW6Yª)¶Yª)¶âC6âC6±4¶±4¶çû06çû06ÊJ ¶ÊJ ¶^6^6aáÿµaáÿµË=6Ë=6œT浜Tæµ Áü5 Áü51÷͵1÷͵áß5áß5XжµXжµ{9Ã5{9Ã5=ç µ=ç µ�b©5�b©5±CŒµ±CŒµ\w‘5\w‘5IÚqµIÚqµÐåv5Ðåv5?ÕMµ?ÕMµüŸN5üŸN5˜†,µ˜†,µ‡*5‡*5„ü µ„ü µÎ2 5Î2 5ø‰ä´ø‰ä´'ì×4'ì×4ªÛ²´ªÛ²´C£¤4C£¤4û‡´û‡´ìp4ìp4ŽXB´ŽXB´ž&4ž&4&À´&À´wcÔ3wcÔ3=ùž³=ùž³êñm3êñm3-#³-#³y Ò2y Ò2öÛk²öÛk²Ô¿Ñ1Ô¿Ñ1(¥Ò°(¥Ò°././@LongLink0000644000000000000000000000017000000000000011601 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/BinauralDecoder/Source/EQ/Sennheiser-HD560ovationII.wavIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/BinauralDecoder/Source/EQ/Sennheiser0000664002537200253720000004013015257173642031443 0ustar zmoelnigzmoelnigRIFFP@WAVEfmt €»Ü factPEAKác YÖ‚S?Ö‚S?data@Ö‚S?Ö‚S?@<”½@<”½J½J½FÔ¾FÔ¾/E�¾/E�¾ßµS=ßµS=ÊxÞ=ÊxÞ=…¹½…¹½'k ½'k ½ú™!=ú™!=Dc'=Dc'=EÿÚÚ:>Ú:/§Ù:/§Ù:F¾Ù:F¾Ù:<§×:<§×:Œ×:Œ×:êÕ:êÕ:6’Ö:6’Ö:Ì+Ö:Ì+Ö:þl×:þl×:v²Ö:v²Ö:ËÊ×:ËÊ×:ÓþÖ:ÓþÖ:’Ø:’Ø:!AØ:!AØ:ržÚ:ržÚ:8ÞÚ:8ÞÚ:ùÁÜ:ùÁÜ:tÝ:tÝ:EKß:EKß:‚ß:‚ß:¤á:¤á:˼á:˼á:—ã:—ã:æ1ä:æ1ä: áæ: áæ:M"ç:M"ç:Ê�è:Ê�è:1¹ç:1¹ç:ì¥è:ì¥è:ãBè:ãBè:ù.ê:ù.ê:gÁé:gÁé:�Pê:�Pê:Qoè:Qoè:,è:,è:•dæ:•dæ:PÓæ:PÓæ:¹å:¹å:.iä:.iä:?ºá:?ºá:Òà:Òà:qEÞ:qEÞ:XÐÝ:XÐÝ:Õ3Û:Õ3Û:ã÷Ù:ã÷Ù:ÄÖ:ÄÖ:ðÕ:ðÕ:ØÓ:ØÓ:ÎbÒ:ÎbÒ:1šÏ:1šÏ:ÐgÎ:ÐgÎ: DË: DË: bÊ: bÊ:3È:3È: ñÇ: ñÇ:ñàÅ:ñàÅ:u´Å:u´Å:ŒsÃ:ŒsÃ:ÊÃ:ÊÃ:C>Á:C>Á: äÁ: äÁ:ÑÀ:ÑÀ:]ÏÁ:]ÏÁ:KÐÀ:KÐÀ:®|Á:®|Á:ìOÀ:ìOÀ:F„Á:F„Á:wþÀ:wþÀ:½�Â:½�Â:†KÂ:†KÂ:!çÃ:!çÃ:íˆÃ:íˆÃ:¡BÅ:¡BÅ:TÅ:TÅ:ʪÆ:ʪÆ:#_Æ:#_Æ:Á)È:Á)È:‡ È:‡ È:àÉ:àÉ:\•É:\•É:©Ë:©Ë:vLÊ:vLÊ:�¬Ë:�¬Ë:UË:UË:/êÌ:/êÌ:2Ì:2Ì: 'Í: 'Í:HåË:HåË:3ŒÌ:3ŒÌ:bqË:bqË:·pÌ:·pÌ:5Ë:5Ë:\­Ë:\­Ë:Ê:Ê:U-Ê:U-Ê:?cÈ:?cÈ:ÖªÈ:ÖªÈ:ÂÙÆ:ÂÙÆ:5âÆ:5âÆ: êÄ: êÄ:öÄ:öÄ:…Ã:…Ã:Ô Ã:Ô Ã:" Á:" Á:úÀ:úÀ:âå¾:âå¾:ìò¾:ìò¾:ø½:ø½:kW½:kW½::˜»::˜»:“Ô»:“Ô»:ïñ¹:ïñ¹:5&º:5&º:�ˆ¸:�ˆ¸:x¹:x¹:¨·:¨·:žD¸:žD¸:ó˶:ó˶: R·: R·:jðµ:jðµ:Hɶ:Hɶ:“°µ:“°µ:ŒŸ¶:ŒŸ¶:ˆƒµ:ˆƒµ:h¶:h¶:ÖDµ:ÖDµ:c@¶:c@¶:�@µ:�@µ:àI¶:àI¶:¨Sµ:¨Sµ:(q¶:(q¶:Çyµ:Çyµ:|¶:|¶:–jµ:–jµ:OU¶:OU¶:Ž9µ:Ž9µ:ÐA¶:ÐA¶:q@µ:q@µ:8¶:8¶:©µ:©µ:е:е:öm´:öm´:Ð&µ:Ð&µ: ã³: ã³:È«´:È«´:V³:V³:Úò³:Úò³:]h²:]h²:3ê²:3ê²:Ud±:Ud±:ð±:ð±:Ûd°:Ûd°:ذ:ذ:*¯:*¯:-�¯:-�¯:Àå­:Àå­:ÆN®:ÆN®:m¡¬:m¡¬:<­:<­:ÍO«:ÍO«:º²«:º²«:ª:ª:ô]ª:ô]ª:«¢¨:«¢¨:S÷¨:S÷¨:D§:D§:Ÿ´§:Ÿ´§:´¦:´¦:0Ц:0Ц:9ê¤:9ê¤:V¥:V¥:†¯£:†¯£:è.¤:è.¤:E ¢:E ¢:9*£:9*£:Ö¬¡:Ö¬¡:¼K¢:¼K¢:„Õ :„Õ :üw¡:üw¡:À :À :g  :g  :‡5Ÿ:‡5Ÿ:jòŸ:jòŸ:L�ž:L�ž:·ZŸ:·ZŸ:òû�:òû�:Á°ž:Á°ž:TT�:TT�:Fž:Fž:ŸÔœ:ŸÔœ:[£�:[£�:?Rœ:?Rœ:å�:å�:œÄ›:œÄ›:ù‹œ:ù‹œ:Ê?›:Ê?›:àœ:àœ:Æš:Æš:õ‘›:õ‘›: Dš: Dš:â›:â›:ë±™:ë±™:ÿ{š:ÿ{š:*™:*™:cñ™:cñ™:†¡˜:†¡˜:Öl™:Öl™:Ϙ:Ϙ:kÖ˜:kÖ˜:ùw—:ùw—:±/˜:±/˜:êÊ–:êÊ–:=‰—:=‰—:Ø-–:Ø-–:Hè–:Hè–:`~•:`~•:<)–:<)–:]²”:]²”: ]•: ]•:¯õ“:¯õ“:Ý«”:Ý«”:,<“:,<“:éá“:éá“:Òf’:Òf’:Ž “:Ž “:¿œ‘:¿œ‘:WM’:WM’:­Ø�:­Ø�: }‘: }‘: �: �:`¯�:`¯�:`>�:`>�:Xî�:Xî�:É}Ž:É}Ž:ò(�:ò(�:ç·�:ç·�:´kŽ:´kŽ:®ýŒ:®ýŒ:O«�:O«�:–:Œ:–:Œ:¢êŒ:¢êŒ:Z|‹:Z|‹:15Œ:15Œ:ÎÍŠ:ÎÍŠ:¤€‹:¤€‹:)Š:)Š:þÊ:þÊ:áU‰:áU‰:È Š:È Š:ø¡ˆ:ø¡ˆ:�:ò>�:?š:?š:Ì~€:Ì~€:ï~:ï~:jb:jb:³g|:³g|:c¾}:c¾}:ÌÍz:ÌÍz:-$|:-$|:Ú,y:Ú,y:«|z:«|z:Pw:Pw:dÕx:dÕx:9ãu:9ãu:‘5w:‘5w:Ã6t:Ã6t:´‡u:´‡u:,�r:,�r:“äs:“äs:Ròp:Ròp:úJr:úJr:¿Po:¿Po:Ò¤p:Ò¤p:Š«m:Š«m:²o:²o:°l:°l:nm:nm:)}j:)}j: Ûk: Ûk:8êh:8êh: Mj: Mj: ]g: ]g:ݽh:ݽh:�Ðe:�Ðe:6g:6g:BMd:BMd:\½e:\½e:…Úb:…Úb:�Cd:�Cd:rWa:rWa:Àb:Àb:”Ú_:”Ú_:ºQa:ºQa:Jz^:Jz^:Éï_:Éï_:€ ]:€ ]:Ñv^:Ñv^:¼“[:¼“[:ý ]:ý ]:ë6Z:ë6Z:à¶[:à¶[:2ÚX:2ÚX:|MZ:|MZ:®lW:®lW:ºåX:ºåX:¿V:¿V:U’W:U’W:,¼T:,¼T:†5V:†5V:=WS:=WS:ÒT:ÒT:ÍõQ:ÍõQ:ZrS:ZrS:U˜P:U˜P:ÎR:ÎR:b:O:b:O:�¹P:�¹P:èàM:èàM:^O:^O:NL:NL:˜ûM:˜ûM:�K:�K:ÝŸL:ÝŸL:ÛÇI:ÛÇI:HK:HK:IhH:IhH:ÓãI:ÓãI:ÜG:ÜG:¡†H:¡†H:v­E:v­E:«0G:«0G:hSD:hSD:ßÑE:ßÑE: øB: øB:ÍzD:ÍzD:lŸA:lŸA:Ž"C:Ž"C:#H@:#H@:ZÌA:ZÌA:çö>:çö>:Î~@:Î~@:z£=:z£=:¢#?:¢#?:²F<:²F<:Ì=:Ì=:Jö::Jö::Ç<:Ç<:Ö¦9:Ö¦9:*;:*;:ðK8:ðK8:-Ï9:-Ï9:òô6:òô6:G|8:G|8:ù¢5:ù¢5:ª(7:ª(7:œJ4:œJ4:DÌ5:DÌ5:€ì2:€ì2:Co4:Co4:“1:“1:p3:p3:®=0:®=0:êÀ1:êÀ1:¦Þ.:¦Þ.:¸\0:¸\0:8y-:8y-:[ý.:[ý.:®,:®,:˜¢-:˜¢-:}À*:}À*:Y?,:Y?,:¯X):¯X):§Ø*:§Ø*:4ô':4ô':v):v):£“&:£“&:B(:B(:3/%:3/%:1¯&:1¯&:›È#:›È#:´H%:´H%:zc":zc":áå#:áå#:*!:*!:À€":À€":¦š:¦š:!:!:27:27:y¸:y¸:EÑ:EÑ:åQ:åQ:Êj:Êj:6î:6î:::%…:%…:ô˜:ô˜:‡:‡:X0:X0:ȳ:ȳ:lÌ:lÌ:K:K:(\:(\:OÙ:OÙ:æí:æí:¢o:¢o:{†:{†:³:³:”:”:ð™:ð™:ò®:ò®:s0:s0:yD :yD :kÆ:kÆ:ñÛ :ñÛ :Ž_ :Ž_ :w :w :iü :iü :É :É :'• :'• :d«:d«:Ç1 :Ç1 :¤J:¤J:‘Ó:‘Ó:(ì:(ì:¶r:¶r:ö‰:ö‰:ý:ý:r-:r-:e¹:e¹:zÕ:zÕ:Ra:Ra:Bôþ9Bôþ9§:§:X@ü9X@ü9€]ÿ9€]ÿ9šù9šù9ì»ü9ì»ü9 õö9 õö9ïú9ïú9Iô9Iô9i÷9i÷9ó¡ñ9ó¡ñ9´Âô9´Âô9¹üî9¹üî9ˆò9ˆò9Wì9Wì9fyï9fyï9Í®é9Í®é9…Êì9…Êì9oþæ9oþæ9Ãê9Ãê9hYä9hYä9Nç9Nç9‚µá9‚µá9”Òä9”Òä9ãß9ãß9s'â9s'â9 aÜ9 aÜ9±ˆß9±ˆß9ÁÙ9ÁÙ9÷ãÜ9÷ãÜ9 ×9 ×9<Ú9<Ú9ývÔ9ývÔ9y£×9y£×9ÌÞÑ9ÌÞÑ9E Õ9E Õ9û@Ï9û@Ï9 kÒ9 kÒ91¨Ì91¨Ì9+ÚÏ9+ÚÏ9ŒÊ9ŒÊ9œKÍ9œKÍ9ýˆÇ9ýˆÇ9­ºÊ9­ºÊ99ûÄ99ûÄ9G1È9G1È9„qÂ9„qÂ9ç¦Å9ç¦Å9Šå¿9Šå¿9²Ã9²Ã9£\½9£\½98—À98—À9ƒÙº9ƒÙº9€¾9€¾93R¸93R¸9–‰»9–‰»9©Èµ9©Èµ9˜¹9˜¹9zB³9zB³9 |¶9 |¶9�º°9�º°9Bô³9Bô³9’2®9’2®9þk±9þk±9}§«9}§«9EÞ®9EÞ®9é9é9¥P¬9¥P¬9QŒ¦9QŒ¦9…Å©9…Å©9�þ£9�þ£9k5§9k5§9ok¡9ok¡9l£¤9l£¤9ÈÜž9ÈÜž9R¢9R¢9ÍLœ9ÍLœ9|„Ÿ9|„Ÿ91¹™91¹™9¯ñœ9¯ñœ9�*—9�*—9Viš9Viš9Ó¡”9Ó¡”9§Ü—9§Ü—9È’9È’9êO•9êO•9׉�9׉�9­Ì’9­Ì’91�91�9¾H�9¾H�9-ƒŠ9-ƒŠ9@É�9@É�9T ˆ9T ˆ9”S‹9”S‹9>”…9>”…9’܈9’܈9Oƒ9Oƒ9Mh†9Mh†9”­€9”­€96ÿƒ96ÿƒ9݉|9݉|9x•�9x•�9 ±w9 ±w9ºT~9ºT~9>ár9>ár9o‹y9o‹y9ýn9ýn96Çt96Çt9FWi9FWi9àp9àp9ÅŽd9ÅŽd9p;k9p;k9÷Æ_9÷Æ_9·vf9·vf9M[9M[9R¾a9R¾a9 JV9 JV9Žú\9Žú\9…Q9…Q9ü7X9ü7X9ÇL9ÇL9�‚S9�‚S9ÿH9ÿH9�ÆN9�ÆN9TRC9TRC9ê J9ê J9^–>9^–>9@UE9@UE9Aæ99Aæ99§@9§@9!659!659-ö;9-ö;9é�09é�09×C79×C79´Ô+9´Ô+9�ž29�ž29S3'9S3'9N.9N.9—•"9—•"9ùd)9ùd)9…û9…û9÷Ï$9÷Ï$9¬i9¬i9¨A 9¨A 9©à9©à9.Á9.Á9Ac9Ac9ðF9ðF9sé 9sé 9*Î9*Î9ès9ès9'a9'a9 9 9óú 9óú 9iNý8iNý8›9›9�ô8�ô8{?9{?9 Ûë8 Ûë8‡Ïù8‡Ïù8ý1ã8ý1ã8\0ñ8\0ñ8 ”Ú8 ”Ú8®�è8®�è8êÑ8êÑ8…çß8…çß8 MÉ8 MÉ8 ^×8 ^×8°ÈÀ8°ÈÀ8ÆÓÎ8ÆÓÎ8½-¸8½-¸8ó0Æ8ó0Æ8£�¯8£�¯8þ£½8þ£½8ˆ §8ˆ §8%µ8%µ8‘�ž8‘�ž8X‘¬8X‘¬8cé•8cé•8Óÿ£8Óÿ£8�^�8�^�8Rz›8Rz›83Õ„83Õ„8"ò’8"ò’8ý˜x8ý˜x8mkŠ8mkŠ8”‹g8”‹g8eë�8eë�8“V8“V8cïr8cïr85¹E85¹E8}%b8}%b8Ñò48Ñò480lQ80lQ8B=$8B=$8‚¾@8‚¾@8Ÿ8Ÿ8oE08oE08 98 98{ë8{ë8PÀå7PÀå7L•8L•8ÃÅ7ÃÅ7ÁÓþ7ÁÓþ7× ¥7× ¥7ÞäÞ7ÞäÞ7…7…7Où¾7Où¾7`]J7`]J7mGŸ7mGŸ7o 7o 7;€7;€7· š6· š6‰ØA7‰ØA7dp5dp5ñ47ñ47¼º9¶¼º9¶JŽ6JŽ6Ê×¶Ê×¶­-#5­-#5 þ'· þ'·» G¶» G¶½Íc·½Íc·ÚÛ¶ÚÛ¶®È�·®È�·#)·#)·&|­·&|­·½ìc·½ìc·½Ê·½Ê·«4�·«4�·óè·óè·Áo¬·Áo¬·Dž¸Dž¸ÅnÉ·ÅnÉ·d¸d¸»-æ·»-æ·†i¸†i¸Çn¸Çn¸ñ¿-¸ñ¿-¸ýµ¸ýµ¸Øö;¸Øö;¸ÕÚ¸ÕÚ¸¯J¸¯J¸wí+¸wí+¸ÎX¸ÎX¸±Ú9¸±Ú9¸˜f¸˜f¸˜¸G¸˜¸G¸¨ßs¸¨ßs¸æ…U¸æ…U¸œÊ€¸œÊ€¸þc¸þc¸)�‡¸)�‡¸¨œp¸¨œp¸fQޏfQޏ]~¸]~¸½•¸½•¸r©…¸r©…¸º—›¸º—›¸œ6Œ¸œ6Œ¸ï%¢¸ï%¢¸–Á’¸–Á’¸´¬¨¸´¬¨¸ë6™¸ë6™¸¯¸¯¸�Ÿ¸�Ÿ¸ffµ¸ffµ¸ÐÞ¥¸ÐÞ¥¸~µ»¸~µ»¸"¬¸"¬¸ÐêÁ¸ÐêÁ¸PG²¸PG²¸€ȸ€ȸ—[¸¸—[¸¸áθáθÏ^¾¸Ï^¾¸^Ô¸^Ô¸*Pĸ*Pĸ7ÿÙ¸7ÿÙ¸w3ʸw3ʸÄÙ߸ÄÙ߸\и\и:Ÿå¸:Ÿå¸þ½Õ¸þ½Õ¸€Z븀Zë¸pÛ¸pÛ¸Rñ¸Rñ¸Ûá¸ÛḮ”ö¸®”ö¸o–æ¸o–渖#ü¸–#ü¸9ì¸9ì¸5й5й¾Šñ¸¾Šñ¸¨ƒ¹¨ƒ¹óíö¸óíö¸ë4¹ë4¹ÎGü¸ÎGü¸±Ý¹±Ý¹ÁŹÁŹŠ| ¹Š| ¹|b¹|b¹´¹´¹�ø¹�ø¹N©¹N©¹ƒ¹ƒ¹Q1¹Q1¹L ¹L ¹úµ¹úµ¹ ‡ ¹ ‡ ¹u0¹u0¹.ü¹.ü¹:¡¹:¡¹»g¹»g¹Ë ¹Ë ¹êιêιøo¹øo¹.¹.¹ÏË!¹ÏË!¹©ƒ¹©ƒ¹E$¹E$¹šÒ¹šÒ¹*k&¹*k&¹2¹2¹f¯(¹f¯(¹Y ¹Y ¹ë*¹ë*¹P�"¹P�"¹Ÿ -¹Ÿ -¹%Á$¹%Á$¹M/¹M/¹óç&¹óç&¹sq1¹sq1¹–)¹–)¹hŒ3¹hŒ3¹‰+¹‰+¹— 5¹— 5¹(,-¹(,-¹É¬7¹É¬7¹­2/¹­2/¹´®9¹´®9¹õ/1¹õ/1¹ª;¹ª;¹R&3¹R&3¹¿�=¹¿�=¹¹5¹¹5¹û‡?¹û‡?¹nú6¹nú6¹mA¹mA¹`Û8¹`Û8¹JC¹JC¹�±:¹�±:¹¿E¹¿E¹1~<¹1~<¹‰çF¹‰çF¹?G>¹?G>¹t­H¹t­H¹ÿ@¹ÿ@¹hJ¹hJ¹+»A¹+»A¹ÏL¹ÏL¹MhC¹MhC¹¾ÄM¹¾ÄM¹ø E¹ø E¹ÆgO¹ÆgO¹Ž¬F¹Ž¬F¹ïQ¹ïQ¹Š?H¹Š?H¹ö‘R¹ö‘R¹½ËI¹½ËI¹ùT¹ùT¹WSK¹WSK¹'¡U¹'¡U¹;ÐL¹;ÐL¹JW¹JW¹�EN¹�EN¹…ŽX¹…ŽX¹Z¶O¹Z¶O¹ÔüY¹ÔüY¹eQ¹eQ¹”`[¹”`[¹ô|R¹ô|R¹>½\¹>½\¹ÖS¹ÖS¹Ö^¹Ö^¹á(U¹á(U¹Æc_¹Æc_¹ìqV¹ìqV¹ª`¹ª`¹µ³W¹µ³W¹Téa¹Téa¹ÚíX¹ÚíX¹ c¹ c¹™Z¹™Z¹ Pd¹ Pd¹†K[¹†K[¹"ye¹"ye¹xn\¹xn\¹|—f¹|—f¹¬†]¹¬†]¹Æ­g¹Æ­g¹Yš^¹Yš^¹KÀh¹KÀh¹§_¹§_¹‡Çi¹‡Çi¹ð¦`¹ð¦`¹aÄj¹aÄj¹m a¹m a¹â¼k¹â¼k¹”b¹”b¹�¬l¹�¬l¹�}c¹�}c¹½’m¹½’m¹§_d¹§_d¹Èsn¹Èsn¹2fn¹>fn¹©x¹©x¹nn¹nn¹ã´w¹ã´w¹æ•m¹æ•m¹ãIw¹ãIw¹ö(m¹ö(m¹ûÜv¹ûÜv¹í¸l¹í¸l¹ˆlv¹ˆlv¹|El¹|El¹–øu¹–øu¹âÎk¹âÎk¹f�u¹f�u¹Tk¹Tk¹åu¹åu¹þÕj¹þÕj¹¢‡t¹¢‡t¹ETj¹ETj¹Ît¹Ît¹JÎi¹JÎi¹Š~s¹Š~s¹ðDi¹ðDi¹‡ôr¹‡ôr¹‘·h¹‘·h¹,fr¹,fr¹z&h¹z&h¹JÕq¹JÕq¹F’g¹F’g¹å?q¹å?q¹dùf¹dùf¹¦p¹¦p¹ï\f¹ï\f¹{ p¹{ p¹Ê¾e¹Ê¾e¹\ko¹\ko¹Ke¹Ke¹+Èn¹+Èn¹%vd¹%vd¹~"n¹~"n¹VÎc¹VÎc¹5zm¹5zm¹Ê"c¹Ê"c¹mÎl¹mÎl¹&tb¹&tb¹xl¹xl¹ÙÂa¹ÙÂa¹˜nk¹˜nk¹+a¹+a¹¥ºj¹¥ºj¹ÏX`¹ÏX`¹,j¹,j¹jŸ_¹jŸ_¹#Ki¹#Ki¹Eä^¹Eä^¹�h¹�h¹Ç&^¹Ç&^¹áÒg¹áÒg¹ìf]¹ìf]¹/g¹/g¹¥\¹¥\¹wQf¹wQf¹ùà[¹ùà[¹ Že¹ Že¹[¹[¹¼Çd¹¼Çd¹.RZ¹.RZ¹lÿc¹lÿc¹É‡Y¹É‡Y¹§5c¹§5c¹‚»X¹‚»X¹²hb¹²hb¹XëW¹XëW¹ÿ˜a¹ÿ˜a¹³W¹³W¹­Ç`¹­Ç`¹³EV¹³EV¹ ó_¹ ó_¹{mU¹{mU¹ó_¹ó_¹Ü“T¹Ü“T¹YB^¹YB^¹Ç¸S¹Ç¸S¹�f]¹�f]¹YÙR¹YÙR¹Ä†\¹Ä†\¹…÷Q¹…÷Q¹T¦[¹T¦[¹kQ¹kQ¹TÄZ¹TÄZ¹"0P¹"0P¹¥ÞY¹¥ÞY¹.HO¹.HO¹Ã÷X¹Ã÷X¹Š_N¹Š_N¹uX¹uX¹ˆtM¹ˆtM¹Á$W¹Á$W¹Õ‡L¹Õ‡L¹9V¹9V¹hšK¹hšK¹LU¹LU¹ØªJ¹ØªJ¹A]T¹A]T¹WºI¹WºI¹ämS¹ämS¹7ÉH¹7ÉH¹}R¹}R¹éÕG¹éÕG¹ÐŠQ¹ÐŠQ¹<âF¹<âF¹l˜P¹l˜P¹îE¹îE¹¨¤O¹¨¤O¹Ž÷D¹Ž÷D¹Ò®N¹Ò®N¹%D¹%D¹ˆ¸M¹ˆ¸M¹MC¹MC¹³ÁL¹³ÁL¹8B¹8B¹KÉK¹KÉK¹ÔA¹ÔA¹|ÏJ¹|ÏJ¹Õ@¹Õ@¹RÔI¹RÔI¹À?¹À?¹UØH¹UØH¹>¹>¹sÛG¹sÛG¹È=¹È=¹NÜF¹NÜF¹+<¹+<¹šÛE¹šÛE¹Ñ;¹Ñ;¹žÚD¹žÚD¹*:¹*:¹ØC¹ØC¹Ž9¹Ž9¹ÓB¹ÓB¹à 8¹à 8¹íÍA¹íÍA¹~7¹~7¹'È@¹'È@¹qü5¹qü5¹@¿?¹@¿?¹óñ4¹óñ4¹N¶>¹N¶>¹nç3¹nç3¹ª¬=¹ª¬=¹?Û2¹?Û2¹æ <¹æ <¹ºÍ1¹ºÍ1¹¼”;¹¼”;¹‰¿0¹‰¿0¹3‡:¹3‡:¹°/¹°/¹y9¹y9¹± .¹± .¹3k8¹3k8¹k�-¹k�-¹ÏZ7¹ÏZ7¹¾},¹¾},¹ÑI6¹ÑI6¹«k+¹«k+¹t95¹t95¹�Y*¹�Y*¹r'4¹r'4¹ªD)¹ªD)¹·3¹·3¹§/(¹§/(¹&2¹&2¹e'¹e'¹Ðë0¹Ðë0¹¡&¹¡&¹ØÕ/¹ØÕ/¹ì$¹ì$¹b¿.¹b¿.¹�Ó#¹�Ó#¹!¨-¹!¨-¹kº"¹kº"¹Ã�,¹Ã�,¹öŸ!¹öŸ!¹Uv+¹Uv+¹™„ ¹™„ ¹B\*¹B\*¹Ýh¹Ýh¹œA)¹œA)¹qL¹qL¹Ž&(¹Ž&(¹W/¹W/¹" '¹" '¹ð¹ð¹í%¹í%¹oò¹oò¹EÐ$¹EÐ$¹àÓ¹àÓ¹k²#¹k²#¹Ÿ³¹Ÿ³¹I“"¹I“"¹ “¹ “¹Et!¹Et!¹Ir¹Ir¹¨T ¹¨T ¹·P¹·P¹L4¹L4¹¥.¹¥.¹Q¹Q¹e ¹e ¹1ñ¹1ñ¹Æç¹Æç¹CϹCϹgĹgĹ­¹­¹óŸ¹óŸ¹¯‰¹¯‰¹ùz¹ùz¹„f¹„f¹ŸV ¹ŸV ¹¯C¹¯C¹‰1 ¹‰1 ¹•¹•¹Ø ¹Ø ¹�û¹�û¹�æ ¹�æ ¹.ع.عŒÁ¹ŒÁ¹c´¹c´¹É›¹É›¹¡�¹¡�¹¸¦>¸§=h¸§=h¸»9¸»9¸ÖZc¸ÖZc¸…Ò4¸…Ò4¸Yz^¸Yz^¸Uê/¸Uê/¸e™Y¸e™Y¸©+¸©+¸Ù·T¸Ù·T¸R&¸R&¸¶×O¸¶×O¸i1!¸i1!¸÷J¸÷J¸$J¸$J¸ÍF¸ÍF¸c¸c¸õ7A¸õ7A¸íz¸íz¸nV<¸nV<¸·’ ¸·’ ¸�w7¸�w7¸“¬¸“¬¸Ï—2¸Ï—2¸èøèøµ-¸µ-¸ ´ý· ´ý·Õ(¸Õ(¸¢æó·¢æó·[õ#¸[õ#¸Cê·Cê·L¸L¸%Dà·%Dà·�3¸�3¸huÖ·huÖ·öS¸öS¸Æ§Ì·Æ§Ì·.u¸.u¸óÙ·óÙ·†“ ¸†“ ¸’¹·’¹·°¸°¸)6¯·)6¯·‡Í¸‡Í¸Òi¥·Òi¥·d×ù·d×ù·�œ›·�œ›·Úð·Úð·Б·Б·)Kæ·)Kæ·‡ ˆ·‡ ˆ·4�Ü·4�Ü·)˜|·)˜|·1ÑÒ·1ÑÒ·!i·!i·É·É· ¶U· ¶U·§e¿·§e¿·¶^B·¶^B·Ç¹µ·Ç¹µ·Í/·Í/·K¬·K¬·Ý·Ý·bu¢·bu¢·©¸·©¸·óÞ˜·óÞ˜·¤M붤Më¶°P�·°P�·=OŶ=OŶ3É…·3É…·JvŸ¶JvŸ¶•x·•x·¾—s¶¾—s¶¬­e·¬­e·j¥(¶j¥(¶ÚÙR·ÚÙR·å¼µå¼µæ@·æ@·ùž´ùž´9h-·9h-·B|X5B|X5 Ò· Ò·@ÿ5@ÿ5ÛW·ÛW·XuH6XuH6Tèë¶Tèë¶­ƒˆ6­ƒˆ69LǶ9LǶ“’¬6“’¬6.ð¢¶.ð¢¶PÐ6PÐ6þ³}¶þ³}¶CÐó6CÐó6dç5¶dç5¶6Š 76Š 7M;ݵM;ݵI7I7 µ µäJ.7äJ.7ãpð4ãpð4Ït?7Ït?7¨@Ç5¨@Ç5?rP7?rP7hk(6hk(6:a7:a7½‹l6½‹l6¶Úq7¶Úq7˜6˜6|(�7|(�7Í|¹6Í|¹6ƒG‰7ƒG‰7Å‚Ú6Å‚Ú6cN‘7cN‘7q4û6q4û6K>™7K>™7ÒÇ 7ÒÇ 7.¡7.¡7FÇ7FÇ7wÕ¨7wÕ¨7ë•-7ë•-7£x°7£x°7ð2=7ð2=7’¸7’¸7J¨L7J¨L7_z¿7_z¿7ñê[7ñê[72ÒÆ72ÒÆ76÷j76÷j7 Î7 Î7ªÚy7ªÚy78Õ78Õ7{E„7{E„7½BÜ7½BÜ7Ú‚‹7Ú‚‹7Ã2ã7Ã2ã7>ª’7>ª’7ò ê7ò ê7¸·™7¸·™7�Æð7�Æð7« 7« 7{f÷7{f÷76…§76…§7¸ìý7¸ìý7ÿD®7ÿD®7†*8†*8Zé´7Zé´7´P8´P89s»79s»7×h8×h8ŠàÁ7ŠàÁ7™p 8™p 8d.È7d.È7Ùh8Ùh8µ`Î7µ`Î7S8S8ÑvÔ7ÑvÔ7,8,8WiÚ7WiÚ7±ó8±ó8H=à7H=à7Œ¬8Œ¬8fõå7fõå7GU8GU8œŠë7œŠë7Gë8Gë8Ùÿð7Ùÿð7Wr!8Wr!8]Wö7]Wö7Ÿè#8Ÿè#8-�û7-�û79M&89M&8™Q8™Q8Z¢(8Z¢(84Í84Í8pæ*8pæ*8l88l88Ü-8Ü-8"”8"”8=/8=/8Gß 8Gß 8¢N18¢N188 88 8CP38CP384F84F8ÍA58ÍA58�a8�a8h!78h!78&l8&l8Õð88Õð88Ûg8Ûg8C°:8C°:83S83S8K^<8K^<8è-8è-8‘û=8‘û=8æø8æø8Qˆ?8Qˆ?8"³8"³8?A8?A8h\8h\8WmB8WmB8øõ8øõ8 ÇC8 ÇC8ò~ 8ò~ 8ÂE8ÂE8ö!8ö!8¡DF8¡DF83]#83]#8ŒjG8ŒjG8´$8´$8‘~H8‘~H8\ù%8\ù%8�I8�I8~.'8~.'8\sJ8\sJ8^S(8^S(8àSK8àSK8÷f)8÷f)8¨#L8¨#L8k*8k*8jãL8jãL8=_+8=_+8?’M8?’M8éB,8éB,8Þ0N8Þ0N8m-8m-8…¿N8…¿N8àÛ-8àÛ-8›=O8›=O8—�.8—�.83¬O83¬O8¾6/8¾6/8p P8p P8NÍ/8NÍ/8œZP8œZP8›T08›T08ašP8ašP8NÍ08NÍ08ËP8ËP8o718o718EíP8EíP8ï’18ï’18<Q8<Q8·ß18·ß184Q84Q8028028^ùP8^ùP8oN28oN28nàP8nàP8ƒp28ƒp28r¸P8r¸P80„280„28Ü�P8Ü�P8–‰28–‰28H=P8H=P8š�28š�28ˆêO8ˆêO8‹k28‹k28|‰O8|‰O8„G28„G28bO8bO82828¨�N8¨�N8&×18&×18)N8)N8ÊŠ18ÊŠ18ÚzM8ÚzM8ì018ì0184ÕL84ÕL86Ê086Ê08^"L8^"L8®V08®V08ƒbK8ƒbK8èÕ/8èÕ/8"•J8"•J8_H/8_H/8!»I8!»I8¾®.8¾®.8 ÕH8 ÕH8Ä.8Ä.8âG8âG8CV-8CV-8âF8âF8¼—,8¼—,8i×E8i×E8Î+8Î+8ÑÀD8ÑÀD8Üø*8Üø*8LžC8LžC8Õ*8Õ*8BpB8BpB8,)8,)8ª7A8ª7A8Í5(8Í5(8dô?8dô?8Þ4'8Þ4'8R¦>8R¦>8q)&8q)&8 N=8 N=8W%8W%8Jì;8Jì;8Öõ#8Öõ#8¿€:8¿€:8LÍ"8LÍ"8@ 98@ 98z›!8z›!8�78�78Xa 8Xa 8P68P6888Lv48Lv48Ò8Ò8Þ28Þ28~8~8‘=18‘=18�!8�!8Ì”/8Ì”/84½84½8lä-8lä-87Q87Q8>,,8>,,89Ý89Ý8Yl*8Yl*8b8b8¯¥(8¯¥(8èß8èß8Õ×&8Õ×&8[V8[V8Ë%8Ë%8Æ8Æ8Ÿ'#8Ÿ'#8˜/8˜/8F!8F!8~’ 8~’ 8^8^8 ï 8 ï 86p86p8òE 8òE 8}8}8h—8h—8‡„8‡„8gã8gã8©†8©†8 *8 *8„8„8l8l8}8}8¨©8¨©8õq8õq8ÁÅÿ7ÁÅÿ7Çb8Çb870ü770ü7 P 8 P 8Ü“ø7Ü“ø7�: 8�: 8]ñô7]ñô7ä! 8ä! 8Hñ7Hñ7N8N8K™í7K™í7êè8êè8Ãæé7Ãæé7hÉ8hÉ8².æ7².æ7Œ§8Œ§8-râ7-râ7³ý7³ý72³Þ72³Þ7ø¿ø7ø¿ø7UðÚ7UðÚ7ösô7ösô7W*×7W*×7G&ð7G&ð7dbÓ7dbÓ7E×ë7E×ë7;˜Ï7;˜Ï7Ò†ç7Ò†ç7ÌË7ÌË76ã76ã7µÿÇ7µÿÇ7çäÞ7çäÞ7ï1Ä7ï1Ä7»“Ú7»“Ú7ÒcÀ7ÒcÀ7¤CÖ7¤CÖ7–¼7–¼7uôÑ7uôÑ7„ȸ7„ȸ7Œ¦Í7Œ¦Í7«û´7«û´7ÅZÉ7ÅZÉ7�0±7�0±7…Å7…Å7óf­7óf­7ëÊÀ7ëÊÀ7SŸ©7SŸ©7“‡¼7“‡¼7ˆÚ¥7ˆÚ¥7,H¸7,H¸7ª¢7ª¢7 ´7 ´7Zž7Zž7øÕ¯7øÕ¯7uŸš7uŸš7L¤«7L¤«7é–7é–7Ax§7Ax§7°7“7°7“7_R£7_R£7T‹�7T‹�7”2Ÿ7”2Ÿ7/ä‹7/ä‹7�›7�›7JCˆ7JCˆ7D—7D—7娄7娄7Pþ’7Pþ’7²�7²�7üŽ7üŽ7F{7F{7š‹7š‹7Bt7Bt7¶‡7¶‡7m7m7®)ƒ7®)ƒ7îf7îf7‘–~7‘–~7Ô@_7Ô@_7,ív7,ív7˜vX7˜vX7¤Wo7¤Wo7G¾Q7G¾Q7!×g7!×g7¯K7¯K7 l`7 l`7†D7†D7*Y7*Y7S>7S>7þØQ7þØQ7Ìœ77Ìœ77²J7²J7G17G17*£C7*£C7ý+7ý+7 ­<7 ­<7Ý$7Ý$7%Ð57%Ð57©É7©É7í /7í /7oÍ7oÍ70d(70d(7úè7úè7sÖ!7sÖ!7Ô 7Ô 7Rd7Rd7„i7„i7V7V7…Ï7…Ï7éÔ7éÔ7„žø6„žø6Ÿ7Ÿ7ËÒí6ËÒí6Fº7Fº7‚<ã6‚<ã6ì³ù6ì³ù6€ÜØ6€ÜØ6�0î6�0î6Þ³Î6Þ³Î6Wëâ6Wëâ6?ÃÄ6?ÃÄ6Tå×6Tå×6† »6† »6+Í6+Í6‚�±6‚�±6Ï™Â6Ï™Â6ÕI¨6ÕI¨6ýU¸6ýU¸65AŸ65AŸ6RT®6RT®6Ht–6Ht–6¯•¤6¯•¤6µã�6µã�6£›6£›6�…6�…6íã‘6íã‘6óóz6óóz6 òˆ6 òˆ6¾Ck6¾Ck6“E€6“E€6†\6†\6u¾o6u¾o6–[M6–[M6È~_6È~_6z%?6z%?6 ÍO6 ÍO6Ün16Ün16ª@6ª@6Ä8$6Ä8$6Ñ26Ñ26®ƒ6®ƒ6 $6 $6bP 6bP 6g¢6g¢6›>ÿ5›>ÿ5^ 6^ 6sáè5sáè5éú5éú5¼ŠÓ5¼ŠÓ5#sã5#sã5×:¿5×:¿58#Í58#Í5 ò«5 ò«5ú·5ú·5!±™5!±™5‹ø£5‹ø£5xˆ5xˆ5�‘5�‘5]Žp5]Žp5ªÙ~5ªÙ~5ìBJ>JÝI=JÝI=ùÊ ¹ùÊ ¹åB[½åB[½=m½=m½Eú^=Eú^=Öúr¼Öúr¼¼›ì¼¼›ì¼=¡8=¡8”¨ü»”¨ü»­7œ:­7œ:Iè =Iè =zá<zá<â}t¼â}t¼–G1½–G1½äYe¼äYe¼Èêã;Èêã;ÿ<ÿ±:è>±:2 ª:2 ª: «: «:·}ª:·}ª:#û°:#û°:Š0²:Š0²:`·:`·:ñŲ:ñŲ:aß°:aß°:GÓª:GÓª:ßž¬:ßž¬:@E¬:@E¬:•E³:•E³:É·³:É·³:Ê�·:Ê�·:ÏÒ³:ÏÒ³:i³:i³:bü­:bü­:ÿЯ:ÿЯ:¦†­:¦†­:¸±:¸±:gÀ¯:gÀ¯:yš³:yš³:ä“°:ä“°:š±:š±:~À¬:~À¬:.S­:.S­:¤U¨:¤U¨:²¾©:²¾©:Í¥§:Í¥§:U—«:U—«:V©:V©:¦«:¦«:d;§:d;§:_§:_§:Û�¢:Û�¢:Í ¥:Í ¥:»¢:»¢:й¥:й¥:Ø|¢:Ø|¢:R¤:R¤: K : K :]Ρ:]Ρ:J˜�:J˜�:`Ÿ:`Ÿ:$E›:$E›:dƒ�:dƒ�:Ï‘š:Ï‘š:œµ�:œµ�:ò·š:ò·š:‚´œ:‚´œ:`�˜:`�˜:?sš:?sš:Œ#—:Œ#—:ïý™:ïý™:Á×:Á×:6Q›:6Q›:BŸ˜:BŸ˜:ÿz›:ÿz›:h©˜:h©˜:hª›:hª›:0)™:0)™:깜:깜:ë›:ë›: „Ÿ: „Ÿ:pGž:pGž:XŠ¢:XŠ¢: Á : Á :�¤:�¤:C�¡:C�¡:Æ6¥:Æ6¥:.У:.У:ƒ¨:ƒ¨:sy§:sy§:Ó«:Ó«: ž©: ž©:t§¬:t§¬:óª:óª:2¢­:2¢­:3Ä«:3Ä«:J°¯:J°¯:}Œ­:}Œ­:§í°:§í°:M;®:M;®:?±:?±:nO®:nO®:Sɰ:Sɰ:Ž0­:Ž0­:Øœ¯:Øœ¯:@J¬:@J¬:áâ®:áâ®:ß–«:ß–«:,³­:,³­:o©:o©:mãª:mãª:ƒŒ¦:ƒŒ¦:a3¨:a3¨:7¤:7¤:õö¥:õö¥::С::С:çr£:çr£:·0Ÿ:·0Ÿ:µ¾ :µ¾ :®aœ:®aœ:éÜ�:éÜ�:3n™:3n™:o›:o›:˜—:˜—:'™:'™:B:•:B:•:8:—:8:—:CZ“:CZ“:=r•:=r•:È‘:È‘:K”:K”:é&‘:é&‘:Eï“:Eï“:1Ú�:1Ú�:PÖ“:PÖ“:"í�:"í�:”÷“:”÷“:ßL‘:ßL‘:„©”:„©”:Û#’:Û#’:Šª•:Šª•:$p“:$p“:q%—:q%—:ä×”:ä×”:Úa˜:Úa˜:]ù•:]ù•:ë�™:ë�™:3†—:3†—:Ÿ‘›:Ÿ‘›:Y§™:Y§™:Bw�:Bw�:™›:™›:Þwž:Þwž:Øþ›:Øþ›:ßžŸ:ßžŸ:l[�:l[�:«¡:«¡:»’ž:»’ž:Ií¡:Ií¡:¢Ÿ:¢Ÿ:O6¢:O6¢:óGŸ:óGŸ:€7¢:€7¢:¥$Ÿ:¥$Ÿ:ð¢:ð¢:Ο:Ο:qí¡:qí¡:À¨ž:À¨ž:u8¡:u8¡:T¡�:T¡�:|ñŸ:|ñŸ:Vœ:Vœ:pÌž:pÌž:ñ?›:ñ?›:°§�:°§�:š:š:ô7œ:ô7œ:–e˜:–e˜:Õ�š:Õ�š:œÄ–:œÄ–:°™:°™:*R•:*R•:Õ°—:Õ°—:Ÿ ”:Ÿ ”:8�–:8�–:Þé’:Þé’:·<•:·<•:•‘:•‘:Gþ“:Gþ“:¶}�:¶}�:#“:#“:}×�:}×�:•’:•’:VQ�:VQ�:$’:$’:œÑŽ:œÑŽ:{›‘:{›‘:œgŽ:œgŽ:ôQ‘:ôQ‘:·KŽ:·KŽ:ìZ‘:ìZ‘:”tŽ:”tŽ:È ‘:È ‘:½¹Ž:½¹Ž:Ô‘:Ô‘: æŽ: æŽ:�’:�’:È=�:È=�:1‚’:1‚’:ƒÁ�:ƒÁ�:-“:-“:a,�:a,�:AU“:AU“:u�:u�:u¨“:u¨“:òÏ�:òÏ�: ”: ”:r1‘:r1‘:mN”:mN”:³O‘:³O‘:[”:[”:9T‘:9T‘:K\”:K\”:ß[‘:ß[‘:d”:d”:R‘:R‘:‰A”:‰A”:6‘:6‘:ôÛ“:ôÛ“:F•�:F•�:Ça“:Ça“:="�:="�:Sò’:Sò’:<¬�:<¬�:o’:o’:U�:U�:E¾‘:E¾‘:OŽ:OŽ:yí�:yí�:úz�:úz�:)�:)�:ÑÈŒ:ÑÈŒ:Ây�:Ây�: Œ: Œ:lªŽ:lªŽ:ý*‹:ý*‹:uÅ�:uÅ�:-RŠ:-RŠ:sùŒ:sùŒ:n�‰:n�‰:¦?Œ:¦?Œ:ùÕˆ:ùÕˆ:�„‹:�„‹:“ˆ:“ˆ:Њ:Њ:Ðd‡:Ðd‡:½Š:½Š:™À†:™À†:T�‰:T�‰:JJ†:JJ†:a#‰:a#‰:*Þ…:*Þ…:ú¨ˆ:ú¨ˆ:€[…:€[…:Ø2ˆ:Ø2ˆ: ÷„: ÷„: ݇: ݇:ˆ¯„:ˆ¯„:¿ž‡:¿ž‡:^r„:^r„:4`‡:4`‡:s2„:s2„:„!‡:„!‡:pöƒ:pöƒ:ì†:ì†:÷˃:÷˃:ÿ͆:ÿ͆:†¶ƒ:†¶ƒ:¹†:¹†:ݘƒ:ݘƒ:b‘†:b‘†:”hƒ:”hƒ:•_†:•_†:Ñ@ƒ:Ñ@ƒ:•D†:•D†:×%ƒ:×%ƒ:°"†:°"†:Žÿ‚:Žÿ‚:>ù…:>ù…:gÑ‚:gÑ‚:Ì…:Ì…:ú¤‚:ú¤‚:r˜…:r˜…:”j‚:”j‚:^…:^…: .‚: .‚: …: …:›ä�:›ä�:áÍ„:áÍ„:ª•�:ª•�:Z€„:Z€„:ÉG�:ÉG�:&.„:&.„:æç€:æç€:A¾ƒ:A¾ƒ:r€:r€:>Nƒ:>Nƒ: €: €:=è‚:=è‚:®?:®?:Nx‚:Nx‚:oQ~:oQ~:!ý�:!ý�:¥Y}:¥Y}:A��:A��:æ[|:æ[|:n�:n�:bb{:bb{:c‰€:c‰€: uz: uz:ù€:ù€:¥ty:¥ty:::æax:æax:" ~:" ~:ªpw:ªpw:Å*}:Å*}:Í�v:Í�v:°?|:°?|:ðœu:ðœu:äG{:äG{:l¦t:l¦t:lbz:lbz:LÌs:LÌs:È…y:È…y:ïìr:ïìr:Ȫx:Ȫx:‡r:‡r:6Õw:6Õw:¹Bq:¹Bq:w:w:pvp:pvp:�Av:�Av:‚ºo:‚ºo:'‰u:'‰u:Îûn:Îûn:ãÇt:ãÇt:É=n:É=n:¦t:¦t:–‰m:–‰m:j]s:j]s:—Ñl:—Ñl:…Ÿr:…Ÿr:™l:™l:Îìq:Îìq:“ik:“ik:ëCq:ëCq:¬ºj:¬ºj:­‰p:­‰p:vûi:vûi:fÍo:fÍo:IDi:IDi:Þo:Þo:ž’h:ž’h:xfn:xfn:©Ùg:©Ùg:r®m:r®m:� g:� g:„îl:„îl: Xf: Xf:²"l:²"l:w�e:w�e:—`k:—`k:Ód:Ód:¤j:¤j:­ d:­ d:„Ói:„Ói: 5c: 5c:þh:þh:gb:gb:…9h:…9h:Œ¢a:Œ¢a:pg:pg:Ö`:Ö`:N¢f:N¢f:”`:”`:ìÑe:ìÑe:Q5_:Q5_:Íe:Íe:¶b^:¶b^:M3d:M3d:à™]:à™]:™jc:™jc:Ð\:Ð\:¹¡b:¹¡b: \: \:zØa:zØa:¡>[:¡>[:-a:-a:0|Z:0|Z:�R`:�R`:Ó·Y:Ó·Y:1Œ_:1Œ_:~ðX:~ðX:Ä^:Ä^:*X:*X:3^:3^:qW:qW:O]:O]:¤»V:¤»V:Ζ\:Ζ\: ûU: ûU:ÄÐ[:ÄÐ[:7U:7U:U[:U[:„T:„T:bfZ:bfZ:‰ÒS:‰ÒS:+°Y:+°Y:?S:?S:ÑîX:ÑîX:(UR:(UR:g3X:g3X:�Q:�Q:„€W:„€W:ÈëP:ÈëP:nÍV:nÍV:í2P:í2P:PV:PV:ÞqO:ÞqO:ÑNU:ÑNU:1³N:1³N:G–T:G–T:UýM:UýM:ÖÜS:ÖÜS:<>M:<>M:iS:iS:´wL:´wL:ÄRR:ÄRR: ±K: ±K:k�Q:k�Q:üïJ:üïJ:ñÎP:ñÎP:ì+J:ì+J:ÆP:ÆP:`I:`I:;;O:;;O:¯˜H:¯˜H: zN: zN:ãÖG:ãÖG:¦³M:¦³M:� G:� G:3èL:3èL:´@F:´@F:'L:'L:cxE:cxE:ËVK:ËVK:(¯D:(¯D:xŽJ:xŽJ:ÂéC:ÂéC:ÓÉI:ÓÉI:¢"C:¢"C:}I:}I:¹\B:¹\B:Û>H:Û>H:(œA:(œA:åƒG:åƒG:éá@:éá@:_ÇF:_ÇF:$"@:$"@:AF:AF:`?:`?:ÚGE:ÚGE:N¦>:N¦>:(’D:(’D:8ò=:8ò=:ÂÞC:ÂÞC:==:==:ä'C:ä'C:ˆƒ<:ˆƒ<:½lB:½lB: È;: È;:ɵA:ɵA:€;:€;:fA:fA:�h::�h::V@:V@:÷­9:÷­9:”—?:”—?:8ñ8:8ñ8:�à>:�à>:?8:?8:%1>:%1>:g�7:g�7:Ž{=:Ž{=:ËÓ6:ËÓ6: Á<: Á<:6:6:-<:-<:”]5:”]5:'N;:'N;:Ô§4:Ô§4:™::™::¾ï3:¾ï3:Û9:Û9:-3:-3:Ó9:Ó9: n2: n2:d]8:d]8:Ù²1:Ù²1:€¡7:€¡7:ó0:ó0:-à6:-à6:.10:.10:®6:®6:Ào/:Ào/:6^5:6^5:Í®.:Í®.:x�4:x�4:åì-:åì-:ˆÚ3:ˆÚ3:æ'-:æ'-:”3:”3:^,:^,:‚J2:‚J2:é–+:é–+:K…1:K…1:eÐ*:eÐ*:¼0:¼0:’*:’*:9î/:9î/:5):5):ž!/:ž!/:Ïh(:Ïh(:ÓR.:ÓR.:Ù•':Ù•':]~-:]~-:½¿&:½¿&:˜§,:˜§,:è%:è%:—Ï+:—Ï+: %: %:üô*:üô*:H3$:H3$:ë*:ë*:W#:W#:Ý:):Ý:):2s":2s":aW(:aW(:!‘!:!‘!:Hx':Hx':´³ :´³ :ª™&:ª™&:äÏ:äÏ:¾²%:¾²%:ç:ç:EÊ$:EÊ$:7ÿ:7ÿ:~ä#:~ä#:¾:¾:Ð#:Ð#:‚5:‚5:R":R":üK:üK:b.!:b.!:S^:S^:”B :”B :/u:/u:W\:W\:†Ž:†Ž: t: t:£:£: †: †:<´:<´:™:™:äÆ:äÆ:®«:®«:sÙ:sÙ:[À:[À:�í:�í:¸Ò:¸Ò:;ý:;ý:á:á:› :› : î: î:d:d:úý:úý:§%:§%: : : .: .:::Ñ4:Ñ4:9:9:[> :[> :3":3":,E :,E :ä':ä':¾I :¾I :-:-: O : O :H3:H3:ÍT :ÍT :09:09:Z:Z:¶>:¶>:ö^:ö^:éC :éC :œc:œc:ÁI :ÁI :Gj:Gj:œQ :œQ :þq:þq: Z : Z :Ÿy:Ÿy:qb :qb :½ƒ:½ƒ:Vo:Vo:‘:‘:Å}:Å}:nŸ:nŸ:Œ:Œ:³Zÿ9³Zÿ9s›:s›:²yý9²yý9¸¬:¸¬:±Ÿû9±Ÿû9“Á:“Á:Éù9Éù9KÖ:KÖ::ð÷9:ð÷9;ê:;ê:ÿö9ÿö9Ã:Ã:åGô9åGô9ì:ì:Èvò9Èvò9Úaþ9Úaþ9Á¥ð9Á¥ð9�‘ü9�‘ü9”Ôî9”Ôî9ÛÀú9ÛÀú90í90í9Kïø9Kïø9C0ë9C0ë9«÷9«÷9W_é9W_é9ROõ9ROõ9ÔŽç9ÔŽç9ƒó9ƒó96¼å96¼å9ºªñ9ºªñ9¦åã9¦åã9Öï9Öï9nâ9nâ9îî9îî9”@à9”@à9÷3ì9÷3ì9„lÞ9„lÞ9X_ê9X_ê9õ–Ü9õ–Ü9™‹è9™‹è9‘ÂÚ9‘ÂÚ9è¸æ9è¸æ9ðØ9ðØ9aèä9aèä9µ×9µ×9Ùã9Ùã9„RÕ9„RÕ9ÇMá9ÇMá9=ƒÓ9=ƒÓ9€ß9€ß9¶Ñ9¶Ñ9éµÝ9éµÝ9ŸíÏ9ŸíÏ9ñÛ9ñÛ9n(Î9n(Î9à+Ú9à+Ú9vbÌ9vbÌ9ÉhØ9ÉhØ9) Ê9) Ê9 ©Ö9 ©Ö90áÈ90áÈ9HìÔ9HìÔ9È$Ç9È$Ç993Ó993Ó9¶lÅ9¶lÅ9Ð{Ñ9Ð{Ñ9*²Ã9*²Ã9åÀÏ9åÀÏ9µ÷Á9µ÷Á9è Î9è Î9·CÀ9·CÀ9xXÌ9xXÌ9€Ž¾9€Ž¾9Á¡Ê9Á¡Ê9ÖÔ¼9ÖÔ¼9éÈ9éÈ9g»9g»9Ì4Ç9Ì4Ç9˜h¹9˜h¹9E�Å9E�Å9ù³·9ù³·9SËÃ9SËÃ9-úµ9-úµ9JÂ9JÂ9!>´9!>´9ÆUÀ9ÆUÀ9>ƒ²9>ƒ²9vž¾9vž¾9 ˰9 ˰9™ä¼9™ä¼9 ¯9 ¯9%»9%»9IK­9IK­9Xe¹9Xe¹9•Œ«9•Œ«9i¨·9i¨·9îÌ©9îÌ©9Ôçµ9Ôçµ9 ¨9 ¨9í$´9í$´9F¦9F¦9¸b²9¸b²9ô‚¤9ô‚¤9° °9° °9À¢9À¢9˜Þ®9˜Þ®9ëü 9ëü 9"­9"­9·7Ÿ9·7Ÿ9]W«9]W«9Xs�9Xs�9Ô•©9Ô•©9D²›9D²›9³Ö§9³Ö§9xñ™9xñ™9S¦9S¦9Ó.˜9Ó.˜9éT¤9éT¤90n–90n–9Ô•¢9Ô•¢9º®”9º®”9"Ø 9"Ø 9¢ð’9¢ð’9§Ÿ9§Ÿ9H3‘9H3‘9†^�9†^�9‹s�9‹s�9²Ÿ›9²Ÿ›9Vµ�9Vµ�9Èä™9Èä™9«û‹9«û‹9¶,˜9¶,˜9.@Š9.@Š9Éo–9Éo–93�ˆ93�ˆ9a²”9a²”92Ć92Ć9—÷’9—÷’9 …9 …9¤;‘9¤;‘9„Jƒ9„Jƒ9�9�9ŒŒ�9ŒŒ�9§Á�9§Á�9Ôš9Ôš9šŒ9šŒ9 |9 |9¸FŠ9¸FŠ9¡x9¡x9䇈9䇈9u9u9†Å†9†Å†9©–q9©–q9…9…9Ln9Ln9ØEƒ9ØEƒ9¢’j9¢’j96ƒ�96ƒ�9g9g9Ó|9Ó|9¿}c9¿}c9~÷{9~÷{9™ø_9™ø_96vx96vx9´u\9´u\9—ôt9—ôt93ïX93ïX9nq9nq9ßfU9ßfU9ñêm9ñêm9yåQ9yåQ9pj9pj9ÑkN9ÑkN9døf9døf9çîJ9çîJ9¬{c9¬{c9RpG9RpG9o`9o`9ÈöC9ÈöC9DŽ\9DŽ\9P„@9P„@9¹Y9¹Y9’=9’=9#²U9#²U9¥99¥99ER9ER9I669I669"ÛN9"ÛN9Î29Î29%zK9%zK9ßm/9ßm/9H9H9X ,9X ,9 ºD9 ºD9Á§(9Á§(9ë\A9ë\A9èL%9èL%9Ø>9Ø>9Lö!9Lö!9²³:9²³:9V 9V 9»_79»_79×J9×J94949cø9cø9Ó¿09Ó¿09£ª9£ª9ùu-9ùu-9à]9à]9ù+*9ù+*9P9P97ä&97ä&9ÑÉ 9ÑÉ 9TŸ#9TŸ#9„9„9'\ 9'\ 9¸?9¸?9¦9¦9Ûü9Ûü9tÛ9tÛ9êwû8êwû8#Ÿ9#Ÿ9Tõ8Tõ8þg9þg9YŽî8YŽî8N19N19Iè8Iè8gú 9gú 91­á81­á8ÞÈ 9ÞÈ 9rJÛ8rJÛ8Ô›9Ô›9pîÔ8pîÔ8q9q9m“Î8m“Î8øE9øE9=È8=È8ºAú8ºAú8¦ôÁ8¦ôÁ8çô8çô89¸»89¸»8éÍí8éÍí8r{µ8r{µ8N—ç8N—ç8éA¯8éA¯8\fá8\fá8]©8]©8`GÛ8`GÛ8õö¢8õö¢8[2Õ8[2Õ8Þœ8Þœ8ÒÏ8ÒÏ8È–8È–84É84É8í¼�8í¼�8£Ã8£Ã8AÁŠ8AÁŠ8µ#½8µ#½8hЄ8hЄ8M8·8M8·8޽}8޽}8=L±8=L±8áäq8áäq8Ëm«8Ëm«8R2f8R2f8` ¥8` ¥83’Z83’Z8 ÔŸ8 ÔŸ8îN8îN81 š81 š8Ò\C8Ò\C8žM”8žM”8�ã78�ã78e˜Ž8e˜Ž8œs,8œs,8ìéˆ8ìéˆ8¹!8¹!8ŒEƒ8ŒEƒ8SÉ8SÉ8éH{8éH{8¼€ 8¼€ 8¶p8¶p8É�þ7É�þ7Øêd8Øêd8Y<è7Y<è7ìÑY8ìÑY8YÒ7YÒ7ÂÆN8ÂÆN8Jé»7Jé»7bÌC8bÌC8ë¥7ë¥7XÜ88XÜ88G�7G�7Nû-8Nû-8ÉŠt7ÉŠt7=5#8=5#8ÕfI7ÕfI7*w8*w8äU7äU7†Å 8†Å 8¹ç6¹ç6z%8z%8�’6�’6Æ0ñ7Æ0ñ7´@ö5´@ö5 =Ü7 =Ü7ì{1µì{1µuÇ7uÇ7ÛR¶ÛR¶“Ʋ7“Ʋ7ãJ¼¶ãJ¼¶ç2ž7ç2ž7åL·åL· ͉7 ͉7c0·c0·™k7™k7*¬X·*¬X·3ÒB73ÒB7’w€·’w€·¬ß7¬ß7Áx”·Áx”·â;æ6â;æ6b[¨·b[¨·‰c—6‰c—6ļ·Ä¼·ñ¡6ñ¡6ã™Ï·ã™Ï·Ü^´Ü^´!ã·!ã·Kb#¶Kb#¶Éaö·Éaö·Ê,ž¶Ê,ž¶ŒÀ¸ŒÀ¸¹%ê¶¹%ê¶cG¸cG¸{â·{â·�¸¸�¸¸RM@·RM@·Ü!¸Ü!¸¤e·¤e·¸e*¸¸e*¸p4…·p4…·  3¸  3¸Œ{—·Œ{—·ÛÅ<¸ÛÅ<¸‘¥©·‘¥©·pÝE¸pÝE¸ ª»· ª»·vàN¸vàN¸•ŠÍ·•ŠÍ·1ÖW¸1ÖW¸ÉQß·ÉQß·´¸`¸´¸`¸åð·åð·�i¸�i¸{%¸{%¸�:r¸�:r¸ÍÓ ¸ÍÓ ¸"îz¸"îz¸'o¸'o¸·Â�¸·Â�¸Ñì¸Ñì¸ÿ†¸ÿ†¸@X#¸@X#¸4<Џ4<Џ’Â+¸’Â+¸tޏtޏ4¸4¸I¢’¸I¢’¸æb<¸æb<¸`Ä–¸`Ä–¸Ã’D¸Ã’D¸Þš¸Þš¸fµL¸fµL¸•󞸕óž¸ÍÒT¸ÍÒT¸P£¸P£¸à\¸à\¸Ä §¸Ä §¸®Ód¸®Ód¸.«¸.«¸Qºl¸Qºl¸*ý®¸*ý®¸—t¸—t¸Yí²¸Yí²¸-c|¸-c|¸ÐÔ¶¸ÐÔ¶¸ê‚¸ê‚¸Ö²º¸Ö²º¸=â…¸=â…¸•‡¾¸•‡¾¸!®‰¸!®‰¸ W¸ W¸át�¸át�¸ƸƸ-1‘¸-1‘¸ÅÚɸÅÚɸ”┸”┸�͸�͸°Ž˜¸°Ž˜¸K>ѸK>Ѹ¹3œ¸¹3œ¸èãÔ¸èãԸϟ¸ÏŸ¸t€Ø¸t€Ø¸á`£¸á`£¸‚ܸ‚ܸå馸å馸Ÿß¸Ÿß¸Jmª¸Jmª¸k%ã¸k%ã¸3é­¸3é­¸1¢æ¸1¢æ¸ïZ±¸ïZ±¸�ê¸�ê¸ûô¸ûô¸‚í¸‚í¸*¸¸*¸¸hìð¸hìð¸TŒ»¸TŒ»¸îOô¸îOô¸žã¾¸žã¾¸¨÷¸¨÷¸ 3¸ 3¸düú¸düú¸&€Å¸&€Å¸íMþ¸íMþ¸WÉȸWÉȸ@̹@̹Õ̸Õ̸Pm¹Pm¹kBϸkBϸþ ¹þ ¹ÀxÒ¸ÀxÒ¸©¹©¹]ªÕ¸]ªÕ¸jC¹jC¹lÔØ¸lÔØ¸�Ù¹�Ù¹ž÷Û¸ž÷Û¸èl ¹èl ¹É߸É߸þ ¹þ ¹ç/â¸ç/â¸sŒ ¹sŒ ¹ÅBå¸ÅB帹¹™M踙Mè¸~�¹~�¹5Rë¸5R븢"¹¢"¹7Uî¸7Uî¸Ð¥¹Ð¥¹ÖQñ¸ÖQñ¸é$¹é$¹Dô¸Dô¸xŸ¹xŸ¹é1÷¸é1÷¸*¹*¹;ú¸;ú¸‹Ž¹‹Ž¹Žþü¸Žþü¸á¹á¹¿Úÿ¸¿Úÿ¸1q¹1q¹X¹X¹+Þ¹+Þ¹‰Á¹‰Á¹;J¹;J¹H)¹H)¹2³ ¹2³ ¹�¹�¹|"¹|"¹Fî¹Fî¹@|#¹@|#¹@N¹@N¹ÀÞ$¹ÀÞ$¹e¬ ¹e¬ ¹€>&¹€>&¹Õ ¹Õ ¹œ'¹œ'¹Ó` ¹Ó` ¹Îö(¹Îö(¹§· ¹§· ¹ÆP*¹ÆP*¹S¹S¹Jª+¹Jª+¹œc¹œc¹‚-¹‚-¹&´¹&´¹»R.¹»R.¹Å¹Å¹ª¤/¹ª¤/¹JQ¹JQ¹­õ0¹­õ0¹¢�¹¢�¹%C2¹%C2¹æ¹æ¹ž�3¹ž�3¹!,¹!,¹ŸÕ4¹ŸÕ4¹Ùo¹Ùo¹Ñ6¹Ñ6¹9²¹9²¹©`7¹©`7¹kò¹kò¹"¢8¹"¢8¹@.¹@.¹.ß9¹.ß9¹õf¹õf¹Í;¹Í;¹Êž¹Êž¹ÔT<¹ÔT<¹ÖÓ ¹ÖÓ ¹ôŠ=¹ôŠ=¹µ"¹µ"¹í½>¹í½>¹g3#¹g3#¹ï?¹ï?¹_`$¹_`$¹!A¹!A¹ÚŠ%¹ÚŠ%¹ÀJB¹ÀJB¹£²&¹£²&¹DtC¹DtC¹¡×'¹¡×'¹³›D¹³›D¹6û(¹6û(¹>ÂE¹>ÂE¹M*¹M*¹áåF¹áåF¹À;+¹À;+¹pH¹pH¹ŸX,¹ŸX,¹Ý&I¹Ý&I¹„u-¹„u-¹FJ¹FJ¹¥�.¹¥�.¹ØaK¹ØaK¹Ü¦/¹Ü¦/¹¤{L¹¤{L¹u¼0¹u¼0¹”M¹”M¹òÐ1¹òÐ1¹!«N¹!«N¹Ùã2¹Ùã2¹…ÀO¹…ÀO¹ô3¹ô3¹dÒP¹dÒP¹–5¹–5¹»âQ¹»âQ¹6¹6¹jòR¹jòR¹Œ7¹Œ7¹™ÿS¹™ÿS¹9!8¹9!8¹ U¹ U¹&9¹&9¹šV¹šV¹„):¹„):¹•W¹•W¹�*;¹�*;¹�X¹�X¹µ(<¹µ(<¹°Y¹°Y¹Ö#=¹Ö#=¹½Z¹½Z¹¹>¹¹>¹Ý[¹Ý[¹¥?¹¥?¹€ \¹€ \¹’@¹’@¹†ÿ\¹†ÿ\¹gö@¹gö@¹äñ]¹äñ]¹ªãA¹ªãA¹Øá^¹Øá^¹ÏB¹ÏB¹7Ï_¹7Ï_¹�·C¹�·C¹&º`¹&º`¹Ç�D¹Ç�D¹Ì¢a¹Ì¢a¹³�E¹³�E¹«ˆb¹«ˆb¹-bF¹-bF¹�kc¹�kc¹AG¹AG¹wMd¹wMd¹TH¹TH¹Ù,e¹Ù,e¹–øH¹–øH¹c f¹c f¹hÐI¹hÐI¹Íãf¹Íãf¹a¦J¹a¦J¹Y¼g¹Y¼g¹'zK¹'zK¹Ú’h¹Ú’h¹6LL¹6LL¹„gi¹„gi¹,M¹,M¹A:j¹A:j¹rêM¹rêM¹ k¹ k¹‰¶N¹‰¶N¹êÙk¹êÙk¹Î€O¹Î€O¹Í¦l¹Í¦l¹>IP¹>IP¹]rm¹]rm¹2Q¹2Q¹­;n¹­;n¹—ÔQ¹—ÔQ¹�o¹�o¹¨–R¹¨–R¹§Ço¹§Ço¹©WS¹©WS¹¬‹p¹¬‹p¹éT¹éT¹9Mq¹9Mq¹8ÓT¹8ÓT¹Ý r¹Ý r¹îŒU¹îŒU¹‚Èr¹‚Èr¹QEV¹QEV¹®ƒs¹®ƒs¹nûV¹nûV¹UÖ‰¹>Ö‰¹‰Úu¹‰Úu¹/ø‰¹/ø‰¹ív¹ív¹ййŸUv¹ŸUv¹D9йD9йŸ�v¹Ÿ�v¹{Xй{Xй¹Év¹¹Év¹ávйávйaw¹aw¹\”й\”йŠ6w¹Š6w¹”°Š¹”°Š¹§iw¹§iw¹ÌŠ¹ÌŠ¹¸›w¹¸›w¹ú抹ú抹èËw¹èËw¹›‹¹›‹¹zùw¹zùw¹‹¹‹¹%x¹%x¹Ç0‹¹Ç0‹¹+Ox¹+Ox¹ªG‹¹ªG‹¹©wx¹©wx¹Ì]‹¹Ì]‹¹Qžx¹Qžx¹µr‹¹µr‹¹XÂx¹XÂx¹€†‹¹€†‹¹¯äx¹¯äx¹»™‹¹»™‹¹y¹y¹4¬‹¹4¬‹¹%y¹%y¹X½‹¹X½‹¹¢Ay¹¢Ay¹lÍ‹¹lÍ‹¹�\y¹�\y¹ìÜ‹¹ìÜ‹¹4vy¹4vy¹’당’당Ä�y¹Ä�y¹ù‹¹ù‹¹µ¢y¹µ¢y¹GŒ¹GŒ¹Èµy¹Èµy¹ÅŒ¹ÅŒ¹zÇy¹zÇy¹ŒŒ¹ŒŒ¹J×y¹J×y¹%Œ¹%Œ¹Häy¹Häy¹Ÿ,Œ¹Ÿ,Œ¹qëy¹qëy¹ž0Œ¹ž0Œ¹Hìy¹Hìy¹1Œ¹1Œ¹!æy¹!æy¹y-Œ¹y-Œ¹XØy¹XØy¹Ð%Œ¹Ð%Œ¹NÃy¹NÃy¹jŒ¹jŒ¹\§y¹\§y¹G Œ¹G Œ¹�„y¹�„y¹Qø‹¹Qø‹¹oZy¹oZy¹]ዹ]ዹû(y¹û(y¹„Æ‹¹„Æ‹¹}ðx¹}ðx¹é§‹¹é§‹¹ò°x¹ò°x¹c…‹¹c…‹¹jx¹jx¹_‹¹_‹¹`x¹`x¹ø4‹¹ø4‹¹ÓÇw¹ÓÇw¹9‹¹9‹¹Wlw¹Wlw¹™Õй™ÕŠ¹Ò w¹Ò w¹P Š¹P Š¹ž v¹ž v¹kgйkgйå0v¹å0v¹+й+й¬ºu¹¬ºu¹ùꉹùꉹµ=u¹µ=u¹P§‰¹P§‰¹ñ¹t¹ñ¹t¹ò_‰¹ò_‰¹Ÿ/t¹Ÿ/t¹‰¹‰¹ýžs¹ýžs¹éƈ¹éƈ¹`s¹`s¹Juˆ¹Juˆ¹òjr¹òjr¹ãˆ¹ãˆ¹ÄÆq¹ÄÆq¹LJ¹LJ¹‘q¹‘q¹øj‡¹øj‡¹{lp¹{lp¹f ‡¹f ‡¹vµo¹vµo¹ ¨†¹ ¨†¹Ï÷n¹Ï÷n¹RA†¹RA†¹á3n¹á3n¹#×…¹#×…¹£im¹£im¹i…¹i…¹™l¹™l¹iø„¹iø„¹Âk¹Âk¹­ƒ„¹­ƒ„¹Mäj¹Mäj¹} „¹} „¹|j¹|j¹ÿ�ƒ¹ÿ�ƒ¹ki¹ki¹ÿƒ¹ÿƒ¹Ô%h¹Ô%h¹�Ž‚¹�Ž‚¹/g¹/g¹¶‚¹¶‚¹2f¹2f¹��¹��¹/e¹/e¹ó€¹ó€¹ &d¹ &d¹uc€¹uc€¹Zc¹Zc¹B¡¹B¡¹Žb¹Žb¹u~¹u~¹åç`¹åç`¹€B}¹€B}¹¯Ç_¹¯Ç_¹ |¹ |¹û¡^¹û¡^¹ˆËz¹ˆËz¹áv]¹áv]¹‡y¹‡y¹F\¹F\¹_¹»ù>¹ÕiX¹ÕiX¹Îg=¹Îg=¹œ´V¹œ´V¹ÍÒ;¹ÍÒ;¹üT¹üT¹¸::¹¸::¹Á?S¹Á?S¹vŸ8¹vŸ8¹€Q¹€Q¹]7¹]7¹T½O¹T½O¹Ï`5¹Ï`5¹Ÿ÷M¹Ÿ÷M¹z½3¹z½3¹½.L¹½.L¹Ž2¹Ž2¹ïbJ¹ïbJ¹o0¹o0¹B”H¹B”H¹LÄ.¹LÄ.¹ÃF¹ÃF¹‰-¹‰-¹uïD¹uïD¹gh+¹gh+¹ÍC¹ÍC¹¼¶)¹¼¶)¹»?A¹»?A¹u(¹u(¹Êd?¹Êd?¹’N&¹’N&¹­‡=¹­‡=¹¢—$¹¢—$¹¨;¹¨;¹¸Þ"¹¸Þ"¹TÆ9¹TÆ9¹$!¹$!¹°â7¹°â7¹8h¹8h¹‹ý5¹‹ý5¹«¹«¹¯4¹¯4¹jì¹jì¹ä-2¹ä-2¹;,¹;,¹�C0¹�C0¹Gk¹Gk¹_X.¹_X.¹œ©¹œ©¹ök,¹ök,¹ææ¹ææ¹#~*¹#~*¹=#¹=#¹U�(¹U�(¹_¹_¹ÝŸ&¹ÝŸ&¹žš¹žš¹Å¯$¹Å¯$¹ÅÕ ¹ÅÕ ¹ô¾"¹ô¾"¹r ¹r ¹‚Í ¹‚Í ¹ûJ ¹ûJ ¹ÜÛ¹ÜÛ¹·…¹·…¹6ê¹6깕À¹•À¹=ø¹=ø¹jû¹jû¹-¹-¹†6¹†6¹O¹O¹8r¹8r¹»"¹»"¹¤\ÿ¸¤\ÿ¸c1¹c1¹ßÕû¸ßÕû¸X@¹X@¹XPø¸XPø¸ÜO¹ÜO¹�Ìô¸�Ìô¸` ¹` ¹�Jñ¸�Jñ¸üp ¹üp ¹OÊí¸OÊí¸•‚ ¹•‚ ¹þKê¸þK긕¹•¹ôÏæ¸ôÏæ¸–¨¹–¨¹hVã¸hVã¸*½¹*½¹gß߸gß߸èÒ¹èÒ¹ kܸ kܸÑÓÿ¸ÑÓÿ¸ÐùظÐùظ¿ü¸¿ü¸ç‹Õ¸ç‹Õ¸Ô8ø¸Ô8ø¸T!Ò¸T!Ò¸ßoô¸ßoô¸ ºÎ¸ ºÎ¸ªð¸ªð¸uV˸uV˸%èì¸%èì¸÷Ǹ÷Ǹ-*é¸-*é¸ð›Ä¸ð›Ä¸#på¸#p叨DÁ¸ØDÁ¸ºá¸ºá¸ ò½¸ ò½¸yÞ¸yÞ¸i¤º¸i¤º¸ö[Ú¸ö[Ú¸í[·¸í[·¸H´Ö¸H´Ö¸)´¸)´¸@Ó¸@Ó¸|Ù°¸|Ù°¸}sϸ}sϸx ­¸x ­¸~Û˸~Û˸Ymª¸Ymª¸7Iȸ7Iȸò?§¸ò?§¸„¼Ä¸„¼Ä¸3¤¸3¤¸�5Á¸�5Á¸Žö ¸Žö ¸þ´½¸þ´½¸|Û�¸|Û�¸ç:º¸ç:º¸ÂÆš¸ÂÆš¸ùƶ¸ùƶ¸¸—¸¸—¸PY³¸PY³¸(°”¸(°”¸¬ò¯¸¬ò¯¸0¯‘¸0¯‘¸Ô’¬¸Ô’¬¸Ç´Ž¸Ç´Ž¸�9©¸�9©¸ëÀ‹¸ëÀ‹¸祸祸?Ôˆ¸?Ôˆ¸œ¢¸œ¢¸Óî…¸Óî…¸VXŸ¸VXŸ¸‚ƒ¸‚ƒ¸¿œ¸¿œ¸D9€¸D9€¸z昸z昸ŸÒz¸ŸÒz¸ª¸•¸ª¸•¸ˆAu¸ˆAu¸¦’’¸¦’’¸â¿o¸â¿o¸Vt�¸Vt�¸ÿLj¸ÿLj¸¥]Œ¸¥]Œ¸5éd¸5éd¸àN‰¸àN‰¸A•_¸A•_¸MH†¸MH†¸ QZ¸ QZ¸ÊIƒ¸ÊIƒ¸»U¸»U¸�S€¸�S€¸YøO¸YøO¸Ëz¸Ëz¸äJ¸äJ¸àÿt¸àÿt¸=àE¸=àE¸Fo¸Fo¸Aí@¸Aí@¸r�i¸r�i¸¯ <¸¯ <¸d¸d¸ð87¸ð87¸i€^¸i€^¸ix2¸ix2¸‘ Y¸‘ Y¸ÜÈ-¸ÜÈ-¸uªS¸uªS¸N*)¸N*)¸YZN¸YZN¸ �$¸ �$¸HI¸HI¸$! ¸$! ¸hðC¸hðC¸“¶¸“¶¸ÍÖ>¸ÍÖ>¸d]¸d]¸hÏ9¸hÏ9¸`¸`¸Ú4¸Ú4¸ÍÞ¸ÍÞ¸}÷/¸}÷/¸ð¹ ¸ð¹ ¸a'+¸a'+¸\¦¸\¦¸bi&¸bi&¸ö£¸ö£¸¾!¸¾!¸«fý·«fý·W%¸W%¸;¨õ·;¨õ·þž¸þž¸ î· î·#+¸#+¸ “æ· “æ·Ê¸Ê¸ =ß· =ß·’{ ¸’{ ¸æ Ø·æ Ø·Ç?¸Ç?¸ŒùзŒùз�¸�¸½ Ê·½ Ê·ïÿý·ïÿý·æ@÷æ@÷~øõ·~øõ·™¼·™¼·rî·rî·£¶·£¶·™Yæ·™Yæ·Ù°¯·Ù°¯·OÂÞ·OÂÞ·Ìp©·Ìp©·…P×·…P×·QS£·QS£·1з1зkX�·kX�·kÝÈ·kÝÈ·é—·é—·ÌÛÁ·ÌÛÁ·\É‘·\É‘·:ÿº·:ÿº·Û4Œ·Û4Œ·îG´·îG´·u†·u†·¾µ­·¾µ­·Âq�·Âq�·gH§·gH§·6…x·6…x·Îÿ ·Îÿ ·Xin·Xin·“Ûš·“Ûš·J�d·J�d·¤Û”·¤Û”· ÷Z· ÷Z·�·�·R Q·R Q·{H‰·{H‰·´‰H·´‰H·M´ƒ·M´ƒ·»²?·»²?·‡|·‡|·C7·C7·5ìq·5ìq·™Â.·™Â.·'—g·'—g·¨&·¨&·‡]·‡]·êÊ·êÊ·^¼S·^¼S·C*·C*·T5J·T5J·ÇÅ·ÇÅ·ò@·ò@·æœ·æœ·éñ7·éñ7·�®·�®·Ð3/·Ð3/·Ùóõ¶Ùóõ¶N·&·N·&·Êüè¶Êüè¶å{·å{·õvܶõvܶ�·�·�`ж�`жÚÅ·ÚŷշĶշĶœI·œI·{¹¶{¹¶µ ·µ ·.©®¶.©®¶ûò¶ûò¶P@¤¶P@¤¶B�ä¶B�ä¶|>š¶|>š¶u�×¶u�×¶8¢�¶8¢�¶séʶséʶâi‡¶âi‡¶¨Æ¾¶¨Æ¾¶Ÿ'}¶Ÿ'}¶€³¶€³¶¿µh>¿µ÷V¶÷V¶¨+­µ¨+­µL{¶L{¶”5œµ”5œµ ªìµ ªìµºTŒµºTŒµVÁÕµVÁÕµv{µv{µØ4ÀµØ4ÀµIe_µIe_µaü«µaü«µ{ÀEµ{ÀEµ™µ™µ3.µ3.µÞh‡µÞh‡µ!µ!µNþmµNþmµµµ“•Oµ“•OµýCã´ýCã´n‡3µn‡3µ¸ÈÁ´¸ÈÁ´ÅµÅµ{£´{£´�?µ�?µ:ˆ´:ˆ´`ÍÙ´`ÍÙ´èÆ_´èÆ_´eU³´eU³´&­4´&­4´fø�´fø�´£å´£å´×.e´×.e´³]ܳ³]ܳ£&0´£&0´Ð�¤³Ð�¤³C™´C™´�­k³�­k³É�¸³É�¸³vk³vk³®Òs³®Òs³¢Æ²¢Æ²Û„³Û„³(]Y²(]Y²$x’²$x’²‡Ê»±‡Ê»±-б-бœ_¶°œ_¶°hP6°hP6°€€././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/BinauralDecoder/Source/EQ/Sennheiser-HD430.wavIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/BinauralDecoder/Source/EQ/Sennheiser0000664002537200253720000004013015257173642031443 0ustar zmoelnigzmoelnigRIFFP@WAVEfmt €»Ü factPEAKác Y©}Q?©}Q?data@©}Q?©}Q?K§Š½K§Š½öÈÎ=öÈÎ=îd=îd=‰s{¾‰s{¾,( ¾,( ¾·ñ”¼·ñ”¼¤Ó4=¤Ó4=7ñ­½7ñ­½çÚì¼çÚì¼ ºZ >ºç»ç»��‚:��‚:“3Æ;“3Æ;b‹º¾!>º¸·Á¹¸·Á¹%ÖŠ:%ÖŠ:Ïì:Ïì:¸ë·:¸ë·:„šŠ:„šŠ:‰¢ñ:‰¢ñ:££`;££`;œVŽ;œVŽ;¼ðt;¼ðt;M‹;M‹;Åk†:Åk†:”•9:”•9:d9:d9:ôÂ9ôÂ9yÍo¹yÍo¹ë!ºë!ºò™×¹ò™×¹õ€9õ€9v¯:v¯:‘Ò9‘Ò9‚‰¬9‚‰¬9ç::ç::[ÃÄ:[ÃÄ:EA;EA;ôw+;ôw+;ÁÒ-;ÁÒ-;¥**;¥**;Ý3(;Ý3(;ë$;ë$; ‹; ‹;hð:hð:lÖ:lÖ:‘©ò:‘©ò:Ìq;Ìq; .8; .8;ذI;ذI;ebN;ebN;ÝK;ÝK;ÕLD;ÕLD;B¥4;B¥4;_7;_7;=}þ:=}þ:ËeÕ:ËeÕ:åïÇ:åïÇ:©žÔ:©žÔ:pwä:pwä:"¼ð:"¼ð:‚¹ú:‚¹ú:"/;"/;½;½;Êl;Êl;cE;cE;¦í ;¦í ;ÑË;ÑË; ®ý: ®ý:…æñ:…æñ:ª·â:ª·â:µ�Í:µ�Í:ÄéÀ:ÄéÀ:•­¿:•­¿:ãÌ:ãÌ:çúÚ:çúÚ:”“è:”“è:pí:pí:);î:);î:¼yé:¼yé:z¡ß:z¡ß:Ä9Ê:Ä9Ê:‡±:‡±:s9™:s9™:\�:\�:Α:Α:¯H :¯H :±±:±±:NJÇ:NJÇ:6©Û:6©Û:oð:oð:>þ:>þ:/O;/O;4aÿ:4aÿ:Å*÷:Å*÷:EÈî:EÈî:CÙì:CÙì:%aì:%aì:Y„ð:Y„ð:IÍõ:IÍõ:I;I;B;B;M ;M ;… ;… ;Èm ;Èm ;² ;² ;:›;:›;Ï5ÿ:Ï5ÿ:Øjó:Øjó:jå:jå: ÄÛ: ÄÛ:ÈÌÔ:ÈÌÔ:™±Ô:™±Ô:ß»Õ:ß»Õ:"tÙ:"tÙ:ŠŸÚ:ŠŸÚ:ŽâÜ:ŽâÜ:1ýÛ:1ýÛ:×ÄÚ:×ÄÚ:vPÔ:vPÔ:Ã'Í:Ã'Í:àÃ:àÃ:‹œ¾:‹œ¾:Œì¹:Œì¹:0B¹:0B¹:Áx¸:Áx¸:›r»:›r»:: ¾:: ¾:/ŸÃ:/ŸÃ::²¯>:ý¢?:ý¢?:-¨<:-¨<:_•=:_•=:Ww::Ww::—#;:—#;:hî7:hî7:°Ò8:°Ò8:á5:á5:šÕ6:šÕ6:aÑ3:aÑ3:»4:»4:cË1:cË1:Tß2:Tß2:-ö/:-ö/:¨Ã0:¨Ã0:ýw-:ýw-:”.:”.:…Û*:…Û*:2Š+:2Š+:0(:0(:Û¢(:Û¢(:(%:(%:K’%:K’%:€,":€,":»¨":»¨":è:è:Õr:Õr:Wï:Wï: y: y:‘(:‘(:ÁÃ:ÁÃ:/f:/f:ü:ü:2«:2«:°B:°B:ÄÚ:ÄÚ:õS:õS:áá :áá :,ƒ:,ƒ:Lh :Lh :üZ :üZ :8e :8e :}h :}h :z‡:z‡:Ú�:Ú�:G‡:G‡:[K:[K:þ:þ:o™:o™:^:^:]-:]-:ü9ü9Яý9Яý9ö‚÷9ö‚÷9hù9hù9tzó9tzó9¯Fõ9¯Fõ9Îéî9Îéî9…=ð9…=ð9õºé9õºé9gIë9gIë9å9å9B´æ9B´æ9Ælà9Ælà9&â9&â9k:Ü9k:Ü9ŸXÞ9ŸXÞ9:zØ9:zØ9%FÚ9%FÚ9p Ô9p Ô9 °Õ9 °Õ9(eÏ9(eÏ9ÈèÐ9ÈèÐ9ÿeÊ9ÿeÊ9ú§Ë9ú§Ë9�Å9�Å9ΠÆ9ΠÆ9vwÀ9vwÀ9ÿ5Â9ÿ5Â9¼9¼9\º½9\º½9²ˆ·9²ˆ·9^*¹9^*¹9¾²9¾²9Þ´9Þ´9j<­9j<­9 Y®9 Y®9O«§9O«§9ú©9ú©9Œ…¢9Œ…¢9‹¤9‹¤9*Ð�9*Ð�9l¥Ÿ9l¥Ÿ9S—™9S—™9ØZ›9ØZ›9€•9€•9 ¼–9 ¼–9øm�9øm�9d’9d’9Æž‹9Æž‹9è�9è�9Ù®†9Ù®†9Ê_ˆ9Ê_ˆ9”X‚9”X‚9pK„9pK„9�|9�|9Ó%€9Ó%€9ÍáÚ8>áÚ8Ú)Ä8Ú)Ä8ߟÍ8ߟÍ83œ·83œ·8›¡Á8›¡Á8 ÿ«8 ÿ«80¶80¶8ö… 8ö… 8v€ª8v€ª8·_”8·_”8òÐ�8òÐ�8|o‡8|o‡8m‘8m‘8T[v8T[v8g…8g…8è`8è`8è-u8è-u8W0K8W0K8Âya8Âya82882888Ë>8š#8š#8ÄÜð7ÄÜð7§… 8§… 8™áÅ7™áÅ7i8ñ7i8ñ7æmž7æmž7 Ì7 Ì7æPu7æPu7¥‡¨7¥‡¨7A,7A,7Ëà‚7Ëà‚7ÉöÀ6ÉöÀ6ÀÝ:7ÀÝ:7º€«5º€«5w;Ý6w;Ý6\¶\¶‘Ú6‘Ú6´Öö¶´Öö¶¢«Ôµ¢«ÔµØ9·Ø9·07°¶07°¶Xv·Xv·{·{·G혷G혷gP·gP·”¸·”¸·åˆ·åˆ·ÜšÖ·ÜšÖ·Ï¸£·Ï¸£·ÖÅï·ÖÅï·–…»·–…»·ÑX¸ÑX¸Ì`Ñ·Ì`Ñ·pÈ ¸pÈ ¸ü×å·ü×å·(i¸(i¸ù ý·ù ý·ôù$¸ôù$¸$J ¸$J ¸]F1¸]F1¸H ¸H ¸�¥<¸�¥<¸°Ö!¸°Ö!¸¤‚F¸¤‚F¸¨*¸¨*¸Â­N¸Â­N¸œÑ2¸œÑ2¸ÔiW¸ÔiW¸µ<<¸µ<<¸Ú2a¸Ú2a¸F¸F¸?lk¸?lk¸8Q¸8Q¸#ív¸#ív¸c\¸c\¸OЀ¸OЀ¸�f¸�f¸�Õ…¸�Õ…¸Âp¸Âp¸I‹¸I‹¸(úz¸(úz¸ã�¸ã�¸`µ‚¸`µ‚¸Áœ•¸Áœ•¸Èzˆ¸Èzˆ¸|^›¸|^›¸­ޏ­ޏ§ó ¸§ó ¸oÅ“¸oÅ“¸ìª¦¸ìª¦¸ìS™¸ìS™¸ü¬¸ü¬¸˜ž¸˜ž¸fW±¸fW±¸¤¸¤¸êÙ¶¸êÙ¶¸Kq©¸Kq©¸7¼¸7¼¸Â¯¸Â¯¸V)¸V)¸J%µ¸J%µ¸DȸDȸ$8»¸$8»¸gfθgfθ¥}Á¸¥}Á¸/ÎÔ¸/ÎÔ¸¨ÑǸ¨ÑǸ:ãÚ¸:ãÚ¸ÇÌ͸ÇÌ͸ ḠḪtÔ¸ªtÔ¸rè¸r踚۸šÛ¸^ï¸^ï¸åã¸å㸼 ÷¸¼ ÷¸¹Ö긹Öê¸0¸þ¸0¸þ¸x4ò¸x4ò¸Ñï¹Ñï¹'Vù¸'Vù¸£�¹£�¹ÞU¹ÞU¹ï< ¹ï< ¹¥ ¹¥ ¹Å¹Å¹F¹F¹æV¹æV¹°o ¹°o ¹S¬¹S¬¹VùVù‚¹‚¹â¹â¹4<¹4<¹‡-¹‡-¹D#¹D#¹S7¹S7¹-X'¹-X'¹ÍR!¹ÍR!¹Xy+¹Xy+¹Zw%¹Zw%¹L§/¹L§/¹e­)¹e­)¹2Ð3¹2Ð3¹S®-¹S®-¹T­7¹T­7¹ó|1¹ó|1¹)|;¹)|;¹ŠK5¹ŠK5¹G?¹G?¹9¹9¹Ô C¹Ô C¹Qå<¹Qå<¹ïF¹ïF¹iº@¹iº@¹Æ©J¹Æ©J¹µ_D¹µ_D¹VMN¹VMN¹ÇH¹ÇH¹HðQ¹HðQ¹ê•K¹ê•K¹�iU¹�iU¹’O¹’O¹rØX¹rØX¹.qR¹.qR¹ð8\¹ð8\¹B¹U¹B¹U¹¾k_¹¾k_¹’äX¹’äX¹_™b¹_™b¹| \¹| \¹¿§e¹¿§e¹Yû^¹Yû^¹þ€h¹þ€h¹}Àa¹}Àa¹z;k¹z;k¹£qd¹£qd¹ÑÞm¹ÑÞm¹0g¹0g¹lp¹lp¹U�i¹U�i¹ìër¹ìër¹zök¹zök¹b5u¹b5u¹@!n¹@!n¹oCw¹oCw¹§p¹§p¹$y¹$y¹Ûåq¹Ûåq¹‹êz¹‹êz¹ƒ§s¹ƒ§s¹^¬|¹^¬|¹Pau¹Pau¹~V~¹~V~¹Wøv¹Wøv¹�Ù¹�Ù¹³^x¹³^x¹úŽ€¹úŽ€¹à~y¹à~y¹j�¹j�¹í^z¹í^z¹Ts�¹Ts�¹[{¹[{¹yË�¹yË�¹¶¿{¹¶¿{¹†‚¹†‚¹ÐZ|¹ÐZ|¹Sf‚¹Sf‚¹1á|¹1á|¹w�‚¹w�‚¹ 2}¹ 2}¹§¸‚¹§¸‚¹RQ}¹RQ}¹üÀ‚¹üÀ‚¹ÆU}¹ÆU}¹•»‚¹•»‚¹·9}¹·9}¹Q«‚¹Q«‚¹ñ}¹ñ}¹2š‚¹2š‚¹uæ|¹uæ|¹þ€¹>þ€¹f`y¹f`y¹{�€¹{�€¹!~x¹!~x¹Š €¹Š €¹ˆšw¹ˆšw¹¶O¹¶O¹¸–v¹¸–v¹ZC~¹ZC~¹AŒu¹AŒu¹i@}¹i@}¹‰Št¹‰Št¹<|¹<|¹›…s¹›…s¹5?{¹5?{¹µ�r¹µ�r¹ÐHz¹ÐHz¹Z�q¹Z�q¹Ï8y¹Ï8y¹Èvp¹Èvp¹k)x¹k)x¹lno¹lno¹ w¹ w¹¢_n¹¢_n¹Hv¹Hv¹ÈWm¹ÈWm¹`u¹`u¹ÿMl¹ÿMl¹÷s¹÷s¹J&k¹J&k¹üÎr¹üÎr¹éj¹éj¹\»q¹\»q¹�úh¹�úh¹™·p¹™·p¹øh¹øh¹ÃÎo¹ÃÎo¹è!g¹è!g¹<ên¹<ên¹~/f¹~/f¹<ïm¹<ïm¹Y5e¹Y5e¹7ül¹7ül¹ÔEd¹ÔEd¹él¹él¹§bc¹§bc¹/?k¹/?k¹!¥b¹!¥b¹R’j¹R’j¹5ýa¹5ýa¹Sëi¹Sëi¹$Xa¹$Xa¹0Mi¹0Mi¹Î½`¹Î½`¹ ±h¹ ±h¹c`¹c`¹®h¹®h¹�_¹�_¹Ü˜g¹Ü˜g¹Ó_¹Ó_¹¬0g¹¬0g¹5½^¹5½^¹Üf¹Üf¹u^¹u^¹��f¹��f¹7^¹7^¹ý_f¹ý_f¹ ^¹ ^¹.8f¹.8f¹ä]¹ä]¹Ï!f¹Ï!f¹°Î]¹°Î]¹@f¹@f¹ãÇ]¹ãÇ]¹àf¹àf¹ÌÎ]¹ÌÎ]¹°f¹°f¹$Í]¹$Í]¹Tf¹Tf¹´Ý]¹´Ý]¹H9f¹H9f¹(ù]¹(ù]¹ Qf¹ Qf¹l^¹l^¹úkf¹úkf¹¸.^¹¸.^¹/Žf¹/Žf¹ñM^¹ñM^¹X¬f¹X¬f¹¨p^¹¨p^¹¡Ùf¹¡Ùf¹¢^¹¢^¹ƒg¹ƒg¹†Ê^¹†Ê^¹¨.g¹¨.g¹^î^¹^î^¹ÚNg¹ÚNg¹+_¹+_¹]g¹]g¹ç _¹ç _¹=cg¹=cg¹o_¹o_¹Ddg¹Ddg¹r _¹r _¹C^g¹C^g¹_¹_¹\g¹\g¹@_¹@_¹Pg¹Pg¹®ð^¹®ð^¹‚?g¹‚?g¹²Ü^¹²Ü^¹s'g¹s'g¹U¾^¹U¾^¹g¹g¹s˜^¹s˜^¹+äf¹+äf¹Ä}^¹Ä}^¹QÉf¹QÉf¹²[^¹²[^¹X¡f¹X¡f¹Ü+^¹Ü+^¹ôgf¹ôgf¹³ã]¹³ã]¹(f¹(f¹/x]¹/x]¹Å˜e¹Å˜e¹žþ\¹žþ\¹Y!e¹Y!e¹Ö…\¹Ö…\¹£¦d¹£¦d¹â\¹â\¹þ'd¹þ'd¹…[¹…[¹²›c¹²›c¹FæZ¹FæZ¹méb¹méb¹E¹š>E¹³Î;¹³Î;¹àAC¹àAC¹ºÍ9¹ºÍ9¹BAA¹BAA¹›Ë7¹›Ë7¹I;?¹I;?¹ã¼5¹ã¼5¹ü&=¹ü&=¹|¥3¹|¥3¹õ;¹õ;¹J‹1¹J‹1¹vñ8¹vñ8¹Žf/¹Žf/¹fË6¹fË6¹ºA-¹ºA-¹Uª4¹Uª4¹ï+¹ï+¹Êƒ2¹Êƒ2¹õ(¹õ(¹,^0¹,^0¹.Ô&¹.Ô&¹ç?.¹ç?.¹4²$¹4²$¹®,¹®,¹"Š"¹"Š"¹Áô)¹Áô)¹ªe ¹ªe ¹õÏ'¹õÏ'¹N;¹N;¹(¤%¹(¤%¹I¹I¹p�#¹p�#¹Òð¹Òð¹j_!¹j_!¹”˹”˹:¹:¹Q¦¹Q¦¹ú¹ú¹H~¹H~¹ðé¹ðé¹>O¹>O¹¾¹¾¹Ø&¹Ø&¹ú™¹ú™¹« ¹« ¹ø}¹ø}¹íð ¹íð ¹t¹t¹±ê¹±ê¹Èn¹Èn¹}â¹}â¹Xe¹Xe¹r×¹r×¹ [ ¹ [ ¹úʹúʹ²N ¹²N ¹¡Â¹¡Â¹_R¹_R¹Ç¡ý¸Ç¡ý¸‰i¹‰i¹ƒÙù¸ƒÙù¸Š¹Š¹ñö¸ñö¸®¹®¹Œbò¸Œbò¸ ι ι¬™î¸¬™î¸ŠØý¸ŠØý¸_áê¸_áê¸ú0ú¸ú0ú¸vEç¸vEç¸#¤ö¸#¤ö¸”Æã¸”Æã¸:9ó¸:9ó¸Žiฎiึå︶å︴ݸ´ݸ’츒ì¸jÃÙ¸jÃÙ¸½J鸽Jé¸ €Ö¸ €Ö¸½ 渽 æ¸#?Ó¸#?Ó¸ŠÕ⸊Õâ¸eиeи Á߸ Á߸  ͸  ͸жܸжܸèʸèʸаٸаٸøûƸøûƸ™ªÖ¸™ªÖ¸ôëøôëøô™Ó¸ô™Ó¸¬áÀ¸¬áÀ¸‹žÐ¸‹žÐ¸†ï½¸†ï½¸ÂµÍ¸ÂµÍ¸ï »¸ï »¸ûÚʸûÚʸ¹8¸¸¹8¸¸—ȸ—ȸðoµ¸ðoµ¸–IŸ–IŸ¦²¸¦²¸ô‡Â¸ô‡Â¸’미’미±Ö¿¸±Ö¿¸Y<­¸Y<­¸Î+½¸Î+½¸›“ª¸›“ª¸·Šº¸·Šº¸ßõ§¸ßõ§¸îñ·¸îñ·¸p]¥¸p]¥¸L_µ¸L_µ¸à΢¸à΢¸õײ¸õײ¸H ¸H ¸S°¸S°¸8Á�¸8Á�¸UÏ­¸UÏ­¸Ñ=›¸Ñ=›¸¨O«¸¨O«¸‹½˜¸‹½˜¸HÔ¨¸HÔ¨¸eF–¸eF–¸Še¦¸Še¦¸|Ø“¸|Ø“¸ì÷£¸ì÷£¸jf‘¸jf‘¸J‡¡¸J‡¡¸¶ôޏ¶ôޏµŸ¸µŸ¸t~Œ¸t~Œ¸–�œ¸–�œ¸yЏyЏH%š¸H%š¸=Œ‡¸=Œ‡¸Â´—¸Â´—¸Ú…¸Ú…¸¿A•¸¿A•¸”¤‚¸”¤‚¸±Ð’¸±Ð’¸=1€¸=1€¸¡]�¸¡]�¸Es{¸Es{¸^å�¸^å�¸à€v¸à€v¸ís‹¸ís‹¸‰¦q¸‰¦q¸Q ‰¸Q ‰¸oÙl¸oÙl¸@«†¸@«†¸vh¸vh¸zM„¸zM„¸�Tc¸�Tc¸“æ�¸“æ�¸Úo^¸Úo^¸@ß~¸@ß~¸|Y¸|Y¸Õóy¸Õóy¸@‘T¸@‘T¸Òu¸Òu¸Æ¯O¸Æ¯O¸ö;p¸ö;p¸ áJ¸ áJ¸Ìwk¸Ìwk¸FF¸FF¸*°f¸*°f¸°HA¸°HA¸=àa¸=àa¸t<¸t<¸, ]¸, ]¸Ñ•7¸Ñ•7¸¹-X¸¹-X¸Ü´2¸Ü´2¸WVS¸WVS¸ß-¸ß-¸�N¸�N¸Û)¸Û)¸iÓI¸iÓI¸,d$¸,d$¸´&E¸´&E¸°¸°¸j@¸j@¸'ã¸'ã¸ð˜;¸ð˜;¸ú¸ú¸®¸6¸®¸6¸ï¸ï¸Ü1¸Ü1¸K ¸K ¸B-¸B-¸Á’¸Á’¸Aj(¸Aj(¸žÛ¸žÛ¸¯·#¸¯·#¸Sü·Sü·¥ ¸¥ ¸Eñò·Eñò·cZ¸cZ¸­ƒé·­ƒé·¼²¸¼²¸„Jà·„Jà·”&¸”&¸£6×·£6×·À£ ¸À£ ¸@8η@8η‰8¸‰8¸ésÅ·ésÅ·6Ú¸6Ú¸J�¼·J�¼·pÜþ·pÜþ·\ó·\ó·™ö·™ö·âÿª·âÿª·ØZí·ØZí·ž5¢·ž5¢·m§ä·m§ä·_�™·_�™·—9Ü·—9Ü·®4‘·®4‘·×ØÓ·×ØÓ·?Έ·?Έ·²‡Ë·²‡Ë·/„€·/„€·ÏM÷ÏM÷bƒp·bƒp·B»·B»·þ0`·þ0`·³·³·µdP·µdP·fP«·fP«·ÝÚ@·ÝÚ@·k¦£·k¦£·_§1·_§1·v*œ·v*œ·±¯"·±¯"·¶”·¶”·M··M··O�·O�·o·o·é†·é†·Xí¶Xí¶ó~·ó~·ImѶImѶôhp·ôhp·ÞN¶¶ÞN¶¶Jõb·Jõb·¿7›¶¿7›¶ÓU·ÓU·âb€¶âb€¶(KH·(KH·ÛL¶ÛL¶yL;·yL;·rŸ¶rŸ¶ŒÏ.·ŒÏ.·[…ϵ[…ϵã"·ã"·’h`µ’h`µn·n·!Ý´!Ý´Ÿ‹ ·Ÿ‹ ·‹M5‹M5>·>·ÑÚ£5ÑÚ£5 xê¶ xê¶¾éù5¾éù5>±Õ¶>±Õ¶ý#&6ý#&6%dÁ¶%dÁ¶SªN6SªN6P~­¶P~­¶{Zv6{Zv6ÿç™¶ÿç™¶´ÙŽ6´ÙŽ6˜y†¶˜y†¶#¢6#¢6“Øg¶“Øg¶þI´6þI´6„^D¶„^D¶˜ÚÅ6˜ÚÅ6=Y"¶=Y"¶Ü‰Ö6܉Ö6ݶݶӂæ6Ó‚æ6f‹Åµf‹Åµ^ö6^ö62‰µ2‰µ�y7�y7š}µš}µRœ 7Rœ 7eÉ=´eÉ=´å“7å“7âCp4âCp4ï57ï57+Õ#5+Õ#5¾¶7¾¶77“„57“„5µû#7µû#7µ5µ5šú)7šú)7¶Óã5¶Óã5µÞ/7µÞ/7åÙ6åÙ6<�57<�57— 6— 6-;7-;7—256—256œ¼@7œ¼@7zèJ6zèJ6õ)F7õ)F7·ý_6·ý_64lK74lK7ŒHt6ŒHt61gP71gP7Ž•ƒ6Ž•ƒ6R U7R U7ÖsŒ6ÖsŒ6ánY7ánY7•æ”6•æ”6§«]7§«]7'8�6'8�66ëa76ëa7À�¥6À�¥6yf7yf7ü®­6ü®­6%(j7%(j7%^µ6%^µ6Éùm7Éùm7 ¦¼6 ¦¼6Æ�q7Æ�q7àzÃ6àzÃ6Iu7Iu7�RÊ6�RÊ69‹x79‹x7*Ñ6*Ñ6@ù{7@ù{7ù©×6ù©×6_67_67)ìÝ6)ìÝ61�71�7Ôõã6Ôõã6!±‚7!±‚7'±é6'±é6Ã'„7Ã'„7¸iï6¸iï6TŸ…7TŸ…7Õõ6Õõ6‡7‡7qOú6qOú6 ]ˆ7 ]ˆ7‚Œÿ6‚Œÿ6i´‰7i´‰7äU7äU7�‹7�‹7·Ù7·Ù7¬OŒ7¬OŒ7j7j7iž�7iž�7Þ 7Þ 7©ÕŽ7©ÕŽ7ì* 7ì* 7Š�7Š�7 m7 m7N*‘7N*‘7Ô 7Ô 7ÀO’7ÀO’7�è7�è72†“72†“7UF7UF7qº”7qº”7O‹7O‹7³Þ•7³Þ•7ʯ7ʯ7œð–7œð–7›§7›§7ýî—7ýî—7™•7™•7_ú˜7_ú˜7Ü®7Ü®7æš7æš7ÞÙ!7ÞÙ!77›77›7W$7W$7Oœ7Oœ72&72&7øF�7øF�7Æ'7Æ'7¾2ž7¾2ž7õ�)7õ�)7§#Ÿ7§#Ÿ70^+70^+7! 7! 7p<-7p<-7º¡7º¡7q8/7q8/7¢7¢7ÿù07ÿù07ç÷¢7ç÷¢7ó¡27ó¡27:Ô£7:Ô£7½:47½:47¬¡¤7¬¡¤7™¶57™¶57)q¥7)q¥7¨a77¨a77˜\¦7˜\¦7$97$97)B§7)B§7ÿÑ:7ÿÑ:7@"¨7@"¨7v<7v<7¾ñ¨7¾ñ¨7Ú=7Ú=7¡©7¡©7ä$?7ä$?7�[ª7�[ª7Už@7Už@7­)«7­)«7&B7&B7eú«7eú«7ÄC7ÄC7yÙ¬7yÙ¬7dE7dE7媭7媭7°èF7°èF7iy®7iy®7q}H7q}H7\U¯7\U¯7~$J7~$J7ˆ2°7ˆ2°7ŽÑK7ŽÑK7q±7q±73’M73’M7³ÿ±7³ÿ±7˜5O7˜5O7OÙ²7OÙ²7ÊÕP7ÊÕP7P³³7P³³79iR79iR7ú´7ú´7“ãS7“ãS7�Gµ7�Gµ7_U7_U7 ¶7 ¶7�ÅV7�ÅV7YŶ7YŶ77"X77"X7Ý·7Ý·7XuY7XuY7Ð'¸7Ð'¸7¥™Z7¥™Z7À¾¸7À¾¸7Õ¬[7Õ¬[7¥Q¹7¥Q¹7¶µ\7¶µ\7õÚ¹7õÚ¹7Ç­]7Ç­]7Fgº7Fgº7¿^7¿^7:üº7:üº7Î_7Î_7¼Ž»7¼Ž»7Âå`7Âå`7œ*¼7œ*¼7ò b7ò b7 ¼7 ¼7Œc7Œc74G½74G½7lýc7lýc7nȽ7nȽ7ºßd7ºßd7�>¾7�>¾7D·e7D·e7K¾¾7K¾¾7t¶f7t¶f7‰P¿7‰P¿7†Ég7†Ég7Øã¿7Øã¿7°Öh7°Öh7ctÀ7ctÀ7•Øi7•Øi7;øÀ7;øÀ7ȼj7ȼj7êuÁ7êuÁ7Ë®k7Ë®k7˜Â7˜Â7H¸l7H¸l7'“Â7'“Â7ÄÇm7ÄÇm7X(Ã7X(Ã7¢Ün7¢Ün7²¹Ã7²¹Ã7øÕo7øÕo7ô6Ä7ô6Ä7ªp7ªp7z©Ä7z©Ä7œyq7œyq7äÅ7äÅ7ÂOr7ÂOr7¬˜Å7¬˜Å79s79s7gÆ7gÆ7Ž*t7Ž*t7’œÆ7’œÆ7u7u7ß Ç7ß Ç7­Âu7­Âu7ŠsÇ7ŠsÇ7muv7muv7§ÛÇ7§ÛÇ7‰=w7‰=w7¡TÈ7¡TÈ7*,x7*,x7#ßÈ7#ßÈ7Y.y7Y.y7jÉ7jÉ7Ÿ'z7Ÿ'z7îÉ7îÉ7z {7z {7HhÊ7HhÊ7ê{7ê{7ýåÊ7ýåÊ7 Ú|7 Ú|7orË7orË7öè}7öè}7{Ì7{Ì7z7z7#¥Ì7#¥Ì7Æ€7Æ€7åCÍ7åCÍ7Ë¥€7Ë¥€7ƒÝÍ7ƒÝÍ7n1�7n1�7=uÎ7=uÎ7å½�7å½�7 Ï7 Ï7VI‚7VI‚7Á¥Ï7Á¥Ï7XÛ‚7XÛ‚7ÃLÐ7ÃLÐ7•~ƒ7•~ƒ7ÌþÐ7ÌþÐ7`$„7`$„7Ú°Ñ7Ú°Ñ7¼Ê„7¼Ê„7LbÒ7LbÒ7Ëm…7Ëm…7i Ó7i Ó7r†7r†7ö±Ó7ö±Ó7õ¨†7õ¨†7pkÔ7pkÔ7Œ]‡7Œ]‡7†0Õ7†0Õ7ˆ7ˆ7õÿÕ7õÿÕ7mäˆ7mäˆ7ÆØÖ7ÆØÖ7c®‰7c®‰7¨×7¨×7»lŠ7»lŠ7JsØ7JsØ7g.‹7g.‹7ÀAÙ7ÀAÙ7úï‹7úï‹78Ú78Ú7!»Œ7!»Œ7jñÚ7jñÚ7(“�7(“�7EØÛ7EØÛ7·nŽ7·nŽ7\ÁÜ7\ÁÜ7ÆM�7ÆM�7ÿ­Ý7ÿ­Ý7?+�7?+�7Ÿ”Þ7Ÿ”Þ7?‘7?‘7¸‚ß7¸‚ß7 í‘7 í‘7Uvà7Uvà7Õ’7Õ’7imá7imá7éÓ7éÓ7Ólâ7Ólâ7o·”7o·”7Ïhã7Ïhã7{¡•7{¡•7^ä7^ä7Œ–7Œ–7ýTå7ýTå7or—7or—7Eæ7Eæ7ÙW˜7ÙW˜7Ò=ç7Ò=ç7íK™7íK™7^Cè7^Cè7ADš7ADš7ðFé7ðFé7 >›7 >›7”Sê7”Sê7î?œ7î?œ7Ã]ë7Ã]ë78�78�79cì79cì7¹7ž7¹7ž7«xí7«xí7dEŸ7dEŸ7{“î7{“î7T 7T 7^´ï7^´ï7Ñn¡7Ñn¡7wÞð7wÞð7Kˆ¢7Kˆ¢7áÿñ7áÿñ7œ£7œ£7ý$ó7ý$ó7I¸¤7I¸¤7zNô7zNô7ÚÒ¥7ÚÒ¥7¥uõ7¥uõ7ùî¦7ùî¦7¶¡ö7¶¡ö7–¨7–¨7ÁË÷7ÁË÷7}(©7}(©7çòø7çòø7úCª7úCª7[ú7[ú7Í]«7Í]«7Bû7Bû7Úx¬7Úx¬7¹mü7¹mü7Ôš­7Ôš­77žý77žý7‹½®7‹½®7Ðþ7Ðþ7æ¯7æ¯7ñ8ñ8�±7�±7Óœ8Óœ8j.²7j.²7ê18ê18èI³7èI³7#Å8#Å8v^´7v^´7zU8zU8£vµ7£vµ7Eì8Eì8˜œ¶7˜œ¶7‡8‡8÷7÷7m 8m 8Åç¸7Åç¸7 ¸8 ¸8Jº7Jº7¼G8¼G8³»7³»7Õ8Õ8H ¼7H ¼7=g8=g8Å9½7Å9½7·û8·û8ŸV¾7ŸV¾7�8�8n¿7n¿788àrÀ7àrÀ7 8 8ZjÁ7ZjÁ7/ 8/ 8°_Â7°_Â70œ 80œ 8äRÃ7äRÃ7ƒ 8ƒ 8²JÄ7²JÄ7ù– 8ù– 8?Å7?Å7j 8j 88'Æ78'Æ7½€ 8½€ 8Ç7Ç7Ÿë 8Ÿë 8ÇÔÇ7ÇÔÇ7µP 8µP 8à È7à È7@µ 8@µ 8nnÉ7nnÉ7Ð 8Ð 8::Ê7::Ê7Qz 8Qz 8lË7lË7u× 8u× 8}¾Ë7}¾Ë7ß,8ß,8¡kÌ7¡kÌ7éz8éz8Í7Í7ÇÄ8ÇÄ8­Í7­Í7› 8› 8HEÎ7HEÎ7“L8“L8[ÕÎ7[ÕÎ7?‰8?‰89ZÏ79ZÏ7~¾8~¾8ÎÒÏ7ÎÒÏ7sî8sî8+CÐ7+CÐ7°8°8©Ð7©Ð7\=8\=8XÑ7XÑ7@\8@\8ëWÑ7ëWÑ7‰u8‰u8ÍŸÑ7ÍŸÑ7éˆ8éˆ8¸ßÑ7¸ßÑ7˜8˜8eÒ7eÒ7�£8�£8MÒ7MÒ7"¬8"¬8“{Ò7“{Ò7š¯8š¯8žÒ7žÒ7 «8 «8v²Ò7v²Ò7ÉŸ8ÉŸ8J»Ò7J»Ò7_�8_�8ð·Ò7ð·Ò71v81v8Õ±Ò7Õ±Ò7^8^8ž¨Ò7ž¨Ò7ò@8ò@89“Ò79“Ò71818$tÒ7$tÒ7 ô8 ô8�IÒ7�IÒ7³Ã8³Ã8–Ò7–Ò7‘8‘8êßÑ7êßÑ7QZ8QZ8R�Ñ7R�Ñ7)8)8àLÑ7àLÑ7ñÕ8ñÕ8ZòÐ7ZòÐ7I‰8I‰8ZˆÐ7ZˆÐ7 68 68®Ð7®Ð7ß 8ß 8Ô�Ï7Ô�Ï7Í€ 8Í€ 8 Ï7 Ï7¢ 8¢ 8ÕÎ7ÕÎ7¯ 8¯ 8àÍ7àÍ7æ< 8æ< 8“7Í7“7Í7@Ç 8@Ç 8ŸŠÌ7ŸŠÌ7èM 8èM 8IÔË7IÔË7žÎ 8žÎ 8fË7fË7ÖJ 8ÖJ 8LÊ7LÊ7s¿ 8s¿ 8XtÉ7XtÉ7h- 8h- 8E“È7E“È7ù•8ù•8E¦Ç7E¦Ç7¸÷8¸÷8£°Æ7£°Æ7gV8gV8ÿ´Å7ÿ´Å7«®8«®8õ¨Ä7õ¨Ä7^þ8^þ8†’Ã7†’Ã7FJ8FJ8tÂ7tÂ7Û�8Û�8QKÁ7QKÁ7CÒ8CÒ8H!À7H!À7Û8Û8Bï¾7Bï¾7(L8(L8㯽7㯽7q€8q€8�j¼7�j¼7I°8I°8¸»7¸»7mµÿ7mµÿ7qŹ7qŹ7¬þ7¬þ7kl¸7kl¸7§Nü7§Nü7’·7’·7߉ú7߉ú7˜šµ7˜šµ7,¾ø7,¾ø7-&´7-&´7=çö7=çö7}¨²7}¨²7Ú õ7Ú õ7Ò'±7Ò'±7.'ó7.'ó7c ¯7c ¯7D;ñ7D;ñ7 ®7 ®7~Gï7~Gï7{¬7{¬7oJí7oJí7¥Ûª7¥Ûª7¯Dë7¯Dë7ò7©7ò7©7ò:é7ò:é7=�§7=�§7î+ç7î+ç7‚å¥7‚å¥7å7å7£5¤7£5¤7ßüâ7ßüâ7ÿz¢7ÿz¢7±Ôà7±Ôà7Û· 7Û· 7Œ¦Þ7Œ¦Þ7 ñž7 ñž7§sÜ7§sÜ7g(�7g(�7BÚ7BÚ7ãc›7ãc›7­Ø7­Ø7Á�™7Á�™7áÛÕ7áÛÕ7øÑ—7øÑ—7€ Ó7€ Ó7¸–7¸–7`Ñ7`Ñ7.”7.”7 Ï7 Ï7‰Y’7‰Y’75ØÌ75ØÌ7Dˆ�7Dˆ�7U–Ê7U–Ê7F·Ž7F·Ž7�SÈ7�SÈ7bæŒ7bæŒ7JÆ7JÆ7O‹7O‹7ÑÄÃ7ÑÄÃ7Y8‰7Y8‰7iuÁ7iuÁ7Ä\‡7Ä\‡7%¿7%¿7D�…7D�…7 Õ¼7 Õ¼7¨ƒ7¨ƒ7̆º7̆º7CÐ�7CÐ�7±7¸7±7¸7:ì7:ì7 äµ7 äµ7p1|7p1|7ô�³7ô�³7Osx7Osx7y5±7y5±78³t78³t71Ü®71Ü®7Kóp7Kóp7™‚¬7™‚¬73m73m7’'ª7’'ª7Ìqi7Ìqi7ã̧7ã̧7´e7´e7Žs¥7Žs¥7Húa7Húa7Ô£7Ô£7©D^7©D^7ÀÅ 7ÀÅ 7¿’Z7¿’Z73pž73pž7ÝáV7ÝáV7jœ7jœ7½5S7½5S7¥É™7¥É™7$’O7$’O7Ó{—7Ó{—7öK7öK7Û0•7Û0•7œ_H7œ_H7Äç’7Äç’7‰ÌD7‰ÌD7²Ÿ�7²Ÿ�7‹7 Ô>7.Èì6.Èì6Ûñ:7Ûñ:7/ç6/ç6à77à77Öiá6Öiá6XG37XG37èØÛ6èØÛ6–�/7–�/7³[Ö6³[Ö63È+73È+7úÐ6úÐ6¢(7¢(7²Ë6²Ë6À}$7À}$7z|Æ6z|Æ6¨è 7¨è 7åZÁ6åZÁ6œ[7œ[7QD¼6QD¼6šÕ7šÕ7d?·6d?·66[76[7:R²6:R²6.í7.í7Ã{­6Ã{­6XŒ7XŒ7³À¨6³À¨6N9 7N9 7Ȥ6Ȥ6ïï7ïï7`‡Ÿ6`‡Ÿ6¤²7¤²7- ›6- ›6*�7*�7ö£–6ö£–6ˆµþ6ˆµþ6ýS’6ýS’6þ…ø6þ…ø66Ž66Ž6§mò6§mò6òø‰6òø‰6#iì6#iì6¦é…6¦é…6£}æ6£}æ67í�67í�6Ê£à6Ê£à6ôÿ{6ôÿ{6XÞÚ6XÞÚ6íOt6íOt6ˆ1Õ6ˆ1Õ6áÇl6áÇl63šÏ63šÏ69ke69ke6ÅÊ6ÅÊ6A^6A^6—¼Ä6—¼Ä6ñ=W6ñ=W67o¿67o¿6y_P6y_P68º68º6ȦI6ȦI6µ6µ6±C6±C6Ü °6Ü °6$±<6$±<6õ«6õ«6·x66·x66F¦6F¦6f06f06ƒ¡6ƒ¡6»t*6»t*6Ôœ6Ôœ6ë¡$6ë¡$6®8˜6®8˜6äô6äô6µ´“6µ´“6¤n6¤n6G�6G�6ú 6ú 6YðŠ6YðŠ6~Ò6~Ò6h®†6h®†6[¶ 6[¶ 6ß‚6ß‚6ߺ6ߺ6™Ì|6™Ì|6}Áÿ5}Áÿ5ÐÀt6ÐÀt6ëJö5ëJö5SÞl6SÞl6Ãí5Ãí5(e6(e6Á/ä5Á/ä54™]64™]6QÛ5QÛ541V641V6ö Ó5ö Ó5ïîN6ïîN6ÌÊ5ÌÊ54ÍG64ÍG6ï¼Â5ï¼Â54Ï@64Ï@6äåº5äåº5dö96dö96/F³5/F³5C36C36Fá«5Fá«5å·,6å·,6$¹¤5$¹¤5ÓR&6ÓR&6šÅ�5šÅ�5Ó 6Ó 6—5—5Àð6Àð6»o�5»o�5ðð6ðð6/ Š5/ Š5q6q6¬Õƒ5¬Õƒ5øZ6øZ6é°{5é°{5ªÇ6ªÇ6æp5æp5ï¯ú5ï¯ú5Ïéd5Ïéd5þð5þð5µZ5µZ5βå5βå5›zO5›zO5ö“Û5ö“Û5šDE5šDE5ظÑ5ظÑ5Œh;5Œh;5 È5 È5¶ä15¶ä15ʾ5ʾ5´(5´(5I²µ5I²µ5¯Ð5¯Ð52ج52ج5Õ95Õ959<¤59<¤5Ûï5Ûï5ˆÝ›5ˆÝ›5˜ñ5˜ñ5C¾“5C¾“5n†þ4n†þ4ÜÝ‹5ÜÝ‹5Ò½ï4Ò½ï4:„5:„5–ƒá4–ƒá44£y54£y5pÎÓ4pÎÓ4øCk5øCk5?—Æ4?—Æ4jW]5jW]5Ôå¹4Ôå¹4uâO5uâO5w¾­4w¾­45äB55äB5Å¢4Å¢4Y[65Y[65Œø–4Œø–4[B*5[B*5¯FŒ4¯FŒ4Q•5Q•5-‚4-‚4NV5NV5únp4únp4x‡5x‡5w¼]4w¼]4æOü4æOü4òK4òK4¥nè4¥nè4;4;4šaÕ4šaÕ4W×*4W×*49'Ã49'Ã4÷{4÷{4F±4F±4·ê 4·ê 4”0¡4”0¡48Hþ38Hþ3 v‘4 v‘4Vä3Vä3�‚4�‚4åË3åË3÷óh4÷óh4dí´3dí´3RhN4RhN4€gŸ3€gŸ3w54w54÷F‹3÷F‹3Ñ 4Ñ 4j&q3j&q3¼i4¼i4&�N3&�N3×›è3×›è3P».3P».3ÇšÃ3ÇšÃ39¤39¤3ãÌ¡3ãÌ¡3xqî2xqî2`-ƒ3`-ƒ3¦é¾2¦é¾2�€O3�€O3d´”2d´”2ò 3ò 3 ‰_2 ‰_29ûé29ûé2+3 2+3 2‚³¢2‚³¢2ô¼Ö1ô¼Ö1‹‹P2‹‹P2f‚1f‚1köê1köê1ßõ1ßõ1ƒ1Q1ƒ1Q1ÜÔ?0ÜÔ?0ÄŒQ0ÄŒQ0åª.åª.././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/BinauralDecoder/Source/EQ/AKG-K701.wavIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/BinauralDecoder/Source/EQ/AKG-K701.w0000664002537200253720000004013015257173642030627 0ustar zmoelnigzmoelnigRIFFP@WAVEfmt €»Ü factPEAKàc Y/GJ?/GJ?data@/GJ?/GJ?‹N÷½‹N÷½P‹a=P‹a=)H=)H=ïy?¾ïy?¾×h½×h½6Ùû6ÙûÂÍ!¼ÂÍ!¼Ì¡ ¾Ì¡ ¾|:½|:½©¢O=©¢O=Dý=Dý=™¡Ë=™¡Ë=(”2=(”2=ÔD÷¼ÔD÷¼B½B½¹ËÖ:¹ËÖ:JÄN9:>N9:Œi«9Œi«9ªz:ªz:æ³:æ³:°€;°€;á?;á?;ÅI-;ÅI-;;;;;{3 ;{3 ;m;m;lü:lü:=>ø:=>ø:ºµ:ºµ:?ãÛ:?ãÛ:ÒlÑ:ÒlÑ:þ ;þ ;«P÷:«P÷:ݨ ;ݨ ;1ôí:1ôí:Œö ;Œö ;ép;ép;¾¥;¾¥;t¨é:t¨é:‘ë:‘ë:¢�ª:¢�ª:é2Å:é2Å:ŸA¢:ŸA¢:ýVÈ:ýVÈ:0t�:0t�:ó-¼:ó-¼:X›:X›:BuÐ:BuÐ:ÏÙÀ:ÏÙÀ:ûéô:ûéô:åÕ:åÕ:ÍPû:ÍPû:‚½Ú:‚½Ú:î;î;—Çé:—Çé:mÁ;mÁ;Ì�æ:Ì�æ:­r;­r;צç:צç:ç ;ç ;ãŒú:ãŒú:Ÿ‚;Ÿ‚;æÝ;æÝ;™;™;3y;3y;ŒR;ŒR;ç;ç;â/;â/;«;«;ÿ+;ÿ+;ä�ü:ä�ü:m;;m;;´ ú:´ ú:Q’ ;Q’ ;wwñ:wwñ:“k ;“k ;2ëì:2ëì: ; ;sþì:sþì:¶Ì;¶Ì;ç:ç:ØW;ØW;J”â:J”â:�Í;�Í;Óâ:Óâ:ê;ê;ó¦Þ:ó¦Þ:uˆ;uˆ;\Û:\Û:›3;›3;ã€Û:ã€Û:[¡þ:[¡þ: ×: ×:2†ù:2†ù:ÛÁÓ:ÛÁÓ:7Lø:7Lø:â¸Ò:â¸Ò:Ñlõ:Ñlõ:ˆöÍ:ˆöÍ:kð:kð:%Ê:%Ê:f8í:f8í:•¥Å:•¥Å:CBæ:CBæ:½:½:p Þ:p Þ:3n¶:3n¶:VlØ:VlØ:©X°:©X°:éõÐ:éõÐ:� ¨:� ¨:‚É:‚É:æy¢:æy¢:™ Å:™ Å:üÛ�:üÛ�:»P¿:»P¿:õ]—:õ]—:.R¹:.R¹:i�’:i�’:mUµ:mUµ:‚~Ž:‚~Ž:¯°:¯°:ص‰:ص‰:-’¬:-’¬:þ†:þ†:�€ª:�€ª:âç„:âç„:ßp¨:ßp¨:êÙ‚:êÙ‚:0§:0§:8«‚:8«‚:V ¨:V ¨:5„:5„:hF©:hF©:qó„:qó„:–ª:–ª:Ü—†:Ü—†:½Ç¬:½Ç¬:ØÁ‰:ØÁ‰:¼}¯:¼}¯:äÍ‹:äÍ‹:°v±:°v±:@~Ž:@~Ž:µ:µ:UD’:UD’:jG¸:jG¸:ù”:ù”:{äº:{äº:f ˜:f ˜:Pn¾:Pn¾:ž‡›:ž‡›:ëXÁ:ëXÁ:ð�:ð�:)¥Ã:)¥Ã:Òx :Òx :MKÆ:MKÆ:·Í¢:·Í¢:êþÇ:êþÇ:ÿ¤:ÿ¤:@FÉ:@FÉ:'š¥:'š¥:ðÄÊ:ðÄÊ:R˜¦:R˜¦:ì Ë:ì Ë:mx¦:mx¦:·÷Ê:·÷Ê:=«¦:=«¦:«8Ë:«8Ë:�¦:�¦:D~Ê:D~Ê:pf¥:pf¥:d=É:d=É:E¤:E¤:°È:°È:ËÙ¢:ËÙ¢:†!Æ:†!Æ:ÿR :ÿR :®EÃ:®EÃ:ºk�:ºk�:_À:_À:jXš:jXš:ïè¼:ïè¼:â�–:â�–:¢ ¹:¢ ¹:ëÛ’:ëÛ’:‰ƒµ:‰ƒµ:ªN�:ªN�:C©±:C©±:{%‹:{%‹:m­:m­:â$‡:â$‡:Ш©:Ш©:½[ƒ:½[ƒ:x•¥:x•¥:v~:v~:"e¡:"e¡:€³v:€³v:6ž:6ž:Íòp:Íòp:üY›:üY›:~7k:~7k:¿¥˜:¿¥˜:g}f:g}f:8’–:8’–:ú–b:ú–b:i—”:i—”:,©^:,©^:ƒÇ’:ƒÇ’:°š[:°š[:=y‘:=y‘:+Y:+Y:<�:<�:éÎV:éÎV:[;�:[;�:-IU:-IU:g˜Ž:g˜Ž:˜üS:˜üS:¾Ö�:¾Ö�:qR:qR:j3�:j3�:žQ:žQ:sáŒ:sáŒ:YÓP:YÓP:eTŒ:eTŒ:â­O:â­O:iá‹:iá‹:ÍO:ÍO:#š‹:#š‹:ZDN:ZDN:ÝöŠ:ÝöŠ:ÅÃL:ÅÃL:79Š:79Š:ÇqK:ÇqK:3�‰:3�‰:'øI:'øI:˜°ˆ:˜°ˆ:í H:í H:¯‡:¯‡:©F:©F:,�†:,�†:<«C:<«C:ÃK…:ÃK…:«ç@:«ç@:çƒ:çƒ:Õ">:Õ">:‰s‚:‰s‚:Á ;:Á ;:NÊ€:NÊ€:éž7:éž7:¸&~:¸&~:´;4:´;4:¾±z:¾±z:Ö®0:Ö®0:Ç w:Ç w:-:-:I‰s:I‰s:&¸):&¸):¾Hp:¾Hp:‘&:‘&:'m:'m:$t#:$t#:ùj:ùj:÷O :÷O :‰Ïf:‰Ïf:­:­:|Šc:|Šc:Jà:Jà:Œo`:Œo`:9Û:9Û:£`]:£`]:[È:[È:Ã\Z:Ã\Z:Žú:Žú:—½W:—½W:Ko:Ko:öU:öU:í´ :í´ :£^R:£^R:‹" :‹" :mëO:mëO:%»:%»:|rM:|rM:•G:•G:ªK:ªK:¾&:¾&:"I:"I:::óF:óF:Ûöû9Ûöû9sèD:sèD:A@ø9A@ø9˜C:˜C:Œ¡ô9Œ¡ô9E9A:E9A:£ëð9£ëð9x?:x?:vÊí9vÊí9Uí=:Uí=:»jê9»jê9Z<:Z<:ÔÁæ9ÔÁæ9w`::w`::©ã9©ã9Ö8:Ö8:Jvà9Jvà9-*7:-*7:z?Ý9z?Ý9«¬5:«¬5:¦�Ú9¦�Ú9'a4:'a4:Bý×9Bý×9  3:  3:?iÕ9?iÕ92Ñ1:2Ñ1:ÔÓ9ÔÓ9A³0:A³0:ïÐ9ïÐ9 –/: –/:íÈÎ9íÈÎ9Ï�.:Ï�.:nñÌ9nñÌ9w¨-:w¨-:gË9gË9x¨,:x¨,:‰É9‰É9Ƽ+:Ƽ+:ä~Ç9ä~Ç9ô*:ô*:3îÅ93îÅ9"!*:"!*:ë\Ä9ë\Ä9Üj):Üj):Î#Ã9Î#Ã9£É(:£É(:aºÁ9aºÁ9’÷':’÷':À9À9.':.':*¨¾9*¨¾9`q&:`q&:7 ½97 ½9­�%:­�%:û\»9û\»9qÐ$:qÐ$:Rº9Rº9´ $:´ $:õ¸9õ¸9/5#:/5#:>¥¶9>¥¶9îQ":îQ":ÿ´9ÿ´9óo!:óo!:)³9)³9ËU :ËU :Gϰ9Gϰ9Í?:Í?:T¹®9T¹®9õ':õ':…j¬9…j¬9Dì:Dì:¾ò©9¾ò©9-²:-²:‰Ž§9‰Ž§9¼s:¼s:Zö¤9Zö¤9»:»:_/¢9_/¢9h«:h«:ÇaŸ9ÇaŸ964:64:ÛNœ9ÛNœ9£�:£�:Yò˜9Yò˜9Ý:Ý:D •9D •9ê/:ê/:˜<’9˜<’9#p:#p:–ÁŽ9–ÁŽ9Ë· :Ë· :l‹9l‹9µ :µ :Þï‡9Þï‡9I4 :I4 :½M„9½M„99f:9f:ýÅ€9ýÅ€9*œ:*œ:/[z9/[z9ÄÌ:ÄÌ:·cs9·cs9_ :_ :jm9jm9;†:;†:\�f9\�f9AÅÿ9AÅÿ92>`92>`9#Âü9#Âü9³ŽZ9³ŽZ9:æù9:æù9û½T9û½T9Téö9Téö9ÂøN9ÂøN9û)ô9û)ô9:ÕI9:ÕI9{˜ñ9{˜ñ9º D9º D9(éî9(éî9k?9k?9Íhì9Íhì9{·:9{·:9gê9gê9"69"69žºç9žºç9Nž19Nž19'—å9'—å9�“-9�“-9�ã9�ã9°„)9°„)9}á9}á9*Š%9*Š%9ÏŽß9ÏŽß9'à!9'à!9¼¶Ý9¼¶Ý9b<9b<9FäÛ9FäÛ9¸Ò9¸Ò9¬AÚ9¬AÚ9a¸9a¸9±©Ø9±©Ø9¡…9¡…9(×9(×9ef9ef9zÕ9zÕ9UW9UW9óáÓ9óáÓ9L% 9L% 9˜?Ò9˜?Ò9ú9ú9]¦Ð9]¦Ð9%Ð9%Ð9³Ï9³Ï9‰�9‰�9àLÍ9àLÍ9ŒOü8ŒOü8ÖË9ÖË9{õ8{õ8{ÎÉ9{ÎÉ9†Fî8†Fî8çóÇ9çóÇ9Òç8Òç8Æ9Æ9iŸß8iŸß8ñ#Ä9ñ#Ä9†j×8†j×8BÿÁ9BÿÁ9ïÎ8ïÎ8AÜ¿9AÜ¿9wÆ8wÆ8M«½9M«½9 ›½8 ›½8g»9g»9-»´8-»´8º.¹9º.¹9Mþ«8Mþ«8ªó¶9ªó¶9€£8€£8ʬ´9ʬ´9Ô š8Ô š8@_²9@_²9ÑÖ�8ÑÖ�8°9°9µ‡8µ‡8B¬­9B¬­9<À|8<À|8`\«9`\«9:?j8:?j8/©9/©9ñÂW8ñÂW8$µ¦9$µ¦9 éE8 éE8ko¤9ko¤9‰­38‰­38¢9¢9íŸ!8íŸ!8ߟ9ߟ9Œç8Œç8w–�9w–�9¬ û7¬ û7�@›9�@›9{Ö7{Ö7{õ˜9{õ˜9¾+²7¾+²7 ¢–9 ¢–9u5�7u5�7«S”9«S”9¡S7¡S7[$’9[$’9`;7`;7|÷�9|÷�9º”6º”6GÎ�9GÎ�9Zé4Zé4/µ‹9/µ‹9oçk¶oçk¶G–‰9G–‰9Œ•ü¶Œ•ü¶Çy‡9Çy‡9i?·i?·Àv…9Àv…9”Þ}·”Þ}·}}ƒ9}}ƒ9xž·xž· ‡�9 ‡�9«‚¼·«‚¼·jD9jD9Ú·Ú·…�{9…�{9Óê÷·Óê÷·Ü·w9Ü·w91¹ ¸1¹ ¸„t9„t9«8¸«8¸¤Pp9¤Pp9Vé'¸Vé'¸ûžl9ûžl9ã6¸ã6¸Li9Li9êÙC¸êÙC¸W�e9W�e9�ýQ¸�ýQ¸ìýa9ìýa9W±_¸W±_¸"š^9"š^9k÷l¸k÷l¸¿)[9¿)[9ÅÐz¸ÅÐz¸~ŸW9~ŸW9œI„¸œI„¸¶,T9¶,T9‹¸‹¸ž¨P9ž¨P9m’¸m’¸='M9='M9Îј¸Îј¸ìÆI9ìÆI9‡xŸ¸‡xŸ¸…_F9…_F9ƒ&¦¸ƒ&¦¸ðC9ðC9K—¬¸K—¬¸šÉ?9šÉ?99³¸9³¸ò|<9ò|<9�¹¸�¹¸;:99;:99¦Ê¿¸¦Ê¿¸X69X69‰Ƹ‰Ƹlß29lß29LO̸LO̸®¶/9®¶/9e[Ò¸e[Ò¸L³,9L³,9ÜAظÜAظMª)9Mª)9q@Þ¸q@޸ʥ&9Ê¥&9Õä¸Õä¸ÇÃ#9ÇÃ#9i®é¸i®é¸ƒØ 9ƒØ 9wï¸wï¸$ì9$ì9õ¸õ¸Æ9Æ9o‡ú¸o‡ú¸1R91R9Þ ¹Þ ¹X�9X�9™½¹™½¹Ñ9Ñ9ÑY¹ÑY¹F"9F"9õÿ¹õÿ¹ùr 9ùr 9û“ ¹û“ ¹xÜ 9xÜ 9“ ¹“ ¹:9:9 »¹ »¹r‘9r‘9K¹K¹}ü9}ü9mÔ¹mÔ¹�]9�]9¤i¹¤i¹#€û8#€û8Qî¹Qî¹ lö8 lö8žk¹žk¹ïHñ8ïHñ8Šó¹Šó¹Õ&ì8Õ&ì8Ûn!¹Ûn!¹ôç8ôç8´ò#¹´ò#¹üÙá8üÙá8p‰&¹p‰&¹e£Ü8e£Ü8h)¹h)¹mž×8mž×84�+¹4�+¹êzÒ8êzÒ87.¹7.¹ eÍ8 eÍ8“y0¹“y0¹ZnÈ8ZnÈ8Uï2¹Uï2¹vRÃ8vRÃ8t5¹t5¹æ7¾8æ7¾8ùí7¹ùí7¹B&¹8B&¹8Ùs:¹Ùs:¹nè³8nè³8Ÿ =¹Ÿ =¹“¦®8“¦®8#˜?¹#˜?¹›v©8›v©8¢&B¹¢&B¹f1¤8f1¤8]¾D¹]¾D¹ôž8ôž8õEG¹õEG¹;Õ™8;Õ™89ËI¹9ËI¹®Ÿ”8®Ÿ”8—`L¹—`L¹GS�8GS�8ûN¹ûN¹¤ÿ‰8¤ÿ‰8’œQ¹’œQ¹/–„8/–„8†HT¹†HT¹DG~8DG~8£òV¹£òV¹^rs8^rs8%›Y¹%›Y¹“h8“h8¸G\¹¸G\¹¬]8¬]8æö^¹æö^¹é›R8é›R8 ºa¹ ºa¹D0G8D0G84Œd¹4Œd¹ú»;8ú»;86[g¹6[g¹�908�908?8j¹?8j¹`t$8`t$86m¹6m¹£½8£½8Fýo¹Fýo¹Åï 8Åï 8îr¹îr¹nÞ8nÞ8ðåu¹ðåu¹¬é7¬é7±Üx¹±Üx¹ÙZÑ7ÙZÑ77á{¹7á{¹`¸¸7`¸¸7,è~¹,è~¹„ 7„ 7Ûù€¹Ûù€¹Ñ‡7ч7*†‚¹*†‚¹—×[7—×[7„¹„¹÷“)7÷“)7 …¹ …¹ÉPí6ÉPí6®2‡¹®2‡¹‹‡6‹‡6`ň¹`ň¹ùÑ�5ùÑ�5Œ\йŒ\йž¶ž¶€÷‹¹€÷‹¹±°¶±°¶À”�¹À”�¹ã¿ ·ã¿ ·7�¹7�¹çòA·çòA·°Ù�¹°Ù�¹ïöv·ïöv·Ã|’¹Ã|’¹øF–·øF–·­'”¹­'”¹!‰±·!‰±·oÖ•¹oÖ•¹¾ÕÌ·¾ÕÌ·†—¹†—¹³eè·³eè·8=™¹8=™¹ñ7¸ñ7¸Iùš¹Iùš¹œL¸œL¸z¶œ¹z¶œ¹Úz¸Úz¸pzž¹pzž¹ƒí,¸ƒí,¸‹D ¹‹D ¹f;¸f;¸5 ¢¹5 ¢¹EÃI¸EÃI¸ÅÑ£¹ÅÑ£¹6X¸6X¸Cš¥¹Cš¥¹á™f¸á™f¸F^§¹F^§¹åét¸åét¸×$©¹×$©¹=±�¸=±�¸‹íª¹‹íª¹‘ሸ‘ሸ¤±¬¹¤±¬¹• �¸• �¸ˆw®¹ˆw®¹B9—¸B9—¸B9°¹B9°¹”Bž¸”Bž¸æñ±¹æñ±¹º;¥¸º;¥¸¸«³¹¸«³¹÷;¬¸÷;¬¸bcµ¹bcµ¹ !³¸ !³¸C·¹C·¹<ò¹¸<ò¹¸Á¸¹Á¸¹Q¼À¸Q¼À¸Ijº¹Ijº¹ eǸ eǸf ¼¹f ¼¹�ô͸�ô͸"§½¹"§½¹ïuÔ¸ïuÔ¸™=¿¹™=¿¹*ÔÚ¸*ÔÚ¸¸ËÀ¹¸ËÀ¹gá¸gá¸W¹W¹ÕXç¸ÕXç¸ÜùÜù÷qí¸÷qí¸…YŹ…YŹQ{ó¸Q{ó¸ðÕÆ¹ðÕÆ¹×€ù¸×€ù¸ûNȹûNȹ~lÿ¸~lÿ¸™Àɹ™Àɹ¦¡¹¦¡¹ 0˹ 0˹ÿ‰¹ÿ‰¹Ê›Ì¹Ê›Ì¹_e¹_e¹ÇιÇιN9 ¹N9 ¹�eϹ�eϹB¹B¹8Èй8Èй˜×¹˜×¹,$Ò¹,$Ò¹R˜¹R˜¹.~Ó¹.~Ó¹0T¹0T¹æÒÔ¹æÒÔ¹:¹:¹èÖ¹èÖ¹k¢¹k¢¹{j×¹{j×¹?¹?¹D¯Ø¹D¯Ø¹¢É ¹¢É ¹¤êÙ¹¤êÙ¹\G#¹\G#¹#Û¹#Û¹s¿%¹s¿%¹äTܹäTܹû!(¹û!(¹Ø{ݹØ{ݹüw*¹üw*¹ˆ¡Þ¹ˆ¡Þ¹¶Ì,¹¶Ì,¹�Âß¹�Âß¹k/¹k/¹ÒØà¹ÒØà¹5@1¹5@1¹}êá¹}êṌi3¹Œi3¹6õâ¹6õâ¹-5¹-5¹ öã¹ öã¹�†7¹�†7¹Ÿò也ò乆9¹†9¹%éå¹%éå¹¼u;¹¼u;¹uØæ¹uØæ¹¿[=¹¿[=¹!Äç¹!Äç¹.7?¹.7?¹‘§è¹‘§è¹9ÿ@¹9ÿ@¹¿‚鹿‚鹉¼B¹‰¼B¹#Zê¹#Z깦oD¹¦oD¹¥)ë¹¥)ë¹*F¹*F¹(ñë¹(ñë¹U¥G¹U¥G¹ä³ì¹ä³ì¹�.I¹�.I¹"oí¹"oí¹ª¨J¹ª¨J¹‚$$î¹ÍL¹ÍL¹º××î¹±ˆM¹±ˆM¹‚…﹂…ï¹ÁçN¹ÁçN¹,-ð¹,-ð¹?P¹?P¹‘Òð¹‘Òð¹’�Q¹’�Q¹Ërñ¹Ërñ¹iÔR¹iÔR¹ ò¹ ò¹ST¹ST¹§ò¹§ò¹dOU¹dOU¹N>ó¹N>󹂃V¹‚ƒV¹Ñó¹Ñó¹¢³W¹¢³W¹bdô¹bdô¹háX¹háX¹Wóô¹Wóô¹÷Z¹÷Z¹ø}õ¹ø}õ¹z#[¹z#[¹šö¹šö¹î@\¹î@\¹3�ö¹3�ö¹·V]¹·V]¹Û÷¹Û÷¹ìh^¹ìh^¹»—÷¹»—÷¹Ôt_¹Ôt_¹7ø¹7ø¹Þx`¹Þx`¹p’ø¹p’ø¹ëya¹ëya¹Q ù¹Q ù¹gsb¹gsb¹í�ù¹í�ù¹fc¹fc¹:õù¹:õù¹¾Sd¹¾Sd¹�dú¹�dú¹6e¹6e¹ûÍú¹ûÍú¹èf¹èf¹¼4û¹¼4û¹÷ãf¹÷ãf¹?—û¹?—û¹„­g¹„­g¹ñôû¹ñôû¹_ph¹_ph¹@Pü¹@Pü¹-i¹-i¹æ¦ü¹æ¦ü¹ÈÞi¹ÈÞi¹Óøü¹Óøü¹ž‰j¹ž‰j¹ÌGý¹ÌGý¹‰-k¹‰-k¹©’ý¹©’ý¹lÈk¹lÈk¹àØý¹àØý¹Õ¹ >չ蒹蒹ÿÔ¹ÿÔ¹XI¹XI¹0íÒ¹0íÒ¹ú¹ú¹ïÀѹïÀѹˆ¦¹ˆ¦¹s’йs’йÅM¹ÅM¹,aϹ,aϹ¹ï¹¹ï¹—-ι—-ι+�¹+�¹�÷̹�÷̹O% ¹O% ¹Î¾Ë¹Î¾Ë¹ç· ¹ç· ¹^ƒÊ¹^ƒÊ¹EE¹EE¹aEɹaEɹÇ͹Ç͹8ȹ8ȹyR¹yR¹jÃÆ¹jÃÆ¹µ§ÿ¸µ§ÿ¸¥Ź¥ʵ ú¸µ ú¸.9Ĺ.9Ĺ”�õ¸”�õ¸²ð¹²ð¹Fwð¸Fwð¸2¦Á¹2¦Á¹’U븒Uë¸aYÀ¹aYÀ¹Y,æ¸Y,æ¸h ¿¹h ¿¹ºá¸ºá¸ù¼½¹ù¼½¹½ÑÛ¸½ÑÛ¸>m¼¹>m¼¹_�Ö¸_�Ö¸¨»¹¨»¹gѸgѸv˹¹v˹¹_,̸_,̸ðx¸¹ðx¸¹ÉíÆ¸ÉíÆ¸/&·¹/&·¹…¯Á¸…¯Á¸$Óµ¹$Óµ¹ªm¼¸ªm¼¸ ´¹ ´¹Ó)·¸Ó)·¸ +³¹ +³¹Ë屸Ë屸ªÖ±¹ªÖ±¹áž¬¸áž¬¸À�°¹À�°¹GX§¸GX§¸?-¯¹?-¯¹ ¢¸ ¢¸9Ø­¹9Ø­¹•Èœ¸•Èœ¸À‚¬¹À‚¬¹H—¸H—¸k-«¹k-«¹}4’¸}4’¸ ש¹ ש¹„䌸„䌸÷¨¹÷¨¹Ä•‡¸Ä•‡¸Õ)§¹Õ)§¹OI‚¸OI‚¸_Ó¥¹_Ó¥¹&óy¸&óy¸�|¤¹�|¤¹šWo¸šWo¸Ÿ&£¹Ÿ&£¹Ñ¾d¸Ñ¾d¸С¹С¹Z¸Z¸þx ¹þx ¹q~O¸q~O¸¯"Ÿ¹¯"Ÿ¹ãD¸ãD¸Ì�¹Ì�¹ô?:¸ô?:¸Ÿtœ¹Ÿtœ¹Ò�/¸Ò�/¸›¹›¹%¸%¸¿Ç™¹¿Ç™¹[d¸[d¸`q˜¹`q˜¹ÈʸÈʸò—¹ò—¹§7¸§7¸ÊÆ•¹ÊÆ•¹GEõ·GEõ·uq”¹uq”¹¾à·¾à·É“¹É“¹¤Ë·¤Ë·3È‘¹3È‘¹âµ·âµ·Às�¹Às�¹!Р·!Р·Ü �¹Ü �¹(Ö‹·(Ö‹·ÐÎ�¹ÐÎ�¹Œ»m·Œ»m·¾|Œ¹¾|Œ¹IØC·IØC·”+‹¹”+‹¹W·W·ÈÚ‰¹ÈÚ‰¹þŠà¶þŠà¶#Šˆ¹#Šˆ¹E1�¶E1�¶ ;‡¹ ;‡¹°éµ°éµPí…¹Pí…¹ØÎC5ØÎC5¡ „¹¡ „¹â€U6â€U6Vƒ¹Vƒ¹ú�¼6ú�¼6Q ‚¹Q ‚¹6767aÀ¹aÀ¹mß/7mß/7­ù~¹­ù~¹rOX7rOX7+n|¹+n|¹àZ€7àZ€7oäy¹oäy¹ëo”7ëo”7n_w¹n_w¹5f¨75f¨7ÏÜt¹ÏÜt¹çM¼7çM¼7÷\r¹÷\r¹wÐ7wÐ7“áo¹“áo¹)¿ã7)¿ã7ìhm¹ìhm¹ÇV÷7ÇV÷7ój¹ój¹h8h8y�h¹y�h¹Ò8Ò8|f¹|f¹‹»8‹»8 §c¹ §c¹�L"8�L"85Aa¹5Aa¹·É+8·É+89ß^¹9ß^¹|958|958a�\¹a�\¹3”>83”>8/)Z¹/)Z¹µÛG8µÛG8’ÔW¹’ÔW¹kQ8kQ8£ƒU¹£ƒU¹�>Z8�>Z8ê8S¹ê8S¹ÅNc8ÅNc8uòP¹uòP¹XRl8XRl8ޝN¹Ž¯N¹ªBu8ªBu8crL¹crL¹½~8½~8k9J¹k9J¹?uƒ8?uƒ8ÞH¹ÞH¹õχ8õχ8¨ÖE¹¨ÖE¹U Œ8U Œ80¬C¹0¬C¹µi�8µi�8a†A¹a†A¹É§”8ɧ”8øe?¹øe?¹½Ý˜8½Ý˜8ÊH=¹ÊH=¹@ �8@ �8Ì0;¹Ì0;¹™.¡8™.¡8 9¹ 9¹RG¥8RG¥8È7¹È7¹ÑV©8ÑV©895¹95¹P[­8P[­8Ç3¹Ç3¹KW±8KW±8D1¹D1¹dJµ8dJµ8' /¹' /¹ê1¹8ê1¹8ž-¹ž-¹ ½8 ½8†'+¹†'+¹õßÀ8õßÀ8-?)¹-?)¹q£Ä8q£Ä8]'¹]'¹Ü[È8Ü[È8e€%¹e€%¹%Ì8%Ì8Šª#¹Šª#¹{¦Ï8{¦Ï8mÛ!¹mÛ!¹œ8Ó8œ8Ó8ï ¹ï ¹¶¿Ö8¶¿Ö8eN¹eN¹â9Ú8â9Ú8›‘¹›‘¹?§Ý8?§Ý8ÎÚ¹ÎÚ¹Ðá8Ðá8\*¹\*¹´\ä8´\ä8�¹�¹ô¢ç8ô¢ç89Þ¹9Þ¹LÜê8LÜê8ÏA¹ÏA¹« î8« î8"«¹"«¹w+ñ8w+ñ8ιι™?ô8™?ô8_‘¹_‘¹éF÷8éF÷8û ¹û ¹Bú8Bú8L‘ ¹L‘ ¹º.ý8º.ý8æ ¹æ ¹99l¬ ¹l¬ ¹q9q94C¹4C¹QÔ9QÔ9ßà¹ßà¹719719^„¹^„¹Kˆ9Kˆ9K.¹K.¹Ø9Ø9÷Þ¹÷Þ¹·"9·"9•¹•¹rg 9rg 9hQ¹hQ¹f¥ 9f¥ 9ÿ(þ¸ÿ(þ¸&Ý 9&Ý 9ýºû¸ýºû¸Ø 9Ø 9;Zù¸;Zù¸­99­99°÷¸°÷¸�^9�^9–¾ô¸–¾ô¸Z}9Z}9&„ò¸&„ò¸ •9 •9eWð¸eWð¸z¦9z¦9Ò6î¸Ò6î¸�±9�±9ö#ì¸ö#츾µ9¾µ9ê¸ê¸´9´9$è¸$è¸å«9å«9Ö7æ¸Ö7æ¸ �9 �9ÛWä¸ÛW丱ˆ9±ˆ9%ƒâ¸%ƒâ¸ n9 n9„¼à¸„¼à¸bL9bL9q߸q߸c%9c%9ÂRݸÂRݸ’ø9’ø9Š°Û¸Š°Û¸ÆÄ9ÆÄ9fÚ¸fÚ¸S‹9S‹9¯�ظ¯�ظsL9sL9-׸-׸=9=9›ŸÕ¸›ŸÕ¸é¼9é¼9D6Ô¸D6Ô¸Òm 9Òm 9&ØÒ¸&ØÒ¸p!9p!9‘†Ñ¸‘†Ñ¸¹½!9¹½!9/>и/>и3^"93^"9�ϸ�ϸ,ø"9,ø"9AÑ͸AÑ͸*�#9*�#9I©Ì¸I©Ì¸Þ$9Þ$9º‹Ë¸º‹Ë¸Ý¨$9ݨ$9ïxʸïxʸk/%9k/%9.nɸ.nɸ–±%9–±%9ÆmȸÆmȸa.&9a.&9RwǸRwǸî¦&9î¦&9‰Æ¸‰Æ¸ì'9ì'9F¥Å¸F¥Å¸¨‰'9¨‰'9¸Êĸ¸Êĸ¤ô'9¤ô'9w÷øw÷ød[(9d[(9P.øP.øþ¼(9þ¼(9\n¸\n¸È)9È)9õµÁ¸õµÁ¸"t)9"t)9óÁ¸óÁ¸`È)9`È)9þbÀ¸þbÀ¸«*9«*9Æ¿¸Æ¿¸{d*9{d*9/3¿¸/3¿¸V«*9V«*9n©¾¸n©¾¸8î*98î*98'¾¸8'¾¸-+9-+9>®½¸>®½¸&g+9&g+9">½¸">½¸œ�+9œ�+9~Ô¼¸~Ô¼¸}Ð+9}Ð+9»s¼¸»s¼¸¢þ+9¢þ+9u¼¸u¼¸�),9�),9É»¸É»¸ãP,9ãP,9’»¸’»¸¿s,9¿s,9œ=»¸œ=»¸Þ“,9Þ“,9¾»¸¾»¸Æ°,9ư,9-̺¸-̺¸mÉ,9mÉ,9Üžº¸Üžº¸Rß,9Rß,9Évº¸Évº¸ò,9ò,9>Vº¸>Vº¸8-98-9¿;º¸¿;º¸þ -9þ -98&º¸8&º¸­-9­-9Ѻ¸Ñº¸2-92-9;º¸;º¸Æ"-9Æ"-9k º¸k º¸O$-9O$-9< º¸< º¸#-9#-9òº¸òº¸w -9w -9º¸º¸š-9š-9‘(º¸‘(º¸,-9,-9§;º¸§;º¸´ -9´ -9îRº¸îRº¸ÿ,9ÿ,9Ãnº¸Ãnº¸Tñ,9Tñ,9JŽº¸JŽº¸Øá,9Øá,9S°º¸S°º¸PÎ,9PÎ,9+Òº¸+Òº¸¶,9¶,9éòº¸éòº¸0™,90™,92»¸2»¸7w,97w,9»3»¸»3»¸QP,9QP,9LS»¸LS»¸ì$,9ì$,9Ur»¸Ur»¸Zô+9Zô+9Õ‘»¸Õ‘»¸È¾+9Ⱦ+9j°»¸j°»¸Â„+9„+9/λ¸/λ¸ãE+9ãE+9”뻸”뻸w+9w+9:¼¸:¼¸»*9»*9U!¼¸U!¼¸o*9o*9{:¼¸{:¼¸»*9»*98R¼¸8R¼¸Ê)9Ê)9!i¼¸!i¼¸¥p)9¥p)9ù~¼¸ù~¼¸9)99)9\’¼¸\’¼¸²(9²(9v£¼¸v£¼¸2M(92M(9â±¼¸â±¼¸Ôä'9Ôä'9p½¼¸p½¼¸Èx'9Èx'9ëÆ¼¸ëƼ¸ß'9ß'9ëͼ¸ëͼ¸�•&9�•&9Ò¼¸Ò¼¸�&9�&9ÖÓ¼¸ÖÓ¼¸¤%9¤%97Ò¼¸7Ò¼¸&%9&%9øÍ¼¸øÍ¼¸¥$9¥$9°Ç¼¸°Ç¼¸E $9E $9³½¼¸³½¼¸ž˜#9ž˜#9’°¼¸’°¼¸Q #9Q #9€¡¼¸€¡¼¸—~"9—~"9ÇŽ¼¸Ç޼¸/í!9/í!9ªx¼¸ªx¼¸/X!9/X!9ø`¼¸ø`¼¸–¿ 9–¿ 9 F¼¸ F¼¸B$ 9B$ 9…'¼¸…'¼¸à…9à…9XX¦ä9¦ä9`໸`໸ß@9ß@97·»¸7·»¸$š9$š9ꊻ¸êŠ»¸žð9žð9øZ»¸øZ»¸jD9jD9†'»¸†'»¸�•9�•9-ðº¸-ðº¸qä9qä9"´º¸"´º¸N19N19°sº¸°sº¸Ì{9Ì{9R/º¸R/º¸0Ä90Ä9¸å¹¸¸å¹¸ 9 9—¹¸—¹¸»O9»O9§D¹¸§D¹¸\’9\’9!í¸¸!í¸¸aÓ9aÓ9‘¸¸‘¸¸$9$9O1¸¸O1¸¸ôN9ôN9BÌ·¸BÌ·¸…Š9…Š9b·¸b·¸>Ä9>Ä9{ó¶¸{󶸆ü9†ü9µ~¶¸µ~¶¸ 49 49’¶¸’¶¸ i9 i9Ɔµ¸Æ†µ¸š�9š�9µ¸µ¸ÏÐ9ÏÐ90z´¸0z´¸Q9Q9 í³¸ í³¸¬2 9¬2 9‡Y³¸‡Y³¸‡b 9‡b 9lÀ²¸lÀ²¸ ‘ 9 ‘ 9Á"²¸Á"²¸o¾ 9o¾ 9o±¸o±¸ë 9ë 9ÌÖ°¸ÌÖ°¸‘ 9‘ 9¥)°¸¥)°¸ã@9ã@9Rw¯¸Rw¯¸aj9aj9 À®¸ À®¸³’9³’9M®¸M®¸ º9 º90C­¸0C­¸Þà9Þà9¶|¬¸¶|¬¸Ù9Ù9m±«¸m±«¸',9',9£àª¸£àª¸ôP9ôP9 ª¸ ª¸µt9µt9R1©¸R1©¸´—9´—9#R¨¸#R¨¸ütÿ8ütÿ8Êm§¸Êm§¸¹ý8¹ý8…¦¸…¦¸Küû8Küû8T–¥¸T–¥¸—?ú8—?ú8½¢¤¸½¢¤¸%�ø8%�ø8D«£¸D«£¸½Áö8½Áö8p®¢¸p®¢¸ýõ8ýõ8R­¡¸R­¡¸”@ó8”@ó8 ¨ ¸ ¨ ¸þ~ñ8þ~ñ8�Ÿ¸�Ÿ¸š½ï8š½ï8ž�ž¸ž�ž¸êúí8êúí8:z�¸:z�¸å7ì8å7ì8¾aœ¸¾aœ¸Ùtê8Ùtê8E›¸E›¸ð°è8ð°è8=$š¸=$š¸Ïìæ8Ïìæ8àþ˜¸àþ˜¸k(å8k(å8ÁÕ—¸ÁÕ—¸cã8cã8Ù¨–¸Ù¨–¸¼�á8¼�á8xw•¸xw•¸fØß8fØß8@B”¸@B”¸�Þ8�Þ81 “¸1 “¸MÜ8MÜ8·Ë‘¸·Ë‘¸Ü‡Ú8܇Ú8~Š�¸~Š�¸PÂØ8PÂØ8ÑE�¸ÑE�¸ÐüÖ8ÐüÖ8Sý�¸Sý�¸y7Õ8y7Õ8l±Œ¸l±Œ¸þqÓ8þqÓ8b‹¸b‹¸Û¬Ñ8Û¬Ñ8+Џ+ЏÞçÏ8ÞçÏ8<¹ˆ¸<¹ˆ¸³"Î8³"Î8I`‡¸I`‡¸Ì]Ì8Ì]Ì8!†¸!†¸™Ê8™Ê8T¥„¸T¥„¸ ÔÈ8 ÔÈ8ñCƒ¸ñCƒ¸=Ç8=Ç8áß�¸áß�¸JJÅ8JJÅ8Ôy€¸Ôy€¸ã„Ã8ã„Ã8p#~¸p#~¸„¿Á8„¿Á8¼N{¸¼N{¸ú¿8ú¿8vx¸vx¸½4¾8½4¾8<™u¸<™u¸—o¼8—o¼8³¸r¸³¸r¸4ªº84ªº8ŽÕo¸ŽÕo¸|ä¸8|ä¸8¼ïl¸¼ïl¸‘·8‘·8²j¸²j¸;Xµ8;Xµ8ªg¸ªg¸Ò‘³8Ò‘³8õ0d¸õ0d¸œË±8œË±8 Ba¸ Ba¸3°83°8ÖQ^¸ÖQ^¸Ÿ>®8Ÿ>®8ð_[¸ð_[¸x¬8x¬8àlX¸àlX¸E±ª8E±ª8ZyU¸ZyU¸Cê¨8Cê¨8î„R¸î„R¸F#§8F#§8ñ�O¸ñ�O¸K\¥8K\¥8*šL¸*šL¸¢•£8¢•£8È£I¸È£I¸ÿΡ8ÿΡ8”­F¸”­F¸} 8} 8í¶C¸í¶C¸{Bž8{Bž84À@¸4À@¸|œ8|œ8°Ê=¸°Ê=¸^¶š8^¶š8&Ö:¸&Ö:¸nð˜8nð˜8�â7¸�â7¸‰*—8‰*—8Çð4¸Çð4¸œd•8œd•8ˆ2¸ˆ2¸óž“8óž“8Û/¸Û/¸_Ù‘8_Ù‘8©%,¸©%,¸»�8»�8ê;)¸ê;)¸5NŽ85NŽ8îT&¸îT&¸ŠˆŒ8ŠˆŒ8ˆq#¸ˆq#¸¨ÂŠ8¨ÂŠ8‡‘ ¸‡‘ ¸èüˆ8èüˆ8¾´¸¾´¸57‡857‡8ýÛ¸ýÛ¸Pq…8Pq…8}¸}¸‰«ƒ8‰«ƒ8½6¸½6¸öå�8öå�8Žj¸Žj¸@ €8@ €80£¸0£¸‚µ|8‚µ|82à ¸2à ¸ï*y8ï*y8l" ¸l" ¸Q u8Q u8Ýi¸Ýi¸pr8pr81¶¸1¶¸)�n8)�n8¸¸k8k8[¾þ·[¾þ·$}g8$}g8wù·wù·¡öc8¡öc8Ð;ô·Ð;ô·q`8q`8¯ ï·¯ ï·í\8í\8çé·çé· jY8 jY8¼Ïä·¼Ïä·èU8èU8TÄß·TÄß·>hR8>hR8ÁÄÚ·ÁÄÚ·ðéN8ðéN8­ÒÕ·­ÒÕ·.mK8.mK8EíзEíзÄòG8ÄòG8GÌ·GÌ·tzD8tzD8IÇ·IÇ·A8A8¯‹Â·¯‹Â·�=8�=8ˆÛ½·ˆÛ½·š:8š:8À9¹·À9¹·h¯68h¯68A¦´·A¦´·C38C38x °·x °·»Ù/8»Ù/8Œ©«·Œ©«· s,8 s,8VA§·VA§·¹)8¹)8b碷b碷˜¯%8˜¯%8$�ž·$�ž·kR"8kR"8Sbš·Sbš·çø8çø8i6–·i6–·÷¢8÷¢8ˆ’·ˆ’·‡P8‡P8DŽ·DŽ·:8:8NŠ·NŠ·ú·8ú·8|$†·|$†·ßq8ßq8OG‚·OG‚·]0 8]0 8ô|·ô|·>ó8>ó8dzu·dzu·Äº8ĺ8� n·� n·b‡8b‡8“æf·“æf·²ü7²ü7SÍ_·SÍ_·ý_ö7ý_ö7ÓX·ÓX·ªð7ªð7ZøQ·ZøQ·¯Þé7¯Þé7$>K·$>K·�¯ã7�¯ã76£D·6£D·(�Ý7(�Ý7¸'>·¸'>·Vw×7Vw×7„Ì7·„Ì7·“nÑ7“nÑ7�1·�1·½sË7½sË7‡s+·‡s+·ã†Å7ã†Å7.v%·.v%·o¨¿7o¨¿7¼—·¼—· Ù¹7 Ù¹71Ø·1Ø·Ó´7Ó´7ô7·ô7·6h®76h®7L¶·L¶·çǨ7çǨ7S ·S ·8£78£7ˆ·ˆ·¹�7¹�7=Ðý¶=Ðý¶ŸK˜7ŸK˜7e¿ó¶e¿ó¶èï’7èï’7Sêé¶Sê鶉¦�7‰¦�7šOà¶šOà¶ pˆ7 pˆ7!ïÖ¶!ïÖ¶±Lƒ7±Lƒ7ÚÈͶÚÈͶßy|7ßy|7ÙÛĶÙÛĶt‚r7t‚r7ø'¼¶ø'¼¶Ä³h7ijh7⬳¶â¬³¶Á_7Á_7œi«¶œi«¶^”U7^”U7è]£¶è]£¶1EL71EL7j‰›¶j‰›¶2"C72"C70ë“¶0ë“¶3,:73,:7&ƒŒ¶&ƒŒ¶Èc17Èc17ÁP…¶ÁP…¶ôÉ(7ôÉ(7%¦|¶%¦|¶s_ 7s_ 7o¶o¶ê$7ê$7Úéa¶Úéa¶6767¦&U¶¦&U¶ïB7ïB7éÉH¶éÉH¶Òœ7Òœ7-Ò<¶-Ò<¶cSò6cSò6~>1¶~>1¶@Ôã6@Ôã6c&¶c&¶Š½Õ6нÕ6È@¶È@¶šÈ6šÈ6Õ¶Õ¶uκ6uκ6ÐʶÐʶ`ø­6`ø­6˜Aúµ˜Aúµ¶�¡6¶�¡6•¬çµ•¬çµ…••6…••6.ÕÕµ.ÕÕµ Š6 Š6ŹĵŹĵmâ}6mâ}6ÓY´µÓY´µö‘h6ö‘h6´¤µ´¤µ×&T6×&T66Ç•µ6Ç•µê¢@6ê¢@6n’‡µn’‡µã.6ã.6³)tµ³)tµ…W6…W6›Zµ›Zµt“ 6t“ 6±wBµ±wBµTz÷5Tz÷5v¾+µv¾+µ¬Ù5¬Ù5hnµhnµä¾½5ä¾½5ᆵᆵµ£5µ£5»à´»à´ó�‹5ó�‹5ÒÞ½´ÒÞ½´©j5©j5€~ž´€~ž´:B5:B5üí�´üí�´ç35ç35ZZP´ZZP´x|ø4x|ø4{"´{"´I¾4I¾4kƒô³kƒô³Ò‹4Ò‹4d¯³d¯³Þ5B4Þ5B4ÛGk³ÛGk³n—ø3n—ø3" ³" ³>Ó‹3>Ó‹3àÙ‘²àÙ‘²ÝŒø2ÝŒø2÷Ò±÷Ò±°�ø1°�ø1�;°�;°././@LongLink0000644000000000000000000000015200000000000011601 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/BinauralDecoder/Source/EQ/AKG-K141MK2.wavIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/BinauralDecoder/Source/EQ/AKG-K141MK0000664002537200253720000004013015257173642030610 0ustar zmoelnigzmoelnigRIFFP@WAVEfmt €»Ü factPEAKßc Yà¾5?à¾5?data@à¾5?à¾5?Y j¾Y j¾j„»»j„»»(Y«»(Y«»Š D¾Š D¾ûɼûɼów#=ów#=2ô±=2ô±=i¢³»i¢³»&-=&-=§Cˆ=§Cˆ=ƒ2d=ƒ2d=â|¡½â|¡½¡`ƽ¡`ƽþ5¢¼þ5¢¼šƒ®<šƒ®<6zå<6zå<ð^9=ð^9=Ȫ§<Ȫ§<ùÈH½ùÈH½]âP½]âP½�‚ˆ»�‚ˆ»ij‡ '<> '<`ã—»`ã—»Å<¼Å<¼qk¼qk¼å¼å¼ì!';ì!';�6<�6<~<<~<<�ñ;�ñ;}ƒú:}ƒú:iÎŽ»iÎŽ»Íó»Íó»�Ah»�Ah»L8–;L8–;�—*<�—*<´67<´67<œÑ<œÑ<ì$ ;ì$ ;õÖe»õÖe»Û9¼»Û9¼»dív»dív»¿‡“9¿‡“9šUy;šUy;D»;D»;ö&¬;ö&¬;Œò(;Œò(;‰Õ>º‰Õ>ºD»D»º\⺺\⺪W :ªW :è^F;è^F;ß™;ß™;Ó;˜;Ó;˜;w^V;w^V;›ÐË:›ÐË:­?:­?:€’}:€’}:ž÷;ž÷;²_;²_;€“;€“;¾–;¾–;?•|;?•|;uý7;uý7;eÓ;eÓ;)Éï:)Éï:²Ñ;²Ñ;AK;AK;ö÷u;ö÷u;S´x;S´x;…¹^;…¹^;â¤1;â¤1;6ê ;6ê ;Þå:Þå:̇û:̇û:³f;³f;™i1;™i1;‚ž9;‚ž9;`˜3;`˜3;v:;v:;@;@;‹Pà:‹Pà:è:è:@J;@J;ƒ;ƒ;ï_;ï_;Ž";Ž";&Ô;&Ô;‘ ;‘ ;>];>];—T;—T;*ƒ;*ƒ;g;g;v5;v5;à€;à€;ó%;ó%;¹9;¹9;f, ;f, ;ùÖ;ùÖ;—‡ ;—‡ ;`;`;^0;^0;ý;ý;\Ë;\Ë;1ß;1ß;j¶;j¶;2 ;2 ;®ý;®ý;[{";[{"; 1&; 1&;f+;f+;?Q*;?Q*;àZ+;àZ+;"¨';"¨';2”';2”';k-%;k-%;˃';˃';Š5&;Š5&;×&;×&;;4";;4";¢Æ;¢Æ;Á¡;Á¡;÷Ë;÷Ë;8x;8x;C´ ;C´ ;—¾;—¾;ò‰;ò‰;Éÿ;Éÿ;“r;“r;Î(õ:Î(õ:>Lñ:>Lñ:lé:lé:&˜é:&˜é:ä:ä:�÷æ:�÷æ:ßKã:ßKã:±Æå:±Æå:‡ˆá:‡ˆá:a2æ:a2æ:; å:; å:ùtë:ùtë:�ë:�ë:…5ó:…5ó:Kdó:Kdó:Jœù:Jœù:¸Jø:¸Jø:‘(þ:‘(þ:fìü:fìü:ÌT;ÌT;[¥;[¥;X;X;Sý;Sý;Ö�;Ö�;´h;´h;HÆ;HÆ;ÃT;ÃT;Ð*;Ð*;²¹ü:²¹ü:ï½ý:ï½ý:Ïþö:Ïþö: ÷: ÷:…ãï:…ãï:åhï:åhï:‘ç:‘ç:Ì ç:Ì ç: ³ß: ³ß:T_ß:T_ß:Ú×:Ú×: ³×: ³×:L×Ð:L×Ð:´ Ñ:´ Ñ:¨:Ê:¨:Ê:UË:UË:^Å:^Å:C9Æ:C9Æ:½ÎÀ:½ÎÀ:ÁöÂ:ÁöÂ:¾:¾:¹qÀ:¹qÀ:¼:¼:£/¿:£/¿: C»: C»:t‰¾:t‰¾:Ï »:Ï »:¥Ý¾:¥Ý¾:r¹»:r¹»:±Þ¿:±Þ¿:.ß¼:.ß¼:p†À:p†À:éʼ:éʼ::À::À:{œ¼:{œ¼:‰ À:‰ À:µ¼:µ¼: 8À: 8À:y!¼:y!¼:¢Ì¾:¢Ì¾:5*º:5*º:yl¼:yl¼:W‰·:W‰·:ðÕ¹:ðÕ¹:Lµ:Lµ:ÈE·:ÈE·:Ö²:Ö²:tz³:tz³:«£­:«£­:;á®:;á®:Ó3©:Ó3©:¥ëª:¥ëª:…³¥:…³¥:‚z§:‚z§:ö¡:ö¡:ìz£:ìz£:6ï�:6ï�:õŒŸ:õŒŸ:V?š:V?š:ýmœ:ýmœ:—:—:]"š:]"š:]^•:]^•:9À—:9À—:ë’:ë’:Ø%•:Ø%•:°ƒ�:°ƒ�:À+“:À+“:¹­Ž:¹­Ž:œM‘:œM‘:ýߌ:ýߌ:tu�:tu�:ËÉŠ:ËÉŠ:ý4�:ý4�:ë�ˆ:ë�ˆ:û‹:û‹:Rh†:Rh†:éíˆ:éíˆ:×F„:×F„:€‡†:€‡†:‡�:‡�:#¥ƒ:#¥ƒ:Ìb}:Ìb}:zÛ€:zÛ€:ìÀw:ìÀw:^ü{:^ü{:—çq:—çq:,Åu:,Åu:Ñ7k:Ñ7k:øn:øn:-‚d:-‚d:I$h:I$h:!�]:!�]:ša:ša:)qW:)qW:2p[:2p[:]OQ:]OQ:pŠU:pŠU:ŠhK:ŠhK:“vO:“vO:‚E:‚E:ƒJ:ƒJ:íp@:íp@:±_E:±_E:RV<:RV<:ãŠA:ãŠA:w\8:w\8:Øc=:Øc=:½=4:½=4:Çy9:Çy9:c´0:c´0:¾w6:¾w6:„..:„..:µ4:µ4:1„+:1„+:ð#1:ð#1:ƒ(:ƒ(:O.:O.:j�%:j�%:Öc+:Öc+:ô#:ô#:ý±(:ý±(:Ëê:Ëê:ºF%:ºF%:ÒB:ÒB:Ýf!:Ýf!:2S:2S:¨œ:¨œ:Ø™:Ø™:¦©:¦©:šN:šN:r:r:j :j :¬ñ:¬ñ:WP:WP:E :E :¿|:¿|:'2:'2:>ù9>ù9ˆ9:ˆ9:SÜî9SÜî9bÓ÷9bÓ÷9¶‚ä9¶‚ä9*Úí9*Úí9^·Ú9^·Ú9âFä9âFä9#;Ñ9#;Ñ9ÕzÚ9ÕzÚ9o1Ç9o1Ç9‚¢Ð9‚¢Ð9ÉŠ½9ÉŠ½9[ Ç9[ Ç9ø8´9ø8´9’¾9’¾9¬Y«9¬Y«9ã6µ9ã6µ9Œ”¢9Œ”¢9#‰¬9#‰¬9„÷™9„÷™9ˤ9ˤ9«‘9«‘9ä›9ä›9 œ‰9 œ‰9>”9>”9Þ�9Þ�9¶YŒ9¶YŒ9h¤t9h¤t9·ã„9·ã„90Ée90Ée9|4{9|4{9â·W9â·W9sm9sm9øæI9øæI9¦@_9¦@_9);9);9/@P9/@P9}4,9}4,9{A9{A9«ï9«ï9Ká39Ká39› 9› 9/’&9/’&9Ê@9Ê@9¯Û9¯Û9Xê8Xê8~À 9~À 9¶žÏ8¶žÏ8ÒÌü8ÒÌü8îà·8îà·8Ñå8Ñå8^¡8^¡8vZÎ8vZÎ8dK‰8dK‰8qa·8qa·80Çf80Çf8éJ¢8éJ¢8c�>8c�>8ÄÿŽ8ÄÿŽ8g~8g~8%Wu8%Wu8ÃIÜ7ÃIÜ7ësL8ësL8ñ>Œ7ñ>Œ7%„%8%„%8ù7ù7†28†28KT¶µKT¶µŸ7²7Ÿ7²7ñ@5·ñ@5·>“F7>“F76@©·6@©·¢­+6¢­+6í’ô·í’ô·£öͶ£öͶ̸̸ È|· È|·Œ`D¸Œ`D¸uâÈ·uâÈ·Rni¸Rni¸ýž¸ýž¸ñ4…¸ñ4…¸?Ù'¸?Ù'¸;•¸;•¸Ý#G¸Ý#G¸Aä¸A丌ùf¸Œùf¸WÝ´¸WÝ´¸çƒ¸çƒ¸XÕøXÕøý­‘¸ý­‘¸ë!Ò¸ë!Ò¸»Ÿ¸»Ÿ¸Žcฎcà¸ëX®¸ëX®¸±¾î¸±¾î¸êý»¸êý»¸ˆ ü¸ˆ ü¸FɸFɸl¨¹l¨¹ˆÖ¸ˆÖ¸eW ¹eW ¹ ë㸠ëã¸Úæ¹Úæ¹¢¬ð¸¢¬ð¸ý4¹ý4¹¢ý¸¢ý¸m@¹m@¹µŒ¹µŒ¹þX$¹þX$¹Ãœ ¹Ãœ ¹ÎO*¹ÎO*¹á“¹á“¹™T0¹™T0¹yŒ¹yŒ¹¯56¹¯56¹Ôj¹Ôj¹'<¹'<¹»X"¹»X"¹B¹B¹Yc(¹Yc(¹ˆ1H¹ˆ1H¹§Z.¹§Z.¹WN¹WN¹•S4¹•S4¹YT¹YT¹::¹::¹ Z¹ Z¹Âd@¹Âd@¹oH`¹oH`¹©F¹©F¹Û¤f¹Û¤f¹ùM¹ùM¹$Êl¹$Êl¹ýñR¹ýñR¹ø¤r¹ø¤r¹ä­X¹ä­X¹xDx¹xDx¹;Q^¹;Q^¹Vì}¹Vì}¹Qàc¹Qàc¹´´�¹´´�¹ËEi¹ËEi¹dO„¹dO„¹ìKn¹ìKn¹=ˆ¹=ˆ¹•?s¹•?s¹ >‰¹ >‰¹ax¹ax¹�Š‹¹�Š‹¹×n|¹×n|¹E´�¹E´�¹|_€¹|_€¹ùâ�¹ùâ�¹Ý”‚¹Ý”‚¹v’¹v’¹A±„¹A±„¹”¹”¹o±†¹o±†¹&–¹&–¹œ±ˆ¹œ±ˆ¹!$˜¹!$˜¹¸Š¹¸Š¹Ëš¹Ëš¹*¡Œ¹*¡Œ¹=ü›¹=ü›¹ex޹ex޹[Ö�¹[Ö�¹Ø[�¹Ø[�¹‹·Ÿ¹‹·Ÿ¹W/’¹W/’¹i�¡¹i�¡¹¾é“¹¾é“¹##£¹##£¹`z•¹`z•¹…¶¤¹…¶¤¹‡ —¹‡ —¹ë0¦¹ë0¦¹¼m˜¹¼m˜¹ý€§¹ý€§¹¤ž™¹¤ž™¹W—¨¹W—¨¹žªš¹žªš¹s ©¹s ©¹v«›¹v«›¹6™ª¹6™ª¹þ–œ¹þ–œ¹"o«¹"o«¹"P�¹"P�¹[¬¹[¬¹Eê�¹Eê�¹[³¬¹[³¬¹ ’ž¹ ’ž¹·^­¹·^­¹ ?Ÿ¹ ?Ÿ¹(®¹(®¹ ÍŸ¹ ÍŸ¹Ô„®¹Ô„®¹ÅP ¹ÅP ¹ ¯¹ ¯¹£Ü ¹£Ü ¹X£¯¹X£¯¹‘v¡¹‘v¡¹³1°¹³1°¹Ló¡¹Ló¡¹|ª°¹|ª°¹¦o¢¹¦o¢¹›*±¹›*±¹&ö¢¹&ö¢¹cº±¹cº±¹Ò~£¹Ò~£¹ø1²¹ø1²¹#죹#죹í�²¹í�²¹§P¤¹§P¤¹Aù²¹Aù²¹Ò¥¤¹Ò¥¤¹ŽJ³¹ŽJ³¹Z줹Z줹 †³¹ †³¹%"¥¹%"¥¹7¶³¹7¶³¹C¥¹C¥¹Iͳ¹Iͳ¹µV¥¹µV¥¹Õس¹Õس¹1R¥¹1R¥¹γ¹γ¹`E¥¹`E¥¹¹¸³¹¹¸³¹~¥¹~¥¹ì„³¹ì„³¹�᤹�᤹”B³¹”B³¹�¤¹�¤¹¹³¹¹³¹0f¤¹0f¤¹’˲¹’˲¹#¤¹#¤¹·„²¹·„²¹ûØ£¹ûØ£¹†5²¹†5²¹ò†£¹ò†£¹Áê±¹Áê±¹^A£¹^A£¹_¤±¹_¤±¹·÷¢¹·÷¢¹ÞW±¹ÞW±¹ªž¢¹ªž¢¹Uô°¹Uô°¹Å=¢¹Å=¢¹œ°¹œ°¹Â᡹Â᡹9°¹9°¹sv¡¹sv¡¹g¼¯¹g¼¯¹á ¹á ¹X¯¹X¯¹ò< ¹ò< ¹u®¹u®¹Á“Ÿ¹Á“Ÿ¹üË­¹üË­¹“áž¹“ឹ歹歹ðž¹ðž¹æ!¬¹æ!¬¹Û�¹Û�¹š3«¹š3«¹¦)œ¹¦)œ¹•:ª¹•:ª¹$›¹$›¹Ò&©¹Ò&©¹�ÿ™¹�ÿ™¹¢ö§¹¢ö§¹Âǘ¹Âǘ¹R½¦¹R½¦¹i�—¹i�—¹‡¥¹‡¥¹èR–¹èR–¹3?¤¹3?¤¹Õý”¹Õý”¹^ᢹ^ᢹ‡™“¹‡™“¹Â}¡¹Â}¡¹_7’¹_7’¹a ¹a ¹dÎ�¹dÎ�¹Æ¯ž¹Æ¯ž¹€`�¹€`�¹l;�¹l;�¹å�¹å�¹é¿›¹é¿›¹ÌgŒ¹ÌgŒ¹öAš¹öAš¹¬ëй¬ëйÑǘ¹Ñǘ¹µl‰¹µl‰¹ÛF—¹ÛF—¹3釹3釹™½•¹™½•¹uX†¹uX†¹v+”¹v+”¹ÝĹÝʼn•’¹‰•’¹î,ƒ¹î,ƒ¹#þ�¹#þ�¹ Ž�¹ Ž�¹…T�¹…T�¹¿±¹¿±¹š�¹š�¹‹3|¹‹3|¹Ø‹¹Ø‹¹sªx¹sªx¹yйyй^u¹^u¹f<ˆ¹f<ˆ¹¾Uq¹¾Uq¹_†¹_†¹`›m¹`›m¹ „„¹ „„¹àéi¹àéi¹$­‚¹$­‚¹°.f¹°.f¹‘È€¹‘È€¹bb¹bb¹4Ì}¹4Ì}¹Rž^¹Rž^¹lz¹lz¹×íZ¹×íZ¹éev¹éev¹h;W¹h;W¹¯r¹¯r¹O|S¹O|S¹Õèn¹Õèn¹ ¯O¹ ¯O¹$k¹$k¹úõK¹úõK¹qg¹qg¹j>H¹j>H¹™¹c¹™¹c¹Ð~D¹Ð~D¹’ï_¹’ï_¹k°@¹k°@¹Y-\¹Y-\¹Zö<¹Zö<¹fxX¹fxX¹B9¹B9¹àÃT¹àÃT¹&�5¹&�5¹xùP¹xùP¹.³1¹.³1¹Ï2M¹Ï2M¹Oð-¹Oð-¹wI¹wI¹´8*¹´8*¹û¾E¹û¾E¹Cs&¹Cs&¹ŽñA¹ŽñA¹¤£"¹¤£"¹A)>¹A)>¹ÕÞ¹ÕÞ¹ j:¹ j:¹¨!¹¨!¹¿«6¹¿«6¹ V¹ V¹�Ù2¹�Ù2¹*�¹*�¹]/¹]/¹Å¤¹Å¤¹Æ-+¹Æ-+¹ïÖ ¹ïÖ ¹�a'¹�a'¹H¹H¹Š‘#¹Š‘#¹Î0¹Î0¹`¸¹`¸¹œV¹œV¹(ê¹(ê¹Où¸Où¸…"¹…"¹Œ�ñ¸Œ�ñ¸ºc¹ºc¹¶ 긶 ê¸ï£¹ï£¹º“⸺“â¸¤î ¹¤î ¹²(Û¸²(Û¸A= ¹A= ¹ÅÓ¸ÅÓ¸*‹¹*‹¹UZ̸UZ̸yÛ¹yÛ¹ðŸðŸ"bü¸"bü¸c ½¸c ½¸ùüô¸ùüô¸%5¶¸%5¶¸”í¸”í¸äÆ®¸äÆ®¸’*渒*æ¸à\§¸à\§¸JÁÞ¸JÁÞ¸l韸l韸úS׸úS׸k}˜¸k}˜¸yéϸyéϸØ‘¸Ø‘¸-ŠÈ¸-ŠÈ¸˜­‰¸˜­‰¸0$Á¸0$Á¸ÂF‚¸ÂF‚¸ȹ¸ȹ¸|äu¸|äu¸Þ‹²¸Þ‹²¸ …g¸ …g¸k`«¸k`«¸~Y¸~Y¸Þ0¤¸Þ0¤¸¼J¸¼J¸ �¸ �¸ƒ<¸ƒ<¸º–¸º–¸ x.¸ x.¸�¸�¸ x ¸ x ¸Lˆ¸Lˆ¸mx¸mx¸"�¸"�¸Æ–¸Æ–¸²[t¸²[t¸¡Äí·¡Äí·¤»f¸¤»f¸ÒvÒ·ÒvÒ·Y¸Y¸E5··E5··1‘K¸1‘K¸È7œ·È7œ·�'>¸�'>¸ô[�·ô[�·žÅ0¸žÅ0¸/M·/M·‰V#¸‰V#¸Î·Î·eð¸eð¸3|ö3|öq¶¸q¶¸Ô\4¶Ô\4¶ïH÷·ïH÷·0Aí40Aí4×Ý·×Ý·²o6²o6ö÷ö÷ÝòÞ6ÝòÞ6–x©·–x©·–�"7–�"7›(�·›(�·ä:U7ä:U7pÏm·pÏm·m³ƒ7m³ƒ7tO<·tO<·–\œ7–\œ7WI ·WI ·%à´7%à´7ú´¶ú´¶Ä”Í7Ä”Í7Þ‚$¶Þ‚$¶2íå72íå7Ž’ß4Ž’ß4îý7îý7k˜Z6k˜Z6ä 8ä 85¬Ì65¬Ì6W×8W×8øµ7øµ7è "8è "8ÒfD7ÒfD7‘9.8‘9.8t8r7t8r7È©98È©98‚ì�7‚ì�7­E8­E8î�¦7î�¦7‡UP8‡UP8¦Å¼7¦Å¼7EY[8EY[8WÒ7WÒ7À-f8À-f8é è7é è7ˆìp8ˆìp8°Dý7°Dý7S„{8S„{8t+ 8t+ 8šÿ‚8šÿ‚8¨‡8¨‡8ò/ˆ8ò/ˆ8×8×86Q�86Q�8Ÿ(8Ÿ(8m’8m’8f'28f'28ßw—8ßw—8!2<8!2<8’�œ8’�œ8“,F8“,F8—{¡8—{¡8šP8šP8Åt¦8Åt¦8ÙñY8ÙñY8á]«8á]«8­c8­c8-2°8-2°8†.m8†.m8Ÿì´8Ÿì´8“‹v8“‹v8Á™¹8Á™¹8ÝÕ8ÝÕ8š?¾8š?¾8ª…„8ª…„8ûÑÂ8ûÑÂ8‰8‰8-EÇ8-EÇ8;j�8;j�8É«Ë8É«Ë8ªÈ‘8ªÈ‘8² Ð8² Ð8�–8�–8uUÔ8uUÔ8Pš8Pš8¹}Ø8¹}Ø8ež8ež8ýŒÜ8ýŒÜ8¹l¢8¹l¢8•à8•à8Çd¦8Çd¦8ñ‚ä8ñ‚ä8ª?ª8ª?ª8·Pè8·Pè8\ø­8\ø­8bì8bì8/§±8/§±8{´ï8{´ï8³Gµ8³Gµ8vLó8vLó8ʸ8ʸ8ŽÅö8ŽÅö8»8¼8»8¼8ã6ú8ã6ú8¥¿8¥¿8¦ý8¦ý8ØÃ8ØÃ8å9å9NÆ8NÆ8R9R9v€É8v€É8[·9[·9»¤Ì8»¤Ì8ìH9ìH9µ¼Ï8µ¼Ï8°Ñ9°Ñ9¬»Ò8¬»Ò8×L9×L9| Õ8| Õ8èº 9èº 9×kØ8×kØ8À 9À 9g!Û8g!Û8t 9t 9š¼Ý8š¼Ý8_¾ 9_¾ 9r?à8r?à8àú9àú98¨â88¨â8»-9»-9xå8xå8ùY9ùY9´Oç8´Oç86~96~9†é8†é8§•9§•9`¨ë8`¨ë8ª¥9ª¥9¼í8¼í8ï¯9ï¯9ÈÉï8ÈÉï8Rµ9Rµ9 Ãñ8 Ãñ8-¯9-¯96©ó86©ó8Çž9Çž9yõ8yõ8Y†9Y†9#<÷8#<÷8pc9pc9�ãø8�ãø84949ãpú8ãpú8ô9ô9¾Þû8¾Þû8©9©9-<ý8-<ý8%V9%V9w†þ8w†þ8 ö9 ö9(®ÿ8(®ÿ8q‚9q‚9­Y9­Y9^9^9‹Ô9‹Ô9q|9q|9G9G9•ì9•ì9“­9“­9!N 9!N 9…9…9|¦ 9|¦ 9Y9Y9u÷ 9u÷ 9ç¤9ç¤9Î?!9Î?!9áá9áá9”x!9”x!9Ú9Ú9…§!9…§!9h;9h;9×Ï!9×Ï!9j^9j^9ð!9ð!9ßw9ßw9$"9$"9Y‡9Y‡9T"9T"9-Ž9-Ž9�"9�"9‹‘9‹‘9›"9›"9‘Œ9‘Œ9""9""9ã|9ã|9+"9+"9¼e9¼e9Çî!9Çî!9¾I9¾I9\Ñ!9\Ñ!9Ý$9Ý$98¨!98¨!9øð9øð9sp!9sp!9³9³9î1!9î1!9Am9Am9éé 9éé 9"9"9·” 9·” 9?¾9?¾94 94 9ÊV9ÊV9•Ê9•Ê9ç9ç9ÛY9ÛY9—n9—n9jÞ9jÞ9;×ÿ8;×ÿ8RY9RY9™¾þ8™¾þ8&Ì9&Ì9‘™ý8‘™ý8M99M99hü8hü8­ 9­ 9á,û8á,û8l9l9kâù8kâù8}[9}[9…‡ø8…‡ø8„­9„­9ê ÷8ê ÷8jú9jú9>¯õ8>¯õ8µ@9µ@9]/ô8]/ô8€9€9ç ò8ç ò8E·9E·9¤ñ8¤ñ8Pæ9Pæ9ŸRï8ŸRï8í 9í 9”í8”í8),9),9;Àë8;Àë8X@9X@9eÛé8eÛé8M9M9åèç8åèç8ŸS9ŸS9qèå8qèå8iP9iP9Ñã8Ñã8&C9&C9…ªá8…ªá8ù/9ù/95zß85zß8³9³9C@Ý8C@Ý8ú 9ú 9ÂõÚ8ÂõÚ8RÕ 9RÕ 9e¢Ø8e¢Ø8¥¬ 9¥¬ 9JÖ8JÖ8È� 9È� 9´çÓ8´çÓ8P9P9zÑ8zÑ8}9}9ãÏ8ãÏ8+à9+à9%‰Ì8%‰Ì8{£9{£9$Ê8$Ê8T`9T`9âqÇ8âqÇ8è9è9ž×Ä8ž×Ä8�Ì9�Ì97Â87Â8”öþ8”öþ8f†¿8f†¿8©Dü8©Dü8ìȼ8ìȼ8Xˆù8Xˆù8º8º8MÈö8MÈö8Ç<·8Ç<·8ô8ô8Ek´8Ek´8C3ñ8C3ñ8å’±8å’±8ÝZî8ÝZî8¯±®8¯±®8Æ~ë8Æ~ë8ÆË«8ÆË«8ð˜è8ð˜è8rܨ8rܨ8£«å8£«å8hä¥8hä¥8ô¶â8ô¶â8%é¢8%é¢8νß8νß8 ãŸ8 ãŸ8Ï·Ü8Ï·Ü8íÒœ8íÒœ8…¨Ù8…¨Ù8Ô¹™8Ô¹™8דÖ8דÖ8圖8圖8WxÓ8WxÓ8‚w“8‚w“8VÐ8VÐ8ãK�8ãK�8œ,Í8œ,Í89�89�8,Ê8,Ê8Ké‰8Ké‰8¥ÔÆ8¥ÔÆ8×´†8×´†8&¥Ã8&¥Ã8ö|ƒ8ö|ƒ8õoÀ8õoÀ8â@€8â@€8ƒ:½8ƒ:½85z85z8º8º8‹‹s8‹‹s83ɶ83ɶ8m8m8œ‹³8œ‹³8€f8€f80L°80L°8„ï_8„ï_8­8­8OWY8OWY8(¿©8(¿©8ó´R8ó´R8Šs¦8Šs¦8ÙL8ÙL8Ž#£8Ž#£8}\E8}\E8µÎŸ8µÎŸ8‹¤>8‹¤>8lxœ8lxœ8³ë78³ë78Ø!™8Ø!™8 .18 .18wÆ•8wÆ•8.g*8.g*8'h’8'h’8Ú�#8Ú�#8D �8D �8“Ü8“Ü8q²‹8q²‹8­8­8ÝUˆ8ÝUˆ8¿P8¿P8‚ô„8‚ô„8„8„8*˜�8*˜�8_Å8_Å8I€|8I€|8ˆö7ˆö7eÌu8eÌu8ûˆè7ûˆè7áo8áo8óÛ7óÛ7¾fh8¾fh8F›Í7F›Í7ïÁa8ïÁa8Ò;À7Ò;À7­[8­[8ZÚ²7ZÚ²7ƒzT8ƒzT8}¥7}¥7¢ÜM8¢ÜM8¡,˜7¡,˜7MCG8MCG8÷ãŠ7÷ãŠ7¯ª@8¯ª@8å({7å({7G:8G:8)�`7)�`7uv38uv38ÍüE7ÍüE7¶ã,8¶ã,8Ø„+7Ø„+7¾O&8¾O&8Äõ7Äõ7›¸8›¸8šÇì6šÇì6M"8M"8òÜ·6òÜ·6Ó˜8Ó˜8ó:ƒ6ó:ƒ6˜ 8˜ 8‹6‹6Å“8Å“8ƒ)S5ƒ)S5ú1þ7ú1þ7aNMµaNMµâUñ7âUñ7©”¶©”¶u•ä7u•ä7b‡€¶b‡€¶;ì×7;ì×7Ko³¶Ko³¶VË7VË7† 涆 涔Ͼ7”Ͼ7A= ·A= ·œZ²7œZ²7pC%·pC%·ùõ¥7ùõ¥7!G>·!G>·×�™7×�™7Ñ@W·Ñ@W·d-�7d-�7S7p·S7p·€Ù€7€Ù€7Lƒ„·Lƒ„·ãi7ãi7¿é�·¿é�·-�P7-�P7êH�·êH�·¥ 87¥ 87©˜©·©˜©·öÀ7öÀ7É͵·É͵·~ž7~ž7‹ñÁ·‹ñÁ·ê3ß6ê3ß6t ηt ηfd¯6fd¯6 Ú· Ú·â €6â €6)æå·)æå·¸¯"6¸¯"6�¤ñ·�¤ñ·sÞ‹5sÞ‹5°Qý·°Qý·ë™²´ë™²´Ot¸Ot¸¿‰ãµ¿‰ãµS1 ¸S1 ¸!L¶!L¶ÏÙ¸ÏÙ¸ñ¸’¶ñ¸’¶›|¸›|¸E¿¶E¿¶j¸j¸ó›ë¶ó›ë¶4© ¸4© ¸Y¦ ·Y¦ ·º%&¸º%&¸R!·R!·o›+¸o›+¸—ä6·—ä6·Ý 1¸Ý 1¸ YL· YL·ým6¸ým6¸S…a·S…a·AÁ;¸AÁ;¸@…v·@…v·» A¸» A¸B²…·B²…·’LF¸’LF¸Y �·Y �· }K¸ }K¸;š·;š·ûšP¸ûšP¸}J¤·}J¤·ÂªU¸ÂªU¸ÃD®·ÃD®·E±Z¸E±Z¸g%¸·g%¸·Ù¦_¸Ù¦_¸üÞÁ·üÞÁ·^†d¸^†d¸PlË·PlË·Ti¸Ti¸{ÝÔ·{ÝÔ·n¸n¸€0Þ·€0Þ·¦Âr¸¦Âr¸·\ç··\ç·6^w¸6^w¸]eð·]eð·|é{¸|é{¸ÏPù·ÏPù·C3€¸C3€¸?¸?¸.j‚¸.j‚¸Be¸Be¸Á—„¸Á—„¸y© ¸y© ¸¨½†¸¨½†¸rß ¸rß ¸n܈¸n܈¸N¸N¸éòЏéòЏ‚¸‚¸*�¸*�¸¿"¸¿"¸V�¸V�¸ø¸ø¸Ö‘¸Ö‘¸èþ!¸èþ!¸Äü’¸Äü’¸EÔ%¸EÔ%¸q딸q딸°˜)¸°˜)¸ÒÏ–¸ÒÏ–¸~I-¸~I-¸&«˜¸&«˜¸åæ0¸åæ0¸4}š¸4}š¸“t4¸“t4¸ÜFœ¸ÜFœ¸Tí7¸Tí7¸.ž¸.ž¸•N;¸•N;¸½¶Ÿ¸½¶Ÿ¸ã–>¸ã–>¸H^¡¸H^¡¸ÝÎA¸ÝÎA¸*ý¢¸*ý¢¸HòD¸HòD¸œ�¤¸œ�¤¸ªýG¸ªýG¸ó¦¸ó¦¸ŽñJ¸ŽñJ¸•§¸•§¸ÒÕM¸ÒÕM¸ ©¸ ©¸$¨P¸$¨P¸¤vª¸¤vª¸dS¸dS¸Ö«¸Ö«¸‰ V¸‰ V¸¯.­¸¯.­¸º¦X¸º¦X¸¼€®¸¼€®¸Õ3[¸Õ3[¸D˯¸D˯¸P¯]¸P¯]¸ ±¸ ±¸‘`¸‘`¸F²¸F²¸vb¸vb¸¸w³¸¸w³¸+Âd¸+Âd¸’ ´¸’ ´¸è÷f¸è÷f¸û½µ¸û½µ¸i¸i¸Ò¶¸Ò¶¸;'k¸;'k¸Û·¸Û·¸rm¸rm¸#׸¸#׸¸E÷n¸E÷n¸ƹ¸ƹ¸Åºp¸Åºp¸¿©º¸¿©º¸�er¸�er¸Ê�»¸Ê�»¸±ús¸±ús¸ N¼¸ N¼¸êvu¸êvu¸9½¸9½¸—ßv¸—ßv¸ Æ½¸ Æ½¸55x¸55x¸Öt¾¸Öt¾¸buy¸buy¸Û¿¸Û¿¸…Ÿz¸…Ÿz¸¢¯¿¸¢¯¿¸[·{¸[·{¸‘?À¸‘?À¸ ¿|¸ ¿|¸€ÇÀ¸€ÇÀ¸µ}¸µ}¸»EÁ¸»EÁ¸È˜~¸È˜~¸u»Á¸u»Á¸k¸k¸Ü(¸Ü(¸s€¸s€¸vŒÂ¸vŒÂ¸'l€¸'l€¸)æÂ¸)æÂ¸©¹€¸©¹€¸†7ø†7øsþ€¸sþ€¸6€Ã¸6€Ã¸Ÿ9�¸Ÿ9�¸?¾Ã¸?¾Ã¸Qj�¸Qj�¸§òø§òøÁ‘�¸Á‘�¸ŽĸŽĸC¯�¸C¯�¸[>ĸ[>ĸaÂ�¸aÂ�¸ÇTĸÇTĸÙË�¸ÙË�¸FbĸFbĸcÌ�¸cÌ�¸hfĸhfĸ»Â�¸»Â�¸¶_ĸ¶_ĸ\®�¸\®�¸!Oĸ!Oĸ"‘�¸"‘�¸$6ĸ$6ĸÊj�¸Êj�¸\ĸ\ĸÀ:�¸À:�¸ çø çø•�¸•�¸Í²Ã¸Í²Ã¸ÕÀ€¸ÕÀ€¸KvøKvøžw€¸žw€¸‡1ø‡1ø�%€¸�%€¸²ã¸²ã¸͖¸Í–¸{ŽÂ¸{ŽÂ¸GÓ~¸GÓ~¸³1¸³1¸¨~¸¨~¸PÌÁ¸PÌÁ¸Ý}¸Ý}¸%^Á¸%^Á¸o%|¸o%|¸fèÀ¸fèÀ¸„"{¸„"{¸žlÀ¸žlÀ¸éz¸éz¸¯ç¿¸¯ç¿¸Óëx¸Óëx¸ÿX¿¸ÿX¿¸‹³w¸‹³w¸¾¸¾¸Mnv¸Mnv¸@%¾¸@%¾¸:u¸:u¸�½¸�½¸Ø¸s¸Ø¸s¸dÓ¼¸dÓ¼¸�Br¸�Br¸/¼¸/¼¸ç½p¸ç½p¸�`»¸�`»¸+o¸+o¸Ë›º¸Ë›º¸^‡m¸^‡m¸²Î¹¸²Î¹¸¤Òk¸¤Òk¸þù¸¸þù¸¸¤j¸¤j¸ï¸¸ï¸¸ñAh¸ñAh¸Ú<·¸Ú<·¸‚df¸‚df¸ÖR¶¸ÖR¶¸nvd¸nvd¸¤aµ¸¤aµ¸.{b¸.{b¸~i´¸~i´¸­r`¸­r`¸çk³¸çk³¸w_^¸w_^¸ûg²¸ûg²¸Á>\¸Á>\¸š]±¸š]±¸"Z¸"Z¸:M°¸:M°¸ÚW¸ÚW¸°8¯¸°8¯¸r˜U¸r˜U¸¨®¸¨®¸jIS¸jIS¸2ü¬¸2ü¬¸]íP¸]íP¸®Ô«¸®Ô«¸ª‡N¸ª‡N¸˜¨ª¸˜¨ª¸¿L¸¿L¸ýv©¸ýv©¸2œI¸2œI¸Œ?¨¸Œ?¨¸ûG¸ûG¸K§¸K§¸(~D¸(~D¸½¥¸½¥¸ëÜA¸ëÜA¸Bs¤¸Bs¤¸Í0?¸Í0?¸3#£¸3#£¸4w<¸4w<¸ Í¡¸ Í¡¸“±9¸“±9¸!p ¸!p ¸Mß6¸Mß6¸GŸ¸GŸ¸ó4¸ó4¸g¦�¸g¦�¸1¸1¸v8œ¸v8œ¸\%.¸\%.¸¯Åš¸¯Åš¸*+¸*+¸5P™¸5P™¸v((¸v((¸Y×—¸Y×—¸à%¸à%¸RZ–¸RZ–¸ "¸ "¸ØÙ”¸ØÙ”¸Wø¸Wø¸ÀW“¸ÀW“¸ßÞ¸ßÞ¸ŠÓ‘¸ŠÓ‘¸,¿¸,¿¸K�¸K�¸y–¸y–¸Í¾Ž¸Í¾Ž¸Ìg¸Ìg¸0�¸0�¸H4¸H4¸Ûž‹¸Ûž‹¸­ú ¸­ú ¸7 Џ7 Џ¶¸¶¸lnˆ¸lnˆ¸@i¸@i¸žÐ†¸žÐ†¸ ¸ ¸¬0…¸¬0…¸·ý··ý·á‹ƒ¸á‹ƒ¸Î»ö·Î»ö·åâ�¸åâ�¸/éï·/éï·7€¸7€¸A é·A é·å}¸å}¸$â·$â·ä¬y¸ä¬y¸M+Û·M+Û·¤@v¸¤@v¸6'Ô·6'Ô·\Òr¸\Òr¸� Í·� Í·èao¸èao¸rÆ·rÆ·Zìk¸Zìk¸cø¾·cø¾·›ph¸›ph¸�Ô··�Ô··Eñd¸Eñd¸9«°·9«°·lpa¸lpa¸�}©·�}©·Øë]¸Øë]¸YG¢·YG¢·"cZ¸"cZ¸Û›·Û›·ÿÖV¸ÿÖV¸¸Ä“·¸Ä“·HS¸HS¸^zŒ·^zŒ·ØµO¸ØµO¸·)…··)…·!L¸!L¸m§{·m§{·¼‡H¸¼‡H¸aèl·aèl·–çD¸–çD¸2^·2^·DAA¸DAA¸0BO·0BO·Œ–=¸Œ–=¸U_@·U_@·|å9¸|å9¸No1·No1·Á.6¸Á.6¸Òq"·Òq"·Xs2¸Xs2¸¶u·¶u·“µ.¸“µ.¸-t·-t·¶ó*¸¶ó*¸êÞê¶êÞê¶™.'¸™.'¸8Û̶8Û̶Æi#¸Æi#¸œõ®¶œõ®¶Ä¤¸Ä¤¸y‘¶y‘¶ÑݸÑݸ—�f¶—�f¶¸¸Fô*¶Fô*¶]N¸]N¸¨„ßµ¨„ßµI‰¸I‰¸«Sµ«SµÒÄ ¸ÒÄ ¸A;Â3A;Â3>ÿ¸>ÿ¸Fn�5Fn�5O<¸O<¸7 ö57 ö5@{¸@{¸ì56ì56Ÿvû·Ÿvû·c÷n6c÷n6¼õó·¼õó·{J”6{J”6 |ì· |ì·Ìç°6Ìç°6‘ å·‘ å·#MÍ6#MÍ6_žÝ·_žÝ·+”é6+”é6!7Ö·!7Ö·“Ï7“Ï7:Ûη:Ûη³7³7ùŒÇ·ùŒÇ·’s7’s7ÝEÀ·ÝEÀ·ß,7ß,7L ¹·L ¹·Œ�97Œ�97Þ±·Þ±·ÙóF7ÙóF7ª·ª·Ü#T7Ü#T7޲£·Ž²£·P-a7P-a7&³œ·&³œ·ˆ n7ˆ n7¤Ä•·¤Ä•·�¼z7�¼z7 玷 玷y¡ƒ7y¡ƒ7€ˆ·€ˆ·'͉7'͉7Ø`�·Ø`�·eá�7eá�7\qu·\qu·ëß•7ëß•7PAh·PAh·îÈ›7îÈ›7½6[·½6[·Â—¡7—¡7åUN·åUN·‚N§7‚N§7›A·›A·`í¬7`í¬7¹5·¹5·þu²7þu²7g’(·g’(·éä·7éä·7'I·'I·ž:½7ž:½7Â+·Â+·„vÂ7„vÂ7ú6·ú6·J—Ç7J—Ç7Oâð¶Oâð¶<œÌ7<œÌ7µÙ¶µÙ¶t„Ñ7t„Ñ7¼å¶¼å¶èNÖ7èNÖ7eƒ¬¶eƒ¬¶úÚ7úÚ7‹‡–¶‹‡–¶¶…ß7¶…ß74ú€¶4ú€¶kñã7kñã78µW¶8µW¶6=è76=è7”I.¶”I.¶Ùiì7Ùiì7½¶½¶”uð7”uð7M¼µM¼µadô7adô7°0\µ°0\µ¶6ø7¶6ø7-à†´-à†´ýéû7ýéû7;ù£4;ù£4Yÿ7Yÿ7tdd5tdd5Ú|8Ú|8¨ý¹5¨ý¹5¥+8¥+8Z6Z6ûÊ8ûÊ8ïL"6ïL"6]Z8]Z8¸C6¸C6 Û8 Û8jNd6jNd6ðK 8ðK 8@ÿ�6@ÿ�6~« 8~« 80^‘60^‘6ãú 8ãú 8³P 6³P 6=: 8=: 8¿Í®6¿Í®6ßh8ßh8™Ô¼6™Ô¼6†8†85^Ê65^Ê6‚’8‚’8ïv×6ïv×6æŽ8æŽ8Iä6Iä6?{8?{8úOð6úOð6V8V8ü6ü6æ 8æ 8,§7,§7kÛ8kÛ8x 7x 7ê†8ê†8ºG7ºG7Ô!8Ô!8ÈA7ÈA7¶¬8¶¬8t7t7Ö(8Ö(8–7–7%—8%—8¤ò 7¤ò 7¶õ8¶õ8°%7°%7üD8üD8ä)7ä)7Å…8Å…8“Æ,7“Æ,7?¸8?¸86P076P07+Ü8+Ü8_¥37_¥37�ð8�ð8äÃ67äÃ67÷8÷8O±97O±972ï82ï8³l<7³l<7ƒÙ8ƒÙ8 ó>7 ó>7˜´8˜´8—DA7—DA7j�8j�8pbC7pbC7�@8�@8`RE7`RE7¤ò8¤ò8>G7>G7—8—8VŸH7VŸH7ã-8ã-8£üI7£üI7¶·8¶·8a-K7a-K7x58x58–2L7–2L7§8§8P M7P M7` 8` 8®¸M7®¸M7Çe8Çe8Ï=N7Ï=N7‚´8‚´8�N7�N7ù8ù8êÖN7êÖN7q28q28ÞèN7ÞèN7)a8)a8ÇÓN7ÇÓN7›…8›…8ž�N7ž�N7ã 8ã 8tDN7tDN7_²8_²8MÈM7MÈM7º 8º 8€)M7€)M7¹ 8¹ 8þlL7þlL7l¯ 8l¯ 8�K7�K7Œœ 8Œœ 8Æ�J7Æ�J7 € 8 € 8gnI7gnI72[82[8¹0H7¹0H7Ü.8Ü.8‰ÖF7‰ÖF7æù8æù8»ZE7»ZE7Ò»8Ò»8&¾C7&¾C7Ëu8Ëu8B7B7&)8&)89@79@7BÕ8BÕ8«M>7«M>7Õóþ7Õóþ7ËH<7ËH<7~0ü7~0ü7¾.:7¾.:7}bù7}bù7…87…87}ˆö7}ˆö7ëº57ëº57€¢ó7€¢ó7™`37™`37t²ð7t²ð7àõ07àõ079ºí79ºí7{.7{.7•¸ê7•¸ê7nî+7nî+7ø­ç7ø­ç7°Q)7°Q)7››ä7››ä7ħ&7ħ&7V‚á7V‚á7ð#7ð#7ûaÞ7ûaÞ7O+!7O+!7¹:Û7¹:Û7¯X7¯X7à Ø7à Ø7Úz7Úz7¼ÙÔ7¼ÙÔ7“7“7"¢Ñ7"¢Ñ7‰¢7‰¢7±eÎ7±eÎ7æ§7æ§7¿$Ë7¿$Ë7¤7¤7CßÇ7CßÇ7 ˜ 7 ˜ 7—Ä7—Ä7H† 7H† 7ÎKÁ7ÎKÁ7n7n74þ½74þ½7éO7éO7Ñ­º7Ñ­º7,7,7Ð[·7Ð[·7^ú6^ú6´´7´´7¯´ó6¯´ó6bµ°7bµ°7"Zí6"Zí6&a­7&a­7—ýæ6—ýæ6ª7ª7´£à6´£à6V½¦7V½¦7¯PÚ6¯PÚ6sn£7sn£7‰þÓ6‰þÓ6m! 7m! 7’²Í6’²Í6Hל7Hל7ïoÇ6ïoÇ6�‘™7�‘™7â9Á6â9Á6JO–7JO–7‰ »6‰ »6)“7)“7tã´6tã´6FÕ�7FÕ�7»Ë®6»Ë®6ÞŸŒ7ÞŸŒ7EÁ¨6EÁ¨6™n‰7™n‰7À¢6À¢6“A†7“A†70Ëœ60Ëœ6¬ƒ7¬ƒ7#æ–6#æ–6°ï7°ï7M‘6M‘6j·y7j·y7PM‹6PM‹6Ö‹s7Ö‹s77›…67›…6nm7nm7þ6þ6_g7_g7ît6ît6ÿ^a7ÿ^a7G j6G j6än[7än[7ÞY_6ÞY_6 �U7 �U7.ÜT6.ÜT6ÒÂO7ÒÂO7‘“J6‘“J6ªJ7ªJ7}@6}@6Ä]D7Ä]D7—š66—š66HÆ>7HÆ>7šî,6šî,6óA97óA97z#6z#6~Ð37~Ð37y<6y<6–r.7–r.7Æ76Æ76e()7e()7ik6ik6/ò#7/ò#7³²ÿ5³²ÿ5‚Ð7‚Ð7ûï5ûï5˜Ã7˜Ã7NÌÞ5NÌÞ5ŽË7ŽË7_ Ï5_ Ï5Xè7Xè7L¼¿5L¼¿5n 7n 7é°5é°5�b7�b7Ô‘¢5Ô‘¢5eÀ7eÀ7°”5°”5/gú6/gú6E‡5E‡5ìyñ6ìyñ6<­t5<­t5±¹è6±¹è6ºÆ[5ºÆ[5‘&à6‘&à6,ÖC5,ÖC5¯À×6¯À×69ß,59ß,5j‰Ï6j‰Ï6 æ5 æ5"€Ç6"€Ç6¤à5¤à5�¤¿6�¤¿6�šÛ4�šÛ4³ö·6³ö·6Z`µ4Z`µ4Áw°6Áw°6Ø‘4Ø‘4'©6'©6ìN]4ìN]4Ô¢6Ô¢6¶14¶14w›6w›6·‚½3·‚½3J”6J”6|¡3|¡3±�6±�6&‹²&‹²/E‡6/E‡6muˆ³muˆ³¡�6¡�6y%ç³y%ç³¥êu6¥êu6§„´§„´¤!j6¤!j6é"H´é"H´í°^6í°^6Ó†m´Ó†m´™S6™S6Ó‡´Ó‡´�ÙH6�ÙH6O—´O—´™q>6™q>6ŽC¥´ŽC¥´ _46 _46ľ±´Ä¾±´q¢*6q¢*6ÆÀ¼´ÆÀ¼´ç:!6ç:!6‘QÆ´‘QÆ´(6(6†Î´†Î´g6g6égÕ´égÕ´ø6ø6GÛ´GÛ´­´ý5­´ý5PWß´PWß´’î5’î5ï{â´ï{â´¶ß5¶ß5{ä´{ä´‰¸Ð5‰¸Ð5Sbå´Sbå´zîÂ5zîÂ51:å´1:å´èºµ5躵5ìä´ìä´Î©5Ω5üá´üá´‰ �5‰ �5 ÿÞ´ ÿÞ´µ‹‘5µ‹‘5ô'Û´ô'Û´Æ—†5Æ—†5LˆÖ´LˆÖ´ºYx5ºYx5¡-Ñ´¡-Ñ´R�d5R�d5h&Ë´h&Ë´¢ÌQ5¢ÌQ5XÄ´XÄ´¢ @5¢ @5ÅG½´ÅG½´íB/5íB/5c’µ´c’µ´¦n5¦n5Íj­´Íj­´¬ˆ5¬ˆ5øà¤´øà¤´¶Š5¶Š5yœ´yœ´mÛê4mÛê4ã’´ã’´OVÒ4OVÒ4ò�‰´ò�‰´9y»49y»4‘€´‘€´x8¦4x8¦4±m´±m´†’4†’4¾ëY´¾ëY´AT€4AT€4—ÙF´—ÙF´¾+_4¾+_4Úú3´Úú3´|@4|@4~m!´~m!´Æ$4Æ$4¢O´¢O´¹ 4¹ 4œ€û³œ€û³mpè3mpè3»Ù³»Ù³Üq¿3Üq¿3C‰¹³C‰¹³ ›3 ›3>&›³>&›³¾v3¾v3Ûœ}³Ûœ}³Øg>3Øg>3©zI³©zI³Y¸3Y¸3{W³{W³hAÍ2hAÍ2ÍFá²ÍFá²fy‹2fy‹2Ô£™²Ô£™²é .2é .2SL=²SL=²?À1?À1GžÄ±GžÄ±þê&1þê&1˜±˜±K#0K#0f2‚¯f2‚¯././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/BinauralDecoder/Source/EQ/AKG-K702.wavIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/BinauralDecoder/Source/EQ/AKG-K702.w0000664002537200253720000004013015257173642030630 0ustar zmoelnigzmoelnigRIFFP@WAVEfmt €»Ü factPEAKàc YÅøL?ÅøL?data@ÅøL?ÅøL?ð¯½ð¯½gLä=gLä=‡éÌ=‡éÌ=‰¤'¾‰¤'¾ ®‡½ ®‡½ek½ek½ª ½ª ½¬¾¬¾[ù½[ù½:‰=:‰=ÅÅ=ÅÅ=$³=$³=‚ôe=‚ôe=1[¼1[¼ìM*¼ìM*¼Š"¯<Š"¯<6J‘<6J‘<fá¼fá¼BhŸ½BhŸ½ƒ ɽƒ ɽĔ•½Ä”•½¢¼¢¼¼Ñi<¼Ñi<*üY<*üY< t.: t.:oäW:oäW:´œ<´œ<¼•=¼•= ó= ó=Ï´Ž<Ï´Ž<“µñ»“µñ»gb˜¼gb˜¼lÇq¼lÇq¼ì6¼ì6¼3ÎA¼3ÎA¼fg¦¼fg¦¼Ü»¼Ü»¼‹ò[¼‹ò[¼ÙÌI;ÙÌI;a�e9”>9L�Ô8L�Ô8rŽƒ9rŽƒ9Ö(É8Ö(É8a=N9a=N9e†B9e†B9QŽ:QŽ:äXH:äXH:�«œ:�«œ:S°:S°:›á:›á:Ý'÷:Ý'÷:z�;z�;6~!;6~!;,±4;,±4;8¿2;8¿2;˯>;˯>;Ð=;Ð=;’UM;’UM;IÀM;IÀM;lmZ;lmZ;ãfT;ãfT;qe];qe];ÁX;ÁX;Ûïd;Ûïd;`D`;`D`;Ãg;Ãg;›hZ;›hZ;gÐ[;gÐ[;;›N;;›N;‰ŽQ;‰ŽQ;øC;øC;»�C;»�C;$2;$2;iÉ0;iÉ0;p";p";Í¡$;Í¡$;¡¡;¡¡;\Î;\Î; ž ; ž ;5… ;5… ;:>û::>û:‚n;‚n;ƒ ë:ƒ ë:,nï:,nï:!Ó:!Ó:hwÖ:hwÖ:hº½:hº½:ýÆ:ýÆ:ßž¯:ßž¯:Þ¾¶:Þ¾¶:`ž:`ž: ‚¦: ‚¦:dr’:dr’:Þ7Ÿ:Þ7Ÿ:C"�:C"�:k™:k™:Ò†:Ò†:--“:--“:ç=ƒ:ç=ƒ:÷ô’:÷ô’:áè‚:áè‚:\¦�:\¦�:}Ë~:}Ë~:wŽ:wŽ:5“€:5“€:z°’:z°’:Õ}…:Õ}…:É@–:É@–:pë‡:pë‡:—¨™:—¨™:ð/Ž:ð/Ž:�¢:�¢:öC—:öC—: ©: ©:m^œ:m^œ:Çc®:Çc®:BK¢:BK¢:æPµ:æPµ:À¥¨:À¥¨:Oà¹:Oà¹:ÙÞ«:ÙÞ«:ÏK½:ÏK½:?Ÿ°:?Ÿ°:$Ã:$Ã:Êýµ:Êýµ:]èÆ:]èÆ:ºŸ¸:ºŸ¸:ó»É:ó»É:d£¼:d£¼:‡Î:‡Î:¬³À:¬³À:žÐ:žÐ: ìÀ: ìÀ:£9Ð:£9Ð:\$Á:\$Á:O"Ñ:O"Ñ:³Á:³Á:^PÐ:^PÐ:ñ|¿:ñ|¿:R›Í:R›Í:�/½:�/½:|·Ë:|·Ë:Òº:Òº:¼È:¼È:5ñµ:5ñµ:d’Â:d’Â:ÿg°:ÿg°:|½:|½:®Œª:®Œª::¶::¶:8w£:8w£:[–¯:[–¯::�::�:|ø©:|ø©:c»—:c»—: 7¤: 7¤:ìí‘:ìí‘:¼øž:¼øž:…œ�:…œ�:L›:L›:Ôä‰:Ôä‰:J—:J—:”�…:”�…:½b“:½b“:·ƒ:·ƒ:sâ‘:sâ‘:çÝ�:çÝ�:Gš�:Gš�:f‘€:f‘€:öÔ�:öÔ�:KÊ€:KÊ€:Dø�:Dø�:Ç;‚:Ç;‚:ž#’:ž#’:äƒ:äƒ:½ú’:½ú’:¡C„:¡C„:²‡”:²‡”:WË…:WË…:°¸•:°¸•:vĆ:vĆ:[ã–:[ã–:hˆ:hˆ:=à˜:=à˜:@SŠ:@SŠ:Ždš:Ždš:‹‹:‹‹:—›:—›:Ð�:Ð�:ÑK�:ÑK�:]sŽ:]sŽ:kž:kž:ª¦Ž:ª¦Ž:Àž:Àž:£ïŽ:£ïŽ:ßµž:ßµž:l‡�:l‡�:.þž:.þž:Zt�:Zt�:²¿ž:²¿ž:³=�:³=�:æ�ž:æ�ž:2ãŽ:2ãŽ:›Ø�:›Ø�:³Ò�:³Ò�:Tžœ:Tžœ:�Œ:�Œ:õF›:õF›:3úŠ:3úŠ:wY™:wY™:BÒˆ:BÒˆ:/3—:/3—:˜Ì†:˜Ì†:B1•:B1•:Ì—„:Ì—„:ø«’:ø«’:“ß�:“ß�:à�:à�:å~:å~:“°�:“°�:&èy:&èy:céŠ:céŠ:¡t:¡t:P"ˆ:P"ˆ:,o:,o:‚É…:‚É…:é3j:é3j:Š!ƒ:Š!ƒ:õ�d:õ�d:g€:g€:߈_:߈_:9ú{:9ú{:«§Z:«§Z:¯Ùv:¯Ùv:8bU:8bU:K·q:K·q:ƈP:ƈP:wm:wm:‡ºK:‡ºK:Uh:Uh:³ßF:³ßF:1‡c:1‡c:>¤B:>¤B:¶S_:¶S_:x7>:x7>:Ò«Z:Ò«Z:ó–9:ó–9:6YV:6YV:€˜5:€˜5:œzR:œzR:¾¯1:¾¯1:K�N:K�N:û-:û-:õCK:õCK:þ+:þ+:�¡H:�¡H:íž(:íž(:”RF:”RF:­{&:­{&:PD:PD:«{$:«{$:ú1B:ú1B:ÜD":ÜD":¾ @:¾ @:W :W :éV>:éV>:3³:3³:Θ<:Θ<:Là:Là:Ùã::Ùã::çu:çu:õ¶9:õ¶9:}I:}I:?V8:?V8: µ: µ:’³6:’³6:':':¢:5:¢:5:}¥:}¥:}�3:}�3:Í:Í:¯2:¯2:S»:S»:Ã÷0:Ã÷0:ÅŒ:ÅŒ:uª/:uª/:}3:}3:g.:g.:ò:ò:¿K-:¿K-:©Ö :©Ö :¬â+:¬â+:ºY :ºY :)~*:)~*: : :ÑE):ÑE):Z¸ :Z¸ :¦':¦':`ÿ:`ÿ:>&:>&:¥…:¥…:[‘$:[‘$:é:é:À¹":À¹":¤ò:¤ò:‘Í :‘Í :h#:h#:‚:‚:"�þ9"�þ9::#hú9#hú9ø:ø:9—ö99—ö9n":n":±³ò9±³ò9 : :ñ�î9ñ�î9ó':ó': ïê9 ïê9%I:%I:’ææ9’ææ9::�â9�â9™:™:6xÞ96xÞ95ø :5ø :[%Ú9[%Ú9i³ :i³ :éšÕ9éšÕ9¦…:¦…: lÑ9 lÑ9¥g:¥g:±ìÌ9±ìÌ9¸:¸:xÈ9xÈ9ž­:ž­:ìƒÃ9ìƒÃ90¥þ90¥þ9®‚¾9®‚¾9_iù9_iù9{O¹9{O¹9¨xô9¨xô93 ´93 ´9·Îï9·Îï9‡Ä¯9‡Ä¯9|Áê9|Áê9Ö½ª9Ö½ª9²ýå9²ýå9õE¦9õE¦9X›á9X›á9ܽ¡9ܽ¡9#ãÜ9#ãÜ9K�9K�9ÌXØ9ÌXØ9µ˜9µ˜9:$Ô9:$Ô9Ít”9Ít”9ŸÙÏ9ŸÙÏ9DG�9DG�94ñË94ñË9Œ¥Œ9Œ¥Œ9FlÈ9FlÈ9š‰9š‰9ºÐÄ9ºÐÄ9é�…9é�…9ÚxÁ9ÚxÁ9I`‚9I`‚9ÞG¾9ÞG¾9!~9!~9̺9̺9J#w9J#w9!†·9!†·9 q9 q9o˜´9o˜´9�,k9�,k9~¥±9~¥±9È{e9È{e9B¯9B¯9Š`9Š`9ü‰¬9ü‰¬9àZ[9àZ[9™Ó©9™Ó©9+ïU9+ïU9[7§9[7§9ÝP9ÝP9¨¤9¨¤9Ý¢K9Ý¢K9á¢9á¢9ÅF9ÅF9;ÝŸ9;ÝŸ9£¯B9£¯B9Î�9Î�9ÀK>9ÀK>9ø�›9ø�›9ñÇ99ñÇ99e™9e™9¼Ã59¼Ã59›Q—9›Q—9°419°419–Þ”9–Þ”9N,9N,9P�’9P�’9Uÿ'9Uÿ'9·m�9·m�9Y{#9Y{#9'Ž9'Ž9aœ9aœ9Þ¨‹9Þ¨‹9·þ9·þ97Q‰97Q‰9^9^9´Å†9´Å†9|9|9�Q„9�Q„9AA 9AA 9"ñ�9"ñ�9fj9fj9ý9ý9¸9¸9ª z9ª z9±$û8±$û8ø…v9ø…v9ùÃò8ùÃò8ÓUr9ÓUr9zÌê8zÌê8§n9§n9„Øã8„Øã8½0k9½0k9ŒÃÜ8ŒÃÜ8®g9®g9o3Ö8o3Ö8t²d9t²d9¢¢Ð8¢¢Ð8[÷a9[÷a9é&Ë8é&Ë8ýI_9ýI_9š/Æ8š/Æ8R]9R]9·ÇÁ8·ÇÁ8:ÂZ9:ÂZ9?$½8?$½8âsX9âsX9eÀ¸8eÀ¸8âYV9âYV96z´86z´8gT9gT9ý¹¯8ý¹¯8ÆÁQ9ÆÁQ9·w«8·w«8›ÇO9›ÇO9ñs§8ñs§8Ï•M9Ï•M9±¢8±¢8©)K9©)K9  ž8  ž8ïH9ïH9,�™8,�™8Ý’F9Ý’F9æ””8æ””8  D9  D9ì��8ì��8G‘A9G‘A9¾¥Š8¾¥Š8÷?9÷?9ŽË…8ŽË…8‚º<9‚º<9 �8 �8¨O:9¨O:9Bx8Bx8ýÂ79ýÂ79Öòm8Öòm8ùE59ùE59 d8 d8¶29¶29œ#Y8œ#Y8XÚ/9XÚ/9�™M8�™M8l-9l-9ƒ|B8ƒ|B8+6*9+6*91Ü681Ü68rA'9rA'9¸%+8¸%+8za$9za$9"Ÿ8"Ÿ83g!93g!9'8'8á/9á/9‹,8‹,8¶ñ9¶ñ9uò7uò7³Ž9³Ž9¸<Ö7¸<Ö7«9«9zi»7zi»7èá9èá9ŸI¢7ŸI¢7½² 9½² 9.7ˆ7.7ˆ7xp 9xp 9¤‹]7¤‹]7jX9jX9°,7°,7)9)9ÄÄî6ÄÄî6ÈÝ9ÈÝ9%ƒ‰6%ƒ‰6(Âû8(Âû8Û¿µ5Û¿µ5� ö8� ö8ë·ºµë·ºµ«]ð8«]ð8l£…¶l£…¶c-ë8c-ë8U^×¶U^×¶úæ8úæ8åÊ·åÊ·×Äà8×Äà8x>·x>·—×Û8—×Û8l¾e·l¾e·3ÜÖ83ÜÖ8ºÏ†·ºÏ†·„Ò8„Ò86“˜·6“˜·RíÍ8RíÍ8ù¨·ù¨·A°É8A°É8˜‡º·˜‡º·(TÅ8(TÅ8Û5Ë·Û5Ë· [Á8 [Á8Û·Û·Y=½8Y=½8]ì·]ì·Ö¸8Ö¸86†ý·6†ý·Ð¶´8ж´8é¸é¸;—°8;—°87A¸7A¸/}¬8/}¬8)%¸)%¸ÿ©¨8ÿ©¨8À߸À߸÷¯¤8÷¯¤8áö&¸áö&¸y´ 8y´ 8‚§.¸‚§.¸¿õœ8¿õœ8¸F6¸¸F6¸Gÿ˜8Gÿ˜8Yd>¸Yd>¸A•8A•8búE¸búE¸C^‘8C^‘8ÎbM¸ÎbM¸K}�8K}�8ãpU¸ãpU¸~‰8~‰8y!]¸y!]¸Æ…8Æ…8r°d¸r°d¸‡Ï�8‡Ï�8íl¸íl¸8u{88u{84¾t¸4¾t¸Æós8Æós8úK|¸úK|¸#l8#l8ÿ)‚¸ÿ)‚¸2d82d8—û…¸—û…¸ˆÙ\8ˆÙ\8÷©‰¸÷©‰¸LBU8LBU8¼–�¸¼–�¸óbM8óbM8Âo‘¸Âo‘¸­äE8­äE85•¸5•¸è%>8è%>8ì+™¸ì+™¸³N68³N68!õœ¸!õœ¸”û.8”û.8Ò£ ¸Ò£ ¸i'8i'8W†¤¸W†¤¸e®8e®8_N¨¸_N¨¸¿>8¿>8ù¬¸ù¬¸¹g8¹g8Ç °¸Ç °¸—V8—V8ⴸⴸp|8p|8-¸¸-¸¸ÊÀð7ÊÀð7¹0¼¸¹0¼¸`‡à7`‡à7Æ(À¸Æ(À¸ØÉÐ7ØÉÐ7C5ĸC5ĸÎê¿7Îê¿7°ŽÈ¸°ŽÈ¸y™®7y™®7Î̸Î̸z¿�7z¿�70$Ѹ0$Ѹo®‹7o®‹7ËÕ¸ËÕ¸LKr7LKr7ãWÚ¸ãWÚ¸ ZN7 ZN7 ëÞ¸ ë޸̳(7̳(7Š¸ã¸Š¸ã¸¯w7¯w7®t踮t踤/¹6¤/¹6+Qí¸+Qí¸l¸Q6l¸Q6Trò¸Trò¸W;5W;5u÷¸u÷¸2–ßµ2–ßµ¡xü¸¡xü¸‡€‰¶‡€‰¶ ι ιÛêÙ¶ÛêÙ¶^=¹^=¹áý·áý·üŸ¹üŸ¹]•9·]•9·B¹B¹`·`·ˆl ¹ˆl ¹Ý¹‚·Ý¹‚·9Ä ¹9Ä ¹ýd•·ýd•·=¹=¹Na§·Na§·ŒE¹ŒE¹h’¸·h’¸·Te¹Te¹R8É·R8É·(k¹(k¹AÃØ·AÃØ·R¹R¹Ûäç·Ûäç·;¹;¹µ÷·µ÷·l¹l¹J®¸J®¸ŽÒ¹ŽÒ¹­} ¸­} ¸�†¹�†¹¡5¸¡5¸ò) ¹ò) ¹=z¸=z¸à¯!¹à¯!¹Ã}¸Ã}¸Ä3#¹Ä3#¹1…"¸1…"¸Ø±$¹Ø±$¹ÙZ(¸ÙZ(¸â$&¹â$&¹K!.¸K!.¸+˜'¹+˜'¹JÙ3¸JÙ3¸öÿ(¹öÿ(¹1S9¸1S9¸½\*¹½\*¹•À>¸•À>¸Ñ¸+¹Ñ¸+¹ÝD¸ÝD¸”-¹”-¹ 'I¸ 'I¸&K.¹&K.¹þ?N¸þ?N¸m•/¹m•/¹Ù[S¸Ù[S¸DÙ0¹DÙ0¹>SX¸>SX¸‰2¹‰2¹ÛE]¸ÛE]¸ÎS3¹ÎS3¹‘b¸‘b¸‡…4¹‡…4¹KÎf¸KÎf¸8³5¹8³5¹{k¸{k¸Û6¹Û6¹”óo¸”óo¸¿õ7¹¿õ7¹,`t¸,`t¸¶9¹¶9¹¿y¸¿y¸ÑA:¹ÑA:¹¬p}¸¬p}¸ªV;¹ªV;¹ÃÜ€¸ÃÜ€¸Vp<¹Vp<¹Úƒ¸Úƒ¸&Œ=¹&Œ=¹´7…¸´7…¸ã–>¹ã–>¹@I‡¸@I‡¸ä¨?¹ä¨?¹›x‰¸›x‰¸Ã@¹Ã@¹qš‹¸qš‹¸\ÌA¹\ÌA¹LŸ�¸LŸ�¸:ÑB¹:ÑB¹~§�¸~§�¸ÔC¹ÔC¹š‘¸𑏥ÈD¹¥ÈD¹ ~“¸ ~“¸4ÂE¹4ÂE¹›w•¸›w•¸ÀF¹ÀF¹Åg—¸Åg—¸¿¹G¹¿¹G¹‚c™¸‚c™¸÷ÂH¹÷ÂH¹–|›¸–|›¸”ÎI¹”ÎI¹é�¸é�¸ßÍJ¹ßÍJ¹¤‚Ÿ¸¤‚Ÿ¸nÛK¹nÛK¹x¬¡¸x¬¡¸dõL¹dõL¹)Õ£¸)Õ£¸:N¹:N¹ƒû¥¸ƒû¥¸)%O¹)%O¹P?¨¸P?¨¸ÃJP¹ÃJP¹4~ª¸4~ª¸hQ¹hQ¹ñµ¬¸ñµ¬¸�ŠR¹�ŠR¹®û®¸®û®¸ª¬S¹ª¬S¹Ž/±¸Ž/±¸íÅT¹íÅT¹©c³¸©c³¸�çU¹�çU¹¼¥µ¸¼¥µ¸yW¹yW¹sË·¸sË·¸„X¹„X¹+빸+빸 -Y¹ -Y¹ò¼¸ò¼¸×GZ¹×GZ¹3B¾¸3B¾¸X[¹X[¹$eÀ¸$eÀ¸ÿs\¹ÿs\¹Ð¥Â¸Ð¥Â¸ò—]¹ò—]¹-ãĸ-ãĸá·^¹á·^¹æ(Ǹæ(Ǹßå_¹ßå_¹~ŒÉ¸~ŒÉ¸aa¹aa¹üé˸üé˸&Jb¹&Jb¹ÃLθÃLθ�„c¹�„c¹BÄиBÄи8Ád¹8Ád¹’1Ó¸’1Ó¸ùùe¹ùùe¹)§Õ¸)§Õ¸=g¹=g¹†,ظ†,ظÙ}h¹Ù}h¹J™Ú¸J™Ú¸²±i¹²±i¹�þܸ�þܸWëj¹Wëj¹Åo߸Åo߸ñ l¹ñ l¹6Âá¸6ÂḘFm¹˜Fm¹: ä¸: ä¸%vn¹%vn¹óqæ¸óq渖©o¹–©o¹©Å踩Å踂Ïp¹‚Ïp¹Þë¸Þ븠õq¹ õq¹âQí¸âQí¸as¹as¹U†ï¸U†ï¸#0t¹#0t¹1ªñ¸1ªñ¸-Eu¹-Eu¹ Íó¸ Íó¸ Tv¹ Tv¹ÿÙõ¸ÿÙõ¸Zw¹Zw¹Là÷¸Là÷¸Xax¹Xax¹Õäù¸Õäù¸Ä^y¹Ä^y¹^Çû¸^Çû¸ÐLz¹ÐLz¹Äœý¸Äœý¸q;{¹q;{¹Boÿ¸Boÿ¸?|¹?|¹ºŽ¹ºŽ¹êò|¹êò|¹v^¹v^¹ÈÅ}¹ÈÅ}¹­+¹­+¹'�~¹'�~¹­ë¹­ë¹ôO¹ôO¹V¬¹V¬¹X €¹X €¹/o¹/o¹2k€¹2k€¹÷$¹÷$¹ùÅ€¹ùÅ€¹Ù¹Ù¹f"�¹f"�¹\Œ¹\Œ¹òy�¹òy�¹™1¹™1¹¾Ì�¹¾Ì�¹iÖ¹iÖ¹Q"‚¹Q"‚¹Õ~¹Õ~¹ev‚¹ev‚¹Š ¹Š ¹IÈ‚¹IÈ‚¹á ¹á ¹Žƒ¹Žƒ¹Ïc ¹Ïc ¹ƒjƒ¹ƒjƒ¹øø ¹øø ¹Yµƒ¹Yµƒ¹¡‹ ¹¡‹ ¹;„¹;„¹h ¹h ¹yH„¹yH„¹§ ¹§ ¹ÉŽ„¹ÉŽ„¹ù/ ¹ù/ ¹ÌÓ„¹ÌÓ„¹p² ¹p² ¹Ð…¹Ð…¹x*¹x*¹zO…¹zO…¹‘š¹‘š¹F†…¹F†…¹bý¹bý¹�µ…¹�µ…¹’S¹’S¹ƒà…¹ƒà…¹˜¢¹˜¢¹ý†¹ý†¹å¹å¹&†¹&†¹‹¹‹¹’@†¹’@†¹�G¹�G¹=U†¹=U†¹e¹e¹­a†¹­a†¹bu¹bu¹Ói†¹Ói†¹ ~¹ ~¹Ÿl†¹Ÿl†¹+y¹+y¹i†¹i†¹Úk¹Úk¹Wc†¹Wc†¹hZ¹hZ¹ãY†¹ãY†¹�=¹�=¹J†¹J†¹‹¹‹¹¸5†¹¸5†¹lå¹l幆¹†¹Ù«¹Ù«¹ùÿ…¹ùÿ…¹k¹k¹Äß…¹Äß…¹'#¹'#¹Z»…¹Z»…¹Ó¹Ó¹ï“…¹ï“…¹ï~¹ï~¹¬i…¹¬i…¹d¹d¹7…¹7…¹ï® ¹ï® ¹oþ„¹oþ„¹Þ7 ¹Þ7 ¹GĹGĹѸ ¹Ñ¸ ¹[‚„¹[‚„¹. ¹. ¹u=„¹u=„¹kŸ ¹kŸ ¹Ûöƒ¹Ûöƒ¹ ¹ ¹ðªƒ¹ðªƒ¹i ¹i ¹¨Zƒ¹¨Zƒ¹˜Â ¹˜Â ¹{ƒ¹{ƒ¹… ¹… ¹Â­‚¹Â­‚¹ßU¹ßU¹P‚¹P‚¹ð•¹ð•¹Öð�¹Öð�¹"ι"ι;‹�¹;‹�¹³ù¹³ù¹"�¹"�¹{#¹{#¹¸€¹¸€¹�F¹�F¹àG€¹àG€¹5\¹5\¹²¥¹²¥¹†l¹†l¹c·~¹c·~¹Hu¹Hu¹ý¼}¹ý¼}¹Yp¹Yp¹Ž·|¹Ž·|¹ Éþ¸ Éþ¸ ­{¹ ­{¹É¢ü¸É¢ü¸½—z¹½—z¹¹eú¸¹eú¸Ãyy¹Ãyy¹ñø¸ñø¸DTx¹DTx¹ßºõ¸ßºõ¸æw¹æw¹1>ó¸1>ó¸4âu¹4âu¹µð¸µð¸5�t¹5�t¹Œî¸$Js¹$Js¹Ö\ë¸Ö\ë¸Óïq¹Óïq¹)žè¸)žè¸æ‘p¹æ‘p¹ºÎ帺Îå¸'o¹'o¹ÿäâ¸ÿä⸳m¹³m¹îð߸îð߸p:l¹p:l¹íܸíܸV¶j¹V¶j¹pÒÙ¸pÒÙ¸½*i¹½*i¹Ô°Ö¸Ô°Ö¸ƒœg¹ƒœg¹Â„Ӹ„Ӹ:f¹:f¹rIиrIи‡kd¹‡kd¹Û͸Û͸~Ìb¹~Ìb¹@¸É¸@¸É¸ý"a¹ý"a¹RUƸRUƸÎt_¹Ît_¹àï¸àï¸ÆÄ]¹ÆÄ]¹u¿¸u¿¸p \¹p \¹ê¼¸ê¼¸ÓQZ¹ÓQZ¹V…¸¸V…¸¸«—X¹«—X¹…µ¸…µ¸ˆÔV¹ˆÔV¹j±¸j±¸³ U¹³ U¹EÒ­¸EÒ­¸®DS¹®DS¹T3ª¸T3ª¸œuQ¹œuQ¹ ‡¦¸ ‡¦¸Î£O¹Î£O¹Ü¢¸Ü¢¸dÒM¹dÒM¹ƒ*Ÿ¸ƒ*Ÿ¸DúK¹DúK¹ök›¸ök›¸®J¹®J¹¦©—¸¦©—¸ö>H¹ö>H¹Ö“¸Ö“¸íSF¹íSF¹Šï�¸Šï�¸vdD¹vdD¹åŒ¸åŒ¸yrB¹yrB¹¹ˆ¸¹ˆ¸ßu@¹ßu@¹f„¸f„¸t>¹t>¹Íî¸Ío<¹¨o<¹`¸w¸`¸w¸da:¹da:¹{[o¸{[o¸wL8¹wL8¹cíf¸cíf¸à26¹à26¹d^¸d^¸Ð4¹Ð4¹ØÅU¸ØÅU¸Ëî1¹Ëî1¹'$M¸'$M¸þÈ/¹þÈ/¹ÆlD¸ÆlD¸”�-¹”�-¹Ç¨;¸Ç¨;¸wq+¹wq+¹Üß2¸Üß2¸™@)¹™@)¹ö)¸ö)¸S'¹S'¹oö ¸oö ¸ÕË$¹ÕË$¹¯ï¸¯ï¸þ‹"¹þ‹"¹Ì¸Ì¸ÞD ¹ÞD ¹—¸—¸àü¹àü¹‚Ãø·‚Ãø·$²¹$²¹ %æ· %æ·Å_¹Å_¹ÐYÓ·ÐYÓ·£ ¹£ ¹��À·��À·©²¹©²¹“„­·“„­·]V¹]V¹$tš·$tš·_ù¹_ù¹Ò`‡·Ò`‡·5› ¹5› ¹Ó~h·Ó~h·< ¹< ¹S@B·S@B·�ݹ�ݹŽü·Žü·B}¹B}¹�ë¶�ë¶¹¹‘4ž¶‘4ž¶ÿ¸¹ÿ¸¹8C>8.S09.S09C•E8C•E8w-29w-29{ÙL8{ÙL8²49²49RT8RT8îÒ59îÒ595$[85$[8´Ÿ79´Ÿ79¤/b8¤/b8gf99gf99�!i8�!i8 (;9 (;9 p8 p8/æ<9/æ<9æÔv8æÔv80ž>90ž>9e�}8e�}8 R@9 R@9H‚8H‚8ÃB9ÃB9\j…8\j…8f­C9f­C9«ˆ8«ˆ8úRE9úRE9Ûã‹8Ûã‹8©ôF9©ôF9é�8é�8Ž�H9Ž�H9a6’8a6’8ª'J9ª'J9³Q•8³Q•8DºK9DºK9`a˜8`a˜8#FM9#FM9ác›8ác›8@ÌN9@ÌN9'[ž8'[ž8ÏKP9ÏKP9ÓB¡8ÓB¡8GÃQ9GÃQ9¤8¤8þ4S9þ4S9àê¦8àê¦8Š T9Š T9mª©8mª©8æV9æV9ÍZ¬8ÍZ¬8ü`W9ü`W9+¯8+¯8T¸X9T¸X9e˜±8e˜±8”Z9”Z9«"´8«"´8©R[9©R[9 ¢¶8 ¢¶8z—\9z—\9f¹8f¹8¨Ö]9¨Ö]9€»8€»8U_9U_9Qݽ8Qݽ87D`97D`9'0À8'0À8|sa9|sa9ôzÂ8ôzÂ8�žb9�žb9y»Ä8y»Ä8²Ãc9²Ãc9*ðÆ8*ðÆ8Ëãd9Ëãd9kÉ8kÉ8Èÿe9Èÿe9¿>Ë8¿>Ë8Þg9Þg9×TÍ8×TÍ8Š&h9Š&h9ÇaÏ8ÇaÏ8ø2i9ø2i9&eÑ8&eÑ8â9j9â9j9.]Ó8.]Ó8Á;k9Á;k9JLÕ8JLÕ859l959l9G1×8G1×8ú0m9ú0m9 Ù8 Ù8$n9$n9ØÜÚ8ØÜÚ8o9o9ò¤Ü8ò¤Ü8Œüo9Œüo9ýaÞ8ýaÞ87áp97áp9{à8{à8eÁq9eÁq9Àá8Àá8€›r9€›r9Ï]ã8Ï]ã8Yps9Yps9Þñä8Þñä8@t9@t9¤yæ8¤yæ8ýu9ýu9vôç8vôç8eÌu9eÌu9Reé8Reé8§Šv9§Šv9}Êê8}Êê8¨Bw9¨Bw9·#ì8·#ì8lõw9lõw9»rí8»rí8k¢x9k¢x9^´î8^´î8•Hy9•Hy9þéï8þéï8êy9êy9íñ8íñ8H†z9H†z977ò877ò8{9{9�Ló8�Ló8æ­{9æ­{9*[ô8*[ô8c;|9c;|9s]õ8s]õ8ÈÁ|9ÈÁ|9‡Rö8‡Rö8åB}9åB}9w>÷8w>÷8ú¾}9ú¾}9ø8ø8q4~9q4~9Éñø8Éñø8F¥~9F¥~9 ½ù8 ½ù8¹9¹9,~ú8,~ú8¬w9¬w92û82û8VØ9VØ9Üû8Üû8Ê€9Ê€9=yü8=yü8žC€9žC€9Éý8Éý8Ÿj€9Ÿj€9&�ý8&�ý8O�€9O�€9™þ8™þ8 ±€9 ±€9Ývþ8Ývþ8nЀ9nЀ9ËÝþ8ËÝþ8‘í€9‘í€9Ú9ÿ8Ú9ÿ8¿�9¿�9�Šÿ8�Šÿ8��9��9iÒÿ8iÒÿ8Ç4�9Ç4�9@9@9G�9G�9â9â9'W�9'W�9Þ49Þ49#e�9#e�9-D9-D9òo�9òo�9¦M9¦M9rx�9rx�9ûR9ûR9{~�9{~�9R9R9#��9#��9K9K9e��9e��9£?9£?9�9�9.9.9•y�9•y�9µ9µ9Åq�9Åq�9iöÿ8iöÿ8‚g�9‚g�9(³ÿ8(³ÿ8Z�9Z�9¤dÿ8¤dÿ8aJ�9aJ�9Oÿ8Oÿ8^8�9^8�9¬þ8¬þ8M#�9M#�9Ÿ?þ8Ÿ?þ8T �9T �9Ìý8Ìý8#ó€9#ó€95Mý85Mý8 ×€9 ×€9ÕÄü8ÕÄü86¹€96¹€9Ä5ü8Ä5ü8>™€9>™€9Ò›û8Ò›û8jv€9jv€9Ì÷ú8Ì÷ú8�Q€9�Q€9Lú8Lú8‚*€9‚*€9–ù8–ù8ä€9ä€9:×ø8:×ø8áª9áª9ßø8ßø8rO9rO9 @÷8 @÷8ï~9ï~9&gö8&gö8I‹~9I‹~9W†õ8W†õ8m"~9m"~9â™ô8â™ô86´}96´}9#¥ó8#¥ó8ÙB}9ÙB}9ªò8ªò8�Í|9�Í|9X¥ñ8X¥ñ8mS|9mS|9-˜ð8-˜ð8©Õ{9©Õ{9œƒï8œƒï8ÊS{9ÊS{9fî8fî8‘Íz9‘Íz9�@í8�@í8’Cz9’Cz9Qì8Qì8²y9²y9Ö×ê8Ö×ê8Ÿy9Ÿy9‘“é8‘“é8¾wx9¾wx98Dè88Dè8 Îw9 Îw95èæ85èæ85w95w9Ë�å8Ë�å8•bv9•bv9Íä8Íä8  u9  u9Í�â8Í�â8Õt9Õt9Iá8Iá8‡t9‡t9ssß8ssß8 (s9 (s9ÝÔÝ8ÝÔÝ8)Fr9)Fr9Ú,Ü8Ú,Ü8ó\q9ó\q9¬zÚ8¬zÚ8äkp9äkp9ͽØ8ͽØ8/so9/so9øöÖ8øöÖ8ìrn9ìrn9�%Õ8�%Õ8ójm9ójm9¨JÓ8¨JÓ88\l98\l9ÉgÑ8ÉgÑ8øFk9øFk9]|Ï8]|Ï8ë*j9ë*j9¶ˆÍ8¶ˆÍ8�i9�i9^�Ë8^�Ë8�ßg9�ßg9e‰É8e‰É8ܯf9ܯf9€}Ç8€}Ç8ze9ze9–jÅ8–jÅ8B>d9B>d9ªPÃ8ªPÃ8Ôüb9Ôüb91Á81Á8&¶a9&¶a9 ¿8 ¿8Li`9Li`9oݼ8oݼ8¤_9¤_9'ªº8'ªº8ñ¾]9ñ¾]9âp¸8âp¸83a\93a\9Å/¶8Å/¶8”ýZ9”ýZ9wé³8wé³8�•Y9�•Y9Äž±8Äž±84(X94(X9 M¯8 M¯8µV9µV9ôõ¬8ôõ¬8=U9=U9xšª8xšª8öÀS9öÀS9c9¨8c9¨8t?R9t?R9õÓ¥8õÓ¥8ùP9ùP9±j£8±j£8›/O9›/O92ý 82ý 8e¡M9e¡M9�ž8�ž8¨L9¨L9èœ8èœ8àyJ9àyJ9y£™8y£™8¬àH9¬àH9¯+—8¯+—8�DG9�DG9¹±”8¹±”8š¤E9š¤E9y4’8y4’8fD9fD9Õ¶�8Õ¶�8 \B9 \B9r8�8r8�8г@9г@9ð·Š8ð·Š8<?9<?9S7ˆ8S7ˆ8ÈZ=9ÈZ=9×µ…8×µ…8Fª;9Fª;9�2ƒ8�2ƒ8,÷99,÷99‚¯€8‚¯€8OB89OB89VY|8VY|8‹69‹696Sw86Sw8TÒ49TÒ49Rr8Rr8ð39ð39ÒTm8ÒTm8Ã]19Ã]19ÆWh8ÆWh8¡/9¡/9`c8`c8ä-9ä-9�m^8�m^8¸%,9¸%,9¶|Y8¶|Y8Lf*9Lf*9“T8“T8§(9§(9ý°O8ý°O8Zç&9Zç&9IÓJ8IÓJ8ý&%9ý&%92ýE82ýE8ïf#9ïf#9è.A8è.A8g¦!9g¦!9e<8e<8Vå9Vå9¬¢78¬¢78‹$9‹$9–ç28–ç28Kc9Kc9²1.8²1.8û¡9û¡9…)8…)8]á9]á9Úà$8Úà$8ª 9ª 9_C 8_C 8[`9[`95°85°8ß 9ß 9%8%8@á9@á9“ 8“ 83"93"9‰'8‰'8‚d9‚d9õ¸ 8õ¸ 8e§ 9e§ 9mS8mS8~ë 9~ë 9Hû8Hû8[1 9[1 9¬\ù7¬\ù7ôw9ôw9KÕð7KÕð7Ù¿9Ù¿98hè78hè7{ 9{ 9Xà7Xà7T9T9âÏ×7âÏ×7� 9� 9A­Ï7A­Ï7ÖÞý8ÖÞý8ƤÇ7ƤÇ7Sú8Sú8¶²¿7¶²¿7…#÷8…#÷8ˆÝ·7ˆÝ·7)Ìó8)Ìó8Ü!°7Ü!°7êwð8êwð8~¨7~¨7×'í8×'í8¥÷ 7¥÷ 7uÜé8uÜé8É‹™7É‹™7䔿8䔿8ä:’7ä:’7†Rã8†Rã8n ‹7n ‹7{à8{à8^õƒ7^õƒ7†ÜÜ8†ÜÜ8äöy7äöy7è¨Ù8è¨Ù8øCl7øCl7üzÖ8üzÖ8®Ë^7®Ë^7÷QÓ8÷QÓ8ˆŽQ7ˆŽQ7Ú.Ð8Ú.Ð8”D7”D7ÚÍ8ÚÍ8h×77h×77múÉ8múÉ8®Y+7®Y+7NéÆ8NéÆ8&7&7ÞÃ8ÞÃ8779ØÀ89ØÀ8WW7WW7Ù½8Ù½8S®÷6S®÷6Gàº8Gàº8æ+á6æ+á6Áí·8Áí·8¬+Ë6¬+Ë6µ8µ8ó±µ6ó±µ6ä²8ä²8R¯ 6R¯ 6Œ=¯8Œ=¯8¾%Œ6¾%Œ6›d¬8›d¬8ë1p6ë1p6ú‘©8ú‘©8” I6” I6ÚŦ8ÚŦ8Pæ"6Pæ"6�¤8�¤8lzû5lzû5ËA¡8ËA¡8ì³5ì³5P‰ž8P‰ž8qÖX5qÖX5D×›8D×›8 }ž4 }ž4.+™8.+™8à`[´à`[´…–8…–8Ì"9µÌ"9µ¤æ“8¤æ“8Û›µÛ›µN‘8N‘8NgÙµNgٵ88�Ž ¶�Ž ¶”0Œ8”0Œ8î'¶î'¶ «‰8 «‰8¨•C¶¨•C¶-‡8-‡8˜Æ^¶˜Æ^¶_µ„8_µ„8«y¶«y¶�D‚8�D‚8%6‰¶%6‰¶²µ8²µ8³l•¶³l•¶?ðz8?ðz8®2¡¶®2¡¶¤8v8¤8v8w�¬¶w�¬¶$�q8$�q8èU·¶èU·¶ öl8 öl8¼Á¶¼Á¶tih8tih8B²Ë¶B²Ë¶Ÿëc8Ÿëc81Õ¶1Õ¶„|_8„|_8cAÞ¶cAÞ¶,[8,[8�äæ¶�äæ¶dÈV8dÈV8žï¶žï¶ÒƒR8ÒƒR8½àö¶½àö¶ÛLN8ÛLN8n@þ¶n@þ¶h$J8h$J8eš·eš·› F8› F8aä·aä·ÿûA8ÿûA8¿û·¿û·Êü=8Êü=8ÑÞ ·ÑÞ ·Z :8Z :83“·3“·×&68×&68Z·Z·QP28QP28k·k·’‡.8’‡.8C‘·C‘·µË*8µË*8YŠ·YŠ·\'8\'8EU·EU·A|#8A|#8Üõ·Üõ·Ðç8Ðç8l·l·Š`8Š`8¤··¤··æ8æ8OÛ·OÛ·6x86x8=Ö·=Ö·h8h80© ·0© ·ëÂ8ëÂ8X!·X!·vz 8vz 8…á!·…á!·Ñ>8Ñ>8^E"·^E"·88 ‰"· ‰"·Ëê8Ëê8eª"·eª"·>¦ý7>¦ý7¾§"·¾§"·²Ž÷7²Ž÷7‡"·‡"·L�ñ7L�ñ7¥G"·¥G"·¤ë7¤ë7 ç!· ç!·}Òå7}Òå7j!·j!·æà7æà7IÐ ·IÐ ·ñrÚ7ñrÚ7J ·J ·æÔ7æÔ7ÅE·ÅE·oÏ7oÏ7EX·EX·oÊ7oÊ7ÃN·ÃN·cÆÄ7cÆÄ7â,·â,·(“¿7(“¿7eñ·eñ·cwº7cwº7i›·i›·êqµ7êqµ7V/·V/·­�°7­�°7«¬·«¬·ê§«7ê§«7Ç·Ç·½ã¦7½ã¦7Se·Se·<4¢7<4¢7¤·¤·Xš�7Xš�7ÁηÁηP™7P™7:è ·:è ·›¤”7›¤”7(ð ·(ð ·»H�7»H�7œç ·œç ·ŒŒ7ŒŒ73Ñ·3Ñ·âˇ7âˇ7¬·¬·h«ƒ7h«ƒ7×x·×x·&<7&<7:·:·×Gw7×Gw7•Üý¶•Üý¶}{o7}{o7-ù¶-ù¶XÔg7XÔg7âkô¶âkô¶ËQ`7ËQ`7.—ï¶.—ï¶0õX70õX7y°ê¶y°ê¶˜¼Q7˜¼Q7t¼å¶t¼å¶ §J7 §J7¾¹à¶¾¹à¶^·C7^·C7ϩ۶ϩ۶,ê<7,ê<7Á�Ö¶Á�Ö¶‹?67‹?67mnѶmnѶͷ/7Í·/7÷D̶÷D̶“Q)7“Q)7?Ƕ?Ƕç #7ç #7RäÁ¶RäÁ¶{ê7{ê7t­¼¶t­¼¶Qé7Qé7$u·¶$u·¶X 7X 7!;²¶!;²¶ÅJ 7ÅJ 7c­¶c­¶œ¬7œ¬7Íɧ¶Íɧ¶/7/7-”¢¶-”¢¶4¤õ64¤õ6"b�¶"b�¶„*ë6„*ë6û4˜¶û4˜¶@ñà6@ñà6ï “¶ï “¶BøÖ6BøÖ6¬ë�¶¬ë�¶N>Í6N>Í6¯Òˆ¶¯Òˆ¶GÃÃ6GÃÃ6–ƒ¶–ƒ¶À†º6À†º6z}¶z}¶Â‡±6‡±67†s¶7†s¶rƨ6rƨ6wªi¶wªi¶ŽB 6ŽB 6Îé_¶Îé_¶Gû—6Gû—6FV¶FV¶Àð�6Àð�6jÀL¶jÀL¶†"ˆ6†"ˆ6º[C¶º[C¶ì�€6ì�€6Õ:¶Õ:¶—qr6—qr6“ü0¶“ü0¶$9d6$9d6Y(¶Y(¶ÆuV6ÆuV6~8¶~8¶r'I6r'I6¡”¶¡”¶M<6M<6¶¶Ùå/6Ùå/6xÓ¶xÓ¶kñ#6kñ#6ÕrûµÕrûµ n6 n6´¢ëµ´¢ëµ™\ 6™\ 6P9ܵP9ܵ'»6'»6™9͵™9͵ñ5ñ5§¾µ§¾µ“ŽÝ5“ŽÝ5.„°µ.„°µðçÊ5ðçÊ5 Ô¢µ Ô¢µ¹5¹5Ø›•µØ›•µF-¨5F-¨52܈µ2܈µ}˜5}˜5V2yµV2yµ¿Ùˆ5¿Ùˆ5q¬aµq¬aµéåt5éåt5¦+Kµ¦+Kµ`ÄY5`ÄY5)¶5µ)¶5µyK@5yK@5dR!µdR!µ—x(5—x(5$µ$µ™H5™H5c°÷´c°÷´ oû4 oû4�Õ´�Õ´ÿ†Õ4ÿ†Õ4?ßµ´?ßµ´oв4oв4 ƒ˜´ ƒ˜´�D“4�D“4y){´y){´½»m4½»m4ñ>J´ñ>J´,+;4,+;4:`´:`´ÖÇ4ÖÇ4xLï³xLï³ûÑ3ûÑ3gR¬³gR¬³Ã��3Ã��3� h³� h³gg83gg83ù- ³ù- ³*¦Î2*¦Î2^ã�²^ã�²9÷629÷62mÕѱmÕѱÿ;61ÿ;61Ê•;°Ê•;°IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/BinauralDecoder/Source/EQ/README.txt0000664002537200253720000000034415257173642031116 0ustar zmoelnigzmoelnigThese impulse responses were created by Benjamin Bernschuetz. [1] Bernschuetz, B. (2013. A Spherical Far Field HRIR/HRTF Compilation of the Neumann KU 100. AIA-DAGA 2013 Merano. http://audiogroup.web.th-koeln.de/ku100hrir.html ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/BinauralDecoder/Source/EQ/SHURE-SRH940.wavIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/BinauralDecoder/Source/EQ/SHURE-SRH90000664002537200253720000004013015257173642030751 0ustar zmoelnigzmoelnigRIFFP@WAVEfmt €»Ü factPEAKác YIV?IV?data@IV?IV?ýˆ½ýˆ½£\=£\=$#=$#=;¡F¾;¡F¾×Ђ½×Ђ½^È‹¼^È‹¼b:´m>:).3:).3:„÷;:„÷;:¿ß0:¿ß0:RØ9:RØ9:=ü.:=ü.:ñS8:ñS8:÷ç-:÷ç-:Y—7:Y—7:¦f-:¦f-:-E7:-E7:B-:B-:[\7:[\7:é©-:é©-::$8::$8:Ð.:Ð.:‘9:‘9:4f0:4f0:¹N;:¹N;:\2:\2:*Š=:*Š=:é4:é4:\m@:\m@:ø8:ø8:¿ÄC:¿ÄC:#‡;:#‡;:éQG:éQG:.?:.?:!K:!K:2C:2C:=O:=O:ymG:ymG:l¬S:l¬S:nüK:nüK:BQX:BQX:ó±P:ó±P:Î)]:Î)]:Ê´U:Ê´U:ÔNb:ÔNb:€úZ:€úZ:'§g:'§g:lD`:lD`:ãØl:ãØl:he:he:õq:õq:Y…j:Y…j:ðw:ðw:µ§o:µ§o:÷)|:÷)|:"›t:"›t:À~€:À~€:Oy:Oy:Ï‚:Ï‚:¿ç}:¿ç}:�…:�…:t'�:t'�:/‡:/‡:å&ƒ:å&ƒ:€‰:€‰:›ð„:›ð„:ÈŠ:ÈŠ:ñ�†:ñ�†:CNŒ:CNŒ:9ÿ‡:9ÿ‡:Z¥�:Z¥�:ò;‰:ò;‰:\ÌŽ:\ÌŽ:�LŠ:�LŠ:wÁ�:wÁ�:&‹:&‹:v�:v�:CË:CË:û�:û�:S Œ:S Œ:G9‘:G9‘:c=Œ:c=Œ:A8‘:A8‘:hŒ:hŒ:Hù�:Hù�:Ò¾‹:Ò¾‹:µ|�:µ|�:t)‹:t)‹:™Ð�:™Ð�:ñgŠ:ñgŠ: ÷Ž: ÷Ž:òo‰:òo‰::ß�::ß�:ô:ˆ:ô:ˆ:Þ�Œ:Þ�Œ:½Ô†:½Ô†:‹:‹:øG…:øG…:Ms‰:Ms‰:ý‹ƒ:ý‹ƒ:ÜŸ‡:ÜŸ‡:ñ£�:ñ£�:ª…:ª…:»I:»I:!¡ƒ:!¡ƒ:Æ {:Æ {: ƒ�: ƒ�:DÐv:DÐv:âŸ~:âŸ~:\r:\r:#z:#z:<Òm:<Òm: �u: �u:r8i:r8i:æép:æép:V†d:V†d:ô5l:ô5l:zÔ_:zÔ_:‰g:‰g:34[:34[:>ùb:>ùb:,³V:,³V:Œ‹^:Œ‹^:ÆZR:ÆZR:ËJZ:ËJZ: 2N: 2N:“6V:“6V:X/J:X/J:.JR:.JR:2]F:2]F:Ê•N:Ê•N:AÇB:AÇB:eK:eK:˜g?:˜g?:pØG:pØG:ÎC<:ÎC<:šÝD:šÝD:v9:v9:÷:B:÷:B:üù6:üù6:¦â?:¦â?:æÂ4:æÂ4:NÑ=:NÑ=:wÜ2:wÜ2:<<:<<:P1:P1:Ó¶::Ó¶::0:0:Õž9:Õž9:ç/:ç/:ìË8:ìË8:õn.:õn.:g>8:g>8:yþ-:yþ-:Æë7:Æë7:Ë-:Ë-:—Ô7:—Ô7:7Î-:7Î-:2ö7:2ö7:• .:• .:|P8:|P8:m….:m….:)è8:)è8:å5/:å5/:M®9:M®9:õ0:õ0:å˜::å˜::¿1:¿1:ý ;:ý ;:p2:p2:G½<:G½<:X>3:X>3:Så=:Så=:�i4:�i4:0?:0?:| 5:| 5:PU@:PU@:è6:è6:3¢A:3¢A:ý58:ý58:LìB:LìB:ÿz9:ÿz9:˜/D:˜/D:¼::¼::AnE:AnE:Õõ;:Õõ;:¶œF:¶œF:‰=:‰=:a§G:a§G:ž>:ž>:…šH:…šH:ƒù>:ƒù>:N|I:N|I:žÊ?:žÊ?:ã7J:ã7J:p@:p@:ŒÉJ:ŒÉJ:Iî@:Iî@:7K:7K:ÜIA:ÜIA:ò|K:ò|K:ÆwA:ÆwA:•K:•K:êyA:êyA:2„K:2„K:‹XA:‹XA:bRK:bRK:*A:*A:÷J:÷J:¢@:¢@:vqJ:vqJ:Ó@:Ó@:þ¾I:þ¾I:Ã:NF>:ÈÓG:ÈÓG:V#=:V#=:�F:�F:/Û;:/Û;:DE:DE:¬p::¬p::ŒÊC:ŒÊC:˜æ8:˜æ8:¶/B:¶/B:R<7:R<7: w@: w@:äs5:äs5:÷¡>:÷¡>:˜‘3:˜‘3:°<:°<:pŽ1:pŽ1:áœ::áœ::j/:j/:•i8:•i8:q*-:q*-:ç 6:ç 6:+Ù*:+Ù*:¦Ç3:¦Ç3:'v(:'v(:æZ1:æZ1:Yÿ%:Yÿ%:ýÝ.:ýÝ.:‹#:‹#:·\,:·\,:ëù :ëù :ºÐ):ºÐ):Èc:Èc:g0':g0':»:»:ûƒ$:ûƒ$:  :  :Ë×!:Ë×!:^`:^`:t(:t(:®:®:æt:æt:Éú:Éú:ÜÅ:ÜÅ:wO:wO:::Ó¦ :Ó¦ :Ns:Ns:èù:èù:±Å:±Å:ÄL:ÄL:0:0:í¤:í¤:nu :nu :Uÿ:Uÿ:XÒ :XÒ :V¾ü9V¾ü96:6:<�÷9<�÷9ž¢:ž¢:Ømò9Ømò9ã:ã:×\í9×\í9�$ÿ9�$ÿ9ÍWè9ÍWè9>%ú9>%ú9^ã9^ã92õ92õ9ômÞ9ômÞ9iGð9iGð9͆Ù9͆Ù9¼bë9¼bë9ù£Ô9ù£Ô9‡æ9‡æ9AÍÏ9AÍÏ9Úµá9Úµá9Ë9Ë9…ïÜ9…ïÜ9¯=Æ9¯=Æ9²3Ø9²3Ø9ÔŠÁ9ÔŠÁ9ú‹Ó9ú‹Ó9™ë¼9™ë¼9¬ôÎ9¬ôÎ9V¸9V¸9`Ê9`Ê9œÂ³9œÂ³9õÐÅ9õÐÅ9Û5¯9Û5¯9ŒIÁ9ŒIÁ9¾°ª9¾°ª9�ļ9�ļ9¿)¦9¿)¦9/@¸9/@¸9V¨¡9V¨¡9²Æ³9²Æ³9 9�9 9�9ªd¯9ªd¯9šà˜9šà˜9F«9F«9Ž•”9Ž•”9oͦ9oͦ9›O�9›O�9Ž¢9Ž¢99Œ99Œ9º[ž9º[ž9Úç‡9Úç‡9º0š9º0š9?»ƒ9?»ƒ9‚–9‚–9)9)9²ç‘9²ç‘9^ýv9^ýv9dÝ�9dÝ�9Lùn9Lùn9nâ‰9nâ‰9g9g9œõ…9œõ…9@_9@_9j‚9j‚9i–W9i–W9S–|9S–|9ëP9ëP9¤u9¤u9Z‹H9Z‹H9£m9£m9v&A9v&A9}Nf9}Nf9ÜÜ99ÜÜ99S_9S_9…©29…©29êW9êW9±ˆ+9±ˆ+9™ØP9™ØP9¾ƒ$9¾ƒ$9CãI9CãI9˜9˜9€C9€C9½9½9p4<9p4<9ýü9ýü9w…59w…59HV 9HV 9 é.9 é.9¿9¿93Y(93Y(9kø8kø8¡Ü!9¡Ü!9~ë8~ë8fl9fl9x™Þ8x™Þ8fø9fø9©Ñ8©Ñ8ø‚9ø‚9Þ¾Ä8Þ¾Ä8–9–9�à·8�à·8­¦9­¦9«8«8¦{ö8¦{ö8“1ž8“1ž8T¬é8T¬é8`‘8`‘8GÜÜ8GÜÜ8σ„8σ„8›øÏ8›øÏ8Co8Co8àëÂ8àëÂ8μT8μT8J¥µ8J¥µ8 é98 é98½"¨8½"¨8@ª8@ª8sš8sš888”œŒ8”œŒ8ûvÎ7ûvÎ7h-}8h-}8â•7â•7@µ`8@µ`8^ã87^ã876ÔC86ÔC8ÿ‰6ÿ‰6Qƒ&8Qƒ&8èÂH¶èÂH¶kŠ8kŠ8|�+·|�+·$ÜÓ7$ÜÓ7@““·@““·»¥•7»¥•7ûaÒ·ûaÒ·©,7©,7ä# ¸ä# ¸Ææ/6Ææ/6õŸ)¸õŸ)¸L«­¶L«­¶¢•J¸¢•J¸Ô�[·Ô�[·[l¸[l¸~ó°·~󰷢톸¢í†¸éýô·éýô·5˜¸5˜¸ôø¸ôø¸0r©¸0r©¸ ç?¸ ç?¸ì»¸ì»¸Æ c¸Æ c¸µÌ¸µÌ¸Uƒ¸Uƒ¸?•Þ¸?•Þ¸@E•¸@E•¸ß–ð¸ß–ð¸GH§¸GH§¸YP¹YP¹ÙO¹¸ÙO¹¸4Y ¹4Y ¹Ïh˸Ïh˸Cn¹Cn¹°’ݸ°’ݸO„¹O„¹L·ï¸L·ï¸ß•%¹ß•%¹åç¹å繿¤.¹¿¤.¹ˆô ¹ˆô ¹×¯7¹×¯7¹C÷¹C÷¹0«@¹0«@¹•⹕â¹%ŒI¹%ŒI¹ë¶$¹ë¶$¹eWR¹eWR¹Us-¹Us-¹ƒ[¹ƒ[¹õ6¹õ6¹Ã•c¹Ã•c¹×‹>¹×‹>¹™l¹™l¹ÁéF¹ÁéF¹çUt¹çUt¹C(O¹C(O¹Åƒ|¹Åƒ|¹†>W¹†>W¹ÝB‚¹ÝB‚¹½&_¹½&_¹¾+†¹¾+†¹ÜÛf¹ÜÛf¹Îù‰¹Îù‰¹ºWn¹ºWn¹ ©�¹ ©�¹c”u¹c”u¹¨8‘¹¨8‘¹Ô‘|¹Ô‘|¹ú©”¹ú©”¹ªª�¹ªª�¹;þ—¹;þ—¹�4›¹�4›¹âˆ¹âˆ¹ Jž¹ Jž¹l‹¹l‹¹¤=¡¹¤=¡¹ù�¹ù�¹¤¹¤¹·¸�¹·¸�¹A¾¦¹A¾¦¹£R“¹£R“¹:F©¹:F©¹ÓÆ•¹ÓÆ•¹è©«¹è©«¹@˜¹@˜¹×ë­¹×ë­¹ZGš¹ZG𹂠°¹‚ °¹XQœ¹XQœ¹?²¹?²¹19ž¹19ž¹<ܳ¹<ܳ¹ù ¹ù ¹½”µ¹½”µ¹Í¦¡¹Í¦¡¹]*·¹]*·¹Æ*£¹Æ*£¹& ¸¹& ¸¹I�¤¹I�¤¹Þ÷¹¹Þ÷¹¹âÖ¥¹âÖ¥¹Ê.»¹Ê.»¹¶û¦¹¶û¦¹HE¼¹HE¼¹~¨¹~¨¹•?½¹•?½¹ÿí¨¹ÿí¨¹`¾¹`¾¹,½©¹,½©¹ùྐྵùྐྵ�qª¹�qª¹nŠ¿¹nŠ¿¹©«¹©«¹ßÀ¹ßÀ¹ð—«¹ð—«¹:ŸÀ¹:ŸÀ¹{ ¬¹{ ¬¹í Á¹í Á¹Îj¬¹Îj¬¹Ý_Á¹Ý_Á¹Î¶¬¹Î¶¬¹‡¤Á¹‡¤Á¹ëñ¬¹ëñ¬¹ÛØÁ¹ÛØÁ¹Ú­¹Ú­¹ÏúÁ¹ÏúÁ¹•4­¹•4­¹÷ ¹÷ ¹B@­¹B@­¹Ó¹Ó¹ÃA­¹ÃA­¹Û¹Û¹–7­¹–7­¹´¹´¹n#­¹n#­¹¶íÁ¹¶íÁ¹±­¹±­¹ÐÁ¹ÐÁ¹欹欹f¬Á¹f¬Á¹ª¼¬¹ª¼¬¹D€Á¹D€Á¹#‹¬¹#‹¬¹áLÁ¹áLÁ¹½S¬¹½S¬¹'Á¹'Á¹w¬¹w¬¹Q×À¹Q×À¹׫¹׫¹Ã–À¹Ã–À¹è”«¹è”«¹ôUÀ¹ôUÀ¹S«¹S«¹*À¹*À¹Ù«¹Ù«¹¿Õ¿¹¿Õ¿¹Ъ¹Ъ¹]•¿¹]•¿¹ó�ª¹ó�ª¹fT¿¹fT¿¹¼¹Ì>¼¹e"§¹e"§¹F÷»¹F÷»¹¬×¦¹¬×¦¹¾¬»¹¾¬»¹ ‹¦¹ ‹¦¹a»¹a»¹–<¦¹–<¦¹ »¹ »¹¾è¥¹¾è¥¹¼º¹¼º¹äŽ¥¹äŽ¥¹Haº¹Haº¹•0¥¹•0¥¹9º¹9º¹Tͤ¹Tͤ¹�¹¹�¹¹c¤¹c¤¹¤0¹¹¤0¹¹¡ñ£¹¡ñ£¹F½¸¹F½¸¹ty£¹ty£¹ÞB¸¹ÞB¸¹[ù¢¹[ù¢¹˜¿·¹˜¿·¹Ðo¢¹Ðo¢¹²2·¹²2·¹™Ü¡¹™Ü¡¹'œ¶¹'œ¶¹®?¡¹®?¡¹¢ûµ¹¢ûµ¹§˜ ¹§˜ ¹CQµ¹CQµ¹Þ矹Þ矹¾œ´¹¾œ´¹�,Ÿ¹�,Ÿ¹ݳ¹ݳ¹ fž¹ fž¹¿³¹¿³¹™”�¹™”�¹Ò=²¹Ò=²¹½¸œ¹½¸œ¹¹]±¹¹]±¹OÑ›¹OÑ›¹Áq°¹Áq°¹øÝš¹øÝš¹£z¯¹£z¯¹à™¹à™¹Àx®¹Àx®¹ט¹ט¹qk­¹qk­¹?—¹?—¹kR¬¹kR¬¹ä¡–¹ä¡–¹s-«¹s-«¹mu•¹mu•¹Ïü©¹Ïü©¹£=”¹£=”¹RÁ¨¹RÁ¨¹Ñû’¹Ñû’¹?|§¹?|§¹I°‘¹I°‘¹…-¦¹…-¦¹X[�¹X[�¹hÕ¤¹hÕ¤¹ý޹ý޹jt£¹jt£¹ –�¹ –�¹Ì ¢¹Ì ¢¹£$Œ¹£$Œ¹ð” ¹ð” ¹©Š¹©Š¹=Ÿ¹=Ÿ¹ú$‰¹ú$‰¹ä��¹ä��¹™‡¹™‡¹ œ¹ œ¹<†¹<†¹Tmš¹Tmš¹m„¹m„¹Ó˜¹Ó˜¹0΂¹0΂¹ß2—¹ß2—¹œ)�¹œ)�¹ôŒ•¹ôŒ•¹æþ~¹æþ~¹⓹⓹¡{¹¡{¹J2’¹J2’¹ß9x¹ß9x¹I~�¹I~�¹ÿÊt¹ÿÊt¹ùÆŽ¹ùÆŽ¹±Vq¹±Vq¹ �¹ �¹”Üm¹”Üm¹;P‹¹;P‹¹*]j¹*]j¹.‘‰¹.‘‰¹cÛf¹cÛf¹DÒ‡¹DÒ‡¹OZc¹OZc¹ÿ†¹ÿ†¹º×_¹º×_¹ÚR„¹ÚR„¹¾S\¹¾S\¹“‚¹“‚¹bÒX¹bÒX¹¼Ô€¹¼Ô€¹ýSU¹ýSU¹,/~¹,/~¹lÖQ¹lÖQ¹\µz¹\µz¹ýZN¹ýZN¹@w¹@w¹ÍåJ¹ÍåJ¹³Ñs¹³Ñs¹,wG¹,wG¹ip¹ip¹ü D¹ü D¹†m¹†m¹ø«@¹ø«@¹)¬i¹)¬i¹ºR=¹ºR=¹“Zf¹“Zf¹ò:¹ò:¹hc¹hc¹É¹6¹É¹6¹Ñ_¹Ñ_¹Åz3¹Åz3¹fš\¹fš\¹ðE0¹ðE0¹¢nY¹¢nY¹Œ-¹Œ-¹:NV¹:NV¹þ)¹þ)¹8S¹8S¹˜ê&¹˜ê&¹¾.P¹¾.P¹ä#¹ä#¹02M¹02M¹ê ¹ê ¹)AJ¹)AJ¹]û¹]û¹'\G¹'\G¹µ¹µ¹J…D¹J…D¹ÄF¹ÄF¹µ¼A¹µ¼A¹ �¹ �¹Œ?¹Œ?¹È¹È¹¡R<¹¡R<¹J¹J¹¦³9¹¦³9¹ý‚ ¹ý‚ ¹j"7¹j"7¹Oô ¹Oô ¹·�4¹·�4¹s¹s¹þ&2¹þ&2¹[¹[¹Â¿/¹Â¿/¹Õœ¹Õœ¹µf-¹µf-¹©G¹©G¹½+¹½+¹1þ¸1þ¸-ã(¹-ã(¹ˆšù¸ˆšù¸Œ¹&¹Œ¹&¹÷Mõ¸÷Mõ¸6�$¹6�$¹Åñ¸Åñ¸¼�"¹¼�"¹Sí¸Sí¸Œ ¹Œ ¹8é¸8é¸s—¹s—¹=!å¸=!å¸k¯¹k¯¹¨WḨWá¸óÕ¹óչǬݸǬݸ2 ¹2 ¹.Ú¸.Ú¸=N¹=N¹5¨Ö¸5¨Ö¸mœ¹mœ¹IÓ¸IÓ¸ùõ¹ùõ¹}ÿϸ}ÿϸ|Z¹|Z¹¡Ë̸¡Ë̸óȹóȹðªÉ¸ðªÉ¸aA¹aA¹üžÆ¸üžÆ¸ÎÄ ¹ÎÄ ¹EªÃ¸EªÃ¸…S ¹…S ¹YÉÀ¸YÉÀ¸ë ¹ë ¹®ù½¸®ù½¸m‹ ¹m‹ ¹­<»¸­<»¸“5¹“5¹1’¸¸1’¸¸àç¹àç¹½öµ¸½öµ¸¡¹¡¹,j³¸,j³¸nc¹nc¹Mï°¸Mï°¸½-¹½-¹(„®¸(„®¸gÿ¹gÿ¹Q%¬¸Q%¬¸jÖ¹jÖ¹ÎÑ©¸ÎÑ©¸gÿ¸gÿ¸ÙЧ¸ÙЧ¸Ô.ý¸Ô.ý¸¶Q¥¸¶Q¥¸Ðû¸Ðû¸#£¸#£¸—àø¸—àø¸úý ¸úý ¸ÝÈö¸ÝÈö¸5垸5垸_¾ô¸_¾ô¸žØœ¸žØœ¸ú½ò¸ú½ò¸,Ôš¸,Ôš¸ËÄð¸ËÄð¸´×˜¸´×˜¸wÕî¸wÕî¸5æ–¸5æ–¸ñì¸ñì¸Úþ”¸Úþ”¸¦븦븞“¸ž“¸�Bé¸�Bé¸xI‘¸xI‘¸Œy縌yç¸~�¸~�¸»å¸»å¸¼�¸¼�¸¶丶丌¸Œ¸*Wâ¸*Wâ¸{QЏ{QЏ\³à¸\³à¸Ý©ˆ¸Ý©ˆ¸æ߸æ߸y‡¸y‡¸Ú€Ý¸Ú€Ý¸Ån…¸Ån…¸RôÛ¸RôÛ¸“߃¸“߃¸{qÚ¸{qÚ¸GX‚¸GX‚¸–õظ–õظ6Ø€¸6Ø€¸}‚׸}‚׸ºÅ~¸ºÅ~¸cÖ¸cÖ¸sî{¸sî{¸ÖºÔ¸ÖºÔ¸”%y¸”%y¸¼aÓ¸¼aÓ¸Ókv¸Ókv¸ÉÒ¸ÉÒ¸Æs¸Æs¸:Ìи:Ìи3q¸3q¸)ŽÏ¸)ŽÏ¸®n¸®n¸$Xθ$Xθ¤:l¸¤:l¸“+͸“+͸ñÛi¸ñÛi¸¨ ̸¨ ̸´‘g¸´‘g¸ÈñʸÈñʸ�[e¸�[e¸µãɸµãɸá7c¸á7c¸÷Þȸ÷Þȸà'a¸à'a¸–ãǸ–ãǸ )_¸ )_¸¢ðƸ¢ðƸ9]¸9]¸ƸƸ“V[¸“V[¸ŸŸv…Y¸v…Y¸àDĸàDĸ!ÌW¸!ÌW¸åuøåuøE(V¸E(V¸¡±Â¸¡±Â¸ ™T¸ ™T¸ øÁ¸ øÁ¸¸ S¸¸ S¸’IÁ¸’IÁ¸B¼Q¸B¼Q¸¤À¸¤À¸\gP¸\gP¸VÀ¸VÀ¸Ý O¸Ý O¸o¿¸o¿¸ëM¸ëM¸°à¾¸°à¾¸.ÇL¸.ÇL¸?\¾¸?\¾¸µ¶K¸µ¶K¸ÕὸÕὸŒ»J¸Œ»J¸§q½¸§q½¸aÓI¸aÓI¸î ½¸î ½¸8ýH¸8ýH¸„¬¼¸„¬¼¸W7H¸W7H¸¹U¼¸¹U¼¸%~G¸%~G¸x¼¸x¼¸5ÏF¸5ÏF¸h¸»¸h¸»¸ý,F¸ý,F¸!t»¸!t»¸ÉšE¸ÉšE¸f7»¸f7»¸…E¸…E¸Ó»¸Ó»¸c�D¸c�D¸xк¸xк¸W2D¸W2D¸î¦º¸î¦º¸cÓC¸cÓC¸s‚º¸s‚º¸Å{C¸Å{C¸_aº¸_aº¸-C¸-C¸~Eº¸~Eº¸+èB¸+èB¸.º¸.º¸j«B¸j«B¸|º¸|º¸ïvB¸ïvB¸­ º¸­ º¸LB¸LB¸Øº¸Øº¸°&B¸°&B¸ø¹¸ø¹¸®B¸®B¸*ò¹¸*ò¹¸iëA¸iëA¸‚ﹸ‚ﹸÀÕA¸ÀÕA¸ÁA¸ÁA¸í¹¸í¹¸7®A¸7®A¸oí¹¸oí¹¸ð�A¸ð�A¸ÏÏ?ŽA¸?ŽA¸}ﹸ}ﹸó{A¸ó{A¸��ËeA¸ËeA¸ü빸ü빸 MA¸ MA¸é繸é繸d0A¸d0A¸Ṹá¹¸Š A¸Š A¸}Õ¹¸}Õ¹¸Ý@¸Ý@¸ʏʏ[¥@¸[¥@¸°¹¸°¹¸}b@¸}b@¸T”¹¸T”¹¸„@¸„@¸Žp¹¸Žp¹¸¶®?¸¶®?¸¤E¹¸¤E¹¸›??¸›??¸ ¹¸ ¹¸Â>¸Â>¸+Ú¸¸+Ú¸¸;1>¸;1>¸±•¸¸±•¸¸‹=¸‹=¸GG¸¸GG¸¸ËÑ<¸ËÑ<¸ï·¸ï·¸\<¸\<¸ÑŠ·¸ÑŠ·¸6;¸6;¸¯·¸¯·¸’:¸’:¸H�¶¸H�¶¸û9¸û9¸¬¶¸¬¶¸òÒ7¸òÒ7¸0€µ¸0€µ¸(‡6¸(‡6¸ Ý´¸ Ý´¸  5¸  5¸^-´¸^-´¸—¡3¸—¡3¸Êp³¸Êp³¸¨2¸¨2¸×¦²¸×¦²¸ÙR0¸ÙR0¸Yϱ¸Yϱ¸ƒ.¸ƒ.¸Rê°¸Rê°¸R—,¸R—,¸ßö¯¸ßö¯¸®�*¸®�*¸ïó®¸ï󮸒e(¸’e(¸åâ­¸åâ­¸I"&¸I"&¸oĬ¸oĬ¸úÄ#¸úÄ#¸Í˜«¸Í˜«¸=L!¸=L!¸`ª¸`ª¸’»¸’»¸Þ©¸Þ©¸Ø¸Ø¸Ë˧¸Ë˧¸ÚQ¸ÚQ¸]m¦¸]m¦¸ss¸ss¸”¥¸”¥¸{¸{¸‰£¸‰£¸_i¸_i¸‘¢¸‘¢¸= ¸= ¸.q ¸.q ¸7ø ¸7ø ¸:Óž¸:Óž¸ž¸ž¸\+�¸\+�¸a0¸a0¸€y›¸€y›¸![ÿ·![ÿ·Æ¼™¸Æ¼™¸”+ø·”+ø·ö—¸ö—¸©Òð·©Òð·Ž$–¸Ž$–¸Né·Né·ÆG”¸ÆG”¸Jšá·Jšá·^_’¸^_’¸¯ºÙ·¯ºÙ·¨l�¸¨l�¸F³Ñ·F³Ñ·apޏapޏ †É· †É·‘jŒ¸‘jŒ¸‹3Á·‹3Á·ö[Џö[Š¸Â¾¸·Â¾¸·Eˆ¸Eˆ¸D*°·D*°·þ%†¸þ%†¸%q§·%q§· ýƒ¸ ýƒ¸€Žž·€Žž·¥É�¸¥É�¸Ýƒ•·Ýƒ•·m¸m¸áSŒ·áSŒ·ÇŒz¸ÇŒz¸˜û‚·˜û‚·!ëu¸!ëu¸dõr·dõr·ƒ6q¸ƒ6q¸ ®_· ®_·&rl¸&rl¸%L·%L·æšg¸æšg¸>H8·>H8·ë­b¸ë­b¸v$·v$·g­]¸g­]¸Ë™·Ë™·¥™X¸¥™X¸:–õ¶:–õ¶´oS¸´oS¸�<˶�<˶È.N¸È.N¸¹9 ¶¹9 ¶£ÚH¸£ÚH¸Ë@i¶Ë@i¶xrC¸xrC¸h±¶h±¶aó=¸aó=¸ÝÄZµÝÄZµ³^8¸³^8¸¨C5¨C5&¶2¸&¶2¸>6>6ø,¸ø,¸_6_6�"'¸�"'¸ =Ÿ6 =Ÿ67!¸7!¸½ Ï6½ Ï6¡5¸¡5¸#[7#[7t¸t¸¼>7¼>7Þï¸Þï¸y27y27g¬¸g¬¸§ L7§ L7ïR¸ïR¸Ñõe7Ñõe7QÇ÷·QÇ÷·Ï€7Ï€7>¾ê·>¾ê·e�7e�7ŸŒÝ·ŸŒÝ·Óך7Óך7?2з?2зµq¨7µq¨7]²Â·]²Â·ï0¶7ï0¶7°µ·°µ·‰Ä7‰Ä7!H§·!H§·ýÒ7ýÒ7"^™·"^™·[Aà7[Aà7+P‹·+P‹·ªŒî7ªŒî7€Ez·€Ez·îõü7îõü7Ô³]·Ô³]·ž¼8ž¼8üë@·üë@·g 8g 8|ì#·|ì#·#j8#j8Ø··Ø··wÓ8wÓ8ï¯Ò¶ï¯Ò¶­H#8­H#8>‹—¶>‹—¶ÏÊ*8ÏÊ*8öý7¶öý7¶�X28�X28é«€µé«€µÂí98Âí98Ì_5Ì_5ÊŠA8ÊŠA8òh06òh06`0I8`0I8xÅ”6xÅ”6;ÝP8;ÝP8~ŒÑ6~ŒÑ6‘X8‘X8&H7&H7úL`8úL`8#è%7#è%7Zh8Zh8¼�D7¼�D7ÚÖo8ÚÖo8áfc7áfc7‹¢w8‹¢w8)�7)�7p8p8—Š�7—Š�7ŒŸƒ8ŒŸƒ8üŸ7üŸ7{ˆ‡8{ˆ‡8Os¯7Os¯7òr‹8òr‹8ï¾7ï¾71^�81^�8 nÎ7 nÎ7¾J“8¾J“8üóÝ7üóÝ7Ø8—8Ø8—8N~í7N~í7¾'›8¾'›8Ô ý7Ô ý7€Ÿ8€Ÿ87J87J8]£8]£8Í8Í8Zô¦8Zô¦8…Õ8…Õ8ãª8ãª8Ñ™8Ñ™8Ñ®8Ñ®8 ]%8 ]%8ä¾²8ä¾²8R -8R -8ˬ¶8ˬ¶8xã48xã48™šº8™šº8z¦<8z¦<8bˆ¾8bˆ¾8&iD8&iD8ÛuÂ8ÛuÂ8+L8+L8íbÆ8íbÆ8‹ëS8‹ëS8%OÊ8%OÊ8-ª[8-ª[8::Î8::Î8ðec8ðec8³#Ò8³#Ò8k8k8‘ Ö8‘ Ö8„Ór8„Ór8þñÙ8þñÙ8�…z8�…z8ÍÖÝ8ÍÖÝ8=�8=�8ºá8ºá88ð„88ð„8Ö›å8Ö›å8(Ĉ8(Ĉ8D{é8D{é8╌8╌8ŠXí8ŠXí8!e�8!e�83ñ83ñ8ü0”8ü0”8d õ8d õ8dø—8dø—8€Ûø8€Ûø8˜»›8˜»›8€©ü8€©ü8¾zŸ8¾zŸ8‘99‘99á4£8á4£8Ò9Ò9ýé¦8ýé¦8Žû9Žû9*šª8*šª8þØ9þØ9{E®8{E®8¤³9¤³9{ê±8{ê±8ÑŠ 9ÑŠ 9õ‡µ8õ‡µ8N^ 9N^ 9x¹8x¹8R. 9R. 9¾­¼8¾­¼8˜ú9˜ú9Ð4À8Ð4À8pÂ9pÂ9ù²Ã8ù²Ã8ý…9ý…9¹(Ç8¹(Ç8rE9rE9ý•Ê8ý•Ê8>9>9ùÍ8ùÍ8̵9̵9ÏPÑ8ÏPÑ8d9d9€šÔ8€šÔ8l 9l 9qÕ×8qÕ×8!¨9!¨9ZÛ8ZÛ8¢<9¢<9rÞ8rÞ8âÇ9âÇ9×#á8×#á8¥I!9¥I!9ˆä8ˆä8tÁ"9tÁ"9Àç8Àç8/$9/$9»Óé8»Óé8µ’%9µ’%9W”ì8W”ì8ì&9ì&9¹Aï8¹Aï8­:(9­:(9*Ûñ8*Ûñ8O~)9O~)9R`ô8R`ô8Ú¶*9Ú¶*9ÖÐö8ÖÐö8öã+9öã+9;,ù8;,ù8Ÿ-9Ÿ-9„rû8„rû8Ý.9Ý.9ä£ý8ä£ý8¬&/9¬&/9ü¿ÿ8ü¿ÿ8Ô%09Ô%092ã92ã9*19*19mÛ9mÛ9”29”29£È9£È9ÿÛ29ÿÛ29§ª9§ª9N«39N«39u�9u�9|n49|n49$M9$M9È%59È%59ë 9ë 9IÑ59IÑ59¼Ã9¼Ã9Îp69Îp69Qn9Qn9!79!79» 9» 9�‹79�‹79¢9¢9ê89ê89&+ 9&+ 9Öu89Öu89”¨ 9”¨ 9�Ø89�Ø89 9 9‰/99‰/99º‚ 9º‚ 9Òz99Òz99^ß 9^ß 9º99º99 1 9 1 9½í99½í99 x 9 x 9Ó:9Ó:98´ 98´ 9ø1:9ø1:9:å 9:å 96B:96B:9f 9f 9ûF:9ûF:9"' 9"' 9m@:9m@:9I8 9I8 9t.:9t.:9ÿ> 9ÿ> 9X:9X:9£; 9£; 9xé99xé99F. 9F. 9—¶99—¶99· 9· 9°x99°x99õ 9õ 9þ/99þ/99�É 9�É 9ÆÜ89ÆÜ89W” 9W” 9é~89é~89FU 9FU 9p89p89£ 9£ 9¼£79¼£79‘º 9‘º 9×&79×&79/_ 9/_ 9ß69ß69nú 9nú 9§69§69{Œ 9{Œ 9“s59“s59� 9� 9ÑÎ49ÑÎ49´•9´•9‰ 49‰ 49* 9* 9«h39«h39Ø{9Ø{9e§29e§29 â9 â9òÜ19òÜ19É?9É?97 197 19÷”9÷”9B,09B,09ãá9ãá9sF/9sF/9Ã&9Ã&9ìW.9ìW.9¥c9¥c9£`-9£`-9¡˜9¡˜9ì`,9ì`,9Æ9Æ9þX+9þX+9ôë9ôë9ÓH*9ÓH*9a 9a 9¡0)9¡0)9FCþ8FCþ8§(9§(9¾cü8¾cü8÷è&9÷è&9+vú8+vú8¡¹%9¡¹%9Òzø8Òzø8ã‚$9ã‚$9Urö8Urö8üD#9üD#9ô\ô8ô\ô8 "9 "9ð:ò8ð:ò8?´ 9?´ 9ì ð8ì ð8b9b9¥Óí8¥Óí8š 9š 9F�ë8F�ë8 «9 «9÷?é8÷?é8}F9}F9Hææ8Hææ8IÜ9IÜ9‘‚ä8‘‚ä8{l9{l9â8â8I÷9I÷9žß8žß8ç|9ç|9)Ý8)Ý8™ý9™ý9Ý•Ú8Ý•Ú8¼y9¼y9þØ8þØ8¥ñ9¥ñ9ÕnÕ8ÕnÕ8fe9fe9�ÐÒ8�ÐÒ8,Õ 9,Õ 9Å+Ð8Å+Ð8IA 9IA 9î€Í8î€Í8í© 9í© 9IÐÊ8IÐÊ8@ 9@ 9@È8@È8ˆq9ˆq9�_Å8�_Å8,Ñ9,Ñ9РÂ8РÂ8p.9p.9{Þ¿8{Þ¿8x‰9x‰9´½8´½8eâ9eâ9ÜOº8ÜOº8ýrþ8ýrþ8¤„·8¤„·8<û8<û8’·´8’·´8÷Æ÷8÷Æ÷8é±8é±8†mô8†mô8m¯8m¯8“ñ8“ñ8[I¬8[I¬8x¶í8x¶í8y©8y©8~Yê8~Yê8Ĩ¦8Ĩ¦8Ðûæ8Ðûæ8ÇØ£8ÇØ£8û�ã8û�ã8© ¡8© ¡8ª@à8ª@à8õ;ž8õ;ž80äÜ80äÜ8p›8p›8 ‰Ù8 ‰Ù8V¦˜8V¦˜8¸/Ö8¸/Ö8Tß•8Tß•8ŠØÒ8ŠØÒ8(“8(“8²ƒÏ8²ƒÏ8Z�8Z�8l1Ì8l1Ì8@œ�8@œ�8%âÈ8%âÈ82âŠ82âŠ86–Å86–Å8:,ˆ8:,ˆ8ÿMÂ8ÿMÂ8¬z…8¬z…8ó ¿8ó ¿8΂8΂8kÊ»8kÊ»8u&€8u&€8±�¸8±�¸8f{8f{8èYµ8èYµ8 Ïu8 Ïu8i)²8i)²8<¡p8<¡p8gþ®8gþ®8-k8-k8ãØ«8ãØ«8 if8 if8(¹¨8(¹¨8�_a8�_a8ªŸ¥8ªŸ¥8nc\8nc\8ˆŒ¢8ˆŒ¢8™tW8™tW8ÜŸ8ÜŸ8…“R8…“R8zœ8zœ8þÀM8þÀM8]{™8]{™8`ýH8`ýH8܃–8܃–8/HD8/HD8Y““8Y““8y¡?8y¡?8ª�8ª�8 ;8 ;8sÈ�8sÈ�8ê�68ê�68JîŠ8JîŠ8û28û28¸ˆ8¸ˆ8ÁŸ-8ÁŸ-8#Q…8#Q…8çF)8çF)8¼Ž‚8¼Ž‚8Qþ$8Qþ$8¹¨8¹¨8»Å 8»Å 8Dz8Dz8E�8E�8¦ït8¦ït8 …8 …8³«o8³«o8G}8G}86xj86xj8¬…8¬…8'Ue8'Ue8]ž 8]ž 8ÖB`8ÖB`8®Ç8®Ç8„A[8„A[8­8­80QV80QV83L83L8­qQ8­qQ8INû7INû75£L85£L8ˆ%ô7ˆ%ô7ÜåG8ÜåG8¿í7¿í7c9C8c9C8P6æ7P6æ7º�>8º�>8¥oß7¥oß7,:8,:8ÆÉØ7ÆÉØ7°™58°™58—DÒ7—DÒ771187118ìßË7ìßË7åÙ,8åÙ,8œÅ7œÅ7È“(8È“(8Ãx¿7Ãx¿7­^$8­^$8Nu¹7Nu¹7`: 8`: 8Å‘³7Å‘³7'8'8Kέ7Kέ7Ô$8Ô$8h*¨7h*¨7;38;38ª¥¢7ª¥¢7nR8nR8j@�7j@�7¦‚ 8¦‚ 8´ú—7´ú—7“Ã8“Ã8ƒÓ’7ƒÓ’7ý8ý8¾Ê�7¾Ê�7w8w8¾àˆ7¾àˆ7cÓû7cÓû7å„7å„7eÙô7eÙô7QÍ~7QÍ~7Þÿí7Þÿí7ÿ«u7ÿ«u7ÿFç7ÿFç7¦Ål7¦Ål7V®à7V®à7Üd7Üd7…5Ú7…5Ú7¥[7¥[7cÜÓ7cÜÓ7ùiS7ùiS7é¢Í7é¢Í7#gK7#gK7þˆÇ7þˆÇ7œC7œC72ŽÁ72ŽÁ7±<7±<7E²»7E²»7V©47V©47õµ7õµ7ž€-7ž€-7*V°7*V°7SŒ&7SŒ&71Õª71Õª7iË7iË7Çq¥7Çq¥7m=7m=7Ö+ 7Ö+ 7¼á7¼á7›7›7i· 7i· 7òö•7òö•7ƒ½7ƒ½7[‘7[‘7¯ó7¯ó7"4Œ7"4Œ7Y²ö6Y²ö6Û|‡7Û|‡7ªÙë6ªÙë6á‚7á‚7²[á6²[á6Á|7Á|77×67×6èõs7èõs7ŠiÍ6ŠiÍ6F_k7F_k7aðÃ6aðÃ6‘üb7‘üb7»Êº6»Êº6†ÍZ7†ÍZ7P÷±6P÷±6cÑR7cÑR7às©6às©6:K7:K7¹>¡6¹>¡6”nC7”nC7�V™6�V™6ª<7ª<7׸‘6׸‘6eÎ47eÎ47\cŠ6\cŠ6ßÄ-7ßÄ-7GTƒ6GTƒ6qé&7qé&7·y6·y6`; 7`; 7l6l6!º7!º7ºy_6ºy_6'e7'e7¥nS6¥nS6®; 7®; 7àG6àG6ï<7ï<7úÉ<6úÉ<6h7h7á(26á(26ûx÷6ûx÷6Cù'6Cù'6¦rì6¦rì6¥76¥76¼á6¼á6Uá6Uá6ýS×6ýS×6ó 6ó 6‡9Í6‡9Í6xk6xk6_kÃ6_kÃ6¨‹ö5¨‹ö5/è¹6/è¹6¸þæ5¸þæ5ˆ®°6ˆ®°6Ý)Ø5Ý)Ø5J½§6J½§6ÝÊ5ÝÊ5+Ÿ6+Ÿ6]�¼5]�¼5¯–6¯–6À¯5À¯5Ä�Ž6Ä�Ž6+‘£5+‘£5a´†6a´†6Áþ—5Áþ—5Û7~6Û7~6“�5“�5ÆŠo6ÆŠo6½š‚5½š‚5r_a6r_a6~q5~q5ç³S6ç³S6"×^5"×^5"†F6"†F6º6M5º6M5,Ô96,Ô96µ’<5µ’<5 œ-6 œ-6/â,5/â,5 Ü!6 Ü!6T5T5¤’6¤’6f95f95¾ 6¾ 6v05v05×\6×\6Uòí4Uòí4yÚî5yÚî5U×4U×4ÎÛÛ5ÎÛÛ5oÃÁ4oÃÁ4κÉ5κÉ5ä­4ä­4Ct¸5Ct¸5­k›4­k›4f¨5f¨5KŠ4KŠ4–k˜5–k˜5[ét4[ét4¤‰5¤‰5 ´W4 ´W4 Xw5 Xw5dÚ<4dÚ<4ß]5ß]5…C$4…C$4DAD5DAD5¯× 4¯× 4‰-5‰-5Óúò3Óúò3¥m5¥m55Î35Î3²P5²P5ï,­3ï,­3#lá4#lá4m²�3m²�3:2¿4:2¿4M)k3M)k3êŸ4êŸ4ãF=3ãF=3«Šƒ4«Šƒ4gb3gb3ŠT4ŠT4ÃBæ2ÃBæ2ÉÅ&4ÉÅ&4tL¬2tL¬2^!þ3^!þ3ÂOx2ÂOx2ʹ3ʹ3N8*2N8*2—`€3—`€3¶Ù1¶Ù1í}#3í}#3üz1üz1ºû¶2ºû¶2×Wó0×Wó0¾Í!2¾Í!2úò%0úò%06ò 16ò 1ì6‹.ì6‹.IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/BinauralDecoder/Source/IRs/0000775002537200253720000000000015257173642027607 5ustar zmoelnigzmoelnig././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/BinauralDecoder/Source/IRs/irsOrd5.wavIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/BinauralDecoder/Source/IRs/irsOrd5.w0000664002537200253720000004121415257173642031330 0ustar zmoelnigzmoelnigRIFF„BWAVEfmt $D¬ s0Hdata`Bÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿþÿÿÿÿÿÿÿþÿÿÿþÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿþÿÿÿÿÿÿÿþÿÿÿþÿÿÿÿÿþÿÿÿþÿþÿÿÿÿÿÿÿÿÿþÿþÿþÿÿÿþÿþÿþÿþÿÿÿþÿÿÿþÿÿÿÿÿÿÿþÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿþÿÿÿþÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿÿÿþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿþÿÿÿþÿÿÿþÿþÿÿÿþÿÿÿÿÿÿÿþÿÿÿþÿþÿþÿÿÿþÿþÿÿÿþÿþÿÿÿþÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿÿþÿÿÿþÿÿÿþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿþÿþÿÿÿþÿÿÿþÿþÿþÿÿÿÿÿþÿþÿýÿÿÿýÿÿÿÿÿþÿþÿþÿÿÿÿÿþÿÿÿþÿÿÿþÿÿÿþÿÿÿýÿÿÿþÿÿÿþÿþÿÿÿþÿÿÿÿÿþÿÿÿþÿÿÿþÿýÿýÿÿÿÿÿþÿüÿÿÿþÿþÿþÿþÿÿÿÿÿÿÿþÿûÿüÿÿÿûÿýÿýÿüÿÿÿýÿþÿÿÿþÿÿÿüÿüÿüÿùÿÿÿýÿùÿùÿÿÿûÿýÿúÿÿÿÿÿÿÿýÿÿÿýÿÿÿüÿþÿûÿüÿýÿÿÿøÿýÿüÿ÷ÿÿÿýÿþÿüÿÿÿ ûÿüÿþÿûÿüÿýÿþÿýÿøÿ úÿýÿýÿúÿúÿúÿþÿÿÿÿÿüÿ÷ÿýÿýÿþÿýÿýÿÿÿÿÿýÿþÿÿÿüÿÿÿüÿ üÿõÿ ÿÿþÿûÿúÿùÿþÿùÿýÿüÿýÿ  ÷ÿ÷ÿ øÿöÿôÿ ÿÿõÿ ýÿþÿýÿüÿøÿùÿøÿûÿ úÿ þÿýÿðÿîÿëÿõÿ ùÿþÿõÿùÿúÿûÿ öÿóÿüÿöÿÿÿ÷ÿúÿ÷ÿôÿõÿðÿ úÿûÿüÿïÿ÷ÿ÷ÿîÿõÿêÿòÿþÿòÿýÿöÿüÿüÿõÿþÿÿÿ þÿüÿþÿèÿ÷ÿüÿôÿüÿ ÿÿóÿÿÿîÿôÿþÿîÿöÿùÿñÿõÿæÿôÿúÿöÿÿÿùÿýÿûÿ ýÿÛÿïÿôÿþÿÿÿêÿýÿÿÿïÿ÷ÿñÿ ùÿ÷ÿýÿöÿùÿúÿûÿñÿìÿõÿïÿ  úÿóÿ õÿÿÿýÿ  ÿÿûÿïÿûÿåÿÝÿéÿùÿóÿñÿÿÿôÿóÿ÷ÿ ûÿ  ýÿóÿâÿðÿøÿ÷ÿøÿßÿíÿíÿÒÿâÿîÿõÿýÿìÿùÿ÷ÿûÿöÿ÷ÿýÿ ÿÿúÿòÿïÿôÿßÿ÷ÿÿÿéÿÙÿñÿùÿòÿ þÿýÿ ôÿüÿøÿþÿýÿüÿúÿýÿöÿ ýÿ*öÿ*ôÿïÿ*êÿìÿëÿ ýÿáÿ ñÿöÿÿÿûÿûÿûÿùÿîÿòÿ úÿ# .1üÿúÿúÿ"øÿ#öÿýÿ òÿýÿüÿÿÿ,;@& ëÿõÿìÿ;úÿðÿ&% äÿöÿ ÿÿòÿüÿ <ýÿüÿæÿÞÿ 4üÿ>Øÿ òÿöÿèÿæÿøÿóÿ÷ÿøÿ ùÿîÿ×ÿÜÿ¾ÿÖÿ2ëÿæÿ7#0ëÿÞÿñÿ  ìÿÿÿùÿÿÿëÿ÷ÿòÿóÿ öÿãÿ£ÿ¸ÿÛÿ6øÿÝÿÀÿéÿ æÿµÿÎÿìÿøÿóÿöÿìÿñÿþÿ ÕÿìÿæÿìÿàÿÃÿàÿÔÿÞÿÕÿòÿòÿôÿÒÿÌÿÎÿ¿ÿåÿ Ùÿîÿ êÿûÿ÷ÿúÿÜÿõÿ¹ÿÝÿ ÌÿÞÿâÿ²ÿ×ÿõÿöÿÝÿºÿÞÿõÿæÿåÿìÿ÷ÿûÿâÿþÿúÿôÿêÿæÿáÿõÿéÿ÷ÿ¾ÿ ?(ÖÿÄÿâÿ &ûÿøÿìÿíÿÝÿÊÿ#îÿëÿñÿûÿÚÿ>"ÿÿÖÿÉÿïÿäÿhçÿlÚÿíÿéÿþÿ (ÿÿÓÿùÿéÿÑÿùÿõÿùÿõÿäÿfGîÿ èÿìÿDêÿ Gíÿíÿàÿðÿçÿ úÿçÿîÿøÿÿÿòÿíÿüÿúÿÿÿøÿüÿçÿõÿæÿ øÿóÿÖÿìÿÚÿ þÿóÿ/üÿ8úÿ'íÿïÿèÿúÿ°ÿÇÿ4ýÿbõÿ-òÿ?øÿ=àÿÈÿäÿãÿìÿ-üÿ"ôÿ ñÿåÿÜÿB+;!¨ÿ3³ÿ(/!ùÿáÿúÿ¿ÿB&6õÿ .ðÿ   êÿèÿ(E³ÿ3Åÿ>³ÿD[ëÿ-M×ÿH)þÿðÿgåÿæÿ ñÿ÷ÿþÿ²ÿ¡ÿöÿÛÿ´ÿ7áÿ!(" éÿ+1*æÿùÿËÿüÿöÿ&õÿûÿýÿþÿ)6±ÿøÿÊÿ¼ÿíÿéÿ¼ÿÚÿÖÿ4æÿi!õÿùÿ 6ØÿýÿñÿÑÿãÿÙÿêÿ"îÿýÿøÿ÷ÿõÿ"çÿ5ÕÿÍÿÃÿÄÿôÿÖÿÝÿ&¼ÿ^îÿýÿûÿÃÿòÿ×ÿõÿàÿÞÿÌÿóÿ³ÿ Éÿ÷ÿìÿÇÿÚÿ: àÿQ7ÖÿÁÿ1üÿÞÿ ¿ÿ/ÚÿöÿÆÿçÿëÿ ×ÿîÿ ìÿÚÿóÿìÿþÿ R QŒÿ¼ÿIÛÿ#•ÿ’ÿ*äÿûÿÚÿéÿäÿÆÿçÿÆÿôÿùÿîÿ@?Zéÿýÿ àÿ˜ÿÕÿ}¯ÿÿÿ½ÿ]¯ÿ±ÿSìÿÄÿüÿ¾ÿóÿßÿ¾ÿîÿñÿÙÿúÿçÿßÿùÿìÿ53-Y×ÿm?Ÿÿ»ÿöÿ.øÿ†ÿÍÿÍÿìÿÜÿÏÿÕÿýÿÿÿÿÿóÿèÿùÿõÿÑÿÖÿ¥ÿÙÿ,‚@_)^Èÿúÿñÿ'ÑÿÞÿ3?õÿ)a=óÿ#ÿÿàÿ òÿöÿ>ÿ;ÿÌÿçÿ@_œÿ›ÿ ÿÿÍÿO,8XûÿFýÿ*\åÿ-÷ÿóÿîÿèÿÍÿ�ÿÑÿBÿ»ÿ[ÿW%(ÿpÿ-ûÿìÿßÿ›ÿØÿKýÿ $:Pôÿ÷ÿÛÿ !æÿØÿaÿSÿZÿõÿ†¯ÿÌÿUÿ:øÿ¤ÿ8¤ÿÕÿÃÿ³ÿ ¸ÿ¶ÿÈÿ!§ÿ´ÿ+ÈÿËÿùÿÀÿ³ÿñÿâÿÎÿ›ÿ³ÿ/� ÿBO&�ÕÿÔÿ§ÿóÿ8èÿ_ D¿ÿ‚ÿ3ÏÿéÿýÿåÿÔÿøÿÆÿßÿ"÷ÿL’pTOâÿþÿJXV8~ÿP/†€ òÿÇÿ= ôÿ©ÿíÿ½ÿãÿYt+¿%Bëÿqºÿªÿ]VM*#Ut.æÿRÍÿi1#ÙÿCÍÿÒÿÓ ¶úÿ:ÎÿPÌÿõÿ½ÿ ^|UB †8Áÿ,bëÿÐÿ7ëÿÁÿSÕÿÊÿ#+–TvÿCÿlÙÿx„ÿ°ÿÈÿýÿLi(¤ÿõÿôÿÄÿûÿÅÿ#$ ¹ÿøÿ±ÿ9ÝÿA?T"MzBÿÒÿ„L �ÿ»ÿèÿ´ÿ­ÿ±ÿ�ÿ¨ÿ¯ÿ�ÿR†ÿíÿuÿ†ÿ8üÿ^L1H¨ÿcÿ“ˆÿT’¥ÿkùÿ7ÿ¼ÿÎÿ­ÿ£ÿºÿ öÿ8°ÿÍÿ#HõÿR( F›ÿtÿ„åÿK´ÿ5"×ÿ[Ôÿ÷ÿ’ÿ8ÿÿáÿ>¦ÿÎÿ.üÿ ñÿ-ºÿ/ B×ÿ½ÿþÿøÿ÷ÿdæÿpÿ†ÿ™ÿ7'µÿÒþøÿ+0}âÿV‹ÿ›Ôÿ!3¡ÿïÿTËÿñÿÈÿ õÿ·ÿÍÿõÿ{ÿl|ÿ¦ÿ”ÿyÿpEÍÿuÿtÿëÿµ®ÿ<qÿÜÿÜÿ¶ÿ¨ÿ¨ÿÇÿæÿíÿ�ÿÓÿÜÿøÿîÿ%˜ÿ·ÿÄþæÿSÿ~ÿsÿÞ±ÎÿOŒÿ ×ÿJ*ºÿ´ÿôÿhÿRpÿûÿÇÿùÿ*šÿ°ÿ4ÑÿF­ÿÂÿjÿIÿÞþ6ÿ‘ÿ. CØÿ„]Îÿçÿ‰ÿçÿîÿæÿûëÿ9¿ÿ!Øÿ.D!5¶ÿœÿ¨ÿ+»ÿûÿØÿ¶ÿ¾ÿ€Ûÿp¶ÿÀÿ©ÿ$+"žÿÐÿ ÿT^"Íÿ<.,9ùÿÙÿáÿhÿÐÿÅÿlÿÒÿâÿÞ- &ùÿ˜ÿ$N:æÿ Pÿ{Q"µÿæÿóÿ×ÿ+$A)×ÿ¦ÿìÿÛÿ¯ÿÙÿ¬ÿBxÁÍPrÿ+Y¥Ÿÿ³®ÿ�ÿ!ÕÿÇ÷ÿzÿðÿÙÿ)ûÿ ©ÿ Ôÿ4öÿ;¬"£HçåÿM@ÿÖÿ#BÃÓÿ'Ëÿ£ÿ}<?r=.ÿÿÊÿ1ÕÿWýÿçÿNw*©áåÞ¥ÿŒÿ|*sQÿ™ÿ¤ÿªÍÿÔÿÒ0˜ÿýÿE—\_:­ ¼ÿâÿâÿ˜ /"?~U,pyÿÕÿƒÿôÿKÁÿàÿÜÿT:ÿZs - ÿíÿAÝÿ¶áÿÅÿÔÿ÷ÿWyòÿ;ïÿ ˆÿgÿXZÿwÿ“ÿßÿûÿtØÿþÿtÿþÿðÿmRÿ‘iÿÇÿj£ÿJÑÿfãÿ!�ÿûÿBGøÿF§ÿ(K4îÿ¬ÿhÿºMfÿÿÃÿmÚÿßÿOÿ)]ÿ`uÿ ¸ÿÓÿ›ÿÙÿPÒÿêÿýÿØÿªÿAÿ«—ÓÿÅÿÿíP²ÿÞÿPÿÂÿ£ÿbc…ÿ¶ÿFÿàÿøÿ¸ÿøÿ¿ÿ¿ÿ÷ÿ¡ÿ·ÿíÿ Cõÿ>—ÿÙÿrÿ[ÿ|Eéÿ. ÿI—Ûÿðÿ`»ÿøÿQ¢ÿi¹ÿQÿ|ÿéÿýÿ“ÿ1Äÿ§ÿ,Âÿôÿ;•ÿÿÿÐÿÒÿ¾ÿÕÿ&!çÿÁÿÃÿ>4±‚ÿŽÿ‘fG^Ïÿùÿ,ÿwÿBéÿ+CÞÿ•ÿÄÿ¹ÿòÿØÿìÿñÿüÿªÿ¢ÿ@I3ÿGÿ�’ÿ:äÿE"p«ÿõÿðÿ‹ÿÉÿMbáÿ-2ÿÌÿ ÿïÿîÿ(ÿÿ¯ÿ¬ÿíÿ E�ÿÀÿ(&”ÿ>ÍÿŸÿëÿ£ÿÀÿÿ_óÿæÿÀÿE NIcÿÅÿ½ÿÿ¾ÿÆÿÿùþ™~ÿ&„ÿG¢‚ÿ’ÿ�ÿPÿpŽ#ÿ˜£ÿYØÿy*LÒÿµÿ9ðÿ)Bz£fÿ|ÿ&:ºÿ6ÿÖÿÿ¯ÿ¥óÿXÿ¯ÿõÿcÿZ�÷ÿ0RKsôÿ=ŒÇÿ1àÿ8<ÙÿWÿ‡rÿïÿ–ÿŽÿªÿþÿ‘ ÿ8âÿÁ.¨ÿ'RªÿU‡Uúÿ©ÿ£ñÿsÄÿÞÿ¤ÿðÿ¤«ÿÌÿÆÎ…ÿ½ÿãÿ‚•¯ÿîÿæÿ¼ÿ>ÿ„ÿD=wÿØÿ’ÿòÿÞÿ}ÕÿHŽÿéÿ¸[®™‰\ÿ­¾\zÿYôÿÌW×uüÿ²Xÿ=ïÿëÿ%Àÿ_,²ÿôÿT°ÿDâ ´–;��üÿá~ºÿÖÔÿÂ`ÿÓzÔÿLuÌÿáÿ[Øÿ¯ÿ’=1Îÿ6 Iëÿ*IüMÿ#;ÁI„ÿ&W7aÔÿ…ÿÅÿ2ÿüÿ†®Æÿw¤ÿ¼ÿ!”ÿOjG[zÿ³ÿÅÿlÿøÿâÿëÿ­ÿ¦ÿÆþ…ªÿ'Žÿ?ÿýþ àBbïÿ+ÉÿMqÿÇÿêÿ[4BZ=Õ*ÿãÿUÿµÿ ÿ§ÿ_ÿÿ`®þÍÿ?ÿ÷ÿèÿ«ÿ•ÿ‚ÿÿbÉÿC”ÿ$²ÿ_SÿŠÿoÚÿ`°ÿ<ÿÿ|ÿ=xÿüÿuÿ�ÛÿYåÿæþňÿpÿsÿgÿ »ÿëÿ=sÿ�ÿ˜ÿ&ƒÿ.çÿ'ŒÿÄÿƒÿÿÿ–ÿ'ÍÿÑÿ@= ÿyù2ÿMaÿAÆÿIÛ~ÿMÿgnÿp¼ÿ;éÿAÁÿ‹ÿÁÿšÿóÿ{y02ÿEÿþÿîÿéÿ¿ÿ_ÿNÿ«ÿœç-Êÿ]:’¢ÿ'‰ÿfGÿÈÿüÿ%™ÿ�ÿðÿ©ÿèÿ!~ÿ¯ëþ6ÿ‹ÿSyÿ¨ÿzÿ•ÿÒÿ¡}ŠöÿùÿÇÿ�ÚËÿOÿZÿõÿ˜ÿVÄÿG§ÿJ´ÿ¯ÿ&¥ÿÃþÕýâþ@ÿ"ÿõIÿ.Âãÿþ¢ÿåÿƒ~ÿOeÿ+ÿÓÿÿãÿÿÇÿ/ÿ\½ÿ£ÿîÿ÷ÿBßÿŸvŽÿ£þàýÊþZÿ'×ÿÙàÿêÿ¼,ë‚ÿ–ÿùÿDÿÁÿ©ÿQÿáÿ£ÿelÿtUÿ09xÿ;.¾ÿI;(õÿ-ÿ‘ÉÁÿáÿ©ÿÖ÷ÿUÇÿÿ™ÿQ®ÿbFëõÿ�ÿm|ýÿ�Uùÿ¼ÿ.Šÿ¿ÿXnûÿvÑ+ÎýÁÿ0ÿ\ÿ@½ÿÿžç±ÿFÜÿc{QSêÿY-e„7]ÿ½›ÿ�ÿ÷ÿ'¦:Šíÿ&Ôþ�½ÿÍÿG@ÿÿû²ãÿ™Q’½ÿšÿ‡7zÿSVýÿŸÿ>R—ÿ÷ÿFT�_ËÿÑ6�Q³C1>ÍÿhO-޲ÿOÙäÿ© Ýÿh*/Vj¥æþyÿßÿm¥©ÿÏ,}“ÿ4OÿÙÿEÿÿå'ÿœ3ÿÿ-ôÿ?;ÿc#øÿÚÿúÿPMÿh×,ÿî§ÿàkÿ_1±ÿ§ÿ]´ÿ„ÿlm)ÿÑÿzÿÔ·ÿ+úÿºÿçÿšÿÐÿnàÿØÿ¨ÿÆÿvÿèþ˜þ}ªšþìÏÿFãþvIþÿH˜{ÿšÿ¶-Oÿ•ÿ-[â bÿ±YÿŸ2ÿ_5 ÏÿP(ËLÜôÿõ:ÿ¬ÿøÿ6ÿszÿéþ‹6ÿWÿÖþ­ÿ?Yÿ€ÿˆÿ1ŸÿE7ÿºÿÀÿ÷þ3  Gq“=ÖÿÈnþÿ×ÿŸÿÿGþ2ÿj²ÿ%ÆÿÐÿâ«ÿ/Q‰ÿßÿ9-—ÿ­ÿŠÿ9O³ÿ Ãÿ“mÿHÿ�*ñþþYžIÿˆÿUœ öÿ¤ÿUÞþ–JÿËÿ¹ÿšÿ^ÿ~ÿ¤oÿ{ÿÄÿÒÿâÿ�6ÿž^ÿ÷ÿ¾þ…ÿžÿ×ÿ¢ïÿwÿÁ;"£ÿ¿3y ÿªªÿ<Äÿbÿÿçþªÿxÿ¹ÿ$³ÿLšÿm¿ÿÿÿÐþ!8ÿ2ÿëþBÿHÿVÿÝþåÿ†,�ÒOÙÿMšÀt¼ÿÆÿ¦ÿŒ‘ÿ„±%¢ÿ ‡ÿ[X6þèþAÿZ“ÿ?þKbþãþ/’þõþ�Vÿ¾ÿ2uéþqÿåþ!ÛÊÿà þLèÿhóÚÿ Åÿ^3 ñÿXýÅÿLþÖþ"ÿÿÃÿûÿ�ÿµÿ¹ÿŸÿõþ*ÿ þsþŽÿ„ÿ=€ÿìúýY³¹vÿýÿuÿdÐÿ> |ÿ¯ÿ¿þÆÿ5þšéÙÿ~ÿYÿÿ&þ�þ³þVÿ�ÿ$ÿ‘ÿ•þ¯ÿYÿÆœÿªÿ3ÿ yi Øÿ9ÿíÿ~O‰ØÿÑÃÌœÿv “ÿü)7ÿÒÿ›þÅ1�¥ÿÿöþŸÿ,…Pÿ^Õÿy:Âÿêÿ\ÿëþ%ÿ�þR¹§ÖEÛ2r¶+ÿFÿškX¨þfþ*cþ)!™kÿ§”ÿfÿ¼ÿ‡ÿJÿ?$þRø‹}ÿ ÿ�øÿ^ÿŠûþ΃­Itÿ�oÿ>Ú�›-fØÿa,<M¿²ÿ}ÿÿÎÿné‚(ÿÿ– Çÿpêíÿ¸[\*cWÛÿ<: æÿ‚‰©ÿªÿ“¢ýÃýºªÛ×þiÿ$:þÿ^þ¼ÿ¤ÿåþIôBÿÍþáþŠ…ÿÏÔižþ}úÿ.gn$ �´ëÿ"ÿ«ýòS†ý›þýíû$ü þxÿ�þýþ²ˆûýìÿ ý?ÿÊÝÿkÅþ'ÿ8ÿ Íþ¢ÿ˜Ò!©¬ ¢ý4Ûýçý€þ?Tú¿üiOý6Aÿ„c6þ" þ†Œ&gßý�ÝÿFþ¢ÿæÿNJÿßÿÅþU‹]\ÄÙþJÿþWÿàýÑøù[úÞ»ú)Þþéþˆÿùý½þŒÿW�þnK$ëýRwÿyÿ“ÿ]Ðý+TþŠTÿs)eÿÎþoþ‚ûþ(ÿÎùºømþ‚ÿðýIýÉüÀêþc,ûTƒža‰ý°ÿlÿõœûR½þ§ÿ–H Rÿ¢ýÿ™ùƒ]úØûöýÊúp =6,ÿÕ={þbKÿºþÿ‹þåþvþþíÿ%ÿâþ˜qR ÉøùúèþéûÐÿZõHý\ýÌúåÿiþbLýNtÿ«4‰ýÎxû}&)ýðþÉåÿmaþå þE ³ týoùBþÊû@-*xÿü9ü2únÿ<þ>ý¾ý.û-þ²ú×ýqûÑÿ}þ—þ¡þ ýNòÿçÌÿØý¥bOýµ¸”ùˆ²ý«õ¸ýèÿ1&üàÿ¾öÂú´ûúlÿ¸û¡þ:þáþVþ©Íÿr6ýžþç ¾Ü ß Z˜û}ýê!ûˆ Öøžœþ|hÿ~”ücþpïû;ýµýÝ¢ýàaïþ‘4ÿˆàÿ{2¼öã(ðëË ÿ2ô[.ü Ù 2üO “ýTÿL{ý´Pêý¹®üÕþ¶06éãþW›*ŒÍ¡÷tüøûBõÓñ¼·øL •Êöai"ÍjDþ@üRl›ûù$þû¾Xí¶ügNýXÍþŸ ¢ÿ.–éø»éÜ ­öêúÂ= süyý×ò�cî°œb÷þõð8*1¤ÿÉý”ºý4?†Ðšþ�YþÝý¨ÄJ Á 2ÿI OÚ h½‡ûfþíüÉZÄUþß‚÷šûí{·�’6éüRþ<ÿÊþ¿™ ÊþxC²úzw &G yú À°Í Fzåÿõ íýûaß�ݹû–ÛûÈû#+»I Lø¬ÿÃóPðSò±�ú° qý ÿ ¼ Æécü ó/¡ÎÐ# Ìû0Íû±þÁ\òÿñþ9õMþï£æö þ +qéÿ°™ùÿèû�øðxÿô÷9ú·‡þdÔÉ–ÿ“ý¡ÿôÿÚÿѦÿ\µü÷ÖçVàªú!ù¥û{ùÜtü¦…®÷�û:þ_ùÊhíþ™øûŒÿ¹Y”ñ12Qýr�ûÐ� ÿ]Œÿþ³óÓõÜ ìì_ðßôÿ–ýòúÀ÷‡ýîûÛóËûÿúaùȺù䎰þÃ[ý«ûÑú\§ýËÊþθ„ÿ+ÿ[¿%ø³�uö&ô`úhù Mïá1äDüDýóu>S÷~ìùLmüâÿÙ”ùnèüÿ= ÿDÂÿl?Ÿù± À÷Dþþ _)á¿ûÊÿ¬ oþ2ÿLxú.þkúÏýý®ÿéüeþŒý„ÿCòû:ÿOò¥ÿ“üÅi öµDúÑD°ùŒû§ðøSþ¬áþÐù¤ýýû!OýyÿSüC˜ý§´þ¥ÆÿÁÿ•ÿ‹°ú§U ïû6ÕRû¬üýJÿ7[wþ†ý#šøò]8þ-û(�&+Nœuþ••þ_•þîv ü¸û#ý²ýNøùüWöSéöú'±Þúøé‹òÿO,lÿ»ý!5ìÿ<:ÿ¦þÑöþ?d6ë÷Xý|úgùdúûéÀþMù©ˆÿÌPþ�± þ—þDû¬lýõþýIü þÁýTüäþ³þ÷üv�ÿŽçäÿhã÷‚ýLûRþ0šoþ‡ÿDøý«ÿƒþ¦þ~ü9úýþUþ‹ÿnüTÆü-þR7ÿÿ2ÿßnø?’ÿGeÿúkþ3û"…Qþ·ÿìþŽDþÿXüþIÿTþ½0þéþcþƒû‰ÿ MûÿƧþ£þÞþ‰ÿø¹˜ý­ÿ•ÿ|ÿv°ÿ—þeþÇûPÿoý¼w0Üþuþ€A#þ€ý£)ÿ¡°‡gÆþ-‡þÿEþôùó–æ—ÿ*¹ÿ]¯?þ‡ÿ_äþÆ`¡Áÿ$þ‹þêþ6Åý}t«kÿŸÿ$ÿÔS¯ÿþÝEúáþDÿÓý'�ûµþÿ*äûýþç/ýÒÿ ÿ¶�þEý*ÿýjý‡þâÿ±ÿ¯ÿsÿkf†åÿ„ÿ%ÿãÿHþyÿÿ)þÕþü+ÿÿØþÊÿUŸ¤ÿg’óšÚ;ÿ¹þîÿÖCÿj“ÿk%ÿÀÿwÿ(ÿZÿx+ýTžöPÝü1þ˜¥mþ]�„ý¤ ½ÿ¨þCÿ)þæÿ¨C<'Z„GXlÿjÿ¹‹IUú ¥�mþöÿvÿ[ýyÿøÿŬ9çûÜý´Šÿ!Ìÿ¹gÿŸÿÇj×ÿWC|ÚÿÖþ°0áZ¦ü˽�‘ÆþŽþ�þÒsþ¯ÿK�ÿDÿRÿ ÿIMzsˆ X¶ÿ˜»ÄÍfÿ†ÿøÿE ±ÿ§ûžÎètÂþiþfý> ÿìÿ8Árþ í_ý­þÿUþÿëYªVÿéÉS�¦¡„IJtÿnû�ÿÜþOþ¾ÿÿÜþ¹ü¢¿ÿ1É[Köÿ©ÿþX ßØÿ~ÿ�þÕÿœÿÆÿ¸ÿiÿuaÿAÔrë!±ÿ»ÿþrÿNýŽþ@ýáÿœéÿÒÿôÿüÿæþæÿ–ÑÿÑÑþ»ÿdÿ"ÿìþŸÿUÿR:Ÿ!¸ýØÿQ,þ‘ÿÊþ—ÿ#þUŽR¤ÿ¬ÿžnAÿÿ¢dÿ¼öÿWÿ&ÿHÿÖÿÕÿ¦Øÿ¢Œÿ ¯ÿêþ!û~#öÿqhÿYÉÿ“–{+ÿ0ÿØÿòÿk*ÿÿŽþÿÿ oÿßÿ²ÿ‹Àÿwÿrþ™úÿ4:ÿ¾ÿ§ÿÑþëúÇþAÈþuÿq¥þ‡êý)ÿÁþµþ(ÇÿèýIÿòÔÿWÿæþ4þÆ[•¾ÿ7ÿÝÿŠ ýfÿ—þÔÚþnÿ}t‚Õ�FÿÌà^<bÿÐIjÿ“ÿUÏþÿ©ÿýÿ ÿwÿØÿAîþàÿ—ÿÑÿÿRÿÌÿõý/5ºXrÿ:òÿ¯ÿÃÿ¹9yÿ ÿ~þ"›ÿZÿLÿ”þ ÿÕÿùÿ¥ÿ»ÿúÿ�ÿ¹(ý ÿP¥Bþ•´ÿ¡ÿVi�ÿÍ ÑÿH‡ÙÿÉÿÓ‘1ÿÈF¥ÿSÿÚÿÊÿÔÿRÒÿ3ÆÿVÿ«UýhQÚÿ²ÿ| ÿ;ÌAØÿëÿ/üÿfÿh yúÿ›bC¦­ �ÿ?pÿ3Çÿ �ÿ„ÿøýßÿ‡f›ÿŽþ…ÿþÿëþþüÿËÿoÿ?Mÿ9ÿÍI¹*>É.ëðÿ á™ÿ,ÃÿCúÿ ±;þL”fªÿ9þåÿ‚þpÿPÿ¶ÿkõþV*hÿlÿ.PÿèÕÿôÿ– Ìÿàÿ0ìÿÿ6ŸÿsNÙÿºÿÁý !ÅÿwþCwÿ\ ÿîÿmMþ9ßÿàÿºÿÿ4�KÿGWxëÿAÿ)0ùÿ‚ÄþW›ÿÈ^GÿìÿD Ìÿñþ¿ÿçÿ[ÿBÿ÷ÿ¢u�ÿ}ÿµÿÎÿ1FL°ÿðÿÀÿ“ÿ7&ÀÂÿÒÿåÄöÿe'õÿ°½Ø‘ÿ9üGP-G<ÿ&Uÿ %qÿùËÿ0UVÿÎÿ~ÿõÿ.X0ÿrÿÂ18ÿÃôÿ;G#ïcÒs¦­Kÿÿ¥ÿãÿwÛÿ Îpþÿ}ÿæÿ–ÿØÿ7=2ÿ G4ÿîÿ#Ì{ÿQÿM„ÿ;Š�ªÿ(ô!ÿÌÿ™ÿ¾ÿzºÿ|ÿ.Lžÿ°�ÿ}µÿ!V›øÿàÿwÿ†ÿ­ÿbÿwÿDÿ{þ4ßåÿ1ÿïÿ gÿx[ÿõÿ? ÿ+ÿÀÿrÝÿœ�ÿQèÿèÿF äÿ­ÿ’ÿFŠÿvƒÿ³ÿ6¤ÿÿ½ÿ’ÿRÿÀÿ÷þ�ÿ°ÿ×þEÿ´ÿÝÿÏÿU…ÿ3àÿQÊÿ4ðÿ¢„ÿïÿ ÿ-HAÍ'90PòÿOÿâþAIÿ0ÿ½ÿSÿÛÿÿRŽÿ+ƒÓÿ9}ÿÙÿÏÿ‹ÿªÿUmÿôÿ\ößp¯ Ó÷ÿ›Üþ‹ÿ¥ãÿ¬ ÛÿÂ]ÿzE.šôÙÿ$†ÿÆÿÁÿÂÿËÿàÿú¶†ÿËÿ·ÿ=¡Qÿ@ÿ¾EéÿµáÿÇÿvTldïÿŒÐÿu’žýÿ�AÆÿÉÿ¼ÿçýDþ_#kþ¨ÿ<ÿN˜ÓþJÿ B'«´ÿ'ÿcÿ“CÚÿ~;hÙÿÖÿD*¤$µþ1þ¤þ6ÿzÿ¬ÿîÿ? ÿÿÿX¿ÿ¼ÿ÷ÿ¶ÿ{ÿ]ÿõÿÈÿ»ÿmÿGñÿxÿ²ÿ™ÿ§ÿÃÿ‘S~ S©þñþ»ÿ Óÿ Z ÿýÿ^ÿwaÿôÿP=ÆÿYÕÿ‚Øÿ‰ÚÿýÿäÿÛÿ÷ÿ¤îÿuÿ=HÀaøþsŠI�÷ÿÛÿán„ÿÿ4ÇÑWR»ÿ¿ÿüÿ³ÿBùÿµNóéÿ$óÿUÿgêÿÑÿð}ÿg™ÿ„…b�ÿˆøÿ†ÿb‹ÿ-NóÿOÅi~ýÿ"aÿXR5ÿÏðÿ±ôÿXó!>¦ëÿ%ŒÿIöÿ¬ÿèÿúÿ}ÿEz:è Ãÿëÿ ÿÂÿTÿ(_ãÿ¹ÿ�ÿˆÁÿSÿGž0ÿÃÿüÿúÿúÿ' LÖÿ´ÿ¡ÿ—ÿ�ÿ×ÿyPd Óðÿ„ÿÆþiÿÿoZíÿpÿ …äÿ6ÿÑÿ>ÌÿÅÿTÿ‰ÿëÿýÿ½ÿ Îÿ¦ÿÌÿšÿ‚ÿÌÿ9B9$g†ÿ0)ÿîÿL@-ûÿ¡ÿ;_EÿNÿ?AÿºþÚ²ÿZÿïÿE¬ÿþÿrÿvÿçÿ€ÿ°ÿ6oÕÿûÿ£ÿ&xÞÿjÑÿa‘ÿ¿þ5‚¶ÿÿGÿíÿšÿ\ÿ’qRÿOÀÿ6iÿÃÿŒçÿ•ÿ%PÏÿþÿåÿ›ÿêÿ5&šõÿ³Rÿ÷þýÿ¸ÎÿŠÿFÿ+àÿáÿ5 >¯ÿ„ÿ ÿôÿµÿÀÿB%üÿÀÿ˜ÿÿÿôÿOíÿ“ÿ{òÿùÿ&@'–ÿ«ÿ¡B$8�ÿÆÿ1ÊÿhXÝÿƒÿðÿúÿ€ÿÐÿ}¼ÿKäÿÿÿ´ÿAÀÿ_Ùÿ”ÿ\Ãÿ=ÿ—ÿœÿzL6CÝÿ…ÿøÿ:¦ðÿ'þÿ^¼ÿ”ÿP•ðÿAg²ÿíÿÝÿ÷ÿÔÿrÔÿTÿZÿÿñÿKìÿšÿ uÿ>ˆÿ1o'÷ÿ,™óÿ�ÿóÆ 9uñÿ Òÿ¯ÿæÿ3šÿwÿÙÿÆÿ…ÿeÿ!åÿ/ÿÞþ ÿÍÿ€ÿñÿ™ÿÒÿ2�ÿ�ÿR™†éÿgòÿõÿìÿÂÿìÿVyÿÒÿ(ýÿBóÿxÿLÿUÿÂÿ'ÿ+Cÿ}ÿ¦ÿ£ÿüÿhÿŠÿ ÿôÿC½ÿYÓÿ#sÿÝÿâÿ A=*�f;L)ÿŒÿÊÿrÿ3ªÿÿÿ2ÿ„ÿ’ÿ‘ÿS±ÿ.ÎÿÚÿ÷ÿ‹ÿ±ÿÎÿÛÿG5{“ÅJƒbõÿˆÿÇÿ!yTÿ¼ÿÝÿ\Êÿ[ˬÿ ‹ÿ÷ÿòÿâÿàÿ|ÿÓÿöÿ‘ÿ4Üÿb`Á°hp$xÿÊÿ9_ãpÿƒìÿ`{äÿáÿ¦ÿùÿ�ÿœÿûÿþÿâÿÞÿÈÿÓÿ½ÿVG uöÿ nÞÿ8$¿§ÿØY#¹ûÿ±S˜ÿãÿI}ÿ ÿ@ïÿ*ûÿàÿØÿÛÿøÿC|�Y‹ÿa‰ÿ ìÿvŽÿ‰ÿ+øÿÅ:ÿÿ¼ÿsËÿDmÿìÿëÿ3 ÿJ#.Üÿòÿ#óÿMÿ`¼ÿàÿ1F ÿîÿØÿTÒÿ®îÿâÿ·ÿJàÿ]�ÿúÿçÿ(�ÿ704)Ãÿ5·ÿ×ÿ²ÿ¼ÿFóÿ�ÿ$dÿPµÿôÿöÿ´ÿ…ÿ¼ÿáÿäÿ˜ÿÏÿ%tÿÿÿÇÿþÿ$L*,Ëÿ Äÿøÿ~ÿíÿËÿ¦ÿ×ÿÀÿZ³ÿ“ÿdvÿãÿróÿ‰ÿ'5®ÿ¿ÿ+6"íÿÜÿ$6òÿ(I ¾ÿ¶ÿ·ÿ±˜ÿªÿ¦ÿ*Îÿºÿ?²ÿßÿUÌÿdÿz@çÿÐÿ ùÿ¿ÿ 22Zÿºw;ïÿ Ì#hÿâÿÁÿ$�ÿ»ÿüÿÓÿÍÿ4 ôÿ=“ÿ  èÿøÿD¢ÿ»ÿI#ôùÿÉÿž—b@ôÿ�Doÿ§ÿNÝÿºÿ'îÿ_›ÿÉÿõÿïÿÖÿäÿrÕ àÿ†ÿ�üÿàÊÿÔÿÔÿQŠ™]Cëÿ™·Ñÿ9ÿÿ¡ñÿðÿ4Êÿèÿìÿ°ÿùÿCÝÿvÿ¤ÿôÿ.bÿ¼ÿUÿ)Ê4Yûÿ åÿùÿº a#µöÿûÿ3%&+ëÿóÿåÿëÿ?ÙÿŒÿQÿFÿ![ãÿ°ÿ!ªÿ`X¹ÿ‰ÿÐÿŒÿo4ñÿ êÿúÿþÿêÿ--Åÿóÿ‡ÿ®ÿ¶ÿ^E3–ÿ�âÿ#Íÿ¡ÿ·ÿ.ØÿÆÿ ,ÃÿEðÿèÿÀÿºÿ&+öÿäÿyYëÿDz»ÿ -øÿûÿ´ÿ[j5 "ÊÿVôÿB#Ñÿõÿçÿ%Ïÿíÿ šÓÿv^7,åÿ2=Ûÿ@<ùÿ~hC-ûÿOãÿFÂÿ,ÿÿþÿ Ñÿ`,Éÿ5ùÿùÿ9P2óÿ7LZIäÿ=÷ÿïÿ ìÿëÿ ïÿ þÿQ)þÿ,‡Ôÿ¡ÿ�ÿ6Ãÿ?öÿ™ÿýÿ-#£ÿâÿÜÿ/ôÿ*Åÿ(îÿËÿÝÿîÿ=þÿBEîÿ‚ÿ¬ÿÛÿëÿüÿ²ÿ²ÿÞÿÒÿíÿôÿÉÿäÿäÿ ÿ÷ÿ)èÿ!üÿÙÿõÿøÿûÿÛÿüÿÝÿ›ÿ®ÿªÿ @ÄÿUÿlÕÿæÿ•ÿ¿ÿðÿ±ÿµÿÿÿüÿ×ÿòÿÿÿíÿÐÿÿÿðÿ*$áÿ VAåÿšÿ­ÿ-åÿÓÿ--‚ÿ«ÿK/ëÿçÿíÿêÿìÿðÿãÿêÿ ÷ÿýÿýÿìÿÞÿ UOäÿùÿÜÿ”ÿ÷ÿ¸ÿS%êÿW×ÿ Þÿåÿ&öÿóÿÚÿäÿþÿÿÿIñÿïÿðÿ$6Ðÿ ÷ÿ2øÿôÿ?ÍÿöÿÐÿòÿüÿÛÿþÿíÿëÿìÿôÿ:Õÿ¹ÿ­ÿ²ÿÃÿÝÿ0%.1àÿF+ãÿëÿ×ÿ'ÐÿÞÿ+Óÿ÷ÿêÿõÿàÿ+æÿ&¹ÿßÿÂÿÛÿùÿ=Þÿ'¹ÿ+- Ðÿêÿþÿßÿßÿæÿ,ìÿàÿôÿõÿ õÿïÿòÿ ñÿÄÿïÿçÿ ×ÿ¨ÿÿÿîÿºÿèÿ,ÖÿïÿðÿàÿØÿ ÿÿ úÿ!÷ÿôÿþÿøÿÙÿ±ÿìÿ0ýÿ§ÿÝÿôÿÝÿßÿãÿäÿæÿüÿýÿ àÿêÿýÿ îÿñÿÿÿþÿ üÿúÿïÿíÿÔÿèÿ'"ßÿâÿíÿëÿøÿýÿäÿìÿøÿâÿîÿóÿüÿ éÿP>2Úÿøÿ éÿþÿòÿ )çÿëÿþÿûÿíÿ ÷ÿ÷ÿèÿ]H/Òÿòÿûÿâÿøÿ  õÿ÷ÿîÿûÿúÿ÷ÿóÿþÿ*îÿìÿäÿ$ùÿúÿöÿõÿ$üÿòÿóÿÿÿòÿúÿüÿ÷ÿ ùÿèÿ+óÿ ñÿ ìÿúÿùÿ ÿÿñÿàÿ÷ÿëÿöÿüÿìÿ÷ÿýÿúÿúÿéÿóÿòÿîÿýÿçÿôÿúÿöÿòÿçÿìÿûÿöÿóÿúÿóÿüÿþÿàÿúÿìÿ ÷ÿüÿîÿëÿ óÿðÿúÿïÿóÿðÿÿÿýÿÿÿóÿÿÿ÷ÿ úÿûÿýÿõÿäÿîÿþÿÚÿðÿùÿýÿñÿÿÿñÿýÿúÿñÿøÿëÿæÿìÿðÿþÿùÿýÿùÿôÿøÿõÿñÿìÿíÿóÿ öÿþÿ ýÿûÿúÿôÿøÿþÿåÿôÿûÿýÿùÿûÿõÿøÿöÿ øÿøÿ÷ÿ÷ÿüÿïÿúÿþÿøÿ üÿýÿöÿñÿúÿ èÿÿÿ úÿøÿøÿüÿøÿõÿäÿàÿÿÿöÿøÿùÿóÿþÿñÿ÷ÿ óÿ ýÿþÿÿÿüÿôÿþÿýÿüÿûÿüÿúÿüÿüÿ÷ÿòÿíÿúÿýÿöÿ øÿÿÿùÿúÿùÿýÿûÿýÿøÿüÿ ñÿúÿöÿ ûÿõÿðÿöÿüÿúÿûÿùÿûÿÿÿûÿÿÿüÿþÿþÿõÿ  ûÿ óÿ ÷ÿöÿûÿþÿùÿúÿúÿöÿ üÿþÿþÿÿÿûÿûÿÿÿ  üÿÿÿÿÿ ýÿÿÿþÿ ÿÿÿÿÿÿúÿüÿþÿ üÿþÿ úÿ þÿÿÿþÿÿÿüÿþÿýÿûÿþÿøÿüÿ÷ÿ÷ÿþÿüÿÿÿþÿüÿÿÿýÿÿÿÿÿöÿ÷ÿõÿ÷ÿùÿðÿùÿ÷ÿýÿþÿüÿ ûÿþÿøÿþÿýÿÿÿþÿüÿÿÿýÿýÿüÿþÿÿÿúÿüÿôÿúÿýÿøÿÿÿþÿøÿúÿýÿüÿùÿüÿûÿûÿüÿþÿþÿúÿþÿüÿýÿýÿúÿÿÿÿÿÿÿøÿýÿýÿÿÿþÿüÿÿÿüÿÿÿþÿûÿýÿþÿýÿÿÿýÿÿÿûÿüÿÿÿÿÿüÿýÿÿÿþÿþÿÿÿüÿþÿþÿÿÿþÿûÿÿÿþÿÿÿüÿþÿüÿþÿÿÿýÿþÿýÿþÿþÿÿÿþÿÿÿýÿÿÿýÿÿÿÿÿÿÿÿÿþÿþÿÿÿýÿÿÿýÿÿÿüÿþÿÿÿÿÿÿÿþÿÿÿþÿÿÿÿÿþÿÿÿÿÿþÿþÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿþÿýÿÿÿþÿÿÿÿÿþÿÿÿþÿþÿÿÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿÿþÿþÿÿÿþÿÿÿÿÿÿÿÿÿþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿþÿþÿÿÿþÿþÿÿÿÿÿÿÿÿÿþÿÿÿÿÿþÿÿÿÿÿþÿþÿÿÿþÿÿÿÿÿþÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/BinauralDecoder/Source/IRs/irsOrd2.wavIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/BinauralDecoder/Source/IRs/irsOrd2.w0000664002537200253720000001030415257173642031321 0ustar zmoelnigzmoelnigRIFF¼WAVEfmt  D¬È data˜ÿÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿþÿþÿÿÿÿÿýÿþÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿþÿþÿþÿÿÿþÿÿÿþÿüÿüÿýÿþÿýÿÿÿþÿÿÿÿÿþÿýÿúÿùÿúÿÿÿÿÿùÿþÿÿÿüÿüÿúÿþÿüÿÿÿýÿúÿÿÿûÿúÿüÿúÿûÿÿÿÿÿýÿúÿÿÿþÿ ùÿýÿþÿöÿúÿÿÿýÿýÿüÿùÿ ÷ÿýÿûÿñÿüÿôÿüÿøÿÿÿûÿùÿ òÿûÿÿÿ óÿôÿïÿîÿøÿÿÿùÿÿÿæÿêÿ öÿ ýÿþÿýÿúÿæÿ ûÿ úÿôÿûÿíÿ÷ÿêÿ%ÿÿ ÷ÿõÿòÿÞÿ¾ÿ,%0ÿÿþÿðÿüÿ ûÿÓÿäÿõÿ óÿïÿæÿñÿñÿ6¼ÿîÿôÿÐÿÌÿªÿÝÿ›ÿöÿúÿüÿ(ÍÿîÿÊÿßÿçÿûÿçÿèÿ¼ÿßÿÉÿÁÿ ãÿ«ÿ´ÿÒÿ ùÿ!òÿýÿÕÿèÿÓÿÉÿÉÿ Ùÿ+ÕÿøÿÐÿ·ÿ¶ÿ×ÿY7Ôÿ� äÿîÿ½ÿ¾ÿôÿ5êÿÿÿE2R"×ÿîÿMñÿÒÿ?_Eþÿ"UôÿÛÿ!3Clêÿ%öÿõÿ&ôÿÇÿ)(Âÿõÿ1Œ†ÚÿùÿåÿÆÿ*X2šÿyÿ>¬ÿE{G~-èÿfÿ°ÿæÿîÿÖÿW,q4fßÿ¿ÿ_êÿÒÿ0­Kh“L žÿèÿ†ÿwR .îÿ, ÖÐÿjÿmëÿôÿ‘ÿJ)¾ÿÿÕÿóÿøÿ¯ÿÿ ÿÒÿ½ÿ´ÿ%ÿ2Ôÿ‡ÿWÿOÿºÿ†ÿeÿ2ÿúÿçÿ»ÿ¥ÿíÿpÿ-ÿWÿ(ÿxÿôÿÒÿ¥ÿbOÿâÿ(ºÿ¤ÿÔÿ–ÿUÿ¶ÿÈÿRCÄÿÙÿ&Íÿ-}ÿóÿ|ÿBH;½Íÿƒ•“·ÿùÿIðÿ_Ûÿü= )#Qÿ¡ÿxÿrbÿ $BMÿÿzÿqÅÿæÿÕÿÀÿ7ñÿöÿ³ÿîÿ-îÿÕÿüÿ,¿ÿßÿð·ÿ.0EÎÿ¥ÿ¢ÿ>o.rÅ‹‰ÿŽÿ¤ÿýÿíÿ ÿ“d9`Ÿÿ!°˜´ÿöÿ1ÿ-Puv9ÿÿîÎÿc¸ÿ¾ÿ|Þÿïÿ‡Çíÿ&7ºöÿ ]W{ÿyõÿ]ÆÿE`3ÜþY%°ÿt*B/UÖõÿ7+�µÿo£ÿ�ÿ"\ÿÜÿ’Ãÿ8ÇÿN‹±2çÿ9ÿéÿgÿÃÿ;ÿ*ÿ„ÿ¹ÿÔÿÌÿòÿ˜ÿÐÿ5ÿŠÿÿÃÿŽ+Þÿ÷ÿ»ÿÖÿËþPÿ¬ÿ¢ÿJ!ÿƒÿÖÿ„ÿ�ÿEðþTÿûþoÿ.ÿ©ÿTÿˆÿ–ÎÿŠÿjÿ„ÿëÿuÿþ€ÿ×þÿ¢ÿrþðÿƒÿÿ¬þ±ÿ~ÿºÿ’ÿ?‘ÿ¥ÿÙÿÇþ^9ÿXÿ˜ÿ«ÿHŽÿ)ÿ›¢ÿûÿL” ÿ-1ÿqëÿçdÖÓ?qƒI€þD"*ÿÜÿ9ô®¥uúÿºÿ]ºÿÄÿí*¿±”É¢ã~ÿ'þ•š¨LÝÿW÷TÒÿƒÎaÿÝ[úÿøñÿ—ÿB•µÿ„¯e_ÿô¦þC�Þþ½i-ÿÆÆIH×Áÿ‡‚þ"þ‚×ÿõ(°ÿÄ|ÿ™ÿu¶(BÿjüeB`Üÿ·éÿzÊþ4ýýIþzþ—ü¦þe·ÿ�9uÿþUþ�ÿ¼ý‰ÿ'Ú›4ÿÔÿ=ý¹ÿ�ý³ÿdýž¶7¶ÿþ‰8þX‡ÓRƒþ%ÿŠþ¶ÿ6ü q=ûºýüþüÏÿ–ïý-*Dþÿ¢þ÷úýVúmŽûøþÿJý¥3üoý�ûJý”ý°iùˆb¢km×ÿ;~úmz½ûíþƒtÿ´Aãüè ®þ¨ùÓúWŸúúvø¹T ·ýOÿ< Xþ²êûçêYFm»®ÝþLé D‘¨üîù*Ýûg’ Y%þ¡üÖ •øÉ×þ0 > pƒƒ½×¨ùöþÀR�ùr óõ5 Èý<&T¼ñk<þXó»øPrà(—5,òyñ„î`ôPõB?ö[4»,gí'†5ù}õ…ãÈ ‚ ÊS»³üL«úåžÀåêÚøý g zžæ•þ»æDùþþ}+ï0ßcò�ûËõöaÿ“÷ Ì÷µó‡wë­ðˆ ºôýtü4ú"ò'.ùWI ÖDV`öº%Ú¢ü¯Z¢Oî¨Nò=Úͺùò½ | N>’ÿy”ýËö[Ø)�ÇÓôÿÿy÷»þ¨ûCÿ�þ]��– UüõûÆWÿOÛýOƒú*+þFÿVþÀþ÷ÓøÙþ%uû® ûýÿ Dûükÿ°ýÇÿ&ü‡: M"þkúÔûžü\ý�ÿéûòjü¦é™ÍþšþÉýÓýÌóú‹`²JÿäþÅÿmÕý¹û*xµû¯ý�þ|ÿž§ý¹þ2+Jþ‡üz/ýxQû©ýh7Xüûþ½þönû…ßÿqÿÊ´ÿ×þäýSý=©ÿ ÿˆQþÛü²}üÞÿöR‹ÿ^ÿîýRÿüŠÿ·ÿ½fÿ”þVýVÿÂûìþ{tÿçÿ·þ¾ïýöYþ‡NÿTÿR÷ÿÉþhý ÿ˜üã[¦€ ÿË$þe…ý8KÿlÿŠ ÿð0ÿOÿóÿ®ÿdâÿ‘ÿcÿþÙM<”ÿquÿ”ýôÿV »ÿqÿ¶—ÿ�­þç ±ÿmNÿ70ÿ8ÿC6Sÿw[ÿæÿýý™a(|ÿˆ›ÿ‡Yþ8Ú7ÿ üÿ›!ÏÿSþÚþìýÿùfI±ÿõÿ#|ÿ ]ÿ­ÿ¡þo(ÿg²}ÿçþ@ÿHÿëþàÿD7Ñë5ÿ¡ÿÇÿàÿ/ÿÿ2³Wÿñþ’�®þ’ÿÉ›þýþéÿÝÿKÿ^�ÿ½µÇÿwÿÉþÿE�ÿBŽšAÿáþ�ÿÿ°Éÿ÷ÿ4ÿ�ÿnÍÿTÑwÿûþXÿ$Òÿ§ŽÉÿ$ÿUÿžÿÒÿ«ÿûÿ�Ög©Íÿ®ÿ ®þ¸ÿâÿ‹>+_œ«™Iÿœÿ ùÿ íÿ.Ëæ&&Áÿëÿäÿw¼ÿ a^úaãÿåÿ?ÑÿygÜÿoÔÿ¹ÿb<UÔÿ(ÿïÿvÿ „Ê¢ÿSÿ–ÿ ²ÿQÿáÿµÿpËÿËÿìÿtˆÿ¶ÿTQÿBÿ©ÿÖÿÍÿÍÿ‹žlÇÿ¹ÿºÿ§ÿÂÿ‰‹è3Ž�¯ÿ¥ÿ®ÿúÿÝÿYk…íÿ­ÿòÿëÿ…ÑàyIÒSÿ‡ÿÄÿC½�—}lLÿòÿÆÿ«ÿÜÿ(•yG’ÿàÿšÿ÷ÿ²ÿDÝÿÏÿIÊÿ?1ÿyÿ[ÿûÿ’GÿÉÿ¡ÿ³ÿkÞÿŽÿ˜ÿ-_8ûÿ˜ÿbÿˆÿO2.CZ­ÿÎÿéÿòÿ Ïÿ8¸?kòÿöÿ�ÿØÿÍÿŠRI&“ÿ®ÿÎßÿbûÿ~a|ÿÓÿ…ÿÿfÙÿåÿÙÿ<|KÕÿKÈÿôÿ"åÿ!þÿz!‡ÿ×ÿôÿÆÿöÿýÿúÿœkµÿ&lÝÿ»ÿ'ËÿsÿGT¹ÿòÿ#]óÿÃÿÿÿüÿûÿüÿüÿy'ÚÿáÿæÿBÞÿòÿ6óÿýÿ."áÿ£ÿÿÿüÿ0Èÿ(ÜÿéÿÄÿîÿ÷ÿ/þÿâÿÏÿÒÿÖÿøÿàÿåÿ ¼ÿ3ìÿÿÿ¼ÿËÿÝÿ×ÿÛÿÆÿéÿýÿ%úÿêÿÄÿÙÿêÿÕÿÚÿ,$ ÿÿ,ÿÿéÿÜÿçÿòÿÌÿãÿ.Ùÿíÿûÿ ãÿüÿøÿ+ èÿüÿ)$ ýÿãÿ!  þÿêÿÿÿ ûÿ éÿúÿåÿ õÿùÿêÿøÿîÿ ýÿüÿûÿñÿ ûÿôÿûÿýÿùÿùÿöÿêÿöÿüÿþÿÿÿöÿøÿöÿþÿÿÿÿÿüÿýÿùÿõÿþÿþÿþÿûÿþÿüÿüÿüÿüÿûÿýÿÿÿûÿýÿûÿÿÿÿÿÿÿýÿüÿüÿûÿÿÿýÿÿÿÿÿþÿýÿÿÿþÿüÿÿÿÿÿÿÿÿÿÿÿþÿÿÿýÿþÿÿÿÿÿþÿýÿÿÿþÿþÿýÿýÿþÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿÿÿþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿþÿþÿþÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/BinauralDecoder/Source/IRs/irsOrd7.wavIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/BinauralDecoder/Source/IRs/irsOrd7.w0000664002537200253720000007305415257173642031341 0ustar zmoelnigzmoelnigRIFF$vWAVEfmt @D¬"V€datavÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿþÿÿÿÿÿþÿÿÿÿÿþÿÿÿÿÿÿÿþÿþÿþÿÿÿþÿþÿþÿÿÿÿÿÿÿþÿÿÿÿÿÿÿþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿþÿÿÿþÿÿÿÿÿÿÿþÿþÿÿÿÿÿþÿþÿÿÿÿÿþÿÿÿþÿÿÿþÿÿÿÿÿÿÿþÿþÿþÿÿÿÿÿÿÿþÿþÿÿÿÿÿþÿþÿÿÿþÿÿÿþÿþÿþÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿþÿþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿþÿþÿÿÿÿÿÿÿþÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿþÿÿÿþÿþÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿýÿþÿþÿþÿþÿÿÿÿÿþÿþÿÿÿÿÿþÿþÿÿÿþÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿûÿýÿýÿÿÿÿÿÿÿýÿþÿÿÿÿÿÿÿþÿÿÿþÿýÿýÿþÿþÿþÿüÿýÿÿÿþÿþÿÿÿÿÿþÿþÿÿÿÿÿþÿþÿþÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿþÿüÿþÿþÿþÿüÿþÿýÿýÿþÿÿÿÿÿþÿþÿýÿÿÿþÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿýÿÿÿÿÿþÿÿÿÿÿÿÿþÿÿÿþÿÿÿþÿþÿýÿûÿýÿÿÿýÿÿÿþÿýÿýÿýÿýÿþÿþÿþÿþÿÿÿþÿþÿþÿþÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿÿþÿþÿÿÿþÿÿÿÿÿÿÿûÿýÿþÿýÿýÿýÿùÿýÿüÿÿÿÿÿÿÿÿÿÿÿüÿúÿþÿüÿýÿüÿüÿþÿÿÿýÿüÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿÿÿþÿýÿÿÿûÿþÿþÿÿÿúÿùÿýÿÿÿüÿùÿþÿþÿüÿþÿúÿþÿþÿýÿüÿýÿÿÿþÿýÿÿÿÿÿýÿýÿÿÿÿÿÿÿþÿÿÿþÿþÿýÿÿÿ÷ÿþÿÿÿýÿùÿüÿÿÿÿÿüÿÿÿüÿüÿûÿüÿýÿÿÿýÿûÿöÿüÿþÿþÿÿÿÿÿÿÿûÿÿÿÿÿþÿüÿÿÿÿÿüÿüÿýÿÿÿýÿýÿÿÿÿÿùÿýÿýÿûÿ úÿüÿþÿþÿúÿõÿþÿþÿüÿýÿþÿÿÿÿÿ÷ÿøÿùÿÿÿÿÿÿÿÿÿýÿüÿüÿþÿýÿýÿÿÿÿÿÿÿýÿþÿýÿüÿûÿõÿìÿ÷ÿÿÿ  ÿÿüÿúÿýÿýÿýÿûÿÿÿÿÿþÿöÿüÿýÿýÿÿÿþÿÿÿýÿøÿüÿüÿþÿÿÿüÿþÿÿÿýÿýÿúÿòÿóÿðÿÿÿùÿüÿ÷ÿöÿùÿúÿùÿ þÿþÿúÿþÿ ýÿÿÿýÿÿÿÿÿöÿÿÿýÿùÿúÿþÿÿÿýÿúÿýÿùÿþÿüÿûÿþÿÿÿýÿþÿúÿûÿîÿûÿïÿìÿùÿòÿòÿúÿûÿøÿîÿùÿýÿûÿùÿùÿþÿýÿþÿûÿüÿøÿþÿöÿ÷ÿüÿöÿüÿþÿýÿÿÿüÿÿÿýÿÿÿúÿüÿ ýÿôÿøÿòÿýÿüÿòÿ ÷ÿ÷ÿóÿòÿÿÿþÿ úÿ ÷ÿ üÿþÿýÿÿÿõÿôÿøÿýÿÿÿûÿþÿýÿüÿÿÿÿÿÿÿýÿýÿòÿüÿöÿùÿòÿÿÿûÿÿÿýÿûÿýÿøÿþÿøÿ÷ÿûÿúÿüÿüÿúÿôÿúÿþÿÿÿþÿüÿûÿûÿ þÿ øÿúÿ ÷ÿùÿüÿôÿöÿ ÿÿôÿûÿþÿ÷ÿóÿôÿñÿøÿøÿ ÿÿõÿ ûÿüÿüÿüÿ ûÿüÿûÿÿÿÿÿþÿýÿöÿþÿóÿëÿøÿ÷ÿ óÿøÿ õÿðÿ ûÿñÿýÿ ÷ÿðÿðÿöÿûÿýÿ öÿûÿûÿüÿ ùÿÿÿöÿþÿøÿýÿúÿûÿ  òÿõÿíÿ èÿíÿùÿ"ñÿ ëÿàÿÝÿõÿõÿüÿùÿöÿðÿüÿþÿöÿüÿþÿùÿøÿ  üÿ÷ÿüÿóÿþÿýÿõÿûÿ÷ÿûÿóÿêÿõÿñÿøÿóÿýÿôÿîÿÿÿìÿõÿìÿñÿ õÿíÿÿÿýÿ üÿÿÿúÿýÿ ôÿÿÿýÿøÿûÿüÿþÿÿÿûÿûÿþÿýÿñÿìÿñÿçÿãÿ ýÿùÿßÿÝÿæÿûÿýÿ îÿýÿéÿûÿéÿûÿøÿõÿ ûÿøÿøÿûÿ ÷ÿøÿúÿðÿþÿþÿ ôÿýÿþÿïÿúÿùÿÿÿþÿ  þÿîÿ)ÿÿ$øÿóÿêÿæÿðÿýÿïÿ÷ÿôÿÕÿÝÿøÿîÿÿÿîÿáÿõÿ òÿÿÿ÷ÿûÿùÿðÿåÿúÿüÿúÿ ùÿ ÿÿ ïÿýÿ2RíÿïÿA>ôÿæÿ ïÿøÿõÿéÿ  éÿ õÿüÿçÿôÿðÿðÿ÷ÿüÿúÿùÿðÿÝÿëÿ ùÿóÿ úÿýÿüÿüÿïÿÐÿ74þÿëÿôÿEøÿÚÿøÿõÿ .  éÿôÿ ÷ÿõÿ÷ÿõÿëÿúÿðÿñÿÿÿóÿ æÿýÿ õÿöÿøÿôÿÿÿÿÿöÿõÿÝÿòÿàÿåÿÕÿÅÿòÿèÿóÿµÿËÿ/ 1 äÿóÿ"êÿùÿáÿíÿöÿîÿõÿñÿúÿõÿôÿüÿõÿ ïÿ þÿ  óÿþÿõÿÿÿöÿüÿîÿñÿ2ÞÿÞÿÈÿßÿäÿÎÿÙÿøÿÔÿçÿæÿ# Ôÿ2ÝÿÐÿïÿñÿèÿòÿÓÿýÿñÿ ëÿ÷ÿ×ÿûÿøÿøÿåÿíÿùÿúÿþÿ÷ÿþÿùÿïÿðÿ&* àÿ8Çÿèÿ#ñÿóÿòÿÔÿ Ýÿ#ÐÿÿÿÙÿÖÿÝÿéÿ âÿÞÿ%àÿ'éÿÃÿ, íÿ ìÿ ïÿãÿäÿñÿ íÿôÿ öÿ ÷ÿèÿõÿøÿëÿúÿÿÿÞÿóÿ$=·ÿÛÿ6ÜÿóÿÐÿ7éÿÞÿÍÿËÿøÿëÿ  6£ÿÿÿîÿðÿ"Íÿ óÿóÿ(ùÿÞÿîÿüÿþÿýÿïÿûÿïÿÿÿ òÿàÿÐÿëÿÞÿ¯ÿAôÿ) Üÿþÿóÿæÿ¾ÿâÿùÿ+*óÿÚÿâÿÚÿ÷ÿ'íÿÞÿêÿ!îÿ ×ÿûÿíÿ ÿÿÔÿõÿïÿüÿ öÿÈÿÿÿ%Öÿíÿ)2Ðÿ@éÿàÿàÿÛÿÞÿ$ùÿÜÿôÿýÿåÿäÿLÙÿ& ýÿÿÿ ÑÿÓÿîÿýÿ ðÿâÿíÿöÿûÿþÿùÿ&÷ÿ¯ÿþÿêÿföÿ5¬ÿM6âÿûÿÝÿ«ÿòÿ Úÿêÿ*ôÿÜÿ !ØÿúÿêÿA) çÿÿÿýÿýÿ %øÿ îÿïÿûÿ ñÿ÷ÿ Þÿ Éÿîÿ+`ýÿåÿ: Ëÿýÿ±ÿãÿñÿZèÿÃÿðÿ7ßÿþÿI'ÛÿÞÿûÿ óÿ Íÿóÿóÿòÿ þÿðÿ(! õÿ NIàÿ)äÿÃÿ$ÌÿåÿÆÿøÿ:> .îÿåÿçÿýÿçÿÖÿÐÿêÿâÿêÿúÿàÿþÿêÿåÿûÿïÿæÿÖÿ#ìÿ/äÿóÿîÿõÿ þÿþÿüÿýÿúÿ \ÒÿÆÿûÿàÿ;åÿ#) ; $c&)þÿZ÷ÿ;àÿÎÿÆÿìÿäÿâÿ÷ÿ¹ÿ%áÿóÿúÿ/ïÿìÿãÿôÿðÿôÿçÿùÿÚÿùÿÅÿêÿàÿýÿúÿþÿíÿõÿ W :úÿøÿãÿ^R ÎÿÜÿËÿMÛÿéÿ"Ûÿçÿúÿ$/ãÿ óÿØÿÙÿõÿñÿãÿÝÿåÿëÿìÿæÿûÿëÿæÿ¹ÿ2ÖÿÞÿ=’ÿ¿ÿnÿ- ëÿÇÿòÿ'ßÿáÿS8(ÜÿK+!Êÿýÿ,ÿÿ*ýÿðÿýÿåÿùÿ÷ÿýÿÿÿ õÿíÿöÿ÷ÿ ÛÿüÿÖÿÆÿ™ÿºÿØÿÖÿàÿ½ÿýÿ²ÿ³ÿÿÿÿÿßÿÕÿÛÿúÿÏÿáÿàÿ ãÿ ïÿóÿòÿ)Üÿ*íÿÍÿ%àÿõÿþÿ*+üÿâÿ5ýÿõÿîÿ÷ÿýÿðÿÃÿïÿ„ÿûÿ'ÕÿQ­ÿ³ÿn´ÿÚÿÿÿûÿ�ÿ�ÿ"äÿºÿËÿÝÿÎÿÌÿÚÿöÿÞÿúÿáÿáÿaïÿÕÿÊÿÚÿÞÿìÿ#0õÿDðÿöÿ úÿ1îÿ1þÿùÿðÿçÿÒÿ2ßÿ¼ÿKÚÿæÿV…ÿÊÿ!ìÿüÿÁÿ[ÃÿôÿiÛÿÑÿèÿ¸ÿûÿÇÿþÿßÿÄÿþÿýÿäÿ%ÁÿÜÿèÿÀÿÛÿÿÿøÿ.ãÿþÿ1Óÿ'ïÿðÿéÿßÿûÿ øÿ-ûÿÇÿ¾ÿ %¾ÿÖÿ$5y Mðÿ [Róÿ(@òÿºÿõÿÕÿIÐÿøÿâÿ÷ÿ÷ÿªÿ$Þÿ ¼ÿ%ÿÿóÿùÿÚÿßÿ/Öÿ/"ôÿ­ÿöÿþÿðÿíÿæÿÿÿÀÿûÿïÿÑÿ~ÿÀÿ7Öÿ �ÿ¡œ¡ÿq $¯ÿ/-ßÿýÿ¿ÿòÿâÿüÿÔÿ"ÚÿRéÿþÿõÿ»ÿùÿöÿõÿ#øÿÛÿ9÷ÿâÿáÿâÿèÿáÿúÿÿÿºÿùÿäÿ ÚÿÙÿ Ñÿíÿõÿâÿçÿÿÿ÷ÿ5w2N«ÿ%$þÿ’ÂÿDßÿõÿBªÿáÿÄÿØÿçÿ 7)6ðÿOïÿÖÿêÿF;Öÿèÿ1½ÿêÿõÿùÿ!Öÿ Ùÿ%7Üÿ#îÿßÿ÷ÿØÿþÿŽ;LûÿüÿC)îÿUàÿþÿ÷ÿÓÿ-„ÿ*ªÿ|!.EDQéÿVP±ÿ4ôÿ*!Æÿ*Úÿõÿ(3Üÿ Þÿöÿ+ìÿS2ïÿßÿ>D ŒÿÒÿhñÿU´ÿ®ÿM„ÿ³ÿÇÿþÿ&,þÿ¶ÿUS2 ÷ÿÒÿ7Ìÿêÿ âÿ²ÿõÿÉÿ àÿ³ÿM¸ÿèÿ7ËÿÈÿòÿ$þÿäÿåÿ2÷ÿ#%1âÿ 2?ðÿ+úÿâÿÍÿM¯ÿÌ¡ÿ.}�ÿºÿÌÿìÿ+&…ËÿJÙÿ)ìÿìÿËÿýÿ ¬ÿ�ÿéÿÆÿ?xÿ7÷ÿÍÿEÈÿ¯ÿöÿôÿ'øÿ(ðÿåÿ×ÿ1áÿ /'øÿçÿ'8Ãÿäÿ‚ñÿéÿ¡ÿÔÿÝÿ«ÿ‹ÿ<% ûÿµÿs¾ÿˆ½ÿÎÿ^6ŒAÝÿTÎÿÚÿ�ÿÃÿêÿ‚ßÿ>áÿ2_6#*Ûÿåÿÿÿäÿùÿëÿ¶ÿ'ÑÿÓÿ÷ÿãÿ Üÿßÿ˜ÿÕÿr&Cÿ¾ÿNÿÆÿgÿkÿÐÿ�üÿ¯Ìÿgÿ8çÿ�äÿËÿB&Âóÿ ,ùÿÊÿøÿAa©ÿh.ôÿ]âÿâÿÛÿóÿ)7Äÿïÿ×ÿÓÿûÿêÿåÿ÷ÿòÿÆÿÐÿ´ÿVÿ¾ÿ¦ÿ¸ÿÎÿ1gÜÿoÉÿ�ÿÐÿ 3ýÿ% ÃÿÿŒÿ:øÿ0(øÿàÿ¡ÆÿRæÿöÿ 6Gîÿ,Q7 Èÿ9B ßÿêÿ ûÿÈÿùÿNÿÇÿTÉÿ­ÿov—ÿ�êÿîÿ ÿÂÿÛÿhÿÿÿeÿ¥ÿ)¥ÿ ,ÿBÿõÿ”ÿÝÿßÿEcm½ÿ€')ÁÿÖÿûÿ4îÿgëÿÊÿôÿ0üÿóÿÅÿÜÿ$3 ½ÿ«LºÿÄÿc\IP:Ö–ÿæÿÿãÿýÿqÿ3Œÿûÿÿ�ÿ¦ÿÖÿÓÿ¦ÿîÿ üÿ€ŠÿÆÿôÿ!Iÿ¡ÿòÿ¥ÿâÿÖÿðÿñÿ±ÿÍÿìÿÿÿÍÿøÿöÿúÿÿÿI,àÿU,ÉiÿŽÿ¶‹šïÿ ›91ðÿQ1kW£ÿ²ÿ·ÿKýÿ--½ÿöÿ’ÿ†ÿdÿ¤ÿ»ÿÅÿ¾ÿåÿÂÿìÿ—ÿžÿÖÿlÿ¼ÿÏÿôÿéÿüÿøÿ'Ãÿéÿ õÿ¯ÿŽÿ†ïÿ83"iaâÿ&xbJÏxìÿßÿi(Ñÿ¢ ® ?äÿÛÿûÿ·ÿ,ÿªÿñÿ»ÿi÷ÿ�ÿýÿàÿõÿ¥ÿÇÿ{ÿëÿüÿBäÿìÿÏÿÛÿ²ÿÎÿÇÿÙÿÊÿ§ÿÈÿÁsïÿÏÿšÿ>óÿëÿÕÿÕÿ'®ÿ.¨Óÿèÿ ÿðÿ£ÿ„ÒÿMŠ»ÿi³ÿ<âÿéÿªÇÿáÿbúÿ{ÍÿRÚÿîÿR8þÿfèÿíÿëÿüÿšÿ®ÿõÿÔÿ\ÿáÿ\¾ÿ%ñÿýÿ|ÿaSÿ¼ÿÿÿŒÿ:áÿF’ÿ®ÿûÿ�¶ÿmTãÿC½ÿ·ÿ¬ðÿ›®S'^Äÿ=æÿ,=B&\Wðÿ(9îÿ7 éÿ÷ÿžÿéÿAÿbÿÝÿÊÿtÿ¹ÿþÿMKÿ›ÿ ÿ˜ÿìÿˆýÿfÿšƒÿ%S �óÿçÿ²·ÿæÿlÿV¶ÿËÿ»jvrÿ8ìÿ�ÿÎÿ,zÉÿd)ÿÿÌÿäÿ5'þÿQúÿ4èÿ×ÿ͹ÿµÿÔÿ•ÿHÿ0>ÿ\Äÿ¾ÿ½ÿÏÕÿiÿe¹ÿXÚÿÞÿ3ÿޤÿ½ÿF4ÿ4Ìÿ«ÿøÿßÿŸÿùÿ•éÿ)Íÿ&`ÿéÿ# —ÿ‡ùÿMóÿóÿëÿ×ÿüÿ3E{I´ÿºÿêÿïÿ‰ÿ¡ÿ*�Ìÿyl›ÿOÐÿ¼ÿ«ÿf¬ÿ€Çÿ§ÿÙÿËÿ—ÿêÿ”ØÿÁÿ±ÿÝÿYîÿ÷ÿuÿßÿ‹ýÿàÿ):Þÿ€ÿßÿêÿ÷ÿòÿýÿ ¾ÿÂÿåÿ âÿÃÿki¢—%š'ºÿ¡aÛÿ™NDÿÎÿìÿ–`ÿáÿ¢òÿt* ´u%N@.ÇÿEîÿ�]ÿÆÿ4/,:ìÿ÷ÿÕÿ’ÿÍÿE”ÿ"§ÿÑÿ´ÿÖÿîÿêÿùÿáSrÚÿNíÿSÏÿ;‚ÿ0ÿwñÿèÿE>ÿ�C½ÿ×=)Q’ÿQ\%ŽÿÀ®ÿûÿ@ßÿ+õÿ]ûÿ c¦ÿQÙÿøÿ5´ÿ:0ÿÿÍÿæÿ ùÿÕÿÁÿìÿ¯ÿ— N!º£ÿwÿNÿ ëÿÛÿá¦ÿ•ÿyÿœÿ¶·ÿuÿ*¯ÿäÿ0ÿ}ÿ¬ÿ–ÿpÀÿ3 ÿ îÿ¤ÿêÿ#àÿLÒÿHHÊÿ2µÿêÿ÷ÿýÿæÿ1ôÿèÿ $ëÿI~ùÍ‚"O–-0^4ÿ¯ÿ±ÿ:T…ÿÁÿîÿ˜ÿPÿVÿŽÿ‡ÿ�ÿÛÿœÿEÝÿ�Ãÿÿ?KÿØÿüÿ¦ÿîÿ EþÿÕÿÕÿ×ÿþÿþÿ ðÿ+Y9àÿ_?ÿ©´ÿ£ÿ ñÿïÿ¼ÿíÿûÿïÿ €6äûÿaÿEl¶ÿ±ÿ±ÿØÿÅÿ£ÿ2ÿèÿ¹ÿ…ÿ6¦ÿ¾ÿáÿÞÿMôÿÙÿØÿîÿW×ÿåÿüÿñÿÿÿ?Ûÿ2+¬ÿÁÿKÿ@ÿÒþóþzþ,ÿ.qùÿ-Œ´ÿ&D–Z&ªÿiòÿfSÿ+ÿ“ÿ%\íÿ>žÿ jÿŸ#oÿZÿEP¤ÿ ¡ÿÎÿ7¿ÿ©ÿàÿÓÿŸÿf¾ÿÃÿ÷ÿ+ãÿÔÿ÷ÿŒÿ&íþÑþ×ÿÿ<ÿ?ùÿAÝÄN½ÿ­ÿKËÿ6�ÿÑÿ7šÿsÿŠ ƒÿ·e÷ÿ"òÿõÿðÿ…«ñÿáÿœM<Õÿøÿ1ûÿ²ÿœÿòÿ¬ÿæÿïÿâÿ"ÐÿžÿÀÿ*Kßÿ¡ÿ¶ÿ«ÿ=&ÿlÿL.PÒ9(ÿhÿ™ÿ9rÿJ•ÿÀÿ¿ÿ/Œÿmÿ¼ÿ.‹c�w {êÿbÚÿn9W`:QìÿHùÿ]`–ÿËÿËÿÔÿ—ÿ$ßÿ±ÿ;¨ÿÎÿßÿáÿ åÿ 1ªÎ7’åšRÿ‡ÿSÄÿ1´ÿöÿäÿØÿ{�†j®!ßÿ‹#9åÿ îÿ\ÿ -þÿXvoñÿS‹ÿKéÿ\g\GØÿùÿÖÿ *Líÿýÿk7�ÿ uÿjÿ»Ÿÿ2!ÿ?ÿˆöþêSg“êþáÿø¯·ÿýnRÔÿƒÿ«ÿSýÿõÿèÿ)@¼ÿ¹ÿ¸ÿ�ÿ®ÿYBcbWI„ ZB'-Èÿ4+ÍÿD•ÿ³öCÿ|ÿˆþÍÿ¾ÿaÿÄÿüÿS;ÿ^Ñÿ×ÿêÿ„ÿ'ðþ`ÿ# ÿžÿµÿÏÿŸÿÛÿ‡ÿ}ÿ§ÿ0c›ÿ±ÿ‘ÿ¾ÿ�ÿ¨ÿ äÿ l3¼ÿÑÿêÿ0äÿ|ÿêÿõÿDÊÿ+³ÿ{Û½ÿË•�ÿ�ÿmÿœ¹£ÝÿDñÿ˜ÿ­ÿ�²®ÿÌÿéÿÿ 8Æÿ‚ûþ¼ÿÀÿ�ÿ`ÿ¼ÿûÿf64H^ÿQ0ËÿÈÿ"úÿÐÿÀÿØÿ'ÃÿÈÿ¹ÿèÿâÿ¹ÿãÿàÿVÿRSúhÿ˜ÿ4b\¦ÿL»ÿIéÿóÿ‡?�ÿžÿI+þÿºÿ´d®ÿ)·ÿïÿ ÚÿCž\I¦aÿÜÿ¹ÿ¹ÿãÿœÿB¥ÿóÿçÿÉÿ¸ÿËÿÇÿîÿõÿâÿÄÿûÿm-ÿ8ÿ!WmС[‚ÿwÿ™tÿÐÇÿ ÿÿêëÿúÿ˜ÿTrœÿ"ÿ(SŒIy®ÿøÿÛÿéÿ]ÿ;%I‡þÿºÿÂÿAmrÿläÿËÿèÿ�÷ÿ2Íÿàÿ)ùÿ›ðÿ�ÿâÿ_œÿªZÿãÿ ÿS,;ÿKÿòÿ…ÿ£¶ÿ³ÿÉÿn%˜ÿ¶ÿ€ÿMHÌÿ0Gd.7uÿ¼ÿñÿ6#,ðÿŒìÿ'OdÃÿ=;ýÿæÿ½5$B<8éÿ<ŒžEþñÿÿzÿ´ÿñÿ’ÿÿÕÿØÿîÿwÿÓÈÿ[ÿhÿ [Òÿ©wýÿ@ÿ6Ïÿ;O² Æÿ2íÿA´ÿUÿlÔÿ¯ÖÿÀÿ-Íÿîÿ!+_QTVF%ÓÿÖÿnÿ-wþXþÆýêÿéÿ¸ÿ|ÿSÿ ïÿSÿœO žäþchl˜ÿ“ÿ’ÿÿ8ÿÌÿ�ÿxîÿÌÿ¦ÿuÿMôÿÏÿðÿàÿÇÿ¿ÿ~ÿæÿ./Ïÿõÿûÿúÿæÿ¿ÿÈÿ…ÿ-×ÿöÿ6½ëÿ„Fs^õÿÆ»ÿµÿdÿùÿêÿ¨ÿ ™ÿÏÿíÿÅÿÙÿþÿNòÿÒÿöÿØÿ‡ÿS´ÿDÿ àÿìÿÅÿ+ÝÿÅÿIÿíÿïÿüÿúÿáÿ³ÿõÿÿÒsÛ•x[Ü÷ÿHóÿÎÏÿF¶ÿŽÿ51€JÀÿ¶ÄÿíÿÀÿ{;@*Íÿ¯‘ÿÆV+Lÿ¶ÿå­ÿÞÿ ÿ¾ÿ"ÁÿIÿÄÿ‘ÿòÿìÿÑÿ©ÿqÿ¾ÿÿ.BÁÃþ�Qy5ØõþÐÿ§¿þ,þG”ÿ¨éÿ VÿAÿù¡ÿzúÿ—5ÀÿXªÞÿ2ÿïÿˆ<»ÿ rÏÿ¥ÿ½ÿìÿ.öÿ#2�ÿëÿtÿ4úÿóÿ‹ÿlÿîþ§=?þüÿzM¤þóþCÿÑÿžgþÿ«ÿßÿVþÔÿ¯¦ÿdçþ¨ÿ9Oÿ +ÿN«ÿíÿ/˜ÿŠÿ“ÿ»ÿÞÿr-ÿÿÿ8MfÏÿ«ÿÚÿÌÿR*$üÿòÿóÿÓÿ˜1*€”þtLVÿÿïÿÕƒþ™sþâÿ‘þ²ÿ%Ãþèÿåþ×þ�ÿþŸÿÀÿä<ÿuÿõÿmÿ`ÿäÿíÿ¿ÿ.ÿâþìÿÔþU±ÿÃÿdÿyÿûÿ¿ÿ×ÿÿÿ¸ÿVÜÿ.Úÿ ôÿ<ÿÿ@?bÿZ0†«àÿâÿgÿIñþ6ÿ�ÿ’ÿ¥ÿ/Dÿ Ûþh +Çÿ¸ÿ _ÿ̵ÿr…ÿ¨°ÿ¶ÿ*òþüþÔÿ ÛÈÿ’ªÿA9ÿ )A5e$CãÿÓÿ L•ÿCæÿèÿŠÿ%ÿ ·~þÃþ”nÿÉÿÿHÿSäÿ#xz9„J1/ðþA¦ÿ"~>óLÿÝÿüÿ€ÿîÿs&ÿ.F,,mØÿåÿ7ÿ\óÿ=U kìÿèÿÁÿüÿñÿ-¯ÿ9ŒÿÓÿö$¤+êÿ;ÉÿCàÿŸÿZ[‘Ïÿ2¡‡ÿ—~!ÿ£ÿ¡ÿB©¤ÿ&×ÿÌýÿI­ÿÅÿ±›+ÈŒ0-ïÿÖÿ`8/\N0°ÿÊÿ}5,êÿªÿXiÐÿØÿÇÿ[ÿMyÿ¯ÿµhÿdƒÿ.åkNÄCÿžßÿkõr8‘ÿ�…ÿ_m)èÿz]›ÿž‡�I £Êÿw«ÿ0ÆÿVÄÿ‡ÿýÿ7núÿÎÿ $*&%¿þõþ5ÿ~ÿ4ÿ}ÿ‘p0Ãaq5¸CÿŠþÎÔþ€èƒ^Oÿß89¶ÿýÿ ÜØÿñÿ˜ÿÄÿÍÿ|ÿxøÿ§¶ÿJ×ÿgÅÿ"óÿAÚÿU#ÝÿeEIc�ÿÿÁÿçÿðÿÅÿÀ˜�Û¢ÿ­ÿOÿøþÒþcÿ°ÿæÿj±ÿ->ÿ–Œÿ/ÿ$ÆÿZÿ#€ ÿÚÿTÿÓÿEÿzÿ™º¹ÿ>b¾ÿÊÿyÿÚÿ³ÿ!;7&%Ëÿ U)Ãÿ�Þÿ{åÿëÿ‰ÿZpØÿ9êÿ_ÿ]ÿ<ÿWöÿãÿEþL<ìÿuBÿáÿTSÕþ¸ÿ@ÿ"‚ÿuûÿíþ/ ´ÿÿþÿÿ<Âÿßÿ¢ÿ¦ÿ¶ÿõÿiÿ˜ÿõÿÜÿ—ÿÓÿrÿúÿ+"]óÿõÿxvÛ=ª�‹ÿ�dÿgÿÅuÿH�ÿøÿäþ‘úþ ½ÿDÿ0Çÿ?pÿÄÿ«ÿûÿ£ÿAÿrÿ+ÿÕþ¦þÏÿ,Ôÿi¶ÿÍÿ³ÿæÿ ÿÜÿÁÿC�ÿÙÿÒÿÓÿ«ÿÅÿRM! %˜i”þ^ÿ¸þ/ÿ;ÿEÿ6Ùœÿånþçÿ64ÿ‘4®ÿ@ÿwÿ»þ FõÁÿ•uÿV$ÿ¢ÿˆÿÈÿ$—´Rÿûÿ]ÿ=�ûÿ]7üÿ1NåÿÁÿ²ÿàÿÀÿ­ÿ+æÿqÿæÿGWÿÚÿÊÿ}ÿ¬ÖÿÖþtÿ|ÿJžÿ*§ÿƒÿ½ÿø¯þ>Äcÿ‡ÿ„þÿ_ÿÔþ™p#|kîÿAÿ"ÿðÿ¼ÿÍ®ÿåÿváÿGŒÿûÿæÿäÿD\u½ÿØÿ ¸ÿÅÿ¼ÿ%ÿ ÿ’ÿ¨ý®ÿaÿòýçÿäS~#Ïÿ3/¾ôßþ6ÿ7QJþnÿÀþËíÿ¡ÿyÿ6ÏÜþ|ÿ’Tÿ(�ÿW…ÿ;¸ñÿ€#ÿ­ÿÁþ5ÞÿÚÿðÿõÿ.4>áÿáÿ` «ÿÑÿ-ÿ;ÿ!ÿuþ‰þ?þ2rÿ !Xûÿ²þ9ÿöþ¨'n/ÿ!ÿŽÿLÿÿ¨ÿ¤ÿRhñÆþ|Âÿà ÿsjÿ^ÿš�YËÿnÿyÿ¢~ÿOEÿFÿ_ÿgÊÿbÔÿ ¯ÿÉÿ5äÿëÿFîÿƒÿôÿÂþ»þíøþ² 9gÊ9±þ^6ìÿ}8æÿÔÿX›ÿ.@ÌÿqûÇqÿsYÿ¹ÿ¯ÿ–H²ÿ�䯠„ÿ,Dÿ�ÿÜÿ5Cÿ…ÿóÿïÿ¶ôÿ0ÂÿìÿÊÿ^óÿÉÿØÿüÿÈÿ"_þ�þ)åÿ�˜·ÿžФÿ‰yÿªÃÿDÀÿüýKÿxþÿ×m”‘|wÃÿäÿÝÿàVx°{¶ÿÛÿ_§ÿJÿ™ÿS;„iñÿåÿ€ÿúÿØÿÕÿÅÿ—¨ÿfç_¤1r3ÿ{þÏýyÿûÿŠ’ÿ‰ÿ´ÿoÿ¢ÿ8ÿ*>”_=0Ø�ÿõá@Bÿœÿèÿ»ÿïÿÐml ÿÒÿ#(1ÿŠcÿ^Ò ÅÿS'øÿ·ÿ‹ÿ¡óÿéÿHôÿEº$” ¸Íÿþoÿ�ýÜþ»ÿÿü'ÀÿYÿòÿ]ÿ°ÿèÆÕÿ ,@�ÿŽÿޤÿ¢rÿüþªÿ-ÿ8© ´ÿ¦ÿðÿƒÿ˜ÁÿÏåÿkvvb1Ìÿ¹ÿab“f&ÏÿL ížÛÞ ÿ6•Cÿíÿþ}«ÿåþçþ ÝþÕþå‘ÿÉøÿ«ÅÿÿþýÑþœÿ9ÿƒÿTÿ0ÿ ÿ]ÿ7ÓÿÇÿ—Ùÿtÿ:ÿìÿœìÿÂf¯\Ýÿ}ÿ7D{þÿúÿöÿ8?Äÿ™ÿ¦wöåþ%žÊþýoþÎÿ [wÿ€³CÿaÿøÕÈÿJþbçKÿ;þýrÿ*îþ&Lfwÿ”§wÿkyr£ÿ‘:îÿÆÿ~ëÖÿŠÿÿ�v'zÿÉÿ×ÿìÿ•Üÿ™ÿ±ÿ×ÿÀÔèþ{ÿrÿýOþÛo­ÿ¯ÿ¹ö“Ö6êÿ]ÿžžBþÂÿ¾)5ÿå±ÿpÿyþˆ²ö‡ÿ÷Ìÿ<ÿ!dooœßÿ˜xgÿäÿÚÿuÿ–ÿþÿÇÿ³ÿÅÿ†ÿÉÿ"xÿBÿUÿdÿ‡þñýÏý«þ°þuÖÿÿYÕÿ²1þTÿ«þ)óÿ†ÿåþÐþ·ÿÄÿnþž›ý”ÿ®ÿ¬£Úÿôþ`ÿvÿ\Rqÿ˜$±ÿIÀÿ8ÿ4ÿüÿÃÿõþ´ÿªÿcÿŽÿ®ÿ*`Òˆÿiü´ýœþ´ÿ�:˜qçFŠÿ˜ÿDýƒþ,ÿïývÿ¾þ8lôþ�ý¼ýèþMþFþÅ¥mMÿù®ÿ½þÍþ©þ-ÿbJîþ¼ÿJÀþåÿßýðþ rÿîÿÒÿMçÿg:…ÿ0zmòÿöücþh¥˜ Ï\qþ)ÿTÿ‰ý@7áÿÌþ¸ýžÛÿÿF1ÿFUÿºÿŒÿ£b+ðÿÌ.ÿ~ýb‹‰ÿ‰ÿ§mÉÿ dþÔnþ@ŸýÁÿn'naÿ^/‘ÿëÿ6Çÿ÷ÿK)ÿ’ÿšÿƉþM*G“ðþÏ|Üÿ¾øÿÌ·ý>×]ÿ¹Ôÿ}Óÿ›ý½ÿÊÿôâÿw©ÿŠ˜ÿóÿÙÿ¹þEÿ¿þA¾ÿöýèÿ4ÿ ÿÂÿÈÿ²þvÿÖþEÿÀÿf³ÿ±®ÿöÿ“ÿ>pÔÿ =nÿõÿ›?‰§ÿÕþâØj‡lðÿËÿ—3üÿCÿ�üAtÿëÿ ýãÿ¡P±‚þ6ÿ©ÿ¤ÿ`þ%Ä­ÿ&oôþNÿ§ÿÑ„0©ÿ™þ*³ ¬÷qôÿ« °ÿÀÿ¢ÿÿþ'œÿÈvÿzуÿ,ÿþœœ¬þþÿþôýêk<4pý¨ÿ�ÿ�ÈX£Pö xƒ…vÿ¡`ŽøÔ¯ÿäÿ\ÿžÿsÿõÿhÚÿ‘”ªlfÛþ(ÿ>ÒÿËþ@�ÿÖþüêýÝþOÿŸÿrÿ†ÿSüÿ¶ýr1ÿ%ÿkÿŒÿœþ»ÿ‡œzÿOwÿ“>Óýâ¿ÿÿ Ÿÿ!Ù$)aùÿ@mëÿ¬ÿGŠÿ?ÅÁÓ!|§ÿ Ùÿrÿ*ëÿ.íÿûÇý§û;ÿ¡þÿ`ÿºüÿ5!þìü;ÁÿßþùÿÒÿûþðÿžx–ÿ.ÉB&V´þáþXþO+ÙÿKo$]«ÿ�Úÿa÷ÿ_{ëŽfýÿ¹‡Ïw?§ÿAñÿHa‰Ïý¥þ ým0fýÀþýþ›ýæýÕrÿeæCþÿüTw€íý¾þšÿjÿ Nÿƒÿ"¯ÿÿÅÿßþ¯þµÿw°ÿ7 òþ1ìÿºÿsÿŸÿuú“ÿöÿ¤ÿ|ÿjÿâÿÅÿ™ÿï¡ÿõÿ)Œ“°ÍOÇÆDÿ�þ¡ö6û4!k N ý¨þÚ�äŒÿâþDý£¡þ«þðÿ›Öpíþîÿþ³}ÿ[þñþ?‡ÿsÿ9_šÿ<ÿ†nÿRÿÖþHÿÊl ÿ2¢ÿ×ÿ-ÿTà.ª nˆ÷ÿø³þÝHú–ýXÙþ£tHÃqýz@þ"í%H‰‡ÿ"*ÙN6<ÿv ÿûþbþBÿÅ8êÿéÝ|ÿ EÿòÈþ¸ÿ²ÿuÿXîÿ­ÿ(dÿzÿ§ÿåÿJ°ÿÒÿ›ÿÝ• {þKýïú´þÿmµúþ˜ÿ&ÿ�ÏBDÒQÿò.OSAý>ýl—þõÙ‹ïÿ±ÿGmÿÛÿ]|ÿdÿ©ÿyrÿï}^¸þ�ÿèÿS�ÿ-ÿçÿÈÿ£Ì{Gªÿ©ÿ² Uü@þ÷úKû(AøÝýêÿ¿ýð©ÿvRü¸ûjýûnºü‚ÿ›62ÿÿÿÿõþPýµÿ ‡Yaö‚ÿÜÿ*1ÿ](ÿࣻÿF|ÿ…+ÿëþ¤ÿÞþ1§ÿ ÿD¹ÿïAÑÿ¡ÿ%ÿ} 4 ¦r#±÷µüü^ûCçöÛÿÉý–ýñþNþ_û8ûCþRÙý�ÿÜŸêÿÏþRüˆ'ÿE£/ù¼ñêÿ‡Ÿÿ±H€Èþd@ÿBÿjúÿšÿ¦4ÿêÿ×ÿõÿIÿJ#×, •ÿ  H|ýÿl€üDý³ú×üæþküý'ÿæü¨ûŸû…ü¡þúg ÿÏüFñúØúÇûGþøþ¼°ü»Ìý·–ÿãý½ÿ)ý€ÿùýsùýïÿ(Eƒÿ_ÿ8œÿ³Š?ÿç \ÿ±øþÿ‹ÿyÿgÂ|^Ã÷›©ÿ©ûÛýgñø üù_þ]þÌú¦yPûÆú ÷|÷Býâÿ‚ûëüƒ~ÿ!ýõý·üý‡þ½þûý ÎývÿºþMÜÿèXþòÿµÈ�—yÿ"N,y#ÿcÿÛþÝÿ�þĬ�øŽ!Šø›ú²½ôôýľhû»¨2`Eü"ûнû¢ýòÿåžÿ^ÿ{ýÒûo‘ûÏþ€¬þñ þäþSÿÈþƒÿþ×ýÚÇþ¨÷ÿ„‹ÿcÿÿ©ÿòÿ÷þÿnÿf¸þÿcÿ„O;™ú¼ôâ�ööêõ k úÆkþÞÍ[ýõSKüûºúUúžþíÿGLûÏáü�÷ýßSýÐþcþ6‘ÿåý>ýSùü±ÿsÿVÏþóÿíÿVþ¤©®Þþ”ÿ1ÿýÿ„ÿd ò õ Æý€ü• :þ»ûˆýÓ ¶úðOýð»ú·ÿûu{úVœú±ƒö^jý»ØÅÒüþea˺6ØþÇ:%þ\)ýœþ›ýDÿrÿÎ¥þ—Æþ'úþ�…ÿ€�þ¨ÿ ™ HüM mý/—ýg þ Åøà úÿý$v³ðûlù2û%…ûVÄ9 eþ¿Qü~5[þ6áÿÇ@4 þòŠÿ›Õ’ÂŽþe¦ûqÿ…SÿU$—ÛÿŸ0¾ÿx&ÿ \Rþêþ7§§‘þñ%ØþÕ÷ûôùÖùëøWøþ‚úöÄø}ý ÿþVüÿœüGKü¤Îùñœü&ÿšþZðþöýñýšþþ‰ûëÿpÎý_’òmàÞþ±…ÿDWÿS Ì%@Q¶HwþuR 9ù5 Ïff [ ~š ËøÔý—9GRáú&âû¿þNÙWýÿáþ–Éþÿ>þþÿÿlåÿq�ÿuþÌÿýr7ÿFB),Èþ¸§ÿnþöÿCÿAÿ½¸ÿùÿ ë-ù‰Üò°ðLEýF'¢°ÿð5œ . JI¡Ù ‡àþV¡‘ý„bÏ~ ÿË ÿÍ…_åÿ¶;ÿMÊða*ÍÿoÿÜ#ÿ6ÿÐÿA lÿöÿÍÿÍÿôÿ¬ÿækÿuô—æØûô; êGP ÷äÿüýúGÅöL?úGûBþý÷A5~… �üœý/ú,“u]Èhü¬þÙÿ� ·ì–ÿVQÿ©ýïÿ ÿÒýÞÿ™ÿÙÿZÿÈùþ-.”ÿJŒû0ùÞþ¥ûéþsÈû=þ#°ø…õõ±÷¿Ûü`ý%þÏYþšöé‰] ?ÿæYÆþž¶ÜÐÿ0þ‡ýÃýÇÿB/ÿÓþ¯þZÿÛ ÿÒ§ËÇÿ~T|ÿV†þÁôÿ!C‹�ÿÿáþ: * ûÚ÷ƒ÷WüëýþÄÿÄöÜþèûp?x!ÿùývÿ¸ �þ¯îý¦Mÿÿeý6¯ü·úOÿg÷Nh¼ÿÿÊbÿCü°ÿ´ü·‰þµSþ3<tÎþPÒÁþ�Êþa2Ž.ÿwk@ÿ ÿžsúiýý”þþv|ÿ* ýýFÿ~ÿüz]ÿ?£ø{þNû]ÿœýTÿ$1þÍåýØÿ²o¾ý¯€þÀñýz!ÿþHþ›bVÿçþ‹þ7Žþ¸ÿ°-þ¬üÈŒŸþ÷ø€ 3Ø� ÔŠWýó�›þoþŠÿ£ÿ"úÐû=/ÿÍ·¸ýnùø¿ãüœxl‘ý¯ž½úÊÞËþíþÓÿHþ!ÿYþeþøÿ½þ�Sÿÿöý0ÿ2ÿ—ÿ„�ÿèJþéÿ½þyÿìPÿø” ¡˜ûúü<÷¬ç"!ùVôÖÿ¶óPÿ`ÿš_ø»ùIEý9dû¦ÿ•°ÿçLû„üµÎý@ÿ�ÀÀîÿ þÊþ–ý'qÿéÿÿÙ\¶ÙÿÙÿTÿ×øþXI ;”û4‡ÕüÂùýe5ú¾ùòýþÝúÍÜ™úáýÿìýðþ"ÿ’û7ÿdý ûûþêÿýcÿýWßûÕ—þ]çýÃþ²øþ€Ùþ�ý�ÿŽÿÁ°ÿiÿ$ÿ.¯=7ÿ¾ýþ!aþCtûå [¬ü…üÿYxüŠCþìÿ«þ½–ñþ—ýðýZü›éý—ÿ-‚8Fþšÿxyþ×3µ~ˆ0ýÿÄãþf‡ýšÿ³þŸþ…ÿ�ÿ•þCøÿ¶ÿEÿÃmÿµmÿY~þ"¸Uôö-ÿÜÿ*ÿ¯-ÿTÀþÖüÎþ>þí¥þÁþ\ÿ2‹éý¡ûMüžþ—þ<ÿBþ“ÿ�ÿõ\þ¨!ÿäþ(ëþ@j°ÿ�þxßþ ßý ?þnÿKÿ¸Eƒÿîbÿxÿ3ÿÇÒÿ%wsûÛí]ý6û Qÿ þ‚)üŒþD ÿ�ÿåýÿ¤qüjŒÿIþMý‡ý­,Üÿóÿÿ8ÿÿ^X»ál‰öþaßþï¯TöþÌÿ+þ#çÿÑÿ+úÿSDÿ‡mÿôyÿáÿëÿ™8L!a÷ÿå÷¼ÿ­û>üûÿH¾þÙù ïýlÿ´ÿ:þ¼ ûÿXDÿ ‰üÉÿÓÿâÿ9þy³ Ãÿ“þ(þ"þ$o²ÿ1þâþ4ÿüÿ¦ýÿþ4þñÿwþP°´øÿíþ ßÔþ°\·;�¨ÿôÂMþœ­ûäúù8ÿâeûˆü× ýÉ•cýž•€þ÷¼òý-þ´ü¨ÿìÿ•ƒ ›ÿDÿþ(ÿÿÿÿ{Š"|¾ÿ�CNÕþ¸þíÿÓO°ÿ¶­ÚKáþÛÿXÿ£ÿGÿkâõúˆýõþ’»þtmaþ7ÿ5ÿ þ™ÿ Ðþ³BÛøüŒ(ÄÿæÒýÂúã;̶Ìÿ‘ŒÙþfþFÿâ-ÿgý_ÿGÿžÿßþøþóÿéÿP’ÿ×ÿ7zÿrÿÞÿ–êÿ×ÿåÿ%EþÈÿàþ[ÉúþiæûmýÏþìþäýÑÿï0þ;cÿpÿ(þþ½ÿR�Ç¿U*ÚÿØÿVÿúÿ{%ÿ^±žïÿ¨þŽþU*Z’gYþ™ÿÃÝÿk.„&¢t:fëÿƒÿãþ=ÿ:ü_þæ¥ÌÂüúþŒÿ±þ‹ÿEýâþàÿçýéÿÑØýÉþ�Ûÿíýƨþnøõÿ~müÉþ�…ÿý9€f[,nUÿjÝ0Î †jÞœIÿA7³ÿ�ÿ˜ÿßÿ²ÿÿÿu“ú víšcý[ÿ ü~ýÈþþ3ÿÿ«ªü§û§=üǹÿmþÕþyÿ G„›ÿéÿ2ÿ0àþòjÿ}Ãÿöÿtÿjÿœjýÿ�ÿ[@ÿÂ]6¹ÿ©$Ùÿÿ‚ÿqÿñÿ�ÿÞÿ|–±pÿŒÿ6ý{u] ‚ÿïùY ÿàÿwþýÿ»Ãþë=ÅÿüÔÙýÀÿ±þ6ÿÇJävÿžÿÿ^ÃIôþöÿÏŽxKëYµ.q�ÿZsÿãÿ ÂÿwÿéÿïÿÇ=ÿuþ¦ù;n>ÌUÿÏým°þs#%"þýcËþäQðÿeÿ-ÓûþËÿÿøŒ!vÛqÿ­ÿWæÿ~þ/‰�Œ1#:ÄÿP…B�ÿÆÿqÿMÿ]ÿ!˜ÿ¸ÿÒÿõÿ�ÿ.ÿgZÆØü?çÿaÿp)þäþ†þ,¨èUúhÿmÿ•1ÿÕ̼ÿÏÿ=ÿ‹ý>ÿïÿ„ÿ \ÿÏ0þ ÿ>r ÿBÿ®Íÿ9ÿ >ÿiXÿÍþÇÿ{ÿcÿ†ÿÏÿiøñÿ±ÿ“ÿ=—†ÿ À›ÿ�ÿ=þEÿæþÙ ÂÛÿúÿKÒùdáÿ5ÿÜÿt6Šþ(ÿ³þ“ÿõÿLÿÿ;H¢ÿÿÛpþEþ{¿ÿ6ÿ#ÿÿy8ÿ>‘Òÿ‘ÿ¼ÿIÿUÿëþ ÃÿÙÿÎÿƒ�ˆmq›ÿ»}ÚüMÿaþ þµÿáÿÿp² ›ù¢–Èÿvÿ6ÿöF[x¬„ÿ‘ÿ;šÿ�ÿ#ßÿwN¾ÿÉÿ¢ÿíÿ&�ÿšÿ�ÿÿfÿ­ÿLÿ¼ÿýÿ«ÿ”ÿ™ÿ=4åÿ.Ýÿ¶ÿ”ü4Àÿÿ6ýÔþ÷ÿ¯ýlÿÊÿpkùÿä�ÿoÿ–ÿ¦ÿÔÿxÿ¾ÿ—ÁùÿâÿEþ²íþ0*öáþ‡f̧þøÿ„ÿ{ëÿ÷þ�ÿþþÿÖÿŠÿžÿ·ÿLÿ"lÿQÿóÿ 7دÿ ÿˆÿvûúþ'ÿ%þ&þ@ÿ5ÿVþ Õÿý}ÿ«ÿrþrÿyþTþŽ—þm{ÿhÃÿ7ýþœ ÿÐÿ‡ÿlµÿùÿAþjÿAÃ$³ÿ�ÿ«ÿ/»þ·ÿ¿ÿ./_rÿ�ÿùÿZßÿØþÜÿO@ÿeûõþ‘«ÏÑÿMÿ!þ9-ÿ>“þÎüÞþãþÿuaþ¦ÿ’¬ÿbÿ>ÿ$&¨Yw'ÿ�Äÿ÷ÿ{¼o 0ÿrÿ•ÿ)Gÿ 5ÿ³ÿ‹¾ƒR¿ÿßÿ_éÿ2ÿqÿÔÿA¿ÿMÿ²ü±ÿò*é,ÿøþÞþ!–þËéÿ:ÿÉýx˜ÿÿãÿ@1õAÿ¨­ßÿÈÿr–‚ÿ]àÿ¥}ÿÌÿ¶qÕÿ´éÿÅþgÿ=¢ÿMÿ” ¨ž{JŒ+¿ÿ�ÿíÿðÿÒÿ˜ÿïÿ¬ý¹Vÿ¿ÿVÃÿN«þ YáÿÖ4±ÿ<OÞÉŒÿ¡ÿPÿòˆÿŽþÇÿÆþÏÿèÿWeÿ)ÿÓÿÈ-_£ÿ‘ÿ ^Ûÿ# Hu—ZØŽÿÑ]  ÿÎÿîÿÌÿ˜ÿ»ÿÿîüâgþ²ÿ�wÿî ÿa²á ÄüÿÛÿ·×ÿ‘«ÿ±ÿ&[kþ¹ÿeÔÿÝþ¦ÿ-<�ÿsE”þaÁÿ”µÿÐÿéÿ*½ÿ�tÿ¨ÿ«H 'tÿèÿãÿëÿÝÿF-ÿŲþú[Ð6ýý0æþŒ(ÝÿqþaŠ‚œÿû@,ÀÿÿtÚ”ÿ­ÿÿ9våÿ>ÿ0Sÿ'ìÿÚÎÿ]"£aIƒÿ <§ÿ2+ˆÿæÿáÿD ÿeþC´ s³ýwi )þ§þy´ÿ#jÿÔÿ©!ÜÿµÿCÿÃÿëÿ}UNÿ2Jÿ)§ÿ1˦—ÆóÿÕ&ÙM¿ÿ_�ìÿ�ÃÿÍÿùÿ|êÿ²ÿeÔþ‰MÔÿ&ÿ_ÿNÿ’ÿçÿ ÿ¡Qÿ®öÿ‹þ‘ÿÁÿ ÿ &ÐÿÉÿWÙÿýÿZÿ.ÂþÚÿ®hÿ¿ÿRaìÿ‚ÿÿÖÿÀÿ¡$ôÜÿpÀÿ´ÃÿÅÿâÿ#•˜‘'#?cm”0 ëCÿµýÒ �ýMÿùÿ_ÿíÿ—þ¡ëÿ‹þÌCÿþÿÚÿSÿÿ<ÿp}Óÿéÿäþ ÿ±þ9.4?ÿB~Èÿÿ2ÿHÿáÿÌUÅvÿô—ÿÏÿçÿÅÿŽÛÿ lQnûÿ:N[ÿ—ýc©þËÿÞþ…þÙþÝÿ”�ÿïþikÿ©ýøÿ½<ÿþTÿ]ÿüþ)ÿ,´ÿ4ÿËÿ^ÿ ÿpÿ%“ÿ�ÿDÿ ÿÇÿ’ÿãÿÔÿ¥ÿ Üÿ+Íÿ–ÿ†ÿùÿ/ÿ¾ÿ�ÿÖÿ¨ÿòÿcP�úþ‡ÿìÿòÿuÿÑîÿ¿þ½ÿ÷€4þÿ<(ÿÊþô ³ÿEÿAÿFÿÎþTÿ䨮fÿÚÿJÿÜþ�ÿ¼ÿÌþðÿ.ÿ¦ÿùÿO¥ÿáÿùÿ&ÿ¬ÿÄ—ÿßÿ„ÿeÿ{ÿëÿáÿÓÿ0 Ùÿ¹Âÿþ‡Mÿ7 ÏHGÿ×\³ÿ�ÎÇÿzÿJ©ÿ$ZòÿžÿlŸ*ÿ'ÿ´ešÛûÿÐÿïÿ>ÿ*ïþÿþE:qÈÿ]Tÿ¡ÿKÿÄÿXÿSÿN£ÿ‘ÿ‘ÿêÿYÿ»ÿ~ÿëÿÏÿÝÿfõÿ|ÿ»ÿ~&ÿ7Aåÿ—|­ÅÿœGbÿNØyÿ|Úµÿÿƒûÿ2+­ÿÑ Ú*¯ÿO”§ZÿfÿÙ<¨#úÿ¾ÿ‚ÿˆÿêÿªÿóÿ åÿãÿ©ÿëÿ= ×ÿìÿmÿ‘ÿ, ÿâþÑþˆÿ¢ÿÂ.Ìÿ’ÿ ëÿ,uÿ�þ,ÿWæÿÀÂÿ-–™²ðÿ6£ÿ g½¥ÿ›ÿܾT¾ÿÏÿjtÿ' nÿLYíÿ®ÿ $CôÿóÿÏÿaøÿMÿuÿjÿ+»ÿ›Ÿÿ¨ÿ·ÿš…ÿhÿÓÿ§èÞÿ­þÿPÿæÿ5ÿ¶Ëÿ ôÿÁÿòÿ"j¯ÊÿNBÚÿÛÿðÿ¸ÿòÿ ÉVÿHy àÿ*çÿ ]Ïÿ=“ÿg=ÿ,ÿÿM,ðÿŸ%äÿ�ÿM_ÿpò­hþ_ãÿ ÿWÿ¾ÿ ÿéÏþ‹ÿCáÿ÷ÿÿ2üÿóÿÀÄÿÇÿ”ÿLòÿ*¯ÿíÿÉÿ>ƒÿ)&¯ÿ!éÿ4b6gÿ¾ÿHþ…æþYÿÖs0²¾êþ~1€Bêþ.äÿEÿÿ2ÿùÿcÿˆ\ÐÿÈÿ!ÿ¡ÿÇÿQÏ•ÿeÿ@ñÿ R¦ÿšÿ>ÿþÿ;ÿÙÿÏÿûÿ\éÿÄÿøÿ&˜ÿáÿW>ñÿá¿ÿê¹C³ÿ­ßçÿÌéÿå°ÿËÿÿÍÿ ¡†ûÿ¸ÿ¥ÿL“Ëÿª#,Ìþ€ÿ�Ø9ÿfÿ¶V>®ÿäÿÒÿdÿ¾ÿ¸ÿ+Œÿ4<~Yäÿïÿæÿûÿêÿ™ÿíÿ(-{ËÿlRnÿµÿÔåÿæÿüþÐÄLÿ]ÿÆÍÿ3„GÛÿ"dŠt”bž^ÿ!ÿ�l¸ÿøÿ‚GùÿÝÿXÑÿ3€ÿ& ïÿA �+zØÿ Òÿ‰ÿÐÿ_.ÇÿFþSWêýe�ëÿDÿ ÿÛÿäž?þ ÿ§pðþ±¡díZÿ§ÿtåÿ~�ÿBáÿm´Yÿ—ÿÁÿ� \õÿt©Ëÿkøÿ’#DÿÿýÿdîÿZµÿõÿðÿàÿÅÿæÿo�ý+ÞþÖÿ¼ÿe >ÿ}ÿþþœÿ\ÿ‚èÿuÿžþÂÿ€v‰äÿÔÿ ·ÿ ÿ_¶ëÿì6’ÿ9còÿf—ÿ{ÌÿmïÿÔwóÿPäÿ 8öÿéÿçÿÑÿÿÿ0Ežþ¬ÿºþФþÿžÿ¶ÿ†ÿhÿô@ÿ�XÿŒÿåÿiÿìÿ´ïÿ·OÿŠÿðþƒÿ^pÏ æÿ” [ÈÿvÿÎÿåÿ)‘°êÿ3e4Tïÿ­ÿ2"/çÿ(6Êþ,ÿzÉýÐý{ýþxÿ'^ÿ¸)SU'úP>ÿÒÿýëÿUÿ'^ÿüÿºþ³ÿÿÿ.…ÿÐÿS.Ø�ÿÿLºÿUµÿÁÿYÿõÿGx/r·ÿíÿÉÿ•ÿ�ÿ÷ÿôÿßÿ0/3fÑÿ€ÿwþÿüÿ½Üÿo/K—U¾ÿ¼ÿ Xÿmÿ§c£ÿJÅÿWÖÿÃÿhÿêÿ¤ñÿÍÿBÍêÿÈÿ˜ÿ%÷ÿ*wÿÍÿ¾ÿ>Œÿ¡ÿFÕÿ¼ÿÆÿ£ÿèÿËÿ©ÿÇÿL4ÓÿÖàÿ*Dÿ¤¢·ÿÕÿ&NKKØþ|}ÿØÿw4ÿK¼œÿnáÿ�ÿ¿ÿ×êÿ�†ÿÌîÿ}ÿR«ÿFÿÃÿ:~ÿ0ËÿÙÿ‰ÿ ƒÿ�ÿ-*ÿùÿûÿ0³ÿÓÿÍÿtTÿêÿÿ¬ÿÔÿÓ÷S±ÐÒÿH  ÿ1ÿžÑÿÕþRÿçÿâÿêÿéÿ18ìþõÿN�Fÿ»ÿwÿªÿZÂÿ¶ÿIÿŽÕÿIÿâÿQÿ�ÿñÿ‡ÿéÿÜÿ4àÿ6ªÿÈÿ«ÿ³­ÿ.†ÿ¨ÿ)ÿv,Ì“ÑÿþÀÿ*bÿÍÿ##ÿÕÿ¼þãÿÞÿ Yiù dÿ ÿ`ÿ(šÿ’,˜ÿY{ÿÆÿ^ÿ*RÁÿrÿßÿ�ÿâÿ ÍÿòÿÀÿÕÿ´ÿ !%:ŒÿöÿnÿîŸÕÔÿÄ;’þqÿÂÿ�ÿ$¹þ<ÿÎùþæÿ håþ¥ÿ@lD69xÿb&ÿXÿ¾ÿL´ÿŽÿ 8ÿ^ÿ„`ÿýÿQÿV÷ÿðÿøÿÖÿ;ÝÿÄÿÈÿÏÿÂÿçÿêÿ%Üÿ ºÿà%Â…»yÿ§þ9!CÿïÿíÿKÿ‡ÿÿkcÿº ˆ ]ÿqÿòÿ<ÿ,ÞÿP5tÿ�ÿ_ÿùÿ©ÿ+ŒÿÙÿÅÿ×øÿ€ÿZ3óÿðÿ¡ÿœÝÿr¢ÿôÿ§ÿìÿØÿIÒÿüÿ+îÿPàSÙÿ»ÿ<ÿl1sÿDÿíëþ;ÿ?}…ÿ]zëÿöÿÿÿ€ÿðÿ¼àÿ5ÇOS77®ÿëÿs.ïÿ3…}L EŠÿ6«ðÿ.˜àÿ!®ÿèÿ%çÿ ¸©ëþ’ÿ�ÿ”ÿñÿ�þtÿçÿdÿe´ÿÿ`×ÿ�¾ÿ(òÿåþ¯ÿ"§ÿ+jRÒÿ¡ÿ8D ñÿÓÿ´Ùÿ!%�äÿ&Zñÿ6@EMH5&Êÿ3 0'ÊÓþ¬ÿ†ÿ"ÞÿÓÿêþÁeÿÙÿ#lÿ‰­Ú~¤ÿâÿwÿžþÚÿ»xÿ<�ÿsÿ(CrÿSÿ6íÿ"UÃÿ4ˆE Ùÿ-Æÿ @> ½ÿ ÎÿáÿYÿPÿ=Ìÿ�ÿ?X( øÿVd·ÿÝh‹×=ÖÿÇÿþþ%ìÿÄÿ˜ËÙ`ÓÿŽÿ±ÿ9ÝÿF�‘6  Zqÿ ëÿäÿ*³ÿ§ÿàÿ‘ÿÙÿÌÿ=ÿîþÏkÿÿ§ÿÐ×ÿ5kÿÿ¡Ùÿ?1l—ÿ”ÿtÿ ‰¡›ÿ±2†<3¶áÿO÷ÿ<#Áÿ°ÿ�.øÿïÿóÿ©ÿæÿôÿ 2# ÿøÿ3 €�ÿ–ÿÿÿÙÿrÿ¸ÿgÿ´ÿsÿ±þýÿ,¤ÿÿ:ÿïÿÀÿ®ÿF4¡ÿÔÿÿøÿ÷ÿõÿŒ#©§ÿ¬ÿœÿêÿœÿþÿÝÿz|`½ÿóÿÆÿòÿb>Düÿ#çÿ$N*õ‘ÿùÿgÿÇÿlçÿWÿÜþáþmÿ±þ¯þL=3Ñÿ—ÿlÿ@ÿ’ÿ¤ÿv.‚ÿ•ÿ/WÿRµÐÿËÿ°ÿ%¾ÿœÿ ÈÿÉÿâÿN•(sÿÆÿ7BI#%3ÿÿ‰.'h #Cöÿõþÿÿ]ÖÿžÿÿÝþ€T =JZÿ¬ÿõþÁþsÿb¼ÿäÿ¥ÿ©ÿPÿ&²ÿÒÿõÿ„ÿÝÿ]#¦ÿîÿ³ÿL³ÿÔÿÒÿ'çÿ'7ÿÿ!ùÿƯ�²jšIOÕÿ[¯ÿÊX‘ÿ°ÿÆVŸÌÿäÿNÿaAÿ@ÿ4Ùÿrÿ5Lÿ¤ÿÂÿÂÿÊÿ&:�ÿ&"ºÿÕÿ‚ÿëÿ ÷ÿúÿ»ÿ¶ÿ÷ÿÑÿÜÿÀÿ÷ÿüÿÛÿúÿëŽA‹áÿ¤c`ÿO‚­a´ÿU?o¿Èÿìÿ9cªÿÕÿšÜÿYy~ÿÅÿ¶ÿQÿ¤ÿÃÿ�.+-�ÿÆÿûÿŒÿÃÿ¸ÿ¬ÿÖÿýÿÅÿàÿšÿàÿÔÿÒÿÅÿÉÿíÿðÿæÿæÿ ÐÿŸÿôÿÿFÚÿÁÿ�ÿDëÿ8x¹ûÿ¡ÿ"@Òÿךÿžÿ&åÿ7 ÿž+(ÑÿW 0ÿ»ÿIVíÿýÿG¨ÿ ÄÿMT¿ÿnÿ¦ÿÙÿP*<æÿÛÿÄÿ¸ÿäÿýÿ ¯ÿöÿtÿ�ÿÐÿ9ÿ”ÿÖÿõÿÆÿ·ÿ“ÿ“ÿ?iÿÀÿ�sWÿEÿÙÿ‡ÿ?Œÿ�ÿLÿ—ÿ[gPgf¨ÿñÿ‘¸ÿ Ýÿmâÿ} DÿÃÿU,:NØÿ½ÿúÿùÿQêÿâÿ6ÿsÿùÿçÿ%e¹ÿb�ÿâÿ pÿ9¬ÿpÿ“aþÿÈÿ½ÿk)9ÿ:ßÿu÷ÿUÿ1ßÿh%¾ÿ"[1¶ÿ GÆÿ'»ÿdÿãÿ=Õÿáÿ9åÿ#õÿ'Ïÿœÿƒÿ¢éÿ]·ÿJªÿ>Òÿ5ãÿIÔÿòf¶7õÿøÿ“úþ4CÈêÿùÿi¢ÿ¢ÿÑÿüÿíÿÿ[4äÿëÿöÿðÿâÿ2çÿÌÿÔÿÏÿ-ûÿÆÿÏÿ 0Ùÿïÿ1'�®ÿUñÿÎIa„ÿD&úÌÿG�ÿRjD7žÿ&¼ÿ aùÿª!æÿÀÿÛÿõÿ~ÿÞÿPöÿþÿÕÿ$ëÿ FÛÿìÿ @ ÷ÿ/÷ÿ¦ÿáÿ"21xT1:ŒF7dÆÿ¦øÿ>™Öÿïÿ^üÿ-¿ÿ_y@H|åÿ|$K$ªÿZ_.Mðÿ+G3ûÿáÿ (?B=2- èÿ&úÿëÿÛÿåÿJ…žÔÿèÿ?øÿ-èÿÂÿ`üÿÓÿ…ÿ Øÿ¦ÊÿGîÿäÿïÿéÿ"øÿkìÿ£ÿA| Åÿ6éÿþÿ0¥6öÿÔÿäÿäÿêÿ+öÿøÿ͹N¥ÿëÿbùÿ¬ÿ™ÿI; N¯ÿFÿÐÿ9‘úÿóÿƒ†ÿ"Šÿ³ÿ5æÿÇÿÕÿ6-Óÿ)Ìÿùÿ%ÚÿÉÿJ!ÖÿúÿŸ0ëÿßÿ æÿøÿ%*üÿ*ýÿ ¿B ¬ÿâÿ>$¶ÿ©ÿ%¥ÿ`áÿÁÿAMíÿÄÿ£7÷ÿ¡ÿåÿöÿ4Ðÿ!1ñÿE2ýÿÏÿ ýÿèÿèÿñÿ3 üÿõÿëÿ÷ÿÿÿ+,ïÿõÿÆÿ2Þÿ^ÿ�ÿÓÿoÿE2Ëÿòÿ×ÿ´ÿ� U¿ÿëÿ8ñÿöÿ0íÿüÿ‡Õÿšÿòÿ‰ÿKÇÿ<ÆÿÀÿd:Èÿ×ÿ&(ëÿýÿüÿÛÿ ·ÿîÿ¿ÿ"äÿÒÿûÿóÿÍÿøÿ,ëÿßÿ äÿ ÷ÿÇþ?rƒÿËÿÑÿ~º£ÿîÿuñÿ¶ÿÿÿ„ ÿ›ÿÿÿÒÿcÂÿÎÿÝÿüÿbÿôÿ;�ÿ5ÕÿDzÿËÿ­ÿöÿ0éÿïÿÛÿ Çÿ ­ÿ¼ÿøÿÖÿ ìÿúÿâÿÖÿßÿüÿóÿ.æþoL4•ÿ¸ÿ�,£ÿÂÿ¼ÿ\ÿ‹¢˜ÿ–ÿÖÿÍÿ^ÁÿQ ãÿüÿõÿäÿ=7þÿùÿÄÿáÿñÿèÿ(Ãÿïÿçÿ7³ÿ¹ÿ¾ÿÉÿ#ôÿËÿèÿéÿÑÿüÿøÿïÿòÿßÿéÿ rÿ®ÿ¼(àÿ©ÿ@Nªÿ Çÿ&ÿÿÕÿüÿ$øÿüÿùÿúÿåÿKœÿðÿ†úÿ Q­ÿ éÿèÿÑÿ4ÚÿCºÿüÿùÿÙÿÆÿ¿ÿýÿ ýÿ þÿ×ÿüÿÿÿéÿâÿÞÿ¯ÿO/ÿÈÿ†šjÒÿ‘âÿ 6àÿÖÿ3béÿ%Ùÿ 3Ëÿ1ïÿíÿ1ÖÿÛÿ ÿÿñÿ'ïÿ×ÿßÿýÿ çÿ.óÿùÿôÿøÿÙÿL öÿO[q ÿëÿIýÿXùÿïÿ3Zðÿ÷ÿõÿ'$Dóÿ7$Ïÿ×ÿÿÿìÿ.àÿ÷ÿ ïÿçÿºÿúÿ,Ûÿÿÿþÿýÿèÿÿÿ|ªÿ0Çÿóÿ ÔÿÎÿ×ÿÃÿC“Öÿ!÷ÿW8ÿÿ§ÿd¾ÿIàÿ·ÿ ÌÿÌÿ0Èÿ%Åÿ5áÿÖÿ 0ôÿ-1Öÿëÿ èÿ æÿåÿ ÉÿÂÿïÿØÿ°ÿáÿþÿòÿèÿ¹ÿ÷ÿ5)ÕÿëÿTÂÿ¢ÿÊÿ'÷ÿ þÿþÿ³ÿËÿÂÿéÿ½ÿ- òÿêÿ !ìÿ%(ýÿùÿôÿùÿíÿÜÿöÿûÿ÷ÿ4òÿªÿ?* ãÿÙÿëÿ7ÁÿÃÿmwÿÑÿüÿÂÿºÿÇÿðÿ("2öÿçÿ.úÿýÿãÿàÿQ *éÿòÿ Ïÿïÿöÿÿÿëÿ ûÿúÿúÿöÿèÿýÿõÿ�TïÿØÿ^âÿ£ÿÎÿÓÿËÿøÿ žÿIÁÿòÿÎÿ(8ÜÿÿÿãÿÿÿùÿèÿéÿùÿOþÿ ïÿ"ûÿ úÿþÿãÿõÿúÿôÿÝÿ)#üÿüÿòÿ?ïÿõÿøÿþÿ�[áÿ3çÿ¿ÿÏÿ-2*ÐÿvÃÿðÿúÿÞÿ3PÏÿÀÿÅÿáÿØÿÒÿ"ìÿ' éÿÐÿûÿðÿóÿùÿÉÿ% Úÿýÿûÿ ýÿ)`ºÿ áÿ ,ûÿþÿðÿ(*ðÿéÿÿÿ+Õÿ49×ÿèÿ ïÿûÿiïÿøÿ(Ãÿ Éÿþÿ4÷ÿ"îÿ Íÿúÿ÷ÿúÿíÿêÿôÿùÿÿÿíÿôÿõÿõÿíÿïÿïÿÂÿ“ÿòÿÌÿõÿûÿäÿÉÿYøÿD øÿÇÿáÿB @ýÿ6(ÍÿÙÿøÿðÿ*ðÿëÿýÿäÿÜÿñÿ÷ÿéÿëÿ$çÿàÿôÿ ôÿîÿþÿëÿÓÿ§ÿÕÿØÿÜÿ 'ëÿèÿÑÿ5³ÿ ÍÿñÿÀÿÎÿ íÿ# »ÿðÿåÿûÿñÿîÿ%øÿîÿüÿ4Óÿ ìÿûÿæÿ÷ÿóÿùÿòÿðÿãÿ¬ÿüÿÛÿàÿøÿÝÿ+²ÿ îÿÖÿ¼ÿïÿ×ÿ×ÿÌÿïÿíÿëÿñÿÄÿ,æÿÚÿÿÿñÿòÿ ßÿ,Òÿ òÿïÿñÿ  ùÿóÿôÿçÿ ûÿÞÿ àÿ Íÿæÿ+õÿÝÿòÿ2éÿÂÿ ØÿßÿüÿÒÿØÿðÿÿÿûÿûÿêÿ"áÿ÷ÿøÿìÿîÿúÿ(þÿñÿõÿÓÿÜÿ öÿóÿûÿ ùÿùÿûÿÿÿþÿøÿüÿöÿýÿùÿéÿ+.ëÿüÿÛÿüÿþÿ$åÿìÿúÿõÿ)(Úÿûÿúÿðÿôÿ ÿÿïÿèÿÖÿûÿýÿèÿÿÿÛÿøÿÿÿ íÿéÿòÿôÿçÿìÿ þÿ ûÿôÿéÿ5üÿîÿúÿêÿõÿúÿüÿ!ùÿ0 ÿÿòÿÛÿïÿìÿ"ùÿðÿÞÿ Çÿîÿóÿáÿìÿøÿþÿ éÿóÿðÿíÿòÿüÿóÿòÿ öÿÿÿýÿ üÿ:#4èÿúÿ "ðÿíÿüÿ÷ÿùÿ÷ÿýÿãÿ÷ÿ$úÿöÿôÿüÿßÿþÿ ûÿïÿûÿøÿúÿâÿôÿ÷ÿ üÿõÿùÿêÿýÿ,3NæÿßÿÍÿûÿèÿëÿ òÿéÿÜÿåÿòÿ%ðÿìÿ þÿüÿÿÿ äÿ ôÿóÿ  óÿÿÿûÿùÿþÿ øÿöÿ2üÿ ùÿëÿÝÿÕÿúÿíÿßÿ!þÿóÿãÿðÿðÿñÿåÿôÿìÿòÿ üÿþÿõÿôÿöÿúÿùÿ üÿéÿùÿöÿþÿóÿöÿöÿçÿÝÿâÿúÿâÿòÿ1èÿèÿóÿÿÿëÿêÿÞÿùÿûÿåÿîÿøÿîÿøÿöÿ þÿêÿîÿ÷ÿ üÿ ýÿõÿüÿþÿýÿÿÿõÿûÿýÿúÿüÿãÿðÿîÿøÿóÿ ùÿ ãÿðÿÚÿíÿìÿ÷ÿýÿóÿ ûÿÿÿûÿçÿâÿëÿýÿñÿêÿøÿþÿüÿ óÿþÿùÿúÿÿÿ ûÿüÿÿÿòÿçÿëÿ%òÿûÿøÿôÿ  ÿÿñÿ  íÿðÿìÿüÿýÿ ðÿÿÿèÿùÿÿÿõÿ÷ÿüÿõÿ ÷ÿùÿ þÿýÿþÿùÿøÿúÿ üÿõÿòÿúÿèÿüÿ  üÿûÿöÿ þÿøÿõÿ õÿèÿþÿ ýÿþÿþÿôÿùÿýÿøÿÿÿüÿýÿúÿüÿöÿ ñÿñÿùÿ ÿÿúÿêÿöÿ óÿùÿõÿ÷ÿýÿÿÿÿÿ ýÿüÿúÿðÿíÿüÿøÿûÿûÿûÿþÿýÿïÿýÿüÿ þÿûÿøÿüÿ  üÿúÿüÿ óÿòÿçÿñÿûÿöÿþÿöÿùÿýÿöÿþÿ÷ÿüÿþÿüÿ ûÿùÿîÿýÿýÿ ÿÿùÿþÿüÿüÿûÿÿÿþÿúÿôÿÿÿûÿýÿ þÿøÿøÿ÷ÿñÿþÿûÿùÿøÿôÿ úÿùÿ÷ÿÿÿýÿþÿÿÿýÿûÿúÿøÿÿÿþÿÿÿÿÿûÿüÿþÿÿÿÿÿýÿùÿÿÿüÿöÿôÿþÿòÿýÿ÷ÿÿÿúÿ õÿþÿüÿüÿüÿþÿÿÿ÷ÿùÿüÿýÿúÿöÿüÿöÿöÿüÿøÿûÿöÿþÿ÷ÿþÿýÿüÿýÿýÿüÿüÿþÿûÿýÿùÿ ûÿôÿ ýÿûÿüÿòÿùÿ ýÿóÿýÿûÿôÿÿÿþÿúÿøÿ÷ÿúÿüÿøÿûÿÿÿýÿøÿÿÿÿÿÿÿùÿûÿûÿþÿüÿþÿÿÿúÿùÿþÿþÿùÿûÿüÿüÿûÿýÿÿÿþÿüÿþÿûÿýÿÿÿýÿÿÿýÿúÿÿÿÿÿÿÿÿÿùÿþÿúÿùÿûÿÿÿýÿþÿüÿýÿÿÿýÿýÿûÿúÿýÿÿÿüÿùÿùÿÿÿùÿùÿùÿþÿþÿýÿÿÿýÿþÿþÿýÿýÿþÿÿÿýÿþÿþÿüÿÿÿýÿÿÿÿÿþÿþÿýÿÿÿúÿþÿûÿûÿúÿýÿüÿýÿüÿýÿýÿþÿÿÿþÿþÿûÿþÿÿÿüÿÿÿýÿþÿÿÿýÿýÿÿÿÿÿþÿþÿÿÿþÿùÿúÿûÿúÿüÿøÿÿÿþÿýÿÿÿþÿüÿýÿÿÿÿÿüÿþÿþÿþÿýÿÿÿþÿÿÿþÿýÿýÿþÿÿÿþÿþÿÿÿÿÿýÿþÿÿÿÿÿùÿûÿûÿþÿüÿþÿÿÿüÿþÿþÿþÿþÿþÿþÿÿÿþÿþÿýÿþÿþÿþÿÿÿÿÿÿÿþÿþÿþÿþÿÿÿÿÿÿÿÿÿþÿÿÿÿÿþÿÿÿÿÿþÿÿÿýÿþÿÿÿÿÿÿÿüÿþÿþÿüÿþÿþÿþÿþÿÿÿýÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿÿþÿþÿÿÿþÿÿÿýÿÿÿÿÿþÿþÿþÿÿÿÿÿÿÿÿÿÿÿþÿÿÿþÿÿÿÿÿÿÿþÿþÿþÿÿÿÿÿÿÿþÿþÿÿÿÿÿþÿÿÿÿÿþÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿþÿÿÿþÿÿÿÿÿÿÿÿÿþÿÿÿþÿþÿþÿÿÿþÿÿÿþÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿþÿÿÿÿÿÿÿþÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿþÿÿÿþÿþÿÿÿÿÿÿÿþÿþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿþÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿþÿþÿÿÿÿÿþÿþÿþÿÿÿþÿÿÿÿÿþÿÿÿþÿþÿÿÿÿÿþÿÿÿÿÿþÿÿÿÿÿþÿÿÿÿÿþÿÿÿþÿþÿÿÿþÿÿÿþÿÿÿÿÿþÿþÿþÿÿÿÿÿÿÿþÿÿÿþÿÿÿÿÿþÿÿÿÿÿþÿþÿÿÿþÿþÿþÿÿÿÿÿþÿÿÿþÿþÿÿÿþÿÿÿþÿþÿþÿÿÿþÿÿÿþÿÿÿÿÿþÿþÿÿÿþÿþÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/BinauralDecoder/Source/IRs/irsOrd4.wavIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/BinauralDecoder/Source/IRs/irsOrd4.w0000664002537200253720000002710415257173642031331 0ustar zmoelnigzmoelnigRIFF<.WAVEfmt D¬H¥!2data.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿþÿÿÿþÿÿÿÿÿÿÿþÿþÿþÿþÿþÿÿÿþÿÿÿþÿþÿþÿþÿÿÿþÿÿÿÿÿÿÿþÿþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿýÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿþÿþÿþÿþÿÿÿýÿýÿþÿþÿþÿþÿÿÿþÿÿÿþÿþÿÿÿþÿÿÿÿÿÿÿÿÿþÿþÿÿÿüÿÿÿÿÿþÿÿÿÿÿÿÿÿÿýÿýÿÿÿÿÿÿÿÿÿþÿþÿþÿÿÿÿÿÿÿþÿýÿÿÿýÿüÿÿÿýÿÿÿþÿÿÿÿÿþÿýÿþÿÿÿýÿýÿýÿþÿþÿÿÿÿÿÿÿþÿúÿúÿüÿüÿþÿÿÿþÿþÿþÿÿÿýÿþÿùÿùÿüÿþÿþÿÿÿýÿþÿÿÿÿÿþÿÿÿÿÿ÷ÿöÿûÿÿÿùÿûÿûÿüÿûÿþÿûÿøÿüÿüÿøÿÿÿôÿùÿöÿþÿûÿúÿþÿÿÿÿÿõÿùÿúÿøÿûÿñÿÿÿþÿýÿÿÿÿÿÿÿüÿ òÿúÿðÿøÿÿÿóÿüÿÿÿùÿúÿÿÿýÿûÿÿÿÿÿÿÿúÿ  üÿÿÿõÿûÿîÿÿÿþÿþÿûÿýÿúÿöÿÿÿöÿýÿûÿýÿùÿüÿòÿýÿñÿ þÿþÿüÿúÿûÿóÿüÿþÿÿÿïÿ óÿýÿöÿþÿýÿþÿûÿþÿöÿýÿýÿäÿúÿäÿ ûÿùÿþÿýÿþÿüÿøÿýÿ÷ÿùÿüÿûÿïÿäÿûÿ ñÿ ÿÿ òÿûÿðÿþÿüÿïÿþÿüÿþÿýÿçÿáÿïÿüÿ óÿ íÿçÿýÿÿÿ÷ÿýÿÿÿüÿþÿñÿïÿëÿüÿöÿ òÿëÿ  öÿþÿóÿðÿ÷ÿóÿ üÿúÿöÿ÷ÿ  âÿïÿýÿðÿéÿ#ôÿùÿ÷ÿôÿóÿóÿûÿíÿ øÿ  íÿöÿâÿßÿ2ùÿ þÿçÿ÷ÿ÷ÿïÿýÿòÿðÿýÿ ûÿÿÿ2ïÿíÿC õÿçÿøÿíÿéÿïÿôÿ÷ÿ4ðÿùÿñÿöÿþÿæÿùÿõÿôÿüÿñÿüÿ )3"îÿöÿùÿæÿãÿ3üÿ"÷ÿóÿùÿñÿôÿòÿ 'èÿåÿñÿõÿ ÛÿÑÿñÿãÿþÿøÿÿÿôÿìÿúÿÿÿìÿüÿÇÿáÿÿÿíÿéÿñÿéÿ íÿüÿèÿîÿ÷ÿëÿÿÿÿÿ ØÿÕÿÕÿÁÿ×ÿòÿèÿ ýÿöÿñÿüÿ#ëÿþÿãÿþÿôÿêÿ ÑÿÓÿçÿÕÿôÿíÿëÿ"îÿßÿ ûÿåÿâÿñÿúÿêÿüÿÑÿûÿÚÿþÿàÿðÿ /ÆÿòÿðÿÝÿ íÿåÿòÿïÿúÿóÿùÿãÿàÿàÿ ïÿ#ìÿõÿðÿòÿ ýÿòÿíÿýÿéÿÚÿÜÿÚÿíÿ:øÿûÿ'×ÿ$þÿíÿðÿ)öÿ#ùÿ÷ÿÏÿÛÿ¼ÿ&ÿÿùÿ Óÿìÿûÿßÿ÷ÿýÿýÿÕÿ#ñÿ*ùÿÚÿ52ÿÿÚÿÿÿÝÿ ×ÿñÿõÿ&öÿÞÿ :c"|ôÿüÿ*M"÷ÿûÿ Ìÿÿÿøÿ ÷ÿ îÿ$$Ž>ùÿªéÿG&Môÿ #úÿ(:êÿíÿþÿ'6…éÿ¦ÿH6cQ4Ùÿ\" 7)(ñÿ'1úÿØÿ\ÒÿÍÿ KSÇÿ¼ÿËÿûÿFøÿõÿõÿæÿýÿ;íÿ%gÐÿÖÿ ]ÿ˜ÿ£ÿÅÿÐÿ rÿ½ÿ¦ÿ1¼ÿQÒÿÓÿµÿúÿðÿ éÿRÍÿÃÿÑÿ{ÿÜÿhÿÚÿ”ÿÉÿbÿÕÿÙÿE ÿ Òÿ¶ÿâÿûÿàÿ æÿ»ÿÔÿÌÿ¾ÿvœÿÜÿ‡ÿ¾ÿ£ÿºÿFÄÿÕÿÐÿÝÿÇÿÅÿ Åÿéÿèÿ*wÿ6[oÿ�ÿ�ÿÖÿíÿ>çÿÀÿîÿõÿ4âÿõÿãÿèÿ¡ÿV<ÿL:šÿÑÿ ÿýÿ ëÿ&Áÿéÿ"²ÿýÿõÿúÿ™ÿÊÿ#�ÿB-'ñÿûÿºÿ2;êÿ›ÿ#ÖÿðÿK*ÿÿ„ÿóÿ ÿßÿ6ëÿûÿÔÿˆôÿEˆÿ ´fÿCýÿúÿ8™ÿüÿãÿÁÿ£ÿDDj;ãÿãš_�8fÿQËÿM' ÖÿÆÿ õÿîÿïÿ…4Ó1ŠeÀbÛdRìÿ-þÿîÿ+ÜÿdÍÿõÿ#æÿ~#ÒáÿÏÿG“rÃ%Œ?¿ÿ©ÿËÿÝÿ´éÿôÿ¿ÿ"$/Æÿ¾ÔÿŽÿôÿY»‰–ÿm®ÿTÒÿåÿðÿÏÿ–l0åÿz–Ïÿ¦ÿB¡ÿòÿ‹ÿÝÿæÿ:’ÿ]ÿ¸ÿ7¾ÿFÈÿÙÿ-îÿ{OFO½èÿ¢ÿHÿõÿßÿlÿ‘ÿ$ÿ6<ÿÿžÿ4 Žÿ]Gžÿ)Ñÿ=b”ôÿ²ÿ ÿF;ªÿ�ÿðþnÿ(ÿšÿhÿ]@Åÿðÿ©ÿòÿ;Œÿåÿÿ ¼ÿÒþsÿ*ÿ†ÿûÿjÿKäÿÿÿéÿ¼ÿçÿ÷ÿœÿ�ÿ BÿØÿ¼ÿÔÿ&’ÿœÿ¼ÿ%1Bôÿ§J=V¶ÿ¢ÿÇÿ®ÿÂÿ~ÿàÿ(–ÿ€ÿxÇ̳ÿèÿ4âÿ#Ø ëÿͯÿüÿ½ÿqÿˆÿ�ÿXÓÿŠÿ½º˜ÿÿÎÿûåÿ®ÿ-|ÏÿÁÿ0-�ÿØÿ %ƒÿƒÿÒÿëÿëÿÐ E€²ÿÒÿšÿ:Ìÿ –ÿÕÿWÿ¯ÿ+îÿöÿ…ÿ6“Úúÿ~œÙÿuØÿˆ%ùÿ¯ÿ»ÿóÿÿ—ÿ²ÿŒÿwÿF¼ÿ2’ÿ˜½@�Ý:ÿCøÿ�èÿ#:) ÿºÿŸÿwQºÿöÿ¢ÿ2ãÿ»€ôˆ_¼ÿƒÿ�9¤D3Q½ÿôÿ?™7Åÿšÿ%âF X ÿ×ÿ˜ÿ‡biÿãÿCÅÿ çÿûÿ X> ûÿ‹v6$ÿI ÿiÿ>ÿîÿúÿ<ÿÝÿLÿY…—ÿuÿóÿ“ãÿF|¿þÿ{ÿ9ÿÁÿbÿEÿUÿÇÿ�¾ÿqÿmÿ1"ëÿCÿÞÿLBB ÅÿÿOÿ§ÿŸÿ¼¦ÿ–ÿpÿõÿêôÿ}ÿ• ùÿIÎÿ…7¦ÿ…ÿxÿÃÿÞÿûÿ¿üÿOPX?–ËÿÈM\eš�ÿ[ÓÿOÿÿ´ÿØÿÅÿq¨ûÿfPðÿËÿ › >ìÿ¥;1ôÿZ÷ÿÂÿÊþïþêÿ~=°óÿæ Oÿàþèÿ¹ÿ?G)›Èÿ°ÿj*^A ÿÅÿ ñÿ¦ÿ¡›ÿBm]ÿáÿÿâÿ„ÿ…Iÿÿ/Àÿ‚ÿ 1ÿÿ=Ãÿ*îýÿ)ÿÍ�ÿÜÿ>�ÿVsÿþÿæÿ†$¼ÿÛÿ,Èÿ“ÿ jÿ`‚"Ý®ËÿKßÿÁÿàõÿ½ÿ!Y‹ÿ“ÿíÿqøÿTÿåÿ‡ÿ\ÿíÿÂyIðÿ”ÿ!0wÿÄÿ‰€jÓÿTÿVÿÈÿ#[ÿÇÿLÿ¡ÿçÿÓâÿðÿÿ÷ÿ©ÿ þÿÄÿxÍÿ[ÿ¬ÿuÿD:Çÿ£ÿ)Ýÿ„Àÿ ÿWÿãÿfPÿ—ÿÞÿ™ÿ ñÿ2<ÿ¤ÿÚÿ®ÿ¯áÿ£óÿ:÷ÿ¸ÿóþaÇÿ¬ÿzÿVÿŽÿ¦ÿ×ÿ¨ÿ×ÿ‘ÿ…ÿ7ŠÿâÿvÿLRýÿ·ÿcÅÿ§ÿ/‘Úÿhÿ qyÿ²NÿêÿÌþüÿ·]ÿmÿ�ÿPÉÿ ÿFâÿ{(ò‘ÛÿøÿR9ðÝÿP9ÿ |I iÿåÿŸÿ"‰ÿÝÿ‚ÿ#Ä[ôÿ|:E6šGlqã1u,ïÅÿ–ÿÚÿŸÿsÿOÿçþiÿÇBÿaÿóÅÖ]çlŠs9š¥€Üÿe0¼þ¾þcÿ\œþÝÿ¼>{öÿÞÿêÿ]w �¸ÿ¿ÿÇJ´P®æþ|ÿŸþÿzý²ÿúÿtÿˆÿ3ÿfÿzÿºÿýÿ ÿ¼Ðÿ�ÿÀÿŒÿ;QøŸ˜ÿ"ÿ3ÿ§þËÿ”ÿ¹ÿ�ÿlÿ.ÿÛÿÿnÿéÿ ÿ|ÿ‹ÿ­6«-H²„ÿÄÿá0ÿ–ÿRÿ †ÿïþòÿßÿ‰ÿÿmÿ/>ëÿ§ÿDØÿ/s4 àÿžïTÿ:ÿúÿ/ŠÿYÿáÿ/‰þjÿ�‘d¤ÿvÿÊÿ5�)£7ˆ@­ÿìÿ¿ÿ%uÿ´ÿÿþÿÅÿ‘.Æÿ­ÿsb¡ÿûx7ÿDÿJ?h½ÿ‘ÎÿëÿœYÔÿTÿ œ­ÿòÿˆþØÿ Öþ4äÿ•Nÿ²”j±þuÿ¿ÿ1ÿì^+6Çþ:•±ÿ-ÿ’Òÿÿÿ2ûÿT ÿ�Sÿÿ6yAÿnÖÿEÿ…­ÿ˜þ?b#ÿrÿ{ÜÿP_ÿ¡ÿ†ÿpÿ¢ÿ!ÿ›ÿýÿÿ�ÿéÿâþfÔÿzÿïÿÚÝþdÿ4üÿÌuþøÿîÿìþ;Šÿeÿ ÿgÔÿ±þûþûÿŒÿ¤ÿ{)·ZÿqÝÿ™ÿÆþ¤hÿ£ÿÚÿ�B¶ÿ¿‚ÿpûþÿÞþ�ÿñ ”Éèþiÿÿ¿µþLJÿ^ÿ#jzVÿ¼ÿòçÿòÿgÿÿBÿ�ÿ› �ÿ1‹xÿlPÿT×þÑÿÓ0!ÿ9eÿ'Ùÿdéÿ¯ÿgÿšP+ÿ�ÿWÿ§ÿÔ=õÿÉÿF:ªÿ$âôÿ‹Orÿ-tÿ)ÿ˜ÿ&g,ÿ¹ÿ*þ›ÿ‚ÿX»ÿÍÿøw/&v]¾ÿ�Øÿvÿ½ÿÜýþ›ÿÇýÏýÞnÿÿ°Õ¶ÿCñþÛÿ¿¢¾ÿü›ÿŠÿícÿöÿLäÿkÿ¥üèÿ¼þxÿ²Ÿûþ¦Ö.ÿn–þËÿEãÿ3ÿ¬+ßþÞÿÑ—\Ž7€þáÿk§þ@&N\ÿmTÿÎ…þE¾ÿñÿ&uÿ�Z&F<»bÿôÿÕþ¾üƒþÄý›ÿ”ÿÿÕý%qýøŠÿ„þ"þÄþøÿŠ®ØÿÙúþRNÿmÆÛ¶|]ýŒÿÊþ$þíÿ·üÿúþ„ÿöÿOÿ+nÿy�ÿƒ/è^«rZ6{üíÿþü¢ýÕÿhý€ýÚêþ2þm×V ÿ~ÿÔþ¡b Íeç6Ãqüýñû»–ê>Üþ/ÿ�ŽÿŒÿ‡Ëÿ{þ©� ÄõÿôíÁþ×ÿ&èþ ý§¶ÿ¡º$T¦�éÝÏÏÿ°ÅÿWév‰üXÿÔý´ùIþŽçùŸúXïýŠìþ’†ÆÿÀþ:\¥ÿpÿçÖ×ûhýü û¾þ¹þCûàü?ýÿþ fÿºý4«þÒü¸ÿÈýãþÑÿUüyð¸sýŠýó—ûv÷óûœý¾ý,ÿVÎý¹þiþ/vÿ�þjýiÿ5ÿLîþ•;­ý.úšüRþsùþ]ø“þ$û¥ þƒÿðý­þÉüü\.þ+þ@ýmþˆ¸E”ÿu›‡úNüû÷O3ÿ[ý‚üDúÿ~müTRÿšáþ×þéütýùç XèPöý ü5úW§ù6I÷aÿôŸýÉΫúþ²2üJú ˆþaœýâta÷ ÿjD =Óúlù�û1‚ý»‚ù÷aüÛýðý¿Üõÿ°AüùPþðÿáZ»YQ Hÿ¥þe ÷;øäÿMNþìþz�þÅR( ý;AöðïQÌõÿ ÙmïC7 YÛ1O¡/ú¾ÂRú‡ �žøÛöU~8ý˜÷þíýYÆî ÝñŒùjó€ü›¸óÉ{ýü4ÿ‰ýš 8ù|øp +®J ~óg ï!÷VôÏúN«¢ÿG÷9úø;Òù\„%2º= áæ 4ܦ q È "ÿOõüŽtŒý ûy¸û/™v7¼ø ùßù& <ÿ\ ![�Ð¹ËøýÜøÿî^±Íÿ… üÑwìÃÛ‚û ôª÷†Þ5¡ûMõ·.ÿj ]Õþ�ü ¨×Öž{ìóÜâ8ü<üÛó ã¶øiˆúèøÿaü€ÈôS ÞÙûbÿ{ùž\!ÙÓŸÿ÷²÷ üûXúrü ù¾÷'÷eù€<ôeûþÜùðù†î‰:º&ô‘1÷Pü»úÞ÷cö]õááÿÜÆù(üm÷ã­mÿºoýÊÉÎÞúš/ póFÉ>þ¯û$ë rúé û~qü ¤ûciÿ¥ü#\ý‚õÓ r- ªøüh~ûîÿüûî ý€ÿúÊßVýñÿR“ýi®ý¯Á÷ÞÉ�cýOáþtVõÐþ¤iÿv)·¦Ôý†üÆÿõ º=úŒSû¤þöîºý²±þAýóþøþ—ýSüý† ýpÆþ®þ ÄüÐü©þÅý:ûF"þù$þsûèïý þDRؤþLý8ÿ#8ýncý†hø’‡üýtÿ 3¼ÿ©ú /¦þc„a…ÿQ‘Íþ�þÚû€ÿ‹ÿ’õbVùÑüïWöÿxüf*þ�þƒÿžþÕýÃþ•5ÿ±ÿˆþ�þWý§ÿ=ÿKúeýYþo1ÿÛMþ_ý“ü)ýæþ`ÿ"ÿþŽýÌÿäÿÅÿœÿŸþqÿ®ÿ ºü þ]$ý9þÏÿJuüƒþaÿý–w^þ´ÿKÿlcþŒþ3ÿKÿ{ÿ²ÿ@†mŠþÿFü ’YøGþÒþüÿùþuøþ$·ýÈþ]þŽ+ûüå÷p\ÿÇ@þ ü¹ÿËjµoñÿ-�ý2KÿŽû²Eg¦ÿíšþþ~À)%�ÿëÿÕöÅÿßþFÿFlÿJçùvlÐþ¾þ>ÿ7qÿÞ÷þÇÿõ�¹ nÿ‰æþ ÄÀ~ÿxþ¼øËþ-ÿaþîþDÿ&çþ¹ÿmÿýþµº«‹„þ•þQÒC²ÙÿöþûùþÕþðþIÿþÐý‡ý|;þRâÿÕÿ¶þ™ÿ!•þuþàþGðÿØÔÿo¬{üºwÿ�ÿ[¬üˆü€ýJ ýÃÿØþÑ7þóÿ~²þ»ÿ�ÿZêÿ+¹ÿ*\Èÿâå=þgþNü§ÿTñÿÃÿ:NYC-€ÁÿU—ûýô©’3þ‘ÿuþ‚õ¬»ÿðÿ¥ÿ™ÿÑÿËÿãÿB ÿN}þ“ÔÖÿ!òþ@ÿÓ2ù¤þ1ãoÂÿd£ƒÿ|ÂÝýüC0{[þ¥%ÿhM#Zcÿç¿êÿXèÿªÿ (�+ôãný{WÎÿyÿaÿ/ÿ¢ÿ*b(·ÿB²VÿáþrÅÿ²ÿ@iÿÆ–ýý`ÿ i«ýÂÿàÿ‰þ„ÿŒÿT¨ãÿ1Ÿ8ÿÿ¶õÿÿþ]·5i´üíÿåYäþØÿÕþVPÿ‹µÿ>ÿÜÿZÿqÿ°ÿúÿâÿ2÷ÿ=ñüÿB»†þÔÿñÿ…þ*³ÿd Tÿ›ÿBÿØÿ�tñÿéÿ$òÿJQuýÒÿJéÿøÿÿð"ÿ1U.«ÿuÿ´ÿ¬¶ÿ’§ÿY‰`i#Õ$þÁÿœµÿç ÿbÿ¼Ñÿ%ÿ¶ÿzÿåìÿ\ûÿáÿ±úÿj~ÿáÿV.þ/‹*ÿudÿÓÿÐÿX‘çÿ¹ÿ…ÿ"ÿÒíÿ’ÿûÿ,ìÿôÿNÿÎÿû;ÿ¢+÷þï ±œÿðdcOÿAÁåÿY’«„ÿ÷ÿ’ÿu]ÿd»þÈÿQÿÓË_ÿCwÿ¶ésÿwcÿ5ÿÜ“º¹ÿüÿ¾ÿÆ¢ÿªÿþfãþÅþÿñÿ:pÿ*¡ÿšuÿ¾ÿ(ýÿ—ƒÿ×ÿoòÿÖÿ€þ�ÿ�þ*ÿ9ÿ”ÿÐÿ–ÿŒÿ þR°ÿ6Þÿ\HÇÿŸÿZÇÿÜÿƒÒþòþiÿÍÖÿ-ÿ!ÿÀÿFÿ3ÿ®þŽÿfÿ©ÿ³ÿujÿÂÿéþ!Sºÿ/K!ÿmØòÿ\þKÿ”ÿ¦ÿ�ÿTÿÿÿŒÿ&ÿøÿ…§þ*Ãÿˆÿ¼ÿ�ÿûÿãÿWUFì GÿQ²ÿ nüÿ‡Cõÿ+Ñÿ%L¿ÿÏÿÿ~ÿk¾!r”Òÿ×·G¿ÿ²¦“Âh×ÿ¼ÿkT0Šÿ8ÿúÿ³ÿûþˆÿè#lÿ–÷^&¢ky¶6Q5HÈÿ”ÿƒÿâÿï¬þÝþ(ÿÿä-7ýÿd¢ÿŸ@3œÿ+ÿdq ºÿQjþTþ°ÿÞþ1ÿ}øÿ�”ÿÕÿèÿÒÿŒ ÿ)øÿkÿŽÿlÿ\—9ÚÿoþèþáþgþÇÿ8÷ÿoKõÿßÿÃÿTìþ6†ÿCÿÝÿÞÿíÿ€)ËÿÿÕÿáþÿu)¬ÿ™ÝÿLaÿÙ?ÿÁÿNúÿñÿÓÿALÅÿòÿ™ÿ,ÿ˜‡ÿ07�ÿ1„˜F¤ÿ×ÿ¤qÿŠÿR“}FÈÿtïÿqT FëþóÿЪÿ©¸àŽÿ®ÿøÿµ«ÿ#¾ÿFíÿ¥Òÿ{°] LÿÜÿ=ÿ€ÿ‹ÿ†uÿÔÿÂ_]wÇÿÑÿyžïÿ“ º5¶ÿE÷ÿHÿm9ÿúþ²ÿrB\»ÿôÿ²ÿ0kHi34ÿ¦ÿ•ÿ ÿ’ÿOÿ ÿ²ÿDÿýÿ²ÿtìÿŒÿËÿÞÿ‹ÿBëÿüÿúÿº�3·ÿI ÿ`ÿLÿlÿ¸ÿêþ®ÿ ¡ÿ Òÿ°ÿºÿIµÿ+tÿ?Þÿ‘äÿQÿO4ÿ"Mÿ“ÿñÿ/ÿƒvÿ$Qÿ¤ÿöÿÆÿåÿ|ÿ ÛÿŠ —ÿvÿÍÿhÿ5ÿ“ÿ¯ÿ_ÏÿÑÿ¯ÿ´ÿßÿ'ßÿÞÿåÿÜÿ…ÿ¹ÿ¢æÿPÿŸóŸÿFÿûÿ”œÿ‡ÿ€ÿ.ÿÎÿzÕÿ ÿÄÿÇÿ×ÿtL½ÿØøyÒÿVÿÏÿ»Y"ÿ‡ÿëþÜÿkéÿÖÿ“ÿßÿŒÿeÿÏÿö£¨ºTDÙÿµ€y+ÿÿŽ|ÝÿµÔÿØÿÛÿ“ÿnÿâÿÊ&MÞÑÿ)Õ,cGÔ�Îÿ!9ƒ@­z<ùÿÆÿÃÿJ™îÿ=hñþ±ˆáAÛÿÍ+vigÈÿj>f²ÿîÿÍÿqKûÿ·Ãÿ�þ¿ÿ£ÿhëÿœÿÙÿdÿOüÿ’vëÿõÿ·ÿDZðÿ,g`ÿ¬ÿ½ÜþÎþ+xÿ/+ÿÁþÿLÿýÿŒÿq“ÿCÿ1sÿûÿIHðÿcTiÿÇÿgÖþoÿ6ÀÿzÿFÿúþJÿâÿ3ŸÿÝÿMÿKÿ¹ÿºÿCÃÿ-òÿ¸ÿO¤ÿ‹Ûÿ£ÿ¢ÿŸÿøÿ<ÿP¾ÿPÿëÿþÿÅÿƒìÿ©ÿS�ÿÏÿgÚÿ& ÖÿEÿzÿøÿCÿ:'þÿ8FÿüÿcTéÿÄÿ(fÿ�ÿ.@ÿŠØ©ÿçÿ&ÿ¸ÿCOÿ_âÿ# e.þÿFÅÿÛÿMÿžÿH$ÿ†Œ6õÿÍÿØÿ^ Ñÿàÿ ™ éÿ¨ÿ:ÊÿÈÿpÿ2sæÿ·54ÊÿèÿH5'zÿ.˜ÿêwÔÿ:lÿ»ÿÊÿªˆH¶©ÿEQûÿt‚_¬ÿ.¶ÿ÷]÷ÿ5 Øÿõÿ!¹ÿ ´­j”ÿÀ–Â… œ6ðÿ ”Nýÿ¢´ÿêÿ Vy;ûÑÿÁ^œL}:.ŽVèÿŸÿTîÿÑ)ñÿ/yìÿÞÿhIÿ†ÿRåÿÇ+êÿMèÿ�޳ÿ“ÿ<íÿ‡\Þÿ ;zÆÿâÿ5ÿ³ÿ Àÿ4=¤ÿÁÿÂÿtýÿ™§ÿŸÿAÏÿP9I,eZêÿUÿ ÿeçÿµÿ¢ÿ�ÿ‰ÿÈÿ:”ÿÚÿÏÿôÿ¶ÿ'LCöÿA‚[ ÿ—ÿ5rÿ™ÿÉÿªÿœÿÕÿóÿ.2×ÿíÿ(‘ÿÑÿÕÿüÿûÿbTOÿ·ÿ˜ÿ÷ÿÝÿ�ÿÝÿÍÿ#.êÿàÿ)üÿÓÿ#¼ÿ YÿöÿÞÿd'Šÿßÿ XÜÿfîÿ% 3 Ùÿæÿúÿ(ØÿàÿÑÿ\ÿÊÿ·ÿ,{4Æÿ÷ÿ-,ëÿtçÿ='óÿÐÿ!ïÿòÿ½ÿRÿÅÿÍÿlxøÿïÿËÿ Öÿ4êÿ×ÿîÿQõÿìÿ‚ÿ}0ýÿùÿ³ÿ¸ÿçÿ=ÀÿÝÿàÿ9îÿE&ðÿ”âÿôÿôÿ=7Ôÿ Âÿ¼ÿ ÜÿìÿËÿ ïÿëÿLõÿj$>�ïÿ ;!âÿúÿûÿK¨ÿàÿ? ÿÿíÿâÿ÷ÿýÿgØÿ`#3Xñÿ6+! Ëÿ8ÿÿaÚÿüÿC& äÿóÿˆöÿ«ÿÐÿËÿ?óÿÁÿ.Hôÿàÿùÿvþÿãÿ¹ÿòÿ¸ÿÒÿöÿ&ÖÿÝÿ¾ÿ!ñÿäÿ²ÿÎÿ,öÿ &O÷ÿÅÿÿÿ¿ÿßÿðÿÍÿ®ÿïÿÊÿ!áÿÝÿåÿ±ÿïÿÝÿûÿýÿ; ÑÿÉÿÞÿ­ÿöÿÉÿ³ÿ¹ÿäÿùÿ9ÏÿÛÿãÿÓÿùÿ¾ÿûÿòÿÚÿëÿ(ìÿåÿ(2Ûÿ ãÿÕÿÞÿíÿ ýÿ<ÎÿßÿýÿüÿïÿåÿûÿÔÿîÿçÿãÿÞÿ4LùÿùÿÜÿèÿæÿñÿÎÿñÿ#ûÿòÿèÿÿÿèÿâÿàÿçÿ³ÿ2Îÿ þÿåÿòÿ.9æÿçÿ çÿÝÿïÿüÿÞÿÕÿàÿÜÿVïÿýÿúÿ ,Úÿïÿøÿ'& çÿÛÿ äÿñÿíÿBêÿôÿôÿøÿ) ÐÿÖÿ*ôÿöÿëÿûÿøÿüÿâÿ÷ÿÿÿÔÿùÿ :ÿÿäÿñÿÝÿ ðÿÿÿùÿûÿéÿùÿ×ÿAîÿ×ÿR"4àÿëÿçÿóÿöÿøÿ$éÿÆÿP³ÿÄÿ;ÿÿ&öÿíÿôÿíÿüÿ  áÿÈÿ<ºÿÝÿîÿ&ûÿøÿóÿñÿùÿÿÿõÿÿÿòÿ#íÿÛÿ2ðÿ+üÿÏÿöÿäÿÞÿæÿñÿüÿÿÿ÷ÿüÿóÿ 9íÿèÿÖÿóÿóÿùÿèÿõÿ ïÿùÿìÿúÿüÿûÿêÿùÿ%5çÿàÿÿÿóÿûÿíÿ ÿÿ ûÿÿÿóÿîÿøÿ("'åÿøÿîÿðÿõÿúÿ  ýÿ÷ÿýÿåÿ öÿåÿòÿðÿëÿùÿóÿóÿùÿõÿûÿøÿüÿùÿÝÿòÿèÿôÿüÿñÿÿÿñÿÿÿìÿîÿøÿëÿûÿùÿýÿêÿñÿöÿñÿúÿ÷ÿøÿùÿðÿþÿ÷ÿ÷ÿøÿòÿôÿùÿþÿúÿþÿòÿôÿïÿüÿîÿúÿÿÿíÿõÿøÿøÿõÿûÿøÿúÿúÿùÿðÿÿÿðÿôÿóÿúÿ ýÿ ýÿÿÿýÿüÿôÿíÿõÿûÿ úÿ ÿÿ úÿùÿýÿÿÿûÿüÿñÿíÿýÿúÿ ùÿ üÿþÿùÿýÿüÿþÿýÿ ÷ÿøÿùÿÿÿüÿ ÿÿúÿøÿüÿýÿùÿýÿ üÿþÿ üÿÿÿûÿõÿüÿÿÿüÿÿÿþÿÿÿüÿ üÿýÿúÿÿÿùÿôÿÿÿýÿþÿÿÿûÿÿÿþÿ ûÿýÿûÿüÿ÷ÿÿÿ÷ÿÿÿýÿüÿÿÿþÿþÿÿÿÿÿÿÿûÿÿÿýÿùÿüÿûÿýÿüÿÿÿþÿÿÿÿÿýÿþÿÿÿùÿüÿÿÿûÿûÿÿÿþÿûÿûÿþÿÿÿýÿÿÿÿÿþÿÿÿþÿúÿùÿÿÿûÿýÿþÿýÿþÿÿÿþÿÿÿýÿýÿýÿþÿýÿþÿûÿúÿÿÿýÿýÿþÿÿÿÿÿþÿÿÿþÿÿÿþÿÿÿÿÿÿÿÿÿýÿüÿÿÿüÿÿÿþÿþÿýÿÿÿÿÿÿÿÿÿþÿþÿþÿþÿþÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿþÿþÿÿÿÿÿÿÿÿÿþÿÿÿþÿþÿÿÿþÿþÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿþÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/BinauralDecoder/Source/IRs/irsOrd6.wavIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/BinauralDecoder/Source/IRs/irsOrd6.w0000664002537200253720000005520415257173642031335 0ustar zmoelnigzmoelnigRIFF|ZWAVEfmt 1D¬òAbdataXZÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿþÿÿÿÿÿþÿþÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿþÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿþÿÿÿþÿÿÿþÿÿÿÿÿþÿÿÿÿÿþÿÿÿÿÿþÿÿÿÿÿÿÿÿÿþÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿþÿÿÿþÿþÿþÿÿÿþÿÿÿþÿÿÿÿÿþÿÿÿþÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿþÿÿÿþÿýÿÿÿþÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿýÿúÿþÿþÿýÿÿÿþÿÿÿÿÿÿÿþÿþÿþÿýÿýÿÿÿþÿÿÿÿÿÿÿÿÿþÿÿÿÿÿþÿÿÿþÿþÿÿÿþÿÿÿüÿûÿþÿüÿÿÿÿÿüÿþÿÿÿýÿÿÿÿÿþÿýÿýÿýÿÿÿÿÿÿÿýÿùÿýÿýÿþÿÿÿÿÿýÿþÿþÿÿÿþÿÿÿÿÿùÿýÿûÿüÿþÿûÿüÿþÿÿÿûÿÿÿþÿþÿüÿþÿÿÿþÿÿÿýÿúÿúÿþÿýÿýÿýÿÿÿþÿÿÿþÿÿÿÿÿÿÿþÿÿÿþÿÿÿþÿüÿÿÿÿÿüÿýÿÿÿúÿùÿþÿüÿÿÿþÿÿÿýÿýÿþÿýÿûÿýÿþÿÿÿýÿÿÿþÿÿÿüÿÿÿÿÿÿÿþÿüÿüÿ÷ÿýÿÿÿùÿÿÿúÿûÿüÿþÿûÿÿÿüÿûÿùÿüÿÿÿþÿÿÿýÿþÿÿÿýÿÿÿýÿþÿÿÿýÿùÿûÿóÿüÿþÿ÷ÿüÿøÿúÿþÿúÿ÷ÿúÿýÿõÿþÿúÿýÿýÿÿÿÿÿþÿÿÿþÿÿÿÿÿþÿþÿþÿýÿýÿþÿþÿþÿúÿùÿüÿûÿþÿ÷ÿÿÿüÿÿÿùÿüÿüÿþÿýÿýÿûÿ ýÿýÿÿÿÿÿûÿýÿÿÿþÿþÿþÿýÿÿÿýÿþÿþÿüÿþÿúÿþÿýÿúÿòÿûÿùÿûÿ÷ÿÿÿôÿ÷ÿùÿüÿýÿùÿþÿ øÿûÿþÿýÿþÿøÿýÿÿÿÿÿþÿÿÿÿÿýÿýÿþÿÿÿüÿ  ùÿúÿ÷ÿ ýÿýÿýÿøÿúÿôÿ üÿÿÿûÿõÿûÿüÿûÿýÿÿÿýÿ   öÿüÿ øÿþÿÿÿøÿ ùÿ úÿüÿöÿþÿÿÿüÿýÿûÿüÿûÿôÿüÿôÿóÿýÿûÿ ÿÿúÿúÿöÿüÿýÿýÿúÿúÿýÿÿÿøÿüÿÿÿüÿõÿòÿùÿ ýÿõÿýÿ÷ÿüÿÿÿ ûÿùÿ òÿÿÿþÿýÿúÿþÿ üÿ üÿýÿüÿþÿÿÿþÿþÿøÿûÿ÷ÿðÿôÿþÿóÿûÿ÷ÿøÿþÿÿÿÿÿñÿõÿÿÿûÿ÷ÿßÿóÿþÿýÿúÿüÿûÿþÿúÿóÿÿÿñÿùÿöÿùÿóÿùÿýÿîÿùÿôÿûÿäÿ÷ÿýÿòÿÿÿÿÿöÿýÿÿÿýÿüÿ ðÿûÿçÿ ëÿçÿÿÿïÿ ùÿ ÿÿ ðÿûÿ  õÿýÿþÿïÿþÿúÿüÿûÿøÿçÿ ñÿ÷ÿØÿÞÿìÿîÿèÿçÿÿÿäÿþÿÿÿóÿóÿûÿ ÿÿÿÿ þÿýÿ÷ÿþÿøÿýÿþÿþÿòÿÿÿñÿ ýÿûÿöÿèÿþÿôÿðÿîÿùÿùÿðÿøÿ ïÿÝÿýÿüÿùÿ øÿ óÿþÿüÿ ûÿþÿÿÿ÷ÿýÿ÷ÿýÿìÿÿÿíÿïÿøÿòÿÿÿ!êÿòÿøÿíÿùÿûÿôÿèÿùÿìÿÖÿùÿøÿþÿ÷ÿìÿ ëÿþÿëÿøÿöÿ÷ÿ óÿìÿùÿèÿ ñÿ!îÿþÿÿÿóÿõÿ õÿòÿíÿ ãÿÙÿÜÿïÿåÿêÿöÿùÿïÿøÿçÿõÿçÿüÿíÿóÿ úÿÿÿæÿÿÿäÿüÿ,&øÿ "ðÿÚÿôÿ Òÿéÿ#åÿ ÷ÿéÿöÿóÿúÿîÿèÿòÿøÿøÿþÿûÿ  Âÿ«ÿýÿêÿàÿøÿüÿ øÿíÿôÿ ùÿáÿíÿßÿ1ñÿõÿ÷ÿøÿâÿ ýÿüÿ ÷ÿüÿôÿ ©ÿ­ÿëÿáÿ $óÿòÿçÿëÿèÿøÿùÿâÿòÿ ùÿóÿñÿüÿ÷ÿüÿñÿ ëÿýÿ àÿ÷ÿüÿþÿÜÿïÿâÿìÿ øÿæÿõÿýÿ' úÿ"üÿ ÿÿþÿýÿñÿúÿÿÿùÿóÿúÿ=lÖÿ,5åÿºÿùÿ×ÿûÿþÿþÿíÿÜÿÛÿíÿëÿïÿúÿïÿ2þÿþÿûÿíÿúÿöÿ ñÿ÷ÿùÿÿÿîÿîÿÿÿÿÿþÿüÿôÿìÿóÿ�²÷ÿ-SÅÿ5äÿåÿ ãÿêÿÁÿ * 2ñÿñÿìÿþÿÝÿÿÿìÿøÿ ÿÿöÿôÿûÿñÿïÿúÿs[TX ' Ùÿöÿ÷ÿãÿåÿ×ÿèÿíÿ -/(îÿþÿôÿûÿ æÿôÿ)õÿþÿøÿâÿÿÿöÿ> #!2aÔÿìÿÈÿçÿöÿõÿ¾ÿ òÿÁÿìÿ&ÿÿüÿÝÿ¼ÿåÿùÿãÿ úÿíÿõÿÿÿùÿ÷ÿ$êÿäÿìÿúÿöÿ%Ãÿ³ÿ,îÿÙÿ×ÿøÿãÿýÿ¦ÿÿÿ=ïÿõÿÿÿÑÿÒÿ üÿìÿ øÿÿÿöÿñÿóÿüÿðÿùÿ~ÿ˜ÿÜÿÅÿcÿÁÿ´ÿâÿÝÿÖÿÒÿ…ÿ Jt3æÿïÿåÿ¹ÿ4÷ÿöÿ'*ëÿèÿíÿ$Mûÿòÿùÿéÿýÿåÿîÿ‹ÿ¼ÿ·ÿŽÿvÿÙÿûÿÑÿÛÿùÿÚÿ:ßÿ%+ïÿ2Dìÿ¤ÿáÿÝÿ¼ÿÔÿãÿùÿãÿäÿòÿóÿÕÿúÿ6ïÿÔÿßÿúÿôÿ(ùÿôÿßÿ¿ÿ�ÿËÿ¡ÿÅÿÃÿ%~jXýÿUÿÿ[Áÿúÿäÿ, ìÿýÿøÿ÷ÿäÿìÿ ûÿþÿÊÿæÿ¦ÿ<Ôÿûÿ(;ƒd& (+ÞÿÒÿÛÿ÷ÿAíÿàÿ #'Ëÿöÿüÿ4ôÿêÿûÿÈÿ ýÿóÿ ÕÿØÿ+#‘))D 9 ïÿßÿˆÿÝÿÇÿîÿÑÿ-îÿÝÿóÿ»ÿÚÿøÿK)çÿ®ÿÒÿßÿÉÿîÿ+ìÿHëÿT€ùÿ{e+Çÿ0Ïÿóÿ2ùÿóÿÝÿßÿ³ÿèÿÉÿÜÿ%¿ÿóÿ´ÿáÿûÿ¯ÿ üÿ íÿÌÿÿÿÎÿÁÿìÿ)ßÿôÿúÿÿÿVµ-mûÿ‚4Äÿ|ÿ¿ÿàÿYýÿxÿ×ÿ�ÿðÿÍÿ$ÒÿÖÿÏÿŽÿÉÿúÿãÿÎÿñÿÏÿÜÿíÿÙÿëÿÜÿéÿëÿæÿ*?ëÿjÿæÿýÿ™ÿìÿ2ßÿ¾ÿðÿ àÿºÿH)ÔÿÑÿ2ÒÿßÿS0ùÿºÿÑÿÉÿ4&÷ÿ 5×ÿÎÿüÿýÿßÿûÿÖÿÔÿ™ÿÌÿfÿ¥ÿÈÿÄÿäÿãÿHÿÖÿ�ÿ/�ÿÞÿq�ÿ>ÌÿìÿE.žÿ9âÿÞÿàÿõÿ&`cûÿÞÿËÿ*Óÿ ñÿ¨ÿÔÿÎÿfÿdÿ#¥ÿËÿ%×ÿ0q ÿ†ÿ¶ÿ Ïÿ8/ îÿ˜ÿ*qÿI)Ýÿ)Ïÿþÿ±ÿÚÿæÿÜÿ"*Ûÿ$Ïÿèÿëÿùÿàÿ³ÿðÿÿÿ'qÿ³ÿôÿnÿ’Uºžáÿ»ÿRš[J`Ûÿýÿæÿ/`d®D0àÿ¥ÿ8æÿ9ëÿÜÿ<Ùÿ1æÿëÿÖÿæÿËÿ F5MÀWµîÿYNûÿ'^!?Ìÿ2âÿB¯ÀÿXµÑŸaŽèÿÓÿÞÿ\.€ óÿ,/êÿ8ÙÿÂÿ x:øÿ›Ù“fhÖÿ>¤ÿ¦ÿŠŸ_›ÿÖÿˆÿìÿ#ºÿÂH^uwÿÚÿ^}õÿ9ìÿR—Îÿ¶ÿØÿöÿIûÿùÿôÿJu© ·ÿòÿøÿáÿQÿXÿn][s»ÿ*+ !”,Cÿ êÿÜÿïÿ.®ÿ èÿ2žÕÿæÿèÿæÿ±ÿ9ðÿ5 B<.&³ÿÅÿ€wÿÿÍÿmçÿgÿÍþ±ÿðÿØÿs}–«ÿÅÿ,åÿ0€ÿ Iÿ¯ÿ¨ÿ™ÿùÿDÆÿâÿ7J¨ÿèÿ¹ÿÍÿ óÿAX(%/ßÿBÿ~ÿÿSÿúþ®ÿ\fÿ¼ÿ­ÿ¬ÿ²ÿN ?ÙÿÝÿëÿ¦ÿ¶ÿºÿ´ÿ&ÿ:ÿhÿ‘ÿkÿÔÿ3@"1Òÿ³ÿÃÿ÷ÿ—ÿèÿ6ðÿäÿöÿj.íÿ.�ÿèÿ€ÿ¥ÿ„ÿþÿÒÿ{% „ÿùÿ®ÿBDÿýÿöÿúÿ\ÿÈÿ#ÿõÿ4ÿûÿÞÿT#Îÿƒÿ8ˆÿ"ÞÿàÿÊÿ?Þÿýÿóÿÿûÿëÿ}ÿóÿƒÿ©ÿòÿ­2 sÿ�NÿƒÿX`ÿýÿXÚÿƒÿnÿ‘ÀÿŸÿ!=îÿRÃÿ'ÿýÿÈÿ%)ïÿâÿýÿàÿàÿÇÿêÿJÿ¯ÿãÿ�ÿ toÿ·ÿ9Z"áÿ øþ-¢ÿn¥ÿfÿÄÿ¥ÿÒÿ“ÿ›ïÿùÿüÿâÿ*Kbÿ/UÿB Ñÿ {ÿ®ÿÆÿëÿ:1Âÿºí³ÿs\úÿQÏ=Hÿ¿ÿúÿ—ÿéÿŸÿfÿ¹ÿÃÿ0nÿ?zÁÿçÿåÿøÿäÿBËÿ£¹ÿðÿ Jîÿ¦ÿôÿÉÿêÿ2{<¸èÿ·ãþ?íþÑÿ¬ÿrÿ¤Ÿÿkÿ1u{ÿ9“ÿÿ�×ÿeÿ—ÿçÿ•ÿ½ÿfÜÿÖÿÂÿàÿ¬ÿùÿ�W ‚ÿÞÿ¼¾ÿLÐÿ&ÿ1I»ÿ¼éþVæÿ×ÿkñÿ¯§6�‚©cŽÿ´ÿÈÿÌÿ€ÿe67K0ËÿüÿôÿÁÿÉÿ³ÿøÿÊ(Ôÿæäÿfªçÿ> ÿ)ÿ™ÿôÿ€¯e …u#VD?êŒÛÿe�_x�ÿ²ÿJ1§;qd0÷ÿáÿúÿ1ãÿúÿóÿšúÿ'ìÿïÿI”ÿ‰ÿ³ÿµÿ(HÿÐÿ¨8™âÿøÿYÂÿ›D0+ÚÿGÿ•ÿM°ÿñÿíÿïÿgK‘úÿæÿÕÿîÿ )m\-6–×éÿ¢bVÿ>ÿ$[:­ÿaÁ`·ÿ a¿ÿ;ÝÿjÆÿÇÿõÿ‹ÿ±ÿ4ÝÿF6-Q§ÿ´ÿˆÿIFmQk,×ÿÌÿ¶ÿrÿ¡¹ÿâþÚÿâÿKÏÿ¨ÿÆÿe¸BÎÿ³ÿþÿâÿb¤xÿúÿ„ÿ”ÿ¥ÿW(=Q•ÿ»ÿâÿa <`ièÿÿAÿÀÿP]ÿÔÿ—lÿÀÿmÿÿ…\}ÿžÿP iÿiÿ¥ÿxÿ4_ÿ$bÿªÿÿ¯ÿ†z^óÿÚÿãÿåÿ¤ÿåÿ@<ûÿûÿùÿ¶ÿ'~ÿ©ÿQÆÿAÿtÿ…vÿŽÿýÿ´ÿþÿ[žÿ1‡ôÿ²ÿµÿAþÿˆÿÉÿ~ÿÑÿnÿCwj Úÿòÿªÿõÿ"êÿ@ÆÿÓÿ¹ÿÙÿºÿ¶ÿ?ÿt�ÿ;ÿ«þ›ÿ©¡ÿ*E/B³ÿÝÿž#½ÿCƒÿD±ÿñÿØÿcÿëÿZ¶ÿ2Þÿ�ÿìÿžÿëÿ@ÿ¶ÿßÿïÿÏÿ”ÿ–ÿÆÿ÷ÿŒÿ–ÿ´ÿPéÿÓÿ-ÿ…ÿŒçlÞ‚Yÿ=ÿöÿN <ÿ¤ÿ±ÿ¹ÿµÿƒÿBÑÿ>õÿÐÿùÿîÿÿÿÃÿ²ÿ<ÿ ÙÿÚÿóÿÊÿæÿ¸ÿîÿ ÿ9øÿA\ÿYjÿm´$‘¶ å�ÿÒþŸÿ0ÿ¨ÿ0äÿuÿ$ÂÿMèÿ¬ÿq=5»ÿsÑÿËÿ3þÿ&Žèÿ*ìÿ¿ÿúÿËÿ <¥ÿÿÿ�$ÿZÇÿ€ÿòÿ¥þÿ¬ÿdÿhÿÍÿëÿùÿ@`¼ÿÞÿJÃÿY¬ÿýÿ¦ÿ+<*øÿ<1ãÿÛÿÆÿîÿ 2<Wÿ„ÿŽà‹¿þÿÿ‚ÿ¯ÿíþ(¸ÿ0SÿÂÿEéÿì-0¾ÿ'Áÿ:ng-\ÿ)íÿZ#%Uêÿ!QÙÿÜÿûÿfÿòÿZaÿÁÿwÿšœ"ÿ±ÿ3WÿÛÿöÿUáùÿ;¥ÿŽÿt®ÿñÿ™nÁv¢ÿ¹ÿ¿ÿáÿHÝUY%ÅÿG)îÿ¬ÿøÿMA“ÿ`~ÎÿÞÿ)pÿ`çÿÿ97Þÿ©ÿHœ$wÿVUùÿðÿ ÿÃaËÿHQÿQ“ÿ±ÿ|Ðÿ«ÿÙÿ—ÿ1-+?_…í@SM›ÿ?ŸÈÿc¼ÇM¦:ïûÿ*iþÿ4YpÉÿ;Ðÿ3¹ÿ�€ÿ"Üÿ·ÿöÿtÿ üÿv+¸äÿ×ÿ‹Êÿ&Êwâÿ°{ÿß1Iÿdtÿ´‘ÿVs ÿR´ÿáÿëÿèÿƒåÿrÿzÿÂÿL¹ÿ€ÿŽÿôÿÆÿ”ÆÿÛÿ/q¨ÎÿÇÿÃJT´ÿufCÿ™±ÿ?»ÿ-;ÿ¼ÿïÿÿQÿ¢ÿÝÿÞÿ�ÿ‘ÿ‹‡ÿßÿ:ÿTÿíÿLÉ%<?ÿwÿ Êÿ{`?ëÿåÿS#4]¶ÿ80ÿÿ®ÿ¸ÿÁÿPÿ�†ÿËÿÿ ¶»íÿ ÿŽÿgFÿæÿ¼ÿu†ÿ¶UÿVÿZ”J R·ÿ6ÿáÿNßÿóÿ]™ÿúÿëÿ&Âÿ ÂÿÒÿ1ÿæþ¹þÿ„0ÇÿMÿ\sïÿVÿÕÿÈù©ÿ¡ÿHÇÿ4Æÿõÿ�ÿßÿ¹ÿùÿl6îÿ¼ÿšÿlÿúÿ ×ÿïÿ´ÿ›ÿÀÿ¸ÿÛÿ úÿ-þþ¦ÿNÿ@ÿ›[ž¹ÿPÙÿÙÿ ™rÍ÷ÿ­ÿ -ëÿ}Vÿ¼ÿŠ9­ÿ¢ÿæÿâÿuÿu©ïÿýÿ®ÿ‡ÿìÿ™ÿÀÿˆÿ/¤þÜþÕÿ[ÿzÿ÷ÿþÿÔÿyÿÁÿ°ÿ÷þŒÿG"Åÿ+ÿ„Áÿf�äÿb´ÿ„ÿaVjëÿVÿÃÿtÿ{4KïÿQ@ ÿûÿôÿ%¡ÿ‹ÿÙÿ6•„ÿ&VÜþMÿgÿY·ÿØþkˆüÿ@ÿlÿxQšÿ~záÿ%ÿsÿØÿ}$Hÿñÿ£ÿí6.àÿl 4Üÿ¤ÿäÿ·ÿÛÿ;Û ÇP$ÿ›}ÿ].®ÿ‘Hÿ›®ÿÆÿjkÿåGÿáÿ„ÿkÿ)f:FÿK¡;MNðÿˆøÿ0·ÿ �ðÿ*Þÿ¨ÿÖÿƒÿ÷[÷†ñëÿ eÿkÿRNÿfþ¯ÿO+ÿ4ÿ]ÿÊÿ°|e»ÿºÿì¨ÿN ½³úÿ Áÿ¬ÿìÿCZ×ÿ'qÿSÜ3#™¾Á…ìÿãÿ×ÿ‘¶ÿÿRÿêÿ#·þ—ÿckE$šÿ!<ûÿºšÿ‡hÿ Sÿ�ÿ@ÿlÿÌÿòÿ óÿüÿ<AǺÿÁþ‚þƒÿhòÿÁÿšÿ @˜ÿ¶þ—þåÿÕ1 5_ÿyÿ FtÛG¶QMÎÿñÿêÿo-ÿªÿ”ÿlÿøÿ…“ÿóÿ_=¶ÿOÿ6ÿÿÿþÄþbÿ8ÿ:ÿ �ÿÿ ÿ†ÿfÿ2…¼þFÿ^sÿôÿŸ\ÿÿ´ÿÂÿCÿ}þþôÿ2‚ÿáÿ×ÿ²ÿ{oÿ»ÿ,L?ªâÿþþ@ÿJÿ/ÿÓÿ‰ÿ”ÿàþÈn´ÿ¶~ÓÿÿÐÿµÿá6ÿ+zþNÿXÿ×ÿÿ]ÿ“ÿ¯ÿ•ÿŽØÿ¤ÿVÿÜþ�ÿÞÿ€)ðÿ�Øÿ uÿ2ÙÿŒ{ÿhÿ—*Ps‰Îñ7ˆ’ÿX<~½ðÿC�ÿ�ÿ�þ‚ÿ0ÿñÿ�œÿñÿX²ÿÊÿ­ÿ9MÿÿóÿeŽ1¡ÿ`»ÿ™ÿ½ÿÇÿìÿcÿMýÿèþ¦9‡—"ÙûQpá~�ÿfÿ¸b—ìÿóýÿãÿËÿl =‹dÇÿâÿØÿCÿ×ÿq $Åÿ¹ÿ@õÿëÿ�ÿÌÿ ËÿE"�ÿwtÒ)gÆ e¢ÿ0ÿAÓKšÇÿ‡ÿYæÿlÝ>÷ÿy!šiY™‹ÿܵFD!ÒÿÍÿ†LÚÿ¢ÿìÿ+÷ÿìrÿÝÿÿpÿ2þ)Ôþ²ÿ¹ÿ‡ý8ÿŸÿkARÿQÄþ(ÿz÷ÿEW`©ÿhâÿ%ÿ3\ÿNø^–…^ëÿ€ÿEàÿÿGØÿLNŸ†ÿVÿ\ÿbÿùýaÿÛþ©ÿ×þFÿeÿÍÿöÿ]ÿQÿHÿÿBÿÿÿŒÿH“ÿÆÿKÿãþÓÿqm¬ÿj¢ëÿšÿ]òÿ $(4eHŸI¡ÿy�ÿ,ÿWÿ3ÿ3ÿ)×ÿHÿ1ÿ7nÿÛþÊÿÑÿýÿäÿuÿ'Ù&BÐÿóÿgÿ5çÿ…ÿå~¨ÿ†�ÿ&(~ŸÿÿÿöÿªÿCéÿÇÏÿS‰Ž#%gþ4ïÈ­ÿÒÿsÿõþPÿ‚C[ÿon`ÿ(ºÿ%ãþÿËÿ ÿÀÿP)(yÿ Áÿ-ïÿ�ÿ«ÿÊÿ®ÿðÿêÿTÿ™þöÒÿ±¬ýÿ§ø�ÿ½a ÿ3ÿ…ÿ;ÿŽÉòÿ›ÿ=ÿÃþÕþ§—rÿoiYÿäÿÈÿAÿîþ©ÿWc¾ÿMfÿ#Ãÿj¹ÿúýåþѾÿWÿsˆ:åþ©þ–ÿ_pÿ@ˆ¹Uôÿ°ÿŠùþšXÿòþñÿþŠçÿ�ÃÿÀÿ£ÿôÿÊÿÖÿ'âÿ_ÞÿD§ÿÇÿºÿzeÿ[ÿ¤þŒÿ†ÆþÀÿÌÿõëÿ©™þÔš¥þÒÿÿ[rÿîÿøþeÿ£ÿ•ÿìÿJÿ®Œìÿiÿqÿâÿ,Ëÿéÿ13?EQ.NÿÇ'½þŒþòýBTÄÿ»ÿ¬„ÿÚ+ÿ9{ÿÅÿ¶ÿ°Æÿ�ÿþÿ¤þ^ÿÖðýrÿq¥ÿEþ^“ÿ zÿàÿàþ¥ÿ0eÿõÿ)ÿïÿz[ÿÉ®ÿÓÿdÿ ÿ‰þ‚¦ÿÇÿäï~šÍ?°åÿÿ•ÿÃÿZ˜äÿOÿ¢Mâÿƒþ£™’ÿ¦æþ "5ÿrþ¸ÿ[Šÿ…ÿ ‰ÿ«ÿÉÿØÿþÿÛÿ5ÿ—ýüï�î¾s±Ü1éÿvþw"þ&óÿ’ÿpþ†áÊþ Ýÿ/ÿÆPÿ¯]ÿ'rÿ WÿI¦Àþvy<—8ÿ¥ÿeÿ®ÿ0ÿàoÿƒü»û¾­¬…þÀÿHþo�ÎþÑý˜ŽÿDþ-ÿ_¦ÿ)j†ÿ|Óÿß×ÿÈÿÅÿ†ÿíÿØÿB]æÿ�]Øÿüÿ ¹ÿœÿ×ÿ.dýÿÏýkŸ´ütü¯þ½ÿ#þÑÿ‰ýÜtþ)òþªþ÷þ„ÿßþ›Þÿ%ÿms-ÿ�…dþÀÿõÿQÌÿ˜·½ÿ%Îÿ,„%Wÿðhÿ5‰ÿ+Ûvþ¬þÿýñúÑü·ýÓÿùþ ™þšÿå”þ*ñýWÿ ÿ ªÕüÿJgÿèþÑjßþd ñÿšWÑÿ>{SÿPÙÿäÿi» %.2m¨{þ"ýRü#ÿOÝüñÿüéV�­Ëý8ÿk:ÿyÿ]‹w|†#Ôþgàþ3ÿ_$SÁÿâÿÿRºÿÅÿîÿ™ÿ°xÿù©Õ²þnƒÿÉÚ)qýÐþ¨—õþÿ”Þ3ÄÓXN®áþá­ÿ›«Fç¼ÿåþª–ÿ˜­ÿÓÿ½\ÿÀÿ°ÿ"p0…—ÿ«w¼ÈÉû¾úÌ™Eîû|üS¡ýú×ÿ@ÿþ ,¶Îý:Sÿ,)üyçý¡ºþ¼FÿXÿdÁþßÿõþ?¯áþV@ré2¨Y÷?ÃÅ_ÿèþøÿÄüþ§ÿ0ý ­¡ÊñþóþÈ€ÿïƒ}þèþ[GÿîL„ž_–Xÿ$ÿŽ%5”ÿ®Éÿ £lÿ]NÔÿþØû�û(ú3ø^û5þ¬ûÃÄû¾ÎýÝÿüùŽXÿtkÿ®ùÿðüeÿMüfŸúÆÿu�ÿ<·þ‰ÿEV1ìþ„ÍÛl‡c6ÿ8m{þÒþm\üœÿ#ú›ýÖÿ`ü`ÿbþ þÄý¶üýMþRýìÿ ¹ÿ.ý‡ýkþýèþ½þ³Zÿ`´þ­ÕÿõÿU0ÿø{ÿ$6ÿ‰ÿöþç’ÿ�Œÿè (ûöÅý�ÿ¶öJþü•ù¡þ½û3ÿzÿTþRÅý�üCþÊÿÈûcIýÉüAÿƒÿ›ý8ÿ6þn‹þF§ÿ/œÿ�/ÿc˜ÿ0:ÿQÿ_ÿ¹ÿ´ÿ$YÛúHý>XþrøëÿÐúTÿlþÈû“Lþ)übýÿ~üõ‹ ý‹ÿ0þÇJý`˜þKÿkµü%ýÆdý2ý‚Õý2yÿÄÿ¦þ,¶ý®‚ÿÆÿ�þF™þèæÁýxD ËöÏþ\ù3ý£ÊûÚþŒ‘üøÿýKRÖzü]þŽþŽýüÖÿ¼£½þˆ¸þïÈÿÀÿný�üLþ¡ÿªq>Nsÿ*ÿ¯ü ÿ�þ<þZÿÎÍ †o+ ëã ÿ�ù3Eñ ûdþ8ýÐÂÿ@Aýìù#z÷†þÏúZ`ÿÚèþÆëþ©Òåßý©lòÿ&+ÿdÿ1#ÿ{þ¹ÿ:°_qø}Nnó¢WÍóRv4 ßcHÿT/Bœ¥û,¦ù‡þVøà™PÆÿà@ÿÚþ|þ=K¿þ¶Øþþÿ qÿ¹´@ÿzÿïþp*IüNÍþ™þzùg ^ãÿUÈ ü¥ Ár„ÿîyÿyWÿ��­Ò»ÿ ¤ÒÿÏÿíÿÉü,¥’þ>IþƒÿI@ÿÿ_ÿ ÎÙÿÌÿ—·%í 2ÿÑÿ<ûuú’]ò ÿŒû‰ÿÌÿwÚþróEEÿd„…þ4ÿ¦õ ÿ´Àúÿ¸ÂE�üÿ!+ÿØÿ±þêþ–gÿ•()̈Åýµzÿoú ñ?ûw í¸W…HþN,ÿvAüahúMþþ=ûü¡»ü"ŠýOþúÊšû3çþ¼Ùÿ8ÿëÿÊýyðÿ*A—ÿ ÿßò]"ý²ñÉø _U!;ðóZ /|ÁšÿnÿŽ ’ÇÇýŽ¢þA=¥G= -ý’@¥Cþscÿ~5øÿÿÿuîÿÚýôfúk÷píøìêlehíòÂ�÷A ]ü ýàñ¬û›ªöýÍþ` ¹ü?rXÕþÝÿÊ™Mý‰êÿ_ÿÿÿ£­ÿˆ ÿ!4ÿ'}NþööÅŽ ³ùÿýÝÿûÐþ\þaùsâñvôŸûxù(ÿßùòý¯[xý}"ÿvü¤K•ú}þÑðÿÉÿŒüOüœüŸûôÚü;þl¤h©ÿŒw\üØñ©ý4qA k?ú†V õ¿êó<üÒûõòSý¾ø*þÔNÔZLöþéwþU,ÿ×ÿ[üµþ¿%V®ÿ�þíXÿ«ÿÿ–ÿÆyÿ¿þŒ @§ ÷!ñ‚/ÿy©WõEÖùœü»Áûúâü5‚ q‰†þ<þ`îþë÷ù•ÿD{¥ù‹æú6m$ºþT�ü²ÇþÆþÀÞþ8¸ýLR¯¸Žü5 eöæû™´ö$øO ”ïú ùŠ )ô±ü=€� ÐLø Ðûvÿhúûýhaø.äøˆ÷ýŒÿ×£ûnýö¥ÿ­ÿÊÏüeUöý˜5ýÑ®E ¤ûžÿkÉ ô a QYýåGèûß3þ½’øcèøt�ýà¢ÿÃþKüúƒ÷Q@Ôýi¡ÿÞüpÿ4ßüÀŠF˜þ©rÿ…ÛmÿãvòåôÑõ„÷ ù½ Çû\ù×üˆ¹ü'ü3Müûýú¾ÿ«ÚüVþ þ•ü“ú®ýö�þ¯*¹ý¿ò…ücÿlHþÁjÿxÿzžÖn û'ö6ürþvý8‰”ü$Åû�üu¦ú›ý¶ü\ìêÿŠùÞü3Ñù ûÅùjý,þùý@IþDzÿb˜þFãþ“¦÷ÿ¿þM·ÿùÿ÷þdýüÝ­ú6¾ÿ]ý¤«V‡ú² lûQEü(swüs`ÿñÿÀüèýPÿ”ý˜þ $&¡þŸÃ¹þ¡×þÊ7ÿ�ê6ÿ™ÿÿ?ý¥þu\ýÇýÈþgÿ:þ®fÿ”ûÇ :�ÿx¨Ýÿ óýÈGþA’ÙýPýRþ�þ\nA˜ÿBÊû70ýz9�þ9ÞýÖÿcÿ+þ)ÿ\þ„ÿáþàÿ_ÿ˜øùÆoýkýÔê{6ýÀþ,ÿlÿÏüW¡t.»ýÿÿA»ý�|þÖg¬ÿ»0ž¼ýX}þÿL•Øÿzþ†6ÿýÿ$ÿÿñÿ�þã-ù¯€ÿÁþÂö+5ýWýÿ‘YÿaþŠzXǾþþæòþ�}¨_þ5Jÿv(mÌ\�ÿ,‚Œÿ;ݧ þÇvþõþùíþûú}ý%ýÆÿˆþ†ûÜû;ýÊû˜¹”výMüŽþgÿ¶ÿúÿÿaþÉ×ý"ÿ¸ÿ_RÿnŸ�ñÿ¼ß¿0XØcÿ$ÍÿÛÿë�RÿÈ-Ñÿ%áýâûÊþ"ÑüÕü6ðü �*ý”ÿ¸þ#Uü¿ÿ—ÿPþ;ÿxý‡þòÿ?þWþZ&þø¶ÿ\ÿiÞÿq“Üÿæþ“þ)1žÿCÂ-“ÿÜhÿh×ú*ý¡D%þ÷ýñÿy;»ÿ‡¡wGþ=U7^ýþËý¼¿þ/*WÿW-ÿ*Q©ÿ,ÿÿ“ÿqÿ_ ™ÿÐÿ|ÿLoÿ¬uÿ©ÿz/û…þð_r@þSÿÚþ©øÿf»þ_ý2êÿ[¨óî½þLqvNÿLŠÿ(ùÿÿMÿµþÿ¶ÿ07ÿ8ÿ¦ÿ{­ÿ€ÿ¦ÿÓÿO{ûÎgÛ,:ÿÈ©‘aÕ“ÿ@ËØÿGp±Ýÿ\ÄÿÐþÑþÙ«ÿ(úݧI÷ÿMGÿ¯þµšRÿ]Ûÿ]6eøÿéÿ*Rüñö4ÿ<XÿÍŒý™ÿˆYÿ‘�ÿuéÿa7DJAÿØšêÿšÿšÿ@ÿ<ÿp)ž¶ÿ/èþkÿ5»šõ'ÿ÷íýœGþøþ_ü�þéÿ²ÿíÿÊý›ÿþÿôýNÿûO¦þfV¶þ˜¶ÿ£ÿùÿ1¶[MÿÀþìÿ\ÿåÿXÑ7 sc€E@ÿGûRŒÿnþ"ìþYÿ»û‚ÿ ÿl1þSÿºÿeŠÿïÿLþIÿ®ÿõþðþí‡NÿÉ`ÿÿ@ÿ˜ÿÉÿÉÿêÿõÿžŠÅÿ¤ÿ¥ÿ»ÿûÿ2Y™8”uNNüÜÿ�ÿŽÿ'åÿþ±üûÿÏþaFÿËDÿÿ“þ(Îÿ²hÿ¤4ÿZ ÿÛÿìÿU;CŽÿ»þÿ×þ&F9ÿ5ëÿaÿ»ÿòÿäÿ+:ÿ—�ÿ#ýÚèþäÿTƒü®þþÏ@ ÿ5³?ÿ#ÿÜÖÿ†ÑÁþ~SÿËþ¢þå´mÿ@ ÿ”gÿÿT¤“ÿ� -B¿ÿO~ÿˆÿ`ÿÿ³/Æü³ÒÿXCÿ þr³þùè�QK Jð<­ÿŽkÿ?ÿ_¹ÿðþªþ7³ÿÕþÿáÔÿE-Lÿ­ÿâÿ;úyÿ|‡ÿÌÿ­ÿ Ôÿ@öügÿj*ÓýÄÿÿäGÍÿYóD°À‰­ÿ‰ÿ—þzd?–ÿFwZ ÿ[º–Ñ–ÿÏÿËÿ8MZ¨D‡ÿeÿBÿêÿBÿ?[ý€þ§šzÿÊþÆ?ÿ%£þ`áþP„3€rþåÿr¸Ç=ÿŒþ«þ8Fÿ!Yÿ¶Øÿ}ÌÿÜÿT«ÿzfÿ ºÿýÿe[ž(ÿ—µýîÿÿ"ÊðþGÂÇMÿäÓÿ"## êÿ�¨œÿ±ÿåÿÙþ¶ÿøþÿ¯ÿçÿ9ÿ-›ÿ/óÿ<ÿèÿ–ÿ Èÿ3äÿî#ÿ@ÿ”û‘iÿúÿ§þ‚ÿ·N[ÿsþ´�ÿ*þÑÿÿgÿc÷ÿó§ÿÈp ÿõþÔþvÿR«|�³ÿ¢ L/ãÿtÂÿ+¸ÿsFÿzþ�ü¥ÿ�þÚIý´þ6ÿOÿòý¨ÿ!lþ”ÿUÿuZp}þÐ+Úþ—þÆþÏþŸÿ,Íÿ5[Ýÿ¢ÿàÿËÿúÿ•ÿDÑ‘ÿ$wÿFþ°"ž«ÿký�Mþìþ7Ðÿ¦þóIÿjþFùÿB¸ÿ8ÀÿgÕ�ÿ‹ÿüþùÿÔÿüÿºÿóÿžÿ# ÿ#i²ÿ'_0Zÿ5ÿ½ÿ?ÿÿÞþ4¿þXÿx þåþóþ0©ÿòÿ°ÿ»þ�þµz¾þqÿ»…m!fÿ]ÿ�ÿ%Õÿ ÿ zÿ†*úÿÁÿùÿõÿ°ÿF÷ÿŒÿvÿuWÍÿm/%“ÿ5îÿÊý+ÿáþ†·µÿ�ÿ`ÿ—þùÿÓ½Sÿk‚ÿ7QÂÿ�i^·ÿ,óÿxÿ¤þ¹ÿTTÿ5ÿ™ÿV“ÿüÿâÿÚÿÔÿ¿°3þyÿ[pÿsûþ"ÿ'Áþ7ÿ(Aÿ‰ÿ0ÿÿE³Ðÿ“:|`´ÿB�¹VþÿãÿtÿQÿêÿ šÿZ«ÿBÿóÿ!žÿ>QŒÿ�øþéÿñÿ”‹¸þÈþÿ³Oÿ�ÿ3ÿáÿ–ÿëÿªÿ·õÿûÿOÿ?ÿ>ÿ ™ÿUWÿÿ˜ÿãÿãÿ1žÿ�ÿ—ÿ¢ÿ„ÿa(GL##À§þiÿ�ä²ÿvÿ®O¨V ÿÄÿ­ŽAœFàÿïþÿ‡ÿuÿ6ØÿE%ßÿzÿÞÿÄÿ/Ðÿ½ÿk%”ÿõÿÜÿW.ŒÙÿV dæ´þ%ÿF +ÿ<Àí àt«¾)ÌÿiæþYÿYÿÔÿ ÿÿz–³ÿüÿŒÿ‡ÿÝßÿk X(Àÿ2ûÿL„ÿ Õÿ7þ™TÿNÊ;>ëÿsŽ3ûÿº‘NÛ(ÿ,XÿKt¤19ÿÒÿ²ÿ¹ÿm¬ÿ ÿ=#o³ÿœÿ-Nÿ5VŒÿþáÝÿÒþœàÿ5êÿÈÿÿxåÿß±$Ç•ÿv]\ÿúN‹ÿ¶YÈ/õÿ‹ÿjÿQeÿDcÏÿÌÿ-–ÿÁÿÏÿ;ÿ§ÿ(ÿÃÿqÿTyôÿƒÿÿ§Âÿ5Bøÿÿ¾ÿòÿ«:ÿ–ÿ¿ hÿøÿöÿ<Úÿ33‘¦ÿæ:Ýÿº.Œ+çÿd#ýÿÙÿ úÿjÿ˜Hoÿÿrÿaÿ ÿXÿ(ÿȾÿ­…ÿÑÿ7ÿ&ÿ£ÿèÿÅÿ”ÿ}ÿàÿ‹ÿ{ÿÿÿ"!_ÿ¯]6SÿFðÿ@üÿ4BÄÿºÿXÑÿH‰ÿýµþ¯MÕþÂÿ_œÿ`ÿÊÎÿ‡t8ÿ£ÿQªÿVÿÁÿˆqÿBwf�ÿhíÿ*øÿ ÿ¿ÿw75ûÿöÿåÿ¤ÿ’ÿ0gÿx~ÿÅþž¯ÿIÜÿšuÿžþ©Ãÿ1ÿ$Óÿòÿ°ÿ>ÿl"¹ÿÖ�ÿžHOöÿ±ÿ .¬ÿ§Öÿd\©ÿÈÿäÿ–ÿøÿlÿ”ˆÿvþÿ�ÿ oÿ9‚ÿ¨§þÑÿ6·-ÎþFÿiRÿ�ÿ·;<‹AÿK…ÿ/×>ìÿs�ÿuÓ€ÿ; $âÿ¿ÿÊÿ™ÿ‘ÿöÿÍÿ7æþEÿéþÁÿµÿæÿ-ÿÆv³ÿ·þ­ÿ;¯ÿäÿJ©ÿ>ÿ™ÿ»`ÿ£çÿ€ÿ ÿ>ÿ2Úÿþÿàÿ ?@ŠMDŒÿÓÿ% åÿ…ÿ>®Êÿsÿ5þgÿ´ÿÁþ�ÿ‹åÿ£yÿœÿ5öÿ3³´ÿòÿïÿRÖÿ ÿh†ÿ§ÿêÿ¸ÿ½ÿõÿäÿ*_ÿÑÿÝÿœÿ  ÿ&@éÿE”Óÿ�ÿÀþ}lþ§ÇÏÿè×ÿJÿ[ÿøÿˆòÿœÿöÿÁÿFåÿ¯ÿ¦úf>§ÿ«ÿG%�±ÿ¹ÿÏÿ„ÿ !æÿïÿJÁÿ¬ÿòÿBb;lÿPÁ#¤ÿÿ0ÿPúþ»ÿN¯ÿJâÿ¼ÿ2RÆÿ”30/ÚÿÔÿOdZØÿÚÿY¡ÿãÿÃÿ8,#ÙÿdPgðV‡üb½L˜Eÿÿ9P§ÿ?LgbŽýÿK…§ÿÿòÿ,þÿJÞÿÕÿBÈÿçÿ4ÿÃÿŽÿ#âÿ ØÿÊÿ,3y`–ÿêÿD¤ÿ·”g`ºÿÁA*¥\ñÿa�#Ŭ¾ÿd yÿ¸ÿPÍÿ7~½ÿRÿåÿ¼ÿöÿ ßÿJPaðÿ‰­ÿÆÿ>ÿªÿSˆÿÿêÿðÿ�%–º²ÿ€øÿÀÿÚÿßÿF²…ÿ×ÿ‰ÿNÿ\ÿÀ–ÿ(êÿÒÿõÿûÿ�ÿ¿ÿúÿ,›n#;¤ÿóÿ£þìþ™ÿÈÿ‡ÿ2^ÿºÿÝÿ9Ô¹ÿÿ×LaÿÃÿH_üÿÎþ^.ÿ®ÿ¨ÿÁ¯ÿ&Äÿ¢ÿûÿ¡ÿ¿ÿïÿëÿÑÿ&þÿGÂÿ6­c€ÿ8ÿ†ÿÿmÿ ÿµÿ¼ÿ^ÿÿ®ÿ+‹÷ÿ9 ÿÿÌÿ¸ÿ}ÿ¤ÿ�Jÿ€ÿåÿÆÿÐÿ¯ÿD]•ÿÇÿiQÛÿ­ÿIöÿÿÿ~ÿÃÿÌe¼ÿ£ÿÛÿbÿ™ÿöþwÿuÿAÿˆÿrÿMÿÐÿÀÿ2Œÿ…ÿÏÿÂÿNhÿãÿëÿôÿ¹ÿpÿ>öÿ(Ùÿpžÿvrìÿùÿ3 ýÿ¹ÿïÿÝÿ$™ÿ¹¯ÿ™ÿÓÿbÿ�ÿÿÆÿ_éÿ„ÿ¸þ~ÿOÿŒÿêÿÿàÿ½þ_ÿ³ÿQÿÿñÿ îÿÎÿ8L£üÿ 22Ðÿéÿ³ÿôÿlÿ¹ÿ–«F]ÿüÿ£°ÿx/ÿLŽz�ÿ`ÿNÿ­ÿÐÿRìÿ&õþ¦ÿgÿlJ{>²ÿëÿôÿ‹ÿ-¡äÿûÿòÿüÿáÿÔÿËÿÏÿg!¶qÿÑÿ¨N¦ÿìÿ€ÿ=ÿvèäÿ“ÿ¤ÏÿÕÿëÿÐîÿήÿ&íÿDÿ¸ÿTiµÿùÿùÿ<ëÿ³ÿ ™ÿÖÿYéÿ¡V!�˜óÿÂÿ.»ÿ—çÿµÿP…(áÿt³%¼·âçÿ[ôÿ"Öÿv2øe:€ + EÑÿªÿøÿyþÿ×(àÿ¥_�ÿ49Æÿ´ÿ‹ÿOÛÿ§ÿUÿ¾ÿüÿ #¶ÿÐÝÿñÿ÷ÿ1bÿYÇÿ¬ÿ‚XPÚÿÌÿÞÿßÿ óÿ'Küÿ‚9Eüÿçÿ@Øÿèÿ¥VÿI•ÿQÿH�ÿûÿdpÿ2ïÿ¹ÿ÷ÿÎÿÝÿWÿ ûÿäÿ¥ÿ&ÿSÿÜÿiÿÛÿ8#6)äÿr6Øÿ"ìÿúÿ”|åÿ‹ÿ^<&îÿÿqÿ=.j‘ÿC|*ÿ»ÿÙÿϨôÿrÿ„ÿµÿ³ÿñÿ¬ÿØÿ�ÿ¦ÿÿÿÊÿÖÿüÿ%$™Æÿ¶ÿìÿ“ ¹(xÿßÿS¸ÿtÿŠÿ÷ÿoÿæÿ)CJK¼ÿ¶ÿ`ÿ�ÿ²íÿ‹ÿoÿa\ÿõÿ÷ÿ@ÿmÿåÿÓÿÚÿ 3$ÎÿõÿœÿK:îÿ´Î~×ÿ)`ÿSÿ}ÿ¤ÿ™ÿ8"öÿI1²ÿvD„}ÿQòþÝÿÒÿ<ÿ˜sÿUVÿžÿåÿkÿ±ÿ¾ÿÿv�þÿïÿÏÿñÿâÿµÿ×ÿ´ÿU`Äšo˜ÿA~ÿwÿ}ÿØÿ¥Ef) £ÿTðÄÿlbÿbüÿºÿOËÿc ³ÿêÿÜÿ’æÿõÿÎPB ÛÿÿÿØÿÍÿ'æÿ„ÿdÿüÿ �ÿjÿaÿ¬ÿçEÔÿàÿÁÿ˜ÿÓÿF<Ÿÿ‡ÿƒÿIÿTl%kTñÿd:a7üÿùÿEàÿõÿšÿ=Õÿa.áÿ4ÿkÿ§•Bÿ¶ÿ[täÿùÿ˜ÿhÞÿáÿ\ÍÿÕÿ€ÿ_ÿ„ÿêÿc¶ÿMYO9 ‚5,Fäÿ¹ÿ<íÿæÿåÿaÝÿ§ÿûÿ4úÿ¥QÐÿQ²ÿÄÿ�9 ¨2£ÿs°ÿÉåÿýÿ,9»×ÿˆ‡ðÿèÿDÙÿK/¤ÿúÿêÿúÿÿÿïÿÎÿ¾ÿYÿ³ÿ6ÓÿƒŠÿRýÿcÇÿ�ÿ¦ÿ'gäÿv‡ÿŠÿüÿaÄB�Sëÿ×ÿ58?A#>¹ÿÞÿ6÷ÿ3ûÿ ÎÿÃÿäÿ¸ÿíÿ€tY_Ìÿtèÿ6ÝÿÆÿU,¾ÿæÿƒÿ5ùÿ4¹,0MÓÿÎÿÓÿ5Åÿ*K~2: ãÿ úÿ=âÿâÿi¾¥ÿ5Y»ÿL*�µÿNQ¨ÿF2ìÿUÿºÿvêÿüÿ mƒÿÁÿTÿ¶ÿ'Ïÿìÿ@ÊÿÀÿ^Øÿ¢ÿÞÿÅÿýÿùÿ*çÿ# $n[{íÿ¡ÿ�ÿ}<Ãÿ ÿ»ÿt§âÿ£ÿV'¯ÿ5Âéÿhÿ«ÿŽÿëÿ*ÿlÿíÿ¦ÿóÿaÿÒÿxÿxÿ¡ÿ‹ÿ(Øÿ.Ûÿ"óÿ@Áÿ÷ÿÆÿsByY æÿçÿ€K ÿ"_Lˆ[L+£ÿ%dzÿñÿ5òÿåÿ�ÿ”ÿ¯ÿÎÿôÿ6üÿâÿ¦ÿÙÿ±ÿòÿdÿ„ÿf«ÿòÿm`ªÿÖÿÎÿhÕÿÌÿûÿ5÷ÿÑÿïÿÿÿíÿ:èÿùÿåÿøÿ^óÿÄÿ³ÿÿÿ+C óÿîÿØÿÌÿóÿùÿGÿËÿ¶½ÿ ðÿ:o>ÁÿýÿÉÿ¶ÿ Üÿ¹ÿÞÿèÿ�ÿ-îÿÂÿÎÿÇÿ$cõÿêÿ¹ÿ6ZþÿçÿðÿÜÿóÿ¶ÿ-^ûÿqÿ¿ÿ‰Þÿ-9h:Ÿ/GÒÿ¬ãÿpiýÿIïÿ·ÿ„÷ÿ‚uI&Ûÿ.0ðÿ%(Äÿ6<ôÿôÿÓÿëÿòÿ÷ÿ èÿS9„ÿ|ÿ(úÿÍàÿ5Ûÿðÿh˜ôÿV<-7?æÿûÿt �Bíÿ,"îÿîÿ(ãÿúÿòÿúÿ×ÿöÿöÿðÿA0×ÿ�ÿ‹z)¼ÿ‹ÿ¹ÿZ63ýÿÔÿrfóÿazw©ûÿ 0…,@¹ÿðÿØÿŸCÒÿ ýÿïÿâÿôÿ ßÿÜÿäÿ7TfˆÿúÿæÿüÿbÿN’ÿ±ÿ–ÿbÿÈÿ…I;Òÿ Üÿ$T¡D•ÿo(ýÿïÿõÿ\4¦1:Äÿòÿ ñÿÈÿSÃñöÿ„ÿªÿ>~ÿÿþiÿ¼ÿáÿL´ÿ�ÿÃÿÕÿûÿ¹ÿ!ÛÿaÿÍÿÆÿðÿÙÿ×ÿ'uC¿ÿ2Úÿ$ ëÿ  - ËšÿÇÿ"ÎÿÞÿÔÿ´ÿçÿØÿÎÿÕÿ½ÿóÿûÿ÷ÿìÿíÿáÿÁÿõÿÓÿäÿêÿþÿEþÿÞÿíÿÜÿÿÿ¾ÿ3þÿüÿ-Þÿ¿$µÿãÿðÿ'AìÿPûÿ#$ôÿ¼ÿÏÿÝÿ¥ÿ ÎÿûÿÒÿ(ôÿéÿòÿâÿÉÿãÿ!ýÿ3ßÿåÿÎÿèÿåÿ.èÿ.îÿ%ÐÿÕÿUÿîÿ ˜nI*Ûÿèÿâÿ¡ÿ˜ÿµÿÑÿóÿŸÿÁÿìÿ®ÿÄÿ©ÿëÿÏÿöÿ #æÿäÿÉÿéÿÂÿÐÿóÿ"þÿ!Ãÿ-Îÿuÿÿþ�ÿñÿ7:*S-¿ÿÈÿêÿóÿ.ÍÿÅÿùÿÜÿzÿèÿíÿæÿþÿÒÿ ÏÿËÿ£ÿàÿÍÿ2Ýÿùÿ Öÿ ØÿÅÿVÿÛÿŽÿ�ÿ4 "%îÿ îÿìÿ?×ÿ¤ÿÖÿÎÿ~ÿ<¿ÿÞÿÂÿ×ÿãÿÔÿÚÿ”ÿÐÿýÿ-îÿáÿÿÿÐÿ áÿÞÿ�ÿWÿ¥ÿôÿíÿõÿ¿ÿüÿ áÿK*Ïÿ^*ëÿ3½ÿÁÿžÿRÝÿ1ÙÿÛÿîÿËÿ¶ÿÌÿ(äÿÒÿðÿßÿùÿõÿÞÿ åÿU øÿÂÿÍÿêÿÈÿçÿëÿ$ûÿÄÿ:"F,ÉÿÞÿòÿ&�3! âÿßÿàÿÜÿëÿNøÿÓÿíÿ óÿéÿüÿ ßÿmB"÷ÿU Þÿèÿ7þÿ õÿªÿïÿÝÿt*ÁÿçÿÙÿ!0ýÿ5äÿÙÿA$'æÿúÿ*éÿëÿêÿüÿ~hàÿ:t Üÿûÿàÿ;þÿõÿ-Üÿóÿ*6 ÷ÿîÿH#E9ÿÿìÿ *D&$ ïÿðÿòÿñÿãÿ¹tîÿŠh Íÿ3ÑÿÖÿ2üÿ4"äÿòÿøÿÿÿÞÿäÿ8%pI?1]C1ìÿ)/ûÿÖÿúÿõÿ~,éÿh-ÒÿÚÿÉÿØÿãÿäÿÚÿ êÿáÿóÿ®ÿÃÿüÿ'!-Ïÿõÿìÿ!,9Øÿúÿñÿëÿ ýÿâÿ 'ÚÿøÿT)âÿòÿàÿøÿÑÿÃÿÖÿÈÿÙÿâÿßÿ²ÿ´ÿC Êÿîÿ, õÿÿÿþÿØÿïÿêÿÛÿñÿìÿîÿùÿûÿúÿöÿšÿÔÿêÿÃÿaÍÿËÿÏÿåÿ¼ÿ3úÿ·ÿòÿîÿ! úÿäÿ²ÿñÿÓÿïÿùÿûÿÞÿçÿ åÿäÿâÿþÿãÿïÿìÿ³ÿ‚ÿÛÿ¾ÿ ÙÿÊÿ ëÿÜÿ÷ÿðÿ3 ðÿôÿ$ûÿÕÿÜÿÉÿÀÿçÿÌÿõÿçÿäÿ éÿÝÿéÿÓÿíÿÿÿæÿþÿþÿ óÿóÿÖÿ¾ÿ ýÿËÿ úÿäÿíÿÑÿ"%üÿ =ßÿóÿÇÿàÿàÿòÿ÷ÿõÿÇÿñÿìÿøÿæÿêÿöÿ þÿþÿõÿùÿöÿèÿïÿ8Çÿ¸ÿ+Îÿöÿ)Nèÿ ïÿùÿÌÿÑÿæÿÈÿèÿôÿùÿ Îÿ úÿôÿùÿýÿûÿóÿ÷ÿþÿ÷ÿ úÿþÿÝÿàÿ2Ôÿêÿ%3Þÿ 6Úÿæÿ÷ÿøÿðÿãÿôÿçÿ Òÿ õÿöÿôÿ÷ÿéÿ÷ÿòÿúÿúÿÿÿõÿíÿ$üÿ !úÿ *#ãÿ Ùÿóÿþÿêÿëÿ êÿøÿ  ûÿöÿüÿúÿñÿÿÿûÿíÿûÿ äÿ+  üÿîÿïÿèÿåÿàÿêÿòÿ 'ñÿ÷ÿöÿ÷ÿ îÿÿÿüÿòÿïÿûÿúÿ øÿÿÿÚÿðÿêÿ%ÿÿ õÿäÿöÿÚÿÒÿ-æÿýÿ"ñÿüÿ &ìÿýÿêÿõÿøÿ üÿ÷ÿþÿøÿüÿúÿìÿûÿîÿôÿöÿñÿáÿìÿþÿãÿ,øÿ ÿÿöÿÿÿ) ýÿûÿñÿÿÿùÿþÿ õÿþÿþÿõÿíÿÿÿÿÿþÿÿÿ"!÷ÿ õÿýÿ÷ÿýÿöÿþÿýÿûÿ õÿ ÿÿ÷ÿýÿûÿÿÿ þÿûÿûÿüÿ ùÿûÿøÿùÿõÿôÿîÿøÿûÿþÿ " öÿýÿûÿ ôÿþÿþÿýÿ úÿâÿþÿþÿòÿðÿæÿíÿèÿåÿüÿ îÿ ûÿýÿôÿÿÿúÿ óÿ ÿÿ ùÿðÿêÿîÿîÿòÿïÿêÿïÿàÿùÿóÿ ìÿðÿÿÿóÿöÿñÿ îÿúÿõÿîÿõÿôÿÿÿ øÿúÿöÿ ûÿ÷ÿüÿâÿøÿóÿùÿöÿïÿîÿ ïÿðÿýÿöÿóÿõÿïÿöÿòÿüÿõÿíÿüÿöÿüÿñÿ ýÿ ÿÿùÿþÿ÷ÿúÿ øÿøÿôÿîÿ óÿùÿøÿìÿöÿùÿÿÿþÿöÿÿÿüÿüÿíÿþÿúÿúÿþÿúÿùÿôÿþÿýÿýÿýÿøÿøÿ ôÿýÿþÿøÿ ùÿþÿõÿòÿýÿýÿüÿüÿùÿúÿõÿþÿþÿõÿþÿüÿýÿÿÿýÿýÿûÿýÿüÿ ÿÿþÿÿÿüÿøÿ öÿòÿöÿÿÿýÿÿÿøÿúÿñÿüÿýÿúÿýÿúÿÿÿýÿýÿùÿüÿúÿýÿûÿúÿþÿüÿÿÿüÿõÿùÿ ÷ÿúÿ ûÿÿÿüÿüÿýÿýÿêÿùÿôÿøÿóÿüÿûÿÿÿøÿúÿôÿûÿüÿûÿüÿÿÿþÿþÿýÿöÿþÿ÷ÿüÿõÿöÿúÿöÿ üÿüÿ÷ÿûÿöÿõÿúÿúÿýÿûÿûÿöÿþÿòÿüÿÿÿýÿÿÿÿÿýÿÿÿÿÿÿÿøÿÿÿûÿþÿùÿ÷ÿ ûÿüÿûÿ ÷ÿýÿ÷ÿûÿõÿÿÿ ûÿÿÿüÿüÿ÷ÿÿÿÿÿûÿþÿûÿýÿÿÿúÿÿÿýÿýÿøÿÿÿýÿþÿýÿúÿ÷ÿþÿÿÿúÿüÿÿÿþÿÿÿÿÿþÿþÿúÿüÿúÿÿÿýÿûÿûÿûÿÿÿüÿþÿýÿþÿÿÿÿÿþÿýÿüÿþÿýÿÿÿþÿúÿüÿþÿúÿûÿþÿÿÿÿÿþÿþÿûÿýÿþÿþÿÿÿþÿÿÿþÿþÿþÿüÿýÿýÿÿÿþÿþÿýÿúÿýÿÿÿýÿÿÿûÿþÿþÿÿÿÿÿüÿþÿþÿþÿÿÿÿÿþÿÿÿÿÿÿÿþÿþÿþÿÿÿÿÿþÿÿÿþÿüÿþÿþÿÿÿþÿýÿþÿýÿþÿþÿÿÿüÿÿÿÿÿÿÿýÿÿÿÿÿþÿÿÿÿÿþÿþÿþÿÿÿýÿþÿýÿýÿþÿÿÿÿÿþÿýÿÿÿÿÿÿÿüÿÿÿþÿþÿÿÿþÿþÿÿÿÿÿÿÿþÿÿÿýÿÿÿÿÿþÿÿÿþÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿýÿÿÿÿÿýÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿÿþÿþÿþÿþÿÿÿþÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿþÿÿÿþÿýÿþÿþÿÿÿÿÿþÿÿÿþÿÿÿÿÿÿÿþÿþÿÿÿþÿÿÿÿÿþÿÿÿýÿþÿýÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿþÿÿÿþÿÿÿþÿÿÿÿÿÿÿÿÿþÿþÿþÿþÿÿÿþÿÿÿþÿÿÿþÿþÿÿÿÿÿþÿÿÿÿÿþÿþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿþÿþÿÿÿÿÿþÿÿÿÿÿÿÿÿÿþÿþÿþÿþÿþÿÿÿþÿþÿÿÿþÿþÿÿÿÿÿÿÿÿÿÿÿþÿÿÿþÿÿÿÿÿþÿÿÿþÿþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿþÿÿÿþÿÿÿþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/BinauralDecoder/Source/IRs/irsOrd1.wavIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/BinauralDecoder/Source/IRs/irsOrd1.w0000664002537200253720000000361415257173642031326 0ustar zmoelnigzmoelnigRIFF„WAVEfmt D¬ bdata`øÿøÿèÿäÿîÿ÷ÿåÿåÿôÿ ÷ÿöÿìÿõÿýÿûÿ öÿêÿùÿæÿ øÿîÿ ÿÿþÿúÿ(÷ÿóÿ)þÿòÿ*ôÿ ìÿÿÿöÿðÿêÿçÿðÿëÿáÿ øÿóÿúÿ òÿùÿøÿæÿêÿïÿñÿñÿöÿáÿëÿøÿùÿÐÿÚÿÅÿÕÿÏÿêÿ÷ÿÞÿêÿðÿùÿ' %úÿøÿåÿñÿøÿùÿ áÿæÿ áÿåÿýÿðÿõÿùÿ 71ÚÿßÿCAàÿðÿ3FØÿÝÿ1äÿ¾ÿòÿýÿÅÿúÿÍÿ4 Ôÿ:>'øÿ Næÿôÿ^ ÐÿôÿZúÿ¼ÿÉÿ%ãÿíÿ×ÿÌÿbjŠÿÀÿP~€ÿ´ÿV}�ÿåÿ‚Šªÿ&J?áÿÈÿ¼ÿ ØÿæÿéÿêÿâÿØÿ'Ïÿ×ÿ°ÿUÂÿæÿÕÿ "¼ÿ&îÿóÿ¼ÿ%©ÿƒÿ­ÿÿÿÙÿ—ÿ ÿ<«ÿ:ÿ¨ÿ[8ÿÌþâÿöÿÇÿ~ÿ*îÿéÿËÿQ'Ëÿr'/‚H5l‹9\‰¢WuJÁr�è³VV'„=ôÿ àÿH‰ÿ¬ÿuÿÈÿjÿsoPÿ’ÿµxkÿ`ÿŸ+nÿÄÿ*ýÿãÿX·KÛÿ"ª'ªÿüÿ‡ÿìÿ‡ÿêþÊÿmþþ&+ÿƒÿ_ÿºÿ5ÿŠÿšÿŒÿjÿûÿj—ÿqÀþÔþÆsÙüõüÚÿ[ üŽýÿF/Áµþÿü$ Ïþ¦ÿ�²@ü þnÿ@ÿ¼ÅEwÓ‹0¯ÿ2ÿ”̵ÿSæáýX�dÿ*ü‹g 4“ú ’[ÿ¢• ä þRâ �jüâò7ûØ#ûjO û÷? ¦‰ùÖöÿ[>Vb§&%ñ N zƒÚ`¿÷ õ» uû‚÷ ü~ü�ê'ñ÷ñú$ïšýWõßïüè‰Xùžÿ¨úAIÓ_þéùï«Áù®Pÿ£ýŸÿ–ºÿ¼üã=hüÚ?þÌÁûbû?ïûbýDýXÿàùÃÿ�ñiý©ÿÌÿ6÷5³Œþ� Eû²d¯WûÅÿø…fýÌþßÙ„üKÿ6toû“Èÿ–ü”òô®üŽJ!ü3êÿbü¾ÿ¤¥ý9šª§ý¯+ýZýw×ÿÔü ÀÿÌý¤ÿ ‚þiÿK¿¿þâ1ÿ_ ©eÿÖÿu ±ÿ ÿGôtÿë;ÿËÿ�9qÿšÿ™=iÿ¬ÿÎmÿ»ÿ§ÿÿ�ÿ‰)ÿ±ÿjÿèÿ»ÿtÿLI¸ÿGÿΤÿöÿ-ÿJ3ÿüÿFÿZÿ~ÿÖÿ[ÿV²ÿöÿ¶ÿtÆÿ91“õÿ[w€E/0PULýÿ5dRÿÿûÿíÿ<óÿËÿËÿ{ôÿ#Â8Î8&oÁQkćMƒÆ7,#Nïÿðÿ/\ÐÿÜÿg‰ÂÿìÿinÚÿŒsûÿŽcîÿ @Èÿøÿ�ÿ¯ÿÁÿ¤ÿ�ÿ�ÿ²ÿzÿÿ¯ÿvÿ~ÿàÿ•ÿœÿCªÿÏÿ/ºÿõÿJÍÿ^!ÇÿaÀÿÿÿQêÿ¶ÿÝÿq ±ÿÛÿgþÿ·ÿàÿHÝÿÓÿäÿ@ÜÿòÿûÿCòÿ6ëÿ"">ëÿ VûÿVüÿJêÿ6Ùÿýÿ%àÿûÿÑÿ$ÿÿâÿ0* çÿ5#äÿ#Øÿ ýÿÕÿëÿìÿÅÿ âÿ÷ÿÚÿóÿäÿÚÿ öÿÿÿ&ïÿýÿ ( ÿÿ÷ÿôÿôÿñÿôÿúÿ ýÿ   ýÿüÿýÿ÷ÿðÿñÿôÿýÿðÿæÿçÿöÿêÿâÿÝÿ÷ÿõÿäÿâÿïÿúÿðÿóÿöÿýÿðÿ øÿûÿ././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/BinauralDecoder/Source/IRs/irsOrd3.wavIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/BinauralDecoder/Source/IRs/irsOrd3.w0000664002537200253720000001665415257173642031340 0ustar zmoelnigzmoelnigRIFF¤WAVEfmt D¬€ˆ data€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿþÿþÿþÿÿÿÿÿÿÿþÿÿÿÿÿþÿþÿþÿþÿÿÿÿÿÿÿÿÿÿÿþÿÿÿþÿþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿþÿþÿÿÿÿÿÿÿÿÿþÿÿÿÿÿþÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿþÿÿÿþÿÿÿþÿýÿþÿÿÿÿÿÿÿÿÿÿÿÿÿþÿýÿþÿÿÿþÿþÿÿÿÿÿþÿþÿÿÿýÿýÿÿÿÿÿüÿýÿÿÿþÿýÿÿÿýÿþÿýÿþÿûÿóÿþÿùÿÿÿûÿþÿÿÿøÿõÿøÿôÿùÿóÿøÿòÿüÿùÿñÿûÿúÿüÿýÿòÿîÿýÿñÿìÿþÿýÿøÿøÿûÿþÿýÿÿÿèÿòÿéÿñÿüÿìÿòÿõÿüÿøÿ÷ÿýÿ öÿÿÿÿÿïÿþÿýÿ ûÿðÿúÿúÿþÿ÷ÿÿÿôÿÿÿúÿøÿûÿùÿÿÿ÷ÿùÿðÿùÿøÿìÿêÿôÿøÿòÿ  #õÿíÿüÿöÿúÿõÿðÿöÿ*)òÿêÿåÿêÿüÿøÿÿÿùÿ!öÿÜÿôÿóÿûÿ ýÿ îÿÝÿìÿüÿ ýÿ úÿÖÿÿÿáÿðÿýÿùÿçÿùÿûÿÚÿ ìÿðÿöÿôÿ íÿ òÿðÿñÿûÿçÿ õÿãÿùÿ øÿÿÿþÿäÿÙÿéÿÍÿ)ÿÿóÿõÿóÿàÿÓÿÜÿÁÿ  ñÿþÿñÿØÿßÿ¦ÿÀÿ<+<ØÿÔÿÿÿ÷ÿýÿøÿëÿûÿ"ÙÿUòÿýÿ õÿÙÿðÿÞÿ÷ÿíÿ%L'iøÿ íÿöÿåÿýÿåÿìÿN4@ñÿÿÿÕÿÑÿðÿýÿGýÿ<þÿäÿØÿ äÿ(áÿAFL"ÎÿÕÿÊÿÄÿæÿüÿFAßÿ¼ÿºÿ Îÿ½ÿúÿôÿôÿ3!0ôÿÌÿÏÿêÿÒÿáÿÍÿþÿóÿ>/£ÿ³ÿÊÿîÿïÿÞÿ05 Öÿ¡ÿÂÿHÿ Üÿõÿ3 6+@šÿ¤ÿ€ÿ×ÿzÿLÿðÿ¶ÿ§ÿ,?âÿ=&³ÿÿ£ÿyÿoÿ% ÿÞÿL>òÿ@×ÿÜÿüÿYÿÇÿ‰ÿ¥ÿûÿ'?Óÿ»ÿÃÿ©ÿqÿ�ÿ÷ÿvP­ÿÕÿE‡½ÿÐÿåÿÜÿëÿ˜ÿÅÿG{íÿf6üÿßÿ°ÿÜÿ\FûÿÈÿub1!E RíÿÐÿÑÿDd½K7=AþÿÓÿÂÿÂÿÖÿR…§PÕåúÿïÿ8éÿÄÿÂÿðÿ–ÿ·›¾°úÛÉÿhdØÿ‰ÿÁÿâÿž2 Ó‰)£ÿ“ÿÈGˆÿyÿ¹ÿ?ZðÿÍÿ„NRüÿðÿúÿ‹ÿÖÿ¦ÿ8Ýÿ(+Êÿ�ÿtS,ôÿˆÿ™ÿUüÿ¨ÿhÿ"øÿeöÿÿïÿ/êÿ¥ÿ>=ÿ½ÿOÿ - iÿ3ÿøÿÚÿlÿ�ÿ¡ÿ ÿ@ÿíÿ÷ÿ #pÿ~ÿÈÿCÿÿ?ÿ Kÿ‡ÿ[íÿ/\I-˜ÿ‡ÿ]ÿSÿ ÿÿíÿØÿúÿÂÿNm’ÿíÿ�ÿ\ÿYÿ›ÿabÿ½ÿZ:îÿ(íÿgÿÊÿôÿSÿ“ÿ´ÿ˜ÿ�Øÿ8¡ÿÿ÷ÿ$±ÿØÿ.ªÿ×ÿ�ÿÔÿäÿMRïÿñÿ³ÿ@zÿÚÿ mÿ‰”`z×ÿÁÿîÿ|Üÿ˜ïÿÆÿZ©ÿ.+5ÈÿÝÿÛÿ|ÿ�Lc@ó´ tšÿ]5=¢ÿõÿ§ÿƒÿ FeAÚ¼ÿ¥ÿŶ¥ÿ Èÿ‚ÿ&ð±§þ½¼‘Õÿ˜ÔÿÆÿ}3ýÿôÿz)4 #;×ÿ¾Àÿåÿíÿ¯ÿ5` ÿÿŽÿ�µÿ‰xÿÄ7”ÿ5æÿïÿgÞÿ ÿ`ÿäÿ[ÿÙÿk_ÿ{aÿ·ÿÚÿÿÿßÿöÿišÿ:ÿˆÿ{ÿ%ÿ$ÿÿ«ÿµÿÿÇÿlÿëÿëÿãÿEˆÿƒÿzpÿ/ÿ¡äÿ´ÿ�ÿkÿÚÿfÿ9$lÿ<ÿebÿÿñÿôÿçÿôÿ ©ÿlª-ÿÿQvþáþèÿ…ªBÿCÿ”ãÿ!|¸ÿQÿšÿ !ÿÏÿ@uÿ¶[ÿ˜{ÿ4âÿâÿ”ÿíÿ|ÿCËÿ³ÿ2éÿ¿ðÿÀÿ&!iÿ¨ÿŸÿ!Åj¢ÿw§ÿÍÿÞÿŒÿšÿ!ÿ,ß×¶V,kÿ¦ñþþÿ�ÐÿmñÿyÿøµÿÔ78ÿ´þ›ÿÑ9ôÿ˜ÿ(Æÿ}[ŒõþÜ?,ÿÅÿ[ÿÓÿüÿ>ÿI·ÿéÿØÿiáÿ›Üÿ™p³ÿ�ÿ3Rÿ¾ÿêÿ"øÿîÿÀÿýÿ w§ÿû�=ÿ ^ÿÛkÿÒ::üÿ!zœÿâþ€iÿ$ÿrÿXÅÿhçÿüÿÊÿ�6ÿ”ÿèþ~ÿŽþÿ Èÿlÿž|a&¿ÿyüþoÿÎÿØþéþ�ÑôÿÈÿ¦ÿ`êrÿ©eÿÛÿuÿaÿIÿÿÿ„æRÿ¬EPÿµOÿ€ÿ:Xÿ–¦þÿ>u%Mÿ#ÿŠ�<äÿ¸ÿ.üÿûÿ&#¢Ïÿõ#ÿÏÿT¨ÿ^¤—ÿ…Ûß'…åÿÁÿÿÿ '¾ÿB¨ÿ×ÿs Ží`ÿZÿnÿ?ëÿIAp×ÿî`‘ÿÙ·ÿUÿ‹¢þL²ÿädÿk› DÅúÚþÒÿÓ¯”ÿnþåÿÞÿÊÿÇÿ$/Â9¾øþ’ÿŠüÿaÿ6ÿÄÿOgÄÿÈþIËÿÿå¡ÿ2ÿd•ÿ$²ÿÚTÞÿAÿ¾ÿËÿÉþ rÿÜÿYÿ÷þáÿ¼ÿ5bmÔÿÿ³Wÿrþ“þBÿNÿóÿ-ÿSÿ²‘øÿfrÿÿ!þ€òþýý‹þÿ_ÿ^ÿTÿíÿìÿfzþsÿÿƒþ®þ=ÿf®ÿ�ýÿüÿÞOÿ�¿ÿ?ÿÅþ?ÿßþ“ÿ%ÿTÿYÿSÿ~ÿñÌÿÅðÿ&qÿKÁþ!ÿ”ýLþ§þþGkÿÆþÙÿÞÿJ# ÎÿðýoÿÔþþ.ÿFƶÍýŸÿG Jÿ³ÿÙþRÿ‰ÿl¥ÿXðÙ}ÿ®ÿ¨ÿÍGÌØÿMçþ¹ÿ­˜âÿ:PE`Šºqwÿ ªÿZUÕñÿ”ú�F§#wÞÿ�ÿºÿÅÿЦ°?ÂÜ�:3x•€Ðÿ9jÿ'ÿÖÞqLâz¦½ÿƒ†ÿëÿ³ÐnÝþP‘LÌi¸rÿ†ÿ¨AlMOã°–š–þ·Góþ˜ü&Wÿùÿƒé¶Xÿzþfþ”ÿX‘ëÿúü¦c¹ÌýÉÿýìþ¼þPýØÎý¾ýùýåÿøÿÌ–ýüíýþþKÿÿHþÀúÃ,ÿÏÿ³ÿܶþþFüã>þÕÿ>þjþ.#ÿkþ¼ÿÿüÁ0ÿ;›þ.Æ\ûín:ú ýTûYü3þ]ü~ýÿÿþñÿ“ü›þûÿ§ü”ý) ú¾û¾­þ ÿ ÿ!ÿ]ÿËNûFÿRþJü!ü_þúþ’2þSãÿQÿ¶ÂxúRý¥ý£þ<þ"ÿØö¬ýlÿx¡ÿ„ÂýþÿŒ /ÿá�ÐøÜ:÷Ëþú°þÝþÿgÿ|ÿß Ãùÿ<Õ™ÿûcô�ýÁÿXíþ(ÿjþìúZ\ñÅCþå¾ûxyÿü-þ¾ÿh {Ö ÿý•?éü²bó…ÿ0=ä´60Ûj¶)þ `ÿÏ#ýýÿˆóüZþXÿÖŒ!;•ØùNÿ×ý·ÿŒþï™dÿÝÿêÿ’ù#%{ü…~ÿþý¯ m›þå@ù »ÿù�Ñ~¢úª pöÅÊþøj jçþþ -ôêJôÖô®Þ¼ìòü" ™þ~ RýÝ öþ’#øñÔü(úüùKæþþúÇ óýÐï�úάùž8o�þwdZ Žÿ‘öÜeçø‡ûaaóQþy´ QÿXŽ ¬2óü®üöÿÉüæ 'ùþ®þ˜ýñ r±ró‘ÿÌ NGûþú‘ýmü੼ûz"û“¹…ýýªÎñgðˆ v¾ð3ùýTÙÏûbü�ûÿUêƒÓ©e÷!íÊ óþôõû ôí‹÷Ühùà ÊôÁùæÍìóEVýx‹íéêæ vô£ü¦©ýÜûô Š�þÿ:Júe÷åF1¦ôjyÿ6u´Hù~þ8ªÿh-]oûü’Øûdþ{ÿìøHôÂûA ûŠJü;úxþ!þˆûÛøòÅbŒ«Ô�ýÿKHþ.úPûIqþ]þz¹ü§ýÚøÿügþ]:·ÿ‚úíÈÿþ%ñ åÝûfüF½#\ü‚ÿªÿ|äÿ Úçb´Æÿ‘4þ'ýÿùþ”ümlbüÔTûv?6ÅþšLú9F±ûÕ*ÿ@)…6üªüDþ ú¥ù°þÐþåÿIý)Áþ(ФY�lø“ýöûjü¤ý7þÀý%üÔJÿ:®ÿDÿÄùþüUþCÿ þPÿ]û�ýéþˆþ.ÿþÿn/ûEþG0îþûþÒüþô^þà²þÕåÿ©ÿ%Åù¹ˆÿ‹ÿ°ûÿÿÿ�ü?ÿô¥<l ÿ2ÿ5û±ü¢ò²üòýN­ý$ [&ÿÐÊû4ý±�ÿâùÿ\þj¡ÿÙŠÿ]òþ/&ý�ù§tÚÿ¦ŸþŠÓý«<8Óþ^ÿœEÿÞü¾>›Ìýþ‰|ý—UŸþÿ{ÿÿ¯TBv·þºÿÀÿ„òÿb�ÿ-þçôÿh;‡ºÿ uÿGüÿhwÿ¬LMqü KKÿQ¿›ÿàþ¢|þp€ÿæþ‘þ• R¬5ÿÿ¾þ[çþVÿ×ÿíþ!UÚ÷ýØ;hþR]þ}þ'>ÿñþ»�ÿ4 =ÿ¦üîˆÿCÿØÿ'þFÿ¤þmÿÖÿÿPçþãYºýà}ÿ‘Ìýèÿ¬ÿ�þsÿ`E�wÿÿ,Jþðþ£âÿ&ýRþ{ÿÎÿ[sËÿçÿ;�ýÚü‚ÿÂþÉû¡ÿ'ÿ^ÿ³‰�Áÿ�Sÿsýþÿ$ÿºþ2ÿþøþù½ÿ¥ÿ»ÿPÿ½ÿk…ÿ–þ”úLÿ¸þ £þš³ëÿüÿ7¬ÿxÿ Nþ�þ8ÁÿÄÿ×ÿ«/üKïÿªÿME—ÿÜþÈÿÞÿ×ÿ`U™þFÿüG„ ¿ÿ¼ÿ¤Æ8ÿ±ë¥WEÎÿ&Û6øÿ©ÿòÿýjFÿú‡6—˜ÿ‚ÍÿÿÿÃÿÐw…�*Á¯D«Âÿ*ÿ¨ÿdÃÿëÿôÿS‰ó‡©¯+Qñ#ÿ}Ðÿs6,™Äÿ=‡ÿ_'€ÿáÿžÿÿdBxjþ‘ÿVÿñÿÿËiÿEÿÿÿÿL3�þ”•ÿÃÿiÿ7™ÿbÿ¥þC6˜ÿ8'þÃÿØÿÛÿ ˆÿÿcGyÿÛþÁÿÿÿ7©þ¹ÿuÿBÿeÿ^ÿwÿ·19ÿbs?%ÿ•þ�ÿ—þ*ÿ¾þHÿàÁÿˆÿ@ÿW–/·ÿ¨ÿ…ÿ�þšþœÿvþ:ÿ� m¡Øÿrÿb—ÿ#pþ=ÿ¬ÿÐþ@ÿ/L—l/­ÿ{’ÿíÿU”ÿ ÿqÿÿ,êÿ†åÿI®ÿŸÿA,ÿ·ÿ¶œÿ  ÷ÿ¡€‘ÿÅÿ¶ÿzÿ ¡dÿ+GÔÿèÿÄÿ€[Ðÿx«ÿ°ÿ4`µÅÿÄŒvÿ…ÿäÿªÿ3Þÿáÿ3žÂ•ÐZËÿûÿ½ÿ)‰ÿ�ÿ£ÿð,üû¯•Mÿ'ƒÿ9îÿ�ÿÄÿ4÷–®Ðÿ„áÿŽÿv#¦ÿ¬ÿßÿ‰ÿéÿ¦Áÿÿ?œÿ/ÿP}ÿ·ÿHÿsÿ§ÿæÿ‹ÿ!Hžÿ\ÿE¬ÿrÿª yÿeÿFÿkÿ—ÿÅÿ“ÿnÿ_ÿmÿÔÿ ÿ�ÿÿ®ÿÔÿ|ÿ]ÿÓÿ¥ÿìÿQæþpÿµÿÿ‚9¥ÿÿ•ÿþÿúÿ¸ÿ×ÿûÿ”ÿ8ÿýÿÛ»ÿD`»ÿGCÿTÆÿüÿ»ÿ'gÿ†3F ñÿÐÿSM¾)-eãÿ&úÿåÿ»ÿ<Éÿ›ÿÆÿÖÿ/ ñÿX ‘}âÿyi´ÿˆPÿ!:C–ÿxàc�áÇ|ÿ)…äÿäÿÝÿÊÿrÏB�¤‡òÿAâÿ~ßÿ4ñÿ2±�£’‘8Ýÿáÿ'BÄÐõÿðx>B/ýÿ2"ÿÿ}ª? ÿu¯ÿòÿ\çÿkþÿ¼ÿKÀ!õÿìÿ!‡ÿùÿÚÿÒÿ¯ÿ�ÿR‚×ÿÊÿ¦ÿ<ðÿÁÿ¯ÿÒÿ C&!µÿ#ÿÔÿ�ÿŠÿûÿzÿH™ÿéÿ,4I¢ÿpÿCÿ2ÿ5ÿÉÿJÜÿ¡ÿ•ÿèÿ;/iÿ|ÿkÿÿŒÿ¶ÿ7�ÿÑÿ'¸ÿôÿÿÿ ÚÿRÿVÿáÿ#ëÿâÿHÿÿüÿ ëÿËÿ1>¹ÿ�ÿäÿºáÿ'Ñÿ 1óÿ·ÿáÿBh×ÿ|ÿdüÿ€Äÿ�"&¶ÿ‡{ïÿ¡ÿA‘HF'DDøÿ ¹ÿ·{ëÿ~†O7!0 ôÿáÿŽD;•ˆZ>öÿþÿÀÿeöÿL€¥g úÿ'ÔÿÁÿýÿ"Ðÿ…øÿ0�k0êÿ6ÜÿÉÿ&ªÿ?éÿñÿÒÿîÿéÿïÿªÿ ,Øÿ¡ÿáÿÍÿ×ÿøÿñÿÍÿ¿ÿþÿØÿþÿ"÷ÿüÿ¹ÿÒÿÆÿ³ÿÈÿÉÿüÿàÿÅÿøÿÆÿ¼ÿèÿµÿ—ÿçÿÊÿðÿÕÿéÿñÿÃÿ ÿ±ÿ¥ÿªÿ”ÿÏÿéÿçÿÕÿýÿçÿíÿîÿõÿéÿ£ÿ¼ÿÐÿŸÿâÿáÿÑÿëÿøÿûÿúÿòÿðÿüÿ°ÿÐÿÐÿÛÿëÿéÿãÿûÿæÿàÿùÿ ÍÿÒÿæÿóÿéÿñÿÙÿ"òÿíÿçÿ4=ìÿ"8 Õÿ1øÿáÿÙÿJ=0C2ýÿ1øÿöÿíÿüÿ7$***ÿÿöÿúÿÿÿ .&'<ÿÿøÿýÿòÿñÿþÿ' ..&) úÿûÿýÿ éÿ-( ) ùÿïÿ÷ÿüÿøÿþÿûÿêÿ0ÿÿõÿþÿíÿ÷ÿ ùÿÞÿ÷ÿùÿúÿþÿùÿçÿøÿ ñÿØÿýÿúÿëÿëÿþÿñÿ þÿîÿóÿþÿþÿ áÿÝÿýÿëÿéÿíÿ÷ÿùÿöÿõÿ÷ÿõÿûÿÿÿéÿðÿüÿóÿöÿîÿêÿöÿöÿþÿùÿóÿüÿýÿúÿþÿòÿ÷ÿøÿïÿöÿöÿüÿþÿúÿÿÿþÿûÿðÿùÿ÷ÿñÿõÿýÿüÿÿÿþÿþÿüÿÿÿ øÿöÿýÿøÿþÿöÿýÿÿÿúÿ ÷ÿþÿýÿüÿþÿüÿüÿ ûÿÿÿþÿüÿýÿÿÿÿÿÿÿÿÿþÿýÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿýÿÿÿþÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿþÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿþÿÿÿÿÿÿÿþÿþÿÿÿþÿþÿþÿÿÿÿÿþÿþÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/BinauralDecoder/Source/IRs/README.txtIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/BinauralDecoder/Source/IRs/README.tx0000664002537200253720000000124315257173642031121 0ustar zmoelnigzmoelnigThese impulse responses are part of the IEM plug-in suite: https://plugins-iem.at They were created using KU100 HRIR measurements presented in [1] and the rendering approach proposed in [2]. [1] Bernschütz, Benjamin. "A Spherical Far Field HRIR/HRTF Compilation of the Neumann KU 100", Proceedings of the 40th Italian (AIA) Annual Conference on Acoustics and the 39th German Annual Conference on Acoustics (DAGA) Conference on Acoustics. 2013. http://audiogroup.web.th-koeln.de/ku100hrir.html [2] Schoerkhuber, Christian; Zaunschirm, Markus; Hoeldrich, Robert. "Binaural Rendering of Ambisonic Signals via Magnitude Least Squares", Fortschritte der Akustik, DAGA, 2018 IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/BinauralDecoder/CMakeLists.txt0000664002537200253720000000640415257173642030416 0ustar zmoelnigzmoelnigset (PLUGIN_TARGET "") if (IEM_FORMATS) juce_add_plugin (BinauralDecoder PLUGIN_MANUFACTURER_CODE IEMA PLUGIN_CODE BiDe ICON_BIG "../resources/Standalone/IEMPluginSuiteSmall.png" ICON_SMALL "../resources/Standalone/IEMPluginSuiteSmall.png" COMPANY_NAME "IEM" PRODUCT_NAME "BinauralDecoder" FORMATS ${IEM_FORMATS} VERSION ${BinauralDecoder_VERSION} LV2URI "http://plugins.iem.at/BinauralDecoder" VST2_CATEGORY kPlugSurroundFx kPlugCategSpacializer VST3_CATEGORIES Spatial Surround Up-Downmix AAX_CATEGORY SoundField) list (APPEND PLUGIN_TARGET BinauralDecoder) endif() juce_add_binary_data (BinauralDecoderEQs HEADER_NAME "EQData.h" NAMESPACE EQData SOURCES Source/EQ/AKG-K141MK2.wav Source/EQ/AKG-K240DF.wav Source/EQ/AKG-K240MK2.wav Source/EQ/AKG-K271MK2.wav Source/EQ/AKG-K271STUDIO.wav Source/EQ/AKG-K601.wav Source/EQ/AKG-K701.wav Source/EQ/AKG-K702.wav Source/EQ/AKG-K1000-Closed.wav Source/EQ/AKG-K1000-Open.wav Source/EQ/AudioTechnica-ATH-M50.wav Source/EQ/Beyerdynamic-DT250.wav Source/EQ/Beyerdynamic-DT770PRO-250Ohms.wav Source/EQ/Beyerdynamic-DT880.wav Source/EQ/Beyerdynamic-DT990PRO.wav Source/EQ/Presonus-HD7.wav Source/EQ/Sennheiser-HD430.wav Source/EQ/Sennheiser-HD560ovationII.wav Source/EQ/Sennheiser-HD480.wav Source/EQ/Sennheiser-HD565ovation.wav Source/EQ/Sennheiser-HD600.wav Source/EQ/Sennheiser-HD650.wav Source/EQ/SHURE-SRH940.wav) juce_add_binary_data (BinauralDecoderIRs HEADER_NAME "IRData.h" NAMESPACE IRData SOURCES Source/IRs/irsOrd1.wav Source/IRs/irsOrd7.wav Source/IRs/irsOrd6.wav Source/IRs/irsOrd5.wav Source/IRs/irsOrd4.wav Source/IRs/irsOrd3.wav Source/IRs/irsOrd2.wav) foreach (TARGET IN LISTS PLUGIN_TARGET) juce_generate_juce_header(${TARGET}) target_sources (${TARGET} PRIVATE Source/PluginEditor.cpp Source/PluginEditor.h Source/PluginProcessor.cpp Source/PluginProcessor.h ../resources/OSC/OSCInputStream.h ../resources/OSC/OSCParameterInterface.cpp ../resources/OSC/OSCParameterInterface.h ../resources/OSC/OSCStatus.cpp ../resources/OSC/OSCStatus.h ../resources/OSC/OSCUtilities.h ../resources/efficientSHvanilla.cpp ) target_compile_definitions (${TARGET} PRIVATE JUCE_USE_CURL=0 JUCE_WEB_BROWSER=0 JUCE_USE_CUSTOM_PLUGIN_STANDALONE_APP=1 JUCE_USE_FLAC=0 JUCE_USE_OGGVORBIS=0 JUCE_USE_MP3AUDIOFORMAT=0 JUCE_USE_LAME_AUDIO_FORMAT=0 JUCE_USE_WINDOWS_MEDIA_FORMAT=0 JUCE_VST3_CAN_REPLACE_VST2=0) target_include_directories (${TARGET} PRIVATE Source) target_link_libraries (${TARGET} PRIVATE LAF_fonts IEM_logo BinauralDecoderEQs BinauralDecoderIRs juce::juce_audio_utils juce::juce_audio_plugin_client juce::juce_osc juce::juce_dsp juce::juce_opengl juce::juce_recommended_config_flags juce::juce_recommended_lto_flags) endforeach()IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/_PluginTemplate/0000775002537200253720000000000015257173642025720 5ustar zmoelnigzmoelnigIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/_PluginTemplate/howTo.md0000664002537200253720000000402115257173642027337 0ustar zmoelnigzmoelnig# How to use the PluginTemplate ## Copy and rename files - make a copy of the folder "_PluginTemplate" - rename it to any desired plug-in name. - the plug-in's name should be composed of two words with capitals (eg. NicestPlugin, SuperDecoder, HolyGrail) ## Change project settings In order to be able to integrate your Plug-In into the Suite, [CMake](https://cmake.org) should be used for new projects instead of the (deprecated) Projucer. A brief documentation of the CMake API in JUCE can be found in its [repository](https://github.com/juce-framework/JUCE/blob/ba8d5e3e1cc58b6666565e068854991f15ab231b/docs/CMake%20API.md). The usage with the IEM Audioplugins is described in the [readme](https://git.iem.at/audioplugins/IEMPluginSuite#compilation-guide) A few general settings in `CMakeLists.txt`: - Replace all occurrences of `PluginTemplate` with the name of your plug-In - The `PLUGIN_CODE` should resemble the first two letters of the two words of the plug-in's name (eg. NiPl, SuDe, HoGr) - Set an appropriate `VERSION` - If needed: Add additional source files in `target_sources`, eg. `../resources/efficientSHvanilla.cpp` will most likely be necessary for Ambisonics stuff - If needed: You can easily [link libraries](https://cmake.org/cmake/help/v3.15/command/target_link_libraries.html) with CMake! For development and debugging of a single plug-in, you may want to add your plug-in to the `CMakeLists.txt` in the root directory and comment all other plug-ins out. ## Change file content There are four main files in the `Source` directory: - `PluginEditor.cpp` - `PluginEditor.h` - `PluginProcessor.cpp` - `PluginProcessor.h` Each of them has to be changed: - replace the author name (`Daniel Rudrich`) with your name (or names if several persons are working together) - replace every appearance of `PluginTemplate` with your plug-in's name (eg. `PluginTemplateAudioProcessor` -> `NicestPluginAudioProcessor`) Change the TitleText in `PluginEditor.cpp` to your plug-in's name (eg. `title.setTitle(String("Nicest"),String("Plugin"));`)IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/_PluginTemplate/Source/0000775002537200253720000000000015257173642027160 5ustar zmoelnigzmoelnig././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/_PluginTemplate/Source/PluginProcessor.cppIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/_PluginTemplate/Source/PluginProcess0000664002537200253720000002434215257173642031705 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #include "PluginProcessor.h" #include "PluginEditor.h" //============================================================================== PluginTemplateAudioProcessor::PluginTemplateAudioProcessor() : AudioProcessorBase ( #ifndef JucePlugin_PreferredChannelConfigurations BusesProperties() #if ! JucePlugin_IsMidiEffect #if ! JucePlugin_IsSynth .withInput ("Input", juce::AudioChannelSet::discreteChannels (10), true) #endif .withOutput ("Output", juce::AudioChannelSet::ambisonic (7), true) #endif , #endif createParameterLayout()) { // get pointers to the parameters inputChannelsSetting = parameters.getRawParameterValue ("inputChannelsSetting"); outputOrderSetting = parameters.getRawParameterValue ("outputOrderSetting"); useSN3D = parameters.getRawParameterValue ("useSN3D"); param1 = parameters.getRawParameterValue ("param1"); param2 = parameters.getRawParameterValue ("param2"); // add listeners to parameter changes parameters.addParameterListener ("inputChannelsSetting", this); parameters.addParameterListener ("outputOrderSetting", this); parameters.addParameterListener ("useSN3D", this); parameters.addParameterListener ("param1", this); parameters.addParameterListener ("param2", this); } PluginTemplateAudioProcessor::~PluginTemplateAudioProcessor() { } //============================================================================== int PluginTemplateAudioProcessor::getNumPrograms() { return 1; // NB: some hosts don't cope very well if you tell them there are 0 programs, // so this should be at least 1, even if you're not really implementing programs. } int PluginTemplateAudioProcessor::getCurrentProgram() { return 0; } void PluginTemplateAudioProcessor::setCurrentProgram (int index) { juce::ignoreUnused (index); } const juce::String PluginTemplateAudioProcessor::getProgramName (int index) { juce::ignoreUnused (index); return {}; } void PluginTemplateAudioProcessor::changeProgramName (int index, const juce::String& newName) { juce::ignoreUnused (index, newName); } //============================================================================== void PluginTemplateAudioProcessor::prepareToPlay (double sampleRate, int samplesPerBlock) { checkInputAndOutput (this, static_cast (*inputChannelsSetting), static_cast (*outputOrderSetting), true); // Use this method as the place to do any pre-playback // initialisation that you need.. juce::ignoreUnused (sampleRate, samplesPerBlock); } void PluginTemplateAudioProcessor::releaseResources() { // When playback stops, you can use this as an opportunity to free up any // spare memory, etc. } void PluginTemplateAudioProcessor::processBlock (juce::AudioSampleBuffer& buffer, juce::MidiBuffer&) { checkInputAndOutput (this, static_cast (*inputChannelsSetting), static_cast (*outputOrderSetting), false); juce::ScopedNoDenormals noDenormals; const int totalNumInputChannels = getTotalNumInputChannels(); const int totalNumOutputChannels = getTotalNumOutputChannels(); // In case we have more outputs than inputs, this code clears any output // channels that didn't contain input data, (because these aren't // guaranteed to be empty - they may contain garbage). // This is here to avoid people getting screaming feedback // when they first compile a plugin, but obviously you don't need to keep // this code if your algorithm always overwrites all the output channels. for (int i = totalNumInputChannels; i < totalNumOutputChannels; ++i) buffer.clear (i, 0, buffer.getNumSamples()); // This is the place where you'd normally do the guts of your plugin's // audio processing... for (int channel = 0; channel < totalNumInputChannels; ++channel) { float* channelData = buffer.getWritePointer (channel); juce::ignoreUnused (channelData); // ..do something to the data... } } //============================================================================== bool PluginTemplateAudioProcessor::hasEditor() const { return true; // (change this to false if you choose to not supply an editor) } juce::AudioProcessorEditor* PluginTemplateAudioProcessor::createEditor() { return new PluginTemplateAudioProcessorEditor (*this, parameters); } //============================================================================== void PluginTemplateAudioProcessor::getStateInformation (juce::MemoryBlock& destData) { auto state = parameters.copyState(); auto oscConfig = state.getOrCreateChildWithName ("OSCConfig", nullptr); oscConfig.copyPropertiesFrom (oscParameterInterface.getConfig(), nullptr); std::unique_ptr xml (state.createXml()); copyXmlToBinary (*xml, destData); } void PluginTemplateAudioProcessor::setStateInformation (const void* data, int sizeInBytes) { // You should use this method to restore your parameters from this memory block, // whose contents will have been created by the getStateInformation() call. std::unique_ptr xmlState (getXmlFromBinary (data, sizeInBytes)); if (xmlState.get() != nullptr) if (xmlState->hasTagName (parameters.state.getType())) { parameters.replaceState (juce::ValueTree::fromXml (*xmlState)); if (parameters.state.hasProperty ("OSCPort")) // legacy { oscParameterInterface.getOSCReceiver().connect ( parameters.state.getProperty ("OSCPort", juce::var (-1))); parameters.state.removeProperty ("OSCPort", nullptr); } auto oscConfig = parameters.state.getChildWithName ("OSCConfig"); if (oscConfig.isValid()) oscParameterInterface.setConfig (oscConfig); } } //============================================================================== void PluginTemplateAudioProcessor::parameterChanged (const juce::String& parameterID, float newValue) { DBG ("Parameter with ID " << parameterID << " has changed. New value: " << newValue); if (parameterID == "inputChannelsSetting" || parameterID == "outputOrderSetting") userChangedIOSettings = true; } void PluginTemplateAudioProcessor::updateBuffers() { DBG ("IOHelper: input size: " << input.getSize()); DBG ("IOHelper: output size: " << output.getSize()); } //============================================================================== std::vector> PluginTemplateAudioProcessor::createParameterLayout() { // add your audio parameters here std::vector> params; params.push_back (OSCParameterInterface::createParameterTheOldWay ( "inputChannelsSetting", "Number of input channels ", "", juce::NormalisableRange (0.0f, 10.0f, 1.0f), 0.0f, [] (float value) { return value < 0.5f ? "Auto" : juce::String (value); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "outputOrderSetting", "Ambisonic Order", "", juce::NormalisableRange (0.0f, 8.0f, 1.0f), 0.0f, [] (float value) { if (value >= 0.5f && value < 1.5f) return "0th"; else if (value >= 1.5f && value < 2.5f) return "1st"; else if (value >= 2.5f && value < 3.5f) return "2nd"; else if (value >= 3.5f && value < 4.5f) return "3rd"; else if (value >= 4.5f && value < 5.5f) return "4th"; else if (value >= 5.5f && value < 6.5f) return "5th"; else if (value >= 6.5f && value < 7.5f) return "6th"; else if (value >= 7.5f) return "7th"; else return "Auto"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "useSN3D", "Normalization", "", juce::NormalisableRange (0.0f, 1.0f, 1.0f), 1.0f, [] (float value) { if (value >= 0.5f) return "SN3D"; else return "N3D"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "param1", "Parameter 1", "", juce::NormalisableRange (-10.0f, 10.0f, 0.1f), 0.0, [] (float value) { return juce::String (value); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "param2", "Parameter 2", "dB", juce::NormalisableRange (-50.0f, 0.0f, 0.1f), -10.0, [] (float value) { return juce::String (value, 1); }, nullptr)); return params; } //============================================================================== // This creates new instances of the plugin.. juce::AudioProcessor* JUCE_CALLTYPE createPluginFilter() { return new PluginTemplateAudioProcessor(); } ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/_PluginTemplate/Source/PluginEditor.cppIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/_PluginTemplate/Source/PluginEditor.0000664002537200253720000001137415257173642031574 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #include "PluginEditor.h" #include "PluginProcessor.h" //============================================================================== PluginTemplateAudioProcessorEditor::PluginTemplateAudioProcessorEditor ( PluginTemplateAudioProcessor& p, juce::AudioProcessorValueTreeState& vts) : juce::AudioProcessorEditor (&p), audioProcessor (p), valueTreeState (vts), footer (p.getOSCParameterInterface()) { // ============== BEGIN: essentials ====================== // set GUI size and lookAndFeel //setSize(500, 300); // use this to create a fixed-size GUI setResizeLimits (500, 300, 800, 500); // use this to create a resizable GUI setResizable (true, true); setLookAndFeel (&globalLaF); // make title and footer visible, and set the PluginName addAndMakeVisible (&title); title.setTitle (juce::String ("Plugin"), juce::String ("Template")); title.setFont (globalLaF.robotoBold, globalLaF.robotoLight); addAndMakeVisible (&footer); // ============= END: essentials ======================== // create the connection between title component's comboBoxes and parameters cbInputChannelsSettingAttachment.reset ( new ComboBoxAttachment (valueTreeState, "inputChannelsSetting", *title.getInputWidgetPtr()->getChannelsCbPointer())); cbNormalizationSettingAttachment.reset ( new ComboBoxAttachment (valueTreeState, "useSN3D", *title.getOutputWidgetPtr()->getNormCbPointer())); cbOrderSettingAttachment.reset ( new ComboBoxAttachment (valueTreeState, "outputOrderSetting", *title.getOutputWidgetPtr()->getOrderCbPointer())); addAndMakeVisible (slParam1); slParam1Attachment.reset (new SliderAttachment (valueTreeState, "param1", slParam1)); addAndMakeVisible (slParam2); slParam2Attachment.reset (new SliderAttachment (valueTreeState, "param2", slParam2)); // start timer after everything is set up properly startTimer (20); } PluginTemplateAudioProcessorEditor::~PluginTemplateAudioProcessorEditor() { setLookAndFeel (nullptr); } //============================================================================== void PluginTemplateAudioProcessorEditor::paint (juce::Graphics& g) { g.fillAll (globalLaF.ClBackground); } void PluginTemplateAudioProcessorEditor::resized() { // ============ BEGIN: header and footer ============ const int leftRightMargin = 30; const int headerHeight = 60; const int footerHeight = 25; juce::Rectangle area (getLocalBounds()); juce::Rectangle footerArea (area.removeFromBottom (footerHeight)); footer.setBounds (footerArea); area.removeFromLeft (leftRightMargin); area.removeFromRight (leftRightMargin); juce::Rectangle headerArea = area.removeFromTop (headerHeight); title.setBounds (headerArea); area.removeFromTop (10); area.removeFromBottom (5); // =========== END: header and footer ================= // try to not use explicit coordinates to position your GUI components // the removeFrom...() methods are quite handy to create scalable areas // best practice would be the use of flexBoxes... // the following is medium level practice ;-) juce::Rectangle sliderRow = area.removeFromTop (50); slParam1.setBounds (sliderRow.removeFromLeft (150)); slParam2.setBounds (sliderRow.removeFromRight (150)); } void PluginTemplateAudioProcessorEditor::timerCallback() { // === update titleBar widgets according to available input/output channel counts title.setMaxSize (audioProcessor.getMaxSize()); // ========================================== // insert stuff you want to do be done at every timer callback } ././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/_PluginTemplate/Source/PluginProcessor.hIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/_PluginTemplate/Source/PluginProcess0000664002537200253720000000707415257173642031710 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once #include "../../resources/AudioProcessorBase.h" #include "../JuceLibraryCode/JuceHeader.h" #define ProcessorClass PluginTemplateAudioProcessor //============================================================================== class PluginTemplateAudioProcessor : public AudioProcessorBase, IOTypes::Ambisonics<7>> { public: constexpr static int numberOfInputChannels = 10; constexpr static int numberOfOutputChannels = 64; //============================================================================== PluginTemplateAudioProcessor(); ~PluginTemplateAudioProcessor() override; //============================================================================== void prepareToPlay (double sampleRate, int samplesPerBlock) override; void releaseResources() override; void processBlock (juce::AudioSampleBuffer&, juce::MidiBuffer&) override; //============================================================================== juce::AudioProcessorEditor* createEditor() override; bool hasEditor() const override; //============================================================================== int getNumPrograms() override; int getCurrentProgram() override; void setCurrentProgram (int index) override; const juce::String getProgramName (int index) override; void changeProgramName (int index, const juce::String& newName) override; //============================================================================== void getStateInformation (juce::MemoryBlock& destData) override; void setStateInformation (const void* data, int sizeInBytes) override; //============================================================================== void parameterChanged (const juce::String& parameterID, float newValue) override; void updateBuffers() override; // use this to implement a buffer update method //======= Parameters =========================================================== std::vector> createParameterLayout(); //============================================================================== private: //============================================================================== // list of used audio parameters std::atomic* inputChannelsSetting; std::atomic* outputOrderSetting; std::atomic* useSN3D; std::atomic* param1; std::atomic* param2; //============================================================================== JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (PluginTemplateAudioProcessor) }; ././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/_PluginTemplate/Source/PluginEditor.hIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/_PluginTemplate/Source/PluginEditor.0000664002537200253720000000704015257173642031567 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once #include "../JuceLibraryCode/JuceHeader.h" #include "PluginProcessor.h" //Plugin Design Essentials #include "../../resources/customComponents/TitleBar.h" #include "../../resources/lookAndFeel/IEM_LaF.h" //Custom juce::Components #include "../../resources/customComponents/ReverseSlider.h" #include "../../resources/customComponents/SimpleLabel.h" typedef ReverseSlider::SliderAttachment SliderAttachment; // all ReverseSliders will make use of the parameters' valueToText() function typedef juce::AudioProcessorValueTreeState::ComboBoxAttachment ComboBoxAttachment; typedef juce::AudioProcessorValueTreeState::ButtonAttachment ButtonAttachment; //============================================================================== /** */ class PluginTemplateAudioProcessorEditor : public juce::AudioProcessorEditor, private juce::Timer { public: PluginTemplateAudioProcessorEditor (PluginTemplateAudioProcessor&, juce::AudioProcessorValueTreeState&); ~PluginTemplateAudioProcessorEditor() override; //============================================================================== void paint (juce::Graphics&) override; void resized() override; void timerCallback() override; private: // ====================== begin essentials ================== // lookAndFeel class with the IEM plug-in suite design LaF globalLaF; // stored references to the AudioProcessor and juce::ValueTreeState holding all the parameters PluginTemplateAudioProcessor& audioProcessor; juce::AudioProcessorValueTreeState& valueTreeState; /* title and footer component title component can hold different widgets for in- and output: - NoIOWidget (if there's no need for an input or output widget) - AudioChannelsIOWidget - AmbisonicIOWidget - DirectivitiyIOWidget */ TitleBar, AmbisonicIOWidget<>> title; OSCFooter footer; // =============== end essentials ============ // Attachments to create a connection between IOWidgets comboboxes // and the associated parameters std::unique_ptr cbInputChannelsSettingAttachment; std::unique_ptr cbOrderSettingAttachment; std::unique_ptr cbNormalizationSettingAttachment; // Demo stuff juce::Slider slParam1; ReverseSlider slParam2; std::unique_ptr slParam1Attachment, slParam2Attachment; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (PluginTemplateAudioProcessorEditor) }; IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/_PluginTemplate/CMakeLists.txt0000664002537200253720000000404215257173642030460 0ustar zmoelnigzmoelnig set (PLUGIN_TARGET "") if (IEM_FORMATS) juce_add_plugin (PluginTemplate PLUGIN_MANUFACTURER_CODE IEMA PLUGIN_CODE PlTe ICON_BIG "../resources/Standalone/IEMPluginSuiteSmall.png" ICON_SMALL "../resources/Standalone/IEMPluginSuiteSmall.png" COMPANY_NAME "IEM" PRODUCT_NAME "PluginTemplate" FORMATS ${IEM_FORMATS} VERSION ${PluginTemplate_VERSION} # Add version number in Versions.cmake in root directory LV2URI "http://plugins.iem.at/PluginTemplate" VST2_CATEGORY kPlugSurroundFx kPlugCategSpacializer VST3_CATEGORIES Spatial Surround # Add more categories if applicable AAX_CATEGORY AAX_ePlugInCategory_SoundField) list (APPEND PLUGIN_TARGET PluginTemplate) endif() foreach (TARGET IN LISTS PLUGIN_TARGET) juce_generate_juce_header (${TARGET}) target_sources (${TARGET} PRIVATE Source/PluginEditor.cpp Source/PluginEditor.h Source/PluginProcessor.cpp Source/PluginProcessor.h ../resources/OSC/OSCInputStream.h ../resources/OSC/OSCParameterInterface.cpp ../resources/OSC/OSCParameterInterface.h ../resources/OSC/OSCStatus.cpp ../resources/OSC/OSCStatus.h ../resources/OSC/OSCUtilities.h ../resources/efficientSHvanilla.cpp ) target_compile_definitions (${TARGET} PRIVATE JUCE_USE_CURL=0 JUCE_WEB_BROWSER=0 JUCE_USE_CUSTOM_PLUGIN_STANDALONE_APP=1 JUCE_USE_FLAC=0 JUCE_USE_OGGVORBIS=0 JUCE_USE_MP3AUDIOFORMAT=0 JUCE_USE_LAME_AUDIO_FORMAT=0 JUCE_USE_WINDOWS_MEDIA_FORMAT=0 JUCE_VST3_CAN_REPLACE_VST2=0) target_include_directories (${TARGET} PRIVATE Source) target_link_libraries (${TARGET} PRIVATE LAF_fonts IEM_logo juce::juce_audio_utils juce::juce_audio_plugin_client juce::juce_osc juce::juce_dsp juce::juce_opengl juce::juce_recommended_config_flags juce::juce_recommended_lto_flags) endforeach() IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/Versions.cmake0000664002537200253720000000137615257173642025450 0ustar zmoelnigzmoelnigset (IEMPluginSuite_VERISON 1.16.0) set (AllRADecoder_VERISON 0.9.6) set (BinauralDecoder_VERSION 0.6.7) set (CoordinateConverter_VERSION 1.0.0) set (DirectionalCompressor_VERSION 1.3.7) set (DirectivityShaper_VERSION 0.9.0) set (DistanceCompensator_VERSION 0.3.7) set (DualDelay_VERSION 1.0.1) set (EnergyVisualizer_VERSION 1.0.7) set (FdnReverb_VERSION 1.4.0) set (GranularEncoder_VERSION 1.0.3) set (MatrixMultiplier_VERSION 0.3.7) set (MultibandCompressor_VERSION 0.2.7) set (MultiEncoder_VERSION 1.0.5) set (MultiEQ_VERSION 0.3.1) set (OmniCompressor_VERSION 1.4.7) set (ProbeDecoder_VERSION 0.5.7) set (RoomEncoder_VERSION 1.3.7) set (SceneRotator_VERSION 0.4.8) set (SimpleDecoder_VERSION 0.6.0) set (StereoEncoder_VERSION 1.4.7) set (ToolBox_VERSION 0.5.7) IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/_configurationFiles/0000775002537200253720000000000015257173642026620 5ustar zmoelnigzmoelnigIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/_configurationFiles/22_2_NHK.json0000664002537200253720000013572415257173642030673 0ustar zmoelnigzmoelnig{ "Decoder": { "Name": "22.2 NHK", "Description": "AllRAD-decoder for a 22.2 loudspeaker layout with stereo subwoofers.", "ExpectedInputNormalization": "n3d", "Weights": "none", "WeightsAlreadyApplied": false, "Matrix": [ [ 0.03310225531458854675, 0.02213085815310478210, 0.00329327187500894070, 0.04935869947075843811, 0.04125791415572166443, 0.00255896523594856262, -0.02850615978240966797, 0.00575093459337949753, 0.03669725731015205383, 0.05019125342369079590, 0.00513867987319827080, -0.01335488446056842804, -0.00450558494776487350, -0.02932209335267543793, 0.00460679316893219948, 0.01573733240365982056, 0.04703781008720397949, 0.00646721711382269859, -0.01879251003265380859, -0.00215430627577006817, 0.01429620943963527679, -0.00470704445615410805, -0.01608021929860115051, 0.00204958114773035049, -0.00567290885373950005, 0.03457100316882133484, 0.00612456072121858597, -0.01729719899594783783, -0.00269874488003551960, 0.00501938676461577415, 0.00175738334655761719, 0.01036491803824901581, -0.00222560041584074497, -0.00459609273821115494, -0.00073744246037676930, -0.02093969471752643585, 0.01837057247757911682, 0.00447601685300469398, -0.01178452372550964355, -0.00180258171167224646, 0.00439758365973830223, 0.00009518604201730341, -0.00249111512675881386, -0.00006455284892581403, 0.00299044325947761536, -0.00030597543809562922, 0.00249541760422289371, -0.00274001993238925934, -0.02680098079144954681, 0.00422561680898070335, 0.00232662656344473362, -0.00560644594952464104, -0.00037271037581376731, 0.00138937833253294230, -0.00120641395915299654, 0.00010149936861125752, 0.00176326511427760124, 0.00104016705881804228, -0.00139844650402665138, -0.00056882231729105115, 0.00040503434138372540, 0.00485470378771424294, -0.00347903952933847904, -0.02393191121518611908 ], [ 0.03309301659464836121, -0.02212361618876457214, 0.00328899337910115719, 0.04934812337160110474, -0.04124686121940612793, -0.00255928095430135727, -0.02850653789937496185, 0.00574380299076437950, 0.03669396042823791504, -0.05018157139420509338, -0.00513959629461169243, 0.01335685979574918747, -0.00450403336435556412, -0.02933005802333354950, 0.00459884013980627060, 0.01574186049401760101, -0.04703379794955253601, -0.00646815355867147446, 0.01880022697150707245, 0.00215713935904204845, 0.01430578995496034622, -0.00470890058204531670, -0.01608968339860439301, 0.00204071169719099998, -0.00566331483423709869, -0.03457401320338249207, -0.00612479401752352715, 0.01730943657457828522, 0.00270431488752365112, -0.00502449972555041313, 0.00176314439158886671, 0.01037637051194906235, -0.00222897226922214031, -0.00460127880796790123, -0.00074678566306829453, -0.02092973515391349792, -0.01837885379791259766, -0.00447535607963800430, 0.01179682184010744095, 0.00180944753810763359, -0.00440491316840052605, -0.00009698337089503184, -0.00249536125920712948, -0.00005543903898796998, 0.00299534620717167854, -0.00030934464302845299, 0.00249732891097664833, -0.00274913990870118141, -0.02679499238729476929, -0.00423528999090194702, -0.00232533505186438560, 0.00561390444636344910, 0.00037955498555675149, -0.00139474088791757822, 0.00120588857680559158, -0.00010055641905637458, 0.00175938988104462624, 0.00104154692962765694, -0.00138959125615656376, -0.00057026813738048077, 0.00040225358679890633, 0.00486244214698672295, -0.00348754227161407471, -0.02393197081983089447 ], [ 0.01853341981768608093, 0.00000157802560352138, 0.00149224337656050920, 0.03110158629715442657, 0.00000327604311678442, 0.00000157362205754907, -0.01819522865116596222, 0.00306447059847414494, 0.03300305455923080444, 0.00000494017558594351, 0.00000388089893021970, -0.00000038127546986289, -0.00261855730786919594, -0.02337793260812759399, 0.00366533990018069744, 0.03311257064342498779, 0.00000651329173706472, 0.00000648836248728912, 0.00000012177025610072, -0.00000235419065575115, 0.01346801966428756714, -0.00382639002054929733, -0.02090241201221942902, 0.00398839497938752174, 0.03189145401120185852, 0.00000793791332398541, 0.00000902326064533554, 0.00000121429718547006, -0.00000477270123155904, -0.00000131080525989091, 0.00242834654636681080, 0.01552049722522497177, -0.00361467548646032810, -0.01809289865195751190, 0.00407429039478302002, 0.02964567206799983978, 0.00000910795370145934, 0.00001117921601689886, 0.00000249679033004213, -0.00000677494927003863, -0.00000371126316167647, 0.00000196014457287674, -0.00825008191168308258, 0.00278108986094594002, 0.01228373777121305466, -0.00316750677302479744, -0.01501799840480089188, 0.00395779125392436981, 0.02664165943861007690, 0.00000986565009952756, 0.00001272884946956765, 0.00000355492170456273, -0.00000810846995591419, -0.00000646405214865808, 0.00000283495023722935, 0.00000279332812169741, -0.00131282838992774487, -0.00856814533472061157, 0.00201104604639112949, 0.00925428885966539383, -0.00256119272671639919, -0.01180896814912557602, 0.00367458420805633068, 0.02313372865319252014 ], [ 0.12118127197027206421, 0.07807104289531707764, -0.08137162774801254272, -0.09684120118618011475, -0.09999740123748779297, -0.02849675342440605164, 0.00138857949059456587, 0.03787555545568466187, 0.00619027763605117798, 0.06057235971093177795, 0.02979528345167636871, -0.01885635964572429657, -0.00896285567432641983, 0.01268242113292217255, 0.01244819723069667816, 0.04712467268109321594, -0.01013410557061433792, -0.00688927294686436653, 0.01094559580087661743, 0.00147408689372241497, 0.01400792039930820465, 0.00317332241684198380, -0.00443966314196586609, -0.02453578449785709381, -0.04583415389060974121, -0.01059280335903167725, -0.01111993473023176193, -0.00007676894892938435, 0.00965042784810066223, 0.00733115710318088531, 0.00550902029499411583, -0.00002727697392401751, -0.00426260847598314285, -0.00091730413259938359, 0.00937419757246971130, 0.02081814594566822052, 0.00486718025058507919, 0.00961506366729736328, -0.00342602492310106754, -0.01249435357749462128, -0.00649188086390495300, 0.00302884262055158615, -0.00229972903616726398, -0.00932174175977706909, -0.00373574648983776569, -0.00362058868631720543, 0.00047208412433974445, 0.00371843390166759491, -0.00463593937456607819, 0.00270209251902997494, -0.00000847924911795417, 0.00171152956318110228, 0.00453044380992650986, -0.00030973431421443820, -0.00284763518720865250, -0.00130445451941341162, -0.00277726142667233944, -0.00137810886371880770, 0.00085899647092446685, 0.00646687019616365433, 0.00813213456422090530, 0.00435270648449659348, -0.00492006400600075722, 0.00442133285105228424 ], [ 0.12118364870548248291, -0.07807558029890060425, -0.08138324320316314697, -0.09683643281459808350, 0.09999712556600570679, 0.02849839255213737488, 0.00139313517138361931, 0.03788735717535018921, 0.00617882423102855682, -0.06056344881653785706, -0.02980021201074123383, 0.01885871030390262604, -0.00896942894905805588, 0.01268371939659118652, 0.01243626698851585388, 0.04713245108723640442, 0.01012587826699018478, 0.00689991191029548645, -0.01094727590680122375, -0.00146799674257636070, 0.01402355264872312546, 0.00317806960083544254, -0.00444233836606144905, -0.02452692948281764984, -0.04583295434713363647, 0.01059421896934509277, 0.01110695488750934601, 0.00007938260387163609, -0.00965782068669795990, -0.00733615597710013390, 0.00550429383292794228, -0.00003763919812627137, -0.00426531815901398659, -0.00090935698244720697, 0.00937287323176860809, 0.02081602811813354492, -0.00486803613603115082, -0.00960677675902843475, 0.00341564696282148361, 0.01250351872295141220, 0.00649224221706390381, -0.00302624935284256935, -0.00228945142589509487, -0.00932517368346452713, -0.00372885400429368019, -0.00362278008833527565, 0.00046583981020376086, 0.00371170276775956154, -0.00463876128196716309, -0.00269702752120792866, 0.00000987034400168341, -0.00170053949113935232, -0.00453664176166057587, 0.00030660282936878502, 0.00285009364597499371, 0.00129490485414862633, -0.00278982869349420071, -0.00138758076354861259, 0.00086694670608267188, 0.00646185036748647690, 0.00813829060643911362, 0.00434663658961653709, -0.00491241272538900375, 0.00442379293963313103 ], [ 0.03239376097917556763, 0.04422052577137947083, 0.00695387832820415497, 0.02880400605499744415, 0.04852158576250076294, 0.01235512923449277878, -0.02877842448651790619, 0.00605393154546618462, -0.02107596769928932190, 0.00884793326258659363, 0.01217826083302497864, -0.02754659019410610199, -0.01119821611791849136, -0.01899878308176994324, -0.00949344318360090256, -0.04788357391953468323, -0.02935169078409671783, -0.00328151672147214413, -0.02497593127191066742, -0.01356180850416421890, 0.01649706065654754639, -0.00663654366508126259, 0.00854114256799221039, -0.01498617418110370636, -0.02950791083276271820, -0.03257958218455314636, -0.01356818340718746185, -0.00681114383041858673, -0.01000530831515789032, 0.01236012764275074005, 0.00854095350950956345, 0.00976802408695220947, 0.00788411404937505722, 0.01856858655810356140, -0.00301538431085646152, 0.00516654085367918015, -0.01157952193170785904, -0.00684985844418406487, 0.00655257655307650566, 0.00227851769886910915, 0.01013792399317026138, 0.00739157525822520256, -0.00641359621658921242, 0.00353106344118714333, -0.00149057304952293634, 0.00935558881610631943, 0.01250044442713260651, 0.00937040429562330246, 0.02104253694415092468, 0.00525809125974774361, 0.00480114389210939407, 0.00918602850288152695, 0.00642223702743649483, 0.00428482471033930779, 0.00334119237959384918, -0.00359263876453042030, -0.00270127831026911736, -0.00369075755588710308, -0.00298791145905852318, -0.00499613955616950989, 0.00089805043535307050, 0.00303671881556510925, 0.00758116133511066437, 0.01491875015199184418 ], [ 0.03240429982542991638, -0.04423142597079277039, 0.00694913230836391449, 0.02881555259227752686, -0.04853393137454986572, -0.01235094293951988220, -0.02878836356103420258, 0.00604408653452992439, -0.02107239328324794769, -0.00886146072298288345, -0.01216388028115034103, 0.02755512297153472900, -0.01119278743863105774, -0.01900498569011688232, -0.00950185954570770264, -0.04788179695606231689, 0.02933120913803577423, 0.00330292084254324436, 0.02498103864490985870, 0.01356172561645507812, 0.01650167070329189301, -0.00662725232541561127, 0.00854433700442314148, -0.01498022116720676422, -0.02951555512845516205, 0.03256776556372642517, 0.01357894856482744217, 0.00680852355435490608, 0.00999787729233503342, -0.01236360520124435425, 0.00854001939296722412, 0.00976572558283805847, 0.00789691135287284851, 0.01857132092118263245, -0.00299264071509242058, 0.00513805216178297997, 0.01159810647368431091, 0.00684008374810218811, -0.00655629346147179604, -0.00229694764129817486, -0.01013209391385316849, -0.00739711336791515350, -0.00641156360507011414, 0.00352561310864984989, -0.00149835483171045780, 0.00936123821884393692, 0.01249741017818450928, 0.00939283799380064011, 0.02101179957389831543, -0.00522341299802064896, -0.00482024066150188446, -0.00918650440871715546, -0.00644074054434895515, -0.00427029794082045555, -0.00333912228234112263, 0.00359185691922903061, -0.00270316959358751774, -0.00368203083053231239, -0.00300179258920252323, -0.00499422615393996239, 0.00088821270037442446, 0.00303125986829400063, 0.00758860772475600243, 0.01491698529571294785 ], [ 0.11320815980434417725, -0.00000302678904517961, -0.08640217781066894531, -0.11564314365386962891, 0.00000764343712944537, -0.00000698986059433082, 0.00620642350986599922, 0.06042741239070892334, 0.08872661739587783813, -0.00001044098189595388, 0.00001114455335482489, 0.00000513300210513989, -0.00116868526674807072, 0.01712112128734588623, -0.03334476798772811890, -0.06916483491659164429, 0.00001024911853164667, -0.00001310186598857399, -0.00000440136500401422, 0.00000027210737130190, 0.01521136611700057983, -0.00855285022407770157, -0.01512971241027116776, 0.02247256971895694733, 0.04912601038813591003, -0.00000762519448471721, 0.00001328607322648168, -0.00000064649896103219, -0.00000072064295864038, 0.00000435168112744577, 0.00013261711865197867, -0.00789953954517841339, -0.00176238594576716423, 0.00449204863980412483, -0.01346852630376815796, -0.02715717256069183350, 0.00000382212601834908, -0.00001195802997244755, 0.00000739042206987506, 0.00000117436184154940, -0.00000833850754133891, -0.00000376336811314104, -0.00661393534392118454, -0.00551876751706004143, 0.01083910651504993439, 0.00942686107009649277, 0.00317075592465698719, 0.00073457823600620031, 0.01004129182547330856, -0.00000031512138320977, 0.00000954299866862129, -0.00001278098443435738, -0.00000115541365630634, 0.00001021342905005440, 0.00000264064919974771, 0.00000091356218945293, -0.00178405072074383497, 0.00560761149972677231, 0.00070212059654295444, -0.00814006663858890533, -0.01186436694115400314, -0.00236002868041396141, 0.00716022402048110962, -0.00024326800485141575 ], [ 0.12102497369050979614, 0.11477577686309814453, -0.08304928988218307495, -0.01723389700055122375, -0.01011852547526359558, -0.03914003074169158936, 0.00304927444085478783, 0.01004061009734869003, -0.10242468118667602539, -0.07510413229465484619, -0.00978098437190055847, -0.02546575665473937988, -0.00768516073003411293, -0.00548628438264131546, 0.03649863600730895996, 0.01407257094979286194, 0.01135615631937980652, 0.02211514115333557129, 0.00272454461082816124, -0.00089080724865198135, 0.01232680212706327438, 0.00326031143777072430, 0.00511698704212903976, 0.01070878840982913971, 0.04933306947350502014, 0.02400941587984561920, 0.01370012480765581131, 0.00110072700772434473, 0.00652111135423183441, 0.00743640633299946785, 0.00508429994806647301, 0.00591764692217111588, 0.01104772090911865234, 0.00037555117160081863, -0.01441853120923042297, -0.00860813260078430176, -0.00393183389678597450, -0.00432269228622317314, 0.00110732985194772482, 0.01104066334664821625, 0.00293282256461679935, 0.00565836951136589050, -0.00172208633739501238, -0.00564944976940751076, -0.00601623998954892159, -0.00642779469490051270, 0.00342666078358888626, -0.01123249158263206482, -0.00688037322834134102, 0.00368668627925217152, -0.00785307493060827255, 0.00047028998960740864, -0.00480525614693760872, -0.00510504143312573433, -0.00233471719548106194, 0.00068994209868833423, -0.00224527204409241676, -0.00148216297384351492, -0.00323048024438321590, -0.00544178532436490059, -0.01087999809533357620, -0.00252493144944310188, -0.00010722524893935770, 0.00047246369649656117 ], [ 0.12101804465055465698, -0.11476867645978927612, -0.08304852247238159180, -0.01722818799316883087, 0.01011285372078418732, 0.03913991153240203857, 0.00305179692804813385, 0.01004218123853206635, -0.10242519527673721313, 0.07511141896247863770, 0.00977601669728755951, 0.02546193078160285950, -0.00767989736050367355, -0.00548042915761470795, 0.03649460896849632263, 0.01407164894044399261, -0.01136145275086164474, -0.02210596576333045959, -0.00273149018175899982, 0.00088769494323059916, 0.01232782378792762756, 0.00324839726090431213, 0.00511136325076222420, 0.01070540584623813629, 0.04934294149279594421, -0.02401684038341045380, -0.01370403729379177094, -0.00109002331737428904, -0.00650728307664394379, -0.00744476728141307831, 0.00508039398118853569, 0.00591966090723872185, 0.01104756724089384079, 0.00037424592301249504, -0.01440785638988018036, -0.00861788168549537659, 0.00394269824028015137, 0.00431659119203686714, -0.00111479067709296942, -0.01104546803981065750, -0.00293217645958065987, -0.00565041461959481239, -0.00173149944748729467, -0.00565498322248458862, -0.00602011382579803467, -0.00641823327168822289, 0.00343794538639485836, -0.01124369353055953979, -0.00688273832201957703, -0.00368951121345162392, 0.00786620564758777618, -0.00047629678738303483, 0.00479673827067017555, 0.00510751921683549881, 0.00234134518541395664, -0.00068597594508901238, -0.00224431813694536686, -0.00146976823452860117, -0.00322874588891863823, -0.00543785886839032173, -0.01088554505258798599, -0.00254106777720153332, -0.00010471042332937941, 0.00048062860150821507 ], [ 0.03823474794626235962, 0.03187474980950355530, 0.04089117422699928284, 0.03427171707153320312, 0.03653768450021743774, 0.04081404581665992737, 0.01189336646348237991, 0.04275364056229591370, 0.00325565971434116364, 0.02218830399215221405, 0.04993490129709243774, 0.02536705508828163147, -0.01420121919363737106, 0.02482498250901699066, 0.00301166996359825134, -0.01602412201464176178, 0.00490671582520008087, 0.02999027818441390991, 0.03650078549981117249, 0.00373037299141287804, -0.01845825649797916412, 0.00175561464857310057, 0.00000049981491656581, -0.02379847690463066101, -0.01914730481803417206, -0.00574001949280500412, 0.00516914296895265579, 0.02142363972961902618, 0.01339192502200603485, -0.00648570014163851738, -0.00841861125081777573, -0.00743031501770019531, -0.00225081387907266617, -0.02044946886599063873, -0.02678047493100166321, -0.01271659694612026215, -0.00854636449366807938, -0.00868586171418428421, 0.00127533054910600185, 0.00764723354950547218, 0.00072201585862785578, -0.00486515415832400322, -0.00027963044703938067, -0.00406514061614871025, -0.00155360694043338299, -0.01120263524353504181, -0.02044701389968395233, -0.01618387550115585327, -0.00454626558348536491, -0.00652281939983367920, -0.01076653320342302322, -0.00749076716601848602, -0.00239693326875567436, 0.00137506844475865364, 0.00048401401727460325, -0.00102192722260951996, 0.00072872545570135117, 0.00012669610441662371, 0.00048412196338176727, -0.00444584200158715248, -0.00871635042130947113, -0.00963514018803834915, -0.00486033363267779350, 0.00103001715615391731 ], [ 0.03822791576385498047, -0.03186966478824615479, 0.04088449105620384216, 0.03426788374781608582, -0.03653265908360481262, -0.04080950468778610229, 0.01188989076763391495, 0.04275313764810562134, 0.00325486692599952221, -0.02218409255146980286, -0.04993303492665290833, -0.02536479942500591278, -0.01420719083398580551, 0.02483038790524005890, 0.00301250279881060123, -0.01602375134825706482, -0.00490302639082074165, -0.02998798340559005737, -0.03650434687733650208, -0.00372582348063588142, -0.01847072876989841461, 0.00176017137710005045, 0.00000587770318816183, -0.02380034886300563812, -0.01914648525416851044, 0.00574311986565589905, -0.00516308331862092018, -0.02142616547644138336, -0.01339503191411495209, 0.00649569928646087646, -0.00843247398734092712, -0.00743417441844940186, -0.00224194396287202835, -0.02044957503676414490, -0.02678380534052848816, -0.01271522045135498047, 0.00854803062975406647, 0.00869627017527818680, -0.00127208884805440903, -0.00765171553939580917, -0.00072013773024082184, 0.00487778894603252411, -0.00028629839653149247, -0.00407550763338804245, -0.00154729292262345552, -0.01119642145931720734, -0.02044899575412273407, -0.01618505455553531647, -0.00454480201005935669, 0.00652313837781548500, 0.01077846996486186981, 0.00749965710565447807, 0.00239360216073691845, -0.00137783808168023825, -0.00047965475823730230, 0.00103314779698848724, 0.00073176372097805142, 0.00011957731476286426, 0.00048437964869663119, -0.00443928549066185951, -0.00870899297297000885, -0.00963459815829992294, -0.00485669262707233429, 0.00102971738670021296 ], [ 0.04416621848940849304, -0.00000196840733224235, 0.04441894218325614929, 0.05566719919443130493, -0.00000332029890159902, -0.00000162266655934218, 0.00802783016115427017, 0.06569921970367431641, 0.04400639608502388000, -0.00000364653647011437, -0.00000282796668216179, -0.00000009451760973889, -0.01984800957143306732, 0.03262102603912353516, 0.05616516619920730591, 0.03198552876710891724, -0.00000311281064568902, -0.00000269574957201257, -0.00000079875667324814, 0.00000067332200615056, -0.01875725574791431427, -0.00337755866348743439, 0.03541867807507514954, 0.04231523722410202026, 0.02121961861848831177, -0.00000214405281440122, -0.00000121517462048359, -0.00000086875400029385, 0.00000022306319635845, 0.00000056103021961462, -0.00414814334362745285, -0.01206964347511529922, 0.00798735953867435455, 0.02917726151645183563, 0.02824143320322036743, 0.01239884924143552780, -0.00000123533948226395, 0.00000105947685824503, 0.00000018554118241809, -0.00000060809873048129, 0.00000069488305598497, 0.00000001441140540237, 0.00244903960265219212, -0.00228783464990556240, -0.00173095404170453548, 0.00994849111884832382, 0.01965933479368686676, 0.01611355692148208618, 0.00572343263775110245, -0.00000072502302828070, 0.00000314748376695206, 0.00000240639587900660, -0.00000136172241127497, 0.00000028975142640775, 0.00000066525188913147, -0.00000120427637284592, -0.00065475510200485587, 0.00315915746614336967, 0.00284748314879834652, 0.00251126196235418320, 0.00693463068455457687, 0.01041267439723014832, 0.00686440058052539825, 0.00109652744140475988 ], [ 0.07281720638275146484, 0.00000479510708828457, 0.11256048083305358887, 0.00000158623981860728, 0.00000262338312495558, 0.00000748489901525318, 0.11455319076776504517, 0.00000166379084021173, -0.00000170267958310433, 0.00000758178020987543, 0.00000451263395007118, 0.00000681224310028483, 0.09189040958881378174, -0.00000050595411948962, -0.00000308924268210831, -0.00000076674194815496, -0.00000292071240437508, 0.00001504963165643858, 0.00000436275331594516, 0.00000361774209522991, 0.05685766041278839111, -0.00000425718644692097, -0.00000344748195857392, -0.00000150183529967762, 0.00000384549684895319, -0.00000103230252079811, -0.00000655638314128737, 0.00001840779259509873, 0.00000157421288804471, 0.00000069087155907255, 0.02194879762828350067, -0.00000763839307182934, -0.00000242998362409708, -0.00000179261314769974, 0.00000840832399262581, 0.00000162672517944884, 0.00000109700692974002, -0.00000224292762140976, -0.00000952730351855280, 0.00001382416758133331, -0.00000273904629466415, 0.00000057070320735875, -0.00341858575120568275, -0.00000867986818775535, -0.00000061376175608530, -0.00000127483770029357, 0.00001176234582089819, 0.00000408288269682089, -0.00000074871593369608, -0.00000251556730290758, 0.00000284353677670879, -0.00000298471513815457, -0.00000977909439825453, 0.00000187434784493234, -0.00000629932992524118, 0.00000355144538843888, -0.01525186095386743546, -0.00000672792975819902, 0.00000085505195102087, -0.00000008109199001183, 0.00001135606271418510, 0.00000681638539390406, -0.00000182859673714120, -0.00000030995465749584 ], [ 0.04255681112408638000, 0.04173205420374870300, 0.04346428066492080688, -0.03260423988103866577, -0.03937913849949836731, 0.04838372394442558289, 0.00908870156854391098, -0.04135344177484512329, -0.01176848635077476501, 0.00809266697615385056, -0.05251901596784591675, 0.02256275899708271027, -0.01829426735639572144, -0.02511933818459510803, -0.01044798828661441803, 0.02822538092732429504, 0.01356768235564231873, 0.01632467471063137054, -0.03641969338059425354, -0.00429996335878968239, -0.01866151578724384308, -0.00311706238426268101, 0.00066450319718569517, 0.03606395423412322998, -0.01393706444650888443, -0.01132219750434160233, 0.01430916599929332733, 0.01998918130993843079, -0.01139316800981760025, -0.00946002360433340073, -0.00531163858249783516, 0.00666854996234178543, 0.00821592286229133606, 0.02238329127430915833, -0.02186447009444236755, -0.00355935981497168541, 0.00067853479413315654, -0.01525670103728771210, 0.00354918185621500015, 0.01601615920662879944, 0.00055392348440364003, -0.00086133641889318824, 0.00169973995070904493, 0.00450497027486562729, 0.00485236942768096924, 0.00415507657453417778, -0.02004948817193508148, -0.00128066120669245720, 0.00642480840906500816, 0.00256504514254629612, 0.00234015495516359806, -0.01016800384968519211, -0.00661959685385227203, 0.00773026188835501671, -0.00104010058566927910, 0.00334537657909095287, -0.00026996177621185780, 0.00068530446151271462, -0.00250769080594182014, -0.00163134676404297352, -0.01165615394711494446, 0.00466040754690766335, 0.00732497591525316238, -0.00113260210491716862 ], [ 0.04257141426205635071, -0.04174359142780303955, 0.04347521066665649414, -0.03262184560298919678, 0.03938955441117286682, -0.04839505255222320557, 0.00907947029918432236, -0.04137481003999710083, -0.01176173239946365356, -0.00809803884476423264, 0.05253594368696212769, -0.02256058901548385620, -0.01831789687275886536, -0.02512573823332786560, -0.01043687388300895691, 0.02821734733879566193, -0.01355526223778724670, -0.01633682288229465485, 0.03642925620079040527, 0.00431525940075516701, -0.01867849752306938171, -0.00310342013835906982, 0.00067347654839977622, 0.03605738654732704163, -0.01392675563693046570, 0.01130340341478586197, -0.01429543178528547287, -0.01999925449490547180, 0.01138660591095685959, 0.00947435852140188217, -0.00531075987964868546, 0.00668587349355220795, 0.00821567419916391373, 0.02238157205283641815, -0.02185708656907081604, -0.00355823175050318241, -0.00066876353230327368, 0.01523929182440042496, -0.00354460417293012142, -0.01601284556090831757, -0.00056559278164058924, 0.00086713751079514623, 0.00170818588230758905, 0.00450738565996289253, 0.00484438287094235420, 0.00415645306929945946, -0.02004782855510711670, -0.00128087343182414770, 0.00641181739047169685, -0.00256273522973060608, -0.00232900679111480713, 0.01016344223171472549, 0.00661271484568715096, -0.00771739613264799118, 0.00103950570337474346, -0.00333954370580613613, -0.00026695750420913100, 0.00067421921994537115, -0.00251012342050671577, -0.00162596325390040874, -0.01165342703461647034, 0.00465370528399944305, 0.00731671648100018501, -0.00112236768472939730 ], [ 0.04146321862936019897, 0.05115205422043800354, 0.04280475899577140808, 0.00543248094618320465, 0.01005687471479177475, 0.06237914413213729858, 0.00977543648332357407, 0.00422528292983770370, -0.03881517797708511353, -0.02622063457965850830, 0.00899330340325832367, 0.03412314504384994507, -0.01728373952209949493, -0.00146694970317184925, -0.05197246372699737549, -0.01252603624016046524, -0.01252782158553600311, -0.03745229542255401611, -0.00047491249279119074, 0.00029487765277735889, -0.01861651800572872162, -0.00442963140085339546, -0.03637790679931640625, -0.01230998057872056961, 0.01533244457095861435, 0.00714616989716887474, -0.01314484886825084686, -0.02982755005359649658, -0.00701938150450587273, -0.01100792922079563141, -0.00609066197648644447, -0.00175154802855104208, -0.01177202817052602768, -0.00153063470497727394, 0.02318283542990684509, 0.01049940939992666245, 0.00731982337310910225, 0.01162811648100614548, -0.00315893930383026600, -0.01388078741729259491, -0.00426121382042765617, -0.00438014091923832893, 0.00118607981130480766, 0.00211049313656985760, 0.00024263488012365997, 0.00737468153238296509, 0.02015557140111923218, 0.01149313244968652725, -0.00194662902504205704, 0.00055830151541158557, 0.00814121309667825699, 0.01093912869691848755, 0.00616821506991982460, -0.00422541471198201180, 0.00204135640524327755, 0.00125386530999094248, -0.00005853497350472026, 0.00244656740687787533, -0.00100075290538370609, 0.00586561812087893486, 0.01086379773914813995, 0.00358152389526367188, -0.00383815472014248371, -0.00397027423605322838 ], [ 0.04146879911422729492, -0.05115505680441856384, 0.04281285405158996582, 0.00542806135490536690, -0.01005000434815883636, -0.06238571181893348694, 0.00978205259889364243, 0.00421982677653431892, -0.03881289809942245483, 0.02621347270905971527, -0.00898331310600042343, -0.03413049504160881042, -0.01728084683418273926, -0.00146799080539494753, -0.05197319015860557556, -0.01251959241926670074, 0.01252331584692001343, 0.03744679316878318787, 0.00047967347200028598, -0.00029802307835780084, -0.01861553266644477844, -0.00442415662109851837, -0.03638226166367530823, -0.01230059936642646790, 0.01532245147973299026, -0.00713590672239661217, 0.01314011123031377792, 0.02982696518301963806, 0.00701426528394222260, 0.01100881770253181458, -0.00608609383925795555, -0.00174418662209063768, -0.01177495345473289490, -0.00152615038678050041, 0.02317313849925994873, 0.01049686968326568604, -0.00731882173568010330, -0.01161735318601131439, 0.00315957167185842991, 0.01388146635144948959, 0.00425209524109959602, 0.00437660422176122665, 0.00119645532686263323, 0.00211410527117550373, 0.00024265093088615686, 0.00737013574689626694, 0.02015086263418197632, 0.01149354781955480576, -0.00193792022764682770, -0.00056498055346310139, -0.00814465247094631195, -0.01093358825892210007, -0.00616080360487103462, 0.00422636093571782112, -0.00204605516046285629, -0.00126840907614678144, -0.00004962267848895863, 0.00244696461595594883, -0.00100462068803608418, 0.00585822062566876411, 0.01086187828332185745, 0.00358784082345664501, -0.00382868479937314987, -0.00397066259756684303 ], [ 0.05298346653580665588, 0.00000848548370413482, 0.04969559237360954285, -0.06773263961076736450, -0.00001280817923543509, 0.00000739041797714890, 0.00232456275261938572, -0.07484346628189086914, 0.05077829211950302124, 0.00001095926836569561, -0.00001211442395288032, -0.00000034558905781523, -0.02827247977256774902, -0.02899013645946979523, 0.06227054819464683533, -0.03125916421413421631, -0.00000452411268270225, 0.00001039404924085829, -0.00000168355029472878, -0.00000479839854961028, -0.01931094750761985779, 0.01323632895946502686, 0.03513285145163536072, -0.04206258431077003479, 0.01366549450904130936, -0.00000241708198700508, -0.00000222398398364021, 0.00000285380247078137, 0.00000584206600251491, -0.00000164754078468832, 0.00212561874650418758, 0.01545732095837593079, 0.00318697653710842133, -0.02978770248591899872, 0.02102696336805820465, -0.00089506176300346851, 0.00000593861386732897, -0.00000779416677687550, 0.00000024601811787761, -0.00000194711083167931, 0.00000392816127714468, 0.00000394288008465082, 0.00654366286471486092, -0.00288687227293848991, -0.00469856802374124527, -0.01050878595560789108, 0.01889660768210887909, -0.00408558826893568039, -0.00595616362988948822, -0.00000440360463471734, 0.00001370260360999964, -0.00000684525002725422, -0.00000230854175242712, -0.00000103199010936805, -0.00000220993888433441, 0.00000569973417441361, -0.00263694999739527702, -0.00844548083841800690, 0.00427753711119294167, -0.00219392520375549793, 0.01103174686431884766, -0.00735001778230071068, -0.00617626123130321503, 0.00750808184966444969 ], [ 0.08860497921705245972, -0.00000747947433410445, -0.09977780282497406006, 0.04842934012413024902, -0.00001293482728215167, 0.00000538772383151809, 0.04328290000557899475, -0.05197134613990783691, 0.04557596892118453979, -0.00001370072186546167, 0.00000957633892539889, 0.00000180435790753108, 0.00683208042755723000, 0.01767544820904731750, -0.05371300131082534790, 0.03699811547994613647, -0.00001022499054670334, 0.00000986349914455786, 0.00000326969097841356, -0.00000304119248539791, -0.01430520042777061462, 0.01165596395730972290, 0.02682796493172645569, -0.04622834920883178711, 0.02413720823824405670, -0.00000406403114538989, 0.00000627687859378057, 0.00000426427141064778, -0.00000792049377196236, -0.00000396203677155427, -0.00088764715474098921, -0.01052875909954309464, 0.00174345017876476049, 0.02753023430705070496, -0.03072325326502323151, 0.01232710387557744980, 0.00000190461673810205, -0.00000058965662219634, 0.00000399669670514413, -0.00001052573588822270, -0.00000150046832914086, 0.00001006257843982894, 0.00668386043980717659, -0.00419794535264372826, -0.00603555468842387199, -0.00458329962566494942, 0.01942573301494121552, -0.01488498784601688385, 0.00483621750026941299, 0.00000508786524733296, -0.00000780161190050421, 0.00000482265113532776, -0.00000688650425217929, 0.00000236881874116079, 0.00001211616290675011, -0.00000824065227789106, 0.00038853811565786600, 0.00730463443323969841, -0.00439881859347224236, -0.00122335250489413738, -0.00513854529708623886, 0.00827761180698871613, -0.00464855739846825600, 0.00082823954289779067 ], [ 0.08972264081239700317, 0.04567824304103851318, -0.09954756498336791992, 0.03031627275049686432, 0.04928301647305488586, -0.04801107570528984070, 0.04095518216490745544, -0.03178725019097328186, -0.00765838101506233215, 0.02013937197625637054, -0.05819375067949295044, 0.01464220322668552399, 0.00837755575776100159, 0.00964654795825481415, 0.00698326714336872101, -0.02661720104515552521, -0.00526029150933027267, -0.02792088873684406281, 0.02928539924323558807, 0.01271451357752084732, -0.01297695469111204147, 0.00813990551978349686, -0.00073583144694566727, 0.03071047551929950714, -0.01917571760714054108, -0.00897552911192178726, 0.00369363953359425068, 0.02053070999681949615, 0.00160265271551907063, -0.01051816251128911972, -0.00324103306047618389, -0.00594761734828352928, -0.00274786259979009628, -0.01475491095334291458, 0.02472115866839885712, -0.00479494687169790268, -0.00212221173569560051, 0.01087632123380899429, 0.00213136756792664528, -0.00720088230445981026, -0.00655756937339901924, -0.00370339886285364628, 0.00713589088991284370, -0.00407300284132361412, 0.00042535894317552447, -0.00073499255813658237, -0.01574602164328098297, 0.00771573791280388832, 0.00018010413623414934, -0.00004315430123824626, 0.00297173531726002693, -0.00573941646143794060, -0.00499340100213885307, 0.00026016548508778214, -0.00421499833464622498, 0.00602487241849303246, 0.00170039106160402298, 0.00541046401485800743, 0.00220571411773562431, 0.00107139104511588812, 0.00377531629055738449, -0.00708660529926419258, 0.00021930043294560164, -0.00196873885579407215 ], [ 0.08972083032131195068, -0.04567986726760864258, -0.09954183548688888550, 0.03031749650835990906, -0.04928637295961380005, 0.04801104962825775146, 0.04094434529542922974, -0.03178620710968971252, -0.00765990233048796654, -0.02013917639851570129, 0.05819743126630783081, -0.01463609561324119568, 0.00838930625468492508, 0.00964179541915655136, 0.00698654539883136749, -0.02661913819611072540, 0.00526091270148754120, 0.02792080491781234741, -0.02928473241627216339, -0.01272528991103172302, -0.01298376545310020447, 0.00814526341855525970, -0.00073598034214228392, 0.03071626834571361542, -0.01917336508631706238, 0.00897043012082576752, -0.00369631219655275345, -0.02053183317184448242, -0.00160801503807306290, 0.01052524428814649582, -0.00323860393837094307, -0.00595047883689403534, -0.00275407102890312672, -0.01475845556706190109, 0.02472428046166896820, -0.00479073682799935341, 0.00211225450038909912, -0.01087698154151439667, -0.00213006837293505669, 0.00720300106331706047, 0.00656223343685269356, 0.00370388152077794075, 0.00713067315518856049, -0.00407098513096570969, 0.00043130785343237221, -0.00073967204662039876, -0.01575363241136074066, 0.00771688064560294151, 0.00017789939010981470, 0.00003728080992004834, -0.00297193648293614388, 0.00574553618207573891, 0.00499623967334628105, -0.00025990590802393854, 0.00421429518610239029, -0.00602429592981934547, 0.00171170593239367008, 0.00540549727156758308, 0.00220836931839585304, 0.00107919692527502775, 0.00377938733436167240, -0.00709370849654078484, 0.00022295613598544151, -0.00197907793335616589 ], [ 0.02, 0.0115470054, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0.02, -0.0115470054, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ] ], "Routing": [ 1, 2, 3, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 4, 10 ] } } ././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/_configurationFiles/9plus10plus3.jsonIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/_configurationFiles/9plus10plus3.jso0000664002537200253720000001344715257173642031552 0ustar zmoelnigzmoelnig{ "Name": "ITU-R BS.2051-0 Layout H", "Description": "This configuration file was created with the IEM AllRADecoder v0.1.1 plug-in. 5 Apr 2018 12:36:59pm", "LoudspeakerLayout": { "Name": "ITU-R BS.2051-0 Layout H: 9+10+3", "Description": "This layout has 9 loudspeakers in the upper layer, 10 at the horizon and 3 lower layer loudspeakers.", "Loudspeakers": [ { "Azimuth": 180.00000000000000000000, "Elevation": -70.00000000000000000000, "Radius": 1.00000000000000000000, "IsImaginary": true, "Channel": 23, "Gain": 0.00000000000000000000 }, { "Azimuth": -45.00000000000000000000, "Elevation": -30.00000000000000000000, "Radius": 1.00000000000000000000, "IsImaginary": false, "Channel": 22, "Gain": 1.00000000000000000000 }, { "Azimuth": 45.00000000000000000000, "Elevation": -30.00000000000000000000, "Radius": 1.00000000000000000000, "IsImaginary": false, "Channel": 21, "Gain": 1.00000000000000000000 }, { "Azimuth": 0.00000000000000000000, "Elevation": -30.00000000000000000000, "Radius": 1.00000000000000000000, "IsImaginary": false, "Channel": 20, "Gain": 1.00000000000000000000 }, { "Azimuth": 180.00000000000000000000, "Elevation": 0.00000000000000000000, "Radius": 1.00000000000000000000, "IsImaginary": false, "Channel": 10, "Gain": 1.00000000000000000000 }, { "Azimuth": -135.00000000000000000000, "Elevation": 0.00000000000000000000, "Radius": 1.00000000000000000000, "IsImaginary": false, "Channel": 9, "Gain": 1.00000000000000000000 }, { "Azimuth": 135.00000000000000000000, "Elevation": 0.00000000000000000000, "Radius": 1.00000000000000000000, "IsImaginary": false, "Channel": 8, "Gain": 1.00000000000000000000 }, { "Azimuth": -90.00000000000000000000, "Elevation": 0.00000000000000000000, "Radius": 1.00000000000000000000, "IsImaginary": false, "Channel": 7, "Gain": 1.00000000000000000000 }, { "Azimuth": 90.00000000000000000000, "Elevation": 0.00000000000000000000, "Radius": 1.00000000000000000000, "IsImaginary": false, "Channel": 6, "Gain": 1.00000000000000000000 }, { "Azimuth": -60.00000000000000000000, "Elevation": 0.00000000000000000000, "Radius": 1.00000000000000000000, "IsImaginary": false, "Channel": 5, "Gain": 1.00000000000000000000 }, { "Azimuth": 60.00000000000000000000, "Elevation": 0.00000000000000000000, "Radius": 1.00000000000000000000, "IsImaginary": false, "Channel": 4, "Gain": 1.00000000000000000000 }, { "Azimuth": -30.00000000000000000000, "Elevation": 0.00000000000000000000, "Radius": 1.00000000000000000000, "IsImaginary": false, "Channel": 3, "Gain": 1.00000000000000000000 }, { "Azimuth": 30.00000000000000000000, "Elevation": 0.00000000000000000000, "Radius": 1.00000000000000000000, "IsImaginary": false, "Channel": 2, "Gain": 1.00000000000000000000 }, { "Azimuth": 0.00000000000000000000, "Elevation": 0.00000000000000000000, "Radius": 1.00000000000000000000, "IsImaginary": false, "Channel": 1, "Gain": 1.00000000000000000000 }, { "Azimuth": 180.00000000000000000000, "Elevation": 30.00000000000000000000, "Radius": 1.00000000000000000000, "IsImaginary": false, "Channel": 18, "Gain": 1.00000000000000000000 }, { "Azimuth": -135.00000000000000000000, "Elevation": 30.00000000000000000000, "Radius": 1.00000000000000000000, "IsImaginary": false, "Channel": 17, "Gain": 1.00000000000000000000 }, { "Azimuth": 135.00000000000000000000, "Elevation": 30.00000000000000000000, "Radius": 1.00000000000000000000, "IsImaginary": false, "Channel": 16, "Gain": 1.00000000000000000000 }, { "Azimuth": -90.00000000000000000000, "Elevation": 30.00000000000000000000, "Radius": 1.00000000000000000000, "IsImaginary": false, "Channel": 15, "Gain": 1.00000000000000000000 }, { "Azimuth": 90.00000000000000000000, "Elevation": 30.00000000000000000000, "Radius": 1.00000000000000000000, "IsImaginary": false, "Channel": 14, "Gain": 1.00000000000000000000 }, { "Azimuth": -45.00000000000000000000, "Elevation": 30.00000000000000000000, "Radius": 1.00000000000000000000, "IsImaginary": false, "Channel": 13, "Gain": 1.00000000000000000000 }, { "Azimuth": 45.00000000000000000000, "Elevation": 30.00000000000000000000, "Radius": 1.00000000000000000000, "IsImaginary": false, "Channel": 12, "Gain": 1.00000000000000000000 }, { "Azimuth": 0.00000000000000000000, "Elevation": 30.00000000000000000000, "Radius": 1.00000000000000000000, "IsImaginary": false, "Channel": 11, "Gain": 1.00000000000000000000 }, { "Azimuth": 0.00000000000000000000, "Elevation": 90.00000000000000000000, "Radius": 1.00000000000000000000, "IsImaginary": false, "Channel": 19, "Gain": 1.00000000000000000000 } ] } } IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/_configurationFiles/3plus7plus0.json0000664002537200253720000000721315257173642031637 0ustar zmoelnigzmoelnig{ "Name": "ITU-R BS.2051-0 Layout F", "Description": "This configuration file was created with the IEM AllRADecoder v0.1.1 plug-in. 5 Apr 2018 12:06:42pm", "LoudspeakerLayout": { "Name": "ITU-R BS.2051-0 Layout F: 3+7+0", "Description": "This layout has 3 loudspeakers in the upper layer and 7 at the horizon.", "Loudspeakers": [ { "Azimuth": 180.00000000000000000000, "Elevation": -90.00000000000000000000, "Radius": 1.00000000000000000000, "IsImaginary": true, "Channel": 11, "Gain": 0.00000000000000000000 }, { "Azimuth": -130.00000000000000000000, "Elevation": 0.00000000000000000000, "Radius": 1.00000000000000000000, "IsImaginary": false, "Channel": 7, "Gain": 1.00000000000000000000 }, { "Azimuth": 130.00000000000000000000, "Elevation": 0.00000000000000000000, "Radius": 1.00000000000000000000, "IsImaginary": false, "Channel": 6, "Gain": 1.00000000000000000000 }, { "Azimuth": -90.00000000000000000000, "Elevation": 0.00000000000000000000, "Radius": 1.00000000000000000000, "IsImaginary": false, "Channel": 5, "Gain": 1.00000000000000000000 }, { "Azimuth": 90.00000000000000000000, "Elevation": 0.00000000000000000000, "Radius": 1.00000000000000000000, "IsImaginary": false, "Channel": 4, "Gain": 1.00000000000000000000 }, { "Azimuth": -30.00000000000000000000, "Elevation": 0.00000000000000000000, "Radius": 1.00000000000000000000, "IsImaginary": false, "Channel": 2, "Gain": 1.00000000000000000000 }, { "Azimuth": 30.00000000000000000000, "Elevation": 0.00000000000000000000, "Radius": 1.00000000000000000000, "IsImaginary": false, "Channel": 1, "Gain": 1.00000000000000000000 }, { "Azimuth": 0.00000000000000000000, "Elevation": 0.00000000000000000000, "Radius": 1.00000000000000000000, "IsImaginary": false, "Channel": 3, "Gain": 1.00000000000000000000 }, { "Azimuth": -110.00000000000000000000, "Elevation": 20.00000000000000000000, "Radius": 0.80000001192092895508, "IsImaginary": true, "Channel": 13, "Gain": 1.00000000000000000000 }, { "Azimuth": 110.00000000000000000000, "Elevation": 20.00000000000000000000, "Radius": 0.80000001192092895508, "IsImaginary": true, "Channel": 12, "Gain": 1.00000000000000000000 }, { "Azimuth": 180.00000000000000000000, "Elevation": 30.00000000000000000000, "Radius": 1.00000000000000000000, "IsImaginary": false, "Channel": 10, "Gain": 1.00000000000000000000 }, { "Azimuth": -45.00000000000000000000, "Elevation": 30.00000000000000000000, "Radius": 1.00000000000000000000, "IsImaginary": false, "Channel": 9, "Gain": 1.00000000000000000000 }, { "Azimuth": 45.00000000000000000000, "Elevation": 30.00000000000000000000, "Radius": 1.00000000000000000000, "IsImaginary": false, "Channel": 8, "Gain": 1.00000000000000000000 }, { "Azimuth": 0.00000000000000000000, "Elevation": 90.00000000000000000000, "Radius": 0.60000002384185791016, "IsImaginary": true, "Channel": 14, "Gain": 0.69999998807907104492 } ] } } ././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/_configurationFiles/t_design_60ch.jsonIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/_configurationFiles/t_design_60ch.js0000664002537200253720000003051315257173642031574 0ustar zmoelnigzmoelnig{ "Name": "t-design (60 positions)", "Description": "t-design of degree 10 (60 positions), which can be used to decode Ambisonic signals, process them with non-Ambisonic effects, and encode them again.", "LoudspeakerLayout": { "Name": "t-design (60 positions)", "Description": "t-design of degree 10 (60 positions), which can be used to decode Ambisonic signals, process them with non-Ambisonic effects, and encode them again.", "Loudspeakers": [ { "Azimuth": 144.08648885724392, "Elevation": -21.445816794360013, "Radius": 0.9999999999999999, "IsImaginary": false, "Channel": 1, "Gain": 1.0 }, { "Azimuth": 326.1899827963538, "Elevation": -48.92312628818925, "Radius": 0.9999999999999999, "IsImaginary": false, "Channel": 2, "Gain": 1.0 }, { "Azimuth": 324.0864888572438, "Elevation": -21.44581679436007, "Radius": 1.0, "IsImaginary": false, "Channel": 3, "Gain": 1.0 }, { "Azimuth": 244.12573570146407, "Elevation": 33.089737725914716, "Radius": 1.0, "IsImaginary": false, "Channel": 4, "Gain": 1.0 }, { "Azimuth": 213.81001720364608, "Elevation": 48.92312628818933, "Radius": 0.9999999999999999, "IsImaginary": false, "Channel": 5, "Gain": 1.0 }, { "Azimuth": 115.87426429853593, "Elevation": -33.089737725914716, "Radius": 1.0, "IsImaginary": false, "Channel": 6, "Gain": 1.0 }, { "Azimuth": 146.18998279635386, "Elevation": -48.92312628818928, "Radius": 0.9999999999999996, "IsImaginary": false, "Channel": 7, "Gain": 1.0 }, { "Azimuth": 64.12573570146421, "Elevation": 33.089737725914794, "Radius": 0.9999999999999999, "IsImaginary": false, "Channel": 8, "Gain": 1.0 }, { "Azimuth": 33.8100172036461, "Elevation": 48.92312628818923, "Radius": 1.0, "IsImaginary": false, "Channel": 9, "Gain": 1.0 }, { "Azimuth": 295.87426429853576, "Elevation": -33.089737725914716, "Radius": 1.0, "IsImaginary": false, "Channel": 10, "Gain": 1.0 }, { "Azimuth": 215.91351114275614, "Elevation": 21.44581679436004, "Radius": 1.0000000000000009, "IsImaginary": false, "Channel": 11, "Gain": 1.0 }, { "Azimuth": 35.91351114275618, "Elevation": 21.44581679436, "Radius": 0.9999999999999997, "IsImaginary": false, "Channel": 12, "Gain": 1.0 }, { "Azimuth": 314.4742155284389, "Elevation": 1.9535658237739, "Radius": 1.0000000000000002, "IsImaginary": false, "Channel": 13, "Gain": 1.0 }, { "Azimuth": 177.2632702916245, "Elevation": 44.441529014317844, "Radius": 1.0000000000000002, "IsImaginary": false, "Channel": 14, "Gain": 1.0 }, { "Azimuth": 134.4742155284389, "Elevation": 1.9535658237739, "Radius": 1.0000000000000002, "IsImaginary": false, "Channel": 15, "Gain": 1.0 }, { "Azimuth": 87.21265474949954, "Elevation": -45.49187650446166, "Radius": 1.0, "IsImaginary": false, "Channel": 16, "Gain": 1.0 }, { "Azimuth": 2.736729708375492, "Elevation": -44.44152901431795, "Radius": 1.0, "IsImaginary": false, "Channel": 17, "Gain": 1.0 }, { "Azimuth": 272.7873452505006, "Elevation": 45.49187650446172, "Radius": 1.0000000000000002, "IsImaginary": false, "Channel": 18, "Gain": 1.0 }, { "Azimuth": 357.26327029162445, "Elevation": 44.441529014317815, "Radius": 0.9999999999999994, "IsImaginary": false, "Channel": 19, "Gain": 1.0 }, { "Azimuth": 267.21265474949945, "Elevation": -45.49187650446174, "Radius": 1.0000000000000002, "IsImaginary": false, "Channel": 20, "Gain": 1.0 }, { "Azimuth": 182.7367297083755, "Elevation": -44.441529014317865, "Radius": 1.0000000000000002, "IsImaginary": false, "Channel": 21, "Gain": 1.0 }, { "Azimuth": 92.78734525050064, "Elevation": 45.49187650446172, "Radius": 1.0000000000000002, "IsImaginary": false, "Channel": 22, "Gain": 1.0 }, { "Azimuth": 45.52578447156111, "Elevation": -1.9535658237739568, "Radius": 1.0000000000000002, "IsImaginary": false, "Channel": 23, "Gain": 1.0 }, { "Azimuth": 225.5257844715612, "Elevation": -1.9535658237739568, "Radius": 1.0000000000000002, "IsImaginary": false, "Channel": 24, "Gain": 1.0 }, { "Azimuth": 15.585732591435923, "Elevation": -73.33501703742033, "Radius": 1.0000000000000002, "IsImaginary": false, "Channel": 25, "Gain": 1.0 }, { "Azimuth": 274.5983383239783, "Elevation": 16.035340555479536, "Radius": 0.9999999999999996, "IsImaginary": false, "Channel": 26, "Gain": 1.0 }, { "Azimuth": 195.58573259143554, "Elevation": -73.33501703742036, "Radius": 1.0, "IsImaginary": false, "Channel": 27, "Gain": 1.0 }, { "Azimuth": 163.91555225578566, "Elevation": 4.41906100711914, "Radius": 1.0000000000000002, "IsImaginary": false, "Channel": 28, "Gain": 1.0 }, { "Azimuth": 265.40166167602166, "Elevation": -16.035340555479465, "Radius": 1.0000000000000002, "IsImaginary": false, "Channel": 29, "Gain": 1.0 }, { "Azimuth": 196.0844477442145, "Elevation": -4.419061007119055, "Radius": 0.9999999999999997, "IsImaginary": false, "Channel": 30, "Gain": 1.0 }, { "Azimuth": 94.59833832397838, "Elevation": 16.035340555479593, "Radius": 0.9999999999999999, "IsImaginary": false, "Channel": 31, "Gain": 1.0 }, { "Azimuth": 343.9155522557857, "Elevation": 4.419061007119083, "Radius": 0.9999999999999998, "IsImaginary": false, "Channel": 32, "Gain": 1.0 }, { "Azimuth": 85.40166167602175, "Elevation": -16.035340555479465, "Radius": 1.0, "IsImaginary": false, "Channel": 33, "Gain": 1.0 }, { "Azimuth": 16.084447744214472, "Elevation": -4.419061007119154, "Radius": 0.9999999999999998, "IsImaginary": false, "Channel": 34, "Gain": 1.0 }, { "Azimuth": 344.4142674085641, "Elevation": 73.33501703742024, "Radius": 0.9999999999999996, "IsImaginary": false, "Channel": 35, "Gain": 1.0 }, { "Azimuth": 164.4142674085642, "Elevation": 73.33501703742039, "Radius": 0.9999999999999999, "IsImaginary": false, "Channel": 36, "Gain": 1.0 }, { "Azimuth": 299.97521758140294, "Elevation": 25.26871305647127, "Radius": 1.0000000000000002, "IsImaginary": false, "Channel": 37, "Gain": 1.0 }, { "Azimuth": 151.4132741805194, "Elevation": 26.86045571269318, "Radius": 1.0, "IsImaginary": false, "Channel": 38, "Gain": 1.0 }, { "Azimuth": 119.97521758140296, "Elevation": 25.26871305647127, "Radius": 1.0000000000000002, "IsImaginary": false, "Channel": 39, "Gain": 1.0 }, { "Azimuth": 46.626787820490264, "Elevation": -51.56887723439553, "Radius": 1.0000000000000004, "IsImaginary": false, "Channel": 40, "Gain": 1.0 }, { "Azimuth": 28.58672581948052, "Elevation": -26.860455712693252, "Radius": 1.0, "IsImaginary": false, "Channel": 41, "Gain": 1.0 }, { "Azimuth": 313.3732121795098, "Elevation": 51.56887723439545, "Radius": 1.0, "IsImaginary": false, "Channel": 42, "Gain": 1.0 }, { "Azimuth": 331.4132741805195, "Elevation": 26.86045571269311, "Radius": 1.0, "IsImaginary": false, "Channel": 43, "Gain": 1.0 }, { "Azimuth": 226.62678782049014, "Elevation": -51.56887723439556, "Radius": 1.0000000000000002, "IsImaginary": false, "Channel": 44, "Gain": 1.0 }, { "Azimuth": 208.5867258194805, "Elevation": -26.86045571269321, "Radius": 0.9999999999999997, "IsImaginary": false, "Channel": 45, "Gain": 1.0 }, { "Azimuth": 133.37321217950986, "Elevation": 51.56887723439553, "Radius": 1.0000000000000002, "IsImaginary": false, "Channel": 46, "Gain": 1.0 }, { "Azimuth": 60.024782418597006, "Elevation": -25.268713056471356, "Radius": 1.0, "IsImaginary": false, "Channel": 47, "Gain": 1.0 }, { "Azimuth": 240.0247824185971, "Elevation": -25.26871305647134, "Radius": 1.0000000000000002, "IsImaginary": false, "Channel": 48, "Gain": 1.0 }, { "Azimuth": 250.05837346712212, "Elevation": 6.911231814010591, "Radius": 1.0000000000000002, "IsImaginary": false, "Channel": 49, "Gain": 1.0 }, { "Azimuth": 172.65261801867823, "Elevation": -19.7906490831313, "Radius": 0.9999999999999997, "IsImaginary": false, "Channel": 50, "Gain": 1.0 }, { "Azimuth": 70.05837346712205, "Elevation": 6.911231814010705, "Radius": 0.9999999999999999, "IsImaginary": false, "Channel": 51, "Gain": 1.0 }, { "Azimuth": 289.5649977982501, "Elevation": -68.9408617534649, "Radius": 0.9999999999999998, "IsImaginary": false, "Channel": 52, "Gain": 1.0 }, { "Azimuth": 7.347381981321909, "Elevation": 19.790649083131285, "Radius": 0.9999999999999999, "IsImaginary": false, "Channel": 53, "Gain": 1.0 }, { "Azimuth": 70.43500220174991, "Elevation": 68.94086175346492, "Radius": 0.9999999999999998, "IsImaginary": false, "Channel": 54, "Gain": 1.0 }, { "Azimuth": 352.6526180186782, "Elevation": -19.790649083131413, "Radius": 1.0000000000000002, "IsImaginary": false, "Channel": 55, "Gain": 1.0 }, { "Azimuth": 109.56499779824992, "Elevation": -68.9408617534649, "Radius": 1.0, "IsImaginary": false, "Channel": 56, "Gain": 1.0 }, { "Azimuth": 187.34738198132177, "Elevation": 19.790649083131356, "Radius": 1.0, "IsImaginary": false, "Channel": 57, "Gain": 1.0 }, { "Azimuth": 250.43500220175008, "Elevation": 68.94086175346487, "Radius": 1.0, "IsImaginary": false, "Channel": 58, "Gain": 1.0 }, { "Azimuth": 109.941626532878, "Elevation": -6.9112318140106055, "Radius": 1.0, "IsImaginary": false, "Channel": 59, "Gain": 1.0 }, { "Azimuth": 289.94162653287793, "Elevation": -6.911231814010534, "Radius": 1.0000000000000004, "IsImaginary": false, "Channel": 60, "Gain": 1.0 } ] } }././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/_configurationFiles/t_design_12ch.jsonIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/_configurationFiles/t_design_12ch.js0000664002537200253720000000533615257173642031576 0ustar zmoelnigzmoelnig{ "Name": "t-design (12 positions)", "Description": "t-design of degree 4 (12 positions), which can be used to decode Ambisonic signals, process them with non-Ambisonic effects, and encode them again.", "LoudspeakerLayout": { "Name": "t-design (12 positions)", "Description": "t-design of degree 4 (12 positions), which can be used to decode Ambisonic signals, process them with non-Ambisonic effects, and encode them again.", "Loudspeakers": [ { "Azimuth": 0.0, "Elevation": -31.71747441145571, "Radius": 0.9999999999998959, "IsImaginary": false, "Channel": 1, "Gain": 1.0 }, { "Azimuth": 301.71747441145567, "Elevation": 0.0, "Radius": 0.9999999999998959, "IsImaginary": false, "Channel": 2, "Gain": 1.0 }, { "Azimuth": 270.0, "Elevation": 58.2825255885443, "Radius": 0.9999999999998959, "IsImaginary": false, "Channel": 3, "Gain": 1.0 }, { "Azimuth": 0.0, "Elevation": 31.717474411455697, "Radius": 0.9999999999998959, "IsImaginary": false, "Channel": 4, "Gain": 1.0 }, { "Azimuth": 238.28252558854427, "Elevation": 0.0, "Radius": 0.9999999999998959, "IsImaginary": false, "Channel": 5, "Gain": 1.0 }, { "Azimuth": 90.0, "Elevation": -58.2825255885443, "Radius": 0.9999999999998959, "IsImaginary": false, "Channel": 6, "Gain": 1.0 }, { "Azimuth": 180.0, "Elevation": -31.71747441145571, "Radius": 0.9999999999998959, "IsImaginary": false, "Channel": 7, "Gain": 1.0 }, { "Azimuth": 121.71747441145571, "Elevation": 0.0, "Radius": 0.9999999999998959, "IsImaginary": false, "Channel": 8, "Gain": 1.0 }, { "Azimuth": 90.0, "Elevation": 58.2825255885443, "Radius": 0.9999999999998959, "IsImaginary": false, "Channel": 9, "Gain": 1.0 }, { "Azimuth": 180.0, "Elevation": 31.717474411455697, "Radius": 0.9999999999998959, "IsImaginary": false, "Channel": 10, "Gain": 1.0 }, { "Azimuth": 58.2825255885443, "Elevation": 0.0, "Radius": 0.9999999999998959, "IsImaginary": false, "Channel": 11, "Gain": 1.0 }, { "Azimuth": 270.0, "Elevation": -58.2825255885443, "Radius": 0.9999999999998959, "IsImaginary": false, "Channel": 12, "Gain": 1.0 } ] } }IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/_configurationFiles/4plus9plus0.json0000664002537200253720000001015315257173642031637 0ustar zmoelnigzmoelnig{ "Name": "ITU-R BS.2051-0 Layout G", "Description": "This configuration file was created with the IEM AllRADecoder v0.1.1 plug-in. 5 Apr 2018 12:12:50pm", "LoudspeakerLayout": { "Name": "ITU-R BS.2051-0 Layout G: 4+9+0", "Description": "This layout has 4 loudspeakers in the upper layer and 9 at the horizon.", "Loudspeakers": [ { "Azimuth": 0.00000000000000000000, "Elevation": -90.00000000000000000000, "Radius": 1.00000000000000000000, "IsImaginary": true, "Channel": 14, "Gain": 0.00000000000000000000 }, { "Azimuth": -130.00000000000000000000, "Elevation": 0.00000000000000000000, "Radius": 1.00000000000000000000, "IsImaginary": false, "Channel": 7, "Gain": 1.00000000000000000000 }, { "Azimuth": 130.00000000000000000000, "Elevation": 0.00000000000000000000, "Radius": 1.00000000000000000000, "IsImaginary": false, "Channel": 6, "Gain": 1.00000000000000000000 }, { "Azimuth": -90.00000000000000000000, "Elevation": 0.00000000000000000000, "Radius": 1.00000000000000000000, "IsImaginary": false, "Channel": 5, "Gain": 1.00000000000000000000 }, { "Azimuth": 90.00000000000000000000, "Elevation": 0.00000000000000000000, "Radius": 1.00000000000000000000, "IsImaginary": false, "Channel": 4, "Gain": 1.00000000000000000000 }, { "Azimuth": -30.00000000000000000000, "Elevation": 0.00000000000000000000, "Radius": 1.00000000000000000000, "IsImaginary": false, "Channel": 2, "Gain": 1.00000000000000000000 }, { "Azimuth": 30.00000000000000000000, "Elevation": 0.00000000000000000000, "Radius": 1.00000000000000000000, "IsImaginary": false, "Channel": 1, "Gain": 1.00000000000000000000 }, { "Azimuth": -10.00000000000000000000, "Elevation": 0.00000000000000000000, "Radius": 1.00000000000000000000, "IsImaginary": false, "Channel": 8, "Gain": 1.00000000000000000000 }, { "Azimuth": 10.00000000000000000000, "Elevation": 0.00000000000000000000, "Radius": 1.00000000000000000000, "IsImaginary": false, "Channel": 9, "Gain": 1.00000000000000000000 }, { "Azimuth": 0.00000000000000000000, "Elevation": 0.00000000000000000000, "Radius": 1.00000000000000000000, "IsImaginary": false, "Channel": 3, "Gain": 1.00000000000000000000 }, { "Azimuth": 180.00000000000000000000, "Elevation": 20.00000000000000000000, "Radius": 0.60000002384185791016, "IsImaginary": true, "Channel": 16, "Gain": 1.00000000000000000000 }, { "Azimuth": -110.00000000000000000000, "Elevation": 30.00000000000000000000, "Radius": 1.00000000000000000000, "IsImaginary": false, "Channel": 13, "Gain": 1.00000000000000000000 }, { "Azimuth": 110.00000000000000000000, "Elevation": 30.00000000000000000000, "Radius": 1.00000000000000000000, "IsImaginary": false, "Channel": 12, "Gain": 1.00000000000000000000 }, { "Azimuth": -45.00000000000000000000, "Elevation": 30.00000000000000000000, "Radius": 1.00000000000000000000, "IsImaginary": false, "Channel": 11, "Gain": 1.00000000000000000000 }, { "Azimuth": 45.00000000000000000000, "Elevation": 30.00000000000000000000, "Radius": 1.00000000000000000000, "IsImaginary": false, "Channel": 10, "Gain": 1.00000000000000000000 }, { "Azimuth": 0.00000000000000000000, "Elevation": 80.00000000000000000000, "Radius": 0.80000001192092895508, "IsImaginary": true, "Channel": 15, "Gain": 0.80000001192092895508 } ] } } IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/_configurationFiles/CUBE.json0000664002537200253720000015462315257173642030244 0ustar zmoelnigzmoelnig{ "Name": "All-Round Ambisonic decoder (AllRAD) and loudspeaker layout", "Description": "This configuration file was created with the IEM AllRADecoder v0.9.4 plug-in. 13 Feb 2023 11:50:24am", "Decoder": { "Name": "Decoder", "Description": "A 7th order Ambisonics decoder using the AllRAD approach.", "ExpectedInputNormalization": "n3d", "Weights": "maxrE", "WeightsAlreadyApplied": false, "Matrix": [ [ 0.0400921106338501, -0.0004649758047889918, -0.01447265595197678, 0.06133442744612694, -0.0009151397971436381, 0.00008455116039840505, -0.02142279222607613, -0.02233448624610901, 0.06028260290622711, -0.001274486654438078, 0.000132141140056774, 0.0001558232761453837, 0.00667652441188693, -0.01762046664953232, -0.02114018797874451, 0.05628004297614098, -0.001501052989624441, 0.0001392372796544805, 0.0001872075808933005, 0.00007051341526675969, 0.007809330709278584, 0.0005337391048669815, -0.009787545539438725, -0.01879663951694965, 0.05034399032592773, -0.001574856112711132, 0.0001183144777314737, 0.0001443946093786508, 0.0002040963881881908, -0.00006187313556438312, 0.00321149779483676, 0.008873360231518745, -0.00509501900523901, -0.004441661760210991, -0.01605690643191338, 0.04315893724560738, -0.001496005686931312, 0.0000849607095005922, 0.00006141328776720911, 0.0003386398311704397, -0.00007821428880561143, -0.00009172206773655489, -0.004044767469167709, 0.005274512805044651, 0.007616837974637747, -0.008236916735768318, -0.0007863491191528738, -0.01330046728253365, 0.03531250730156898, -0.001282560522668064, 0.00005312886423780583, -0.00003161502172588371, 0.0004368892405182123, -0.00006572363781742752, -0.0001469678245484829, -0.00001483481264585862, -0.003767643822357059, -0.002409847220405936, 0.004345973022282124, 0.00659477012231946, -0.009509011171758175, 0.001554728602059186, -0.01073468942195177, 0.02733565494418144 ], [ 0.0342964231967926, -0.02107610553503036, -0.01776197925209999, 0.04735217988491058, -0.03769038245081902, 0.01178374607115984, -0.01619192585349083, -0.02646947279572487, 0.0339517816901207, -0.04517742991447449, 0.02136244438588619, 0.004786686506122351, 0.01252135634422302, -0.01075620763003826, -0.0192366112023592, 0.01469509303569794, -0.0427236296236515, 0.02516904659569263, 0.004177156370133162, -0.003779798746109009, 0.005534927360713482, 0.008487440645694733, -0.003765008179470897, -0.00817839615046978, -0.004473246168345213, -0.03253687918186188, 0.02286173962056637, 0.001852513407357037, -0.002432154724374413, -0.003220864338800311, -0.003015622263774276, 0.007236853707581758, 0.002186677185818553, -0.0006046468042768538, 0.002404545433819294, -0.01876596920192242, -0.01865138113498688, 0.01632423512637615, -0.0002211539976997301, 0.0008998116245493293, -0.006279496476054192, 0.001107018440961838, -0.005054538138210773, -0.002483401913195848, 0.005655615124851465, -0.0002970847417600453, -0.000024997498258017, 0.009430301375687122, -0.02564744278788567, -0.005365585442632437, 0.008493680506944656, -0.001212744973599911, 0.003736914368346334, -0.008211578242480755, 0.001667046803049743, 0.002212007995694876, 0.001004830119200051, -0.004969503730535507, -0.001497038756497204, 0.002669364446774125, 0.0003867200866807252, -0.0007006794330663979, 0.01170474290847778, -0.02519514597952366 ], [ 0.04065708816051483, -0.04603457823395729, -0.0149405337870121, 0.04173549637198448, -0.06068290024995804, 0.01725944690406322, -0.02162355184555054, -0.01536666043102741, -0.005942484829574823, -0.03387755528092384, 0.02172384597361088, 0.01308409497141838, 0.007093003019690514, -0.01194263249635696, 0.002591335447505116, -0.04557711258530617, 0.009800425730645657, 0.01100516971200705, 0.009756552986800671, -0.00082530512008816, 0.007882255129516125, 0.0005019389209337533, 0.0008538413094356656, 0.01597732864320278, -0.04967192187905312, 0.03701648488640785, -0.004043011460453272, 0.002724191173911095, 0.004840852692723274, -0.006701627746224403, 0.00298961834050715, 0.006054622586816549, 0.0001532086316728964, 0.003474733792245388, 0.01596337743103504, -0.02228324115276337, 0.03363923728466034, -0.01202586758881807, -0.00005013465488445945, 0.005145000293850899, -0.007764534093439579, -0.003629356855526567, -0.004190721083432436, 0.003487227018922567, -0.0008543009753338993, 0.006259799003601074, 0.0007601204561069608, 0.006109337788075209, 0.01012920495122671, 0.01156950835138559, -0.009926063939929008, 0.001380632515065372, -0.001426386996172369, -0.003881702898070216, -0.004164223559200764, 0.001987543189898133, -0.00364485033787787, -0.001702170819044113, -0.0001683160662651062, -0.005562486592680216, 0.009347911924123764, -0.0007561974343843758, -0.003994694445282221, 0.0243497509509325 ], [ 0.03868172690272331, -0.05592372640967369, -0.02001488395035267, 0.01621832139790058, -0.03020409494638443, 0.03127902373671532, -0.01824599504470825, -0.008789833635091782, -0.04754282161593437, 0.0340556912124157, 0.01651853322982788, 0.0126521959900856, 0.01406484935432673, -0.003800127655267715, 0.02716118842363358, -0.03891603276133537, 0.04130231216549873, -0.01953708566725254, 0.003573594382032752, -0.00998733751475811, 0.006232182960957289, 0.002642079954966903, 0.0051430594176054, 0.02083516679704189, 0.01892240345478058, -0.005150380078703165, -0.02116259932518005, -0.001168606569990516, -0.001482416992075741, -0.008528882637619972, -0.003337668254971504, 0.002541874535381794, -0.003177848644554615, 0.001877924310974777, -0.01111659500747919, 0.03784719482064247, -0.03019599057734013, 0.003987324889749289, -0.00006237863271962851, -0.000361187441740185, -0.005072973668575287, 0.002915265271440148, -0.005695758853107691, -0.0006114325951784849, -0.007906748913228512, 0.001343158888630569, 0.0004116399213671684, -0.01812397129833698, 0.005088566336780787, -0.01077246759086847, 0.01308810245245695, -0.0005417107604444027, -0.00418078014627099, 0.006231715902686119, 0.0009092795662581921, 0.005854085087776184, 0.001101893256418407, -0.001680649584159255, 0.002239867812022567, -0.007043378427624702, -0.001131851109676063, 0.001181589090265334, -0.000596799305640161, -0.02059685625135899 ], [ 0.05360725149512291, -0.07859019190073013, -0.02188160829246044, -0.01764381490647793, 0.03210865706205368, 0.03267200291156769, -0.02760136313736439, 0.009410236030817032, -0.06856434047222137, 0.05220147222280502, -0.0171909537166357, 0.02129197493195534, 0.01200048625469208, 0.004135215654969215, 0.0263910461217165, 0.03974507749080658, -0.03973206132650375, -0.01672441512346268, -0.003777400590479374, -0.004025108180940151, 0.009943107143044472, -0.002718302188441157, 0.01058670040220022, -0.02065645717084408, 0.03440065309405327, -0.01904647052288055, 0.01949615590274334, -0.0043368861079216, 0.001267799292691052, -0.0116523914039135, 0.001775852520950139, -0.002694260329008102, 0.004399876110255718, -0.001850032480433583, -0.007180697750300169, -0.03343243524432182, 0.02358265593647957, 0.000183564581675455, -0.00008996493852464482, -0.008280499838292599, 0.005206711124628782, -0.004129035864025354, -0.006216513458639383, 0.0005422745598480105, -0.009275522083044052, -0.001811117050237954, -0.001128136995248497, 0.01499559171497822, -0.008430219255387783, 0.003008639439940453, -0.009214076213538647, -0.0002101412828778848, 0.004558441694825888, 0.006159028504043818, -0.000768145255278796, 0.004522841889411211, -0.003264413215219975, 0.001709974836558104, -0.003925658762454987, 0.006862947717308998, -0.008540499024093151, -0.001325939781963825, -0.003246479667723179, 0.01323559693992138 ], [ 0.06033581122756004, -0.05874833464622498, -0.02607163414359093, -0.06793012470006943, 0.08160395920276642, 0.02605104073882103, -0.03050238080322742, 0.03075615130364895, 0.01176700554788113, -0.05761991441249847, -0.03541114553809166, 0.01544712390750647, 0.01523416023701429, 0.01763940416276455, -0.005997851956635714, 0.03725640475749969, 0.01400372479110956, 0.02396433241665363, -0.01163925882428885, -0.004321527201682329, 0.01099928375333548, -0.005550025030970573, -0.001427435432560742, -0.01402874942868948, -0.04966205358505249, 0.01508950628340244, -0.00627949321642518, 0.003700492205098271, -0.00267090811394155, -0.008919114246964455, 0.0006249365396797657, -0.01030099485069513, 0.0002326184621779248, -0.002704382641240954, 0.0173046812415123, 0.03070145845413208, -0.01755630970001221, -0.003198179882019758, 0.00002694220711418893, 0.006184149533510208, 0.01190141029655933, -0.002091648988425732, -0.007569880224764347, -0.001952432096004486, 0.001836291747167706, -0.004843107890337706, 0.0005916946101933718, -0.009178237058222294, -0.006560918875038624, 0.005935604218393564, 0.002444987185299397, 0.0005137053085491061, -0.001931098406203091, -0.008326086215674877, 0.002714887028560042, 0.004031463526189327, -0.002760314382612705, 0.004837954416871071, -0.0001193126227008179, 0.005025238264352083, 0.009250503033399582, 0.001184109481982887, 0.001672807731665671, -0.00331266107968986 ], [ 0.0638883113861084, -0.002522807801142335, -0.02730552293360233, -0.09469877928495407, 0.004447712562978268, 0.001921999617479742, -0.0323159284889698, 0.04190260544419289, 0.08577811717987061, -0.005237940233200788, -0.003616660600528121, 0.0003996653249487281, 0.01574189029633999, 0.02468938939273357, -0.03658609092235565, -0.06969219446182251, 0.0048050656914711, 0.004467743914574385, -0.000204379262868315, -0.0008773112203925848, 0.01149505283683538, -0.006858958397060633, -0.01213837787508965, 0.02723030000925064, 0.05043385550379753, -0.003418592968955636, -0.004314281977713108, -0.00008174937829608098, 0.0009995092405006289, -0.0004044169909320772, 0.0009707297431305051, -0.01405518408864737, -0.003259849268943071, 0.004578812047839165, -0.01684772223234177, -0.03140576928853989, 0.001579590723849833, 0.003342389594763517, 0.0002286278322571889, -0.0007092308951541781, 0.000945485255215317, 0.0004812858533114195, -0.007742642425000668, -0.003324433695524931, 0.01215132512152195, 0.008481393568217754, -0.0004601666587404907, 0.007657517213374376, 0.01523350272327662, 0.0001559334486955777, -0.001953627681359649, -0.0001836063311202452, 0.0003064257907681167, -0.001409482676535845, -0.0007634848007000983, 0.0004256729444023222, -0.002995523856952786, 0.006218802183866501, 0.003029624233022332, -0.009440922178328037, -0.009733675047755241, -0.00132844049949199, -0.001033663051202893, -0.003476094454526901 ], [ 0.06377174705266953, 0.05931947752833366, -0.02734849601984024, -0.07358040660619736, -0.08375293016433716, -0.02523521520197392, -0.03214968368411064, 0.03360660374164581, 0.01795360632240772, 0.06200052052736282, 0.03533487021923065, -0.0157442819327116, 0.0157819539308548, 0.0187640693038702, -0.01072999183088541, 0.03176231309771538, -0.01998839154839516, -0.02650430239737034, 0.01187502220273018, 0.003422392532229424, 0.01139780320227146, -0.006232398096472025, -0.00172084360383451, -0.008704156614840031, -0.04636263102293015, -0.009154106490314007, 0.01126158516854048, -0.003594930982217193, 0.003426518524065614, 0.008723102509975433, 0.0008096704841591418, -0.01086042262613773, 0.001410734141245484, -0.00277975364588201, 0.01388533692806959, 0.03015506081283092, 0.0131740802899003, -0.001982668647542596, -0.0003639102797023952, -0.006254884880036116, -0.01172470860183239, 0.00273272767663002, -0.007624309975653887, -0.001747063943184912, 0.003037488553673029, -0.005925519391894341, 0.0006258739158511162, -0.008875239640474319, -0.007935900241136551, -0.003464654088020325, 0.0008072789059951901, -0.0002022553817369044, 0.001747253118082881, 0.009001508355140686, -0.003070232225582004, -0.003503223415464163, -0.002846986521035433, 0.005051090382039547, -0.001066171680577099, 0.003286442253738642, 0.009679533541202545, 0.001263412064872682, 0.003343899501487613, -0.001533167320303619 ], [ 0.05857080966234207, 0.08523166179656982, -0.02383607439696789, -0.01964508928358555, -0.03497123718261719, -0.03515806421637535, -0.02999783121049404, 0.01099847909063101, -0.07279255986213684, -0.05349165201187134, 0.01975632272660732, -0.02280895411968231, 0.01299282629042864, 0.004407824482768774, 0.02725266478955746, 0.04170988872647285, 0.03941990807652473, 0.01569808833301067, 0.003805153537541628, 0.004094566218554974, 0.01053064037114382, -0.003451280063018203, 0.01104956213384867, -0.02294184267520905, 0.03356544673442841, 0.01761075668036938, -0.02046162262558937, 0.004380890168249607, -0.002023671288043261, 0.01217500492930412, 0.001949647441506386, -0.002986883977428079, 0.005180825013667345, -0.001679459121078253, -0.005001368466764688, -0.03051329590380192, -0.01886310242116451, 0.001939363428391516, 0.0001859830954344943, 0.009244109503924847, -0.005834530107676983, 0.004422067198902369, -0.006462727673351765, 0.0009479611762799323, -0.00936395488679409, -0.001290855230763555, -0.001080066431313753, 0.01437104493379593, -0.007779037579894066, -0.003734061494469643, 0.007548140361905098, 0.0003077113069593906, -0.004157561343163252, -0.005696957930922508, 0.001363591756671667, -0.004453228786587715, -0.003288572654128075, 0.002046831883490086, -0.004250225611031055, 0.007587614934891462, -0.009206480346620083, -0.001136707258410752, -0.004315278958529234, 0.008181641809642315 ], [ 0.04119852185249329, 0.05892916768789291, -0.02101467922329903, 0.01903056725859642, 0.03492486849427223, -0.03242522850632668, -0.0195431187748909, -0.0100824786350131, -0.04824317246675491, -0.03175269067287445, -0.01860299147665501, -0.01348249427974224, 0.01457453053444624, -0.004527440760284662, 0.02714103832840919, -0.04382402449846268, -0.04465126246213913, 0.01812735758721828, -0.004242739174515009, 0.01002488937228918, 0.006700060795992613, 0.00288495933637023, 0.005295144394040108, 0.02276026457548141, 0.0140722319483757, -0.0009033451788127422, 0.02209437265992165, 0.001058403635397553, 0.001334108412265778, 0.008956319652497768, -0.003198466962203383, 0.002973251976072788, -0.002905693603679538, 0.00222784886136651, -0.008769641630351543, 0.03851644322276115, 0.02804440818727016, -0.001556868315674365, 0.0001470076967962086, 0.0003973987186327577, 0.005788930226117373, -0.00264554307796061, -0.005966356955468655, -0.0005260347970761359, -0.007926395162940025, 0.001967699266970158, 0.00046712756738998, -0.01772490330040455, 0.01066854316741228, 0.01448914222419262, -0.01162959076464176, 0.0004103602550458163, 0.004958969075232744, -0.005734516773372889, -0.0007466941606253386, -0.005974228959530592, 0.000889916846062988, -0.001907422090880573, 0.002022594213485718, -0.007761122193187475, -0.000570580072235316, 0.001171414507552981, -0.002267721341922879, -0.0164255928248167 ], [ 0.03998342528939247, 0.04383183643221855, -0.0144846560433507, 0.04264950007200241, 0.06011423468589783, -0.01619805581867695, -0.02128399536013603, -0.01540724746882915, -0.001612151274457574, 0.03814445436000824, -0.02112281322479248, -0.0124380411580205, 0.006716351490467787, -0.01221231371164322, 0.001130687538534403, -0.04127835109829903, -0.002589700277894735, -0.01210586633533239, -0.009614097885787487, 0.0006114536081440747, 0.007678506895899773, 0.0002716518647503108, 0.0001174430799437687, 0.01435644179582596, -0.05029944330453873, -0.03246573731303215, 0.00188297510612756, -0.003032553009688854, -0.005009931046515703, 0.006232652347534895, 0.003083009738475084, 0.006057289429008961, -0.0002790053549688309, 0.003035268513485789, 0.01587438955903053, -0.02863731235265732, -0.0354582704603672, 0.01059840898960829, -0.0001267850311705843, -0.005934993270784616, 0.007444207090884447, 0.003495366778224707, -0.003920071758329868, 0.003677006345242262, -0.0002866915601771325, 0.005647765938192606, 0.0006558229215443134, 0.007794719189405441, 0.00257106265053153, -0.01793521270155907, 0.01033344399183989, -0.001349304569885135, -0.00007567561260657385, 0.00422132620587945, 0.004159634932875633, -0.001690534176304936, -0.003604243509471416, -0.001533393282443285, 0.0002301093481946737, -0.004870741162449121, 0.009519767016172409, -0.001016253489069641, -0.001894288579933345, 0.02106245048344135 ], [ 0.03212358057498932, 0.01869821734726429, -0.016640555113554, 0.04489235207438469, 0.03395848721265793, -0.01048643048852682, -0.01516707707196474, -0.02510136924684048, 0.03369604796171188, 0.04185178503394127, -0.01932729780673981, -0.004229992162436247, 0.01174193434417248, -0.01019573211669922, -0.01908177696168423, 0.01705110818147659, 0.04137633740901947, -0.02345203422009945, -0.003725746646523476, 0.003383103292435408, 0.005176013335585594, 0.008058964274823666, -0.003744894871488214, -0.009434276260435581, -0.0003242456004954875, 0.03385041654109955, -0.02232551760971546, -0.001662034424953163, 0.002249349374324083, 0.002845783717930317, -0.002830222947522998, 0.006858459208160639, 0.002171326661482453, -0.000731648993678391, 0.0003305081627331674, -0.0144199077039957, 0.02217271737754345, -0.01718314550817013, 0.0002741964417509735, -0.000743127369787544, 0.005650361999869347, -0.001006886013783514, -0.004742658697068691, -0.002367700450122356, 0.005617256741970778, -0.0003656664921436459, -0.00006480396405095235, 0.007535033859312534, -0.02273011580109596, 0.009781152009963989, -0.01024379674345255, 0.001311609870754182, -0.003500295570120215, 0.007610421162098646, -0.001564076985232532, -0.001969014061614871, 0.00096485874382779, -0.004720051772892475, -0.0014939378015697, 0.003096785861998796, -0.00004306623668526299, -0.0006344369612634182, 0.01084111258387566, -0.02466424182057381 ], [ 0.04289086163043976, -0.02623757161200047, 0.03724852949380875, 0.05238829925656319, -0.03759526461362839, -0.02899054624140263, -0.005900333635509014, 0.05416476354002953, 0.02957083471119404, -0.0337253175675869, -0.04478009045124054, -0.01059478428214788, -0.03249318897724152, 0.01268790476024151, 0.03193336352705956, 0.008446032181382179, -0.02219550870358944, -0.04076389595866203, -0.02259254828095436, 0.007480794563889503, -0.0218849740922451, -0.02349207550287247, 0.009801973588764668, 0.007692575454711914, -0.003610028885304928, -0.0105994688346982, -0.02594178356230259, -0.02164338901638985, 0.002683590166270733, 0.01039863284677267, 0.00136435788590461, -0.02337019145488739, -0.01162310875952244, -0.0009975397260859609, -0.005870029330253601, -0.006583455018699169, -0.003104091621935368, -0.01132938638329506, -0.0121534401550889, 0.0006510557723231614, 0.009334915317595005, 0.004152059555053711, 0.009206713177263737, -0.003880640491843224, -0.01322420034557581, -0.008671646006405354, -0.006357369944453239, -0.007847041822969913, -0.004189013503491879, -0.0002704318321775645, -0.002725197933614254, -0.003364530857652426, 0.002792745130136609, 0.0062412372790277, 0.003258663695305586, 0.0008868140866979957, 0.002801487455144525, 0.005274686496704817, -0.002500732662156224, -0.008397107012569904, -0.005787444766610861, -0.004308064468204975, -0.003633542452007532, -0.0004984693368896842 ], [ 0.03467783704400063, -0.04805746674537659, 0.02591678313910961, 0.01587888970971107, -0.02619772404432297, -0.04447304829955101, -0.01353526301681995, 0.01476225350052118, -0.03535037860274315, 0.01949580200016499, -0.02772052772343159, -0.0003527753578964621, -0.03192726150155067, 0.00001615425935597159, -0.03700121492147446, -0.02747626602649689, 0.02147665992379189, 0.02188304997980595, -0.007067941594868898, 0.0317632369697094, -0.01360577344894409, -0.01104742847383022, -0.009508619084954262, -0.03155797347426414, 0.006791805382817984, -0.00005514924123417586, 0.02588679268956184, 0.008909726515412331, 0.01258324272930622, 0.02278895117342472, 0.01184002682566643, -0.008193218149244785, 0.0153688658028841, -0.01298579107969999, 0.007697996683418751, 0.01248371414840221, -0.004539967514574528, 0.0002699531323742121, 0.01331230811774731, -0.003983615897595882, 0.01336317416280508, -0.003594628535211086, 0.01569772511720657, 0.00124276103451848, 0.01537587027996778, 0.007472281809896231, 0.003805990098044276, 0.01530420128256083, 0.00127677817363292, 0.0003687524585984647, -0.005411278922110796, 0.0002238628803752363, -0.001547412248328328, -0.005394404754042625, 0.00204862654209137, -0.01336235832422972, 0.003117255866527557, 0.005401243921369314, 0.001709586242213845, 0.01153753325343132, 0.0004947851994074881, 0.008838317357003689, 0.001586522092111409, 0.0002390537556493655 ], [ 0.03986787050962448, -0.04816174507141113, 0.03482485935091972, -0.02602669410407543, 0.03748776391148567, -0.05057234689593315, -0.005454362835735083, -0.02837776578962803, -0.02537079527974129, 0.004117676988244057, 0.04435797780752182, -0.01265353430062532, -0.03109019249677658, -0.009517168626189232, -0.02850175462663174, 0.03346513956785202, -0.02147095464169979, 0.004040754400193691, 0.02157235145568848, 0.02213591337203979, -0.0217405054718256, 0.008691659197211266, -0.01022744737565517, 0.04053935036063194, -0.00784187950193882, 0.01035816501826048, -0.02545762993395329, -0.0005980432033538818, -0.004272199235856533, 0.02378054149448872, 0.0009795710211619735, 0.01112406607717276, 0.009397760033607483, 0.02137746289372444, -0.009668066166341305, -0.009417006745934486, 0.001703388406895101, 0.01132721826434135, -0.012316576205194, -0.005935232155025005, -0.01087003480643034, 0.005341447424143553, 0.01009055785834789, 0.003991803620010614, 0.01289494056254625, -0.001346203032881021, -0.006400419864803553, -0.01044794451445341, 0.007337628398090601, -0.003091635415330529, 0.001715563703328371, 0.004563572350889444, 0.002583716297522187, -0.007237282581627369, -0.003933371044695377, -0.005568206775933504, 0.004523755982518196, 0.00006249493162613362, 0.00406732689589262, -0.007354205939918756, -0.003431145800277591, -0.003576639806851745, 0.006509474013000727, -0.001138546853326261 ], [ 0.03182400763034821, -0.01586386002600193, 0.02416213043034077, -0.04375974088907242, 0.02649985067546368, -0.01442114636301994, -0.01195355132222176, -0.04138116165995598, 0.03131433203816414, -0.02833416499197483, 0.02741854079067707, 0.0005607373896054924, -0.02968784235417843, -0.001563030760735273, 0.03404860198497772, -0.01575576514005661, 0.02287662401795387, -0.03181172162294388, 0.005973560269922018, 0.01126163080334663, -0.01361092086881399, 0.02912458218634129, 0.01048633642494678, -0.01924113556742668, 0.003209116635844111, -0.0142141729593277, 0.02690855972468853, -0.01192611828446388, -0.01345461327582598, 0.007702126167714596, 0.0104846153408289, 0.02266220189630985, -0.01303996052592993, -0.01005530636757612, 0.005144892726093531, 0.003447729628533125, 0.006356221623718739, -0.01689937897026539, 0.01278821285814047, 0.00885283574461937, -0.01302191894501448, -0.001960278023034334, 0.01550483237951994, -0.001910965540446341, -0.01550408266484737, 0.001525575877167284, 0.004975136835128069, 0.002961913822218776, -0.004637130070477724, -0.001510550733655691, 0.007201986387372017, -0.008910409174859524, -0.002923245308920741, 0.01177002675831318, -0.000886903319042176, -0.005581212230026722, 0.004131393507122993, -0.01316526997834444, -0.003738986561074853, 0.005502439569681883, 0.003162839449942112, -0.0006037915009073913, -0.004395957570523024, 0.002711812499910593 ], [ 0.04158375784754753, 0.0245619360357523, 0.03698739409446716, -0.05064587667584419, -0.0348806232213974, 0.02848155796527863, -0.004050817806273699, -0.05326847732067108, 0.02961624786257744, 0.03175800666213036, -0.04341639205813408, 0.01252598315477371, -0.03071864880621433, -0.01399222109466791, 0.03167177364230156, -0.01057704910635948, -0.02224604226648808, 0.03962982818484306, -0.0246381051838398, -0.005203527398407459, -0.02226497977972031, 0.02156641334295273, 0.009158198721706867, -0.008841083385050297, -0.0006613217992708087, 0.01250417809933424, -0.02622523345053196, 0.02275586873292923, -0.0003376398526597768, -0.01021137833595276, -0.0003142100758850574, 0.02292930334806442, -0.01222770567983389, 0.002543285489082336, -0.004009589552879333, 0.004531471990048885, -0.005573832429945469, 0.01303263939917088, -0.01248248387128115, 0.001091215410269797, 0.008705148473381996, -0.005514100193977356, 0.008364776149392128, 0.004723495803773403, -0.01332515850663185, 0.01121648773550987, -0.007877453230321407, 0.006675356533378363, -0.003984833136200905, 0.001872673048637807, -0.00474427780136466, 0.003277960233390331, 0.002878065686672926, -0.006131394300609827, 0.004685192368924618, -0.001558674965053797, 0.003117149695754051, -0.004778776317834854, -0.002170603023841977, 0.0092010498046875, -0.008650287054479122, 0.005539546720683575, -0.00395894143730402, 0.001877719070762396 ], [ 0.03215426951646805, 0.04298294708132744, 0.02506865933537483, -0.01789666526019573, -0.02931603975594044, 0.04198971763253212, -0.01079791504889727, -0.01593821495771408, -0.02804246917366982, -0.01023420877754688, -0.02989226765930653, 0.004172463901340961, -0.02942979149520397, 0.001078153378330171, -0.03257418796420097, 0.02998074144124985, 0.02213306538760662, -0.01547399256378412, -0.005982223898172379, -0.0268718060106039, -0.01487092766910791, 0.01257938705384731, -0.01343930326402187, 0.03368159383535385, -0.002948368666693568, -0.008318896405398846, 0.0269066970795393, -0.01247306820005178, 0.01483689621090889, -0.02324487641453743, 0.008659060113132, 0.007928334176540375, 0.008812825195491314, 0.01273824740201235, 0.0002829151053447276, -0.01134237367659807, -0.002795565873384476, -0.007141658570617437, 0.0140274902805686, -0.003744504880160093, 0.0134784234687686, -0.0008425145642831922, 0.01472835801541805, -0.002704396843910217, 0.01471614465117455, -0.009085068479180336, 0.0063670938834548, -0.01500397268682718, 0.007163939997553825, 0.003199423896148801, -0.004591755568981171, 0.001086150761693716, -0.001627125893719494, 0.003654757980257273, 0.0001693631638772786, 0.01111394725739956, 0.004908347502350807, -0.005839727818965912, 0.006466999650001526, -0.01207190006971359, 0.008074800483882427, -0.01008199527859688, 0.006729476153850555, -0.001142363296821713 ], [ 0.03511973097920418, 0.04780225455760956, 0.02643201500177383, 0.0180997084826231, 0.02927521057426929, 0.04447335749864578, -0.0133143151178956, 0.01704424247145653, -0.03320597112178802, -0.01587298326194286, 0.03136142715811729, 0.0009125583455897868, -0.03208169713616371, 0.0004744152538478374, -0.03481702879071236, -0.02970411814749241, -0.02202598936855793, -0.01762066595256329, 0.00875539518892765, -0.03101205453276634, -0.01401236467063427, -0.01222759112715721, -0.009192137978971004, -0.03456192463636398, 0.00306079420261085, -0.002471843035891652, -0.0269660409539938, -0.007035586982965469, -0.01320948358625174, -0.02254626899957657, 0.01138715166598558, -0.00941021554172039, 0.01393347699195147, -0.01507089473307133, 0.002950611291453242, 0.01171670015901327, 0.003494893200695515, -0.003692451398819685, -0.01463683228939772, 0.003026894526556134, -0.01469456125050783, 0.003081621369346976, 0.0154271274805069, 0.0009605410741642118, 0.01394980028271675, 0.006924115121364594, 0.0009633396985009313, 0.01470768917351961, 0.002106337575241923, -0.0008284589857794344, 0.004431779496371746, -0.002744849771261215, 0.0004146197170484811, 0.003659693291410804, -0.002760211238637567, 0.01256211381405592, 0.00319076026789844, 0.005710604600608349, 0.0015194226289168, 0.01185976527631283, 0.000274754362180829, 0.00911021139472723, 0.002883519046008587, 0.0006380248232744634 ], [ 0.04124921560287476, 0.02322817035019398, 0.03575244545936584, 0.05163040012121201, 0.03425799310207367, 0.0256817601621151, -0.00591109786182642, 0.05349626392126083, 0.03172514960169792, 0.03227860480546951, 0.04096727445721626, 0.009405293501913548, -0.03161437064409256, 0.01259873807430267, 0.03484049066901207, 0.0122050866484642, 0.02292068302631378, 0.03938479721546173, 0.02095174975693226, -0.006628003902733326, -0.02127172611653805, -0.02339161932468414, 0.01172061450779438, 0.01259431522339582, -0.0003288098378106952, 0.01235149148851633, 0.02726034447550774, 0.0215956661850214, -0.002075288444757462, -0.009272986091673374, 0.001514307572506368, -0.02358051761984825, -0.01141120865941048, 0.002114350907504559, -0.001849429565481842, -0.005024305079132318, 0.004501448944211006, 0.01358474139124155, 0.01369236502796412, 0.0004205247678328305, -0.008387734182178974, -0.00378061062656343, 0.009414555504918098, -0.004181916359812021, -0.01399476174265146, -0.008205422200262547, -0.004246926866471767, -0.006253041792660952, -0.004303560592234135, 0.0005653089610859752, 0.004079068079590797, 0.004824345465749502, -0.001462802640162408, -0.005305355414748192, -0.003153100144118071, -0.0008627732167951763, 0.003171906573697925, 0.005410648416727781, -0.003178449580445886, -0.009100507013499737, -0.006070619449019432, -0.004090069327503443, -0.004069122485816479, -0.001407040865160525 ], [ 0.03243759647011757, -0.0006730824243277311, 0.04679118096828461, 0.02576190605759621, -0.0005309366970323026, -0.001238754135556519, 0.04050477221608162, 0.04550430178642273, 0.01266632694751024, -0.0003089104138780385, -0.001070026773959398, -0.001539439312182367, 0.02297140657901764, 0.05258812010288239, 0.02481456100940704, 0.006134278606623411, -0.0001720560976536945, -0.0006389325717464089, -0.001445822766982019, -0.001500239945016801, 0.003966158721596003, 0.04528932273387909, 0.0319657064974308, 0.01281083654612303, 0.002933138748630881, -0.00008427481225226074, -0.0003638388880062848, -0.000854315294418484, -0.001501601771451533, -0.001201721373945475, -0.009017445147037506, 0.0291623417288065, 0.03055468574166298, 0.01744801364839077, 0.006465739104896784, 0.00126811268273741, -0.00002277626481372863, -0.0001836266746977344, -0.0004820054164156318, -0.0008100466802716255, -0.001253176480531693, -0.0008042973931878805, -0.01350347045809031, 0.01267109904438257, 0.0217981468886137, 0.01722489111125469, 0.00926143117249012, 0.002929342212155461, 0.0003992195415776223, 0.00001478043031966081, -0.00004561081004794687, -0.000247647607466206, -0.0004133611510042101, -0.0004958760691806674, -0.0008578035049140453, -0.0004509516584221274, -0.01175164338201284, 0.00203617149963975, 0.01054374035447836, 0.01187279913574457, 0.009515559300780296, 0.004391471389681101, 0.0009464834001846611, -0.00001673472252150532 ], [ 0.041213508695364, -0.03310692682862282, 0.05773992091417313, 0.005715538747608662, -0.005552811548113823, -0.05703411996364594, 0.0462062656879425, 0.00915385689586401, -0.01334547530859709, 0.003575626527890563, -0.01026145555078983, -0.06293129175901413, 0.0205884613096714, 0.008597122505307198, -0.02583595924079418, -0.002416717819869518, -0.000252073397859931, 0.007365405559539795, -0.01187591068446636, -0.04968048632144928, -0.004334892146289349, 0.00432377215474844, -0.03266197070479393, -0.004919991362839937, 0.000443348428234458, -0.00008667593647260219, -0.0005967823672108352, 0.009815228171646595, -0.009086016565561295, -0.02639413252472878, -0.01811661012470722, -0.001154979574494064, -0.03028744272887707, -0.006412569433450699, 0.0008341183420270681, -0.00119622191414237, 0.0009210146963596344, -0.0001109396471292712, -0.0009737487998791039, 0.00932653434574604, -0.003251827321946621, -0.005467289127409458, -0.01877945102751255, -0.004882670938968658, -0.02046932093799114, -0.005815043114125729, 0.000849363743327558, -0.002845421899110079, -0.0002191550011048093, 0.0001167306545539759, 0.002294196048751473, 0.00005096954919281416, -0.001271399785764515, 0.005894565489143133, 0.002548608230426908, 0.005099919158965349, -0.01164000667631626, -0.005317786242812872, -0.00873152818530798, -0.003215829376131296, 0.0001871437125373632, -0.00449675228446722, -0.0005135093233548105, 0.000363500788807869 ], [ 0.04158908501267433, -0.006499741226434708, 0.05820758640766144, -0.03328081220388412, 0.0067132324911654, -0.01023629494011402, 0.04651663079857826, -0.05718295648694038, 0.01328601967543364, -0.00334651255980134, 0.01225014496594667, -0.009253176860511303, 0.02079340629279613, -0.06284234672784805, 0.02567728795111179, -0.003386510536074638, 0.0002557987172622234, -0.006707462947815657, 0.01389864552766085, -0.004039369989186525, -0.003971589729189873, -0.04935307055711746, 0.0323706828057766, -0.007050652522593737, 0.0002365439140703529, 0.001002009841613472, 0.0004547110293060541, -0.008569963276386261, 0.01026076823472977, 0.002339619910344481, -0.01739379204809666, -0.02611399069428444, 0.02987205423414707, -0.009536013938486576, 0.000475406734040007, 0.00002603282337076962, -0.0008666430367156863, 0.002421036129817367, 0.000407957995776087, -0.00758732995018363, 0.003219442907720804, 0.006470272317528725, -0.01779754087328911, -0.00561286648735404, 0.01999113708734512, -0.009257561527192593, 0.0005327592953108251, 0.00010037738684332, 0.000229410215979442, 0.0003348947793710977, -0.002176824491471052, 0.003910014405846596, -0.0000168452643265482, -0.004098179750144482, -0.003451305674389005, 0.006760111544281244, -0.0107866432517767, 0.004367482848465443, 0.008280404843389988, -0.006073718890547752, 0.0001767471694620326, 0.000262481567915529, 0.0005453641642816365, -0.0001932774757733569 ], [ 0.04844989627599716, 0.03785368055105209, 0.06727448850870132, 0.0004724104073829949, 0.000385981664294377, 0.06490940600633621, 0.05239947885274887, 0.0007689296035096049, -0.01197219733148813, 0.00006645944813499227, 0.0008117200923152268, 0.07087887823581696, 0.02089113742113113, 0.0007207904709503055, -0.02336147800087929, 0.00003781972554861568, 0.0002850573509931564, 0.00009126183431362733, 0.001121128094382584, 0.05456586554646492, -0.008999542333185673, 0.0002971510111819953, -0.02987481281161308, -0.00004261404319549911, -0.002309285569936037, -0.0009386696619912982, 0.0005630162195302546, 0.00006865309114800766, 0.001107106450945139, 0.02678989060223103, -0.02443317510187626, -0.0003208919370081276, -0.0281655453145504, -0.0002987920888699591, -0.005235487595200539, -0.0002160971489502117, -0.00003484752960503101, -0.002259218599647284, 0.0006725942948833108, 0.00007651423220522702, 0.0006943020271137357, 0.002300131367519498, -0.02322613447904587, -0.0008366843103431165, -0.01953399926424026, -0.0006617260514758527, -0.007897082716226578, -0.0004992809845134616, -0.000273837911663577, -0.0004178730014245957, -0.0000981936973403208, -0.00362035003490746, 0.0004760505398735404, 0.0002535907260607928, 0.0000194127769646002, -0.009318987838923931, -0.01243343204259872, -0.001004647114314139, -0.008794869296252728, -0.000930147129110992, -0.009006024338304996, -0.000756672234274447, -0.0006913734250701964, -0.00005445935312309302 ], [ 0.01986081525683403, -0.0002531804493628442, 0.03336575999855995, -0.00003886735066771507, 0.0001265257014892995, -0.0005302104982547462, 0.0404994860291481, -0.00007842081686249003, 2.1415928586066e-6, -8.968908105089213e-7, 0.0003139014588668942, -0.0008024786948226392, 0.04361747577786446, -0.0001116453131544404, 5.280084678815911e-6, -0.00001927843004523311, -2.694494241950451e-6, -3.1939919153956e-6, 0.0005651707760989666, -0.001023247605189681, 0.04348870366811752, -0.0001295938272960484, 9.433848390472122e-6, -0.00005340178904589266, 0.00007402260962408036, -3.562396159395576e-6, -8.271743354271166e-6, -8.22166748548625e-6, 0.0008544905576854944, -0.001157045713625848, 0.04070602729916573, -0.0001267708867089823, 0.00001414235975971678, -0.0001067546036210842, 0.0002258154709124938, 1.282428030435767e-7, 2.153287368855672e-6, -0.00001163063552667154, -0.00001831086228776257, -0.00001752889693307225, 0.001146853086538613, -0.001183129264973104, 0.03589270263910294, -0.0001020346317091025, 0.00001882555443444289, -0.0001778113801265135, 0.000495997432153672, 5.352538323677436e-7, 1.589456388728649e-7, -2.773749763207434e-8, 7.575577456009341e-6, -0.00002721169403230306, -0.00003372737410245463, -0.00003266708154114895, 0.001403961214236915, -0.001097311615012586, 0.02972002327442169, -0.00005872577457921579, 0.00002289401891175658, -0.0002610918018035591, 0.000904988672118634, 1.583934817972477e-6, 5.583017923527223e-7, -3.586600598737277e-7 ] ], "Routing": [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25 ] }, "LoudspeakerLayout": { "Name": "A loudspeaker layout", "Loudspeakers": [ { "Azimuth": 0.0, "Elevation": 0.0, "Radius": 1.0, "IsImaginary": false, "Channel": 1, "Gain": 1.0 }, { "Azimuth": -24.0, "Elevation": 0.0, "Radius": 1.0, "IsImaginary": false, "Channel": 2, "Gain": 1.0 }, { "Azimuth": -48.0, "Elevation": 0.0, "Radius": 1.0, "IsImaginary": false, "Channel": 3, "Gain": 1.0 }, { "Azimuth": -72.0, "Elevation": 0.0, "Radius": 1.0, "IsImaginary": false, "Channel": 4, "Gain": 1.0 }, { "Azimuth": -102.0, "Elevation": 0.0, "Radius": 1.0, "IsImaginary": false, "Channel": 5, "Gain": 1.0 }, { "Azimuth": -138.0, "Elevation": 0.0, "Radius": 1.0, "IsImaginary": false, "Channel": 6, "Gain": 1.0 }, { "Azimuth": -178.0, "Elevation": 0.0, "Radius": 1.0, "IsImaginary": false, "Channel": 7, "Gain": 1.0 }, { "Azimuth": 142.0, "Elevation": 0.0, "Radius": 1.0, "IsImaginary": false, "Channel": 8, "Gain": 1.0 }, { "Azimuth": 102.0, "Elevation": 0.0, "Radius": 1.0, "IsImaginary": false, "Channel": 9, "Gain": 1.0 }, { "Azimuth": 70.0, "Elevation": 0.0, "Radius": 1.0, "IsImaginary": false, "Channel": 10, "Gain": 1.0 }, { "Azimuth": 45.0, "Elevation": 0.0, "Radius": 1.0, "IsImaginary": false, "Channel": 11, "Gain": 1.0 }, { "Azimuth": 23.0, "Elevation": 0.0, "Radius": 1.0, "IsImaginary": false, "Channel": 12, "Gain": 1.0 }, { "Azimuth": -24.0, "Elevation": 28.0, "Radius": 1.0, "IsImaginary": false, "Channel": 13, "Gain": 1.0 }, { "Azimuth": -69.0, "Elevation": 28.0, "Radius": 1.0, "IsImaginary": false, "Channel": 14, "Gain": 1.0 }, { "Azimuth": -115.0, "Elevation": 27.0, "Radius": 1.0, "IsImaginary": false, "Channel": 15, "Gain": 1.0 }, { "Azimuth": -159.0, "Elevation": 27.0, "Radius": 1.0, "IsImaginary": false, "Channel": 16, "Gain": 1.0 }, { "Azimuth": 155.0, "Elevation": 28.0, "Radius": 1.0, "IsImaginary": false, "Channel": 17, "Gain": 1.0 }, { "Azimuth": 112.0, "Elevation": 28.0, "Radius": 1.0, "IsImaginary": false, "Channel": 18, "Gain": 1.0 }, { "Azimuth": 66.0, "Elevation": 29.0, "Radius": 1.0, "IsImaginary": false, "Channel": 19, "Gain": 1.0 }, { "Azimuth": 22.0, "Elevation": 28.0, "Radius": 1.0, "IsImaginary": false, "Channel": 20, "Gain": 1.0 }, { "Azimuth": 0.0, "Elevation": 60.0, "Radius": 1.0, "IsImaginary": false, "Channel": 21, "Gain": 1.0 }, { "Azimuth": -91.0, "Elevation": 59.0, "Radius": 1.0, "IsImaginary": false, "Channel": 22, "Gain": 1.0 }, { "Azimuth": -178.0, "Elevation": 59.0, "Radius": 1.0, "IsImaginary": false, "Channel": 23, "Gain": 1.0 }, { "Azimuth": 86.0, "Elevation": 60.0, "Radius": 1.0, "IsImaginary": false, "Channel": 24, "Gain": 1.0 }, { "Azimuth": 0.0, "Elevation": 90.0, "Radius": 1.0, "IsImaginary": false, "Channel": 25, "Gain": 1.0 }, { "Azimuth": 0.0, "Elevation": -90.0, "Radius": 1.0, "IsImaginary": true, "Channel": 25, "Gain": 0.0 } ] } }././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/_configurationFiles/t_design_36ch.jsonIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/_configurationFiles/t_design_36ch.js0000664002537200253720000001726515257173642031610 0ustar zmoelnigzmoelnig{ "Name": "t-design (36 positions)", "Description": "t-design of degree 8 (36 positions), which can be used to decode Ambisonic signals, process them with non-Ambisonic effects, and encode them again.", "LoudspeakerLayout": { "Name": "t-design (36 positions)", "Description": "t-design of degree 8 (36 positions), which can be used to decode Ambisonic signals, process them with non-Ambisonic effects, and encode them again.", "Loudspeakers": [ { "Azimuth": 328.8941020927373, "Elevation": 53.65136742056281, "Radius": 1.0000000000000004, "IsImaginary": false, "Channel": 1, "Gain": 1.0 }, { "Azimuth": 110.81538905001948, "Elevation": 30.49581632630889, "Radius": 0.9999999999999999, "IsImaginary": false, "Channel": 2, "Gain": 1.0 }, { "Azimuth": 148.8941020927374, "Elevation": 53.65136742056283, "Radius": 1.0000000000000002, "IsImaginary": false, "Channel": 3, "Gain": 1.0 }, { "Azimuth": 32.213850040499075, "Elevation": -17.830374145454158, "Radius": 0.9999999999999998, "IsImaginary": false, "Channel": 4, "Gain": 1.0 }, { "Azimuth": 69.18461094998055, "Elevation": -30.49581632630887, "Radius": 1.0000000000000007, "IsImaginary": false, "Channel": 5, "Gain": 1.0 }, { "Azimuth": 327.7861499595009, "Elevation": 17.830374145454144, "Radius": 0.9999999999999998, "IsImaginary": false, "Channel": 6, "Gain": 1.0 }, { "Azimuth": 290.81538905001946, "Elevation": 30.49581632630884, "Radius": 0.9999999999999993, "IsImaginary": false, "Channel": 7, "Gain": 1.0 }, { "Azimuth": 212.21385004049904, "Elevation": -17.830374145454158, "Radius": 0.9999999999999998, "IsImaginary": false, "Channel": 8, "Gain": 1.0 }, { "Azimuth": 249.18461094998048, "Elevation": -30.495816326308812, "Radius": 1.0000000000000004, "IsImaginary": false, "Channel": 9, "Gain": 1.0 }, { "Azimuth": 147.78614995950088, "Elevation": 17.83037414545413, "Radius": 1.0000000000000004, "IsImaginary": false, "Channel": 10, "Gain": 1.0 }, { "Azimuth": 31.105897907262616, "Elevation": -53.65136742056282, "Radius": 1.0000000000000002, "IsImaginary": false, "Channel": 11, "Gain": 1.0 }, { "Azimuth": 211.1058979072626, "Elevation": -53.65136742056282, "Radius": 1.0000000000000002, "IsImaginary": false, "Channel": 12, "Gain": 1.0 }, { "Azimuth": 338.75411080094375, "Elevation": -47.77532200468656, "Radius": 1.0000000000000002, "IsImaginary": false, "Channel": 13, "Gain": 1.0 }, { "Azimuth": 251.79589700164928, "Elevation": 38.782347366164885, "Radius": 1.0000000000000004, "IsImaginary": false, "Channel": 14, "Gain": 1.0 }, { "Azimuth": 158.75411080094375, "Elevation": -47.77532200468656, "Radius": 1.0000000000000002, "IsImaginary": false, "Channel": 15, "Gain": 1.0 }, { "Azimuth": 139.77383900860474, "Elevation": -14.094846516160288, "Radius": 0.9999999999999999, "IsImaginary": false, "Channel": 16, "Gain": 1.0 }, { "Azimuth": 288.2041029983507, "Elevation": -38.78234736616491, "Radius": 0.9999999999999998, "IsImaginary": false, "Channel": 17, "Gain": 1.0 }, { "Azimuth": 220.22616099139526, "Elevation": 14.094846516160288, "Radius": 0.9999999999999999, "IsImaginary": false, "Channel": 18, "Gain": 1.0 }, { "Azimuth": 71.79589700164927, "Elevation": 38.78234736616491, "Radius": 0.9999999999999998, "IsImaginary": false, "Channel": 19, "Gain": 1.0 }, { "Azimuth": 319.77383900860474, "Elevation": -14.094846516160288, "Radius": 0.9999999999999999, "IsImaginary": false, "Channel": 20, "Gain": 1.0 }, { "Azimuth": 108.2041029983507, "Elevation": -38.782347366164885, "Radius": 1.0000000000000004, "IsImaginary": false, "Channel": 21, "Gain": 1.0 }, { "Azimuth": 40.226160991395254, "Elevation": 14.094846516160288, "Radius": 0.9999999999999999, "IsImaginary": false, "Channel": 22, "Gain": 1.0 }, { "Azimuth": 21.245889199056272, "Elevation": 47.77532200468653, "Radius": 1.0000000000000002, "IsImaginary": false, "Channel": 23, "Gain": 1.0 }, { "Azimuth": 201.24588919905625, "Elevation": 47.77532200468653, "Radius": 1.0000000000000002, "IsImaginary": false, "Channel": 24, "Gain": 1.0 }, { "Azimuth": 106.65049729301056, "Elevation": -2.5518559246498, "Radius": 1.0000000000000002, "IsImaginary": false, "Channel": 25, "Gain": 1.0 }, { "Azimuth": 357.3366205198378, "Elevation": -16.633505248104044, "Radius": 1.0000000000000002, "IsImaginary": false, "Channel": 26, "Gain": 1.0 }, { "Azimuth": 286.6504972930105, "Elevation": -2.5518559246498, "Radius": 1.0000000000000002, "IsImaginary": false, "Channel": 27, "Gain": 1.0 }, { "Azimuth": 261.158970024968, "Elevation": 73.16056270161033, "Radius": 1.0000000000000002, "IsImaginary": false, "Channel": 28, "Gain": 1.0 }, { "Azimuth": 182.6633794801621, "Elevation": 16.63350524810403, "Radius": 1.0000000000000002, "IsImaginary": false, "Channel": 29, "Gain": 1.0 }, { "Azimuth": 98.84102997503223, "Elevation": -73.16056270161039, "Radius": 1.0, "IsImaginary": false, "Channel": 30, "Gain": 1.0 }, { "Azimuth": 177.33662051983782, "Elevation": -16.633505248103987, "Radius": 0.9999999999999999, "IsImaginary": false, "Channel": 31, "Gain": 1.0 }, { "Azimuth": 81.1589700249678, "Elevation": 73.16056270161039, "Radius": 1.0, "IsImaginary": false, "Channel": 32, "Gain": 1.0 }, { "Azimuth": 2.663379480162169, "Elevation": 16.633505248103972, "Radius": 0.9999999999999999, "IsImaginary": false, "Channel": 33, "Gain": 1.0 }, { "Azimuth": 278.8410299750322, "Elevation": -73.16056270161039, "Radius": 1.0, "IsImaginary": false, "Channel": 34, "Gain": 1.0 }, { "Azimuth": 253.3495027069895, "Elevation": 2.5518559246498, "Radius": 1.0, "IsImaginary": false, "Channel": 35, "Gain": 1.0 }, { "Azimuth": 73.34950270698945, "Elevation": 2.551855924649786, "Radius": 1.0000000000000002, "IsImaginary": false, "Channel": 36, "Gain": 1.0 } ] } }././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/_configurationFiles/Octagon+TopSquare.jsonIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/_configurationFiles/Octagon+TopSquar0000664002537200253720000000732315257173642031714 0ustar zmoelnigzmoelnig{ "Name": "Octagon + Top Square loudspeaker layout", "Description": "This configuration file was created with the IEM AllRADecoder v0.1.1 plug-in. 5 Apr 2018 11:53:56am", "LoudspeakerLayout": { "Name": "Octagon + Top Square", "Description": "This layout has eight loudspeakers for the horizon and four for the top layer. Keep in mind to change the channel numbers to fit your setup", "Loudspeakers": [ { "Azimuth": 0.00000000000000000000, "Elevation": -90.00000000000000000000, "Radius": 1.00000000000000000000, "IsImaginary": true, "Channel": 14, "Gain": 0.00000000000000000000 }, { "Azimuth": -180.00000000000000000000, "Elevation": 0.00000000000000000000, "Radius": 1.00000000000000000000, "IsImaginary": false, "Channel": 5, "Gain": 1.00000000000000000000 }, { "Azimuth": -135.00000000000000000000, "Elevation": 0.00000000000000000000, "Radius": 1.00000000000000000000, "IsImaginary": false, "Channel": 4, "Gain": 1.00000000000000000000 }, { "Azimuth": 135.00000000000000000000, "Elevation": 0.00000000000000000000, "Radius": 1.00000000000000000000, "IsImaginary": false, "Channel": 6, "Gain": 1.00000000000000000000 }, { "Azimuth": -90.00000000000000000000, "Elevation": 0.00000000000000000000, "Radius": 1.00000000000000000000, "IsImaginary": false, "Channel": 3, "Gain": 1.00000000000000000000 }, { "Azimuth": 90.00000000000000000000, "Elevation": 0.00000000000000000000, "Radius": 1.00000000000000000000, "IsImaginary": false, "Channel": 7, "Gain": 1.00000000000000000000 }, { "Azimuth": -45.00000000000000000000, "Elevation": 0.00000000000000000000, "Radius": 1.00000000000000000000, "IsImaginary": false, "Channel": 2, "Gain": 1.00000000000000000000 }, { "Azimuth": 45.00000000000000000000, "Elevation": 0.00000000000000000000, "Radius": 1.00000000000000000000, "IsImaginary": false, "Channel": 8, "Gain": 1.00000000000000000000 }, { "Azimuth": 0.00000000000000000000, "Elevation": 0.00000000000000000000, "Radius": 1.00000000000000000000, "IsImaginary": false, "Channel": 1, "Gain": 1.00000000000000000000 }, { "Azimuth": -135.00000000000000000000, "Elevation": 40.00000000000000000000, "Radius": 1.00000000000000000000, "IsImaginary": false, "Channel": 10, "Gain": 1.00000000000000000000 }, { "Azimuth": 135.00000000000000000000, "Elevation": 40.00000000000000000000, "Radius": 1.00000000000000000000, "IsImaginary": false, "Channel": 11, "Gain": 1.00000000000000000000 }, { "Azimuth": -45.00000000000000000000, "Elevation": 40.00000000000000000000, "Radius": 1.00000000000000000000, "IsImaginary": false, "Channel": 9, "Gain": 1.00000000000000000000 }, { "Azimuth": 45.00000000000000000000, "Elevation": 40.00000000000000000000, "Radius": 1.00000000000000000000, "IsImaginary": false, "Channel": 12, "Gain": 1.00000000000000000000 }, { "Azimuth": 0.00000000000000000000, "Elevation": 90.00000000000000000000, "Radius": 1.00000000000000000000, "IsImaginary": true, "Channel": 13, "Gain": 1.00000000000000000000 } ] } } IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/_configurationFiles/7point1.json0000664002537200253720000000470015257173642031015 0ustar zmoelnigzmoelnig{ "Name": "7.1 loudspeaker layout", "Description": "This configuration file was created with the IEM AllRADecoder v0.1.1 plug-in. 5 Apr 2018 11:57:43am", "LoudspeakerLayout": { "Name": "7.1 loudspeaker layout", "Description": "Standard 7.1 loudspeaker layout with imaginary loudspeakers.", "Loudspeakers": [ { "Azimuth": 180.00000000000000000000, "Elevation": -80.00000000000000000000, "Radius": 1.00000000000000000000, "IsImaginary": true, "Channel": 10, "Gain": 0.00000000000000000000 }, { "Azimuth": -130.00000000000000000000, "Elevation": 0.00000000000000000000, "Radius": 1.00000000000000000000, "IsImaginary": false, "Channel": 8, "Gain": 1.00000000000000000000 }, { "Azimuth": 130.00000000000000000000, "Elevation": 0.00000000000000000000, "Radius": 1.00000000000000000000, "IsImaginary": false, "Channel": 7, "Gain": 1.00000000000000000000 }, { "Azimuth": -90.00000000000000000000, "Elevation": 0.00000000000000000000, "Radius": 1.00000000000000000000, "IsImaginary": false, "Channel": 6, "Gain": 1.00000000000000000000 }, { "Azimuth": 90.00000000000000000000, "Elevation": 0.00000000000000000000, "Radius": 1.00000000000000000000, "IsImaginary": false, "Channel": 5, "Gain": 1.00000000000000000000 }, { "Azimuth": -30.00000000000000000000, "Elevation": 0.00000000000000000000, "Radius": 1.00000000000000000000, "IsImaginary": false, "Channel": 2, "Gain": 1.00000000000000000000 }, { "Azimuth": 30.00000000000000000000, "Elevation": 0.00000000000000000000, "Radius": 1.00000000000000000000, "IsImaginary": false, "Channel": 1, "Gain": 1.00000000000000000000 }, { "Azimuth": 0.00000000000000000000, "Elevation": 0.00000000000000000000, "Radius": 1.00000000000000000000, "IsImaginary": false, "Channel": 3, "Gain": 1.00000000000000000000 }, { "Azimuth": 180.00000000000000000000, "Elevation": 80.00000000000000000000, "Radius": 1.00000000000000000000, "IsImaginary": true, "Channel": 9, "Gain": 0.00000000000000000000 } ] } } ././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/_configurationFiles/t_design_24ch.jsonIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/_configurationFiles/t_design_24ch.js0000664002537200253720000001173715257173642031603 0ustar zmoelnigzmoelnig{ "Name": "t-design (24 positions)", "Description": "t-design of degree 6 (24 positions), which can be used to decode Ambisonic signals, process them with non-Ambisonic effects, and encode them again.", "LoudspeakerLayout": { "Name": "t-design (24 positions)", "Description": "t-design of degree 6 (24 positions), which can be used to decode Ambisonic signals, process them with non-Ambisonic effects, and encode them again.", "Loudspeakers": [ { "Azimuth": 26.001167521655866, "Elevation": 15.46415129614708, "Radius": 1.0, "IsImaginary": false, "Channel": 1, "Gain": 1.0 }, { "Azimuth": 333.9988324783441, "Elevation": -15.46415129614708, "Radius": 1.0, "IsImaginary": false, "Channel": 2, "Gain": 1.0 }, { "Azimuth": 17.10864525591216, "Elevation": -24.993703054643305, "Radius": 1.0, "IsImaginary": false, "Channel": 3, "Gain": 1.0 }, { "Azimuth": 342.89135474408783, "Elevation": 24.993703054643305, "Radius": 1.0, "IsImaginary": false, "Channel": 4, "Gain": 1.0 }, { "Azimuth": 153.99883247834413, "Elevation": -15.46415129614708, "Radius": 1.0, "IsImaginary": false, "Channel": 5, "Gain": 1.0 }, { "Azimuth": 206.00116752165587, "Elevation": 15.46415129614708, "Radius": 1.0, "IsImaginary": false, "Channel": 6, "Gain": 1.0 }, { "Azimuth": 162.89135474408786, "Elevation": 24.993703054643305, "Radius": 1.0, "IsImaginary": false, "Channel": 7, "Gain": 1.0 }, { "Azimuth": 197.10864525591214, "Elevation": -24.993703054643305, "Radius": 1.0, "IsImaginary": false, "Channel": 8, "Gain": 1.0 }, { "Azimuth": 72.89135474408785, "Elevation": 24.993703054643305, "Radius": 1.0, "IsImaginary": false, "Channel": 9, "Gain": 1.0 }, { "Azimuth": 107.10864525591217, "Elevation": -24.993703054643305, "Radius": 1.0, "IsImaginary": false, "Channel": 10, "Gain": 1.0 }, { "Azimuth": 116.00116752165589, "Elevation": 15.46415129614708, "Radius": 1.0, "IsImaginary": false, "Channel": 11, "Gain": 1.0 }, { "Azimuth": 63.99883247834413, "Elevation": -15.46415129614708, "Radius": 1.0, "IsImaginary": false, "Channel": 12, "Gain": 1.0 }, { "Azimuth": 252.89135474408783, "Elevation": 24.993703054643305, "Radius": 1.0, "IsImaginary": false, "Channel": 13, "Gain": 1.0 }, { "Azimuth": 287.10864525591217, "Elevation": -24.993703054643305, "Radius": 1.0, "IsImaginary": false, "Channel": 14, "Gain": 1.0 }, { "Azimuth": 296.0011675216559, "Elevation": 15.46415129614708, "Radius": 1.0, "IsImaginary": false, "Channel": 15, "Gain": 1.0 }, { "Azimuth": 243.99883247834413, "Elevation": -15.46415129614708, "Radius": 1.0, "IsImaginary": false, "Channel": 16, "Gain": 1.0 }, { "Azimuth": 32.25445993660335, "Elevation": 60.02538195107327, "Radius": 1.0, "IsImaginary": false, "Channel": 17, "Gain": 1.0 }, { "Azimuth": 212.25445993660335, "Elevation": 60.02538195107327, "Radius": 1.0, "IsImaginary": false, "Channel": 18, "Gain": 1.0 }, { "Azimuth": 302.2544599366033, "Elevation": 60.02538195107327, "Radius": 1.0, "IsImaginary": false, "Channel": 19, "Gain": 1.0 }, { "Azimuth": 122.25445993660335, "Elevation": 60.02538195107327, "Radius": 1.0, "IsImaginary": false, "Channel": 20, "Gain": 1.0 }, { "Azimuth": 327.7455400633967, "Elevation": -60.025381951073285, "Radius": 1.0, "IsImaginary": false, "Channel": 21, "Gain": 1.0 }, { "Azimuth": 147.74554006339665, "Elevation": -60.025381951073285, "Radius": 1.0, "IsImaginary": false, "Channel": 22, "Gain": 1.0 }, { "Azimuth": 57.74554006339665, "Elevation": -60.025381951073285, "Radius": 1.0, "IsImaginary": false, "Channel": 23, "Gain": 1.0 }, { "Azimuth": 237.74554006339665, "Elevation": -60.025381951073285, "Radius": 1.0, "IsImaginary": false, "Channel": 24, "Gain": 1.0 } ] } }././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/_configurationFiles/export_t_design.pyIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/_configurationFiles/export_t_design.0000664002537200253720000000322115257173642032014 0ustar zmoelnigzmoelnigimport spaudiopy as spa import numpy as np import json import matplotlib.pyplot as plt t_design_order = 10 # Results in 60 positions export_path = "_configurationFiles/t_design_" orders = [4, 6, 8, 9, 10] # Load t-design for order in orders: positions = spa.grids.load_t_design(order) nChannels = positions.shape[0] spa.plot.hull(spa.decoder.get_hull(*positions.T)) # Convert to spherical coordinates azi, zen, r = spa.utils.cart2sph(positions[:, 0], positions[:, 1], positions[:, 2]) azi = spa.utils.rad2deg(azi) zen = spa.utils.rad2deg(zen) # Convert zenith to elevation ele = 90 - zen # Parse as JSON ls = [] for i in range(len(azi)): tmp_dict = { "Azimuth": azi[i], "Elevation": ele[i], "Radius": r[i], "IsImaginary": False, "Channel": i + 1, "Gain": 1.0, } ls.append(tmp_dict) out = { "Name": f"t-design ({nChannels} positions)", "Description": f"t-design of degree {order} ({nChannels} positions), which can be used to decode Ambisonic signals, process them with non-Ambisonic effects, and encode them again.", "LoudspeakerLayout": { "Name": f"t-design ({nChannels} positions)", "Description": f"t-design of degree {order} ({nChannels} positions), which can be used to decode Ambisonic signals, process them with non-Ambisonic effects, and encode them again.", "Loudspeakers": ls, }, } fn = f"{export_path}{nChannels}ch.json" # Writing to sample.json with open(fn, "w") as outfile: outfile.write(json.dumps(out, indent=2)) ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/_configurationFiles/Produktionsstudio.jsonIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/_configurationFiles/Produktionsstudi0000664002537200253720000007110715257173642032143 0ustar zmoelnigzmoelnig{ "Name": "IEM Produktionsstudio Decoder & Layout", "Description": "This configuration file was created with the IEM AllRADecoder v0.4.0 plug-in. 18 Jun 2018 1:35:14pm", "Decoder": { "Name": "IEM Produktionsstudio o7", "Description": "A 7th order Ambisonics decoder for the IEM Produktionsstudio.", "ExpectedInputNormalization": "n3d", "Weights": "maxrE", "WeightsAlreadyApplied": false, "SubwooferChannel" : 4, "Matrix": [ [ 0.07179858535528182983, 0.06890045851469039917, -0.03073602356016635895, 0.07925526052713394165, 0.09105876088142395020, -0.02993733808398246765, -0.03507712110877037048, -0.03520768880844116211, 0.01343082450330257416, 0.06048857048153877258, -0.03730679303407669067, -0.01656924746930599213, 0.01747567951679229736, -0.01899305172264575958, -0.00677113933488726616, -0.03668531030416488647, 0.01710115000605583191, -0.02217375487089157104, -0.01082219369709491730, 0.00442136358469724655, 0.01101768482476472855, 0.00583936413750052452, -0.00152079178951680660, 0.01082920096814632416, -0.04385581985116004944, -0.00486087845638394356, -0.00727863702923059464, -0.00244083395227789879, -0.00418216921389102936, 0.00849351286888122559, 0.00046096765436232090, 0.00992959365248680115, 0.00029910463490523398, 0.00157214631326496601, 0.00888274610042572021, -0.02559242956340312958, -0.00507186958566308022, -0.00531880464404821396, 0.00034844956826418638, -0.00759502639994025230, 0.01059541944414377213, 0.00170199514832347631, -0.00706200022250413895, 0.00143144547473639250, 0.00191595626529306173, 0.00600487086921930313, -0.00091247510863468051, 0.00174653122667223215, -0.01051187701523303986, -0.00110554159618914127, -0.00900463480502367020, -0.00077748630428686738, -0.00247668195515871048, 0.00668299524113535881, 0.00184452987741678953, -0.00321728643029928207, -0.00156696559861302376, -0.00401058094576001167, -0.00029065419221296906, -0.00317128235474228859, 0.01014871802181005478, -0.00224402197636663914, 0.00201176921837031841, -0.00722226453945040703 ], [ 0.07179898768663406372, -0.06890495866537094116, -0.03073412179946899414, 0.07925462722778320312, -0.09105984866619110107, 0.02993473783135414124, -0.03508225828409194946, -0.03521287068724632263, 0.01342305261641740799, -0.06048038974404335022, 0.03730750083923339844, 0.01657016016542911530, 0.01748218387365341187, -0.01899102889001369476, -0.00678194127976894379, -0.03669248521327972412, -0.01708872802555561066, 0.02218237146735191345, 0.01081668678671121597, -0.00442060874775052071, 0.01101083680987358093, 0.00584154250100255013, -0.00152010773308575153, 0.01081666629761457443, -0.04385551437735557556, 0.00487168552353978157, 0.00729581015184521675, 0.00243622809648513794, 0.00418589357286691666, -0.00848823785781860352, 0.00046734185889363289, 0.00993043743073940277, 0.00030170983518473804, 0.00156410783529281616, 0.00887579936534166336, -0.02558643370866775513, 0.00508123682811856270, 0.00533809140324592590, -0.00034309108741581440, 0.00759840104728937149, -0.01059315912425518036, -0.00170271715614944696, -0.00707099866122007370, 0.00143223244231194258, 0.00192575785331428051, 0.00601092586293816566, -0.00092305493308231235, 0.00175100064370781183, -0.01050279568880796432, 0.00111288996413350105, 0.00901674386113882065, 0.00078862608643248677, 0.00247575249522924423, -0.00668930821120738983, -0.00184103089850395918, 0.00321806268766522408, -0.00155443081166595221, -0.00401915702968835831, -0.00028821150772273540, -0.00315798167139291763, 0.01015719491988420486, -0.00224616937339305878, 0.00202500796876847744, -0.00720882229506969452 ], [ 0.06600356847047805786, 0.00000136531116368133, -0.00688078720122575760, 0.09884190559387207031, 0.00000084188837945476, -0.00000030318059884848, -0.03287663683295249939, -0.00720807909965515137, 0.09149980545043945312, -0.00000126919735521369, -0.00000026915975581687, 0.00000439860878032050, -0.00667334487661719322, -0.02095468528568744659, -0.00590340234339237213, 0.07746142148971557617, -0.00000382961343348143, -0.00000034801433912435, 0.00000935492698772578, -0.00000187641626325785, 0.00200499710626900196, -0.01560021471232175827, -0.00525473430752754211, -0.00672785378992557526, 0.06023628264665603638, -0.00000565382606509957, -0.00000136722428578651, 0.00001129502834373852, -0.00000414334408560535, -0.00000218234185922483, 0.00969801191240549088, -0.00336846453137695789, -0.01550699584186077118, 0.00304398103617131710, -0.00881353113800287247, 0.04252831637859344482, -0.00000591179241382633, -0.00000306374954561761, 0.00000985597125691129, -0.00000345812281921098, 0.00000085869021404505, 0.00000258308500633575, 0.00528305117040872574, 0.00688225124031305313, -0.00346496747806668282, -0.01280798204243183136, 0.00574369402602314949, -0.01089753955602645874, 0.02637133747339248657, -0.00000439797850049217, -0.00000431839407610823, 0.00000621872277406510, -0.00000043697860974135, 0.00000503928231410100, 0.00000073319154125784, -0.00000251304027187871, -0.00041693533421494067, 0.00737680867314338684, 0.00111107493285089731, -0.00074532470898702741, -0.00972442328929901123, 0.00491585675626993179, -0.01196981966495513916, 0.01309331413358449936 ], [ 0.10288899391889572144, 0.14673013985157012939, -0.02289180643856525421, 0.01145131606608629227, 0.01769954897463321686, -0.02935401350259780884, -0.05041123926639556885, -0.00500521529465913773, -0.11733006685972213745, -0.07529147714376449585, -0.00764917861670255661, -0.03151643648743629456, 0.00211182306520640850, -0.00263045798055827618, 0.01952451653778553009, -0.01560259331017732620, -0.00718578882515430450, 0.00982216279953718185, -0.00180492061190307140, -0.01208038721233606339, 0.00728974211961030960, 0.00065434485441073775, 0.00713996961712837219, 0.00666682422161102295, 0.03542622178792953491, 0.00735300965607166290, 0.00336835207417607307, -0.00423741387203335762, -0.00074949947884306312, 0.00240734103135764599, 0.01019372884184122086, 0.00135191017761826515, 0.01549102831631898880, 0.00022310996428132057, -0.00369336898438632488, -0.00244442396797239780, -0.00840129237622022629, -0.00156771787442266941, -0.00051567942136898637, 0.01139751635491847992, 0.00207544886507093906, 0.00763263553380966187, 0.00182252749800682068, 0.00032009498681873083, -0.00011941260163439438, 0.00171077158302068710, 0.00615036394447088242, -0.00003315131834824570, 0.00632228842005133629, 0.00879169255495071411, 0.00169679464306682348, 0.00335338339209556580, 0.00115601788274943829, -0.00021842920978087932, 0.00021650684357155114, 0.00499276071786880493, -0.00126733619254082441, -0.00050044100498780608, -0.00056556524941697717, -0.00194505206309258938, -0.00502574350684881210, 0.00013722230505663902, 0.00181598716881126165, 0.00868011359125375748 ], [ 0.10287643969058990479, -0.14671874046325683594, -0.02289388328790664673, 0.01145371608436107635, -0.01770331524312496185, 0.02936263382434844971, -0.05041544511914253235, -0.00500596687197685242, -0.11732846498489379883, 0.07529763877391815186, 0.00764859141781926155, 0.03152351453900337219, 0.00212395540438592434, -0.00263181771151721478, 0.01952982507646083832, -0.01560599543154239655, 0.00718651711940765381, -0.00981883145868778229, 0.00180769816506654024, 0.01207263115793466568, 0.00729465158656239510, 0.00064801232656463981, 0.00714037707075476646, 0.00666629057377576828, 0.03543492034077644348, -0.00735949212685227394, -0.00336848525330424309, 0.00424563698470592499, 0.00075716990977525711, -0.00241358205676078796, 0.01019242778420448303, 0.00135580915957689285, 0.01549692638218402863, 0.00022259770776145160, -0.00368353514932096004, -0.00244683679193258286, 0.00840509030967950821, 0.00155928405001759529, 0.00051936687668785453, -0.01141140516847372055, -0.00207370775751769543, -0.00763294752687215805, 0.00181612442247569561, 0.00031933397985994816, -0.00011976864334428683, 0.00171761482488363981, 0.00616159290075302124, -0.00003394966915948316, 0.00632069446146488190, -0.00879502948373556137, -0.00169569300487637520, -0.00336018996313214302, -0.00115717703010886908, 0.00021432593348436058, -0.00021968437067698687, -0.00499215861782431602, -0.00126717379316687584, -0.00048827083082869649, -0.00056536146439611912, -0.00194272177759557962, -0.00503692682832479477, 0.00014088768512010574, 0.00181576807517558336, 0.00868281349539756775 ], [ 0.12046553194522857666, 0.07388502359390258789, -0.04268862679600715637, -0.14579038321971893311, -0.09225143492221832275, -0.02949005924165248871, -0.05765694379806518555, 0.04847796633839607239, 0.06346884369850158691, 0.05102657526731491089, 0.03177849575877189636, -0.01806606911122798920, 0.01733323000371456146, 0.03165968880057334900, -0.01223536673933267593, 0.00078362278873100877, -0.00100692210253328085, -0.00947809498757123947, 0.01122260559350252151, 0.00227426434867084026, 0.01391800213605165482, 0.00347872590646147728, -0.00332101946696639061, -0.00909020379185676575, -0.01370952557772397995, -0.01741614937782287598, -0.00832108873873949051, -0.00202531646937131882, 0.00877855811268091202, 0.00867293495684862137, 0.00757791101932525635, -0.01029060315340757370, -0.01117971166968345642, -0.00369138130918145180, 0.00542238960042595863, -0.00159219559282064438, 0.00849387701600790024, 0.00689550815150141716, -0.00027725723339244723, -0.01213523838669061661, -0.00924002937972545624, 0.00343912187963724136, -0.00536186248064041138, -0.00782659463584423065, 0.00055829074699431658, 0.00304434145800769329, 0.00149659602902829647, 0.00418354989960789680, 0.00997786875814199448, 0.00203497149050235748, 0.00240941601805388927, -0.00161048548761755228, 0.00483287451788783073, 0.00289743626490235329, -0.00447152787819504738, -0.00246895779855549335, -0.00329064694233238697, -0.00064396194647997618, 0.00216613058000802994, 0.00416009686887264252, 0.00374235794879496098, 0.00053857051534578204, -0.00367514998652040958, -0.00368053792044520378 ], [ 0.12047680467367172241, -0.07389564067125320435, -0.04269138723611831665, -0.14579600095748901367, 0.09226128458976745605, 0.02948100678622722626, -0.05765077844262123108, 0.04847547784447669983, 0.06346326321363449097, -0.05102688446640968323, -0.03176829591393470764, 0.01807245612144470215, 0.01731706038117408752, 0.03165232762694358826, -0.01223803870379924774, 0.00078940630191937089, 0.00100350670982152224, 0.00947485771030187607, -0.01122223865240812302, -0.00227140751667320728, 0.01392233092337846756, 0.00348994950763881207, -0.00331688066944479942, -0.00908285658806562424, -0.01370800472795963287, 0.01741773635149002075, 0.00831538438796997070, 0.00202184682711958885, -0.00878241006284952164, -0.00866795703768730164, 0.00757198035717010498, -0.01028767507523298264, -0.01118228957056999207, -0.00368263572454452515, 0.00541680352762341499, -0.00159443973097950220, -0.00849713478237390518, -0.00688773160800337791, 0.00027359434170648456, 0.01213713269680738449, 0.00923311989754438400, -0.00343892537057399750, -0.00534431543201208115, -0.00782327074557542801, 0.00056017236784100533, 0.00304007460363209248, 0.00148245308082550764, 0.00418222742155194283, 0.00997527502477169037, -0.00202999729663133621, -0.00240998086519539356, 0.00161764281801879406, -0.00483157951384782791, -0.00289601599797606468, 0.00446837302297353745, 0.00246658804826438427, -0.00329648237675428391, -0.00065621780231595039, 0.00216844258829951286, 0.00415342301130294800, 0.00374797964468598366, 0.00054190069204196334, -0.00366987567394971848, -0.00367764732800424099 ], [ 0.08719463646411895752, 0.06627514213323593140, 0.09104207158088684082, 0.06646539270877838135, 0.04883769154548645020, 0.07963126897811889648, 0.02364492602646350861, 0.07971866428852081299, 0.00025928925606422126, 0.01113488525152206421, 0.05906938016414642334, 0.04234284907579421997, -0.03167871758341789246, 0.04220714420080184937, 0.00015282425738405436, -0.01069153938442468643, 0.00026993424398824573, 0.01125631574541330338, 0.03189876303076744080, 0.00042500087874941528, -0.03509102016687393188, 0.00028075624140910804, -0.00012669961142819375, -0.01094436831772327423, 0.00116728211287409067, 0.00434967875480651855, 0.00022626946156378835, 0.00186178041622042656, 0.00106227269861847162, -0.01085180323570966721, -0.01167919114232063293, -0.01079667359590530396, -0.00018439276027493179, -0.00200145342387259007, 0.00376376230269670486, 0.00415606098249554634, 0.00518946535885334015, 0.00518305739387869835, -0.00003676239430205896, -0.00644415430724620819, -0.00527713680639863014, -0.00096027145627886057, 0.00031434136326424778, -0.00081340351607650518, 0.00002754210436251014, 0.00613821344450116158, 0.00651808734983205795, 0.00495206983759999275, 0.00005659750968334265, 0.00204864447005093098, 0.00482536572962999344, 0.00257196556776762009, -0.00019364316540304571, -0.00582191813737154007, 0.00497484253719449043, 0.00419980008155107498, -0.00371125154197216034, 0.00421512452885508537, 0.00016435571887996048, 0.00579978246241807938, 0.00718728406354784966, 0.00250536389648914337, -0.00003834538438240997, -0.00166549580171704292 ], [ 0.08719597756862640381, -0.06627465784549713135, 0.09104175120592117310, 0.06646483391523361206, -0.04883062094449996948, -0.07962969690561294556, 0.02364103496074676514, 0.07971761375665664673, 0.00025769573403522372, -0.01112996228039264679, -0.05905931815505027771, -0.04234127700328826904, -0.03168413043022155762, 0.04220667108893394470, 0.00014931496116332710, -0.01068824250251054764, -0.00027150046662427485, -0.01124515943229198456, -0.03189539164304733276, -0.00042492343345656991, -0.03509424999356269836, 0.00028112824657000601, -0.00013040893827565014, -0.01094129681587219238, 0.00116656743921339512, -0.00435055093839764595, -0.00022245207219384611, -0.00185266451444476843, -0.00107037473935633898, 0.01085036154836416245, -0.01167817227542400360, -0.01079675089567899704, -0.00018662944785319269, -0.00200281478464603424, 0.00376427872106432915, 0.00415157526731491089, -0.00519278179854154587, -0.00517755001783370972, 0.00004183806959190406, 0.00644293986260890961, 0.00526509946212172508, 0.00095829583005979657, 0.00031783714075572789, -0.00081405398668721318, 0.00002622264400997665, 0.00613158615306019783, 0.00651894835755228996, 0.00494939740747213364, 0.00005240435348241590, -0.00205527781508862972, -0.00482215872034430504, -0.00256692199036478996, 0.00019135221373289824, 0.00581528991460800171, -0.00498008448630571365, -0.00420134421437978745, -0.00371036329306662083, 0.00421568378806114197, 0.00016351007798220962, 0.00579245714470744133, 0.00718706194311380386, 0.00250511569902300835, -0.00003720127278938890, -0.00167522567790001631 ], [ 0.08879416435956954956, 0.06371914595365524292, 0.09244900196790695190, -0.06881105154752731323, -0.04363299533724784851, 0.07827461510896682739, 0.02308157272636890411, -0.08242080360651016235, 0.00244203140027821064, 0.00403129402548074722, -0.05585176125168800354, 0.04396658390760421753, -0.03379129990935325623, -0.04254111275076866150, 0.00302893598563969135, 0.00843612104654312134, 0.00720340851694345474, 0.00629813084378838539, -0.03442659229040145874, 0.00248756306245923042, -0.03634542599320411682, 0.00231137196533381939, 0.00085754011524841189, 0.00808758102357387543, 0.00370668782852590084, -0.00190779299009591341, 0.00554002448916435242, 0.00440737185999751091, -0.00521974824368953705, -0.01129242964088916779, -0.01046164520084857941, 0.01333236414939165115, -0.00215603644028306007, 0.00097036868100985885, 0.00658943364396691322, -0.00665830681100487709, -0.00094106403412297368, -0.00009294412302551791, -0.00180669024121016264, -0.00089944578940048814, 0.00529522821307182312, -0.00298879994079470634, 0.00250805215910077095, 0.00013262497668620199, -0.00255163782276213169, -0.00455124303698539734, 0.00725620379671454430, -0.00748194428160786629, 0.00187056011054664850, -0.00037005194462835789, -0.00095619430067017674, 0.00345944147557020187, -0.00553154340013861656, -0.00493688089773058891, -0.00149789755232632160, 0.00356547371484339237, -0.00337178679183125496, -0.00714381318539381027, 0.00013590768503490835, -0.00368800177238881588, 0.00569333927705883980, -0.00290159601718187332, 0.00171516032423824072, 0.00091580336447805166 ], [ 0.08879477530717849731, -0.06372036784887313843, 0.09245226532220840454, -0.06880509853363037109, 0.04362626001238822937, -0.07827806472778320312, 0.02308510057628154755, -0.08241673558950424194, 0.00244032684713602066, -0.00403156876564025879, 0.05584440007805824280, -0.04396861046552658081, -0.03379321098327636719, -0.04254157468676567078, 0.00302556436508893967, 0.00842829234898090363, -0.00719747738912701607, -0.00629687868058681488, 0.03442244976758956909, -0.00248376443050801754, -0.03634978085756301880, 0.00231102970428764820, 0.00085511937504634261, 0.00808073673397302628, 0.00370935071259737015, 0.00190785876475274563, -0.00553525658324360847, -0.00440558232367038727, 0.00521940970793366432, 0.01129872165620326996, -0.01045941468328237534, 0.01333429664373397827, -0.00215498055331408978, 0.00096850836416706443, 0.00658713607117533684, -0.00666160788387060165, 0.00094372616149485111, 0.00009936840797308832, 0.00180884217843413353, 0.00089848705101758242, -0.00529265962541103363, 0.00299072614870965481, 0.00251698214560747147, 0.00013314743409864604, -0.00254834070801734924, -0.00455029355362057686, 0.00724843796342611313, -0.00748145347461104393, 0.00187771581113338470, 0.00036786057171411812, 0.00095625605899840593, -0.00345006887800991535, 0.00553402351215481758, 0.00493278447538614273, 0.00150011398363858461, -0.00356760504655539989, -0.00336607941426336765, -0.00714562879875302315, 0.00013826113718096167, -0.00368612981401383877, 0.00568730384111404419, -0.00289526907727122307, 0.00172532175201922655, 0.00091794988838955760 ], [ 0.05659971013665199280, 0.00000282856717603863, 0.08960649371147155762, 0.00000773492411099141, 0.00000328664532389666, 0.00000503744422530872, 0.09609330445528030396, 0.00001244372560904594, 0.00000171108740687487, 0.00000011911063069192, 0.00000584412646276178, 0.00000570844485991984, 0.08464940637350082397, 0.00001170283212559298, 0.00000362244691132219, -0.00000451309051641147, 0.00000053774516572958, 0.00000037827280152669, 0.00000616364241068368, 0.00000425426696892828, 0.06218866258859634399, 0.00000571091095480369, 0.00000510941117681796, -0.00000906836066860706, -0.00109947985038161278, 0.00000180564404672623, 0.00000165294659382198, 0.00000081875498381123, 0.00000350068398802250, 0.00000097950817234960, 0.03612607344985008240, -0.00000214391025110672, 0.00000529139379068511, -0.00001138761763286311, -0.00284137134440243244, -0.00000192111770047632, -0.00000144711373195605, 0.00000479032496514264, 0.00000350121945302817, 0.00000136002267936419, -0.00000090739229108294, -0.00000297568840323947, 0.01299224793910980225, -0.00000755656674300553, 0.00000369752433471149, -0.00000925266067497432, -0.00506110256537795067, -0.00000473149793833727, 0.00000091010923597423, 0.00000055639668516960, -0.00000396994937545969, 0.00000859224473970244, 0.00000580227788304910, 0.00000177404353962629, -0.00000445172327090404, -0.00000602366299062851, -0.00299328891560435295, -0.00000800655016064411, 0.00000060345439578668, -0.00000298835857392987, -0.00710881780833005905, -0.00000776906381361187, 0.00000244926377490629, 0.00000243183467318886 ] ], "Routing": [ 1, 2, 3, 7, 8, 5, 6, 9, 10, 11, 12, 13 ] }, "LoudspeakerLayout": { "Name": "IEM Produktionsstudio", "Description": "Loudspeaker layout of the IEM Produktionsstudio", "Loudspeakers": [ { "Azimuth": 0.00000000000000000000, "Elevation": -90.00000000000000000000, "Radius": 1.00000000000000000000, "IsImaginary": true, "Channel": 15, "Gain": 0.00000000000000000000 }, { "Azimuth": -135.00000000000000000000, "Elevation": 0.00000000000000000000, "Radius": 1.96000003814697265625, "IsImaginary": false, "Channel": 6, "Gain": 1.00000000000000000000 }, { "Azimuth": 135.00000000000000000000, "Elevation": 0.00000000000000000000, "Radius": 1.92999994754791259766, "IsImaginary": false, "Channel": 5, "Gain": 1.00000000000000000000 }, { "Azimuth": -90.00000000000000000000, "Elevation": 0.00000000000000000000, "Radius": 1.99000000953674316406, "IsImaginary": false, "Channel": 8, "Gain": 1.00000000000000000000 }, { "Azimuth": 90.00000000000000000000, "Elevation": 0.00000000000000000000, "Radius": 1.96000003814697265625, "IsImaginary": false, "Channel": 7, "Gain": 1.00000000000000000000 }, { "Azimuth": -30.00000000000000000000, "Elevation": 0.00000000000000000000, "Radius": 1.86000001430511474609, "IsImaginary": false, "Channel": 2, "Gain": 1.00000000000000000000 }, { "Azimuth": 30.00000000000000000000, "Elevation": 0.00000000000000000000, "Radius": 1.86000001430511474609, "IsImaginary": false, "Channel": 1, "Gain": 1.00000000000000000000 }, { "Azimuth": 0.00000000000000000000, "Elevation": 0.00000000000000000000, "Radius": 1.89999997615814208984, "IsImaginary": false, "Channel": 3, "Gain": 1.00000000000000000000 }, { "Azimuth": 180.00000000000000000000, "Elevation": 20.00000000000000000000, "Radius": 1.00000000000000000000, "IsImaginary": true, "Channel": 16, "Gain": 1.00000000000000000000 }, { "Azimuth": -135.00000000000000000000, "Elevation": 40.00000000000000000000, "Radius": 1.95000004768371582031, "IsImaginary": false, "Channel": 12, "Gain": 1.00000000000000000000 }, { "Azimuth": 135.00000000000000000000, "Elevation": 40.00000000000000000000, "Radius": 1.88999998569488525391, "IsImaginary": false, "Channel": 11, "Gain": 1.00000000000000000000 }, { "Azimuth": -45.00000000000000000000, "Elevation": 40.00000000000000000000, "Radius": 1.91999995708465576172, "IsImaginary": false, "Channel": 10, "Gain": 1.00000000000000000000 }, { "Azimuth": 45.00000000000000000000, "Elevation": 40.00000000000000000000, "Radius": 1.91999995708465576172, "IsImaginary": false, "Channel": 9, "Gain": 1.00000000000000000000 }, { "Azimuth": 0.00000000000000000000, "Elevation": 90.00000000000000000000, "Radius": 1.73399996757507324219, "IsImaginary": false, "Channel": 13, "Gain": 1.00000000000000000000 } ] } } ././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/_configurationFiles/t_design_48ch.jsonIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/_configurationFiles/t_design_48ch.js0000664002537200253720000002352715257173642031611 0ustar zmoelnigzmoelnig{ "Name": "t-design (48 positions)", "Description": "t-design of degree 9 (48 positions), which can be used to decode Ambisonic signals, process them with non-Ambisonic effects, and encode them again.", "LoudspeakerLayout": { "Name": "t-design (48 positions)", "Description": "t-design of degree 9 (48 positions), which can be used to decode Ambisonic signals, process them with non-Ambisonic effects, and encode them again.", "Loudspeakers": [ { "Azimuth": 20.745809529362027, "Elevation": -3.5519644975674964, "Radius": 0.9999999999999999, "IsImaginary": false, "Channel": 1, "Gain": 1.0 }, { "Azimuth": 339.254190470638, "Elevation": 3.5519644975674822, "Radius": 0.9999999999999999, "IsImaginary": false, "Channel": 2, "Gain": 1.0 }, { "Azimuth": 356.2024593586527, "Elevation": -20.70412493402209, "Radius": 0.9999999999999999, "IsImaginary": false, "Channel": 3, "Gain": 1.0 }, { "Azimuth": 3.7975406413473083, "Elevation": 20.704124934022076, "Radius": 0.9999999999999999, "IsImaginary": false, "Channel": 4, "Gain": 1.0 }, { "Azimuth": 159.25419047063795, "Elevation": 3.5519644975674822, "Radius": 0.9999999999999999, "IsImaginary": false, "Channel": 5, "Gain": 1.0 }, { "Azimuth": 200.74580952936205, "Elevation": -3.5519644975674964, "Radius": 0.9999999999999999, "IsImaginary": false, "Channel": 6, "Gain": 1.0 }, { "Azimuth": 183.7975406413473, "Elevation": 20.704124934022076, "Radius": 0.9999999999999999, "IsImaginary": false, "Channel": 7, "Gain": 1.0 }, { "Azimuth": 176.2024593586527, "Elevation": -20.70412493402209, "Radius": 0.9999999999999999, "IsImaginary": false, "Channel": 8, "Gain": 1.0 }, { "Azimuth": 93.79754064134731, "Elevation": 20.704124934022076, "Radius": 0.9999999999999999, "IsImaginary": false, "Channel": 9, "Gain": 1.0 }, { "Azimuth": 86.20245935865269, "Elevation": -20.70412493402209, "Radius": 0.9999999999999999, "IsImaginary": false, "Channel": 10, "Gain": 1.0 }, { "Azimuth": 110.74580952936203, "Elevation": -3.5519644975674964, "Radius": 0.9999999999999999, "IsImaginary": false, "Channel": 11, "Gain": 1.0 }, { "Azimuth": 69.25419047063797, "Elevation": 3.5519644975674822, "Radius": 0.9999999999999999, "IsImaginary": false, "Channel": 12, "Gain": 1.0 }, { "Azimuth": 273.7975406413473, "Elevation": 20.704124934022076, "Radius": 0.9999999999999999, "IsImaginary": false, "Channel": 13, "Gain": 1.0 }, { "Azimuth": 266.2024593586527, "Elevation": -20.70412493402209, "Radius": 0.9999999999999999, "IsImaginary": false, "Channel": 14, "Gain": 1.0 }, { "Azimuth": 290.745809529362, "Elevation": -3.5519644975674964, "Radius": 0.9999999999999999, "IsImaginary": false, "Channel": 15, "Gain": 1.0 }, { "Azimuth": 249.25419047063798, "Elevation": 3.5519644975674822, "Radius": 0.9999999999999999, "IsImaginary": false, "Channel": 16, "Gain": 1.0 }, { "Azimuth": 350.06056344045453, "Elevation": 68.96553561432427, "Radius": 0.9999999999999999, "IsImaginary": false, "Channel": 17, "Gain": 1.0 }, { "Azimuth": 170.06056344045456, "Elevation": 68.96553561432427, "Radius": 0.9999999999999999, "IsImaginary": false, "Channel": 18, "Gain": 1.0 }, { "Azimuth": 260.06056344045453, "Elevation": 68.96553561432427, "Radius": 0.9999999999999999, "IsImaginary": false, "Channel": 19, "Gain": 1.0 }, { "Azimuth": 80.06056344045454, "Elevation": 68.96553561432427, "Radius": 0.9999999999999999, "IsImaginary": false, "Channel": 20, "Gain": 1.0 }, { "Azimuth": 9.939436559545461, "Elevation": -68.96553561432427, "Radius": 0.9999999999999999, "IsImaginary": false, "Channel": 21, "Gain": 1.0 }, { "Azimuth": 189.93943655954544, "Elevation": -68.96553561432427, "Radius": 0.9999999999999999, "IsImaginary": false, "Channel": 22, "Gain": 1.0 }, { "Azimuth": 99.93943655954548, "Elevation": -68.96553561432427, "Radius": 0.9999999999999999, "IsImaginary": false, "Channel": 23, "Gain": 1.0 }, { "Azimuth": 279.93943655954547, "Elevation": -68.96553561432427, "Radius": 0.9999999999999999, "IsImaginary": false, "Channel": 24, "Gain": 1.0 }, { "Azimuth": 42.14725023145894, "Elevation": 17.568154841333993, "Radius": 1.0, "IsImaginary": false, "Channel": 25, "Gain": 1.0 }, { "Azimuth": 317.85274976854106, "Elevation": -17.568154841333993, "Radius": 1.0, "IsImaginary": false, "Channel": 26, "Gain": 1.0 }, { "Azimuth": 23.123760983615586, "Elevation": -39.772442037871144, "Radius": 1.0, "IsImaginary": false, "Channel": 27, "Gain": 1.0 }, { "Azimuth": 336.87623901638443, "Elevation": 39.77244203787116, "Radius": 1.0, "IsImaginary": false, "Channel": 28, "Gain": 1.0 }, { "Azimuth": 137.85274976854106, "Elevation": -17.568154841333993, "Radius": 1.0, "IsImaginary": false, "Channel": 29, "Gain": 1.0 }, { "Azimuth": 222.14725023145894, "Elevation": 17.568154841333993, "Radius": 1.0, "IsImaginary": false, "Channel": 30, "Gain": 1.0 }, { "Azimuth": 156.8762390163844, "Elevation": 39.77244203787116, "Radius": 1.0, "IsImaginary": false, "Channel": 31, "Gain": 1.0 }, { "Azimuth": 203.1237609836156, "Elevation": -39.772442037871144, "Radius": 1.0, "IsImaginary": false, "Channel": 32, "Gain": 1.0 }, { "Azimuth": 66.87623901638442, "Elevation": 39.77244203787116, "Radius": 1.0, "IsImaginary": false, "Channel": 33, "Gain": 1.0 }, { "Azimuth": 113.12376098361558, "Elevation": -39.772442037871144, "Radius": 1.0, "IsImaginary": false, "Channel": 34, "Gain": 1.0 }, { "Azimuth": 132.14725023145894, "Elevation": 17.568154841333993, "Radius": 1.0, "IsImaginary": false, "Channel": 35, "Gain": 1.0 }, { "Azimuth": 47.85274976854106, "Elevation": -17.568154841333993, "Radius": 1.0, "IsImaginary": false, "Channel": 36, "Gain": 1.0 }, { "Azimuth": 246.87623901638443, "Elevation": 39.77244203787116, "Radius": 1.0, "IsImaginary": false, "Channel": 37, "Gain": 1.0 }, { "Azimuth": 293.12376098361557, "Elevation": -39.772442037871144, "Radius": 1.0, "IsImaginary": false, "Channel": 38, "Gain": 1.0 }, { "Azimuth": 312.14725023145894, "Elevation": 17.568154841333993, "Radius": 1.0, "IsImaginary": false, "Channel": 39, "Gain": 1.0 }, { "Azimuth": 227.85274976854106, "Elevation": -17.568154841333993, "Radius": 1.0, "IsImaginary": false, "Channel": 40, "Gain": 1.0 }, { "Azimuth": 25.258720726766207, "Elevation": 44.978524716209535, "Radius": 1.0, "IsImaginary": false, "Channel": 41, "Gain": 1.0 }, { "Azimuth": 205.2587207267662, "Elevation": 44.978524716209535, "Radius": 1.0, "IsImaginary": false, "Channel": 42, "Gain": 1.0 }, { "Azimuth": 295.2587207267662, "Elevation": 44.978524716209535, "Radius": 1.0, "IsImaginary": false, "Channel": 43, "Gain": 1.0 }, { "Azimuth": 115.25872072676621, "Elevation": 44.978524716209535, "Radius": 1.0, "IsImaginary": false, "Channel": 44, "Gain": 1.0 }, { "Azimuth": 334.7412792732338, "Elevation": -44.978524716209535, "Radius": 1.0, "IsImaginary": false, "Channel": 45, "Gain": 1.0 }, { "Azimuth": 154.7412792732338, "Elevation": -44.978524716209535, "Radius": 1.0, "IsImaginary": false, "Channel": 46, "Gain": 1.0 }, { "Azimuth": 64.74127927323379, "Elevation": -44.978524716209535, "Radius": 1.0, "IsImaginary": false, "Channel": 47, "Gain": 1.0 }, { "Azimuth": 244.74127927323377, "Elevation": -44.978524716209535, "Radius": 1.0, "IsImaginary": false, "Channel": 48, "Gain": 1.0 } ] } }IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/_configurationFiles/4plus5plus0.json0000664002537200253720000000625315257173642031641 0ustar zmoelnigzmoelnig{ "Name": "ITU-R BS.2051-0 Layout D", "Description": "This configuration file was created with the IEM AllRADecoder v0.1.1 plug-in. 5 Apr 2018 12:02:39pm", "LoudspeakerLayout": { "Name": "ITU-R BS.2051-0 Layout D: 4+5+0", "Description": "This layout has 4 loudspeakers in the upper layer and 5 at the horizon.", "Loudspeakers": [ { "Azimuth": 180.00000000000000000000, "Elevation": -70.00000000000000000000, "Radius": 0.50000000000000000000, "IsImaginary": true, "Channel": 10, "Gain": 0.00000000000000000000 }, { "Azimuth": -110.00000000000000000000, "Elevation": 0.00000000000000000000, "Radius": 1.00000000000000000000, "IsImaginary": false, "Channel": 5, "Gain": 1.00000000000000000000 }, { "Azimuth": 110.00000000000000000000, "Elevation": 0.00000000000000000000, "Radius": 1.00000000000000000000, "IsImaginary": false, "Channel": 4, "Gain": 1.00000000000000000000 }, { "Azimuth": -30.00000000000000000000, "Elevation": 0.00000000000000000000, "Radius": 1.00000000000000000000, "IsImaginary": false, "Channel": 3, "Gain": 1.00000000000000000000 }, { "Azimuth": 30.00000000000000000000, "Elevation": 0.00000000000000000000, "Radius": 1.00000000000000000000, "IsImaginary": false, "Channel": 2, "Gain": 1.00000000000000000000 }, { "Azimuth": 0.00000000000000000000, "Elevation": 0.00000000000000000000, "Radius": 1.00000000000000000000, "IsImaginary": false, "Channel": 1, "Gain": 1.00000000000000000000 }, { "Azimuth": 180.00000000000000000000, "Elevation": 30.00000000000000000000, "Radius": 0.50000000000000000000, "IsImaginary": true, "Channel": 12, "Gain": 1.00000000000000000000 }, { "Azimuth": -110.00000000000000000000, "Elevation": 30.00000000000000000000, "Radius": 1.00000000000000000000, "IsImaginary": false, "Channel": 9, "Gain": 1.00000000000000000000 }, { "Azimuth": 110.00000000000000000000, "Elevation": 30.00000000000000000000, "Radius": 1.00000000000000000000, "IsImaginary": false, "Channel": 8, "Gain": 1.00000000000000000000 }, { "Azimuth": -30.00000000000000000000, "Elevation": 30.00000000000000000000, "Radius": 1.00000000000000000000, "IsImaginary": false, "Channel": 7, "Gain": 1.00000000000000000000 }, { "Azimuth": 30.00000000000000000000, "Elevation": 30.00000000000000000000, "Radius": 1.00000000000000000000, "IsImaginary": false, "Channel": 6, "Gain": 1.00000000000000000000 }, { "Azimuth": 0.00000000000000000000, "Elevation": 90.00000000000000000000, "Radius": 1.00000000000000000000, "IsImaginary": true, "Channel": 11, "Gain": 1.00000000000000000000 } ] } } IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/_configurationFiles/lrflip.json0000664002537200253720000001077715257173642031017 0ustar zmoelnigzmoelnig{ "Name" : "Left/right flip", "Description" : "This configuration contains a simple left/right flip matrix.", "TransformationMatrix" : { "Name" : "Flip: left/right o5", "Description" : "This matrix mirrors a 5th order Ambisonic signal across the xy-plane (left right flip)", "Matrix" : [[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1]] } } ././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/_configurationFiles/stereoDecoder.jsonIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/_configurationFiles/stereoDecoder.js0000664002537200253720000000343015257173642031745 0ustar zmoelnigzmoelnig{ "Name" : "Stereo Decoder", "Description" : "This is a stereo decoder configuration.", "Decoder" : { "Name" : "Stereo Decoder o7", "Description" : "This is a 7th Order Ambisonics AllRAD decoder for a stereo setup. Created by Matthias Frank (IEM).", "ExpectedInputNormalization" : "n3d", "Weights" : "maxrE", "WeightsAlreadyApplied" : true, "Matrix" : [[0.342809, 0.225782, 0.168312, 0.401778, 0.277936, 0.122336, -0.142275, 0.195727, 0.172792, 0.173213, 0.138114, -0.037073, -0.092395, -0.076284, 0.063604, 0.013189, 0.058981, 0.06611, -0.020773, -0.028892, 0.035212, -0.038994, -0.02142, -0.014484, -0.01976, 0.012193, 0.006468, -0.007992, -0.008027, 0.016428, 0.011648, 0.031952, 0.003763, -0.006276, -0.01572, -0.002153, 0.006052, -0.005787, -0.003557, 0.006291, 0.017055, 0.005068, -0.015993, 0.003082, 0.010876, 0.005709, -0.001313, 0.000375, 0.003833, 0.003209, -0.000935, -0.000877, 0.004387, 0.006441, 0.001873, -0.003829, -0.000863, -0.0066, -0.001692, -0.000103, 0.000484, 0.000374, 0.002022, -0.000175], [0.342834, -0.225748, 0.168341, 0.401812, -0.277921, -0.122338, -0.142227, 0.195725, 0.172853, -0.173231, -0.138117, 0.037051, -0.092344, -0.076266, 0.063585, 0.013227, -0.058989, -0.066115, 0.02078, 0.028885, 0.035223, -0.038953, -0.021429, -0.014515, -0.019753, -0.012183, -0.006469, 0.008015, 0.008033, -0.016433, 0.011652, 0.031958, 0.003785, -0.006275, -0.015752, -0.00214, -0.006052, 0.00579, 0.003568, -0.006285, -0.017063, -0.005077, -0.015976, 0.003083, 0.010876, 0.005723, -0.001303, 0.000355, 0.003853, -0.003215, 0.000935, 0.000877, -0.004385, -0.006449, -0.001875, 0.003825, -0.000859, -0.00659, -0.001696, -0.000108, 0.000489, 0.000379, 0.002013, -0.000168]] } } IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/_configurationFiles/test2.json0000664002537200253720000016406615257173642030571 0ustar zmoelnigzmoelnig{ "Name": "All-Round Ambisonic decoder (AllRAD) and loudspeaker layout", "Description": "This configuration file was created with the IEM AllRADecoder v0.9.0 plug-in. 5 Mar 2020 1:06:56pm", "Decoder": { "Name": "Decoder", "Description": "A 3rd order Ambisonics decoder using the AllRAD approach.", "ExpectedInputNormalization": "n3d", "Weights": "none", "WeightsAlreadyApplied": false, "Matrix": [ [ 0.05588595941662788, 0.05624393001198769, 0.003875514725223184, 0.07015314698219299, 0.08478108048439026, 0.004114632494747639, -0.04902807623147964, 0.006289353128522635, 0.01938566751778126, 0.06793809682130814, 0.007723529357463121, -0.03282753750681877, -0.005503132939338684, -0.04474736377596855, 0.003475068369880319, -0.0320444293320179 ], [ 0.0264704879373312, -0.0213692095130682, 0.005662362091243267, 0.03845001757144928, -0.03885365650057793, -0.005789558403193951, -0.02525434084236622, 0.01007944531738758, 0.02418126538395882, -0.04447747021913528, -0.01187579892575741, 0.01511264871805906, -0.01011373102664948, -0.02771918661892414, 0.006960021331906319, 0.002188149373978376 ], [ 0.01933258771896362, -0.0008464163984172046, -0.001860313583165407, 0.03259001299738884, -0.001770412200130522, 0.0004225292068440467, -0.02030394598841667, -0.003956491593271494, 0.03428269922733307, -0.002607956994324923, 0.001046888879500329, 0.0005956689710728824, 0.00381830707192421, -0.02745127305388451, -0.004802800714969635, 0.03363940492272377 ], [ 0.01776948757469654, 0.02047121524810791, 0.0003787875757552683, -0.02185925282537937, -0.03124638460576534, -5.790283466922119e-6, -0.01897000707685947, -0.001112786470912397, 0.001997522544115782, 0.02332856506109238, -0.0008418533252552152, -0.0177492406219244, -0.000809444347396493, 0.01890044845640659, 0.001962010050192475, 0.01940859295427799 ], [ 0.04241939634084702, -0.04204484447836876, -0.009969224222004414, -0.05416798964142799, 0.06493974477052689, 0.01366023812443018, -0.03793790936470032, 0.01394544448703527, 0.01666382886469364, -0.05401812121272087, -0.02128294669091702, 0.0253269225358963, 0.01598629541695118, 0.03629085421562195, -0.0004588997398968786, 0.02400687336921692 ], [ 0.0219880361109972, 0.005925095174461603, -0.03290925174951553, -0.01539776753634214, -0.004558974876999855, -0.0115984845906496, 0.03120008669793606, 0.0282602496445179, 0.006780007854104042, 0.002561062574386597, 0.01017071586102247, 0.01584894582629204, -0.02194433473050594, -0.03491663187742233, -0.01373657491058111, -0.003156826831400394 ], [ 0.02588550932705402, 0.01820009760558605, -0.02277412265539169, 0.03202303871512413, 0.02787472307682037, -0.01989006623625755, -0.004824969917535782, -0.03540103882551193, 0.01639603637158871, 0.02641041949391365, -0.03478103131055832, 0.00496385246515274, 0.0248369537293911, 0.00970908161252737, -0.02086294628679752, 0.00009375310037285089 ], [ 0.003382740542292595, 0.002482302952557802, 0.005250439513474703, 0.0005419485969468951, 0.0004988115397281945, 0.004956616088747978, 0.005336592439562082, 0.001086067873984575, -0.001105045550502837, -0.0004471018037293106, 0.001179488725028932, 0.006944029591977596, 0.004109721630811691, 0.001530194189399481, -0.002599602099508047, -0.0003216400218661875 ], [ 0.01022809371352196, 0.002803432289510965, 0.01312754768878222, -0.01114883273839951, -0.004063849803060293, 0.00445949099957943, 0.007742684334516525, -0.01808914355933666, 0.007359429728239775, 0.004197962116450071, -0.007476340979337692, 0.004157540388405323, -0.001107605523429811, -0.01756932586431503, 0.01385631319135427, -0.004280933178961277 ], [ 0.07454980909824371, 0.102015808224678, -0.04828206077218056, 0.02953098714351654, 0.05072483420372009, -0.07663366198539734, -0.02446339093148708, -0.01627951487898827, -0.07550808787345886, -0.04153645783662796, -0.02907850220799446, 0.002114250790327787, 0.03833876922726631, -0.007639505434781313, 0.06237329915165901, -0.05598068982362747 ], [ 0.01761310361325741, 0.005374602973461151, -0.01006640680134296, 0.02754624933004379, 0.01074375864118338, -0.003481066785752773, -0.01212433818727732, -0.01992515102028847, 0.02607654221355915, 0.0149706332013011, -0.008088007569313049, -0.002536908024922013, 0.01669279858469963, -0.009832259267568588, -0.02199055813252926, 0.0221807099878788 ], [ 0.03155196830630302, 0.02255541644990444, -0.0421081930398941, -0.02053511515259743, -0.01593650504946709, -0.03873932361602783, 0.02859496884047985, 0.03357809409499168, -0.0001962483220268041, 0.005056671798229218, 0.03109859861433506, 0.04192941263318062, -0.00370292249135673, -0.0330970399081707, 0.002141973935067654, 0.003510677022859454 ], [ 0.01154173351824284, -0.01598836854100227, -0.01086648367345333, 0.003382156137377024, -0.006154945120215416, 0.01915680803358555, -0.0009473176905885339, -0.003655425272881985, -0.01331348996609449, 0.009749029763042927, 0.007780032232403755, -0.007512550335377455, 0.01101424358785152, 0.0007345500052906573, 0.01880748942494392, -0.007785377558320761 ], [ 0.02149865031242371, -0.02160509675741196, -0.02570619247853756, 0.01329128351062536, -0.01702483557164669, 0.03251643106341362, 0.01151426136493683, -0.0194309763610363, -0.008055159822106361, -0.002167922677472234, 0.02850763872265816, -0.02732585184276104, 0.007511481177061796, 0.01523998565971851, 0.01442400086671114, -0.01318469271063805 ], [ 0.04837166145443916, -0.04678908362984657, 0.03582495078444481, -0.05182420834898949, 0.05867286771535873, -0.0435599647462368, -0.01861998625099659, -0.04641124978661537, 0.006161070894449949, -0.03425478935241699, 0.06141088157892227, -0.001504144980572164, -0.04195057228207588, 0.00164554372895509, 0.004171594046056271, 0.02530083991587162 ], [ 0.02286130748689175, 0.02554287016391754, -0.02093147858977318, -0.01839945279061794, -0.02358903735876083, -0.02978601865470409, -0.003463853383436799, 0.02153567411005497, -0.008306697010993958, 0.003737750696018338, 0.03221791237592697, 0.009781192056834698, 0.02360123954713345, -0.006997975986450911, 0.01099353935569525, 0.01666612736880779 ], [ 0.04564693197607994, 0.07256616652011871, -0.005618592258542776, -0.01441239286214113, -0.02851337566971779, -0.01044331025332212, -0.03805418312549591, 0.004113420844078064, -0.06870590895414352, -0.05752099305391312, 0.00893192645162344, -0.04053571447730064, 0.009029107168316841, 0.0085159782320261, 0.00944287795573473, 0.03865319862961769 ], [ 0.003359029069542885, 0.0003196847683284432, 0.005737246479839087, -0.0007324161706492305, -0.00007180462125688791, 0.0007042338256724179, 0.007201262749731541, -0.001609001192264259, 0.00007936703332234174, 9.834971024247352e-6, -0.0001864870719145983, 0.001152213080786169, 0.008164769969880581, -0.002621620427817106, 0.000204960597329773, -8.542509931430686e-6 ], [ 0.0647733062505722, 0.09321623295545578, 0.03019827231764793, 0.0317942202091217, 0.05521297454833984, 0.05054539069533348, -0.03717312589287758, 0.01791616156697273, -0.07189840078353882, -0.04185634478926659, 0.03339008614420891, -0.02410899102687836, -0.03317535296082497, -0.008017421700060368, -0.04113004729151726, -0.06185043603181839 ], [ 0.005055633373558521, -0.00004606851143762469, -0.008536824956536293, 0.001665796036832035, -0.00005022781260777265, 0.0000934398703975603, 0.01046860497444868, -0.003609989769756794, 0.0003262566751800478, -0.00002669853165571112, 0.0001245064340764657, -0.0001335742708761245, -0.01144961267709732, 0.005762060172855854, -0.0008311282726936042, 0.00005545436579268426 ], [ 0.02734036557376385, -0.02652751095592976, 0.03534047678112984, -0.01138362195342779, 0.01402509119361639, -0.04191335663199425, 0.02240695245563984, -0.01844726875424385, -0.01391815859824419, 0.005358620546758175, 0.02548170648515224, -0.03986490517854691, 0.002206437522545457, -0.01836271025240421, -0.02423750981688499, 0.01192389708012342 ], [ 0.005566194653511047, -0.003165441798046231, 0.008550673723220825, 0.002877657301723957, -0.002097418764606118, -0.006238142028450966, 0.008495308458805084, 0.005644460208714008, -0.0001660963898757473, -0.0006449862266890705, -0.004828569479286671, -0.00856576394289732, 0.006262532901018858, 0.007692749612033367, -0.0004104480904061347, -0.000768823956605047 ], [ 0.04619345441460609, -0.06148375570774078, -0.01777200028300285, 0.03998733684420586, -0.06450764834880829, 0.02737309038639069, -0.03606732189655304, -0.02064035274088383, -0.02912212908267975, -0.008640434592962265, 0.03545385226607323, 0.03190570324659348, 0.02695862948894501, -0.01841690205037594, 0.01017473358660936, -0.06123070046305656 ], [ 0.01797292940318584, 0.0009937881259247661, 0.01937129907310009, 0.02342210151255131, 0.00149851047899574, 0.00150208396371454, 0.003952867817133665, 0.03191167861223221, 0.01909521035850048, 0.001583408564329147, 0.002632354618981481, 0.001233233488164842, -0.01321711111813784, 0.02006939239799976, 0.02999941073358059, 0.01467697229236364 ], [ 0.05806823447346687, 0.0005973225343041122, 0.009347615763545036, -0.09174708276987076, -0.001467712689191103, -0.006263985764235258, -0.05339701473712921, -0.01814956776797771, 0.08256210386753082, 0.00199089664965868, 0.01346583757549524, -0.003000220283865929, -0.01460554264485836, 0.06165972352027893, 0.01959012448787689, -0.06208546832203865 ], [ 0.003886595368385315, -0.001861872500739992, 0.006432481575757265, 0.00003810866110143252, -0.00003985578587162308, -0.003956091590225697, 0.007563038263469934, 0.00007576461212011054, -0.0005776191828772426, 0.0001705761242192239, -0.00009459180728299543, -0.006125051062554121, 0.007722506299614906, 0.0001050316932378337, -0.001445215893909335, -0.0000286391605186509 ], [ 0.07716375589370728, -0.01396388188004494, -0.06665320694446564, -0.100225992500782, 0.02082413248717785, 0.01359139010310173, -0.008843288756906986, 0.1024156361818314, 0.07167550176382065, -0.01927413046360016, -0.02122165635228157, -0.002960206242278218, 0.0513477548956871, -0.02600972913205624, -0.07879737764596939, -0.04049172624945641 ], [ 0.02873549424111843, -0.005479045677930117, 0.02969750948250294, -0.03718670085072517, 0.008611090481281281, -0.007342275697737932, 0.004556122701615095, -0.04761981219053268, 0.0293409489095211, -0.009046647697687149, 0.01347094401717186, -0.004344984889030457, -0.0195156168192625, -0.02649234235286713, 0.04263247549533844, -0.02105235308408737 ], [ 0.004647484980523586, 0.001267844811081886, 0.007879636250436306, 0.0005792142474092543, 0.0001813495910027996, 0.002762698102742434, 0.00974283367395401, 0.001262174570001662, -0.0001652632636250928, -0.0000129803429445019, 0.0004646337474696338, 0.004446185659617186, 0.01079211011528969, 0.002031479263678193, -0.0004242610884830356, -0.00003810941052506678 ], [ 0.000893749063834548, 0.0001534877083031461, -0.001534988754428923, 0.00008800816431175917, 0.00002360396865697112, -0.0003390246420167387, 0.001948411110788584, -0.0001944490650203079, -0.00001400784276484046, -1.976782471047045e-7, -0.00006146691885078326, 0.0005569609347730875, -0.002247520489618182, 0.000319585669785738, 0.00003644213211373426, -4.80401922686724e-6 ], [ 0.009206049144268036, 0.009599721990525723, 0.01249497104436159, 0.0005389283178374171, 0.0006769202300347388, 0.01662344299256802, 0.00880056619644165, 0.0009633684530854225, -0.00638206209987402, -0.004050880204886198, 0.001415760139934719, 0.01813830062747002, 0.001281818142160773, 0.001116222469136119, -0.01292034517973661, -0.0006071390816941857 ], [ 0.005390127655118704, -0.0006771550979465246, -0.008701560087502003, 0.003088476601988077, -0.0005823636893182993, 0.001370492158457637, 0.009698984213173389, -0.006382444407790899, 0.001065426622517407, -0.0003502464387565851, 0.00138780998531729, -0.001963675720617175, -0.009038001298904419, 0.009465210139751434, -0.002585913287475705, 0.0003125681832898408 ], [ 0.007626209408044815, 0.0004460471100173891, -0.01134336180984974, 0.006403859239071608, 0.0002690211404114962, -0.0009602425270713866, 0.01039992552250624, -0.01217635720968246, 0.00332276476547122, 0.00002319574923603795, -0.000745489087421447, 0.001490294234827161, -0.006268685217946768, 0.01574254967272282, -0.007396006491035223, 0.001598822651430964 ], [ 0.02571826055645943, -0.01001033280044794, -0.03914947062730789, -0.01435940712690353, 0.00693642208352685, 0.01931475847959518, 0.03869132697582245, 0.0264471098780632, 0.004041913896799088, -0.003739099251106381, -0.01490603014826775, -0.02587981149554253, -0.0298397745937109, -0.03290560096502304, -0.007797828409820795, -0.001015495974570513 ], [ 0.0290195569396019, 0.02172486111521721, 0.02908765897154808, 0.03202725574374199, 0.02986210957169533, 0.02763753943145275, 0.002794915810227394, 0.03922052681446075, 0.01249244343489408, 0.02508994564414024, 0.04248432815074921, 0.01519994623959064, -0.02081340178847313, 0.01916773803532124, 0.01583972759544849, -0.004081975668668747 ], [ 0.01517682708799839, 0.01790318638086319, 0.009773189201951027, -0.01572092436254025, -0.02350763231515884, 0.01475644018501043, -0.009038928896188736, -0.01253593806177378, -0.002930960152298212, 0.01273024175316095, -0.02195332199335098, -0.00387709797360003, -0.01526101771742105, 0.004161511547863483, -0.003433223580941558, 0.01836183480918407 ], [ 0.02637272700667381, -0.02941029146313667, 0.03162671998143196, 0.008860417641699314, -0.01268959976732731, -0.04363883659243584, 0.01476929895579815, 0.01303389016538858, -0.01882086880505085, 0.009951646439731121, -0.02136657387018204, -0.03601470589637756, -0.007245517801493406, 0.01034738961607218, -0.03158863261342049, -0.01228966005146503 ], [ 0.0008736408199183643, 0.00001015745692711789, -0.001507323933765292, -0.0001072738887160085, 4.128296779981611e-7, -0.00002278795545862522, 0.001930879196152091, 0.0002384894760325551, 9.849354682955891e-6, -3.811179851709312e-7, -1.03985018995445e-6, 0.00003831645517493598, -0.002258137334138155, -0.0003956241416744888, -0.0000258671188930748, -8.896178087525186e-7 ], [ 0.0006178420153446496, 0.00007863670907681808, 0.001066329306922853, 2.943695847079653e-7, -7.150524083954224e-7, 0.0001750046794768423, 0.001366842654533684, 7.178567216215015e-7, -7.125530828488991e-6, -6.852248475297529e-7, -1.874634676823916e-6, 0.0002907605667132884, 0.001600027550011873, 1.349940816908202e-6, -0.00001874154622782953, 1.374646672047675e-7 ], [ 0.006704412400722504, 0.004218350630253553, -0.009962849318981171, 0.003799140220507979, 0.002977634314447641, -0.007931428961455822, 0.009118617512285709, -0.007296768948435783, -0.0005085458396933973, 0.0006288384902291, -0.006634389515966177, 0.01006459258496761, -0.005487017333507538, 0.00959973968565464, 0.0009792627533897758, -0.001396063948050141 ], [ 0.0009718704968690872, 0.0001819015888031572, -0.001670775702223182, 0.00001497129414929077, 7.274672952917172e-6, -0.0004030468699056655, 0.002124813385307789, -0.00003271857349318452, -0.000021149864551262, -2.066753268081811e-6, -0.00001888576662167907, 0.0006652415031567216, -0.002457828726619482, 0.00005287521707941778, 0.00005537252582143992, -2.051346882581129e-6 ], [ 0.006543250288814306, 0.004224618896842003, 0.008028198033571243, -0.006578677799552679, -0.005444791167974472, 0.006672477815300226, 0.003873781533911824, -0.01020885817706585, 0.002591303316876292, 0.004475190304219723, -0.009971966966986656, 0.006058068946003914, -0.002298689913004637, -0.008939690887928009, 0.004528190940618515, 0.0004203842545393854 ], [ 0.001655902247875929, 0.0002086546155624092, -0.002839121734723449, -0.0002640917082317173, -0.00002790985126921441, -0.0004613699566107243, 0.003591119544580579, 0.0005843284307047725, 9.801666237763129e-6, 1.258383804270125e-6, 0.0000731120744603686, 0.0007591157918795943, -0.004119386896491051, -0.0009623633231967688, -0.0000256820821959991, -1.551749619466136e-6 ], [ 0.02950846217572689, 0.01859905384480953, 0.02185747586190701, -0.0399845726788044, -0.03173566609621048, 0.01637939922511578, -0.01174356881529093, -0.03687778115272522, 0.02633323706686497, 0.03504877164959908, -0.03179002553224564, -0.001185993896797299, -0.02693906985223293, -0.0001364823110634461, 0.02836998552083969, -0.008685761131346226 ], [ 0.01731151342391968, -0.006027258932590485, 0.009862170554697514, 0.02694674022495747, -0.01181567925959826, -0.004472368862479925, -0.01176551543176174, 0.01924041472375393, 0.02532386407256126, -0.01623490825295448, -0.01002952922135592, 0.001835532835684717, -0.01597040891647339, -0.009597656317055225, 0.02067967131733894, 0.02138731442391872 ], [ 0.009196599945425987, 0.006931380368769169, 0.01392445247620344, -0.002484254771843553, -0.002407786203548312, 0.01340078841894865, 0.01336746476590633, -0.004787526559084654, -0.002884512301534414, -0.0009046203340403736, -0.005422726273536682, 0.01783745177090168, 0.009128990583121777, -0.006338702980428934, -0.006526682991534472, 0.001600985880941153 ], [ 0.02310051769018173, -0.03566509485244751, -0.003611590946093202, -0.01445518806576729, 0.02833606861531734, 0.007057372014969587, -0.02159335650503635, 0.001939789508469403, -0.02910059504210949, 0.01617588475346565, -0.004510538186877966, 0.02463167905807495, 0.005806644912809134, 0.01028213370591402, 0.007607389241456985, 0.03725770488381386 ], [ 0.004157603718340397, 0.004392486065626144, 0.005487417802214622, -0.00137317564804107, -0.001878602895885706, 0.007435838226228952, 0.003486601868644357, -0.002318010432645679, -0.002697792137041688, -0.001381345558911562, -0.003729243762791157, 0.007719184271991253, -0.0002352833398617804, -0.002392041496932507, -0.005372978281229734, 0.001797598553821445 ], [ 0.009187748655676842, 0.01367437746375799, 0.002991171786561608, -0.007097188849002123, -0.01355644222348928, 0.005662305280566216, -0.008610285818576813, -0.002836116123944521, -0.009504653513431549, -0.002200044458732009, -0.006327673327177763, -0.009412158280611038, -0.005769180599600077, 0.005025683902204037, -0.004697810858488083, 0.01692124642431736 ], [ 0.01411562599241734, 0.006633991841226816, -0.01853503100574017, 0.01354927010834217, 0.007747172843664885, -0.01102244853973389, 0.01165403425693512, -0.02275517955422401, 0.005847913678735495, 0.005556827876716852, -0.0150730861350894, 0.01107276231050491, 0.0007945323013700545, 0.02338854782283306, -0.0115747582167387, 0.0008996961987577379 ], [ 0.001279243966564536, 0.0004632622876670212, 0.001913092564791441, -0.001005650963634253, -0.0004757493443321437, 0.000887993723154068, 0.001771387527696788, -0.001937864464707673, 0.0003966895455960184, 0.0003258017532061785, -0.001077338703908026, 0.001160107553005219, 0.00107792706694454, -0.00255544250831008, 0.000905164226423949, -0.00007964944961713627 ], [ 0.03373373299837112, -0.04371065646409988, 0.02116575837135315, 0.02776443958282471, -0.04496562108397484, -0.03405534476041794, -0.01839942298829556, 0.02065428346395493, -0.02067718468606472, -0.006743507925421, -0.03819398954510689, 0.008491256274282932, -0.02816730365157127, -0.006610109470784664, -0.01964782178401947, -0.04336246475577354 ], [ 0.05947262421250343, -0.08916044980287552, 0.03405141457915306, -0.0004880441119894385, -0.00006478307477664202, -0.05972684547305107, -0.03110670298337936, -0.00340252835303545, -0.08107399195432663, 0.06626642495393753, 0.006334879901260138, 0.01965343207120895, -0.03704938665032387, -0.003587980987504125, -0.05821884423494339, -0.001163016422651708 ], [ 0.004597504623234272, 0.001269902335479856, -0.00750937033444643, 0.00215703179128468, 0.0007658523973077536, -0.002660955302417278, 0.008582677692174911, -0.004521964583545923, 0.0004163985722698271, 0.0002882056869566441, -0.001887585502117872, 0.004031813703477383, -0.008349234238266945, 0.006855966988950968, -0.001028625876642764, -0.00001943186725839041 ], [ 0.0188746266067028, 0.0130291311070323, -0.02912875078618526, 0.0008486120495945215, 0.0007517010089941323, -0.02529920823872089, 0.02944700792431831, -0.001676467247307301, -0.00565864285454154, -0.002242260845378041, -0.001711294869892299, 0.03404846042394638, -0.02307267673313618, 0.002322256797924638, 0.01267679408192635, -0.0005005041602998972 ], [ 0.007629694417119026, -0.0023523208219558, 0.01177498418837786, 0.005188705865293741, -0.002059633610770106, -0.004615049809217453, 0.01183765567839146, 0.01024875976145267, 0.001740630017593503, -0.001188156893476844, -0.004727610386908054, -0.0062964609824121, 0.008983041159808636, 0.01413313578814268, 0.004049124661833048, 0.0002771404979284853 ], [ 0.008003332652151585, -0.001805458101443946, -0.005002297926694155, 0.0126348864287138, -0.003602039068937302, 0.001568977953866124, -0.005141464993357658, -0.01004224363714457, 0.01252298895269632, -0.005133006256073713, 0.003655848558992147, 0.0003273429756518453, 0.008323497138917446, -0.003671455197036266, -0.01155669987201691, 0.01166525576263666 ], [ 0.003619099035859108, -0.001333502936176956, 0.006007969379425049, 0.001012147520668805, -0.0004547656280919909, -0.002844672882929444, 0.007107778917998075, 0.002165712649002671, -0.0001502104569226503, -0.0000268211751972558, -0.001146378926932812, -0.004430590663105249, 0.007327946834266186, 0.003389039076864719, -0.0003747047740034759, -0.0001242718280991539 ], [ 0.03028636425733566, -0.04815344884991646, -0.01525829266756773, 0.0006655886536464095, -0.001235361909493804, 0.03014605864882469, -0.02195056341588497, -0.0006278270157054067, -0.04752893000841141, 0.04345270991325378, 0.001486621331423521, 0.02023861929774284, 0.02429762855172157, -0.0003113601414952427, 0.03397763520479202, -0.001465746317990124 ], [ 0.01799183525145054, 0.01735996641218662, 0.01975860260426998, -0.01522874739021063, -0.01878814958035946, 0.02421198412775993, 0.005186738446354866, -0.02054646611213684, -0.00207008863799274, 0.008902210742235184, -0.02957648597657681, 0.01669625751674175, -0.01108008716255426, -0.0128823472186923, -0.004248995799571276, 0.01171260699629784 ], [ 0.002366744447499514, -0.0003641304501798004, -0.004064307082444429, 0.0001427481911377981, -0.0000415863687521778, 0.0008035129285417497, 0.005157760344445705, -0.0003133386780973524, -0.00002218012195953634, -3.433473011682509e-6, 0.0001073298772098497, -0.001318147289566696, -0.005947768688201904, 0.0005099470727145672, 0.0000576933307456784, -8.97753761819331e-6 ], [ 0.05536859855055809, -0.05674357712268829, -0.06025026738643646, -0.03376613184809685, 0.04270589724183083, 0.07436712086200714, 0.01880569010972977, 0.0423814095556736, -0.0219949334859848, -0.002579656895250082, -0.05902182683348656, -0.04856259375810623, 0.02093124948441982, -0.02392295561730862, 0.03276333212852478, 0.03154009580612183 ], [ 0.006623321678489447, 0.0003915148845408112, 0.01104677189141512, 0.002669684123247862, 0.0002114554081344977, 0.0008324592490680516, 0.01320285815745592, 0.005711751990020275, 0.000619809259660542, 0.00008627055649412796, 0.0005263544153422117, 0.00129056756850332, 0.01385504566133022, 0.008938996121287346, 0.001556834788061678, 0.0001271066867047921 ], [ 0.01890364289283752, -0.0105202067643404, -0.02985342033207417, 0.004579457920044661, -0.002952795475721359, 0.02095910161733627, 0.03176269307732582, -0.009229534305632114, -0.002987140556797385, 0.0006740860408172011, 0.006923846900463104, -0.02936580963432789, -0.02737215161323547, 0.01316089648753405, 0.006824673153460026, -0.001144608249887824 ], [ 0.007390670478343964, -0.001830589142628014, 0.01232417300343513, -0.002350067952647805, 0.0007759512518532574, -0.003906564321368933, 0.01473149750381708, -0.004990741610527039, 0.0002499014954082668, -0.0002294156729476526, 0.001932260813191533, -0.006092121824622154, 0.01548528298735619, -0.007725436240434647, 0.0006090006208978593, 0.00004239620466250926 ], [ 0.009580596350133419, 0.007565001957118511, 0.01361427642405033, 0.005042745266109705, 0.004909920506179333, 0.01367495954036713, 0.01102214585989714, 0.00924982875585556, -0.002229115925729275, 0.0002870742173399776, 0.01049149874597788, 0.01616700179874897, 0.004297832492738962, 0.01122987829148769, -0.004591347184032202, -0.002993182046338916 ], [ 0.002521273447200656, 0.001327724196016788, 0.004142466932535172, 0.00006281368405325338, 0.00005365518882172182, 0.002810699166730046, 0.00479231309145689, 0.000128382453112863, -0.0004312270903028548, -0.0001274776732316241, 0.0001305235200561583, 0.004325045272707939, 0.004752709064632654, 0.000186476347153075, -0.00107841903809458, -0.00003006749102496542 ], [ 0.008317979052662849, -0.004609160125255585, -0.01179765444248915, 0.006502620875835419, -0.004466305952519178, 0.008388333953917027, 0.009474056772887707, -0.01181439869105816, 0.001609848230145872, -0.002541965106502175, 0.009551533497869968, -0.01001488510519266, -0.003496528137475252, 0.01406987570226192, -0.003414763603359461, -0.0006275178748182952 ], [ 0.004556383471935987, 0.001654194202274084, 0.007514739409089088, -0.001535327988676727, -0.0006987248780205846, 0.003510169452056289, 0.00876898504793644, -0.003248232649639249, -0.00002934985059255268, 0.0001437397149857134, -0.001742166583426297, 0.005423456896096468, 0.008837434463202953, -0.004995393101125956, -0.00007849661778891459, 0.0001461464125895873 ], [ 0.007152064703404903, -0.001153445686213672, 0.009792794473469257, 0.007299603428691626, -0.001510665751993656, -0.002010792959481478, 0.007083924952894449, 0.01277666632086039, 0.004643197637051344, -0.00138885376509279, -0.003097283421084285, -0.002213755855336785, 0.001345547498203814, 0.0142180547118187, 0.009526494890451431, 0.00274518271908164 ], [ 0.02678301744163036, 0.02521315775811672, -0.01319390814751387, -0.03429184854030609, -0.03891362249851227, -0.01578951254487038, -0.02125919610261917, 0.02143540047109127, 0.01202116161584854, 0.03283333778381348, 0.02840103395283222, -0.01256142556667328, 0.02380705624818802, 0.01695876754820347, -0.008650142699480057, 0.01175958104431629 ], [ 0.0001838084281189367, 3.110111720161512e-6, -0.0003183464286848903, 1.577134753460996e-6, 3.445115126510245e-8, -6.954004220460774e-6, 0.0004109341534785926, -3.526368800521595e-6, -2.523378306307222e-8, -8.191973488447246e-11, -9.114371124496756e-8, 0.00001163522847491549, -0.0004861363850068301, 5.900213636778062e-6, 6.675831798474974e-8, -4.985391544032325e-10 ], [ 0.004249240271747112, 0.004143477417528629, -0.004948191344738007, 0.003435767255723476, 0.004275693092495203, -0.006208777893334627, 0.001728771138004959, -0.005131334532052279, -0.0007904438534751534, 0.001659529283642769, -0.007532518822699785, 0.004875446669757366, 0.002649061847478151, 0.004000259097665548, 0.001422428758814931, -0.002909555099904537 ], [ 0.005650760605931282, 0.002956485608592629, 0.008641202002763748, -0.003313487162813544, -0.002239771420136094, 0.005771982483565807, 0.008488010615110397, -0.006504936143755913, 0.0002108443586621433, 0.000860891945194453, -0.005143564660102129, 0.007799426559358835, 0.00608832249417901, -0.008871663361787796, 0.0005138839478604496, 0.0006898597348481417 ], [ 0.02151693589985371, 0.03071987070143223, 0.0171490516513586, -0.008441491983830929, -0.01554500591009855, 0.03064648993313313, -0.006734991446137428, -0.007815344259142876, -0.02549468912184238, -0.01775986514985561, -0.01646016538143158, 0.004000511486083269, -0.02026600949466228, 0.00004299171632737853, -0.02939083054661751, 0.0197555311024189 ], [ 0.03247740119695663, -0.02094469778239727, 0.03353248909115791, 0.03665961697697639, -0.02999434433877468, -0.02679930627346039, 0.006043856497853994, 0.04583852365612984, 0.01811571791768074, -0.02768034487962723, -0.04251260310411453, -0.01576005294919014, -0.01894344575703144, 0.02490752935409546, 0.02463448420166969, 0.001131287310272455 ], [ 0.01061492506414652, 0.003215562785044312, 0.01531426329165697, 0.009169985540211201, 0.003540522884577513, 0.005925038363784552, 0.01300227921456099, 0.01679299399256706, 0.00451800087466836, 0.002704140031710267, 0.007602071855217218, 0.007268161978572607, 0.006305395159870386, 0.02039686590433121, 0.009602565318346024, 0.001829951303079724 ], [ 0.03912117704749107, -0.01410369388759136, -0.04162843897938728, 0.04602329060435295, -0.01948168687522411, 0.01720527373254299, 0.007919369265437126, -0.06198654323816299, 0.0260944552719593, -0.01535799540579319, 0.0273460615426302, -0.007543332874774933, 0.0278270747512579, 0.03845431283116341, -0.04182139039039612, 0.008072989992797375 ], [ 0.01522418577224016, -0.01009600516408682, -0.007091144099831581, 0.02270437218248844, -0.01894559897482395, 0.006015634629875422, -0.01255977246910334, -0.01341501902788877, 0.0171180609613657, -0.02343704737722874, 0.01319756358861923, 0.005456781014800072, 0.01301218196749687, -0.012236631475389, -0.01174383237957954, 0.007745390757918358 ], [ 0.01003441866487265, 0.0002483850985299796, 0.01591801270842552, -0.006420935969799757, -0.0001417449675500393, 0.000530396297108382, 0.01708426512777805, -0.01295790169388056, 0.002685058396309614, 0.00003649240898084827, -0.0003670473524834961, 0.0008237216388806701, 0.01490005664527416, -0.01851888746023178, 0.006320528220385313, -0.001089941943064332 ], [ 0.01705331727862358, 0.006766575388610363, 0.009730645455420017, 0.02631720714271069, 0.01306315418332815, 0.005241320002824068, -0.0115693612024188, 0.0187440924346447, 0.02413058653473854, 0.01759564317762852, 0.01153609342873096, -0.001746354158967733, -0.01572519727051258, -0.00945928692817688, 0.01942260935902596, 0.01952352002263069 ], [ 0.005249082576483488, -0.000867669063154608, 0.008962992578744888, 0.0006358448881655931, -0.0001060830327332951, -0.001896951231174171, 0.01124453078955412, 0.001398316118866205, -0.00008523154247086495, 0.00001000582687993301, -0.0002732496650423855, -0.003068311139941216, 0.01274128630757332, 0.002282064175233245, -0.0002183189935749397, -0.00001644947951717768 ], [ 0.01156054716557264, -0.006028907373547554, 0.01610043831169605, -0.009540596976876259, 0.006676231045275927, -0.01039252337068319, 0.01250874623656273, -0.01678121462464333, 0.002932899631559849, -0.004551111720502377, 0.01331502664834261, -0.01141708809882402, 0.004544785711914301, -0.0191064290702343, 0.006177256815135479, 0.0009792818455025554 ], [ 0.005355225410312414, 0.002088159555569291, 0.008700218982994556, 0.002183530246838927, 0.001043269294314086, 0.004365036729723215, 0.009824588894844055, 0.004553941078484058, 0.0000607153087912593, 0.000255386607022956, 0.002566061913967133, 0.006586581002920866, 0.009346004575490952, 0.006846714299172163, 0.0001434298319509253, -0.0002082689170492813 ] ], "Routing": [ 1, 2, 3, 4, 5, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86 ] }, "LoudspeakerLayout": { "Name": "A loudspeaker layout", "Loudspeakers": [ { "Azimuth": 30.0, "Elevation": 0.0, "Radius": 1.0, "IsImaginary": false, "Channel": 1, "Gain": 1.0 }, { "Azimuth": -30.0, "Elevation": 0.0, "Radius": 1.0, "IsImaginary": false, "Channel": 2, "Gain": 1.0 }, { "Azimuth": 0.0, "Elevation": 0.0, "Radius": 1.0, "IsImaginary": false, "Channel": 3, "Gain": 1.0 }, { "Azimuth": 130.0, "Elevation": 0.0, "Radius": 1.0, "IsImaginary": false, "Channel": 4, "Gain": 1.0 }, { "Azimuth": -130.0, "Elevation": 0.0, "Radius": 1.0, "IsImaginary": false, "Channel": 5, "Gain": 1.0 }, { "Azimuth": 0.0, "Elevation": 90.0, "Radius": 1.0, "IsImaginary": true, "Channel": 6, "Gain": 0.0 }, { "Azimuth": 0.0, "Elevation": -90.0, "Radius": 1.0, "IsImaginary": true, "Channel": 7, "Gain": 0.0 }, { "Azimuth": 156.343505859375, "Elevation": -77.32920837402344, "Radius": 1.0, "IsImaginary": false, "Channel": 8, "Gain": 1.0 }, { "Azimuth": 35.94946670532227, "Elevation": -28.65211486816406, "Radius": 1.0, "IsImaginary": false, "Channel": 9, "Gain": 1.0 }, { "Azimuth": 67.89724731445312, "Elevation": 64.504638671875, "Radius": 1.0, "IsImaginary": false, "Channel": 10, "Gain": 1.0 }, { "Azimuth": 159.0580902099609, "Elevation": 54.68124389648438, "Radius": 1.0, "IsImaginary": false, "Channel": 11, "Gain": 1.0 }, { "Azimuth": 75.08197021484375, "Elevation": -38.6996955871582, "Radius": 1.0, "IsImaginary": false, "Channel": 12, "Gain": 1.0 }, { "Azimuth": 8.426385879516602, "Elevation": -18.86156463623047, "Radius": 1.0, "IsImaginary": false, "Channel": 13, "Gain": 1.0 }, { "Azimuth": 127.3879623413086, "Elevation": -45.21382522583008, "Radius": 1.0, "IsImaginary": false, "Channel": 14, "Gain": 1.0 }, { "Azimuth": 282.4663391113281, "Elevation": -44.03564834594727, "Radius": 1.0, "IsImaginary": false, "Channel": 15, "Gain": 1.0 }, { "Azimuth": 285.6147155761719, "Elevation": -46.66128158569336, "Radius": 1.0, "IsImaginary": false, "Channel": 16, "Gain": 1.0 }, { "Azimuth": 227.7472076416016, "Elevation": 23.58154296875, "Radius": 1.0, "IsImaginary": false, "Channel": 17, "Gain": 1.0 }, { "Azimuth": 129.9808654785156, "Elevation": -35.77299880981445, "Radius": 1.0, "IsImaginary": false, "Channel": 18, "Gain": 1.0 }, { "Azimuth": 106.5510330200195, "Elevation": -8.441055297851562, "Radius": 1.0, "IsImaginary": false, "Channel": 19, "Gain": 1.0 }, { "Azimuth": 122.2624359130859, "Elevation": 82.34465026855469, "Radius": 1.0, "IsImaginary": false, "Channel": 20, "Gain": 1.0 }, { "Azimuth": 72.77767181396484, "Elevation": 37.14752960205078, "Radius": 1.0, "IsImaginary": false, "Channel": 21, "Gain": 1.0 }, { "Azimuth": 17.05070114135742, "Elevation": -84.43448638916016, "Radius": 1.0, "IsImaginary": false, "Channel": 22, "Gain": 1.0 }, { "Azimuth": 239.1049194335938, "Elevation": 68.16072082519531, "Radius": 1.0, "IsImaginary": false, "Channel": 23, "Gain": 1.0 }, { "Azimuth": 294.3244018554688, "Elevation": 65.151611328125, "Radius": 1.0, "IsImaginary": false, "Channel": 24, "Gain": 1.0 }, { "Azimuth": 306.5675964355469, "Elevation": -9.301361083984375, "Radius": 1.0, "IsImaginary": false, "Channel": 25, "Gain": 1.0 }, { "Azimuth": 4.041834354400635, "Elevation": 35.55632781982422, "Radius": 1.0, "IsImaginary": false, "Channel": 26, "Gain": 1.0 }, { "Azimuth": 170.4044342041016, "Elevation": 3.579765319824219, "Radius": 1.0, "IsImaginary": false, "Channel": 27, "Gain": 1.0 }, { "Azimuth": 270.013671875, "Elevation": 69.80685424804688, "Radius": 1.0, "IsImaginary": false, "Channel": 28, "Gain": 1.0 }, { "Azimuth": 187.4513092041016, "Elevation": -22.96147155761719, "Radius": 1.0, "IsImaginary": false, "Channel": 29, "Gain": 1.0 }, { "Azimuth": 193.1359405517578, "Elevation": 47.805908203125, "Radius": 1.0, "IsImaginary": false, "Channel": 30, "Gain": 1.0 }, { "Azimuth": 87.51930999755859, "Elevation": 78.53073120117188, "Radius": 1.0, "IsImaginary": false, "Channel": 31, "Gain": 1.0 }, { "Azimuth": 32.12990188598633, "Elevation": -86.38813018798828, "Radius": 1.0, "IsImaginary": false, "Channel": 32, "Gain": 1.0 }, { "Azimuth": 89.48677825927734, "Elevation": 52.09768676757812, "Radius": 1.0, "IsImaginary": false, "Channel": 33, "Gain": 1.0 }, { "Azimuth": 351.6494140625, "Elevation": -64.06101989746094, "Radius": 1.0, "IsImaginary": false, "Channel": 34, "Gain": 1.0 }, { "Azimuth": 352.8275451660156, "Elevation": -63.7120475769043, "Radius": 1.0, "IsImaginary": false, "Channel": 35, "Gain": 1.0 }, { "Azimuth": 203.2311553955078, "Elevation": -76.96486663818359, "Radius": 1.0, "IsImaginary": false, "Channel": 36, "Gain": 1.0 }, { "Azimuth": 43.00521087646484, "Elevation": 44.28359985351562, "Radius": 1.0, "IsImaginary": false, "Channel": 37, "Gain": 1.0 }, { "Azimuth": 128.9801635742188, "Elevation": 14.86852264404297, "Radius": 1.0, "IsImaginary": false, "Channel": 38, "Gain": 1.0 }, { "Azimuth": 290.618408203125, "Elevation": 61.78358459472656, "Radius": 1.0, "IsImaginary": false, "Channel": 39, "Gain": 1.0 }, { "Azimuth": 133.1874847412109, "Elevation": -89.03391265869141, "Radius": 1.0, "IsImaginary": false, "Channel": 40, "Gain": 1.0 }, { "Azimuth": 74.13334655761719, "Elevation": 89.59426879882812, "Radius": 1.0, "IsImaginary": false, "Channel": 41, "Gain": 1.0 }, { "Azimuth": 41.85783386230469, "Elevation": -57.67450332641602, "Radius": 1.0, "IsImaginary": false, "Channel": 42, "Gain": 1.0 }, { "Azimuth": 109.2193908691406, "Elevation": -84.81214904785156, "Radius": 1.0, "IsImaginary": false, "Channel": 43, "Gain": 1.0 }, { "Azimuth": 144.3213806152344, "Elevation": 54.64051818847656, "Radius": 1.0, "IsImaginary": false, "Channel": 44, "Gain": 1.0 }, { "Azimuth": 146.2114715576172, "Elevation": -81.85577392578125, "Radius": 1.0, "IsImaginary": false, "Channel": 45, "Gain": 1.0 }, { "Azimuth": 159.9962921142578, "Elevation": 18.82240295410156, "Radius": 1.0, "IsImaginary": false, "Channel": 46, "Gain": 1.0 }, { "Azimuth": 356.3497619628906, "Elevation": 15.30218505859375, "Radius": 1.0, "IsImaginary": false, "Channel": 47, "Gain": 1.0 }, { "Azimuth": 107.6309204101562, "Elevation": 66.46701049804688, "Radius": 1.0, "IsImaginary": false, "Channel": 48, "Gain": 1.0 }, { "Azimuth": 242.0955810546875, "Elevation": 0.2441635131835938, "Radius": 1.0, "IsImaginary": false, "Channel": 49, "Gain": 1.0 }, { "Azimuth": 107.5640029907227, "Elevation": 44.07992553710938, "Radius": 1.0, "IsImaginary": false, "Channel": 50, "Gain": 1.0 }, { "Azimuth": 122.596321105957, "Elevation": 8.113983154296875, "Radius": 1.0, "IsImaginary": false, "Channel": 51, "Gain": 1.0 }, { "Azimuth": 43.55049514770508, "Elevation": -53.41069412231445, "Radius": 1.0, "IsImaginary": false, "Channel": 52, "Gain": 1.0 }, { "Azimuth": 152.9323425292969, "Elevation": 57.02293395996094, "Radius": 1.0, "IsImaginary": false, "Channel": 53, "Gain": 1.0 }, { "Azimuth": 309.0556335449219, "Elevation": 19.04463195800781, "Radius": 1.0, "IsImaginary": false, "Channel": 54, "Gain": 1.0 }, { "Azimuth": 266.0870361328125, "Elevation": 12.40871429443359, "Radius": 1.0, "IsImaginary": false, "Channel": 55, "Gain": 1.0 }, { "Azimuth": 46.50417327880859, "Elevation": -72.17700958251953, "Radius": 1.0, "IsImaginary": false, "Channel": 56, "Gain": 1.0 }, { "Azimuth": 62.03335571289062, "Elevation": -72.69308471679688, "Radius": 1.0, "IsImaginary": false, "Channel": 57, "Gain": 1.0 }, { "Azimuth": 354.7068176269531, "Elevation": 68.80496215820312, "Radius": 1.0, "IsImaginary": false, "Channel": 58, "Gain": 1.0 }, { "Azimuth": 349.811767578125, "Elevation": -26.85671615600586, "Radius": 1.0, "IsImaginary": false, "Channel": 59, "Gain": 1.0 }, { "Azimuth": 298.373291015625, "Elevation": 70.0020751953125, "Radius": 1.0, "IsImaginary": false, "Channel": 60, "Gain": 1.0 }, { "Azimuth": 270.153076171875, "Elevation": -18.67958831787109, "Radius": 1.0, "IsImaginary": false, "Channel": 61, "Gain": 1.0 }, { "Azimuth": 124.314453125, "Elevation": 46.50726318359375, "Radius": 1.0, "IsImaginary": false, "Channel": 62, "Gain": 1.0 }, { "Azimuth": 355.0306396484375, "Elevation": -89.96035003662109, "Radius": 1.0, "IsImaginary": false, "Channel": 63, "Gain": 1.0 }, { "Azimuth": 252.8854675292969, "Elevation": -46.95735168457031, "Radius": 1.0, "IsImaginary": false, "Channel": 64, "Gain": 1.0 }, { "Azimuth": 355.6070861816406, "Elevation": 74.00874328613281, "Radius": 1.0, "IsImaginary": false, "Channel": 65, "Gain": 1.0 }, { "Azimuth": 309.9019470214844, "Elevation": -68.92700958251953, "Radius": 1.0, "IsImaginary": false, "Channel": 66, "Gain": 1.0 }, { "Azimuth": 227.4536437988281, "Elevation": 76.6678466796875, "Radius": 1.0, "IsImaginary": false, "Channel": 67, "Gain": 1.0 }, { "Azimuth": 52.98881530761719, "Elevation": 61.51449584960938, "Radius": 1.0, "IsImaginary": false, "Channel": 68, "Gain": 1.0 }, { "Azimuth": 88.31106567382812, "Elevation": 72.03889465332031, "Radius": 1.0, "IsImaginary": false, "Channel": 69, "Gain": 1.0 }, { "Azimuth": 335.2003479003906, "Elevation": -53.78620147705078, "Radius": 1.0, "IsImaginary": false, "Channel": 70, "Gain": 1.0 }, { "Azimuth": 130.6795349121094, "Elevation": 75.41316223144531, "Radius": 1.0, "IsImaginary": false, "Channel": 71, "Gain": 1.0 }, { "Azimuth": 358.154052734375, "Elevation": 57.49952697753906, "Radius": 1.0, "IsImaginary": false, "Channel": 72, "Gain": 1.0 }, { "Azimuth": 129.2331085205078, "Elevation": -19.5274658203125, "Radius": 1.0, "IsImaginary": false, "Channel": 73, "Gain": 1.0 }, { "Azimuth": 63.85198593139648, "Elevation": -89.8380126953125, "Radius": 1.0, "IsImaginary": false, "Channel": 74, "Gain": 1.0 }, { "Azimuth": 45.11501693725586, "Elevation": -45.94619369506836, "Radius": 1.0, "IsImaginary": false, "Channel": 75, "Gain": 1.0 }, { "Azimuth": 144.6218414306641, "Elevation": 59.66218566894531, "Radius": 1.0, "IsImaginary": false, "Channel": 76, "Gain": 1.0 }, { "Azimuth": 104.6502456665039, "Elevation": 38.35610961914062, "Radius": 1.0, "IsImaginary": false, "Channel": 77, "Gain": 1.0 }, { "Azimuth": 322.4672241210938, "Elevation": 43.28404235839844, "Radius": 1.0, "IsImaginary": false, "Channel": 78, "Gain": 1.0 }, { "Azimuth": 9.678201675415039, "Elevation": 60.77235412597656, "Radius": 1.0, "IsImaginary": false, "Channel": 79, "Gain": 1.0 }, { "Azimuth": 341.9919738769531, "Elevation": -40.53199768066406, "Radius": 1.0, "IsImaginary": false, "Channel": 80, "Gain": 1.0 }, { "Azimuth": 337.5180969238281, "Elevation": -16.82523345947266, "Radius": 1.0, "IsImaginary": false, "Channel": 81, "Gain": 1.0 }, { "Azimuth": 176.5812225341797, "Elevation": 70.31546020507812, "Radius": 1.0, "IsImaginary": false, "Channel": 82, "Gain": 1.0 }, { "Azimuth": 4.018146991729736, "Elevation": 16.49763488769531, "Radius": 1.0, "IsImaginary": false, "Channel": 83, "Gain": 1.0 }, { "Azimuth": 331.4899291992188, "Elevation": 85.79713439941406, "Radius": 1.0, "IsImaginary": false, "Channel": 84, "Gain": 1.0 }, { "Azimuth": 204.8748931884766, "Elevation": 56.09429931640625, "Radius": 1.0, "IsImaginary": false, "Channel": 85, "Gain": 1.0 }, { "Azimuth": 53.91055679321289, "Elevation": 67.33366394042969, "Radius": 1.0, "IsImaginary": false, "Channel": 86, "Gain": 1.0 } ] } }IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/README.md0000664002537200253720000001516715257173642024120 0ustar zmoelnigzmoelnig# IEM Plug-in Suite ## Overview The IEM Plug-in Suite is a free and Open-Source audio plug-in suite including Ambisonic plug-ins up to 7th order created by staff and students of the Institute of Electronic Music and Acoustics. The suite provides plug-ins for a full Ambisonic production: encoders, reverbs, dynamics including limiter and multi-band compression, rotators, and decoders for both headphones and arbitrary loudspeaker layouts, and many more. The plug-ins are created with the [JUCE framework](https://juce.com) and can be compiled to any major plug-in format (VST, VST3, LV2, AU, AAX). All the plug-ins can be built as standalones, e.g. for use with JACK or virtual soundcards. For more information, installation guides and plug-in descriptions see: - Website: - Repository: ## Compilation Guide The IEM Plug-in Suite can be built using [CMake](https://cmake.org) (see commands below) and already comes with the JUCE dependency as a git submodule. The general system requirements are listed in the [JUCE Repository](https://github.com/juce-framework/JUCE/blob/8.0.7/README.md#minimum-system-requirements). ### Dependencies on Linux Before compiling on Linux, some dependencies must be met. For Ubuntu (and most likely the majority of Debian-based systems), those are listed in the [JUCE docs](https://github.com/juce-framework/JUCE/blob/8.0.7/docs/Linux%20Dependencies.md). Alternatively, if [source code repositories](https://askubuntu.com/questions/158871/how-do-i-enable-the-source-code-repositories) are enabled, you can get them with ```sh apt-get build-dep iem-plugin-suite ``` On RMP-based systems (e.g. Fedora), dependencies are installed with ```sh dnf install alsa-lib-devel fftw-devel findutils freetype-devel gcc-c++ \ libX11-devel libXcursor-devel curl-devel libXinerama-devel \ libXrandr-devel libglvnd-devel make \ pipewire-jack-audio-connection-kit-devel pkgconf-pkg-config \ unzip util-linux which xorg-x11-server-Xvfb ``` Please note, that we are testing the plug-ins only on Debian and cannot guarantee operation on other distributions. ### FFTW Dependency on Windows and Linux The **Binaural**Decoder plug-ins uses fast convolution for decoding the Ambisonic signals to binaural ear signals. Fast convolution relies on the Discrete Fourier Transform (DFT) to make the convolution more efficient. There are several DFT engines around, Apple comes with VDSP, and also JUCE comes with one, which should be considered as a fallback as it's not very optimized. For the remaining platforms Windows and Linux the [fftw3 library](http://fftw.org) is recommended. On Linux, you can simply install the `libfftw3-dev` package (for the static library) and you should be all set. On Windows, you will need to download the source code from (e.g. `fftw-3.3.10.tar.gz`) and unpack it into a `fftw` directory in the root of this repository, so that the FFTW's `CMakeLists.txt` is placed into `/fftw/CMakeLists.txt`. That way, the IEM Plug-in Suite CMake project can find it! ### Select Plug-ins Take a look at `CMakeLists.txt`, in the top you can select which plug-ins you want to build. Either leave it unchanged to build all of them, or comment non-wanted out. ### Formats Per default, the plug-ins will be built as standalones only. Additionally, you can build VST2, VST3, LV2, and AAX versions of the plug-ins. Either change the `IEM_BUILD_VST2`, `IEM_BUILD_VST3`, `IEM_BUILD_LV2`, or `IEM_BUILD_AAX` options directly in the `CMakeLists.txt`, or use cmake command line flags to change them: ```sh cmake .. -DIEM_BUILD_VST2=ON -DIEM_BUILD_VST3=ON -DIEM_BUILD_LV2=ON -DIEM_BUILD_STANDALONE=ON ``` However, there are some drawbacks with the LV2 versions (see below). For use in your DAW, we highly recommend the precompiled VST2's or VST3's. #### VST2 versions That's how it all began, however, time has passed and now you'll need to get hold of the VST2SDK to build the VST2 version of the suite. To let the build system know where to find the SDK, use the `VST2SDKPATH` variable: ```sh cmake .. -DIEM_BUILD_VST2=ON -DVST2SDKPATH="pathtothesdk" ``` #### AAX versions AAX is a proprietary format used by Avid for their ProTools DAW. The necessary SDK to build AAX plug-ins is supplied since JUCE 8. However, plug-ins in ProTools need to be verified and signed, for which you need a developer account with Avid. More information can be found [here](https://github.com/juce-framework/JUCE/blob/8.0.7/README.md#aax-plug-ins). However, you can install pre-compiled and signed AAX plug-ins ready to use with the installer from the [IEM Plug-in Suite website](https://plugins.iem.at/download). #### Standalone versions If you want to use the plug-ins outside a plug-in host, standalone versions can become quite handy! With them enabled, executables will be built which can be used with virtual soundcards of even JACK. In case you don't want the plug-ins with JACK support, simply deactivate it: `-DIEM_STANDALONE_JACK_SUPPORT=OFF`. JACK is only supported on macOS and Linux. #### Build them! Okay, okay, enough with all those options, you came here to built, right? Start up your shell and use the following: ```sh mkdir build # creates a build folder, recommended! cd build # enter it # execute cmake and let it look for the project in the parent folder # feel free to add those optiones from above # for using an IDE use cmake' s -G flag like -G Xcode cmake .. # use "--config Release" for optimized release builds cmake --build . --config Release # build the plug-ins / standalones # alternatively, open the xcode project, msvc solution, or whatever floats your development boat ``` ## Known issues ### LV2 At the moment, it's not possible with in LV2 format to get the currently available channel count. Therefore, the automatic Ambisonic order selection does not work, defaulting to 7th order regardless of the selected layout. So in order to use the plug-ins correctly, you'll have to set the order manually in each plugin. This is missing feature in the LV2 standard and therefore out of our control. We already opened an [issue/feature request](https://gitlab.com/lv2/lv2/-/issues/63), but can't say if and when this will be supported. There was a bug with LV2 plug-ins in REAPER on macOS, which causes the DAW to crash when the plug-in is removed. This issue is fixed with REAPER 6.74. ## Related repositories - : to use the plug-ins in PD and SuperCollider - : to control the plug-ins using the OSC interface but without an OSC connection IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/MatrixMultiplier/0000775002537200253720000000000015257173642026142 5ustar zmoelnigzmoelnigIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/MatrixMultiplier/Source/0000775002537200253720000000000015257173642027402 5ustar zmoelnigzmoelnig././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/MatrixMultiplier/Source/PluginProcessor.cppIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/MatrixMultiplier/Source/PluginProces0000664002537200253720000002213315257173642031740 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #include "PluginProcessor.h" #include "PluginEditor.h" //============================================================================== MatrixMultiplierAudioProcessor::MatrixMultiplierAudioProcessor() : AudioProcessorBase ( #ifndef JucePlugin_PreferredChannelConfigurations BusesProperties() #if ! JucePlugin_IsMidiEffect #if ! JucePlugin_IsSynth .withInput ("Input", ((juce::PluginHostType::getPluginLoadedAs() == juce::AudioProcessor::wrapperType_VST3) ? juce::AudioChannelSet::ambisonic (1) : juce::AudioChannelSet::ambisonic (7)), true) #endif .withOutput ("Output", ((juce::PluginHostType::getPluginLoadedAs() == juce::AudioProcessor::wrapperType_VST3) ? juce::AudioChannelSet::ambisonic (1) : juce::AudioChannelSet::ambisonic (7)), true) #endif , #endif createParameterLayout()) { juce::PropertiesFile::Options options; options.applicationName = "MatrixMultiplier"; options.filenameSuffix = "settings"; options.folderName = "IEM"; options.osxLibrarySubFolder = "Preferences"; properties.reset (new juce::PropertiesFile (options)); lastDir = juce::File (properties->getValue ("configurationFolder")); } MatrixMultiplierAudioProcessor::~MatrixMultiplierAudioProcessor() { } void MatrixMultiplierAudioProcessor::setLastDir (juce::File newLastDir) { lastDir = newLastDir; const juce::var v (lastDir.getFullPathName()); properties->setValue ("configurationFolder", v); } //============================================================================== int MatrixMultiplierAudioProcessor::getNumPrograms() { return 1; // NB: some hosts don't cope very well if you tell them there are 0 programs, // so this should be at least 1, even if you're not really implementing programs. } int MatrixMultiplierAudioProcessor::getCurrentProgram() { return 0; } void MatrixMultiplierAudioProcessor::setCurrentProgram (int index) { } const juce::String MatrixMultiplierAudioProcessor::getProgramName (int index) { return {}; } void MatrixMultiplierAudioProcessor::changeProgramName (int index, const juce::String& newName) { } //============================================================================== void MatrixMultiplierAudioProcessor::prepareToPlay (double sampleRate, int samplesPerBlock) { checkInputAndOutput (this, 0, 0, true); juce::dsp::ProcessSpec specs; specs.sampleRate = sampleRate; specs.maximumBlockSize = samplesPerBlock; specs.numChannels = 64; matTrans.prepare (specs); } void MatrixMultiplierAudioProcessor::releaseResources() { // When playback stops, you can use this as an opportunity to free up any // spare memory, etc. } void MatrixMultiplierAudioProcessor::processBlock (juce::AudioSampleBuffer& buffer, juce::MidiBuffer& midiMessages) { checkInputAndOutput (this, 0, 0, false); juce::ScopedNoDenormals noDenormals; juce::dsp::AudioBlock ab (buffer); matTrans.processReplacing (ab); } //============================================================================== bool MatrixMultiplierAudioProcessor::hasEditor() const { return true; // (change this to false if you choose to not supply an editor) } juce::AudioProcessorEditor* MatrixMultiplierAudioProcessor::createEditor() { return new MatrixMultiplierAudioProcessorEditor (*this, parameters); } //============================================================================== void MatrixMultiplierAudioProcessor::getStateInformation (juce::MemoryBlock& destData) { auto state = parameters.copyState(); state.setProperty ("lastOpenedConfigurationFile", juce::var (lastFile.getFullPathName()), nullptr); auto oscConfig = state.getOrCreateChildWithName ("OSCConfig", nullptr); oscConfig.copyPropertiesFrom (oscParameterInterface.getConfig(), nullptr); std::unique_ptr xml (state.createXml()); copyXmlToBinary (*xml, destData); } void MatrixMultiplierAudioProcessor::setStateInformation (const void* data, int sizeInBytes) { std::unique_ptr xmlState (getXmlFromBinary (data, sizeInBytes)); if (xmlState != nullptr) if (xmlState->hasTagName (parameters.state.getType())) { parameters.replaceState (juce::ValueTree::fromXml (*xmlState)); if (parameters.state.hasProperty ("lastOpenedConfigurationFile")) { auto val = parameters.state.getPropertyAsValue ("lastOpenedConfigurationFile", nullptr); if (val.getValue().toString() != "") { const juce::File f (val.getValue().toString()); loadConfiguration (f); } } if (parameters.state.hasProperty ("OSCPort")) // legacy { oscParameterInterface.getOSCReceiver().connect ( parameters.state.getProperty ("OSCPort", juce::var (-1))); parameters.state.removeProperty ("OSCPort", nullptr); } auto oscConfig = parameters.state.getChildWithName ("OSCConfig"); if (oscConfig.isValid()) oscParameterInterface.setConfig (oscConfig); } } //============================================================================== void MatrixMultiplierAudioProcessor::parameterChanged (const juce::String& parameterID, float newValue) { if (parameterID == "inputChannelsSetting" || parameterID == "outputOrderSetting") userChangedIOSettings = true; } void MatrixMultiplierAudioProcessor::updateBuffers() { DBG ("IOHelper: input size: " << input.getSize()); DBG ("IOHelper: output size: " << output.getSize()); } //============================================================================== // This creates new instances of the plugin.. juce::AudioProcessor* JUCE_CALLTYPE createPluginFilter() { return new MatrixMultiplierAudioProcessor(); } void MatrixMultiplierAudioProcessor::loadConfiguration (const juce::File& configurationFile) { ReferenceCountedMatrix::Ptr tempMatrix = nullptr; juce::Result result = ConfigurationHelper::parseFileForTransformationMatrix (configurationFile, &tempMatrix); if (! result.wasOk()) { messageForEditor = result.getErrorMessage(); return; } lastFile = configurationFile; juce::String output; if (tempMatrix != nullptr) { matTrans.setMatrix (tempMatrix); output += "Configuration loaded successfully!\n"; output += " Name: \t" + tempMatrix->getName() + "\n"; output += " Size: " + juce::String (tempMatrix->getMatrix().getNumRows()) + "x" + juce::String (tempMatrix->getMatrix().getNumColumns()) + " (output x input)\n"; output += " Description: \t" + tempMatrix->getDescription() + "\n"; } else output = "ERROR: something went wrong!"; currentMatrix = tempMatrix; messageForEditor = output; messageChanged = true; } //============================================================================== const bool MatrixMultiplierAudioProcessor::processNotYetConsumedOSCMessage ( const juce::OSCMessage& message) { if (message.getAddressPattern().toString().equalsIgnoreCase ( "/" + juce::String (JucePlugin_Name) + "/loadFile") && message.size() >= 1) { if (message[0].isString()) { juce::File fileToLoad (message[0].getString()); loadConfiguration (fileToLoad); return true; } } return false; } //============================================================================== std::vector> MatrixMultiplierAudioProcessor::createParameterLayout() { std::vector> params; return params; } ././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/MatrixMultiplier/Source/PluginEditor.cppIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/MatrixMultiplier/Source/PluginEditor0000664002537200253720000001363215257173642031737 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #include "PluginEditor.h" #include "PluginProcessor.h" //============================================================================== MatrixMultiplierAudioProcessorEditor::MatrixMultiplierAudioProcessorEditor ( MatrixMultiplierAudioProcessor& p, juce::AudioProcessorValueTreeState& vts) : juce::AudioProcessorEditor (&p), processor (p), valueTreeState (vts), footer (p.getOSCParameterInterface()) { // ============== BEGIN: essentials ====================== // set GUI size and lookAndFeel setResizeLimits (500, 200, 800, 500); // use this to create a resizable GUI setResizable (true, true); setLookAndFeel (&globalLaF); // make title and footer visible, and set the PluginName addAndMakeVisible (&title); title.setTitle (juce::String ("Matrix"), juce::String ("Multiplier")); title.setFont (globalLaF.robotoBold, globalLaF.robotoLight); addAndMakeVisible (&footer); // ============= END: essentials ======================== // create the connection between title component's comboBoxes and parameters // cbInputChannelsSettingAttachment = new ComboBoxAttachment(valueTreeState, "inputChannelsSetting", *title.getInputWidgetPtr()->getChannelsCbPointer()); // cbOutputChannelsSettingAttachment = new ComboBoxAttachment(valueTreeState, "outputChannelsSetting", *title.getOutputWidgetPtr()->getChannelsCbPointer()); addAndMakeVisible (btLoadFile); btLoadFile.setButtonText ("Load configuration"); btLoadFile.setColour (juce::TextButton::buttonColourId, juce::Colours::cornflowerblue); btLoadFile.addListener (this); addAndMakeVisible (edOutput); edOutput.setMultiLine (true); edOutput.setReadOnly (true); edOutput.setTabKeyUsedAsCharacter (true); edOutput.clear(); edOutput.setText (processor.getMessageForEditor()); edOutput.setColour (juce::TextEditor::backgroundColourId, juce::Colours::cornflowerblue.withMultipliedAlpha (0.2f)); // start timer after everything is set up properly startTimer (20); } MatrixMultiplierAudioProcessorEditor::~MatrixMultiplierAudioProcessorEditor() { setLookAndFeel (nullptr); } //============================================================================== void MatrixMultiplierAudioProcessorEditor::paint (juce::Graphics& g) { g.fillAll (globalLaF.ClBackground); } void MatrixMultiplierAudioProcessorEditor::resized() { // ============ BEGIN: header and footer ============ const int leftRightMargin = 30; const int headerHeight = 60; const int footerHeight = 25; juce::Rectangle area (getLocalBounds()); juce::Rectangle footerArea (area.removeFromBottom (footerHeight)); footer.setBounds (footerArea); area.removeFromLeft (leftRightMargin); area.removeFromRight (leftRightMargin); juce::Rectangle headerArea = area.removeFromTop (headerHeight); title.setBounds (headerArea); area.removeFromTop (10); area.removeFromBottom (5); // =========== END: header and footer ================= juce::Rectangle sliderRow = area.removeFromRight (120); btLoadFile.setBounds (sliderRow.removeFromTop (30)); area.removeFromRight (10); edOutput.setBounds (area); } void MatrixMultiplierAudioProcessorEditor::timerCallback() { // === update titleBar widgets according to available input/output channel counts title.setMaxSize (processor.getMaxSize()); // ========================================== if (processor.messageChanged) { edOutput.clear(); edOutput.setText (processor.getMessageForEditor()); processor.messageChanged = false; } ReferenceCountedMatrix::Ptr currentMatrix = processor.getCurrentMatrix(); if (currentMatrix != nullptr) { title.getOutputWidgetPtr()->setSizeIfUnselectable (currentMatrix->getNumOutputChannels()); title.getInputWidgetPtr()->setSizeIfUnselectable (currentMatrix->getNumInputChannels()); } else { title.getOutputWidgetPtr()->setSizeIfUnselectable (0); title.getInputWidgetPtr()->setSizeIfUnselectable (0); } } void MatrixMultiplierAudioProcessorEditor::buttonClicked (juce::Button* button) { if (button == &btLoadFile) { loadConfigurationFile(); } } void MatrixMultiplierAudioProcessorEditor::buttonStateChanged (juce::Button* button) { } void MatrixMultiplierAudioProcessorEditor::loadConfigurationFile() { juce::FileChooser myChooser ( "Please select the configuration you want to load...", processor.getLastDir().exists() ? processor.getLastDir() : juce::File::getSpecialLocation (juce::File::userHomeDirectory), "*.json"); if (myChooser.browseForFileToOpen()) { juce::File configurationFile (myChooser.getResult()); processor.setLastDir (configurationFile.getParentDirectory()); processor.loadConfiguration (configurationFile); edOutput.clear(); edOutput.setText (processor.getMessageForEditor()); } } ././@LongLink0000644000000000000000000000015200000000000011601 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/MatrixMultiplier/Source/PluginProcessor.hIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/MatrixMultiplier/Source/PluginProces0000664002537200253720000001060515257173642031741 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once #include "../../resources/AudioProcessorBase.h" #include "../../resources/MatrixMultiplication.h" #include "../JuceLibraryCode/JuceHeader.h" #define CONFIGURATIONHELPER_ENABLE_MATRIX_METHODS 1 #include "../../resources/ConfigurationHelper.h" #define ProcessorClass MatrixMultiplierAudioProcessor //============================================================================== class MatrixMultiplierAudioProcessor : public AudioProcessorBase, IOTypes::AudioChannels<64>> { public: constexpr static int numberOfInputChannels = 64; constexpr static int numberOfOutputChannels = 64; //============================================================================== MatrixMultiplierAudioProcessor(); ~MatrixMultiplierAudioProcessor(); //============================================================================== void prepareToPlay (double sampleRate, int samplesPerBlock) override; void releaseResources() override; void processBlock (juce::AudioSampleBuffer&, juce::MidiBuffer&) override; //============================================================================== juce::AudioProcessorEditor* createEditor() override; bool hasEditor() const override; //============================================================================== int getNumPrograms() override; int getCurrentProgram() override; void setCurrentProgram (int index) override; const juce::String getProgramName (int index) override; void changeProgramName (int index, const juce::String& newName) override; //============================================================================== void getStateInformation (juce::MemoryBlock& destData) override; void setStateInformation (const void* data, int sizeInBytes) override; //============================================================================== void parameterChanged (const juce::String& parameterID, float newValue) override; void updateBuffers() override; // use this to implement a buffer update method //======= Parameters =========================================================== std::vector> createParameterLayout(); //============================================================================== const bool processNotYetConsumedOSCMessage (const juce::OSCMessage& message) override; //============================================================================== void setMatrix (ReferenceCountedMatrix::Ptr newMatrixToUse) { matTrans.setMatrix (newMatrixToUse); } juce::File getLastDir() { return lastDir; } void setLastDir (juce::File newLastDir); void loadConfiguration (const juce::File& configurationFile); bool messageChanged { true }; juce::String getMessageForEditor() { return messageForEditor; } ReferenceCountedMatrix::Ptr getCurrentMatrix() { return currentMatrix; } private: //============================================================================== MatrixMultiplication matTrans; ReferenceCountedMatrix::Ptr currentMatrix { nullptr }; juce::File lastDir; juce::File lastFile; std::unique_ptr properties; juce::String messageForEditor { "Please load a configuration." }; //============================================================================== JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MatrixMultiplierAudioProcessor) }; ././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/MatrixMultiplier/Source/PluginEditor.hIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/MatrixMultiplier/Source/PluginEditor0000664002537200253720000000700715257173642031736 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once #include "../JuceLibraryCode/JuceHeader.h" #include "PluginProcessor.h" //Plugin Design Essentials #include "../../resources/customComponents/TitleBar.h" #include "../../resources/lookAndFeel/IEM_LaF.h" //Custom juce::Components #include "../../resources/customComponents/ReverseSlider.h" #include "../../resources/customComponents/SimpleLabel.h" typedef ReverseSlider::SliderAttachment SliderAttachment; // all ReverseSliders will make use of the parameters' valueToText() function typedef juce::AudioProcessorValueTreeState::ComboBoxAttachment ComboBoxAttachment; typedef juce::AudioProcessorValueTreeState::ButtonAttachment ButtonAttachment; //============================================================================== /** */ class MatrixMultiplierAudioProcessorEditor : public juce::AudioProcessorEditor, private juce::Timer, private juce::Button::Listener { public: MatrixMultiplierAudioProcessorEditor (MatrixMultiplierAudioProcessor&, juce::AudioProcessorValueTreeState&); ~MatrixMultiplierAudioProcessorEditor(); //============================================================================== void paint (juce::Graphics&) override; void resized() override; void timerCallback() override; void buttonClicked (juce::Button* button) override; void buttonStateChanged (juce::Button* button) override; void loadConfigurationFile(); private: // ====================== beging essentials ================== // lookAndFeel class with the IEM plug-in suite design LaF globalLaF; // stored references to the AudioProcessor and juce::ValueTreeState holding all the parameters MatrixMultiplierAudioProcessor& processor; juce::AudioProcessorValueTreeState& valueTreeState; /* title and footer component title component can hold different widgets for in- and output: - NoIOWidget (if there's no need for an input or output widget) - AudioChannelsIOWidget - AmbisonicIOWidget - DirectivitiyIOWidget */ TitleBar, AudioChannelsIOWidget<0, false>> title; OSCFooter footer; // =============== end essentials ============ // Attachments to create a connection between IOWidgets comboboxes // and the associated parameters juce::TextButton btLoadFile; juce::TextEditor edOutput; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MatrixMultiplierAudioProcessorEditor) }; IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/MatrixMultiplier/CMakeLists.txt0000664002537200253720000000362015257173642030703 0ustar zmoelnigzmoelnigset (PLUGIN_TARGET "") if (IEM_FORMATS) juce_add_plugin (MatrixMultiplier PLUGIN_MANUFACTURER_CODE IEMA PLUGIN_CODE MaMu ICON_BIG "../resources/Standalone/IEMPluginSuiteSmall.png" ICON_SMALL "../resources/Standalone/IEMPluginSuiteSmall.png" COMPANY_NAME "IEM" PRODUCT_NAME "MatrixMultiplier" FORMATS ${IEM_FORMATS} VERSION ${MatrixMultiplier_VERSION} LV2URI "http://plugins.iem.at/MatrixMultiplier" VST2_CATEGORY kPlugCategUnknown VST3_CATEGORIES Tools AAX_CATEGORY SoundField) list (APPEND PLUGIN_TARGET MatrixMultiplier) endif() foreach (TARGET IN LISTS PLUGIN_TARGET) juce_generate_juce_header (${TARGET}) target_sources (${TARGET} PRIVATE Source/PluginEditor.cpp Source/PluginEditor.h Source/PluginProcessor.cpp Source/PluginProcessor.h ../resources/OSC/OSCInputStream.h ../resources/OSC/OSCParameterInterface.cpp ../resources/OSC/OSCParameterInterface.h ../resources/OSC/OSCStatus.cpp ../resources/OSC/OSCStatus.h ../resources/OSC/OSCUtilities.h ../resources/efficientSHvanilla.cpp ) target_compile_definitions (${TARGET} PRIVATE JUCE_USE_CURL=0 JUCE_WEB_BROWSER=0 JUCE_USE_CUSTOM_PLUGIN_STANDALONE_APP=1 JUCE_USE_FLAC=0 JUCE_USE_OGGVORBIS=0 JUCE_USE_MP3AUDIOFORMAT=0 JUCE_USE_LAME_AUDIO_FORMAT=0 JUCE_USE_WINDOWS_MEDIA_FORMAT=0 JUCE_VST3_CAN_REPLACE_VST2=0) target_include_directories (${TARGET} PRIVATE Source) target_link_libraries (${TARGET} PRIVATE LAF_fonts IEM_logo juce::juce_audio_utils juce::juce_audio_plugin_client juce::juce_osc juce::juce_dsp juce::juce_opengl juce::juce_recommended_config_flags juce::juce_recommended_lto_flags) endforeach() IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/LICENSE0000664002537200253720000010441315257173642023637 0ustar zmoelnigzmoelnig GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Audioplugins Copyright (C) 2017 Daniel Rudrich This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Audioplugins Copyright (C) 2017 Daniel Rudrich This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/MultiBandCompressor/0000775002537200253720000000000015257173642026563 5ustar zmoelnigzmoelnigIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/MultiBandCompressor/Source/0000775002537200253720000000000015257173642030023 5ustar zmoelnigzmoelnig././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/MultiBandCompressor/Source/FilterBankVisualizer.hIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/MultiBandCompressor/Source/FilterBan0000664002537200253720000005475115257173642031630 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich / Markus Huber Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once #include // ============================ struct Settings { float fMin = 20.0f; // minimum displayed frequency float fMax = 20000.0f; // maximum displayed frequency float dbMin = -15.0f; // min displayed dB float dbMax = 15.0f; // max displayed dB float gridDiv = 5.0f; // how many dB per divisions (between grid lines) double& sampleRate; float dyn = dbMax - dbMin; float zero = 2.0f * dbMax / dyn; float scale = 1.0f / (zero + std::tanh (dbMin / dyn * -2.0f)); float height; float width; int xMin = hzToX (fMin); int xMax = hzToX (fMax); int yMin = juce::jmax (dbToY (dbMax), 0); int yMax = juce::jmax (dbToY (dbMin), yMin); int yZero = dbToY (0.0f); int numPixels = xMax - xMin + 1; juce::Array frequencies; const float mL = 23.0f; const float mR = 10.0f; const float mT = 7.0f; const float mB = 15.0f; const float OH = 3.0f; void setHeight (int newHeight) { height = static_cast (newHeight) - mT - mB; } void setWidth (int newWidth) { width = static_cast (newWidth) - mL - mR; } int dbToY (const float dB) { int ypos = dbToYFloat (dB); return ypos; } float dbToYFloat (const float dB) { if (height <= 0.0f) return 0.0f; float temp; if (dB < 0.0f) temp = zero + std::tanh (dB / dyn * -2.0f); else temp = zero - 2.0f * dB / dyn; return mT + scale * height * temp; } float yToDb (const float y) { float temp = (y - mT) / height / scale - zero; float dB; if (temp > 0.0f) dB = std::atanh (temp) * dyn * -0.5f; else dB = -0.5f * temp * dyn; return std::isnan (dB) ? dbMin : dB; } int hzToX (float hz) { int xpos = mL + width * (log (hz / fMin) / log (fMax / fMin)); return xpos; } float xToHz (int x) { return fMin * pow ((fMax / fMin), ((x - mL) / width)); } }; // ============================ class FilterBackdrop : public juce::Component { public: FilterBackdrop (Settings& settings) : s (settings) { setBufferedToImage (true); }; ~FilterBackdrop() {}; void paint (juce::Graphics& g) override { g.setColour (juce::Colours::steelblue.withMultipliedAlpha (0.01f)); g.fillAll(); auto currentFont = juce::FontOptions (getLookAndFeel().getTypefaceForFont (juce::FontOptions (12.0f, 2))) .withHeight (12.0f); g.setFont (currentFont); // db labels float dyn = s.dbMax - s.dbMin; int numgridlines = dyn / s.gridDiv + 1; //g.setFont (juce::Font (getLookAndFeel().getTypefaceForFont (juce::Font (10.0f, 1))); g.setColour (juce::Colours::white); int lastTextDrawPos = -1; for (int i = 0; i < numgridlines; ++i) { float db_val = s.dbMax - i * s.gridDiv; lastTextDrawPos = drawLevelMark (g, 0, 20, db_val, juce::String (db_val, 0), lastTextDrawPos); } // frequency labels for (float f = s.fMin; f <= s.fMax; f += pow (10, floor (log10 (f)))) { int xpos = s.hzToX (f); juce::String axislabel; bool drawText = false; if ((f == 20) || (f == 50) || (f == 100) || (f == 500)) { axislabel = juce::String (f, 0); drawText = true; } else if ((f == 1000) || (f == 5000) || (f == 10000) || (f == 20000)) { axislabel = juce::String (f / 1000, 0); axislabel << "k"; drawText = true; } else continue; g.drawText (axislabel, xpos - 10, s.dbToY (s.dbMin) + s.OH + 0.0f, 20, 12, juce::Justification::centred, false); } g.setColour (juce::Colours::steelblue.withMultipliedAlpha (0.8f)); g.strokePath (dbGridPath, juce::PathStrokeType (0.5f)); g.setColour (juce::Colours::steelblue.withMultipliedAlpha (0.9f)); g.strokePath (hzGridPathBold, juce::PathStrokeType (1.0f)); g.setColour (juce::Colours::steelblue.withMultipliedAlpha (0.8f)); g.strokePath (hzGridPath, juce::PathStrokeType (0.5f)); } void resized() override { const float width = getWidth() - s.mL - s.mR; dbGridPath.clear(); int numgridlines = s.dyn / s.gridDiv + 1; for (int i = 0; i < numgridlines; ++i) { float db_val = s.dbMax - i * s.gridDiv; int ypos = s.dbToY (db_val); dbGridPath.startNewSubPath (s.mL - s.OH, ypos); dbGridPath.lineTo (s.mL + width + s.OH, ypos); } hzGridPath.clear(); hzGridPathBold.clear(); for (float f = s.fMin; f <= s.fMax; f += powf (10, floor (log10 (f)))) { int xpos = s.hzToX (f); if ((f == 20) || (f == 50) || (f == 100) || (f == 500) || (f == 1000) || (f == 5000) || (f == 10000) || (f == 20000)) { hzGridPathBold.startNewSubPath (xpos, s.dbToY (s.dbMax) - s.OH); hzGridPathBold.lineTo (xpos, s.dbToY (s.dbMin) + s.OH); } else { hzGridPath.startNewSubPath (xpos, s.dbToY (s.dbMax) - s.OH); hzGridPath.lineTo (xpos, s.dbToY (s.dbMin) + s.OH); } } } int inline drawLevelMark (juce::Graphics& g, int x, int width, const int level, const juce::String& label, int lastTextDrawPos = -1) { float yPos = s.dbToYFloat (level); x = x + 1.0f; width = width - 2.0f; if (yPos - 4 > lastTextDrawPos) { g.drawText (label, x + 2, yPos - 4, width - 4, 9, juce::Justification::right, false); return yPos + 5; } return lastTextDrawPos; } private: Settings& s; juce::Path dbGridPath; juce::Path hzGridPath; juce::Path hzGridPathBold; }; // ============================ template class FrequencyBand : public juce::Component { public: FrequencyBand (Settings& settings) : s (settings) {}; FrequencyBand (Settings& settings, typename juce::dsp::IIR::Coefficients::Ptr coeffs1, typename juce::dsp::IIR::Coefficients::Ptr coeffs2, juce::Colour newColour) : s (settings), colour (newColour) { addCoeffs (coeffs1, coeffs2); }; ~FrequencyBand() {}; void paint (juce::Graphics& g) override { g.setColour (colour.withMultipliedAlpha (0.7f)); g.strokePath (path, juce::PathStrokeType (1.0f)); g.setColour (colour.withMultipliedAlpha (0.3f)); g.fillPath (closedPath); } void resized() override { magnitudes.resize (s.numPixels); magnitudes.fill (1.0f); magnitudesIncludingGains.resize (s.numPixels); magnitudesIncludingGains.fill (1.0f); } void updateMakeUpGain (const float& newMakeUp) { if (fabs (makeUp - newMakeUp) > 0.01) { makeUp = newMakeUp; updatePath(); } } void updateGainReduction (const float& newGainReduction) { if (fabs (gainReduction - newGainReduction) > 0.01) { gainReduction = newGainReduction; updatePath(); } } void updateFilterResponse() { juce::Array tempMagnitude; tempMagnitude.resize (s.numPixels); tempMagnitude.fill (1.0f); for (int i = 0; i < coeffs.size(); ++i) { juce::Array filterMagnitude; filterMagnitude.resize (s.numPixels); if (coeffs[i] != nullptr) coeffs[i]->getMagnitudeForFrequencyArray (s.frequencies.getRawDataPointer(), filterMagnitude.getRawDataPointer(), s.numPixels, s.sampleRate); juce::FloatVectorOperations::multiply (tempMagnitude.getRawDataPointer(), filterMagnitude.getRawDataPointer(), s.numPixels); } juce::FloatVectorOperations::copy (magnitudes.getRawDataPointer(), tempMagnitude.getRawDataPointer(), s.numPixels); updatePath(); } void updatePath() { path.clear(); closedPath.clear(); float gain1 = makeUp; float gain2 = gainReduction; if (bypassed) { gain1 = 0.0f; gain2 = 0.0f; } float db = juce::Decibels::gainToDecibels (magnitudes[0]) + gain1 + gain2; magnitudesIncludingGains.set (0, juce::Decibels::decibelsToGain (db)); path.startNewSubPath (s.xMin, juce::jlimit (static_cast (s.yMin), static_cast (s.yMax) + s.OH + 1.0f, s.dbToYFloat (db))); for (int i = 1; i < s.numPixels; ++i) { db = juce::Decibels::gainToDecibels (magnitudes[i]) + gain1 + gain2; magnitudesIncludingGains.set (i, juce::Decibels::decibelsToGain (db)); float y = juce::jlimit (static_cast (s.yMin), static_cast (s.yMax) + s.OH + 1.0f, s.dbToYFloat (db)); path.lineTo (s.xMin + i, y); } closedPath = path; closedPath.lineTo (s.xMax, s.yMax + s.OH + 1.0f); closedPath.lineTo (s.xMin, s.yMax + s.OH + 1.0f); closedPath.closeSubPath(); repaint(); } double* getMagnitudeIncludingGains() { return magnitudesIncludingGains.getRawDataPointer(); } juce::Array getMagnitudeIncludingGainsArray() const { return magnitudesIncludingGains; } void setColour (const juce::Colour newColour) { colour = newColour; } void setBypassed (bool newBypassed) { bypassed = newBypassed; updatePath(); } void addCoeffs (typename juce::dsp::IIR::Coefficients::Ptr coeffs1, typename juce::dsp::IIR::Coefficients::Ptr coeffs2) { coeffs.add (coeffs1); coeffs.add (coeffs2); } private: Settings& s; juce::Array::Ptr> coeffs; juce::Colour colour; bool bypassed { false }; float makeUp = 0.0f, gainReduction = 0.0f; juce::Array magnitudes, magnitudesIncludingGains; juce::Path path, closedPath; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (FrequencyBand); }; // ============================ template class OverallMagnitude : public juce::Component { public: OverallMagnitude (Settings& settings, int numFreqBands) : s (settings), numBands (numFreqBands), overallGain (0.0f) {}; ~OverallMagnitude() {}; void paint (juce::Graphics& g) override { g.setColour (juce::Colours::white); g.strokePath (path, juce::PathStrokeType (1.25f)); g.setColour (juce::Colours::white.withMultipliedAlpha (0.125f)); g.fillPath (closedPath); } void resized() override { overallMagnitude.resize (s.numPixels); overallMagnitude.fill (overallGain); } void setOverallGain (const float newGain) { overallGain = newGain; } void updateOverallMagnitude() { overallMagnitude.fill (overallGain); for (int i = 0; i < (*freqBands).size(); ++i) { juce::FloatVectorOperations::add (overallMagnitude.getRawDataPointer(), (*freqBands)[i]->getMagnitudeIncludingGains(), s.numPixels); } updatePath(); } void updatePath() { path.clear(); closedPath.clear(); float db = juce::Decibels::gainToDecibels (overallMagnitude[0]); path.startNewSubPath (s.xMin, juce::jlimit (static_cast (s.yMin), static_cast (s.yMax) + s.OH + 1.0f, s.dbToYFloat (db))); for (int i = 1; i < s.numPixels; ++i) { db = juce::Decibels::gainToDecibels (overallMagnitude[i]); float y = juce::jlimit (static_cast (s.yMin), static_cast (s.yMax) + s.OH + 1.0f, s.dbToYFloat (db)); path.lineTo (s.xMin + i, y); } closedPath = path; closedPath.lineTo (s.xMax, s.yZero); closedPath.lineTo (s.xMin, s.yZero); closedPath.closeSubPath(); repaint(); } void setFreqBands (juce::OwnedArray>* bandsForOverallGain) { freqBands = bandsForOverallGain; } private: Settings& s; juce::OwnedArray>* freqBands; juce::Array overallMagnitude; juce::Path path, closedPath; int numBands; float overallGain; }; // ============================ template class FilterBankVisualizer : public juce::Component { public: FilterBankVisualizer (float fMin, float fMax, float dbMin, float dbMax, float gridDiv, double& sampleRate, int numBands, bool overallMagnitude = false) : s { fMin, fMax, dbMin, dbMax, gridDiv, sampleRate }, filterBackdrop (s), overallMagnitude (s, numBands), numFreqBands (numBands), displayOverallMagnitude (overallMagnitude) { init(); }; ~FilterBankVisualizer() {}; void init() { updateSettings(); addAndMakeVisible (&filterBackdrop); for (int i = 0; i < numFreqBands; ++i) { freqBands.add (new FrequencyBand (s)); addAndMakeVisible (freqBands[i]); freqBands.getLast()->addMouseListener (this, true); } if (displayOverallMagnitude) activateOverallMagnitude(); freqBandColours.resize (numFreqBands); } void updateSettings() { s.setWidth (getWidth()); s.setHeight (getHeight()); s.xMin = s.hzToX (s.fMin); s.xMax = s.hzToX (s.fMax); s.yMin = juce::jmax (s.dbToY (s.dbMax), 0); s.yMax = juce::jmax (s.dbToY (s.dbMin), s.yMin); s.yZero = s.dbToY (0.0f); s.numPixels = s.xMax - s.xMin + 1; s.frequencies.resize (s.numPixels < 0 ? 0.0f : s.numPixels); for (int i = 0; i < s.frequencies.size(); ++i) s.frequencies.set (i, s.xToHz (s.xMin + i)); } void paint (juce::Graphics& g) override {} void paintOverChildren (juce::Graphics& g) override { g.excludeClipRegion ( juce::Rectangle (0.0f, s.yMax + s.OH, s.width, s.height - s.yMax - s.OH)); // draw crossovers separators and knobs float yPos = s.dbToYFloat (0.0f); float prevXPos = s.xMin; for (int i = 0; i < crossoverSliders.size(); ++i) { float xPos = crossoverSliders[i] == nullptr ? s.xMin : s.hzToX (crossoverSliders[i]->getValue()); juce::Line freqBandSeparator; freqBandSeparator.setStart (xPos, s.yMin); freqBandSeparator.setEnd (xPos, s.yMax + s.yMin); g.setColour (activeElem == i ? colour.brighter() : colour.withMultipliedAlpha (0.8)); g.drawLine (freqBandSeparator, i == activeElem ? 2.5f : 2.0f); prevXPos = xPos; g.setColour (juce::Colours::black); g.drawEllipse (xPos - 5.0f, yPos - 5.0f, 10.0f, 10.0f, 3.0f); g.setColour (activeElem == i ? colour.brighter() : colour); g.fillEllipse (xPos - 5.0f, yPos - 5.0f, 10.0f, 10.0f); } } void resized() override { updateSettings(); juce::Rectangle area = getLocalBounds(); filterBackdrop.setBounds (area); for (int i = 0; i < freqBands.size(); ++i) { freqBands[i]->setBounds (area); freqBands[i]->updateFilterResponse(); } if (displayOverallMagnitude) { overallMagnitude.setBounds (area); overallMagnitude.updateOverallMagnitude(); } } void setNumFreqBands (const int newValue) { numFreqBands = newValue; } void mouseDrag (const juce::MouseEvent& event) override { juce::Point pos = event.getPosition(); float frequency = s.xToHz (pos.x); if (activeElem != -1) { if (crossoverSliders[activeElem] != nullptr) { crossoverSliders[activeElem]->setValue (frequency); repaint(); } } } void mouseMove (const juce::MouseEvent& event) override { juce::Point pos = event.getPosition(); int oldActiveElem = activeElem; activeElem = -1; for (int i = 0; i < crossoverSliders.size(); ++i) { int x = crossoverSliders[i] == nullptr ? s.hzToX (s.fMin) : s.hzToX (crossoverSliders[i]->getValue()); float y = s.dbToYFloat (0.0f); juce::Point filterPos (x, y); if (pos.getDistanceSquaredFrom (filterPos) < 48) { activeElem = i; break; } } if (oldActiveElem != activeElem) repaint(); } void updateMakeUpGain (const int freqBand, const float newMakeUp) { freqBands[freqBand]->updateMakeUpGain (newMakeUp); } void updateGainReduction (const int freqBand, const float newGainReduction) { freqBands[freqBand]->updateGainReduction (newGainReduction); } void updateFreqBandResponse (const int freqBand) { freqBands[freqBand]->updateFilterResponse(); } void updateFreqBandResponses() { for (int i = 0; i < numFreqBands; ++i) freqBands[i]->updateFilterResponse(); } void updateOverallMagnitude() { overallMagnitude.updateOverallMagnitude(); } void setBypassed (const int i, const bool bypassed) { freqBands[i]->setBypassed (bypassed); } void setSolo (const int i, const bool soloed) { if (soloed) soloSet.insert (i); else soloSet.erase (i); for (int i = 0; i < numFreqBands; ++i) { juce::Colour colour = freqBandColours[i]; if (! soloSet.empty()) { if (! soloSet.count (i)) colour = colour.withMultipliedSaturation (0.4f); } freqBands[i]->setColour (colour); freqBands[i]->repaint(); } } void setFrequencyBand (const int i, typename juce::dsp::IIR::Coefficients::Ptr coeffs1, typename juce::dsp::IIR::Coefficients::Ptr coeffs2, juce::Colour colour) { freqBands[i]->addCoeffs (coeffs1, coeffs2); freqBands[i]->setColour (colour); freqBands[i]->updateFilterResponse(); freqBandColours.set (i, colour); } void addFrequencyBand (typename juce::dsp::IIR::Coefficients::Ptr coeffs1, typename juce::dsp::IIR::Coefficients::Ptr coeffs2, juce::Colour colour) { freqBands.add (new FrequencyBand (s, coeffs1, coeffs2, colour)); addAndMakeVisible (freqBands.getLast()); freqBandColours.add (colour); } void activateOverallMagnitude (const float gain = 0.0f) { displayOverallMagnitude = true; overallMagnitude.setFreqBands (&freqBands); overallMagnitude.setOverallGain (gain); addAndMakeVisible (&overallMagnitude); overallMagnitude.setBounds (getLocalBounds()); overallMagnitude.resized(); overallMagnitude.addMouseListener (this, true); } void deactivateOverallMagnitude() { displayOverallMagnitude = false; overallMagnitude.removeMouseListener (this); overallMagnitude.setVisible (false); removeChildComponent (&overallMagnitude); displayOverallMagnitude = false; } void setOverallGain (const float gain = 0.0f) { overallMagnitude.setOverallGain (gain); } void addCrossover (juce::Slider* crossoverSlider = nullptr) { crossoverSliders.add (crossoverSlider); } private: Settings s; FilterBackdrop filterBackdrop; juce::OwnedArray> freqBands; OverallMagnitude overallMagnitude; juce::Array crossoverSliders; int numFreqBands, activeElem { -1 }; bool displayOverallMagnitude { false }; juce::Colour colour { 0xFFD8D8D8 }; juce::Array freqBandColours; std::set soloSet; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (FilterBankVisualizer); }; ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/MultiBandCompressor/Source/PluginProcessor.cppIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/MultiBandCompressor/Source/PluginPro0000664002537200253720000010732015257173642031670 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Markus Huber Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #include "PluginProcessor.h" #include "PluginEditor.h" //============================================================================== MultiBandCompressorAudioProcessor::MultiBandCompressorAudioProcessor() : AudioProcessorBase ( #ifndef JucePlugin_PreferredChannelConfigurations BusesProperties() #if ! JucePlugin_IsMidiEffect #if ! JucePlugin_IsSynth .withInput ("Input", ((juce::PluginHostType::getPluginLoadedAs() == juce::AudioProcessor::wrapperType_VST3) ? juce::AudioChannelSet::ambisonic (1) : juce::AudioChannelSet::ambisonic (7)), true) #endif .withOutput ("Output", ((juce::PluginHostType::getPluginLoadedAs() == juce::AudioProcessor::wrapperType_VST3) ? juce::AudioChannelSet::ambisonic (1) : juce::AudioChannelSet::ambisonic (7)), true) #endif , #endif createParameterLayout()), maxNumFilters (ceil (64 / IIRfloat_elements)) { const juce::String inputSettingID = "orderSetting"; orderSetting = parameters.getRawParameterValue (inputSettingID); parameters.addParameterListener (inputSettingID, this); for (int filterBandIdx = 0; filterBandIdx < numFilterBands - 1; ++filterBandIdx) { const juce::String crossoverID ("crossover" + juce::String (filterBandIdx)); crossovers[filterBandIdx] = parameters.getRawParameterValue (crossoverID); lowPassLRCoeffs[filterBandIdx] = IIR::Coefficients::makeLowPass (lastSampleRate, *crossovers[filterBandIdx]); highPassLRCoeffs[filterBandIdx] = IIR::Coefficients::makeHighPass (lastSampleRate, *crossovers[filterBandIdx]); calculateCoefficients (filterBandIdx); iirLPCoefficients[filterBandIdx] = IIR::Coefficients::makeLowPass (lastSampleRate, *crossovers[filterBandIdx]); iirHPCoefficients[filterBandIdx] = IIR::Coefficients::makeHighPass (lastSampleRate, *crossovers[filterBandIdx]); iirAPCoefficients[filterBandIdx] = IIR::Coefficients::makeAllPass (lastSampleRate, *crossovers[filterBandIdx]); parameters.addParameterListener (crossoverID, this); iirLP[filterBandIdx].clear(); iirLP2[filterBandIdx].clear(); iirHP[filterBandIdx].clear(); iirHP2[filterBandIdx].clear(); iirAP[filterBandIdx].clear(); for (int simdFilterIdx = 0; simdFilterIdx < maxNumFilters; ++simdFilterIdx) { iirLP[filterBandIdx].add (new IIR::Filter (iirLPCoefficients[filterBandIdx])); iirLP2[filterBandIdx].add ( new IIR::Filter (iirLPCoefficients[filterBandIdx])); iirHP[filterBandIdx].add (new IIR::Filter (iirHPCoefficients[filterBandIdx])); iirHP2[filterBandIdx].add ( new IIR::Filter (iirHPCoefficients[filterBandIdx])); iirAP[filterBandIdx].add (new IIR::Filter (iirAPCoefficients[filterBandIdx])); } } for (int filterBandIdx = 0; filterBandIdx < numFilterBands; ++filterBandIdx) { for (int simdFilterIdx = 0; simdFilterIdx < maxNumFilters; ++simdFilterIdx) { freqBandsBlocks[filterBandIdx].push_back (juce::HeapBlock()); } const juce::String thresholdID ("threshold" + juce::String (filterBandIdx)); const juce::String kneeID ("knee" + juce::String (filterBandIdx)); const juce::String attackID ("attack" + juce::String (filterBandIdx)); const juce::String releaseID ("release" + juce::String (filterBandIdx)); const juce::String ratioID ("ratio" + juce::String (filterBandIdx)); const juce::String makeUpGainID ("makeUpGain" + juce::String (filterBandIdx)); const juce::String bypassID ("bypass" + juce::String (filterBandIdx)); const juce::String soloID ("solo" + juce::String (filterBandIdx)); threshold[filterBandIdx] = parameters.getRawParameterValue (thresholdID); knee[filterBandIdx] = parameters.getRawParameterValue (kneeID); attack[filterBandIdx] = parameters.getRawParameterValue (attackID); release[filterBandIdx] = parameters.getRawParameterValue (releaseID); ratio[filterBandIdx] = parameters.getRawParameterValue (ratioID); makeUpGain[filterBandIdx] = parameters.getRawParameterValue (makeUpGainID); bypass[filterBandIdx] = parameters.getRawParameterValue (bypassID); parameters.addParameterListener (thresholdID, this); parameters.addParameterListener (kneeID, this); parameters.addParameterListener (attackID, this); parameters.addParameterListener (releaseID, this); parameters.addParameterListener (ratioID, this); parameters.addParameterListener (makeUpGainID, this); parameters.addParameterListener (bypassID, this); parameters.addParameterListener (soloID, this); } soloArray.clear(); copyCoeffsToProcessor(); for (int simdFilterIdx = 0; simdFilterIdx < maxNumFilters; ++simdFilterIdx) { interleavedBlockData.push_back (juce::HeapBlock()); } } MultiBandCompressorAudioProcessor::~MultiBandCompressorAudioProcessor() { } std::vector> MultiBandCompressorAudioProcessor::createParameterLayout() { std::vector> params; const float crossoverPresets[numFilterBands - 1] = { 80.0f, 440.0f, 2200.0f }; using Attributes = juce::AudioParameterFloatAttributes; auto floatParam = std::make_unique ( "orderSetting", "Ambisonics Order", juce::NormalisableRange (0.0f, 8.0f, 1.0f), 0.0f, Attributes().withStringFromValueFunction ( [] (float value, int maximumStringLength) { if (value >= 0.5f && value < 1.5f) return "0th"; else if (value >= 1.5f && value < 2.5f) return "1st"; else if (value >= 2.5f && value < 3.5f) return "2nd"; else if (value >= 3.5f && value < 4.5f) return "3rd"; else if (value >= 4.5f && value < 5.5f) return "4th"; else if (value >= 5.5f && value < 6.5f) return "5th"; else if (value >= 6.5f && value < 7.5f) return "6th"; else if (value >= 7.5f) return "7th"; else return "Auto"; })); params.push_back (std::move (floatParam)); floatParam = std::make_unique ( "useSN3D", "Normalization", juce::NormalisableRange (0.0f, 1.0f, 1.0f), 1.0f, Attributes().withStringFromValueFunction ( [] (float value, int maximumStringLength) { if (value >= 0.5f) return "SN3D"; else return "N3D"; })); params.push_back (std::move (floatParam)); // Crossovers for (int i = 0; i < numFilterBands - 1; ++i) { floatParam = std::make_unique ( "crossover" + juce::String (i), "Crossover " + juce::String (i), juce::NormalisableRange (20.0f, 20000.0f, 0.1f, 0.4f), crossoverPresets[i], Attributes() .withLabel ("Hz") .withStringFromValueFunction ([] (float v, int m) { return juce::String (v, m); }) .withValueFromStringFunction ([] (const juce::String& t) { return t.getFloatValue(); })); params.push_back (std::move (floatParam)); } for (int i = 0; i < numFilterBands; ++i) { // compressor threshold floatParam = std::make_unique ( "threshold" + juce::String (i), "Threshold " + juce::String (i), juce::NormalisableRange (-50.0f, 10.0f, 0.1f), -10.0f, Attributes() .withLabel ("dB") .withStringFromValueFunction ([] (float v, int m) { return juce::String (v, 1); }) .withValueFromStringFunction ([] (const juce::String& t) { return t.getFloatValue(); })); params.push_back (std::move (floatParam)); // knee floatParam = std::make_unique ( "knee" + juce::String (i), "Knee Width " + juce::String (i), juce::NormalisableRange (0.0f, 30.0f, 0.1f), 0.0f, Attributes() .withLabel ("dB") .withStringFromValueFunction ([] (float v, int m) { return juce::String (v, 1); }) .withValueFromStringFunction ([] (const juce::String& t) { return t.getFloatValue(); })); params.push_back (std::move (floatParam)); // attack floatParam = std::make_unique ( "attack" + juce::String (i), "Attack Time " + juce::String (i), juce::NormalisableRange (0.0f, 100.0f, 0.1f), 30.0f, Attributes() .withLabel ("ms") .withStringFromValueFunction ([] (float v, int m) { return juce::String (v, 1); }) .withValueFromStringFunction ([] (const juce::String& t) { return t.getFloatValue(); })); params.push_back (std::move (floatParam)); // release floatParam = std::make_unique ( "release" + juce::String (i), "Release Time " + juce::String (i), juce::NormalisableRange (0.0f, 500.0f, 0.1f), 150.0f, Attributes() .withLabel ("ms") .withStringFromValueFunction ([] (float v, int m) { return juce::String (v, 1); }) .withValueFromStringFunction ([] (const juce::String& t) { return t.getFloatValue(); })); params.push_back (std::move (floatParam)); // ratio floatParam = std::make_unique ( "ratio" + juce::String (i), "Ratio " + juce::String (i), juce::NormalisableRange (1.0f, 16.0f, 0.1f), 4.0f, Attributes() .withLabel (" : 1") .withStringFromValueFunction ( [] (float v, int m) { return (v > 15.9f) ? juce::String ("inf") : juce::String (v, 1); }) .withValueFromStringFunction ([] (const juce::String& t) { return t.getFloatValue(); })); params.push_back (std::move (floatParam)); // makeUpGain floatParam = std::make_unique ( "makeUpGain" + juce::String (i), "MakUp Gain " + juce::String (i), juce::NormalisableRange (-10.0f, 20.0f, 0.1f), 0.0f, Attributes() .withLabel ("dB") .withStringFromValueFunction ([] (float v, int m) { return juce::String (v, 1); }) .withValueFromStringFunction ([] (const juce::String& t) { return t.getFloatValue(); })); params.push_back (std::move (floatParam)); auto boolParam = std::make_unique ("bypass" + juce::String (i), "Bypass compression on band " + juce::String (i), false); params.push_back (std::move (boolParam)); boolParam = std::make_unique ("solo" + juce::String (i), "Solo band " + juce::String (i), false); params.push_back (std::move (boolParam)); } auto boolParam = std::make_unique ("displayOverallMagnitude", "Display overall magnitude", false); params.push_back (std::move (boolParam)); return params; } void MultiBandCompressorAudioProcessor::calculateCoefficients (const int i) { jassert (lastSampleRate > 0.0); const float crossoverFrequency = juce::jmin (static_cast (0.5 * lastSampleRate), crossovers[i]->load()); double b0, b1, b2, a0, a1, a2; double K = std::tan (juce::MathConstants::pi * (crossoverFrequency) / lastSampleRate); double den = 1 + juce::MathConstants::sqrt2 * K + pow (K, double (2.0)); // calculate coeffs for 2nd order Butterworth a0 = 1.0; a1 = (2 * (pow (K, 2.0) - 1)) / den; a2 = (1 - juce::MathConstants::sqrt2 * K + pow (K, 2.0)) / den; // HP b0 = 1.0 / den; b1 = -2.0 * b0; b2 = b0; iirTempHPCoefficients[i] = new IIR::Coefficients (b0, b1, b2, a0, a1, a2); // also calculate 4th order Linkwitz-Riley for GUI IIR::Coefficients::Ptr coeffs (new IIR::Coefficients (b0, b1, b2, a0, a1, a2)); coeffs->coefficients = FilterVisualizerHelper::cascadeSecondOrderCoefficients (coeffs->coefficients, coeffs->coefficients); *highPassLRCoeffs[i] = *coeffs; // LP b0 = pow (K, 2.0) / den; b1 = 2.0 * b0; b2 = b0; iirTempLPCoefficients[i] = new IIR::Coefficients (b0, b1, b2, a0, a1, a2); coeffs.reset(); coeffs = (new IIR::Coefficients (b0, b1, b2, a0, a1, a2)); coeffs->coefficients = FilterVisualizerHelper::cascadeSecondOrderCoefficients (coeffs->coefficients, coeffs->coefficients); *lowPassLRCoeffs[i] = *coeffs; // Allpass equivalent to 4th order Linkwitz-Riley crossover iirTempAPCoefficients[i] = new IIR::Coefficients (a2, a1, a0, a0, a1, a2); } void MultiBandCompressorAudioProcessor::copyCoeffsToProcessor() { for (int filterBandIdx = 0; filterBandIdx < numFilterBands - 1; ++filterBandIdx) { *iirLPCoefficients[filterBandIdx] = *iirTempLPCoefficients[filterBandIdx]; // LP *iirHPCoefficients[filterBandIdx] = *iirTempHPCoefficients[filterBandIdx]; // HP *iirAPCoefficients[filterBandIdx] = *iirTempAPCoefficients[filterBandIdx]; // AP } userChangedFilterSettings = false; } //============================================================================== int MultiBandCompressorAudioProcessor::getNumPrograms() { return 1; // NB: some hosts don't cope very well if you tell them there are 0 programs, // so this should be at least 1, even if you're not really implementing programs. } int MultiBandCompressorAudioProcessor::getCurrentProgram() { return 0; } void MultiBandCompressorAudioProcessor::setCurrentProgram (int index) { } const juce::String MultiBandCompressorAudioProcessor::getProgramName (int index) { return {}; } void MultiBandCompressorAudioProcessor::changeProgramName (int index, const juce::String& newName) { } //============================================================================== void MultiBandCompressorAudioProcessor::prepareToPlay (double sampleRate, int samplesPerBlock) { checkInputAndOutput (this, *orderSetting, *orderSetting, true); lastSampleRate = sampleRate; juce::dsp::ProcessSpec monoSpec; monoSpec.sampleRate = sampleRate; monoSpec.maximumBlockSize = samplesPerBlock; monoSpec.numChannels = 1; inputPeak = juce::Decibels::gainToDecibels (-INFINITY); outputPeak = juce::Decibels::gainToDecibels (-INFINITY); for (int filterBandIdx = 0; filterBandIdx < numFilterBands - 1; ++filterBandIdx) { calculateCoefficients (filterBandIdx); } copyCoeffsToProcessor(); interleavedData.clear(); for (int simdFilterIdx = 0; simdFilterIdx < maxNumFilters; ++simdFilterIdx) { interleavedData.add ( new juce::dsp::AudioBlock (interleavedBlockData[simdFilterIdx], 1, samplesPerBlock)); clear (*interleavedData.getLast()); } for (int filterBandIdx = 0; filterBandIdx < numFilterBands - 1; ++filterBandIdx) { for (int simdFilterIdx = 0; simdFilterIdx < maxNumFilters; ++simdFilterIdx) { iirLP[filterBandIdx][simdFilterIdx]->reset (IIRfloat (0.0f)); iirLP2[filterBandIdx][simdFilterIdx]->reset (IIRfloat (0.0f)); iirHP[filterBandIdx][simdFilterIdx]->reset (IIRfloat (0.0f)); iirHP2[filterBandIdx][simdFilterIdx]->reset (IIRfloat (0.0f)); iirAP[filterBandIdx][simdFilterIdx]->reset (IIRfloat (0.0f)); iirLP[filterBandIdx][simdFilterIdx]->prepare (monoSpec); iirLP2[filterBandIdx][simdFilterIdx]->prepare (monoSpec); iirHP[filterBandIdx][simdFilterIdx]->prepare (monoSpec); iirHP2[filterBandIdx][simdFilterIdx]->prepare (monoSpec); iirAP[filterBandIdx][simdFilterIdx]->prepare (monoSpec); } } for (int filterBandIdx = 0; filterBandIdx < numFilterBands; ++filterBandIdx) { compressors[filterBandIdx].prepare (monoSpec); compressors[filterBandIdx].setThreshold (*threshold[filterBandIdx]); compressors[filterBandIdx].setKnee (*knee[filterBandIdx]); compressors[filterBandIdx].setAttackTime (*attack[filterBandIdx] * 0.001f); compressors[filterBandIdx].setReleaseTime (*release[filterBandIdx] * 0.001f); compressors[filterBandIdx].setRatio ( *ratio[filterBandIdx] > 15.9f ? INFINITY : ratio[filterBandIdx]->load()); compressors[filterBandIdx].setMakeUpGain (*makeUpGain[filterBandIdx]); freqBands[filterBandIdx].clear(); for (int simdFilterIdx = 0; simdFilterIdx < maxNumFilters; ++simdFilterIdx) { freqBands[filterBandIdx].add ( new juce::dsp::AudioBlock (freqBandsBlocks[filterBandIdx][simdFilterIdx], 1, samplesPerBlock)); } } zero = juce::dsp::AudioBlock (zeroData, IIRfloat_elements, samplesPerBlock); zero.clear(); gains = juce::dsp::AudioBlock (gainData, 1, samplesPerBlock); gains.clear(); tempBuffer.setSize (64, samplesPerBlock, false, true); repaintFilterVisualization = true; } void MultiBandCompressorAudioProcessor::releaseResources() { // When playback stops, you can use this as an opportunity to free up any // spare memory, etc. } #ifndef JucePlugin_PreferredChannelConfigurations bool MultiBandCompressorAudioProcessor::isBusesLayoutSupported (const BusesLayout& layouts) const { return true; } #endif void MultiBandCompressorAudioProcessor::processBlock (juce::AudioSampleBuffer& buffer, juce::MidiBuffer& midiMessages) { checkInputAndOutput (this, *orderSetting, *orderSetting, false); juce::ScopedNoDenormals noDenormals; const int maxNChIn = juce::jmin (buffer.getNumChannels(), input.getNumberOfChannels()); if (maxNChIn < 1) return; const int L = buffer.getNumSamples(); const int nSIMDFilters = 1 + (maxNChIn - 1) / IIRfloat_elements; gainChannelPointer = gains.getChannelPointer (0); gains.clear(); zero.clear(); // update iir filter coefficients if (userChangedFilterSettings.get()) copyCoeffsToProcessor(); inputPeak = juce::Decibels::gainToDecibels (buffer.getMagnitude (0, 0, L)); using Format = juce::AudioData::Format; //interleave input data int partial = maxNChIn % IIRfloat_elements; if (partial == 0) { for (int simdFilterIdx = 0; simdFilterIdx < nSIMDFilters; ++simdFilterIdx) { juce::AudioData::interleaveSamples ( juce::AudioData::NonInterleavedSource { buffer.getArrayOfReadPointers() + simdFilterIdx * IIRfloat_elements, IIRfloat_elements }, juce::AudioData::InterleavedDest { reinterpret_cast ( interleavedData[simdFilterIdx]->getChannelPointer (0)), IIRfloat_elements }, L); } } else { int simdFilterIdx; for (simdFilterIdx = 0; simdFilterIdx < nSIMDFilters - 1; ++simdFilterIdx) { juce::AudioData::interleaveSamples ( juce::AudioData::NonInterleavedSource { buffer.getArrayOfReadPointers() + simdFilterIdx * IIRfloat_elements, IIRfloat_elements }, juce::AudioData::InterleavedDest { reinterpret_cast ( interleavedData[simdFilterIdx]->getChannelPointer (0)), IIRfloat_elements }, L); } const float* addr[IIRfloat_elements]; int iirElementIdx; for (iirElementIdx = 0; iirElementIdx < partial; ++iirElementIdx) { addr[iirElementIdx] = buffer.getReadPointer (simdFilterIdx * IIRfloat_elements + iirElementIdx); } for (; iirElementIdx < IIRfloat_elements; ++iirElementIdx) { addr[iirElementIdx] = zero.getChannelPointer (iirElementIdx); } juce::AudioData::interleaveSamples ( juce::AudioData::NonInterleavedSource { addr, IIRfloat_elements }, juce::AudioData::InterleavedDest { reinterpret_cast (interleavedData[simdFilterIdx]->getChannelPointer (0)), IIRfloat_elements }, L); } // filter block diagram // | ---> HP3 ---> | // | ---> HP2 ---> AP1 --->| + ---> | // | | ---> LP3 ---> | | // -->| + ---> // | | ---> HP1 ---> | | // | ---> LP2 ---> AP3 --->| + ---> | // | ---> LP1 ---> | for (int simdFilterIdx = 0; simdFilterIdx < nSIMDFilters; ++simdFilterIdx) { const IIRfloat* chPtrinterleavedData[1] = { interleavedData[simdFilterIdx]->getChannelPointer (0) }; juce::dsp::AudioBlock abInterleaved ( const_cast (chPtrinterleavedData), 1, L); const IIRfloat* chPtrLow[1] = { freqBands[FrequencyBands::Low][simdFilterIdx]->getChannelPointer (0) }; juce::dsp::AudioBlock abLow (const_cast (chPtrLow), 1, L); const IIRfloat* chPtrMidLow[1] = { freqBands[FrequencyBands::MidLow][simdFilterIdx]->getChannelPointer (0) }; juce::dsp::AudioBlock abMidLow (const_cast (chPtrMidLow), 1, L); const IIRfloat* chPtrMidHigh[1] = { freqBands[FrequencyBands::MidHigh][simdFilterIdx]->getChannelPointer (0) }; juce::dsp::AudioBlock abMidHigh (const_cast (chPtrMidHigh), 1, L); const IIRfloat* chPtrHigh[1] = { freqBands[FrequencyBands::High][simdFilterIdx]->getChannelPointer (0) }; juce::dsp::AudioBlock abHigh (const_cast (chPtrHigh), 1, L); iirLP[1][simdFilterIdx]->process ( juce::dsp::ProcessContextNonReplacing (abInterleaved, abLow)); iirHP[1][simdFilterIdx]->process ( juce::dsp::ProcessContextNonReplacing (abInterleaved, abHigh)); iirLP2[1][simdFilterIdx]->process (juce::dsp::ProcessContextReplacing (abLow)); iirHP2[1][simdFilterIdx]->process (juce::dsp::ProcessContextReplacing (abHigh)); iirAP[2][simdFilterIdx]->process (juce::dsp::ProcessContextReplacing (abLow)); iirAP[0][simdFilterIdx]->process (juce::dsp::ProcessContextReplacing (abHigh)); iirHP[0][simdFilterIdx]->process ( juce::dsp::ProcessContextNonReplacing (abLow, abMidLow)); iirHP2[0][simdFilterIdx]->process (juce::dsp::ProcessContextReplacing (abMidLow)); iirLP[0][simdFilterIdx]->process (juce::dsp::ProcessContextReplacing (abLow)); iirLP2[0][simdFilterIdx]->process (juce::dsp::ProcessContextReplacing (abLow)); iirLP[2][simdFilterIdx]->process ( juce::dsp::ProcessContextNonReplacing (abHigh, abMidHigh)); iirLP2[2][simdFilterIdx]->process ( juce::dsp::ProcessContextReplacing (abMidHigh)); iirHP[2][simdFilterIdx]->process (juce::dsp::ProcessContextReplacing (abHigh)); iirHP2[2][simdFilterIdx]->process (juce::dsp::ProcessContextReplacing (abHigh)); } buffer.clear(); for (int filterBandIdx = 0; filterBandIdx < numFilterBands; ++filterBandIdx) { if (! soloArray.isZero()) { if (! soloArray[filterBandIdx]) { maxGR[filterBandIdx] = 0.0f; maxPeak[filterBandIdx] = -INFINITY; continue; } } tempBuffer.clear(); // Deinterleave if (partial == 0) { for (int simdFilterIdx = 0; simdFilterIdx < nSIMDFilters; ++simdFilterIdx) { juce::AudioData::deinterleaveSamples ( juce::AudioData::InterleavedSource { reinterpret_cast ( freqBands[filterBandIdx][simdFilterIdx]->getChannelPointer (0)), IIRfloat_elements }, juce::AudioData::NonInterleavedDest { tempBuffer.getArrayOfWritePointers() + simdFilterIdx * IIRfloat_elements, IIRfloat_elements }, L); } } else { int simdFilterIdx; for (simdFilterIdx = 0; simdFilterIdx < nSIMDFilters - 1; ++simdFilterIdx) { juce::AudioData::deinterleaveSamples ( juce::AudioData::InterleavedSource { reinterpret_cast ( freqBands[filterBandIdx][simdFilterIdx]->getChannelPointer (0)), IIRfloat_elements }, juce::AudioData::NonInterleavedDest { tempBuffer.getArrayOfWritePointers() + simdFilterIdx * IIRfloat_elements, IIRfloat_elements }, L); } float* addr[IIRfloat_elements]; int iirElementIdx; for (iirElementIdx = 0; iirElementIdx < partial; ++iirElementIdx) { addr[iirElementIdx] = tempBuffer.getWritePointer (simdFilterIdx * IIRfloat_elements + iirElementIdx); } for (; iirElementIdx < IIRfloat_elements; ++iirElementIdx) { addr[iirElementIdx] = zero.getChannelPointer (iirElementIdx); } juce::AudioData::deinterleaveSamples ( juce::AudioData::InterleavedSource { reinterpret_cast ( freqBands[filterBandIdx][simdFilterIdx]->getChannelPointer (0)), IIRfloat_elements }, juce::AudioData::NonInterleavedDest { addr, IIRfloat_elements }, L); zero.clear(); } // Compress if (*bypass[filterBandIdx] < 0.5f) { compressors[filterBandIdx].getGainFromSidechainSignal (tempBuffer.getReadPointer (0), gainChannelPointer, L); maxGR[filterBandIdx] = juce::Decibels::gainToDecibels ( juce::FloatVectorOperations::findMinimum (gainChannelPointer, L)) - *makeUpGain[filterBandIdx]; maxPeak[filterBandIdx] = compressors[filterBandIdx].getMaxLevelInDecibels(); for (int ch = 0; ch < maxNChIn; ++ch) { juce::FloatVectorOperations::addWithMultiply (buffer.getWritePointer (ch), tempBuffer.getReadPointer (ch), gainChannelPointer, L); } } else { for (int ch = 0; ch < maxNChIn; ++ch) { juce::FloatVectorOperations::add (buffer.getWritePointer (ch), tempBuffer.getReadPointer (ch), L); } maxGR[filterBandIdx] = 0.0f; maxPeak[filterBandIdx] = juce::Decibels::gainToDecibels (-INFINITY); } } outputPeak = juce::Decibels::gainToDecibels (buffer.getMagnitude (0, 0, L)); } //============================================================================== bool MultiBandCompressorAudioProcessor::hasEditor() const { return true; // (change this to false if you choose to not supply an editor) } juce::AudioProcessorEditor* MultiBandCompressorAudioProcessor::createEditor() { return new MultiBandCompressorAudioProcessorEditor (*this, parameters); } //============================================================================== void MultiBandCompressorAudioProcessor::getStateInformation (juce::MemoryBlock& destData) { auto state = parameters.copyState(); auto oscConfig = state.getOrCreateChildWithName ("OSCConfig", nullptr); oscConfig.copyPropertiesFrom (oscParameterInterface.getConfig(), nullptr); std::unique_ptr xml (state.createXml()); copyXmlToBinary (*xml, destData); } void MultiBandCompressorAudioProcessor::setStateInformation (const void* data, int sizeInBytes) { std::unique_ptr xmlState (getXmlFromBinary (data, sizeInBytes)); if (xmlState.get() != nullptr) if (xmlState->hasTagName (parameters.state.getType())) { parameters.replaceState (juce::ValueTree::fromXml (*xmlState)); if (parameters.state.hasProperty ("OSCPort")) // legacy { oscParameterInterface.getOSCReceiver().connect ( parameters.state.getProperty ("OSCPort", juce::var (-1))); parameters.state.removeProperty ("OSCPort", nullptr); } auto oscConfig = parameters.state.getChildWithName ("OSCConfig"); if (oscConfig.isValid()) oscParameterInterface.setConfig (oscConfig); } } //============================================================================== void MultiBandCompressorAudioProcessor::parameterChanged (const juce::String& parameterID, float newValue) { DBG ("Parameter with ID " << parameterID << " has changed. New value: " << newValue); if (parameterID.startsWith ("crossover")) { calculateCoefficients (parameterID.getLastCharacters (1).getIntValue()); userChangedFilterSettings = true; repaintFilterVisualization = true; } else if (parameterID.startsWith ("threshold")) { const int compId = parameterID.getLastCharacters (1).getIntValue(); compressors[compId].setThreshold (newValue); characteristicHasChanged[compId] = true; } else if (parameterID.startsWith ("knee")) { const int compId = parameterID.getLastCharacters (1).getIntValue(); compressors[compId].setKnee (newValue); characteristicHasChanged[compId] = true; } else if (parameterID.startsWith ("attack")) { compressors[parameterID.getLastCharacters (1).getIntValue()].setAttackTime (newValue * 0.001f); } else if (parameterID.startsWith ("release")) { compressors[parameterID.getLastCharacters (1).getIntValue()].setReleaseTime (newValue * 0.001f); } else if (parameterID.startsWith ("ratio")) { const int compId = parameterID.getLastCharacters (1).getIntValue(); if (newValue > 15.9f) compressors[compId].setRatio (INFINITY); else compressors[compId].setRatio (newValue); characteristicHasChanged[compId] = true; } else if (parameterID.startsWith ("makeUpGain")) { const int compId = parameterID.getLastCharacters (1).getIntValue(); compressors[compId].setMakeUpGain (newValue); characteristicHasChanged[compId] = true; } else if (parameterID.startsWith ("solo")) { if (newValue >= 0.5f) soloArray.setBit (parameterID.getLastCharacters (1).getIntValue()); else soloArray.clearBit (parameterID.getLastCharacters (1).getIntValue()); } else if (parameterID == "orderSetting") { userChangedIOSettings = true; } } void MultiBandCompressorAudioProcessor::updateBuffers() { DBG ("IOHelper: input size: " << input.getSize()); DBG ("IOHelper: output size: " << output.getSize()); } //============================================================================== // This creates new instances of the plugin.. juce::AudioProcessor* JUCE_CALLTYPE createPluginFilter() { return new MultiBandCompressorAudioProcessor(); } inline void MultiBandCompressorAudioProcessor::clear (juce::dsp::AudioBlock& ab) { const int N = static_cast (ab.getNumSamples()) * IIRfloat_elements; const int nCh = static_cast (ab.getNumChannels()); for (int ch = 0; ch < nCh; ++ch) juce::FloatVectorOperations::clear (reinterpret_cast (ab.getChannelPointer (ch)), N); } ././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/MultiBandCompressor/Source/PluginEditor.cppIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/MultiBandCompressor/Source/PluginEdi0000664002537200253720000007154415257173642031641 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Markus Huber Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #include "PluginEditor.h" //============================================================================== MultiBandCompressorAudioProcessorEditor::MultiBandCompressorAudioProcessorEditor ( MultiBandCompressorAudioProcessor& p, juce::AudioProcessorValueTreeState& vts) : juce::AudioProcessorEditor (&p), processor (p), valueTreeState (vts), footer (p.getOSCParameterInterface()), filterBankVisualizer (20.0f, 20000.0f, -15.0f, 20.0f, 5.0f, p.getSampleRate(), numFilterBands) { // ============== BEGIN: essentials ====================== // set GUI size and lookAndFeel setResizeLimits (980, 980 * 0.6, 1600, 1600 * 0.6); // use this to create a resizable GUI setResizable (true, true); setLookAndFeel (&globalLaF); // make title and footer visible, and set the PluginName addAndMakeVisible (&title); title.setTitle (juce::String ("MultiBand"), juce::String ("Compressor")); title.setFont (globalLaF.robotoBold, globalLaF.robotoLight); addAndMakeVisible (&footer); // ============= END: essentials ======================== cbNormalizationAtachement = std::make_unique (valueTreeState, "useSN3D", *title.getInputWidgetPtr()->getNormCbPointer()); cbOrderAtachement = std::make_unique (valueTreeState, "orderSetting", *title.getInputWidgetPtr()->getOrderCbPointer()); tooltips.setMillisecondsBeforeTipAppears (800); tooltips.setOpaque (false); const juce::Colour colours[numFilterBands] = { juce::Colours::cornflowerblue, juce::Colours::greenyellow, juce::Colours::yellow, juce::Colours::orangered }; for (int i = 0; i < numFilterBands; ++i) { // ==== COMPRESSOR VISUALIZATION ==== compressorVisualizers.add (new CompressorVisualizer (p.getCompressor (i))); addAndMakeVisible (compressorVisualizers[i]); // ===== GR METERS ===== addAndMakeVisible (&GRmeter[i]); GRmeter[i].setMinLevel (-25.0f); GRmeter[i].setColour (juce::Colours::red.withMultipliedAlpha (0.8f)); GRmeter[i].setGainReductionMeter (true); // ==== SLIDERS ==== addAndMakeVisible (&slThreshold[i]); slThresholdAttachment[i] = std::make_unique (valueTreeState, "threshold" + juce::String (i), slThreshold[i]); slThreshold[i].setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); slThreshold[i].setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 12); slThreshold[i].setColour (juce::Slider::rotarySliderOutlineColourId, colours[i]); slThreshold[i].setTextValueSuffix (" dB"); addAndMakeVisible (&slKnee[i]); slKneeAttachment[i] = std::make_unique (valueTreeState, "knee" + juce::String (i), slKnee[i]); slKnee[i].setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); slKnee[i].setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 12); slKnee[i].setColour (juce::Slider::rotarySliderOutlineColourId, colours[i]); slKnee[i].setTextValueSuffix (" dB"); addAndMakeVisible (&slRatio[i]); slRatioAttachment[i] = std::make_unique (valueTreeState, "ratio" + juce::String (i), slRatio[i]); slRatio[i].setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); slRatio[i].setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 12); slRatio[i].setColour (juce::Slider::rotarySliderOutlineColourId, colours[i]); addAndMakeVisible (&slAttackTime[i]); slAttackTimeAttachment[i] = std::make_unique (valueTreeState, "attack" + juce::String (i), slAttackTime[i]); slAttackTime[i].setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); slAttackTime[i].setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 12); slAttackTime[i].setColour (juce::Slider::rotarySliderOutlineColourId, colours[i]); slRatio[i].setTextValueSuffix (" ms"); addAndMakeVisible (&slReleaseTime[i]); slReleaseTimeAttachment[i] = std::make_unique (valueTreeState, "release" + juce::String (i), slReleaseTime[i]); slReleaseTime[i].setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); slReleaseTime[i].setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 12); slReleaseTime[i].setColour (juce::Slider::rotarySliderOutlineColourId, colours[i]); slReleaseTime[i].setTextValueSuffix (" ms"); addAndMakeVisible (&slMakeUpGain[i]); slMakeUpGainAttachment[i] = std::make_unique (valueTreeState, "makeUpGain" + juce::String (i), slMakeUpGain[i]); slMakeUpGain[i].setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); slMakeUpGain[i].setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 12); slMakeUpGain[i].setColour (juce::Slider::rotarySliderOutlineColourId, colours[i]); slMakeUpGain[i].setTextValueSuffix (" dB"); slMakeUpGain[i].setName (juce::String ("MakeUpGain" + juce::String (i))); slMakeUpGain[i].addListener (this); // ===== LABELS ===== addAndMakeVisible (&lbKnee[i]); lbKnee[i].setText ("Knee"); lbKnee[i].setTextColour (globalLaF.ClFace); addAndMakeVisible (&lbThreshold[i]); lbThreshold[i].setText ("Threshold"); lbThreshold[i].setTextColour (globalLaF.ClFace); addAndMakeVisible (&lbMakeUpGain[i]); lbMakeUpGain[i].setText ("Makeup"); lbMakeUpGain[i].setTextColour (globalLaF.ClFace); addAndMakeVisible (&lbRatio[i]); lbRatio[i].setText ("Ratio"); lbRatio[i].setTextColour (globalLaF.ClFace); addAndMakeVisible (&lbAttack[i]); lbAttack[i].setText ("Attack"); lbAttack[i].setTextColour (globalLaF.ClFace); addAndMakeVisible (&lbRelease[i]); lbRelease[i].setText ("Release"); lbRelease[i].setTextColour (globalLaF.ClFace); // ==== BUTTONS ==== tbSolo[i].setColour (juce::ToggleButton::tickColourId, juce::Colour (0xFFFFFF66).withMultipliedAlpha (0.85f)); tbSolo[i].setScaleFontSize (0.75f); tbSolo[i].setButtonText ("S"); tbSolo[i].setName ("solo" + juce::String (i)); tbSolo[i].setTooltip ("Solo band #" + juce::String (i)); soloAttachment[i] = std::make_unique ( valueTreeState, "solo" + juce::String (i), tbSolo[i]); tbSolo[i].setClickingTogglesState (true); tbSolo[i].addListener (this); addAndMakeVisible (&tbSolo[i]); tbBypass[i].setColour (juce::ToggleButton::tickColourId, juce::Colour (0xFF5bAE87).withMultipliedAlpha (0.85f)); tbBypass[i].setScaleFontSize (0.75f); tbBypass[i].setButtonText ("B"); tbBypass[i].setName ("bypass" + juce::String (i)); tbBypass[i].setTooltip ("Bypass band #" + juce::String (i)); bypassAttachment[i] = std::make_unique ( valueTreeState, "bypass" + juce::String (i), tbBypass[i]); tbBypass[i].setClickingTogglesState (true); tbBypass[i].addListener (this); addAndMakeVisible (&tbBypass[i]); } // ==== FILTER VISUALIZATION ==== juce::dsp::IIR::Coefficients::Ptr coeffs1; juce::dsp::IIR::Coefficients::Ptr coeffs2; for (int i = 0; i < numFilterBands; ++i) { switch (i) { case (int) MultiBandCompressorAudioProcessor::FrequencyBands::Low: coeffs1 = processor.lowPassLRCoeffs[1]; coeffs2 = processor.lowPassLRCoeffs[0]; break; case (int) MultiBandCompressorAudioProcessor::FrequencyBands::MidLow: coeffs1 = processor.lowPassLRCoeffs[1]; coeffs2 = processor.highPassLRCoeffs[0]; break; case (int) MultiBandCompressorAudioProcessor::FrequencyBands::MidHigh: coeffs1 = processor.highPassLRCoeffs[1]; coeffs2 = processor.lowPassLRCoeffs[2]; break; case (int) MultiBandCompressorAudioProcessor::FrequencyBands::High: coeffs1 = processor.highPassLRCoeffs[1]; coeffs2 = processor.highPassLRCoeffs[2]; break; } filterBankVisualizer.setFrequencyBand (i, coeffs1, coeffs2, colours[i]); filterBankVisualizer.setBypassed (i, tbBypass[i].getToggleState()); filterBankVisualizer.setSolo (i, tbSolo[i].getToggleState()); filterBankVisualizer.updateMakeUpGain (i, slMakeUpGain[i].getValue()); } addAndMakeVisible (&filterBankVisualizer); // SHOW OVERALL MAGNITUDE BUTTON tbOverallMagnitude.setColour (juce::ToggleButton::tickColourId, juce::Colours::white); tbOverallMagnitude.setButtonText ("show total magnitude"); tbOverallMagnitude.setName ("overallMagnitude"); overallMagnitudeDisplayAttachment = std::make_unique ( valueTreeState, "displayOverallMagnitude", tbOverallMagnitude); tbOverallMagnitude.setClickingTogglesState (true); tbOverallMagnitude.addListener (this); addAndMakeVisible (&tbOverallMagnitude); // ==== CROSSOVER SLIDERS ==== for (int i = 0; i < numFilterBands - 1; ++i) { slCrossoverAttachment[i] = std::make_unique (valueTreeState, "crossover" + juce::String (i), slCrossover[i]); addAndMakeVisible (&slCrossover[i]); slCrossover[i].setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); slCrossover[i].setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 12); slCrossover[i].setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClRotSliderArrow); slCrossover[i].setTooltip ("Crossover Frequency " + juce::String (i + 1)); slCrossover[i].setName ("Crossover" + juce::String (i)); slCrossover[i].addListener (this); // add crossover to visualizer filterBankVisualizer.addCrossover (&slCrossover[i]); } // ==== METERS - INPUT/OUTPUT ==== addAndMakeVisible (&omniInputMeter); omniInputMeter.setMinLevel (-60.0f); omniInputMeter.setColour (juce::Colours::green.withMultipliedAlpha (0.8f)); omniInputMeter.setGainReductionMeter (false); addAndMakeVisible (&lbInput); lbInput.setText ("Input"); lbInput.setTextColour (globalLaF.ClFace); addAndMakeVisible (&omniOutputMeter); omniOutputMeter.setMinLevel (-60.0f); omniOutputMeter.setColour (juce::Colours::green.withMultipliedAlpha (0.8f)); omniOutputMeter.setGainReductionMeter (false); addAndMakeVisible (&lbOutput); lbOutput.setText ("Output"); lbOutput.setTextColour (globalLaF.ClFace); // ==== MASTER CONTROLS ==== addAndMakeVisible (&slMasterThreshold); slMasterThreshold.setName ("MasterThreshold"); addAndMakeVisible (&lbThreshold[numFilterBands]); lbThreshold[numFilterBands].setText ("Thresh."); lbThreshold[numFilterBands].setTextColour (globalLaF.ClFace); addAndMakeVisible (&slMasterKnee); slMasterKnee.setName ("MasterKnee"); addAndMakeVisible (&lbKnee[numFilterBands]); lbKnee[numFilterBands].setText ("Knee"); lbKnee[numFilterBands].setTextColour (globalLaF.ClFace); addAndMakeVisible (&slMasterMakeUpGain); slMasterMakeUpGain.setName ("MasterMakeUpGain"); addAndMakeVisible (&lbMakeUpGain[numFilterBands]); lbMakeUpGain[numFilterBands].setText ("Gain"); lbMakeUpGain[numFilterBands].setTextColour (globalLaF.ClFace); addAndMakeVisible (&slMasterRatio); slMasterRatio.setName ("MasterMakeUpGain"); addAndMakeVisible (&lbRatio[numFilterBands]); lbRatio[numFilterBands].setText ("Ratio"); lbRatio[numFilterBands].setTextColour (globalLaF.ClFace); addAndMakeVisible (&slMasterAttackTime); slMasterAttackTime.setName ("MasterAttackTime"); addAndMakeVisible (&lbAttack[numFilterBands]); lbAttack[numFilterBands].setText ("Attack"); lbAttack[numFilterBands].setTextColour (globalLaF.ClFace); addAndMakeVisible (&slMasterReleaseTime); slMasterReleaseTime.setName ("MasterReleaseTime"); addAndMakeVisible (&lbRelease[numFilterBands]); lbRelease[numFilterBands].setText ("Rel."); lbRelease[numFilterBands].setTextColour (globalLaF.ClFace); gcMasterControls.setText ("Master controls"); addAndMakeVisible (&gcMasterControls); // add sliders to master controls for (int i = 0; i < numFilterBands; ++i) { slMasterThreshold.addSlave (slThreshold[i]); slMasterKnee.addSlave (slKnee[i]); slMasterMakeUpGain.addSlave (slMakeUpGain[i]); slMasterRatio.addSlave (slRatio[i]); slMasterAttackTime.addSlave (slAttackTime[i]); slMasterReleaseTime.addSlave (slReleaseTime[i]); } /* resized () is called here, because otherwise the compressorVisualizers won't be drawn to the GUI until one manually resizes the window. It seems resized() somehow gets called *before* the constructor and therefore juce::OwnedArray is still empty on the first resized call... */ resized(); // start timer after everything is set up properly startTimer (50); } MultiBandCompressorAudioProcessorEditor::~MultiBandCompressorAudioProcessorEditor() { setLookAndFeel (nullptr); } //============================================================================== void MultiBandCompressorAudioProcessorEditor::paint (juce::Graphics& g) { g.fillAll (globalLaF.ClBackground); } void MultiBandCompressorAudioProcessorEditor::resized() { // ============ BEGIN: header and footer ============ const int leftRightMargin = 30; const int headerHeight = 60; const int footerHeight = 25; juce::Rectangle area (getLocalBounds()); juce::Rectangle footerArea (area.removeFromBottom (footerHeight)); footer.setBounds (footerArea); area.removeFromLeft (leftRightMargin); area.removeFromRight (leftRightMargin); juce::Rectangle headerArea = area.removeFromTop (headerHeight); title.setBounds (headerArea); area.removeFromTop (10); area.removeFromBottom (5); // =========== END: header and footer ================= // ==== SPLIT INTO 4 BASIC SECTIONS ==== // const float leftToRightRatio = 0.87; const int leftToRightGap = 6; const float filterBankToLowerRatio = 0.34f; const float crossoverAndButtonToCompressorsRatio = 0.1645f; const int filterToCrossoverAndButtonGap = 2; const int compressorToCrossoverAndButtonGap = 2; // split // juce::Rectangle leftArea = area.removeFromLeft (area.proportionOfWidth (leftToRightRatio)); // juce::Rectangle rightArea (area); juce::Rectangle rightArea = area.removeFromRight (130); area.removeFromRight (leftToRightGap); juce::Rectangle leftArea (area); // leftArea.removeFromRight (leftToRightGap / 2); // rightArea.removeFromLeft (leftToRightGap / 2); juce::Rectangle filterBankArea = leftArea.removeFromTop (leftArea.proportionOfHeight (filterBankToLowerRatio)); juce::Rectangle compressorArea = leftArea; juce::Rectangle crossoverAndButtonArea = compressorArea.removeFromTop ( compressorArea.proportionOfHeight (crossoverAndButtonToCompressorsRatio)); // safeguard against haphephobia filterBankArea.removeFromBottom (filterToCrossoverAndButtonGap / 2); crossoverAndButtonArea.removeFromTop (filterToCrossoverAndButtonGap / 2); crossoverAndButtonArea.removeFromBottom (compressorToCrossoverAndButtonGap / 2); compressorArea.removeFromTop (compressorToCrossoverAndButtonGap / 2); // ==== FILTER VISUALIZATION ==== filterBankVisualizer.setBounds (filterBankArea); // ==== BUTTONS AND CROSSOVER SLIDERS ==== const int crossoverToButtonGap = 32; const int buttonToButtonGap = 0; const float crossoverToButtonsRatio = 0.85f; const float trimButtonsHeight = 0.17f; const float trimButtonsWidth = 0.17f; juce::Rectangle soloButtonArea; juce::Rectangle bypassButtonArea; juce::Rectangle crossoverArea; const int buttonsWidth = crossoverAndButtonArea.getWidth() / (numFilterBands + (numFilterBands - 1) * crossoverToButtonsRatio); const int crossoverSliderWidth = buttonsWidth * crossoverToButtonsRatio; for (int i = 0; i < numFilterBands; ++i) { // juce::Buttons bypassButtonArea = crossoverAndButtonArea.removeFromLeft (buttonsWidth); bypassButtonArea.reduce (crossoverToButtonGap / 2, 0); soloButtonArea = bypassButtonArea.removeFromLeft (bypassButtonArea.proportionOfWidth (0.5)); soloButtonArea.removeFromRight (buttonToButtonGap / 2); bypassButtonArea.removeFromLeft (buttonToButtonGap / 2); tbSolo[i].setBounds ( soloButtonArea.reduced (soloButtonArea.proportionOfWidth (trimButtonsWidth), soloButtonArea.proportionOfHeight (trimButtonsHeight))); tbBypass[i].setBounds ( bypassButtonArea.reduced (bypassButtonArea.proportionOfWidth (trimButtonsWidth), bypassButtonArea.proportionOfHeight (trimButtonsHeight))); // juce::Sliders if (i < numFilterBands - 1) { crossoverArea = crossoverAndButtonArea.removeFromLeft (crossoverSliderWidth); slCrossover[i].setBounds (crossoverArea.reduced (crossoverToButtonGap / 2, 0)); } } // ==== COMPRESSOR VISUALIZATION ==== const float paramToCharacteristiscRatio = 0.47f; const float meterToCharacteristicRatio = 0.175f; const float labelToParamRatio = 0.25f; const int paramRowToRowGap = 2; const int paramToCharacteristicGap = 2; const int bandToBandGap = 6; const int meterToCharacteristicGap = 6; const float trimMeterHeightRatio = 0.02f; compressorArea.reduce ( ((compressorArea.getWidth() - (numFilterBands - 1) * bandToBandGap) % numFilterBands) / 2, 0); const int widthPerBand = ((compressorArea.getWidth() - (numFilterBands - 1) * bandToBandGap) / numFilterBands); juce::Rectangle characteristicArea, paramArea, paramRow1, paramRow2, labelRow1, labelRow2, grMeterArea; for (int i = 0; i < numFilterBands; ++i) { characteristicArea = compressorArea.removeFromLeft (widthPerBand); // Compressor parameters paramArea = characteristicArea.removeFromBottom ( characteristicArea.proportionOfHeight (paramToCharacteristiscRatio)); paramArea.removeFromTop (paramToCharacteristicGap / 2); characteristicArea.removeFromBottom (paramToCharacteristicGap / 2); paramArea.reduce ((paramArea.getWidth() % 3) / 2, 0); const int sliderWidth = paramArea.getWidth() / 3; auto paramRowHeight = paramArea.proportionOfHeight (0.5f); paramRow1 = paramArea.removeFromTop (paramRowHeight); paramRow2 = paramArea.removeFromBottom (paramRowHeight); paramRow1.removeFromBottom (paramRowToRowGap / 2); paramRow2.removeFromTop (paramRowToRowGap / 2); labelRow1 = paramRow1.removeFromBottom (paramRow1.proportionOfHeight (labelToParamRatio)); labelRow2 = paramRow2.removeFromBottom (paramRow2.proportionOfHeight (labelToParamRatio)); lbThreshold[i].setBounds (labelRow1.removeFromLeft (sliderWidth)); lbKnee[i].setBounds (labelRow1.removeFromLeft (sliderWidth)); lbMakeUpGain[i].setBounds (labelRow1.removeFromLeft (sliderWidth)); slThreshold[i].setBounds (paramRow1.removeFromLeft (sliderWidth)); slKnee[i].setBounds (paramRow1.removeFromLeft (sliderWidth)); slMakeUpGain[i].setBounds (paramRow1.removeFromLeft (sliderWidth)); lbRatio[i].setBounds (labelRow2.removeFromLeft (sliderWidth)); lbAttack[i].setBounds (labelRow2.removeFromLeft (sliderWidth)); lbRelease[i].setBounds (labelRow2.removeFromLeft (sliderWidth)); slRatio[i].setBounds (paramRow2.removeFromLeft (sliderWidth)); slAttackTime[i].setBounds (paramRow2.removeFromLeft (sliderWidth)); slReleaseTime[i].setBounds (paramRow2.removeFromLeft (sliderWidth)); // Gain-Reduction meter grMeterArea = characteristicArea.removeFromRight ( characteristicArea.proportionOfWidth (meterToCharacteristicRatio)); grMeterArea.removeFromLeft (meterToCharacteristicGap / 2); characteristicArea.removeFromRight (meterToCharacteristicGap / 2); GRmeter[i].setBounds ( grMeterArea.reduced (0, grMeterArea.proportionOfHeight (trimMeterHeightRatio))); // Compressor characteristic if (! (compressorVisualizers.isEmpty())) compressorVisualizers[i]->setBounds (characteristicArea); if (i < numFilterBands - 1) compressorArea.removeFromLeft (bandToBandGap); } // ==== INPUT & OUTPUT METER ==== const float labelToMeterRatio = 0.1f; const int meterToMeterGap = 10; juce::Rectangle meterArea = rightArea.removeFromTop (rightArea.proportionOfHeight (filterBankToLowerRatio)); meterArea.reduce (meterArea.proportionOfWidth (0.18f), 0); juce::Rectangle inputMeterArea = meterArea.removeFromLeft (meterArea.proportionOfWidth (0.5f)); juce::Rectangle outputMeterArea = meterArea; inputMeterArea.removeFromRight (meterToMeterGap / 2); outputMeterArea.removeFromLeft (meterToMeterGap / 2); juce::Rectangle inputMeterLabelArea = inputMeterArea.removeFromBottom (inputMeterArea.proportionOfHeight (labelToMeterRatio)); juce::Rectangle outputMeterLabelArea = outputMeterArea.removeFromBottom (outputMeterArea.proportionOfHeight (labelToMeterRatio)); omniInputMeter.setBounds (inputMeterArea); omniOutputMeter.setBounds (outputMeterArea); lbInput.setBounds (inputMeterLabelArea); lbOutput.setBounds (outputMeterLabelArea); // ==== MASTER SLIDERS + LABELS ==== const float masterToUpperArea = 0.5; const float labelToSliderRatio = 0.24f; const int trimFromGroupComponentHeader = 25; const float trimSliderHeight = 0.125f; const float trimSliderWidth = 0.00f; const int masterToCompressorSectionGap = 18; juce::Rectangle masterArea = rightArea.removeFromBottom (rightArea.proportionOfHeight (masterToUpperArea)); masterArea.removeFromLeft (masterToCompressorSectionGap); gcMasterControls.setBounds (masterArea); masterArea.removeFromTop (trimFromGroupComponentHeader); juce::Rectangle sliderRow = masterArea.removeFromTop (masterArea.proportionOfHeight (0.5f)); // sliderRow.reduce (sliderRow.proportionOfWidth (trimSliderWidth), sliderRow.proportionOfHeight (trimSliderHeight)); juce::Rectangle labelRow = sliderRow.removeFromBottom (sliderRow.proportionOfHeight (labelToSliderRatio)); const int masterSliderWidth = 40; DBG (sliderRow.getWidth()); slMasterThreshold.setBounds (sliderRow.removeFromLeft (masterSliderWidth)); slMasterKnee.setBounds (sliderRow.removeFromLeft (masterSliderWidth)); slMasterMakeUpGain.setBounds (sliderRow.removeFromLeft (masterSliderWidth)); lbThreshold[numFilterBands].setBounds (labelRow.removeFromLeft (masterSliderWidth)); lbKnee[numFilterBands].setBounds (labelRow.removeFromLeft (masterSliderWidth)); lbMakeUpGain[numFilterBands].setBounds (labelRow.removeFromLeft (masterSliderWidth)); sliderRow = masterArea; sliderRow.reduce (sliderRow.proportionOfWidth (trimSliderWidth), sliderRow.proportionOfHeight (trimSliderHeight)); labelRow = sliderRow.removeFromBottom (sliderRow.proportionOfHeight (labelToSliderRatio)); slMasterRatio.setBounds (sliderRow.removeFromLeft (masterSliderWidth)); slMasterAttackTime.setBounds (sliderRow.removeFromLeft (masterSliderWidth)); slMasterReleaseTime.setBounds (sliderRow.removeFromLeft (masterSliderWidth)); lbRatio[numFilterBands].setBounds (labelRow.removeFromLeft (masterSliderWidth)); lbAttack[numFilterBands].setBounds (labelRow.removeFromLeft (masterSliderWidth)); lbRelease[numFilterBands].setBounds (labelRow.removeFromLeft (masterSliderWidth)); // ==== FILTERBANKVISUALIZER SETTINGS ==== const float trimHeight = 0.4f; const int trimFromLeft = 5; rightArea.removeFromLeft (trimFromLeft); rightArea.reduce (0, rightArea.proportionOfHeight (trimHeight)); juce::Rectangle totalMagnitudeButtonArea = rightArea.removeFromTop (rightArea.proportionOfHeight (0.5)); tbOverallMagnitude.setBounds (totalMagnitudeButtonArea); } void MultiBandCompressorAudioProcessorEditor::sliderValueChanged (juce::Slider* slider) { if (slider->getName().startsWith ("MakeUpGain")) { filterBankVisualizer.updateMakeUpGain ( slider->getName().getLastCharacters (1).getIntValue(), slider->getValue()); return; } } void MultiBandCompressorAudioProcessorEditor::buttonClicked (juce::Button* button) { if (button->getName().startsWith ("bypass")) { int i = button->getName().getLastCharacters (1).getIntValue(); filterBankVisualizer.setBypassed (i, button->getToggleState()); } else if (button->getName().startsWith ("solo")) { int i = button->getName().getLastCharacters (1).getIntValue(); filterBankVisualizer.setSolo (i, button->getToggleState()); } else // overall magnitude button { displayOverallMagnitude = button->getToggleState(); if (displayOverallMagnitude) filterBankVisualizer.activateOverallMagnitude(); else filterBankVisualizer.deactivateOverallMagnitude(); } } void MultiBandCompressorAudioProcessorEditor::timerCallback() { // === update titleBar widgets according to available input/output channel counts title.setMaxSize (processor.getMaxSize()); // ========================================== if (processor.repaintFilterVisualization.get()) { processor.repaintFilterVisualization = false; filterBankVisualizer.updateFreqBandResponses(); } omniInputMeter.setLevel (processor.inputPeak.get()); omniOutputMeter.setLevel (processor.outputPeak.get()); for (int i = 0; i < numFilterBands; ++i) { const auto gainReduction = processor.maxGR[i].get(); filterBankVisualizer.updateGainReduction (i, gainReduction); compressorVisualizers[i]->setMarkerLevels (processor.maxPeak[i].get(), gainReduction); if (processor.characteristicHasChanged[i].get()) { compressorVisualizers[i]->updateCharacteristic(); processor.characteristicHasChanged[i] = false; } GRmeter[i].setLevel (gainReduction); } if (displayOverallMagnitude) filterBankVisualizer.updateOverallMagnitude(); } ././@LongLink0000644000000000000000000000015500000000000011604 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/MultiBandCompressor/Source/PluginProcessor.hIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/MultiBandCompressor/Source/PluginPro0000664002537200253720000001461515257173642031674 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Markus Huber Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once #include "../../resources/AudioProcessorBase.h" #include "../JuceLibraryCode/JuceHeader.h" #include "../../resources/Compressor.h" #include "../../resources/FilterVisualizerHelper.h" #define ProcessorClass MultiBandCompressorAudioProcessor #define numFilterBands 4 using namespace juce::dsp; using ParameterLayout = juce::AudioProcessorValueTreeState::ParameterLayout; class MultiBandCompressorAudioProcessor : public AudioProcessorBase, IOTypes::Ambisonics<>> { public: constexpr static int numberOfInputChannels = 64; constexpr static int numberOfOutputChannels = 64; //============================================================================== MultiBandCompressorAudioProcessor(); ~MultiBandCompressorAudioProcessor(); //============================================================================== void prepareToPlay (double sampleRate, int samplesPerBlock) override; void releaseResources() override; #ifndef JucePlugin_PreferredChannelConfigurations bool isBusesLayoutSupported (const BusesLayout& layouts) const override; #endif void processBlock (juce::AudioSampleBuffer&, juce::MidiBuffer&) override; //============================================================================== juce::AudioProcessorEditor* createEditor() override; bool hasEditor() const override; //============================================================================== int getNumPrograms() override; int getCurrentProgram() override; void setCurrentProgram (int index) override; const juce::String getProgramName (int index) override; void changeProgramName (int index, const juce::String& newName) override; //============================================================================== void getStateInformation (juce::MemoryBlock& destData) override; void setStateInformation (const void* data, int sizeInBytes) override; //============================================================================== void parameterChanged (const juce::String& parameterID, float newValue) override; void updateBuffers() override; //======= Parameters =========================================================== std::vector> createParameterLayout(); #if JUCE_USE_SIMD using IIRfloat = SIMDRegister; static constexpr int IIRfloat_elements = SIMDRegister::size(); #else /* !JUCE_USE_SIMD */ using IIRfloat = float; static constexpr int IIRfloat_elements = 1; #endif enum FrequencyBands { Low, MidLow, MidHigh, High }; // Interface for gui double& getSampleRate() { return lastSampleRate; }; IIR::Coefficients::Ptr lowPassLRCoeffs[numFilterBands - 1]; IIR::Coefficients::Ptr highPassLRCoeffs[numFilterBands - 1]; juce::Atomic repaintFilterVisualization = false; juce::Atomic inputPeak = juce::Decibels::gainToDecibels (-INFINITY), outputPeak = juce::Decibels::gainToDecibels (-INFINITY); juce::Atomic maxGR[numFilterBands], maxPeak[numFilterBands]; juce::Atomic characteristicHasChanged[numFilterBands]; iem::Compressor* getCompressor (const int i) { return &compressors[i]; }; private: void calculateCoefficients (const int index); void copyCoeffsToProcessor(); inline void clear (juce::dsp::AudioBlock& ab); double lastSampleRate { 48000 }; const int maxNumFilters; // list of used audio parameters std::atomic* orderSetting; std::atomic* crossovers[numFilterBands - 1]; std::atomic* threshold[numFilterBands]; std::atomic* knee[numFilterBands]; std::atomic* makeUpGain[numFilterBands]; std::atomic* ratio[numFilterBands]; std::atomic* attack[numFilterBands]; std::atomic* release[numFilterBands]; std::atomic* bypass[numFilterBands]; juce::BigInteger soloArray; iem::Compressor compressors[numFilterBands]; // filter coefficients juce::dsp::IIR::Coefficients::Ptr iirLPCoefficients[numFilterBands - 1], iirHPCoefficients[numFilterBands - 1], iirAPCoefficients[numFilterBands - 1], iirTempLPCoefficients[numFilterBands - 1], iirTempHPCoefficients[numFilterBands - 1], iirTempAPCoefficients[numFilterBands - 1]; // filters (cascaded butterworth/linkwitz-riley filters + allpass) juce::OwnedArray> iirLP[numFilterBands - 1], iirHP[numFilterBands - 1], iirLP2[numFilterBands - 1], iirHP2[numFilterBands - 1], iirAP[numFilterBands - 1]; // data for interleaving audio juce::HeapBlock zeroData; std::vector> interleavedBlockData; juce::OwnedArray> interleavedData; juce::dsp::AudioBlock zero; juce::AudioBuffer tempBuffer; // filters for processing juce::OwnedArray> freqBands[numFilterBands]; std::vector> freqBandsBlocks[numFilterBands]; // Additional compressor parameters float* gainChannelPointer; juce::dsp::AudioBlock gains; juce::HeapBlock gainData; juce::Atomic userChangedFilterSettings = true; //============================================================================== JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MultiBandCompressorAudioProcessor) }; ././@LongLink0000644000000000000000000000015200000000000011601 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/MultiBandCompressor/Source/PluginEditor.hIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/MultiBandCompressor/Source/PluginEdi0000664002537200253720000001316415257173642031633 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Markus Huber Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once #include "../JuceLibraryCode/JuceHeader.h" #include "PluginProcessor.h" //Plugin Design Essentials #include "../../resources/customComponents/TitleBar.h" #include "../../resources/lookAndFeel/IEM_LaF.h" //Custom juce::Components #include "../../resources/customComponents/CompressorVisualizer.h" #include "../../resources/customComponents/FilterVisualizer.h" #include "../../resources/customComponents/LevelMeter.h" #include "../../resources/customComponents/ReverseSlider.h" #include "../../resources/customComponents/RoundButton.h" #include "../../resources/customComponents/SimpleLabel.h" #include "FilterBankVisualizer.h" #include "MasterControl.h" using SliderAttachment = ReverseSlider:: SliderAttachment; // all ReverseSliders will make use of the parameters' valueToText() function using ComboBoxAttachment = juce::AudioProcessorValueTreeState::ComboBoxAttachment; using ButtonAttachment = juce::AudioProcessorValueTreeState::ButtonAttachment; //============================================================================== /** */ class MultiBandCompressorAudioProcessorEditor : public juce::AudioProcessorEditor, private juce::Timer, public juce::Slider::Listener, public juce::Button::Listener { public: MultiBandCompressorAudioProcessorEditor (MultiBandCompressorAudioProcessor&, juce::AudioProcessorValueTreeState&); ~MultiBandCompressorAudioProcessorEditor(); //============================================================================== void paint (juce::Graphics&) override; void resized() override; void sliderValueChanged (juce::Slider* slider) override; void buttonClicked (juce::Button* bypassButton) override; void timerCallback() override; private: // ====================== begin essentials ================== // lookAndFeel class with the IEM plug-in suite design LaF globalLaF; // stored references to the AudioProcessor and juce::ValueTreeState holding all the parameters MultiBandCompressorAudioProcessor& processor; juce::AudioProcessorValueTreeState& valueTreeState; /* title and footer component title component can hold different widgets for in- and output: - NoIOWidget (if there's no need for an input or output widget) - AudioChannelsIOWidget - AmbisonicIOWidget - DirectivitiyIOWidget */ TitleBar, NoIOWidget> title; OSCFooter footer; // =============== end essentials ============ std::unique_ptr cbNormalizationAtachement; std::unique_ptr cbOrderAtachement; FilterBankVisualizer filterBankVisualizer; juce::TooltipWindow tooltips; // Filter Crossovers ReverseSlider slCrossover[numFilterBands - 1]; std::unique_ptr slCrossoverAttachment[numFilterBands - 1]; // Solo and Bypass juce::Buttons RoundButton tbSolo[numFilterBands]; RoundButton tbBypass[numFilterBands]; std::unique_ptr soloAttachment[numFilterBands], bypassAttachment[numFilterBands], overallMagnitudeDisplayAttachment; // Compressor Parameters ReverseSlider slKnee[numFilterBands], slThreshold[numFilterBands], slRatio[numFilterBands], slAttackTime[numFilterBands], slReleaseTime[numFilterBands], slMakeUpGain[numFilterBands]; std::unique_ptr slKneeAttachment[numFilterBands], slThresholdAttachment[numFilterBands], slRatioAttachment[numFilterBands], slAttackTimeAttachment[numFilterBands], slReleaseTimeAttachment[numFilterBands], slMakeUpGainAttachment[numFilterBands]; // Master parameters juce::GroupComponent gcMasterControls; MasterControl slMasterThreshold, slMasterMakeUpGain, slMasterKnee, slMasterRatio, slMasterAttackTime, slMasterReleaseTime; // Compressor Visualization juce::OwnedArray compressorVisualizers; // Meters LevelMeter GRmeter[numFilterBands], omniInputMeter, omniOutputMeter; // juce::Toggle juce::Buttons juce::ToggleButton tbOverallMagnitude; bool displayOverallMagnitude { false }; // juce::Labels SimpleLabel lbKnee[numFilterBands + 1], lbThreshold[numFilterBands + 1], lbMakeUpGain[numFilterBands + 1], lbRatio[numFilterBands + 1], lbAttack[numFilterBands + 1], lbRelease[numFilterBands + 1], lbInput, lbOutput; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MultiBandCompressorAudioProcessorEditor) }; ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/MultiBandCompressor/Source/MasterControl.hIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/MultiBandCompressor/Source/MasterCon0000664002537200253720000001315415257173642031645 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once #include "../../resources/customComponents/ReverseSlider.h" #include "../JuceLibraryCode/JuceHeader.h" //============================================================================== /** This is a simple wrapper for a juce::Slider that controls other components, e.g. other juce::Sliders, by forwarding mouse events. It's intended to hold pointers to the sliders it is controlling. */ class MasterControl : public juce::Component { public: MasterControl() {} ~MasterControl() {} void mouseEnter (const juce::MouseEvent& e) override { repaint(); } void mouseExit (const juce::MouseEvent& e) override { repaint(); } void mouseMove (const juce::MouseEvent& e) override { if (triangleUp.contains (e.position)) isOverTriangle = 1; else if (triangleDown.contains (e.position)) isOverTriangle = -1; else isOverTriangle = 0; } void mouseDrag (const juce::MouseEvent& e) override { isDragging = true; auto drag = e.getOffsetFromDragStart(); DBG (drag.getX() << " - " << drag.getY()); auto dist = drag.getX() - drag.getY(); if (dist > 0) dragDirection = 1; else if (dist < 0) dragDirection = -1; else dragDirection = 0; repaint(); for (int i = 0; i < elements.size(); ++i) { if (elements[i] != nullptr) elements[i]->mouseDrag (e); } } void mouseWheelMove (const juce::MouseEvent& e, const juce::MouseWheelDetails& wheel) override { isDragging = true; for (int i = 0; i < elements.size(); ++i) { if (elements[i] != nullptr) elements[i]->mouseWheelMove (e, wheel); } } void mouseDown (const juce::MouseEvent& e) override { for (int i = 0; i < elements.size(); ++i) { if (elements[i] == nullptr) continue; if (auto* slider = dynamic_cast (elements[i])) { if (isOverTriangle == 1) { slider->increment(); } else if (isOverTriangle == -1) { slider->decrement(); } } elements[i]->mouseDown (e); } } void mouseUp (const juce::MouseEvent& e) override { isDragging = false; dragDirection = 0; for (int i = 0; i < elements.size(); ++i) { if (elements[i] != nullptr) elements[i]->mouseUp (e); } } void addSlave (juce::Component& newComponentToControl) { elements.add (&newComponentToControl); } void paint (juce::Graphics& g) override { g.setColour (juce::Colours::white); auto thickness = (! isDragging && isMouseOver()) ? 1.0f : 0.5f; const bool isDragginUp = dragDirection == 1; const bool isDragginDown = dragDirection == -1; auto upThickness = isDragginUp ? 1.0f : thickness; auto downThickness = isDragginDown ? 1.0f : thickness; g.strokePath (triangleUp, juce::PathStrokeType (upThickness)); g.strokePath (triangleDown, juce::PathStrokeType (downThickness)); g.setColour (juce::Colours::steelblue.withMultipliedAlpha (isDragginUp ? 0.9f : 0.3f)); g.fillPath (triangleUp); g.setColour (juce::Colours::steelblue.withMultipliedAlpha (isDragginDown ? 0.9f : 0.3f)); g.fillPath (triangleDown); } void resized() override { auto bounds = getLocalBounds().toFloat(); auto centre = bounds.getCentre(); bounds.setHeight (25); bounds.setWidth (20); bounds.setCentre (centre); auto height = bounds.getHeight(); auto upperHalf = bounds.removeFromTop (height / 2); auto lowerHalf = bounds; upperHalf.removeFromBottom (2); triangleUp.clear(); triangleUp.addTriangle (upperHalf.getBottomLeft(), upperHalf.getBottomRight(), { upperHalf.getCentreX(), upperHalf.getY() }); lowerHalf.removeFromTop (2); triangleDown.clear(); triangleDown.addTriangle (lowerHalf.getTopLeft(), lowerHalf.getTopRight(), { lowerHalf.getCentreX(), lowerHalf.getBottom() }); } private: juce::Array elements; juce::Path triangleUp, triangleDown; bool isDragging = false; int dragDirection = 0; int isOverTriangle = 0; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MasterControl) }; IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/MultiBandCompressor/CMakeLists.txt0000664002537200253720000000375515257173642031335 0ustar zmoelnigzmoelnigset (PLUGIN_TARGET "") if (IEM_FORMATS) juce_add_plugin (MultiBandCompressor PLUGIN_MANUFACTURER_CODE IEMA PLUGIN_CODE MuCo ICON_BIG "../resources/Standalone/IEMPluginSuiteSmall.png" ICON_SMALL "../resources/Standalone/IEMPluginSuiteSmall.png" COMPANY_NAME "IEM" PRODUCT_NAME "MultiBandCompressor" FORMATS ${IEM_FORMATS} VERSION ${MultibandCompressor_VERSION} LV2URI "http://plugins.iem.at/MultiBandCompressor" VST2_CATEGORY kPlugSurroundFx kPlugCategSpacializer kPlugCategEffect VST3_CATEGORIES Spatial Surround Dynamics EQ Filter Fx AAX_CATEGORY SoundField Dynamics) list (APPEND PLUGIN_TARGET MultiBandCompressor) endif() foreach (TARGET IN LISTS PLUGIN_TARGET) juce_generate_juce_header (${TARGET}) target_sources (${TARGET} PRIVATE Source/PluginEditor.cpp Source/PluginEditor.h Source/PluginProcessor.cpp Source/PluginProcessor.h ../resources/OSC/OSCInputStream.h ../resources/OSC/OSCParameterInterface.cpp ../resources/OSC/OSCParameterInterface.h ../resources/OSC/OSCStatus.cpp ../resources/OSC/OSCStatus.h ../resources/OSC/OSCUtilities.h ../resources/efficientSHvanilla.cpp ) target_compile_definitions (${TARGET} PRIVATE JUCE_USE_CURL=0 JUCE_WEB_BROWSER=0 JUCE_USE_CUSTOM_PLUGIN_STANDALONE_APP=1 JUCE_USE_FLAC=0 JUCE_USE_OGGVORBIS=0 JUCE_USE_MP3AUDIOFORMAT=0 JUCE_USE_LAME_AUDIO_FORMAT=0 JUCE_USE_WINDOWS_MEDIA_FORMAT=0 JUCE_VST3_CAN_REPLACE_VST2=0) target_include_directories (${TARGET} PRIVATE Source) target_link_libraries (${TARGET} PRIVATE LAF_fonts IEM_logo juce::juce_audio_utils juce::juce_audio_plugin_client juce::juce_osc juce::juce_dsp juce::juce_opengl juce::juce_recommended_config_flags juce::juce_recommended_lto_flags) endforeach()IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/DirectivityShaper/0000775002537200253720000000000015257173642026271 5ustar zmoelnigzmoelnigIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/DirectivityShaper/Source/0000775002537200253720000000000015257173642027531 5ustar zmoelnigzmoelnig././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/DirectivityShaper/Source/DirectivityVisualizer.hIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/DirectivityShaper/Source/Directivity0000664002537200253720000002471315257173642031762 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once #include //============================================================================== /* */ class DirectivityVisualizer : public juce::Component { struct WeightsAndColour { float* weights; juce::Colour colour; }; const float deg2rad = juce::MathConstants::pi / 180.0f; const int degStep = 1; const int nLookUpSamples = 361; const int maxdB = 90; const float power = 3.0f; const int dBstep = 10; //#define scale 4 const float scale = std::sqrt (4 * juce::MathConstants::pi) * decodeCorrection (7); public: DirectivityVisualizer() { // 0th lookUpTables.add (new juce::dsp::LookupTableTransform ( [this] (float phi) { return scale * (0.25f / (float) juce::MathConstants::pi); }, -juce::MathConstants::pi, juce::MathConstants::pi, nLookUpSamples)); // 1st lookUpTables.add (new juce::dsp::LookupTableTransform ( [this] (float phi) { return scale * (0.75f / juce::MathConstants::pi) * std::cos (phi); }, -juce::MathConstants::pi, juce::MathConstants::pi, nLookUpSamples)); // 2nd lookUpTables.add (new juce::dsp::LookupTableTransform ( [this] (float phi) { return scale * 2.0f * (5.0f / 16.0f / juce::MathConstants::pi) * (3 * std::cos (phi) * std::cos (phi) - 1.0f); }, -juce::MathConstants::pi, juce::MathConstants::pi, nLookUpSamples)); // 3rd lookUpTables.add (new juce::dsp::LookupTableTransform ( [this] (float phi) { return scale * (7.0f / juce::MathConstants::pi) / 8.0f * (5 * pow (std::cos (phi), 3) - 3.0f * std::cos (phi)); }, -juce::MathConstants::pi, juce::MathConstants::pi, nLookUpSamples)); // 4th lookUpTables.add (new juce::dsp::LookupTableTransform ( [this] (float phi) { return scale * 9.0f / 32.0f / juce::MathConstants::pi * (35 * pow (std::cos (phi), 4) - 30 * pow (std::cos (phi), 2) + 3.0f); }, -juce::MathConstants::pi, juce::MathConstants::pi, nLookUpSamples)); // 5th lookUpTables.add (new juce::dsp::LookupTableTransform ( [this] (float phi) { return scale * 8.0f / 256.0f * 11.0f / juce::MathConstants::pi * (63 * pow (std::cos (phi), 5) - 70 * pow (std::cos (phi), 3) + 15.0f * std::cos (phi)); }, -juce::MathConstants::pi, juce::MathConstants::pi, nLookUpSamples)); // 6th lookUpTables.add (new juce::dsp::LookupTableTransform ( [this] (float phi) { return scale * 16.0f / 1024.0f * 13.0f / juce::MathConstants::pi * (231 * pow (std::cos (phi), 6) - 315 * pow (std::cos (phi), 4) + 105 * pow (std::cos (phi), 2) - 5.0f); }, -juce::MathConstants::pi, juce::MathConstants::pi, nLookUpSamples)); // 7th lookUpTables.add (new juce::dsp::LookupTableTransform ( [this] (float phi) { return scale * 16.0f / 1024.0f * 15.0f / juce::MathConstants::pi * (429 * pow (std::cos (phi), 7) - 693 * pow (std::cos (phi), 5) + 315 * pow (std::cos (phi), 3) - 35 * std::cos (phi)); }, -juce::MathConstants::pi, juce::MathConstants::pi, nLookUpSamples)); for (int phi = -180; phi <= 180; phi += degStep) { pointsOnCircle.add (juce::Point (cos (deg2rad * phi), sin (deg2rad * phi))); } juce::Path circle; circle.addEllipse (-1.0f, -1.0f, 2.0f, 2.0f); juce::Path line; line.startNewSubPath (0.0f, -1.0f); line.lineTo (0.0f, 1.0f); grid.clear(); for (int dB = 0; dB < maxdB; dB += dBstep) grid.addPath (circle, juce::AffineTransform().scaled (dBToRadius (-dB))); subGrid.clear(); for (int dB = dBstep / 2; dB < maxdB; dB += dBstep) subGrid.addPath (circle, juce::AffineTransform().scaled (dBToRadius (-dB))); subGrid.addPath (line); subGrid.addPath (line, juce::AffineTransform().rotation (0.25f * juce::MathConstants::pi)); subGrid.addPath (line, juce::AffineTransform().rotation (0.5f * juce::MathConstants::pi)); subGrid.addPath (line, juce::AffineTransform().rotation (0.75f * juce::MathConstants::pi)); } ~DirectivityVisualizer() {} float dBToRadius (float dB) { if (dB > 0.0f) dB = 0.0f; //float radius = 1.0f - pow(abs(dB) / maxdB, power); float radius = (exp (power * dB / maxdB) - exp (-power)) / (1.0f - exp (-power)); if (radius < 0.0f) radius = 0.0f; return radius; } void paint (juce::Graphics& g) override { juce::Rectangle bounds = getLocalBounds(); const int scale = plotArea.getWidth() / 2; //const int height = bounds.getHeight(); int centreX = bounds.getCentreX(); int centreY = bounds.getCentreY(); juce::Path path; path = grid; path.applyTransform (transform); g.setColour (juce::Colours::skyblue.withMultipliedAlpha (0.1f)); g.fillPath (path); g.setColour (juce::Colours::white); g.strokePath (path, juce::PathStrokeType (1.0f)); path = subGrid; path.applyTransform (transform); g.setColour (juce::Colours::skyblue.withMultipliedAlpha (0.3f)); g.strokePath (path, juce::PathStrokeType (0.5f)); g.setColour (juce::Colours::white); auto currentFont = juce::FontOptions (getLookAndFeel().getTypefaceForFont (juce::FontOptions (12.0f, 2))) .withHeight (12.0f); g.setFont (currentFont); g.drawText ("0 dB", centreX - 10, centreY + scale * dBToRadius (0.0f) - 12, 20, 12, juce::Justification::centred); g.drawText ("-10", centreX - 10, centreY + scale * dBToRadius (-10.0f), 20, 12, juce::Justification::centred); g.drawText ("-20", centreX - 10, centreY + scale * dBToRadius (-20.0f), 20, 12, juce::Justification::centred); int size = elements.size(); for (int i = 0; i < size; ++i) { WeightsAndColour& handle (elements.getReference (i)); g.setColour (handle.colour); path.clear(); int idx = 0; for (int phi = -180; phi <= 180; phi += degStep) { float gain = 0.0f; float phiInRad = (float) phi * deg2rad; for (int o = 0; o < 8; ++o) { gain += handle.weights[o] * lookUpTables[o]->processSample (phiInRad); } juce::Point point = dBToRadius (juce::Decibels::gainToDecibels (std::abs (gain), -1.0f * maxdB)) * pointsOnCircle[idx]; if (phi == -180) path.startNewSubPath (point); else path.lineTo (point); ++idx; } path.closeSubPath(); path.applyTransform (transform); g.strokePath (path, juce::PathStrokeType (2.0f)); } } void resized() override { juce::Rectangle bounds = getLocalBounds(); juce::Point centre = bounds.getCentre(); bounds.reduce (10, 10); if (bounds.getWidth() > bounds.getHeight()) bounds.setWidth (bounds.getHeight()); else bounds.setHeight (bounds.getWidth()); bounds.setCentre (centre); transform = juce::AffineTransform::fromTargetPoints ((float) centre.x, (float) centre.y, (float) centre.x, bounds.getY(), bounds.getX(), centre.y); plotArea = bounds; } void addElement (float* weights, juce::Colour colour) { elements.add ({ weights, colour }); } private: juce::OwnedArray> lookUpTables; juce::Path grid; juce::Path subGrid; juce::AffineTransform transform; juce::Rectangle plotArea; int maxOrder; juce::Array elements; juce::Array> pointsOnCircle; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DirectivityVisualizer) }; ././@LongLink0000644000000000000000000000015500000000000011604 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/DirectivityShaper/Source/PluginProcessor.cppIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/DirectivityShaper/Source/PluginProce0000664002537200253720000006042615257173642031713 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #include "PluginProcessor.h" #include "PluginEditor.h" static constexpr float filterTypePresets[] = { 1.0f, 2.0f, 2.0f, 3.0f }; static constexpr float filterFrequencyPresets[] = { 200.0f, 300.0f, 1600.0f, 2200.0f }; //============================================================================== DirectivityShaperAudioProcessor::DirectivityShaperAudioProcessor() : AudioProcessorBase ( #ifndef JucePlugin_PreferredChannelConfigurations BusesProperties() #if ! JucePlugin_IsMidiEffect #if ! JucePlugin_IsSynth .withInput ("Input", juce::AudioChannelSet::mono(), true) #endif .withOutput ("Output", ((juce::PluginHostType::getPluginLoadedAs() == juce::AudioProcessor::wrapperType_VST3) ? juce::AudioChannelSet::ambisonic (1) : juce::AudioChannelSet::ambisonic (7)), true) #endif , #endif createParameterLayout()) { orderSetting = parameters.getRawParameterValue ("orderSetting"); useSN3D = parameters.getRawParameterValue ("useSN3D"); probeAzimuth = parameters.getRawParameterValue ("probeAzimuth"); probeElevation = parameters.getRawParameterValue ("probeElevation"); probeRoll = parameters.getRawParameterValue ("probeRoll"); probeLock = parameters.getRawParameterValue ("probeLock"); normalization = parameters.getRawParameterValue ("normalization"); parameters.addParameterListener ("orderSetting", this); parameters.addParameterListener ("probeLock", this); parameters.addParameterListener ("probeAzimuth", this); parameters.addParameterListener ("probeElevation", this); parameters.addParameterListener ("probeRoll", this); for (int i = 0; i < numberOfBands; ++i) { filterType[i] = parameters.getRawParameterValue ("filterType" + juce::String (i)); filterFrequency[i] = parameters.getRawParameterValue ("filterFrequency" + juce::String (i)); filterQ[i] = parameters.getRawParameterValue ("filterQ" + juce::String (i)); filterGain[i] = parameters.getRawParameterValue ("filterGain" + juce::String (i)); order[i] = parameters.getRawParameterValue ("order" + juce::String (i)); shape[i] = parameters.getRawParameterValue ("shape" + juce::String (i)); azimuth[i] = parameters.getRawParameterValue ("azimuth" + juce::String (i)); elevation[i] = parameters.getRawParameterValue ("elevation" + juce::String (i)); parameters.addParameterListener ("filterType" + juce::String (i), this); parameters.addParameterListener ("filterFrequency" + juce::String (i), this); parameters.addParameterListener ("filterQ" + juce::String (i), this); parameters.addParameterListener ("filterGain" + juce::String (i), this); parameters.addParameterListener ("azimuth" + juce::String (i), this); parameters.addParameterListener ("elevation" + juce::String (i), this); parameters.addParameterListener ("order" + juce::String (i), this); parameters.addParameterListener ("shape" + juce::String (i), this); parameters.addParameterListener ("normalization", this); probeGains[i] = 0.0f; } juce::FloatVectorOperations::clear (shOld[0], 64 * numberOfBands); juce::FloatVectorOperations::clear (weights[0], 8 * numberOfBands); for (int i = 0; i < numberOfBands; ++i) { filter[i].coefficients = createFilterCoefficients (juce::roundToInt (filterType[i]->load()), 44100, filterFrequency[i]->load(), filterQ[i]->load()); } } inline juce::dsp::IIR::Coefficients::Ptr DirectivityShaperAudioProcessor::createFilterCoefficients (int type, double sampleRate, double frequency, double Q) { frequency = juce::jmin (0.5 * sampleRate, frequency); switch (type) { case 1: return IIR::Coefficients::makeLowPass (sampleRate, frequency, Q); break; case 2: return IIR::Coefficients::makeBandPass (sampleRate, frequency, Q); break; case 3: return IIR::Coefficients::makeHighPass (sampleRate, frequency, Q); break; default: return IIR::Coefficients::makeAllPass (sampleRate, frequency, Q); break; } } DirectivityShaperAudioProcessor::~DirectivityShaperAudioProcessor() { } //============================================================================== int DirectivityShaperAudioProcessor::getNumPrograms() { return 1; // NB: some hosts don't cope very well if you tell them there are 0 programs, // so this should be at least 1, even if you're not really implementing programs. } int DirectivityShaperAudioProcessor::getCurrentProgram() { return 0; } void DirectivityShaperAudioProcessor::setCurrentProgram (int index) { } const juce::String DirectivityShaperAudioProcessor::getProgramName (int index) { return {}; } void DirectivityShaperAudioProcessor::changeProgramName (int index, const juce::String& newName) { } //============================================================================== void DirectivityShaperAudioProcessor::prepareToPlay (double sampleRate, int samplesPerBlock) { checkInputAndOutput (this, 1, *orderSetting, true); for (int i = 0; i < numberOfBands; ++i) { *filter[i].coefficients = *createFilterCoefficients (juce::roundToInt (filterType[i]->load()), sampleRate, filterFrequency[i]->load(), filterQ[i]->load()); filter[i].reset(); } repaintFV = true; filteredBuffer.setSize (numberOfBands, samplesPerBlock); } void DirectivityShaperAudioProcessor::releaseResources() { // When playback stops, you can use this as an opportunity to free up any // spare memory, etc. } void DirectivityShaperAudioProcessor::processBlock (juce::AudioSampleBuffer& buffer, juce::MidiBuffer& midiMessages) { checkInputAndOutput (this, 1, *orderSetting); juce::ScopedNoDenormals noDenormals; const bool applySN3D = *useSN3D > 0.5f; int nChToWorkWith = juce::jmin (buffer.getNumChannels(), output.getNumberOfChannels()); const int orderToWorkWith = isqrt (nChToWorkWith) - 1; nChToWorkWith = squares[orderToWorkWith + 1]; const int numSamples = buffer.getNumSamples(); juce::dsp::AudioBlock inBlock = juce::dsp::AudioBlock (buffer.getArrayOfWritePointers(), 1, numSamples); for (int i = 0; i < numberOfBands; ++i) { //filteredBuffer.copyFrom(i, 0, buffer, 0, 0, numSamples); juce::dsp::AudioBlock outBlock = juce::dsp::AudioBlock (filteredBuffer.getArrayOfWritePointers() + i, 1, numSamples); filter[i].process (juce::dsp::ProcessContextNonReplacing (inBlock, outBlock)); } buffer.clear(); float sh[64]; float probeSH[64]; { juce::Vector3D pos = Conversions::sphericalToCartesian ( juce::degreesToRadians (probeAzimuth->load()), juce::degreesToRadians (probeElevation->load())); SHEval (orderToWorkWith, pos.x, pos.y, pos.z, probeSH, false); // decoding -> false if (applySN3D) { // reverting SN3D in probeSH juce::FloatVectorOperations::multiply (probeSH, sn3d2n3d, nChToWorkWith); } } WeightsHelper::Normalization norm; if (*normalization < 0.5f) norm = WeightsHelper::Normalization::BasicDecode; else if (*normalization >= 0.5f && *normalization < 1.5f) norm = WeightsHelper::Normalization::OnAxis; else norm = WeightsHelper::Normalization::ConstantEnergy; for (int b = 0; b < numberOfBands; ++b) { float tempWeights[8]; const int nWeights = WeightsHelper::getWeights (*order[b], *shape[b], tempWeights); // fill higher orders with zeros for (int i = nWeights; i < 8; ++i) tempWeights[i] = 0.0f; // ==== COPY WEIGHTS FOR GUI VISUALIZATION ==== // copy non-normalized weights for GUI juce::FloatVectorOperations::copy (weights[b], tempWeights, 8); // normalize weights for GUI (7th order decode) WeightsHelper::applyNormalization (weights[b], *order[b], 7, norm); // ============================================ // normalize weights for audio WeightsHelper::applyNormalization (tempWeights, *order[b], orderToWorkWith, norm, applySN3D); juce::Vector3D pos = Conversions::sphericalToCartesian ( juce::degreesToRadians (azimuth[b]->load()), juce::degreesToRadians (elevation[b]->load())); SHEval (orderToWorkWith, pos.x, pos.y, pos.z, sh, true); // encoding -> true float temp = 0.0f; float shTemp[64]; juce::FloatVectorOperations::multiply ( shTemp, sh, juce::Decibels::decibelsToGain (filterGain[b]->load()), 64); for (int i = 0; i < nChToWorkWith; ++i) { shTemp[i] *= tempWeights[isqrt (i)]; temp += shTemp[i] * probeSH[i]; buffer.addFromWithRamp (i, 0, filteredBuffer.getReadPointer (b), numSamples, shOld[b][i], shTemp[i]); } probeGains[b] = std::abs (temp); if (probeChanged) { probeChanged = false; repaintFV = true; repaintSphere = true; } juce::FloatVectorOperations::copy (shOld[b], shTemp, 64); } if (changeWeights) { changeWeights = false; repaintDV = true; repaintXY = true; repaintFV = true; } } //============================================================================== bool DirectivityShaperAudioProcessor::hasEditor() const { return true; // (change this to false if you choose to not supply an editor) } juce::AudioProcessorEditor* DirectivityShaperAudioProcessor::createEditor() { return new DirectivityShaperAudioProcessorEditor (*this, parameters); } //============================================================================== void DirectivityShaperAudioProcessor::getStateInformation (juce::MemoryBlock& destData) { auto state = parameters.copyState(); auto oscConfig = state.getOrCreateChildWithName ("OSCConfig", nullptr); oscConfig.copyPropertiesFrom (oscParameterInterface.getConfig(), nullptr); std::unique_ptr xml (state.createXml()); copyXmlToBinary (*xml, destData); } void DirectivityShaperAudioProcessor::setStateInformation (const void* data, int sizeInBytes) { std::unique_ptr xmlState (getXmlFromBinary (data, sizeInBytes)); if (xmlState.get() != nullptr) if (xmlState->hasTagName (parameters.state.getType())) { parameters.replaceState (juce::ValueTree::fromXml (*xmlState)); if (parameters.state.hasProperty ("OSCPort")) // legacy { oscParameterInterface.getOSCReceiver().connect ( parameters.state.getProperty ("OSCPort", juce::var (-1))); parameters.state.removeProperty ("OSCPort", nullptr); } auto oscConfig = parameters.state.getChildWithName ("OSCConfig"); if (oscConfig.isValid()) oscParameterInterface.setConfig (oscConfig); } } //============================================================================== void DirectivityShaperAudioProcessor::parameterChanged (const juce::String& parameterID, float newValue) { if (parameterID == "orderSetting") { userChangedIOSettings = true; changeWeights = true; } else if (parameterID == "probeLock") { if (newValue >= 0.5f && ! toggled) { DBG ("toggled"); float ypr[3]; ypr[2] = 0.0f; for (int i = 0; i < numberOfBands; ++i) { iem::Quaternion probeQuat; float probeypr[3]; probeypr[0] = juce::degreesToRadians (probeAzimuth->load()); probeypr[1] = juce::degreesToRadians (probeElevation->load()); probeypr[2] = -juce::degreesToRadians (probeRoll->load()); probeQuat.fromYPR (probeypr); probeQuat.conjugate(); ypr[0] = juce::degreesToRadians (azimuth[i]->load()); ypr[1] = juce::degreesToRadians (elevation[i]->load()); quats[i].fromYPR (ypr); quats[i] = probeQuat * quats[i]; } toggled = true; } else if (newValue < 0.5f) toggled = false; } else if ((parameterID == "probeAzimuth") || (parameterID == "probeElevation") || (parameterID == "probeRoll")) { if (toggled) { DBG ("moving"); moving = true; iem::Quaternion probeQuat; float ypr[3]; ypr[0] = juce::degreesToRadians (probeAzimuth->load()); ypr[1] = juce::degreesToRadians (probeElevation->load()); ypr[2] = -juce::degreesToRadians (probeRoll->load()); probeQuat.fromYPR (ypr); for (int i = 0; i < numberOfBands; ++i) { iem::Quaternion temp = probeQuat * quats[i]; temp.toYPR (ypr); parameters.getParameter ("azimuth" + juce::String (i)) ->setValueNotifyingHost ( parameters.getParameterRange ("azimuth" + juce::String (i)) .convertTo0to1 (juce::radiansToDegrees (ypr[0]))); parameters.getParameter ("elevation" + juce::String (i)) ->setValueNotifyingHost ( parameters.getParameterRange ("elevation" + juce::String (i)) .convertTo0to1 (juce::radiansToDegrees (ypr[1]))); } moving = false; repaintSphere = true; } else probeChanged = true; } else if (parameterID.startsWith ("azimuth") || parameterID.startsWith ("elevation")) { if (toggled && ! moving) { float ypr[3]; ypr[2] = 0.0f; for (int i = 0; i < numberOfBands; ++i) { iem::Quaternion probeQuat; float probeypr[3]; probeypr[0] = juce::degreesToRadians (probeAzimuth->load()); probeypr[1] = juce::degreesToRadians (probeElevation->load()); probeypr[2] = -juce::degreesToRadians (probeRoll->load()); probeQuat.fromYPR (probeypr); probeQuat.conjugate(); ypr[0] = juce::degreesToRadians (azimuth[i]->load()); ypr[1] = juce::degreesToRadians (elevation[i]->load()); quats[i].fromYPR (ypr); quats[i] = probeQuat * quats[i]; } } repaintSphere = true; probeChanged = true; } else if (parameterID.startsWith ("filter")) { int i = parameterID.getLastCharacters (1).getIntValue(); *filter[i].coefficients = *createFilterCoefficients (juce::roundToInt (filterType[i]->load()), getSampleRate(), *filterFrequency[i], *filterQ[i]); repaintFV = true; } else if (parameterID.startsWith ("order") || parameterID.startsWith ("shape")) { changeWeights = true; } else if (parameterID == "normalization") changeWeights = true; } //============================================================================== std::vector> DirectivityShaperAudioProcessor::createParameterLayout() { // add your audio parameters here std::vector> params; params.push_back (OSCParameterInterface::createParameterTheOldWay ( "orderSetting", "Directivity Order", "", juce::NormalisableRange (0.0f, 8.0f, 1.0f), 0.0f, [] (float value) { if (value >= 0.5f && value < 1.5f) return "0th"; else if (value >= 1.5f && value < 2.5f) return "1st"; else if (value >= 2.5f && value < 3.5f) return "2nd"; else if (value >= 3.5f && value < 4.5f) return "3rd"; else if (value >= 4.5f && value < 5.5f) return "4th"; else if (value >= 5.5f && value < 6.5f) return "5th"; else if (value >= 6.5f && value < 7.5f) return "6th"; else if (value >= 7.5f) return "7th"; else return "Auto"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "useSN3D", "Directivity Normalization", "", juce::NormalisableRange (0.0f, 1.0f, 1.0f), 1.0f, [] (float value) { if (value >= 0.5f) return "SN3D"; else return "N3D"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "probeAzimuth", "probe Azimuth", juce::CharPointer_UTF8 (R"(°)"), juce::NormalisableRange (-180.0f, 180.0f, 0.01f), 0.0, [] (float value) { return juce::String (value, 2); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "probeElevation", "probe Elevation", juce::CharPointer_UTF8 (R"(°)"), juce::NormalisableRange (-180.0f, 180.0f, 0.01f), 0.0, [] (float value) { return juce::String (value, 2); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "probeRoll", "probe Roll", juce::CharPointer_UTF8 (R"(°)"), juce::NormalisableRange (-180.0f, 180.0f, 0.01f), 0.0, [] (float value) { return juce::String (value, 2); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "probeLock", "Lock Directions", "", juce::NormalisableRange (0.0f, 1.0f, 1.0f), 0.0, [] (float value) { return (value >= 0.5f) ? "locked" : "not locked"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "normalization", "Beam Normalization", "", juce::NormalisableRange (0.0f, 2.0f, 1.0f), 1.0, [] (float value) { if (value >= 0.5f && value < 1.5f) return "on axis"; else if (value >= 1.5f && value < 2.5f) return "constant energy"; else return "basic decode"; }, nullptr)); for (int i = 0; i < numberOfBands; ++i) { params.push_back (OSCParameterInterface::createParameterTheOldWay ( "filterType" + juce::String (i), "Filter Type " + juce::String (i + 1), "", juce::NormalisableRange (0.0f, 3.0f, 1.0f), filterTypePresets[i], [] (float value) { if (value >= 0.5f && value < 1.5f) return "Low-pass"; else if (value >= 1.5f && value < 2.5f) return "Band-pass"; else if (value >= 2.5f) return "High-pass"; else return "All-pass"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "filterFrequency" + juce::String (i), "Filter Frequency " + juce::String (i + 1), "Hz", juce::NormalisableRange (20.0f, 20000.0f, 1.0f, 0.4f), filterFrequencyPresets[i], [] (float value) { return juce::String ((int) value); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "filterQ" + juce::String (i), "Filter Q " + juce::String (i + 1), "", juce::NormalisableRange (0.05f, 10.0f, 0.05f), 0.5f, [] (float value) { return juce::String (value, 2); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "filterGain" + juce::String (i), "Filter Gain " + juce::String (i + 1), "dB", juce::NormalisableRange (-60.0f, 10.0f, 0.1f), 0.0f, [] (float value) { return (value >= -59.9f) ? juce::String (value, 1) : "-inf"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "order" + juce::String (i), "Order Band " + juce::String (i + 1), "", juce::NormalisableRange (0.0f, 7.0f, 0.01f), 0.0, [] (float value) { return juce::String (value, 2); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "shape" + juce::String (i), "Shape Band " + juce::String (i + 1), "", juce::NormalisableRange (0.0f, 1.0f, 0.01f), 0.0, [] (float value) { return juce::String (value, 2); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "azimuth" + juce::String (i), "Azimuth Band " + juce::String (i + 1), juce::CharPointer_UTF8 (R"(°)"), juce::NormalisableRange (-180.0f, 180.0f, 0.01f), 0.0, [] (float value) { return juce::String (value, 2); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "elevation" + juce::String (i), "Elevation Band " + juce::String (i + 1), juce::CharPointer_UTF8 (R"(°)"), juce::NormalisableRange (-180.0f, 180.0f, 0.01f), 0.0, [] (float value) { return juce::String (value, 2); }, nullptr)); } return params; } //============================================================================== // This creates new instances of the plugin.. juce::AudioProcessor* JUCE_CALLTYPE createPluginFilter() { return new DirectivityShaperAudioProcessor(); } ././@LongLink0000644000000000000000000000015200000000000011601 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/DirectivityShaper/Source/PluginEditor.cppIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/DirectivityShaper/Source/PluginEdito0000664002537200253720000004606615257173642031713 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #include "PluginEditor.h" #include "PluginProcessor.h" //============================================================================== DirectivityShaperAudioProcessorEditor::DirectivityShaperAudioProcessorEditor ( DirectivityShaperAudioProcessor& p, juce::AudioProcessorValueTreeState& vts) : juce::AudioProcessorEditor (&p), processor (p), valueTreeState (vts), footer (p.getOSCParameterInterface()), probeElement (*valueTreeState.getParameter ("probeAzimuth"), valueTreeState.getParameterRange ("probeAzimuth"), *valueTreeState.getParameter ("probeElevation"), valueTreeState.getParameterRange ("probeElevation")), fv (20.0f, 20000.0f, -50.0f, 10.0f, 10.0f) { setSize (900, 710); setLookAndFeel (&globalLaF); // start from the processor's current weights, as a previous editor might have // already consumed the repaint flags for (int b = 0; b < numberOfBands; ++b) for (int i = 0; i < 8; ++i) weights[b][i] = processor.weights[b][i]; addAndMakeVisible (&title); title.setTitle ("Directivity", "Shaper"); title.setFont (globalLaF.robotoBold, globalLaF.robotoLight); addAndMakeVisible (&footer); juce::Colour colours[4] = { juce::Colours::cadetblue, juce::Colours::mediumpurple, juce::Colours::greenyellow, juce::Colours::orangered, }; addAndMakeVisible (&cbDirectivityNormalization); cbDirectivityNormalization.addItem ("basic decode", 1); cbDirectivityNormalization.addItem ("on-axis", 2); cbDirectivityNormalization.addItem ("constant energy", 3); cbDirectivityNormalizationAttachment.reset ( new ComboBoxAttachment (valueTreeState, "normalization", cbDirectivityNormalization)); addAndMakeVisible (&fv); fv.setSampleRate (processor.getSampleRate()); for (int i = 0; i < numberOfBands; ++i) fv.addCoefficients (processor.filter[i].coefficients, colours[i], &slFilterFrequency[i], &slFilterGain[i], &slFilterQ[i], &processor.probeGains[i]); fv.setParallel (true); addAndMakeVisible (&xyPad); for (int i = 0; i < numberOfBands; ++i) xyPad.addElement (slShape[i], slOrder[i], colours[i]); addAndMakeVisible (&dv); for (int i = 0; i < numberOfBands; ++i) dv.addElement (weights[i], colours[i]); cbOrderSettingAttachment.reset ( new ComboBoxAttachment (valueTreeState, "orderSetting", *title.getOutputWidgetPtr()->getOrderCbPointer())); cbNormalizationAttachment.reset ( new ComboBoxAttachment (valueTreeState, "useSN3D", *title.getOutputWidgetPtr()->getNormCbPointer())); addAndMakeVisible (&slProbeAzimuth); slProbeAzimuth.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); slProbeAzimuth.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); slProbeAzimuth.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[0]); slProbeAzimuth.setReverse (true); slProbeAzimuth.setRotaryParameters (juce::MathConstants::pi, 3 * juce::MathConstants::pi, false); slProbeAzimuthAttachment.reset ( new SliderAttachment (valueTreeState, "probeAzimuth", slProbeAzimuth)); addAndMakeVisible (&slProbeElevation); slProbeElevation.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); slProbeElevation.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); slProbeElevation.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[1]); slProbeElevation.setRotaryParameters (0.5 * juce::MathConstants::pi, 2.5 * juce::MathConstants::pi, false); slProbeElevationAttachment.reset ( new SliderAttachment (valueTreeState, "probeElevation", slProbeElevation)); addAndMakeVisible (&slProbeRoll); slProbeRoll.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); slProbeRoll.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); slProbeRoll.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[2]); slProbeRoll.setRotaryParameters (juce::MathConstants::pi, 3 * juce::MathConstants::pi, false); slProbeRollAttachment.reset (new SliderAttachment (valueTreeState, "probeRoll", slProbeRoll)); addAndMakeVisible (&tbProbeLock); tbProbeLock.setButtonText ("Lock Directions"); tbProbeLockAttachment.reset (new ButtonAttachment (valueTreeState, "probeLock", tbProbeLock)); for (int i = 0; i < numberOfBands; ++i) { addAndMakeVisible (&cbFilterType[i]); cbFilterType[i].addItem ("All-pass", 1); cbFilterType[i].addItem ("Low-pass", 2); cbFilterType[i].addItem ("Band-pass", 3); cbFilterType[i].addItem ("High-pass", 4); cbFilterType[i].setJustificationType (juce::Justification::centred); cbFilterTypeAttachment[i].reset (new ComboBoxAttachment (valueTreeState, "filterType" + juce::String (i), cbFilterType[i])); addAndMakeVisible (&slFilterFrequency[i]); slFilterFrequency[i].setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); slFilterFrequency[i].setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); slFilterFrequency[i].setColour (juce::Slider::rotarySliderOutlineColourId, colours[i]); slFilterFrequencyAttachment[i].reset ( new SliderAttachment (valueTreeState, "filterFrequency" + juce::String (i), slFilterFrequency[i])); addAndMakeVisible (&slFilterQ[i]); slFilterQ[i].setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); slFilterQ[i].setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); slFilterQ[i].setColour (juce::Slider::rotarySliderOutlineColourId, colours[i]); slFilterQAttachment[i].reset ( new SliderAttachment (valueTreeState, "filterQ" + juce::String (i), slFilterQ[i])); addAndMakeVisible (&slFilterGain[i]); slFilterGain[i].setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); slFilterGain[i].setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); slFilterGain[i].setColour (juce::Slider::rotarySliderOutlineColourId, colours[i]); slFilterGainAttachment[i].reset (new SliderAttachment (valueTreeState, "filterGain" + juce::String (i), slFilterGain[i])); addAndMakeVisible (&slOrder[i]); slOrder[i].setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); slOrder[i].setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); slOrder[i].setColour (juce::Slider::rotarySliderOutlineColourId, colours[i]); slOrderAttachment[i].reset ( new SliderAttachment (valueTreeState, "order" + juce::String (i), slOrder[i])); addAndMakeVisible (&slShape[i]); slShape[i].setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); slShape[i].setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); slShape[i].setColour (juce::Slider::rotarySliderOutlineColourId, colours[i]); slShapeAttachment[i].reset ( new SliderAttachment (valueTreeState, "shape" + juce::String (i), slShape[i])); addAndMakeVisible (&slAzimuth[i]); slAzimuth[i].setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); slAzimuth[i].setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); slAzimuth[i].setColour (juce::Slider::rotarySliderOutlineColourId, colours[i]); slAzimuth[i].setReverse (true); slAzimuth[i].setRotaryParameters (juce::MathConstants::pi, 3 * juce::MathConstants::pi, false); slAzimuth[i].setTextValueSuffix (juce::CharPointer_UTF8 (R"(°)")); slAzimuthAttachment[i].reset ( new SliderAttachment (valueTreeState, "azimuth" + juce::String (i), slAzimuth[i])); addAndMakeVisible (&slElevation[i]); slElevation[i].setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); slElevation[i].setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); slElevation[i].setColour (juce::Slider::rotarySliderOutlineColourId, colours[i]); slElevation[i].setRotaryParameters (0.5 * juce::MathConstants::pi, 2.5 * juce::MathConstants::pi, false); slElevation[i].setTextValueSuffix (juce::CharPointer_UTF8 (R"(°)")); slElevationAttachment[i].reset ( new SliderAttachment (valueTreeState, "elevation" + juce::String (i), slElevation[i])); } addAndMakeVisible (&lbAzimuth); lbAzimuth.setText ("Azimuth"); lbAzimuth.setJustification (juce::Justification::centred); addAndMakeVisible (&lvElevation); lvElevation.setText ("Elevation"); lvElevation.setJustification (juce::Justification::centred); addAndMakeVisible (&lbOrder); lbOrder.setText ("Order"); lbOrder.setJustification (juce::Justification::right); addAndMakeVisible (&lbShape); lbShape.setText ("Shape"); lbShape.setJustification (juce::Justification::right); addAndMakeVisible (&gcSettings); gcSettings.setText ("Probe Settings and Normalization"); addAndMakeVisible (&gcFilterBands); gcFilterBands.setText ("Filter Bands and Probe Response"); addAndMakeVisible (&gcOrderAndShape); gcOrderAndShape.setText ("Order and Shape"); addAndMakeVisible (&gcPanning); gcPanning.setText ("Spatial Panning"); addAndMakeVisible (&lbProbeAzimuth); lbProbeAzimuth.setText ("Azimuth"); lbProbeAzimuth.setJustification (juce::Justification::centred); addAndMakeVisible (&lbProbeElevation); lbProbeElevation.setText ("Elevation"); lbProbeElevation.setJustification (juce::Justification::centred); addAndMakeVisible (&lbProbeRoll); lbProbeRoll.setText ("Roll"); lbProbeRoll.setJustification (juce::Justification::centred); addAndMakeVisible (&lbNormalization); lbNormalization.setText ("Normalization"); lbNormalization.setJustification (juce::Justification::right); addAndMakeVisible (&sphere); for (int i = 0; i < numberOfBands; ++i) { sphereElements[i].reset (new SpherePanner::AzimuthElevationParameterElement ( *valueTreeState.getParameter ("azimuth" + juce::String (i)), valueTreeState.getParameterRange ("azimuth" + juce::String (i)), *valueTreeState.getParameter ("elevation" + juce::String (i)), valueTreeState.getParameterRange ("elevation" + juce::String (i)))); sphereElements[i]->setColour (colours[i]); sphere.addElement (sphereElements[i].get()); } probeElement.setColour (juce::Colours::black); probeElement.setTextColour (juce::Colours::white); probeElement.setLabel ("P"); sphere.addElement (&probeElement); startTimer (30); } DirectivityShaperAudioProcessorEditor::~DirectivityShaperAudioProcessorEditor() { setLookAndFeel (nullptr); } //============================================================================== void DirectivityShaperAudioProcessorEditor::paint (juce::Graphics& g) { // (Our component is opaque, so we must completely fill the background with a solid colour) g.fillAll (globalLaF.ClBackground); } void DirectivityShaperAudioProcessorEditor::resized() { // This is generally where you'll want to lay out the positions of any // subcomponents in your editor.. const int leftRightMargin = 30; const int headerHeight = 60; const int footerHeight = 25; const int rotSliderSpacing = 10; juce::Rectangle area (getLocalBounds()); juce::Rectangle footerArea (area.removeFromBottom (footerHeight)); footer.setBounds (footerArea); area.removeFromLeft (leftRightMargin); area.removeFromRight (leftRightMargin); juce::Rectangle headerArea = area.removeFromTop (headerHeight); title.setBounds (headerArea); area.removeFromTop (10); { // left side juce::Rectangle leftSide (area.removeFromLeft (545)); { // upper row juce::Rectangle filterArea (leftSide.removeFromTop (250)); gcFilterBands.setBounds (filterArea); filterArea.removeFromTop (25); juce::Rectangle cbArea (filterArea.removeFromBottom (50)); for (int i = 0; i < numberOfBands; ++i) { slFilterFrequency[i].setBounds (cbArea.removeFromLeft (40)); slFilterGain[i].setBounds (cbArea.removeFromLeft (40)); slFilterQ[i].setBounds (cbArea.removeFromLeft (40)); cbArea.removeFromLeft (20); } cbArea = filterArea.removeFromBottom (15); cbArea.removeFromLeft (20); for (int i = 0; i < numberOfBands; ++i) { cbFilterType[i].setBounds (cbArea.removeFromLeft (100)); cbArea.removeFromLeft (40); } fv.setBounds (filterArea); } leftSide.removeFromTop (25); // spacing { // lower row gcOrderAndShape.setBounds (leftSide); leftSide.removeFromTop (25); juce::Rectangle row (leftSide.removeFromTop (250)); xyPad.setBounds (row.removeFromLeft (250)); dv.setBounds (row.removeFromRight (250)); leftSide.removeFromTop (15); //spacing row = leftSide.removeFromTop (50); lbOrder.setBounds (row.removeFromLeft (50)); for (int i = 0; i < numberOfBands; ++i) { row.removeFromLeft (4); // spacing slOrder[i].setBounds (row.removeFromLeft (40)); } row.removeFromLeft (55); // spacing lbShape.setBounds (row.removeFromLeft (50)); for (int i = 0; i < numberOfBands; ++i) { row.removeFromLeft (4); slShape[i].setBounds (row.removeFromLeft (40)); } } } area.removeFromLeft (20); { juce::Rectangle rightSide (area); { juce::Rectangle panningArea (rightSide.removeFromTop (375)); gcPanning.setBounds (panningArea); panningArea.removeFromTop (25); juce::Rectangle sliderRow = panningArea.removeFromBottom (50); lvElevation.setBounds (sliderRow.removeFromLeft (47)); for (int i = 0; i < numberOfBands; ++i) { sliderRow.removeFromLeft (4); slElevation[i].setBounds (sliderRow.removeFromLeft (50)); } sliderRow = panningArea.removeFromBottom (50); lbAzimuth.setBounds (sliderRow.removeFromLeft (47)); for (int i = 0; i < numberOfBands; ++i) { sliderRow.removeFromLeft (4); slAzimuth[i].setBounds (sliderRow.removeFromLeft (50)); } sphere.setBounds (panningArea); rightSide.removeFromTop (25); { gcSettings.setBounds (rightSide); rightSide.removeFromTop (25); juce::Rectangle sliderRow (rightSide.removeFromTop (55)); slProbeAzimuth.setBounds (sliderRow.removeFromLeft (40)); sliderRow.removeFromLeft (rotSliderSpacing); slProbeElevation.setBounds (sliderRow.removeFromLeft (45)); sliderRow.removeFromLeft (rotSliderSpacing); slProbeRoll.setBounds (sliderRow.removeFromLeft (40)); sliderRow.removeFromLeft (rotSliderSpacing); tbProbeLock.setBounds (sliderRow); sliderRow = rightSide.removeFromTop (15); lbProbeAzimuth.setBounds (sliderRow.removeFromLeft (40)); sliderRow.removeFromLeft (rotSliderSpacing); lbProbeElevation.setBounds (sliderRow.removeFromLeft (45)); sliderRow.removeFromLeft (rotSliderSpacing); lbProbeRoll.setBounds (sliderRow.removeFromLeft (40)); rightSide.removeFromTop (15); sliderRow = rightSide.removeFromTop (20); lbNormalization.setBounds (sliderRow.removeFromLeft (80)); sliderRow.removeFromLeft (10); cbDirectivityNormalization.setBounds (sliderRow.removeFromLeft (90)); } } } } void DirectivityShaperAudioProcessorEditor::timerCallback() { // === update titleBar widgets according to available input/output channel counts title.setMaxSize (processor.getMaxSize()); // ========================================== const int processorAmbisonicOrder = processor.output.getOrder(); if (processorAmbisonicOrder != ambisonicOrder) { ambisonicOrder = processorAmbisonicOrder; xyPad.setMaxOrder (ambisonicOrder); } if (processor.repaintFV.get()) { processor.repaintFV = false; fv.setSampleRate (processor.getSampleRate()); } if (processor.repaintSphere.get()) { processor.repaintSphere = false; sphere.repaint(); } if (processor.repaintXY.get()) { processor.repaintXY = false; xyPad.repaint(); } if (processor.repaintDV.get()) { processor.repaintDV = false; for (int b = 0; b < numberOfBands; ++b) for (int i = 0; i < 8; ++i) weights[b][i] = processor.weights[b][i]; dv.repaint(); } } ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/DirectivityShaper/Source/ShapeAndOrderXyPad.hIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/DirectivityShaper/Source/ShapeAndOrd0000664002537200253720000001101515257173642031602 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once #include "../../resources/customComponents/XYPad.h" #include "../JuceLibraryCode/JuceHeader.h" //============================================================================== /* */ class ShapeAndOrderXyPad : public XYPad { public: ShapeAndOrderXyPad() { maxOrder = 7; } ~ShapeAndOrderXyPad() {} void paint (juce::Graphics& g) override { juce::Rectangle bounds = getLocalBounds(); const int height = bounds.getHeight(); int centreX = bounds.getCentreX(); int centreY = bounds.getCentreY(); g.setColour (juce::Colours::white); auto currentFont = juce::FontOptions (getLookAndFeel().getTypefaceForFont (juce::FontOptions (12.0f, 0))) .withHeight (12.0f); g.setFont (currentFont); g.drawText ("SHAPE", centreX - 15, height - 12, 30, 12, juce::Justification::centred); //g.drawMultiLineText("LEFT", 0, centreY-12, 10); g.drawFittedText ("O\nR\nD\nE\nR", 0, centreY - 40, 10, 80, juce::Justification::centred, 5); //g.drawFittedText("R\nI\nG\nH\nT", bounds.getWidth()-10, centreY-40, 10, 80, juce::Justification::centred, 5); g.setColour (juce::Colours::steelblue.withMultipliedAlpha (0.3f)); g.fillRect (plotArea.reduced (2, 2)); if (maxOrder < 7) { juce::Rectangle restricted (plotArea); restricted.setHeight ((float) restricted.getHeight() / 7 * (7 - maxOrder)); g.setColour (juce::Colours::red); g.drawRect (restricted, 1.0f); g.setColour (juce::Colours::red.withMultipliedAlpha (0.3f)); g.fillRect (restricted.reduced (2, 2)); } g.setColour (juce::Colours::black.withMultipliedAlpha (0.2f)); for (int i = 1; i < 7; ++i) { float y = orderToY (i); g.drawLine (plotArea.getX(), y, plotArea.getRight(), y); } g.drawLine (centreX, plotArea.getY(), centreX, plotArea.getBottom()); g.setColour (juce::Colours::white); for (int i = 0; i < 8; ++i) { float y = orderToY (i); g.drawFittedText (juce::String (i), bounds.getWidth() - 9, y - 6, 10, 12, juce::Justification::centredLeft, 1); } g.drawFittedText ("basic", plotArea.getX(), 0, 40, 12, juce::Justification::left, 1); g.drawFittedText ("maxrE", centreX - 20, 0, 40, 12, juce::Justification::centred, 1); g.drawFittedText ("inphase", plotArea.getRight() - 40, 0, 40, 12, juce::Justification::right, 1); g.setColour (juce::Colours::white.withMultipliedAlpha (0.8)); g.drawRect (plotArea, 1); XYPad::paint (g); } float orderToY (int order) { int height = plotArea.getHeight(); return plotArea.getY() + (float) height / 7 * (7 - order); } void resized() override { XYPad::resized(); } void setMaxOrder (int order) { if (maxOrder != order) { maxOrder = order; repaint(); } } private: int maxOrder; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ShapeAndOrderXyPad) }; ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/DirectivityShaper/Source/PluginProcessor.hIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/DirectivityShaper/Source/PluginProce0000664002537200253720000001151115257173642031702 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once #include "../../resources/AudioProcessorBase.h" #include "../JuceLibraryCode/JuceHeader.h" #include "../../resources/Quaternion.h" #include "../../resources/Weights.h" #include "../../resources/efficientSHvanilla.h" #define ProcessorClass DirectivityShaperAudioProcessor #define numberOfBands 4 using namespace juce::dsp; //============================================================================== /** */ class DirectivityShaperAudioProcessor : public AudioProcessorBase, IOTypes::Ambisonics<>> { public: constexpr static int numberOfInputChannels = 1; constexpr static int numberOfOutputChannels = 64; //============================================================================== DirectivityShaperAudioProcessor(); ~DirectivityShaperAudioProcessor(); //============================================================================== void prepareToPlay (double sampleRate, int samplesPerBlock) override; void releaseResources() override; void processBlock (juce::AudioSampleBuffer&, juce::MidiBuffer&) override; //============================================================================== juce::AudioProcessorEditor* createEditor() override; bool hasEditor() const override; //============================================================================== int getNumPrograms() override; int getCurrentProgram() override; void setCurrentProgram (int index) override; const juce::String getProgramName (int index) override; void changeProgramName (int index, const juce::String& newName) override; //============================================================================== void getStateInformation (juce::MemoryBlock& destData) override; void setStateInformation (const void* data, int sizeInBytes) override; //============================================================================== void parameterChanged (const juce::String& parameterID, float newValue) override; //======= Parameters =========================================================== std::vector> createParameterLayout(); //============================================================================== float weights[numberOfBands][8]; inline juce::dsp::IIR::Coefficients::Ptr createFilterCoefficients (int type, double sampleRate, double frequency, double Q); IIR::Filter filter[numberOfBands]; float probeGains[numberOfBands]; juce::Atomic repaintDV = true; juce::Atomic repaintXY = true; juce::Atomic repaintFV = true; juce::Atomic repaintSphere = true; void updateBuffers() override { repaintXY = true; }; private: //============================================================================== juce::AudioSampleBuffer filteredBuffer; iem::Quaternion quats[numberOfBands]; bool changeWeights = true; bool probeChanged = true; bool toggled = false; bool moving = false; float shOld[numberOfBands][64]; // parameters std::atomic* orderSetting; std::atomic* useSN3D; std::atomic* filterType[numberOfBands]; std::atomic* filterFrequency[numberOfBands]; std::atomic* filterQ[numberOfBands]; std::atomic* filterGain[numberOfBands]; std::atomic* probeAzimuth; std::atomic* probeElevation; std::atomic* probeRoll; std::atomic* probeLock; std::atomic* normalization; std::atomic* order[numberOfBands]; std::atomic* shape[numberOfBands]; std::atomic* azimuth[numberOfBands]; std::atomic* elevation[numberOfBands]; //============================================================================== JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DirectivityShaperAudioProcessor) }; ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/DirectivityShaper/Source/PluginEditor.hIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/DirectivityShaper/Source/PluginEdito0000664002537200253720000001164715257173642031710 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once #include "../JuceLibraryCode/JuceHeader.h" #include "PluginProcessor.h" //Plugin Design Essentials #include "../../resources/customComponents/TitleBar.h" #include "../../resources/lookAndFeel/IEM_LaF.h" //Custom juce::Components #include "../../resources/customComponents/FilterVisualizer.h" #include "../../resources/customComponents/ReverseSlider.h" #include "../../resources/customComponents/SimpleLabel.h" #include "../../resources/customComponents/SpherePanner.h" #include "DirectivityVisualizer.h" #include "ShapeAndOrderXyPad.h" typedef ReverseSlider::SliderAttachment SliderAttachment; typedef juce::AudioProcessorValueTreeState::ComboBoxAttachment ComboBoxAttachment; typedef juce::AudioProcessorValueTreeState::ButtonAttachment ButtonAttachment; //============================================================================== /** */ class DirectivityShaperAudioProcessorEditor : public juce::AudioProcessorEditor, private juce::Timer { public: DirectivityShaperAudioProcessorEditor (DirectivityShaperAudioProcessor&, juce::AudioProcessorValueTreeState&); ~DirectivityShaperAudioProcessorEditor(); //============================================================================== void paint (juce::Graphics&) override; void resized() override; private: LaF globalLaF; DirectivityShaperAudioProcessor& processor; juce::AudioProcessorValueTreeState& valueTreeState; ShapeAndOrderXyPad xyPad; float weights[numberOfBands][8]; void timerCallback() override; TitleBar, DirectivityIOWidget> title; OSCFooter footer; int maxPossibleOrder = -1; int ambisonicOrder = -1; juce::ComboBox cbFilterType[numberOfBands]; ReverseSlider slFilterFrequency[numberOfBands]; ReverseSlider slFilterQ[numberOfBands]; ReverseSlider slFilterGain[numberOfBands]; ReverseSlider slOrder[numberOfBands]; ReverseSlider slShape[numberOfBands]; ReverseSlider slAzimuth[numberOfBands]; ReverseSlider slElevation[numberOfBands]; ReverseSlider slProbeAzimuth; ReverseSlider slProbeElevation; ReverseSlider slProbeRoll; juce::ComboBox cbDirectivityNormalization; std::unique_ptr cbDirectivityNormalizationAttachment; // on-axis, energy SpherePanner sphere; std::unique_ptr sphereElements[numberOfBands]; SpherePanner::AzimuthElevationParameterElement probeElement; SimpleLabel lbAzimuth, lvElevation, lbOrder, lbShape; SimpleLabel lbProbeAzimuth, lbProbeElevation, lbProbeRoll; SimpleLabel lbNormalization; juce::GroupComponent gcFilterBands, gcOrderAndShape, gcPanning, gcSettings; juce::ToggleButton tbProbeLock; std::unique_ptr cbFilterTypeAttachment[numberOfBands]; std::unique_ptr slFilterFrequencyAttachment[numberOfBands]; std::unique_ptr slFilterQAttachment[numberOfBands]; std::unique_ptr slFilterGainAttachment[numberOfBands]; std::unique_ptr slOrderAttachment[numberOfBands]; std::unique_ptr slShapeAttachment[numberOfBands]; std::unique_ptr slAzimuthAttachment[numberOfBands]; std::unique_ptr slElevationAttachment[numberOfBands]; std::unique_ptr slProbeAzimuthAttachment; std::unique_ptr slProbeElevationAttachment; std::unique_ptr slProbeRollAttachment; std::unique_ptr tbProbeLockAttachment; DirectivityVisualizer dv; FilterVisualizer fv; std::unique_ptr slParam1Attachment, slParam2Attachment, slParam3Attachment; std::unique_ptr cbOrderSettingAttachment; std::unique_ptr cbNormalizationAttachment; // n3d, sn3d JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DirectivityShaperAudioProcessorEditor) }; IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/DirectivityShaper/CMakeLists.txt0000664002537200253720000000367615257173642031045 0ustar zmoelnigzmoelnigset (PLUGIN_TARGET "") if (IEM_FORMATS) juce_add_plugin (DirectivityShaper PLUGIN_MANUFACTURER_CODE IEMA PLUGIN_CODE DiSh ICON_BIG "../resources/Standalone/IEMPluginSuiteSmall.png" ICON_SMALL "../resources/Standalone/IEMPluginSuiteSmall.png" COMPANY_NAME "IEM" PRODUCT_NAME "DirectivityShaper" FORMATS ${IEM_FORMATS} VERSION ${DirectivityShaper_VERSION} LV2URI "http://plugins.iem.at/DirectivityShaper" VST2_CATEGORY kPlugSurroundFx kPlugCategSpacializer VST3_CATEGORIES Spatial Surround Up-Downmix AAX_CATEGORY SoundField) list (APPEND PLUGIN_TARGET DirectivityShaper) endif() foreach (TARGET IN LISTS PLUGIN_TARGET) juce_generate_juce_header (${TARGET}) target_sources (${TARGET} PRIVATE Source/PluginEditor.cpp Source/PluginEditor.h Source/PluginProcessor.cpp Source/PluginProcessor.h ../resources/OSC/OSCInputStream.h ../resources/OSC/OSCParameterInterface.cpp ../resources/OSC/OSCParameterInterface.h ../resources/OSC/OSCStatus.cpp ../resources/OSC/OSCStatus.h ../resources/OSC/OSCUtilities.h ../resources/efficientSHvanilla.cpp ) target_compile_definitions (${TARGET} PRIVATE JUCE_USE_CURL=0 JUCE_WEB_BROWSER=0 JUCE_USE_CUSTOM_PLUGIN_STANDALONE_APP=1 JUCE_USE_FLAC=0 JUCE_USE_OGGVORBIS=0 JUCE_USE_MP3AUDIOFORMAT=0 JUCE_USE_LAME_AUDIO_FORMAT=0 JUCE_USE_WINDOWS_MEDIA_FORMAT=0 JUCE_VST3_CAN_REPLACE_VST2=0) target_include_directories (${TARGET} PRIVATE Source) target_link_libraries (${TARGET} PRIVATE LAF_fonts IEM_logo juce::juce_audio_utils juce::juce_audio_plugin_client juce::juce_osc juce::juce_dsp juce::juce_opengl juce::juce_recommended_config_flags juce::juce_recommended_lto_flags) endforeach()IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/macOS_buildForRelease.sh0000775002537200253720000000140715257173642027321 0ustar zmoelnigzmoelnig#!/bin/sh ## script for creating the release binaries on rm -rf build rm -rf VST rm -rf VST3 rm -rf LV2 rm -rf AAX rm -rf Standalone cmake -B build -DCMAKE_BUILD_TYPE=Release -DIEM_BUILD_VST3=ON -DIEM_BUILD_VST2=ON -DVST2SDKPATH=src/VST_SDK/VST2_SDK/ -DIEM_BUILD_LV2=ON -DIEM_BUILD_STANDALONE=ON -DIEM_BUILD_AAX=ON -DCMAKE_OSX_DEPLOYMENT_TARGET=10.11 -DCMAKE_OSX_ARCHITECTURES="arm64;x86_64" cmake --build build --config Release -- -j 8 # cd .. mkdir VST cp -r build/*/*_artefacts/Release/VST/*.vst VST/ mkdir VST3 cp -r build/*/*_artefacts/Release/VST3/*.vst3 VST3/ mkdir LV2 cp -r build/*/*_artefacts/Release/LV2/*.lv2 LV2/ mkdir AAX cp -r build/*/*_artefacts/Release/AAX/*.aaxplugin AAX/ mkdir Standalone cp -r build/*/*_artefacts/Release/Standalone/*.app Standalone/ IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/ChangeLog.md0000664002537200253720000004134615257173642025010 0ustar zmoelnigzmoelnig# Changelog This file only contains the major changes of the IEM Plug-in Suite. For a list of all changes and bugfixes see the git log. Please note, that breaking changes are marked with `!!BREAKING CHANGE!!`. They might lead to an unexpected behavior and might not be compatible with your previous projects without making some adaptions. See the [Breaking changes article](https://plugins.iem.at/docs/breakingchanges/) for more information. ## 1.16.0 - general changes - moved to JUCE 9.0.3 - Minor bug fixes and improvements - plug-in specific changes - **Simple**Decoder - Add option to use a dedicated decoder for low frequencies (subwoofer array decoding) - **FDN**Reverb - The fade-in is now set as a ratio of the reverberation time instead of an absolute time (`!!BREAKING CHANGE!!` old projects and presets are converted, but the former `fadeInTime` OSC parameter no longer exists) - **Multi**Encoder - allows users to set the color of sources via OSC - **Coordinate**Converter - Cartesian coordinates follow the definition of the **Room**Encoder: positions in meters within a room, with a listener position instead of a reference position (`!!BREAKING CHANGE!!` old projects are converted, but the former `xRange`, `yRange`, `zRange`, `xReference`, `yReference` and `zReference` OSC parameters no longer exist) - Room dimensions and listener position can be synchronized with **Room**Encoders - **Room**Encoder - Synchronization channels are shared with other plug-ins (**Coordinate**Converter) and across host processes ## v1.15.0 - general changes - moved to JUCE 8.0.7 - added VST3 support - added AAX support (macOS and Windows) - Make more plug-ins resizeable - plug-in specific changes - **AllRA**Decoder - Add a clear all-button to start from scratch faster - **Dual**Delay - Major refactoring of the internal delay processing, fixing clicks and crackling if delay is changed rapidly - Set delay by default in BPM with multipliers instead of milliseconds (`!!BREAKING CHANGE!!` although old projects are converted from ms to BPM, there may still be some tiny differences in actual delay time) - Add mode for setting delay in ms - Tap button - Sync with DAW BPM possible - Add selectable warping mode instead of rotation (similar to the [ambiX_warp](https://www.matthiaskronlachner.com/?p=2015); will only work properly with high Ambisonic orders) - **FDN**Reverb - Add high-pass filter - Implement bigger FDN sizes - Enable freeze mode - **Granular**Encoder - Save buffer only if freeze mode is active - **Multiband**Compressor - Fix UI settings when reopening - **Multi**Encoder - Add presets for various t-designs to incorporate non-Ambisonic effects more easily - **Multi**EQ - Refactor internal processing - Fix bug with locked elements when reopening UI - **Room**Encoder - Fix regularization bug for sources moving through/close to the listener - Make distance for constant gain rendering configurable as parameter - **Simple**Decoder - Add presets for various t-designs to incorporate non-Ambisonic effects more easily - Fix crashing of plug-in if empty decoder file is loaded - **Scene**Rotator - Native support for Supperware Head Tracker 1 ## v1.14.1 - general changes - moved to JUCE 7.0.5 - Plug-ins work again on Windows Vista and 7 - plug-in specific changes - **AllRA**Decoder and **Simple**Decoder - Wrap azimuth exceeding 180° and elevation exceeding 90° for correct im-/export of layouts - Update IEM Cube decoder preset - **Granular**Encoder - Add some color to the sliders ## v1.14.0 - general changes - moved to JUCE 7.0.4 - LV2 plug-ins for macOS, Linux and Windows - remove deprecated *.jucer files - `clang-format`ting the whole codebase - smaller bug fixes and improvements - new plug-ins - **Granular**Encoder - Granular synthesizer and encoder - plug-in specific changes - **Distance**Compensator - Change plug-in code from DiCo to DisC, so it is different to the **Directional**Compressor - **Energy**Visualizer - Added variable RMS time constant and max hold ## v1.13.0 - general changes - moved from Projucer to CMake build setup - added VST3 support (which may have some limitations) ## v1.12.0 - general changes - moved to JUCE 6 - plug-in specific changes - **Fdn**Reverb - fixed shared memory bug - **Multi**Encoder - fixed bug where coordinates weren't recalled correctly when master rotation was active - adds visualization of input levels ## v1.11.1 - general changes - standalones: prevents crashes when there's no audio input device - smaller bug fixes - plug-in specific changes - **AllRA**Decoder - removed the 64 channel number limit for loudspeakers layouts with more than 64 loudspeakers - **Simple**Decoder - decoder configuration is now stored within the plug-in state when saving a session, so no need to provide the decoder file when sharing projects - added decoder presets for standard layouts and IEM studios -**Energy**Visualizer - sending RMS values with OSCAddressPattern "/RMS" ## v1.11.0 - general changes - new standalone versions with JACK support on linux and macOS - adds OSC Send capabilities to each plug-in - plug-in specific changes -**AllRA**Decoder - adds Ambisonic weight selector: switch between basic, maxrE, and inPhase weights - selected weights are exported to JSON - changes decibel range of energy visualization from +-/3dB to +/- 1.5dB - **Binaural**Decoder - fixes bug which lead to +6dB per sampleRate doubling - **Energy**Visualizer - performance improvements - sends RMS values for 426 sample points via OSC - **Multi**Encoder - source directions can be imported via JSON config files - adds master controls to adjust directions and gains of all sources simultaneously - **Room**Encoder - shelving-filters now operate on all reflection orders (not only the first two) - **Simple**Decoder - adds master gain - Ambisonic weight selector: switch between basic, maxrE, and inPhase weights - modified level compensation for different input orders ## v1.10.2 - general changes - fixed bug in SIMD IIR processing (**MultiBand**Compressor, **Multi**EQ, **Room**Encoder), which in some constellations led to very loud output - fixed filter visualization being different for different sampling frequencies - limits internal filter frequencies to Nyquist-frequency for IIR stability - minor fixes and improvements - plug-in specific changes - **Room**Encoder - fixed faulty room sync on channel #4 ## v1.10.1 - plug-in specific changes - **Room**Encoder - hides direct path visualization when disabled - adds extra parameters to adjust an additional attenuation per wall - fixes crackles bug - **Simple**Decoder - fixes bug: reset of Ambisonic order when re-opening GUI - **Tool**Box - adds overall gain control - **Directivity**Shaper - fixing directions of elevation sliders ## v1.10.0 - new plug-ins - **MultiBand**Compressor - general changes - Linux Builds: JACK clients name will be the plug-in's name - all parameters can be controlled via vendorSpecific calls - OSCPort can be opened via vendorSpecific calls - plug-in specific changes - **Fdn**Reverb - reverberation time visualization bug fixed - **Room**Encoder - restraining source and listener positions to room boundaries - increases minimum distance between source and listener to 0.1m - deactivates minimum distance control, if direct path isn't renderer - added direct path unity-gain option - added direct path zero-delay option - added button to deactivate direct path rendering (feature was hidden before) - **Scene**Rotator - MIDI Devices can now be opened directly to receive rotation data (for now support for MrHeadTracker only, more will follow) ## v1.9.0 - general changes - plug-in host will be notified when paramater values change automatically (e.g. conversions) - osc port can be changed on the fly when opened, plug-ins will close and re-open port immediately - plug-in specific changes - **Binaural**Decoder - output level reduced by 10dB - **Distance**Compensator - fixes broken import of loudspeaker layouts - **Energy**Visualizer - levels will only be calculated when the GUI is open - adds control to change visualized dynamic range - **Scene**Rotator - adds quaternion inversion - adds selectable sequence of rotations ## v1.8.1 - plug-in specific changes - **AllRA**Decoder - fixes: AllRADecoder forgetting layout when loading previous state ## v1.8.0 - general changes - rafactored widgets (internal change) - new plug-ins: - **Multi**EQ - equalizer plug-in with several filter types, filtering up to 64 audio channels - **Scene**Rotator - simple rotator of Ambisonic scenes - plug-in specific changes - **Fdn**Reverb - mouse-wheel controls Q factors of filters within the FilterVisualizer ## v1.7.1 - general changes - smaller GUI re-draw improvements - support for GenericLayout in configuration files - plug-in specific changes - **Room**Encoder - fixes possible crashs when host's buffersize is smaller than reported (can happen with loops) - **Stereo**Encoder - performance improvements - **Matrix**Multiplier - fixes wrong displayed number of in/out channels ## v1.7.0 - general changes - OSC 'connect/disconnect' buttons replaced by 'open/close' buttons - support for OSC bundles - plug-in specific changes - **Fdn**Reverb - fade-in functionality for more diffuseness at the beginning - internal fdn size now switchable (for different sounds and lower cpu usage) - **Stereo**Encoder - adds shortcuts for panning positions (e.g. shift+f for front, ...) ## v1.6.0 - general changes - OSC support: every plug-in is now controllable via OSC - SpherePanner will change only azimuth when right-clicked and dragged - plug-in specific changes - **AllRA**Decoder - alt+clicking the Noise button, will encode the test-signal to the loudspeaker's direction - tooltips added to some buttons (noise, import, export, rotate, add loudspeakers) - **Coordinate**Converter - added flip toggles for each in- and output parameter ## v1.5.0 - general changes - decoders (e.g. SimpleDecoder) can handle inPhase weights now - new plug-ins: - **Coordinate**Converter - a plug-in which converts spherical to cartesian coordinates and vice versa, e.g. for converting automations - plug-in specific changes - **Distance**Compensator - fixes wrong initialization of gains and delays - adds error message when no loudspeaker layout has been loaded ## v1.4.0 - general changes - all plug-ins now make use of methods which save/recall the plug-in states (necessary for some DAWs) - new plug-ins: - **Distance**Compensator - a plug-in which compensates gain and delay for loudspeaker arrays with different distances to the listener - plug-in specific changes - **AllRA**Decoder - rotate feature added: rotates the whole layout by any arbitrary angle around the z-axis - **Energy**Visualizer - colormaps now switchable by clicking on the colormap - **Room**Encoder - added parameter to disable direct path - **Omni**Compressor - added visualization of the compressor's characteristic - added look-ahead feature to avoid distortion artifacts when brickwall-limiting ## v1.3.1 - plug-in specific changes - **Energy**Visualizer - using a perceptually motivated colormap - **AllRA**Decoder - clicking 'add loudspeaker' while holding the alt-key adds an imaginary loudspeaker at the nadir - added noise generator for testing correct signal routing - **Room**Encoder - fixing wrong slider values (gui issue) - **Fdn**Reverb - fixing wrong slider values (gui issue) ## v1.3.0 - general changes - unity gain normalization has moved fully to the decoding stage: (`!!BREAKING CHANGE!!`) - encoding a source results in unity gain in the W-channel (omni) - decoding is normalized resulting in unity gain for the sampled mono signal - renamed **Matrix**Multiplicator to **Matrix**Multiplier (`!!BREAKING CHANGE!!`) - refactored SpherePanner, which fixes automation writing issues - added linear elevation plot style to SpherePanner (triggered by double-click) - plug-in specific changes - **AllRA**Decoder - fixed distorted visualization - added visualization of the acos-rE source width - **Binaural**Decoder - performance improvements - new binaural filters - **Dual**Delay - fixed high CPU load which occurred occasionally - **Matrix**Multiplier - smaller GUI changes - **Multi**Encoder - colour-chooser now has the same look as the elements in the sphere panner, again - Solo/Mute changes will repaint sphere - using azimuth and elevation instead of yaw and pitch (`!!BREAKING CHANGE!!`) - **Stereo**Encoder - using azimuth and elevation instead of yaw and pitch (`!!BREAKING CHANGE!!`) - **Probe**Decoder - using azimuth and elevation instead of yaw and pitch (`!!BREAKING CHANGE!!`) - **DirectionalCompressor**Decoder - using azimuth and elevation instead of yaw and pitch (`!!BREAKING CHANGE!!`) - adjusted parameter limits (threshold and makeup gain) (`!!BREAKING CHANGE!!`) - **Directivity**Shaper - added SN3D support (`!!BREAKING CHANGE!!`) - renamed parameters (probe instead of master) (`!!BREAKING CHANGE!!`) - using azimuth and elevation instead of yaw and pitch (`!!BREAKING CHANGE!!`) - adjusted parameter limits (threshold and makeup gain) (`!!BREAKING CHANGE!!`) - **Room**Shaper - added SN3D support (`!!BREAKING CHANGE!!`) - **Simple**Decoder - new bass-management (`!!BREAKING CHANGE!!`) - added warning, showing if subwoofer channel is already occupied ## v1.2.0 - new plug-ins: - **AllRA**Decoder - plug-in specific changes - **Binaural**Decoder - refactored convolution -> way better performance on all platforms - **Matrix**Multiplicator - fixed bug that only input channels up to a square-number count are processed (e.g. 16 instead of 20) ## v1.1.1 - general changes - added binaural IO widget - directivity IO widget now shows the normalization (which is N3D) - added warning sign to titlebar widgets when bus is too small - plug-in specific changes - **Multi**Encoder - changed element colours are now displayed at once - **Binaural**Decoder - making use of new binaural IO widget - performance improvements on windows and linux - **Directivity**Shaper - better GUI performance - 5dB subgrid for directivity shaper - more linear default values for filters - **Room**Encoder - fixed bug which lead to filter output values way beyond of 1 - **Tool**Box - added adaptor tool for lower order Ambisonic (LOA) signals to be compatible with HOA decoder weights ## v1.1.0 - new plug-ins: - **Matrix**Multiplicator - **Simple**Decoder - **Tool**Box - **Binaural**Decoder - general changes - switched to JUCE develop branch !! - added configurations (decoders,...) - some GUIs now resizable - smaller GUI layout changes (e.g. ComboBox PopupMenu) - plug-in specific changes - **Multi**Encoder - maximum input channel size increased to 64 - parameters and colours are stored correctly now - MasterPanner is now controllable with mouse wheel (and modifiers) - GUI resizable - **Omni**Compressor and **Directional**Compressor - new compressor engine - added 'knee' parameter - can be used as limiters now - **Fdn**Reverb - added a visual T60 recommendation - maximum reverberation time reduced - filters can now have positive gain - layout restructured, resizable - **Room**Encoder - added floor reflections (now up to 236 reflections possible) - default number of reflections set to 19 (chosen arbitrarily) - **Stereo**Encoder - added hidden high-quality mode IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/MultiEQ/0000775002537200253720000000000015257173642024147 5ustar zmoelnigzmoelnigIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/MultiEQ/Source/0000775002537200253720000000000015257173642025407 5ustar zmoelnigzmoelnigIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/MultiEQ/Source/PluginProcessor.cpp0000664002537200253720000004243615257173642031262 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #include "PluginProcessor.h" #include "PluginEditor.h" static constexpr int filterTypePresets[] = { 1, 4, 4, 4, 4, 5 }; static constexpr float filterFrequencyPresets[] = { 20.0f, 120.0f, 500.0f, 2200.0f, 8000.0f, 16000.0f }; //============================================================================== MultiEQAudioProcessor::MultiEQAudioProcessor() : AudioProcessorBase ( #ifndef JucePlugin_PreferredChannelConfigurations BusesProperties() #if ! JucePlugin_IsMidiEffect #if ! JucePlugin_IsSynth .withInput ("Input", ((juce::PluginHostType::getPluginLoadedAs() == juce::AudioProcessor::wrapperType_VST3) ? juce::AudioChannelSet::ambisonic (1) : juce::AudioChannelSet::ambisonic (7)), true) #endif .withOutput ("Output", ((juce::PluginHostType::getPluginLoadedAs() == juce::AudioProcessor::wrapperType_VST3) ? juce::AudioChannelSet::ambisonic (1) : juce::AudioChannelSet::ambisonic (7)), true) #endif , #endif createParameterLayout()) { // get pointers to the parameters inputChannelsSetting = parameters.getRawParameterValue ("inputChannelsSetting"); // add listeners to parameter changes parameters.addParameterListener ("inputChannelsSetting", this); for (int i = 0; i < numFilterBands; ++i) { filterEnabled[i] = parameters.getRawParameterValue ("filterEnabled" + juce::String (i)); filterType[i] = parameters.getRawParameterValue ("filterType" + juce::String (i)); filterFrequency[i] = parameters.getRawParameterValue ("filterFrequency" + juce::String (i)); filterQ[i] = parameters.getRawParameterValue ("filterQ" + juce::String (i)); filterGain[i] = parameters.getRawParameterValue ("filterGain" + juce::String (i)); parameters.addParameterListener ("filterEnabled" + juce::String (i), this); parameters.addParameterListener ("filterType" + juce::String (i), this); parameters.addParameterListener ("filterFrequency" + juce::String (i), this); parameters.addParameterListener ("filterQ" + juce::String (i), this); parameters.addParameterListener ("filterGain" + juce::String (i), this); } } MultiEQAudioProcessor::~MultiEQAudioProcessor() { } //============================================================================== int MultiEQAudioProcessor::getNumPrograms() { return 1; // NB: some hosts don't cope very well if you tell them there are 0 programs, // so this should be at least 1, even if you're not really implementing programs. } int MultiEQAudioProcessor::getCurrentProgram() { return 0; } void MultiEQAudioProcessor::setCurrentProgram (int index) { } const juce::String MultiEQAudioProcessor::getProgramName (int index) { return {}; } void MultiEQAudioProcessor::changeProgramName (int index, const juce::String& newName) { } //============================================================================== void MultiEQAudioProcessor::prepareToPlay (double sampleRate, int samplesPerBlock) { checkInputAndOutput (this, *inputChannelsSetting, *inputChannelsSetting, true); for (int f = 0; f < numFilterBands; ++f) { filterParameters[f].type = FilterType (static_cast (filterType[f]->load())); filterParameters[f].frequency = filterFrequency[f]->load(); filterParameters[f].q = filterQ[f]->load(); filterParameters[f].linearGain = juce::Decibels::decibelsToGain (filterGain[f]->load()); filterParameters[f].enabled = filterEnabled[f]->load() > 0.5f; } juce::dsp::ProcessSpec spec; spec.sampleRate = sampleRate; spec.maximumBlockSize = samplesPerBlock; spec.numChannels = getTotalNumInputChannels(); MCFilter.prepare (spec, filterParameters); } void MultiEQAudioProcessor::releaseResources() { // When playback stops, you can use this as an opportunity to free up any // spare memory, etc. } void MultiEQAudioProcessor::processBlock (juce::AudioBuffer& buffer, juce::MidiBuffer& midiMessages) { checkInputAndOutput (this, *inputChannelsSetting, *inputChannelsSetting, false); juce::ScopedNoDenormals noDenormals; juce::dsp::AudioBlock ab (buffer); juce::dsp::ProcessContextReplacing context (ab); MCFilter.process (context); } //============================================================================== bool MultiEQAudioProcessor::hasEditor() const { return true; // (change this to false if you choose to not supply an editor) } juce::AudioProcessorEditor* MultiEQAudioProcessor::createEditor() { return new MultiEQAudioProcessorEditor (*this, parameters); } //============================================================================== // TODO: Add parameter conversion when loading old projects void MultiEQAudioProcessor::getStateInformation (juce::MemoryBlock& destData) { auto state = parameters.copyState(); auto oscConfig = state.getOrCreateChildWithName ("OSCConfig", nullptr); oscConfig.copyPropertiesFrom (oscParameterInterface.getConfig(), nullptr); std::unique_ptr xml (state.createXml()); copyXmlToBinary (*xml, destData); } void MultiEQAudioProcessor::setStateInformation (const void* data, int sizeInBytes) { std::unique_ptr xmlState (getXmlFromBinary (data, sizeInBytes)); if (xmlState.get() != nullptr) if (xmlState->hasTagName (parameters.state.getType())) { parameters.replaceState (juce::ValueTree::fromXml (*xmlState)); if (parameters.state.hasProperty ("OSCPort")) // legacy { oscParameterInterface.getOSCReceiver().connect ( parameters.state.getProperty ("OSCPort", juce::var (-1))); parameters.state.removeProperty ("OSCPort", nullptr); } auto oscConfig = parameters.state.getChildWithName ("OSCConfig"); if (oscConfig.isValid()) oscParameterInterface.setConfig (oscConfig); // Add compatibility layer for old delay parameters auto paramToTest = xmlState->getChildByAttribute ("id", "filterType1"); if ((paramToTest != nullptr) && (paramToTest->getStringAttribute ("value").getFloatValue() < 3.0f)) { for (int i = 1; i < numFilterBands - 1; ++i) { float loadedType = xmlState->getChildByAttribute ("id", "filterType" + juce::String (i)) ->getStringAttribute ("value") .getFloatValue(); loadedType += 3.0; auto parameterState = parameters.state.getChildWithProperty ("id", "filterType" + juce::String (i)); if (parameterState.isValid()) { parameterState.setProperty ("value", loadedType, nullptr); } } float loadedType = xmlState ->getChildByAttribute ("id", "filterType" + juce::String (numFilterBands - 1)) ->getStringAttribute ("value") .getFloatValue(); if (loadedType > 2.5f) loadedType = 5.0f; else loadedType += 6.0f; auto parameterState = parameters.state.getChildWithProperty ( "id", "filterType" + juce::String (numFilterBands - 1)); if (parameterState.isValid()) { parameterState.setProperty ("value", loadedType, nullptr); } } } } //============================================================================== void MultiEQAudioProcessor::parameterChanged (const juce::String& parameterID, float newValue) { DBG ("Parameter with ID " << parameterID << " has changed. New value: " << newValue); if (parameterID == "inputChannelsSetting") userChangedIOSettings = true; else if (parameterID.startsWith ("filter")) { const int i = parameterID.getLastCharacters (1).getIntValue(); filterParameters[i].type = FilterType (static_cast (filterType[i]->load())); filterParameters[i].frequency = filterFrequency[i]->load(); filterParameters[i].q = filterQ[i]->load(); filterParameters[i].linearGain = juce::Decibels::decibelsToGain (filterGain[i]->load()); filterParameters[i].enabled = filterEnabled[i]->load() > 0.5f; if (parameterID.startsWith ("filterEnabled")) MCFilter.updateFilterParams (filterParameters[i], i, false); else MCFilter.updateFilterParams (filterParameters[i], i, true); repaintFV = true; userHasChangedFilterSettings = true; } } void MultiEQAudioProcessor::updateBuffers() { DBG ("IOHelper: input size: " << input.getSize()); DBG ("IOHelper: output size: " << output.getSize()); } //============================================================================== std::vector> MultiEQAudioProcessor::createParameterLayout() { // add your audio parameters here std::vector> params; params.push_back (OSCParameterInterface::createParameterTheOldWay ( "inputChannelsSetting", "Number of input channels ", "", juce::NormalisableRange (0.0f, 64.0f, 1.0f), 0.0f, [] (float value) { return value < 0.5f ? "Auto" : juce::String (value); }, nullptr)); int i = 0; params.push_back (OSCParameterInterface::createParameterTheOldWay ( "filterEnabled" + juce::String (i), "Filter Enablement " + juce::String (i + 1), "", juce::NormalisableRange (0.0f, 1.0f, 1.0f), 1.0f, [] (float value) { return value < 0.5 ? juce::String ("OFF") : juce::String ("ON"); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "filterType" + juce::String (i), "Filter Type " + juce::String (i + 1), "", juce::NormalisableRange (0.0f, 3.0f, 1.0f), filterTypePresets[i], [] (float value) { if (value < 0.5f) return "HP (6dB/oct)"; else if (value >= 0.5f && value < 1.5f) return "HP (12dB/oct)"; else if (value >= 1.5f && value < 2.5f) return "HP (24dB/oct)"; else return "Low-shelf"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "filterFrequency" + juce::String (i), "Filter Frequency " + juce::String (i + 1), "Hz", juce::NormalisableRange (20.0f, 20000.0f, 1.0f, 0.4f), filterFrequencyPresets[i], [] (float value) { return juce::String (value, 0); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "filterQ" + juce::String (i), "Filter Q " + juce::String (i + 1), "", juce::NormalisableRange (0.05f, 8.0f, 0.05f), 0.7f, [] (float value) { return juce::String (value, 2); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "filterGain" + juce::String (i), "Filter Gain " + juce::String (i + 1), "dB", juce::NormalisableRange (-60.0f, 15.0f, 0.1f), 0.0f, [] (float value) { return juce::String (value, 1); }, nullptr)); for (int i = 1; i < numFilterBands - 1; ++i) { params.push_back (OSCParameterInterface::createParameterTheOldWay ( "filterEnabled" + juce::String (i), "Filter Enablement " + juce::String (i + 1), "", juce::NormalisableRange (0.0f, 1.0f, 1.0f), 1.0f, [] (float value) { return value < 0.5 ? juce::String ("OFF") : juce::String ("ON"); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "filterType" + juce::String (i), "Filter Type " + juce::String (i + 1), "", juce::NormalisableRange (3.0f, 5.0f, 1.0f), filterTypePresets[i], [] (float value) { if (value < 3.5f) return "Low-shelf"; else if (value >= 3.5f && value < 4.5f) return "Peak"; else return "High-shelf"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "filterFrequency" + juce::String (i), "Filter Frequency " + juce::String (i + 1), "Hz", juce::NormalisableRange (20.0f, 20000.0f, 1.0f, 0.4f), filterFrequencyPresets[i], [] (float value) { return juce::String (value, 0); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "filterQ" + juce::String (i), "Filter Q " + juce::String (i + 1), "", juce::NormalisableRange (0.05f, 8.0f, 0.05f), 0.7f, [] (float value) { return juce::String (value, 2); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "filterGain" + juce::String (i), "Filter Gain " + juce::String (i + 1), "dB", juce::NormalisableRange (-60.0f, 15.0f, 0.1f), 0.0f, [] (float value) { return juce::String (value, 1); }, nullptr)); } i = numFilterBands - 1; params.push_back (OSCParameterInterface::createParameterTheOldWay ( "filterEnabled" + juce::String (i), "Filter Enablement " + juce::String (i + 1), "", juce::NormalisableRange (0.0f, 1.0f, 1.0f), 1.0f, [] (float value) { return value < 0.5 ? juce::String ("OFF") : juce::String ("ON"); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "filterType" + juce::String (i), "Filter Type " + juce::String (i + 1), "", juce::NormalisableRange (5.0f, 8.0f, 1.0f), filterTypePresets[i], [] (float value) { if (value < 5.5f) return "High-shelf"; else if (value >= 5.5f && value < 6.5f) return "LP (6dB/Oct)"; else if (value >= 6.5f && value < 7.5f) return "LP (12dB/oct)"; else return "LP (24dB/oct)"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "filterFrequency" + juce::String (i), "Filter Frequency " + juce::String (i + 1), "Hz", juce::NormalisableRange (20.0f, 20000.0f, 1.0f, 0.4f), filterFrequencyPresets[i], [] (float value) { return juce::String (value, 0); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "filterQ" + juce::String (i), "Filter Q " + juce::String (i + 1), "", juce::NormalisableRange (0.05f, 8.0f, 0.05f), 0.7f, [] (float value) { return juce::String (value, 2); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "filterGain" + juce::String (i), "Filter Gain " + juce::String (i + 1), "dB", juce::NormalisableRange (-60.0f, 15.0f, 0.1f), 0.0f, [] (float value) { return juce::String (value, 1); }, nullptr)); return params; } //============================================================================== // This creates new instances of the plugin.. juce::AudioProcessor* JUCE_CALLTYPE createPluginFilter() { return new MultiEQAudioProcessor(); } IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/MultiEQ/Source/PluginEditor.cpp0000664002537200253720000002733415257173642030531 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #include "PluginEditor.h" #include "PluginProcessor.h" //============================================================================== MultiEQAudioProcessorEditor::MultiEQAudioProcessorEditor (MultiEQAudioProcessor& p, juce::AudioProcessorValueTreeState& vts) : juce::AudioProcessorEditor (&p), processor (p), valueTreeState (vts), footer (p.getOSCParameterInterface()) { // ============== BEGIN: essentials ====================== // set GUI size and lookAndFeel //setSize(500, 300); // use this to create a fixed-size GUI setResizeLimits (880, 330, 1000, 800); // use this to create a resizable GUI setResizable (true, true); setLookAndFeel (&globalLaF); // make title and footer visible, and set the PluginName addAndMakeVisible (&title); title.setTitle (juce::String ("Multi"), juce::String ("EQ")); title.setFont (globalLaF.robotoBold, globalLaF.robotoLight); addAndMakeVisible (&footer); // ============= END: essentials ======================== // create the connection between title component's comboBoxes and parameters cbNumInputChannelsAttachment.reset ( new ComboBoxAttachment (valueTreeState, "inputChannelsSetting", *title.getInputWidgetPtr()->getChannelsCbPointer())); tooltipWin.setLookAndFeel (&globalLaF); tooltipWin.setMillisecondsBeforeTipAppears (500); tooltipWin.setOpaque (false); const juce::Colour colours[numFilterBands] = { juce::Colours::cadetblue, // make sure you have enough colours in here juce::Colours::mediumpurple, juce::Colours::cornflowerblue, juce::Colours::greenyellow, juce::Colours::yellow, juce::Colours::orangered }; for (int f = 0; f < numFilterBands; ++f) { gainEnabled[f] = true; qEnabled[f] = true; } // Select state of gain and Q slider for first and last band auto filterTypeFirst = valueTreeState.getRawParameterValue ("filterType0"); auto filterTypeLast = valueTreeState.getRawParameterValue ("filterType" + juce::String (numFilterBands - 1)); if (*filterTypeFirst < 2.5f) { gainEnabled[0] = false; if (*filterTypeFirst < 0.5f || *filterTypeFirst > 1.5f) qEnabled[0] = false; } if (*filterTypeLast > 5.5f) // Disable gain, if high shelf is selected { gainEnabled[numFilterBands - 1] = false; if (*filterTypeLast < 6.5f || *filterTypeLast > 7.5f) // Disable Q, if 1st order or LR LP is selected qEnabled[numFilterBands - 1] = false; } auto filterPtr = processor.getFilter(); addAndMakeVisible (fv); if (filterPtr != nullptr) for (int f = 0; f < numFilterBands; ++f) fv.addCoefficients (filterPtr->getCoefficientsForGui (f), colours[f], &slFilterFrequency[f], &slFilterGain[f], &slFilterQ[f]); fv.enableFilter (2, false); for (int i = 0; i < numFilterBands; ++i) { addAndMakeVisible (&tbFilterOn[i]); tbFilterOn[i].setColour (juce::ToggleButton::tickColourId, colours[i]); tbFilterOn[i].addListener (this); tbFilterOnAttachment[i].reset (new ButtonAttachment (valueTreeState, "filterEnabled" + juce::String (i), tbFilterOn[i])); const bool enabled = tbFilterOn[i].getToggleState(); addAndMakeVisible (&cbFilterType[i]); if (i == 0) { cbFilterType[i].addItem ("HP (6dB/oct)", 2); cbFilterType[i].addItem ("HP (12dB/oct)", 3); cbFilterType[i].addItem ("HP (24db/oct)", 4); cbFilterType[i].addItem ("Low-shelf", 1); } else if (i == numFilterBands - 1) { cbFilterType[i].addItem ("High-shelf", 1); cbFilterType[i].addItem ("LP (6dB/oct)", 2); cbFilterType[i].addItem ("LP (12dB/oct)", 3); cbFilterType[i].addItem ("LP (24dB/oct)", 4); } else { cbFilterType[i].addItem ("Low-shelf", 1); cbFilterType[i].addItem ("Peak", 2); cbFilterType[i].addItem ("High-shelf", 3); } cbFilterType[i].setJustificationType (juce::Justification::centred); cbFilterTypeAttachment[i].reset (new ComboBoxAttachment (valueTreeState, "filterType" + juce::String (i), cbFilterType[i])); addAndMakeVisible (&slFilterFrequency[i]); slFilterFrequency[i].setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); slFilterFrequency[i].setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); slFilterFrequency[i].setColour (juce::Slider::rotarySliderOutlineColourId, colours[i]); slFilterFrequencyAttachment[i].reset ( new SliderAttachment (valueTreeState, "filterFrequency" + juce::String (i), slFilterFrequency[i])); addAndMakeVisible (&slFilterQ[i]); slFilterQ[i].setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); slFilterQ[i].setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); slFilterQ[i].setColour (juce::Slider::rotarySliderOutlineColourId, colours[i]); slFilterQAttachment[i].reset ( new SliderAttachment (valueTreeState, "filterQ" + juce::String (i), slFilterQ[i])); addAndMakeVisible (&slFilterGain[i]); slFilterGain[i].setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); slFilterGain[i].setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); slFilterGain[i].setColour (juce::Slider::rotarySliderOutlineColourId, colours[i]); slFilterGainAttachment[i].reset (new SliderAttachment (valueTreeState, "filterGain" + juce::String (i), slFilterGain[i])); updateEnablement (i, enabled); } cbFilterType[0].addListener (this); cbFilterType[numFilterBands - 1].addListener (this); updateFilterVisualizer(); // start timer after everything is set up properly startTimer (20); } MultiEQAudioProcessorEditor::~MultiEQAudioProcessorEditor() { setLookAndFeel (nullptr); } //============================================================================== void MultiEQAudioProcessorEditor::paint (juce::Graphics& g) { g.fillAll (globalLaF.ClBackground); } void MultiEQAudioProcessorEditor::resized() { DBG ("GUI resized to " << getLocalBounds().getWidth() << "x" << getLocalBounds().getHeight()); // ============ BEGIN: header and footer ============ const int leftRightMargin = 30; const int headerHeight = 60; const int footerHeight = 25; juce::Rectangle area (getLocalBounds()); juce::Rectangle footerArea (area.removeFromBottom (footerHeight)); footer.setBounds (footerArea); area.removeFromLeft (leftRightMargin); area.removeFromRight (leftRightMargin); juce::Rectangle headerArea = area.removeFromTop (headerHeight); title.setBounds (headerArea); area.removeFromTop (10); area.removeFromBottom (5); // =========== END: header and footer ================= // try to not use explicit coordinates to position your GUI components // the removeFrom...() methods are quite handy to create scalable areas // best practice would be the use of flexBoxes... // the following is medium level practice ;-) juce::Rectangle filterArea = area; { // upper row juce::Rectangle cbArea (filterArea.removeFromBottom (50)); for (int i = 0; i < numFilterBands; ++i) { slFilterFrequency[i].setBounds (cbArea.removeFromLeft (42)); slFilterGain[i].setBounds (cbArea.removeFromLeft (42)); slFilterQ[i].setBounds (cbArea.removeFromLeft (42)); cbArea.removeFromLeft (14); } cbArea = filterArea.removeFromBottom (21); cbArea.removeFromLeft (3); for (int i = 0; i < numFilterBands; ++i) { tbFilterOn[i].setBounds (cbArea.removeFromLeft (18)); cbArea.removeFromLeft (5); cbFilterType[i].setBounds (cbArea.removeFromLeft (92).reduced (0, 3)); cbArea.removeFromLeft (25); } fv.setBounds (filterArea); } } void MultiEQAudioProcessorEditor::updateFilterVisualizer() { auto filterPtr = processor.getFilter(); if (filterPtr != nullptr) { filterPtr->updateGuiCoefficients(); fv.setSampleRate (processor.getSampleRate()); for (int f = 0; f < numFilterBands; ++f) fv.replaceCoefficients (f, filterPtr->getCoefficientsForGui (f)); } } void MultiEQAudioProcessorEditor::timerCallback() { // === update titleBar widgets according to available input/output channel counts title.setMaxSize (processor.getMaxSize()); // ========================================== if (processor.repaintFV.get()) { processor.repaintFV = false; updateFilterVisualizer(); } } void MultiEQAudioProcessorEditor::updateEnablement (const int idx, const bool shouldBeEnabled) { slFilterFrequency[idx].setEnabled (shouldBeEnabled); slFilterGain[idx].setEnabled (shouldBeEnabled && gainEnabled[idx]); slFilterQ[idx].setEnabled (shouldBeEnabled && qEnabled[idx]); cbFilterType[idx].setEnabled (shouldBeEnabled); fv.enableFilter (idx, shouldBeEnabled); } void MultiEQAudioProcessorEditor::buttonClicked (juce::Button* button) { for (int f = 0; f < numFilterBands; ++f) { if (button == &tbFilterOn[f]) { const bool state = button->getToggleState(); updateEnablement (f, state); } } } void MultiEQAudioProcessorEditor::comboBoxChanged (juce::ComboBox* comboBoxThatHasChanged) { int idx = -1; if (comboBoxThatHasChanged == &cbFilterType[0]) idx = 0; else if (comboBoxThatHasChanged == &cbFilterType[numFilterBands - 1]) idx = numFilterBands - 1; else return; const auto id = comboBoxThatHasChanged->getSelectedId(); if (id == 2 || id == 4) // 1st order LP/HP or LR filter { qEnabled[idx] = false; gainEnabled[idx] = false; } else if (id == 3) // 2nd order LP/HP { qEnabled[idx] = true; gainEnabled[idx] = false; } else // Shelving filter { qEnabled[idx] = true; gainEnabled[idx] = true; } updateEnablement (idx, tbFilterOn[idx].getToggleState()); } IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/MultiEQ/Source/PluginProcessor.h0000664002537200253720000001005415257173642030716 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once #include #include "../../resources/AudioProcessorBase.h" #include "../../resources/FilterVisualizerHelper.h" #include "../../resources/MultiChannelFilter.h" #define ProcessorClass MultiEQAudioProcessor #define numFilterBands 6 using namespace juce::dsp; //============================================================================== class MultiEQAudioProcessor : public AudioProcessorBase, IOTypes::AudioChannels<64>> { public: constexpr static int numberOfInputChannels = 64; constexpr static int numberOfOutputChannels = 64; //============================================================================== MultiEQAudioProcessor(); ~MultiEQAudioProcessor() override; //============================================================================== void prepareToPlay (double sampleRate, int samplesPerBlock) override; void releaseResources() override; void processBlock (juce::AudioBuffer&, juce::MidiBuffer&) override; //============================================================================== juce::AudioProcessorEditor* createEditor() override; bool hasEditor() const override; //============================================================================== int getNumPrograms() override; int getCurrentProgram() override; void setCurrentProgram (int index) override; const juce::String getProgramName (int index) override; void changeProgramName (int index, const juce::String& newName) override; //============================================================================== void getStateInformation (juce::MemoryBlock& destData) override; void setStateInformation (const void* data, int sizeInBytes) override; //============================================================================== void parameterChanged (const juce::String& parameterID, float newValue) override; void updateBuffers() override; // use this to implement a buffer update method //======= Parameters =========================================================== std::vector> createParameterLayout(); //============================================================================== MultiChannelFilter* getFilter() { return &MCFilter; } // FV repaint flag juce::Atomic repaintFV = true; private: // list of used audio parameters std::atomic* inputChannelsSetting; std::atomic* filterEnabled[numFilterBands]; std::atomic* filterType[numFilterBands]; std::atomic* filterFrequency[numFilterBands]; std::atomic* filterQ[numFilterBands]; std::atomic* filterGain[numFilterBands]; juce::Atomic userHasChangedFilterSettings = true; MultiChannelFilter MCFilter; FilterParameters filterParameters[numFilterBands]; //============================================================================== JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MultiEQAudioProcessor) }; IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/MultiEQ/Source/PluginEditor.h0000664002537200253720000001076515257173642030176 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once #include "../JuceLibraryCode/JuceHeader.h" #include "PluginProcessor.h" //Plugin Design Essentials #include "../../resources/customComponents/TitleBar.h" #include "../../resources/lookAndFeel/IEM_LaF.h" //Custom juce::Components #include "../../resources/customComponents/FilterVisualizer.h" #include "../../resources/customComponents/OnOffButton.h" #include "../../resources/customComponents/ReverseSlider.h" #include "../../resources/customComponents/SimpleLabel.h" typedef ReverseSlider::SliderAttachment SliderAttachment; // all ReverseSliders will make use of the parameters' valueToText() function typedef juce::AudioProcessorValueTreeState::ComboBoxAttachment ComboBoxAttachment; typedef juce::AudioProcessorValueTreeState::ButtonAttachment ButtonAttachment; //============================================================================== /** */ class MultiEQAudioProcessorEditor : public juce::AudioProcessorEditor, private juce::Timer, private juce::Button::Listener, private juce::ComboBox::Listener { public: MultiEQAudioProcessorEditor (MultiEQAudioProcessor&, juce::AudioProcessorValueTreeState&); ~MultiEQAudioProcessorEditor() override; //============================================================================== void paint (juce::Graphics&) override; void resized() override; void extracted(); void timerCallback() override; void extracted (int f, bool state); void buttonClicked (juce::Button* button) override; void comboBoxChanged (juce::ComboBox* comboBoxThatHasChanged) override; void updateFilterVisualizer(); void updateEnablement (const int idx, const bool shouldBeEnabled); private: // ====================== begin essentials ================== // lookAndFeel class with the IEM plug-in suite design LaF globalLaF; // stored references to the AudioProcessor and juce::ValueTreeState holding all the parameters MultiEQAudioProcessor& processor; juce::AudioProcessorValueTreeState& valueTreeState; /* title and footer component title component can hold different widgets for in- and output: - NoIOWidget (if there's no need for an input or output widget) - AudioChannelsIOWidget - AmbisonicIOWidget - DirectivitiyIOWidget */ TitleBar, NoIOWidget> title; OSCFooter footer; // =============== end essentials ============ // Attachments to create a connection between IOWidgets comboboxes // and the associated parameters std::unique_ptr cbNumInputChannelsAttachment; FilterVisualizer fv; juce::TooltipWindow tooltipWin; OnOffButton tbFilterOn[numFilterBands]; juce::ComboBox cbFilterType[numFilterBands]; ReverseSlider slFilterFrequency[numFilterBands]; ReverseSlider slFilterQ[numFilterBands]; ReverseSlider slFilterGain[numFilterBands]; std::unique_ptr tbFilterOnAttachment[numFilterBands]; std::unique_ptr cbFilterTypeAttachment[numFilterBands]; std::unique_ptr slFilterFrequencyAttachment[numFilterBands]; std::unique_ptr slFilterQAttachment[numFilterBands]; std::unique_ptr slFilterGainAttachment[numFilterBands]; bool gainEnabled[numFilterBands]; bool qEnabled[numFilterBands]; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MultiEQAudioProcessorEditor) }; IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/MultiEQ/CMakeLists.txt0000664002537200253720000000363615257173642026717 0ustar zmoelnigzmoelnigset (PLUGIN_TARGET "") if (IEM_FORMATS) juce_add_plugin (MultiEQ PLUGIN_MANUFACTURER_CODE IEMA PLUGIN_CODE MuEQ ICON_BIG "../resources/Standalone/IEMPluginSuiteSmall.png" ICON_SMALL "../resources/Standalone/IEMPluginSuiteSmall.png" COMPANY_NAME "IEM" PRODUCT_NAME "MultiEQ" FORMATS ${IEM_FORMATS} VERSION ${MultiEQ_VERSION} LV2URI "http://plugins.iem.at/MultiEQ" VST2_CATEGORY kPlugSurroundFx kPlugCategSpacializer kPlugCategEffect VST3_CATEGORIES Spatial Surround Fx EQ Filter AAX_CATEGORY SoundField EQ) list (APPEND PLUGIN_TARGET MultiEQ) endif() foreach (TARGET IN LISTS PLUGIN_TARGET) juce_generate_juce_header(${TARGET}) target_sources(${TARGET} PRIVATE Source/PluginEditor.cpp Source/PluginEditor.h Source/PluginProcessor.cpp Source/PluginProcessor.h ../resources/OSC/OSCInputStream.h ../resources/OSC/OSCParameterInterface.cpp ../resources/OSC/OSCParameterInterface.h ../resources/OSC/OSCStatus.cpp ../resources/OSC/OSCStatus.h ../resources/OSC/OSCUtilities.h ../resources/efficientSHvanilla.cpp ) target_compile_definitions(${TARGET} PRIVATE JUCE_USE_CURL=0 JUCE_WEB_BROWSER=0 JUCE_USE_CUSTOM_PLUGIN_STANDALONE_APP=1 JUCE_USE_FLAC=0 JUCE_USE_OGGVORBIS=0 JUCE_USE_MP3AUDIOFORMAT=0 JUCE_USE_LAME_AUDIO_FORMAT=0 JUCE_USE_WINDOWS_MEDIA_FORMAT=0 JUCE_VST3_CAN_REPLACE_VST2=0) target_include_directories(${TARGET} PRIVATE Source) target_link_libraries(${TARGET} PRIVATE LAF_fonts IEM_logo juce::juce_audio_utils juce::juce_audio_plugin_client juce::juce_osc juce::juce_dsp juce::juce_opengl juce::juce_recommended_config_flags juce::juce_recommended_lto_flags) endforeach() IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/JUCE/0000775002537200253720000000000015257173642023355 5ustar zmoelnigzmoelnigIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/MultiEncoder/0000775002537200253720000000000015257173642025221 5ustar zmoelnigzmoelnigIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/MultiEncoder/Source/0000775002537200253720000000000015257173642026461 5ustar zmoelnigzmoelnig././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/MultiEncoder/Source/PluginProcessor.cppIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/MultiEncoder/Source/PluginProcessor.0000664002537200253720000007362215257173642031632 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #include "PluginProcessor.h" #include "PluginEditor.h" #include //============================================================================== MultiEncoderAudioProcessor::MultiEncoderAudioProcessor() : AudioProcessorBase ( #ifndef JucePlugin_PreferredChannelConfigurations BusesProperties() #if ! JucePlugin_IsMidiEffect #if ! JucePlugin_IsSynth .withInput ("Input", ((juce::PluginHostType::getPluginLoadedAs() == juce::AudioProcessor::wrapperType_VST3) ? juce::AudioChannelSet::mono() : juce::AudioChannelSet::ambisonic (7)), true) #endif .withOutput ("Output", ((juce::PluginHostType::getPluginLoadedAs() == juce::AudioProcessor::wrapperType_VST3) ? juce::AudioChannelSet::ambisonic (1) : juce::AudioChannelSet::ambisonic (7)), true) #endif , #endif createParameterLayout()), rms (64) { // global properties juce::PropertiesFile::Options options; options.applicationName = "MultiEncoder"; options.filenameSuffix = "settings"; options.folderName = "IEM"; options.osxLibrarySubFolder = "Preferences"; properties.reset (new juce::PropertiesFile (options)); lastDir = juce::File (properties->getValue ("presetFolder")); parameters.addParameterListener ("masterAzimuth", this); parameters.addParameterListener ("masterElevation", this); parameters.addParameterListener ("masterRoll", this); parameters.addParameterListener ("lockedToMaster", this); parameters.addParameterListener ("orderSetting", this); parameters.addParameterListener ("inputSetting", this); muteMask.clear(); soloMask.clear(); for (int i = 0; i < maxNumberOfInputs; ++i) { azimuth[i] = parameters.getRawParameterValue ("azimuth" + juce::String (i)); elevation[i] = parameters.getRawParameterValue ("elevation" + juce::String (i)); gain[i] = parameters.getRawParameterValue ("gain" + juce::String (i)); mute[i] = parameters.getRawParameterValue ("mute" + juce::String (i)); solo[i] = parameters.getRawParameterValue ("solo" + juce::String (i)); if (*mute[i] >= 0.5f) muteMask.setBit (i); if (*solo[i] >= 0.5f) soloMask.setBit (i); parameters.addParameterListener ("azimuth" + juce::String (i), this); parameters.addParameterListener ("elevation" + juce::String (i), this); parameters.addParameterListener ("mute" + juce::String (i), this); parameters.addParameterListener ("solo" + juce::String (i), this); } masterAzimuth = parameters.getRawParameterValue ("masterAzimuth"); masterElevation = parameters.getRawParameterValue ("masterElevation"); masterRoll = parameters.getRawParameterValue ("masterRoll"); lockedToMaster = parameters.getRawParameterValue ("locking"); inputSetting = parameters.getRawParameterValue ("inputSetting"); orderSetting = parameters.getRawParameterValue ("orderSetting"); useSN3D = parameters.getRawParameterValue ("useSN3D"); analyzeRMS = parameters.getRawParameterValue ("analyzeRMS"); dynamicRange = parameters.getRawParameterValue ("dynamicRange"); processorUpdatingParams = false; yprInput = true; //input from ypr for (int i = 0; i < maxNumberOfInputs; ++i) { juce::FloatVectorOperations::clear (SH[i], 64); _gain[i] = 0.0f; //elemActive[i] = *gain[i] >= -59.9f; elementColours[i] = juce::Colours::cyan; } updateQuaternions(); std::fill (rms.begin(), rms.end(), 0.0f); } MultiEncoderAudioProcessor::~MultiEncoderAudioProcessor() { } int MultiEncoderAudioProcessor::getNumPrograms() { return 6; } int MultiEncoderAudioProcessor::getCurrentProgram() { return 0; } void MultiEncoderAudioProcessor::setCurrentProgram (int index) { juce::String preset; switch (index) { case 0: return; case 1: preset = juce::String (Presets::t_design_12ch_json, Presets::t_design_12ch_jsonSize); break; case 2: preset = juce::String (Presets::t_design_24ch_json, Presets::t_design_24ch_jsonSize); break; case 3: preset = juce::String (Presets::t_design_36ch_json, Presets::t_design_36ch_jsonSize); break; case 4: preset = juce::String (Presets::t_design_48ch_json, Presets::t_design_48ch_jsonSize); break; case 5: preset = juce::String (Presets::t_design_60ch_json, Presets::t_design_60ch_jsonSize); break; default: preset = ""; break; } loadConfigFromString (preset); } const juce::String MultiEncoderAudioProcessor::getProgramName (int index) { switch (index) { case 0: return "---"; case 1: return "t-design (12 channels)"; case 2: return "t-design (24 channels)"; case 3: return "t-design (36 channels)"; case 4: return "t-design (48 channels)"; case 5: return "t-design (60 channels)"; default: return {}; } } void MultiEncoderAudioProcessor::changeProgramName (int index, const juce::String& newName) { } //============================================================================== void MultiEncoderAudioProcessor::prepareToPlay (double sampleRate, int samplesPerBlock) { checkInputAndOutput (this, *inputSetting, *orderSetting, true); timeConstant = exp (-1.0 / (sampleRate * 0.1 / samplesPerBlock)); // 100ms RMS averaging std::fill (rms.begin(), rms.end(), 0.0f); } void MultiEncoderAudioProcessor::releaseResources() { // When playback stops, you can use this as an opportunity to free up any // spare memory, etc. } void MultiEncoderAudioProcessor::processBlock (juce::AudioSampleBuffer& buffer, juce::MidiBuffer& midiMessages) { juce::ScopedNoDenormals noDenormals; checkInputAndOutput (this, *inputSetting, *orderSetting); const int nChOut = juce::jmin (buffer.getNumChannels(), output.getNumberOfChannels()); const int nChIn = juce::jmin (buffer.getNumChannels(), input.getSize()); const int ambisonicOrder = output.getOrder(); if (*analyzeRMS > 0.5f && ! isNonRealtime()) { const float oneMinusTimeConstant = 1.0f - timeConstant; for (int ch = 0; ch < nChIn; ++ch) rms[ch] = timeConstant * rms[ch] + oneMinusTimeConstant * buffer.getRMSLevel (ch, 0, buffer.getNumSamples()); } for (int i = 0; i < nChIn; ++i) bufferCopy.copyFrom (i, 0, buffer.getReadPointer (i), buffer.getNumSamples()); buffer.clear(); for (int i = 0; i < nChIn; ++i) { juce::FloatVectorOperations::copy (_SH[i], SH[i], nChOut); float currGain = 0.0f; if (! soloMask.isZero()) { if (soloMask[i]) currGain = juce::Decibels::decibelsToGain (gain[i]->load()); } else { if (! muteMask[i]) currGain = juce::Decibels::decibelsToGain (gain[i]->load()); } const float azimuthInRad = juce::degreesToRadians (azimuth[i]->load()); const float elevationInRad = juce::degreesToRadians (elevation[i]->load()); const juce::Vector3D pos { Conversions::sphericalToCartesian (azimuthInRad, elevationInRad) }; SHEval (ambisonicOrder, pos.x, pos.y, pos.z, SH[i]); if (*useSN3D >= 0.5f) juce::FloatVectorOperations::multiply (SH[i], SH[i], n3d2sn3d, nChOut); const float* inpReadPtr = bufferCopy.getReadPointer (i); for (int ch = 0; ch < nChOut; ++ch) buffer.addFromWithRamp (ch, 0, inpReadPtr, buffer.getNumSamples(), _SH[i][ch] * _gain[i], SH[i][ch] * currGain); _gain[i] = currGain; } } //============================================================================== bool MultiEncoderAudioProcessor::hasEditor() const { return true; // (change this to false if you choose to not supply an editor) } juce::AudioProcessorEditor* MultiEncoderAudioProcessor::createEditor() { return new MultiEncoderAudioProcessorEditor (*this, parameters); } void MultiEncoderAudioProcessor::parameterChanged (const juce::String& parameterID, float newValue) { DBG (parameterID << ": " << newValue); if (parameterID == "inputSetting" || parameterID == "orderSetting") { userChangedIOSettings = true; // hosts might not call processBlock() while the transport is stopped, // so apply the new I/O configuration right away when on the message thread if (juce::MessageManager::existsAndIsCurrentThread()) { const juce::ScopedLock lock (getCallbackLock()); checkInputAndOutput (this, *inputSetting, *orderSetting); } } else if (parameterID.startsWith ("solo")) { const int id = parameterID.substring (4).getIntValue(); soloMask.setBit (id, newValue >= 0.5f); soloMuteChanged = true; } else if (parameterID.startsWith ("mute")) { const int id = parameterID.substring (4).getIntValue(); muteMask.setBit (id, newValue >= 0.5f); soloMuteChanged = true; } else if (parameterID == "lockedToMaster") { if (newValue >= 0.5f && ! locked) { const int nChIn = input.getSize(); float ypr[3]; ypr[2] = 0.0f; for (int i = 0; i < nChIn; ++i) { iem::Quaternion masterQuat; float masterypr[3]; masterypr[0] = juce::degreesToRadians (masterAzimuth->load()); masterypr[1] = juce::degreesToRadians (masterElevation->load()); masterypr[2] = -juce::degreesToRadians (masterRoll->load()); masterQuat.fromYPR (masterypr); masterQuat.conjugate(); ypr[0] = juce::degreesToRadians (azimuth[i]->load()); ypr[1] = juce::degreesToRadians (elevation[i]->load()); quats[i].fromYPR (ypr); quats[i] = masterQuat * quats[i]; } locked = true; } else if (newValue < 0.5f) locked = false; } else if (locked && ((parameterID == "masterAzimuth") || (parameterID == "masterElevation") || (parameterID == "masterRoll"))) { if (dontTriggerMasterUpdate) return; moving = true; iem::Quaternion masterQuat; float ypr[3]; ypr[0] = juce::degreesToRadians (masterAzimuth->load()); ypr[1] = juce::degreesToRadians (masterElevation->load()); ypr[2] = -juce::degreesToRadians (masterRoll->load()); masterQuat.fromYPR (ypr); const int nChIn = input.getSize(); for (int i = 0; i < nChIn; ++i) { iem::Quaternion temp = masterQuat * quats[i]; temp.toYPR (ypr); parameters.getParameter ("azimuth" + juce::String (i)) ->setValueNotifyingHost (parameters.getParameterRange ("azimuth" + juce::String (i)) .convertTo0to1 (juce::radiansToDegrees (ypr[0]))); parameters.getParameter ("elevation" + juce::String (i)) ->setValueNotifyingHost ( parameters.getParameterRange ("elevation" + juce::String (i)) .convertTo0to1 (juce::radiansToDegrees (ypr[1]))); } moving = false; updateSphere = true; } else if (locked && ! moving && (parameterID.startsWith ("azimuth") || parameterID.startsWith ("elevation"))) { float ypr[3]; ypr[2] = 0.0f; const int nChIn = input.getSize(); for (int i = 0; i < nChIn; ++i) { iem::Quaternion masterQuat; float masterypr[3]; masterypr[0] = juce::degreesToRadians (masterAzimuth->load()); masterypr[1] = juce::degreesToRadians (masterElevation->load()); masterypr[2] = -juce::degreesToRadians (masterRoll->load()); masterQuat.fromYPR (masterypr); masterQuat.conjugate(); ypr[0] = juce::degreesToRadians (azimuth[i]->load()); ypr[1] = juce::degreesToRadians (elevation[i]->load()); quats[i].fromYPR (ypr); quats[i] = masterQuat * quats[i]; } updateSphere = true; } else if (parameterID.startsWith ("azimuth") || parameterID.startsWith ("elevation") || (parameterID == "masterAzimuth") || (parameterID == "masterElevation")) { updateSphere = true; } } //============================================================================== void MultiEncoderAudioProcessor::getStateInformation (juce::MemoryBlock& destData) { auto state = parameters.copyState(); for (int i = 0; i < maxNumberOfInputs; ++i) state.setProperty ("colour" + juce::String (i), elementColours[i].toString(), nullptr); auto oscConfig = state.getOrCreateChildWithName ("OSCConfig", nullptr); oscConfig.copyPropertiesFrom (oscParameterInterface.getConfig(), nullptr); std::unique_ptr xml (state.createXml()); copyXmlToBinary (*xml, destData); } void MultiEncoderAudioProcessor::setStateInformation (const void* data, int sizeInBytes) { std::unique_ptr xmlState (getXmlFromBinary (data, sizeInBytes)); if (xmlState != nullptr) if (xmlState->hasTagName (parameters.state.getType())) { dontTriggerMasterUpdate = true; parameters.state = juce::ValueTree::fromXml (*xmlState); dontTriggerMasterUpdate = false; updateQuaternions(); for (int i = 0; i < maxNumberOfInputs; ++i) if (parameters.state.getProperty ("colour" + juce::String (i)).toString() != "0") elementColours[i] = juce::Colour::fromString ( parameters.state.getProperty ("colour" + juce::String (i)).toString()); else elementColours[i] = juce::Colours::cyan; updateColours.store (true, std::memory_order_release); if (parameters.state.hasProperty ("OSCPort")) // legacy { oscParameterInterface.getOSCReceiver().connect ( parameters.state.getProperty ("OSCPort", juce::var (-1))); parameters.state.removeProperty ("OSCPort", nullptr); } auto oscConfig = parameters.state.getChildWithName ("OSCConfig"); if (oscConfig.isValid()) oscParameterInterface.setConfig (oscConfig); } } //============================================================================== // This creates new instances of the plugin.. juce::AudioProcessor* JUCE_CALLTYPE createPluginFilter() { return new MultiEncoderAudioProcessor(); } void MultiEncoderAudioProcessor::updateBuffers() { DBG ("IOHelper: input size: " << input.getSize()); DBG ("IOHelper: output size: " << output.getSize()); const int nChIn = input.getSize(); const int _nChIn = input.getPreviousSize(); bufferCopy.setSize (nChIn, getBlockSize()); // disable solo and mute for deleted input channels for (int i = nChIn; i < _nChIn; ++i) { parameters.getParameter ("mute" + juce::String (i))->setValueNotifyingHost (0.0f); parameters.getParameter ("solo" + juce::String (i))->setValueNotifyingHost (0.0f); } }; void MultiEncoderAudioProcessor::updateQuaternions() { float ypr[3]; ypr[2] = 0.0f; iem::Quaternion masterQuat; float masterypr[3]; masterypr[0] = juce::degreesToRadians (masterAzimuth->load()); masterypr[1] = juce::degreesToRadians (masterElevation->load()); masterypr[2] = -juce::degreesToRadians (masterRoll->load()); masterQuat.fromYPR (masterypr); masterQuat.conjugate(); for (int i = 0; i < maxNumberOfInputs; ++i) { ypr[0] = juce::degreesToRadians (azimuth[i]->load()); ypr[1] = juce::degreesToRadians (elevation[i]->load()); quats[i].fromYPR (ypr); quats[i] = masterQuat * quats[i]; } } //============================================================================== std::vector> MultiEncoderAudioProcessor::createParameterLayout() { // add your audio parameters here std::vector> params; params.push_back (OSCParameterInterface::createParameterTheOldWay ( "inputSetting", "Number of input channels ", "", juce::NormalisableRange (0.0f, maxNumberOfInputs, 1.0f), startNnumberOfInputs, [] (float value) { return juce::String (value); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "orderSetting", "Ambisonics Order", "", juce::NormalisableRange (0.0f, 8.0f, 1.0f), 0.0f, [] (float value) { if (value >= 0.5f && value < 1.5f) return "0th"; else if (value >= 1.5f && value < 2.5f) return "1st"; else if (value >= 2.5f && value < 3.5f) return "2nd"; else if (value >= 3.5f && value < 4.5f) return "3rd"; else if (value >= 4.5f && value < 5.5f) return "4th"; else if (value >= 5.5f && value < 6.5f) return "5th"; else if (value >= 6.5f && value < 7.5f) return "6th"; else if (value >= 7.5f) return "7th"; else return "Auto"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "useSN3D", "Normalization", "", juce::NormalisableRange (0.0f, 1.0f, 1.0f), 1.0f, [] (float value) { if (value >= 0.5f) return "SN3D"; else return "N3D"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "masterAzimuth", "Master azimuth angle", juce::CharPointer_UTF8 (R"(°)"), juce::NormalisableRange (-180.0f, 180.0f, 0.01f), 0.0f, [] (float value) { return juce::String (value, 2); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "masterElevation", "Master elevation angle", juce::CharPointer_UTF8 (R"(°)"), juce::NormalisableRange (-180.0f, 180.0f, 0.01f), 0.0f, [] (float value) { return juce::String (value, 2); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "masterRoll", "Master roll angle", juce::CharPointer_UTF8 (R"(°)"), juce::NormalisableRange (-180.0f, 180.0f, 0.01f), 0.0f, [] (float value) { return juce::String (value, 2); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "lockedToMaster", "Lock Directions relative to Master", "", juce::NormalisableRange (0.0f, 1.0f, 1.0f), 0.0f, [] (float value) { return (value >= 0.5f) ? "locked" : "not locked"; }, nullptr)); for (int i = 0; i < maxNumberOfInputs; ++i) { params.push_back (OSCParameterInterface::createParameterTheOldWay ( "azimuth" + juce::String (i), "Azimuth angle " + juce::String (i + 1), juce::CharPointer_UTF8 (R"(°)"), juce::NormalisableRange (-180.0f, 180.0f, 0.01f), 0.0, [] (float value) { return juce::String (value, 2); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "elevation" + juce::String (i), "Elevation angle " + juce::String (i + 1), juce::CharPointer_UTF8 (R"(°)"), juce::NormalisableRange (-180.0f, 180.0f, 0.01f), 0.0, [] (float value) { return juce::String (value, 2); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "gain" + juce::String (i), "Gain " + juce::String (i + 1), "dB", juce::NormalisableRange (-60.0f, 10.0f, 0.1f), 0.0f, [] (float value) { return (value >= -59.9f) ? juce::String (value, 1) : "-inf"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "mute" + juce::String (i), "Mute input " + juce::String (i + 1), "", juce::NormalisableRange (0.0f, 1.0f, 1.0f), 0.0f, [] (float value) { return (value >= 0.5f) ? "muted" : "not muted"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "solo" + juce::String (i), "Solo input " + juce::String (i + 1), "", juce::NormalisableRange (0.0f, 1.0f, 1.0f), 0.0f, [] (float value) { return (value >= 0.5f) ? "soloed" : "not soloed"; }, nullptr)); } params.push_back (OSCParameterInterface::createParameterTheOldWay ( "analyzeRMS", "Analzes RMS", "", juce::NormalisableRange (0.0f, 1.0f, 1.0f), 0.0f, [] (float value) { return (value >= 0.5f) ? "on" : "off"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "peakLevel", "Peak level", "dB", juce::NormalisableRange (-50.0f, 10.0f, 0.1f), 0.0, [] (float value) { return juce::String (value, 1); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "dynamicRange", "Dynamic juce::Range", "dB", juce::NormalisableRange (10.0f, 60.0f, 1.f), 35.0, [] (float value) { return juce::String (value, 0); }, nullptr)); return params; } //============================================================================== juce::Result MultiEncoderAudioProcessor::loadConfiguration (const juce::File& presetFile) { if (! presetFile.exists()) { return juce::Result::fail ("File does not exist!"); } const juce::String jsonString = presetFile.loadFileAsString(); return loadConfigFromString (jsonString); } juce::Result MultiEncoderAudioProcessor::loadConfigFromString (juce::String configString) { if (configString.isEmpty()) return juce::Result::fail ("Empty configuration string!"); juce::var parsedJson; juce::Result result = juce::JSON::parse (configString, parsedJson); if (result.failed()) return result; juce::ValueTree newSources ("NewSources"); result = ConfigurationHelper::parseVarForLoudspeakerLayout (parsedJson, newSources, nullptr); if (result.wasOk()) { int nSrc = 0; const auto nElements = newSources.getNumChildren(); for (int i = 0; i < nElements; ++i) { auto src = newSources.getChild (i); const int ch = src.getProperty ("Channel"); const bool isImaginary = src.getProperty ("Imaginary"); if (! isImaginary && ch > nSrc) nSrc = ch; } DBG (nSrc << " Sources!"); parameters.getParameterAsValue ("inputSetting").setValue (nSrc); for (int s = 0; s < nSrc; ++s) parameters.getParameterAsValue ("mute" + juce::String (s)).setValue (1); for (int e = 0; e < nElements; ++e) { const auto src = newSources.getChild (e); const int ch = static_cast (src.getProperty ("Channel", 0)) - 1; const bool isImaginary = src.getProperty ("Imaginary"); if (isImaginary || ch < 0 || ch >= 64) continue; parameters.getParameterAsValue ("mute" + juce::String (ch)).setValue (0); float azi = src.getProperty ("Azimuth", 0.0f); float ele = src.getProperty ("Elevation", 0.0f); if (azi > 180.0f || azi < -180.0f || ele > 90.0f || ele < -90.0f) wrapSphericalCoordinates (&azi, &ele); parameters.getParameterAsValue ("azimuth" + juce::String (ch)).setValue (azi); parameters.getParameterAsValue ("elevation" + juce::String (ch)).setValue (ele); } } return result; } void MultiEncoderAudioProcessor::wrapSphericalCoordinates (float* azi, float* ele) { // Wrap elevation if (*ele > 180.0f || *ele < -180.0f) { float fullRotations = std::copysign (std::ceil (std::abs (*ele) / 360.0f), *ele); *ele -= fullRotations * 360.0f; } if (*ele > 90.0f || *ele < -90.0f) { *ele = std::copysign (180.0 - std::abs (*ele), *ele); *azi += 180.0f; } // Wrap azimuth if (*azi > 180.0f || *azi < -180.0f) { float fullRotations = std::copysign (std::ceil (std::abs (*azi) / 360.0f), *azi); *azi -= fullRotations * 360.0f; } } void MultiEncoderAudioProcessor::setLastDir (juce::File newLastDir) { lastDir = newLastDir; const juce::var v (lastDir.getFullPathName()); properties->setValue ("presetFolder", v); } inline const bool MultiEncoderAudioProcessor::processNotYetConsumedOSCMessage (const juce::OSCMessage& message) { const auto invalidUint8 = [] (int value) { return value < 0 || value > 255; }; if (const auto address = message.getAddressPattern().toString(); address.startsWith ("/MultiEncoder/color")) { if (message.size() == 0) { DBG ("OSC Message: /color without arguments"); return false; } const auto index = address.substring (19).getIntValue(); if (index < 0 || index >= maxNumberOfInputs) { DBG ("OSC Message: Invalid source index to set color: " << index); return false; } if (message[0].isColour()) { const auto color = message[0].getColour(); elementColours[index] = juce::Colour (color.red, color.green, color.blue, color.alpha); updateColours.store (true, std::memory_order_release); return true; } else if (message[0].isString()) { auto colorString = message[0].getString(); if (colorString.startsWith ("#")) colorString = colorString.substring (1); if (colorString.length() == 6) colorString = "FF" + colorString; elementColours[index] = juce::Colour::fromString (colorString); updateColours.store (true, std::memory_order_release); return true; } else if (message.size() == 3 && message[0].isInt32() && message[1].isInt32() && message[2].isInt32()) { const auto red = message[0].getInt32(); const auto green = message[1].getInt32(); const auto blue = message[2].getInt32(); if (invalidUint8 (red) || invalidUint8 (green) || invalidUint8 (blue)) { DBG ("OSC Message: Invalid color values"); return false; } elementColours[index] = juce::Colour ((juce::uint8) red, (juce::uint8) green, (juce::uint8) blue); updateColours.store (true, std::memory_order_release); return true; } else if (message.size() == 4 && message[0].isInt32() && message[1].isInt32() && message[2].isInt32() && message[3].isInt32()) { const auto red = message[0].getInt32(); const auto green = message[1].getInt32(); const auto blue = message[2].getInt32(); const auto alpha = message[3].getInt32(); if (invalidUint8 (red) || invalidUint8 (green) || invalidUint8 (blue) || invalidUint8 (alpha)) { DBG ("OSC Message: Invalid color values"); return false; } elementColours[index] = juce::Colour ((juce::uint8) red, (juce::uint8) green, (juce::uint8) blue, (juce::uint8) alpha); updateColours.store (true, std::memory_order_release); return true; } DBG ("OSC Message: Invalid arguments to set color"); return false; } return false; } IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/MultiEncoder/Source/PluginEditor.cpp0000664002537200253720000004154515257173642031603 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #include "PluginEditor.h" #include "PluginProcessor.h" //============================================================================== MultiEncoderAudioProcessorEditor::MultiEncoderAudioProcessorEditor ( MultiEncoderAudioProcessor& p, juce::AudioProcessorValueTreeState& vts) : juce::AudioProcessorEditor (&p), footer (p.getOSCParameterInterface()), processor (p), valueTreeState (vts), sphere (p.rms), masterElement (*valueTreeState.getParameter ("masterAzimuth"), valueTreeState.getParameterRange ("masterAzimuth"), *valueTreeState.getParameter ("masterElevation"), valueTreeState.getParameterRange ("masterElevation")) { setLookAndFeel (&globalLaF); // ==== SPHERE AND ELEMENTS =============== addAndMakeVisible (&sphere); sphere.addListener (this); sphere.addElement (&masterElement); masterElement.setColour (juce::Colours::black); masterElement.setTextColour (juce::Colours::white); masterElement.setLabel ("M"); encoderList = std::make_unique (p, sphere, &vts); lbAzimuth = std::make_unique (encoderList->getAzimuthArray()); lbElevation = std::make_unique (encoderList->getElevationArray()); lbGain = std::make_unique (encoderList->getGainArray()); // ====================================== addAndMakeVisible (&title); title.setTitle (juce::String ("Multi"), juce::String ("Encoder")); title.setFont (globalLaF.robotoBold, globalLaF.robotoLight); addAndMakeVisible (&footer); tooltipWin.setLookAndFeel (&globalLaF); tooltipWin.setMillisecondsBeforeTipAppears (500); tooltipWin.setOpaque (false); cbNumInputChannelsAttachment.reset ( new ComboBoxAttachment (valueTreeState, "inputSetting", *title.getInputWidgetPtr()->getChannelsCbPointer())); cbNormalizationAtachment.reset ( new ComboBoxAttachment (valueTreeState, "useSN3D", *title.getOutputWidgetPtr()->getNormCbPointer())); cbOrderAtachment.reset ( new ComboBoxAttachment (valueTreeState, "orderSetting", *title.getOutputWidgetPtr()->getOrderCbPointer())); // ======================== Encoder group encoderGroup.setText ("Encoder settings"); encoderGroup.setTextLabelPosition (juce::Justification::centredLeft); encoderGroup.setColour (juce::GroupComponent::outlineColourId, globalLaF.ClSeperator); encoderGroup.setColour (juce::GroupComponent::textColourId, juce::Colours::white); addAndMakeVisible (&encoderGroup); encoderGroup.setVisible (true); addAndMakeVisible (tbImport); tbImport.setButtonText ("IMPORT"); tbImport.setColour (juce::TextButton::buttonColourId, juce::Colours::orange); tbImport.setTooltip ("Imports sources from a configuration file."); tbImport.onClick = [&]() { importLayout(); }; addAndMakeVisible (&viewport); viewport.setViewedComponent (encoderList.get()); // ====================== GRAB GROUP masterGroup.setText ("Master"); masterGroup.setTextLabelPosition (juce::Justification::centredLeft); masterGroup.setColour (juce::GroupComponent::outlineColourId, globalLaF.ClSeperator); masterGroup.setColour (juce::GroupComponent::textColourId, juce::Colours::white); addAndMakeVisible (&masterGroup); masterGroup.setVisible (true); addAndMakeVisible (&slMasterAzimuth); slMasterAzimuthAttachment.reset ( new SliderAttachment (valueTreeState, "masterAzimuth", slMasterAzimuth)); slMasterAzimuth.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); slMasterAzimuth.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); slMasterAzimuth.setReverse (true); slMasterAzimuth.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[0]); slMasterAzimuth.setRotaryParameters (juce::MathConstants::pi, 3 * juce::MathConstants::pi, false); slMasterAzimuth.setTooltip ("Master azimuth angle"); addAndMakeVisible (&slMasterElevation); slMasterElevationAttachment.reset ( new SliderAttachment (valueTreeState, "masterElevation", slMasterElevation)); slMasterElevation.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); slMasterElevation.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); slMasterElevation.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[1]); slMasterElevation.setRotaryParameters (0.5 * juce::MathConstants::pi, 2.5 * juce::MathConstants::pi, false); slMasterElevation.setTooltip ("Master elevation angle"); addAndMakeVisible (&slMasterRoll); slMasterRollAttachment.reset ( new SliderAttachment (valueTreeState, "masterRoll", slMasterRoll)); slMasterRoll.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); slMasterRoll.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); slMasterRoll.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[2]); slMasterRoll.setRotaryParameters (juce::MathConstants::pi, 3 * juce::MathConstants::pi, false); slMasterRoll.setTooltip ("Master roll angle"); addAndMakeVisible (&tbLockedToMaster); tbLockedToMasterAttachment.reset ( new ButtonAttachment (valueTreeState, "lockedToMaster", tbLockedToMaster)); tbLockedToMaster.setName ("locking"); tbLockedToMaster.setButtonText ("Lock Directions"); // ======================== RMS group rmsGroup.setText ("RMS"); rmsGroup.setTextLabelPosition (juce::Justification::centredLeft); rmsGroup.setColour (juce::GroupComponent::outlineColourId, globalLaF.ClSeperator); rmsGroup.setColour (juce::GroupComponent::textColourId, juce::Colours::white); addAndMakeVisible (&rmsGroup); addAndMakeVisible (&slPeakLevel); slPeakLevel.onValueChange = [&]() { sphere.setPeakLevel (slPeakLevel.getValue()); }; slPeakLevelAttachment.reset (new SliderAttachment (valueTreeState, "peakLevel", slPeakLevel)); slPeakLevel.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); slPeakLevel.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 100, 12); slPeakLevel.setTextValueSuffix (" dB"); slPeakLevel.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[2]); addAndMakeVisible (&lbPeakLevel); lbPeakLevel.setText ("Peak"); addAndMakeVisible (&slDynamicRange); slDynamicRange.onValueChange = [&]() { sphere.setDynamicRange (slDynamicRange.getValue()); }; slDynamicRangeAttachment.reset ( new SliderAttachment (valueTreeState, "dynamicRange", slDynamicRange)); slDynamicRange.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); slDynamicRange.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 100, 12); slDynamicRange.setTextValueSuffix (" dB"); slDynamicRange.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[0]); slDynamicRange.setReverse (false); addAndMakeVisible (&lbDynamicRange); lbDynamicRange.setText ("Range"); addAndMakeVisible (&tbAnalyzeRMS); tbAnalyzeRMS.onStateChange = [&]() { sphere.visualizeRMS (tbAnalyzeRMS.getToggleState()); }; tbAnalyzeRMSAttachment.reset ( new ButtonAttachment (valueTreeState, "analyzeRMS", tbAnalyzeRMS)); tbAnalyzeRMS.setButtonText ("Visualize"); // ================ LABELS =================== addAndMakeVisible (&lbNum); lbNum.setText ("#"); addAndMakeVisible (*lbAzimuth); lbAzimuth->setText ("Azimuth"); addAndMakeVisible (*lbElevation); lbElevation->setText ("Elevation"); addAndMakeVisible (*lbGain); lbGain->setText ("Gain"); addAndMakeVisible (&lbMasterAzimuth); lbMasterAzimuth.setText ("Azimuth"); addAndMakeVisible (&lbMasterElevation); lbMasterElevation.setText ("Elevation"); addAndMakeVisible (&lbMasterRoll); lbMasterRoll.setText ("Roll"); setResizeLimits (595, 505, 800, 1200); setResizable (true, true); startTimer (40); } MultiEncoderAudioProcessorEditor::~MultiEncoderAudioProcessorEditor() { setLookAndFeel (nullptr); } //============================================================================== void MultiEncoderAudioProcessorEditor::paint (juce::Graphics& g) { g.fillAll (globalLaF.ClBackground); } void MultiEncoderAudioProcessorEditor::timerCallback() { // === update titleBar widgets according to available input/output channel counts title.setMaxSize (processor.getMaxSize()); // ========================================== const int nChIn = processor.input.getSize(); if (nChIn != lastSetNumChIn) { encoderList->setNumberOfChannels (nChIn); lastSetNumChIn = nChIn; sphere.repaint(); } if (processor.soloMuteChanged) { if (! processor.soloMask.isZero()) { for (int i = 0; i < lastSetNumChIn; ++i) encoderList->sphereElementArray[i]->setActive (processor.soloMask[i]); } else { for (int i = 0; i < lastSetNumChIn; ++i) encoderList->sphereElementArray[i]->setActive (! processor.muteMask[i]); } processor.soloMuteChanged = false; sphere.repaint(); } if (processor.updateColours.exchange (false, std::memory_order_acquire)) { encoderList->updateColours(); sphere.repaint(); } if (tbAnalyzeRMS.getToggleState()) sphere.repaint(); if (processor.updateSphere) { processor.updateSphere = false; sphere.repaint(); } } void MultiEncoderAudioProcessorEditor::mouseWheelOnSpherePannerMoved ( SpherePanner* sphere, const juce::MouseEvent& event, const juce::MouseWheelDetails& wheel) { if (event.mods.isCommandDown() && event.mods.isAltDown()) slMasterRoll.mouseWheelMove (event, wheel); else if (event.mods.isAltDown()) slMasterElevation.mouseWheelMove (event, wheel); else if (event.mods.isCommandDown()) slMasterAzimuth.mouseWheelMove (event, wheel); } void MultiEncoderAudioProcessorEditor::resized() { const int leftRightMargin = 30; const int headerHeight = 60; const int footerHeight = 25; juce::Rectangle area (getLocalBounds()); juce::Rectangle footerArea (area.removeFromBottom (footerHeight)); footer.setBounds (footerArea); area.removeFromLeft (leftRightMargin); area.removeFromRight (leftRightMargin); juce::Rectangle headerArea = area.removeFromTop (headerHeight); title.setBounds (headerArea); area.removeFromTop (10); area.removeFromBottom (5); juce::Rectangle sliderRow; // ============== SIDEBAR RIGHT ==================== // ================================================= juce::Rectangle sideBarArea (area.removeFromRight (225)); //const int sliderHeight = 15; const int rotSliderSpacing = 10; //const int sliderSpacing = 3; const int rotSliderWidth = 42; //const int labelHeight = 15; //const int labelWidth = 20; // -------------- Azimuth Elevation Roll juce::Labels ------------------ juce::Rectangle yprArea (sideBarArea); encoderGroup.setBounds (yprArea); auto headlineArea = yprArea.removeFromTop (25); //for box headline tbImport.setBounds (headlineArea.removeFromRight (60).removeFromTop (15)); sliderRow = yprArea.removeFromTop (15); lbNum.setBounds (sliderRow.removeFromLeft (15)); sliderRow.removeFromLeft (3); lbAzimuth->setBounds (sliderRow.removeFromLeft (rotSliderWidth + 10)); sliderRow.removeFromLeft (rotSliderSpacing - 7); lbElevation->setBounds (sliderRow.removeFromLeft (rotSliderWidth + 13)); sliderRow.removeFromLeft (rotSliderSpacing - 5); lbGain->setBounds (sliderRow.removeFromLeft (rotSliderWidth)); viewport.setBounds (yprArea); // ============== SIDEBAR LEFT ==================== const int masterAreaHeight = 110; area.removeFromRight (10); // spacing juce::Rectangle sphereArea (area); sphereArea.removeFromBottom (masterAreaHeight); if ((float) sphereArea.getWidth() / sphereArea.getHeight() > 1) sphereArea.setWidth (sphereArea.getHeight()); else sphereArea.setHeight (sphereArea.getWidth()); sphere.setBounds (sphereArea); area.removeFromTop (sphereArea.getHeight()); // ============= Settings ========================= auto row = area.removeFromTop (masterAreaHeight); // ------------- Master Grabber ------------------------ juce::Rectangle masterArea (row.removeFromLeft (160)); masterGroup.setBounds (masterArea); masterArea.removeFromTop (25); //for box headline sliderRow = masterArea.removeFromTop (53); slMasterAzimuth.setBounds (sliderRow.removeFromLeft (rotSliderWidth)); sliderRow.removeFromLeft (rotSliderSpacing); slMasterElevation.setBounds (sliderRow.removeFromLeft (rotSliderWidth)); sliderRow.removeFromLeft (rotSliderSpacing); slMasterRoll.setBounds (sliderRow.removeFromLeft (rotSliderWidth)); sliderRow.removeFromLeft (rotSliderSpacing); sliderRow = (masterArea.removeFromTop (12)); lbMasterAzimuth.setBounds (sliderRow.removeFromLeft (rotSliderWidth)); sliderRow.removeFromLeft (rotSliderSpacing - 5); lbMasterElevation.setBounds (sliderRow.removeFromLeft (rotSliderWidth + 10)); sliderRow.removeFromLeft (rotSliderSpacing - 5); lbMasterRoll.setBounds (sliderRow.removeFromLeft (rotSliderWidth)); sliderRow.removeFromLeft (rotSliderSpacing); masterArea.removeFromTop (3); sliderRow = masterArea; tbLockedToMaster.setBounds (sliderRow); // ------------- RMS ------------------------ row.removeFromLeft (10); juce::Rectangle rmsArea = row.removeFromLeft (90); rmsGroup.setBounds (rmsArea); rmsArea.removeFromTop (25); //for box headline sliderRow = rmsArea.removeFromTop (53); slPeakLevel.setBounds (sliderRow.removeFromLeft (rotSliderWidth)); sliderRow.removeFromLeft (rotSliderSpacing); slDynamicRange.setBounds (sliderRow.removeFromLeft (rotSliderWidth)); sliderRow = rmsArea.removeFromTop (12); lbPeakLevel.setBounds (sliderRow.removeFromLeft (rotSliderWidth)); sliderRow.removeFromLeft (rotSliderSpacing); lbDynamicRange.setBounds (sliderRow.removeFromLeft (rotSliderWidth)); rmsArea.removeFromTop (3); sliderRow = rmsArea; tbAnalyzeRMS.setBounds (sliderRow); } void MultiEncoderAudioProcessorEditor::importLayout() { juce::FileChooser myChooser ( "Load configuration...", processor.getLastDir().exists() ? processor.getLastDir() : juce::File::getSpecialLocation (juce::File::userHomeDirectory), "*.json"); if (myChooser.browseForFileToOpen()) { juce::File configFile (myChooser.getResult()); processor.setLastDir (configFile.getParentDirectory()); auto result = processor.loadConfiguration (configFile); if (! result.wasOk()) { auto component = std::make_unique(); component->setMultiLine (true, true); component->setReadOnly (true); component->setText (result.getErrorMessage()); component->setSize (200, 110); auto& myBox = juce::CallOutBox::launchAsynchronously (std::move (component), tbImport.getBounds(), this); myBox.setLookAndFeel (&getLookAndFeel()); } } } IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/MultiEncoder/Source/EncoderList.h0000664002537200253720000003402415257173642031050 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once #include "PluginProcessor.h" #include typedef ReverseSlider::SliderAttachment SliderAttachment; typedef juce::AudioProcessorValueTreeState::ComboBoxAttachment ComboBoxAttachment; typedef juce::AudioProcessorValueTreeState::ButtonAttachment ButtonAttachment; class ColourChangeButton : public juce::TextButton, public juce::ChangeListener { public: ColourChangeButton (MultiEncoderAudioProcessor& p, SpherePanner& sphere, SpherePanner::Element* elem, int i) : juce::TextButton (juce::String (i)), processor (p), id (i), spherePanner (sphere), element (elem) { setSize (10, 24); changeWidthToFitText(); } void clicked() override { auto colourSelector = std::make_unique(); colourSelector->setName ("background"); colourSelector->setCurrentColour (findColour (juce::TextButton::buttonColourId)); colourSelector->addChangeListener (this); colourSelector->setColour (juce::ColourSelector::backgroundColourId, juce::Colours::transparentBlack); colourSelector->setSize (300, 400); juce::CallOutBox::launchAsynchronously (std::move (colourSelector), getScreenBounds(), nullptr); } void changeListenerCallback (juce::ChangeBroadcaster* source) override { if (juce::ColourSelector* cs = dynamic_cast (source)) { processor.elementColours[id - 1] = cs->getCurrentColour(); setColour (juce::TextButton::buttonColourId, cs->getCurrentColour()); element->setColour (cs->getCurrentColour()); setColour (juce::TextButton::textColourOffId, juce::Colours::white.overlaidWith (cs->getCurrentColour()).contrasting()); element->setTextColour ( juce::Colours::white.overlaidWith (cs->getCurrentColour()).contrasting()); spherePanner.repaint(); } } void paint (juce::Graphics& g) override { auto& lf = getLookAndFeel(); juce::Rectangle buttonArea (0.0f, 0.0f, getWidth(), getHeight()); buttonArea.reduce (1.0f, 1.0f); const float width = getWidth() - 2; const float height = getHeight() - 2; if (width > 0 && height > 0) { const float cornerSize = juce::jmin (15.0f, juce::jmin (width, height) * 0.45f); juce::Path outline; outline.addRoundedRectangle (getX(), buttonArea.getY(), buttonArea.getWidth(), buttonArea.getHeight(), cornerSize, cornerSize); g.setColour (findColour (getToggleState() ? buttonOnColourId : buttonColourId)); g.fillPath (outline); } lf.drawButtonText (g, *this, isMouseOver(), isMouseButtonDown()); } private: MultiEncoderAudioProcessor& processor; int id; SpherePanner& spherePanner; SpherePanner::Element* element; }; class EncoderList : public juce::Component { public: EncoderList (MultiEncoderAudioProcessor& p, SpherePanner& sphere, juce::AudioProcessorValueTreeState* vts) : juce::Component(), processor (p), spherePanner (sphere), pVts (vts), nChannels (2) { setNumberOfChannels (nChannels); }; ~EncoderList() {}; void setNumberOfChannels (int nCh) { const int nElements = sphereElementArray.size(); const int nExcessive = nElements - nCh; if (nExcessive > 0) // we have to delete some { for (int i = nCh; i < nElements; ++i) { spherePanner.removeElement (sphereElementArray[i]); } slAzimuthSliderAttachment.removeLast (nExcessive); slElevationAttachmentArray.removeLast (nExcessive); slGainAttachmentArray.removeLast (nExcessive); muteButtonAttachmentArray.removeLast (nExcessive); soloButtonAttachmentArray.removeLast (nExcessive); sphereElementArray.removeLast (nExcessive); colourChooserArray.removeLast (nExcessive); slAzimuthArray.removeLast (nExcessive); slElevationArray.removeLast (nExcessive); slGainArray.removeLast (nExcessive); muteButtonArray.removeLast (nExcessive); soloButtonArray.removeLast (nExcessive); } else // we have to add some { for (int i = nElements; i < nCh; ++i) { sphereElementArray.add (new SpherePanner::AzimuthElevationParameterElement ( *pVts->getParameter ("azimuth" + juce::String (i)), pVts->getParameterRange ("azimuth" + juce::String (i)), *pVts->getParameter ("elevation" + juce::String (i)), pVts->getParameterRange ("elevation" + juce::String (i)))); colourChooserArray.add (new ColourChangeButton (processor, spherePanner, sphereElementArray.getLast(), i + 1)); slAzimuthArray.add (new ReverseSlider()); slElevationArray.add (new ReverseSlider()); slGainArray.add (new ReverseSlider()); muteButtonArray.add (new MuteSoloButton()); soloButtonArray.add (new MuteSoloButton()); auto* sphereElement = sphereElementArray.getLast(); auto* colourChooser = colourChooserArray.getLast(); auto* azimuthSlider = slAzimuthArray.getLast(); auto* elevationSlider = slElevationArray.getLast(); auto* gainSlider = slGainArray.getLast(); auto* muteButton = muteButtonArray.getLast(); auto* soloButton = soloButtonArray.getLast(); sphereElement->setLabel (juce::String (i + 1)); sphereElement->setColour (processor.elementColours[i]); sphereElement->setTextColour ( juce::Colours::white.overlaidWith (processor.elementColours[i]).contrasting()); spherePanner.addElement (sphereElement); addAndMakeVisible (colourChooser); colourChooser->setColour (juce::TextButton::buttonColourId, processor.elementColours[i]); colourChooser->setColour ( juce::TextButton::textColourOffId, juce::Colours::white.overlaidWith (processor.elementColours[i]).contrasting()); addAndMakeVisible (azimuthSlider); slAzimuthSliderAttachment.add ( new SliderAttachment (*pVts, "azimuth" + juce::String (i), *azimuthSlider)); azimuthSlider->setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); azimuthSlider->setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); azimuthSlider->setReverse (true); azimuthSlider->setColour (juce::Slider::rotarySliderOutlineColourId, juce::Colour (0xFF00CAFF)); azimuthSlider->setRotaryParameters (juce::MathConstants::pi, 3 * juce::MathConstants::pi, false); azimuthSlider->setTooltip ("Azimuth angle"); addAndMakeVisible (elevationSlider); slElevationAttachmentArray.add ( new SliderAttachment (*pVts, "elevation" + juce::String (i), *elevationSlider)); elevationSlider->setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); elevationSlider->setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); elevationSlider->setColour (juce::Slider::rotarySliderOutlineColourId, juce::Colour (0xFF4FFF00)); elevationSlider->setRotaryParameters (0.5 * juce::MathConstants::pi, 2.5 * juce::MathConstants::pi, false); elevationSlider->setTooltip ("Elevation angle"); addAndMakeVisible (gainSlider); slGainAttachmentArray.add ( new SliderAttachment (*pVts, "gain" + juce::String (i), *gainSlider)); gainSlider->setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); gainSlider->setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); gainSlider->setColour (juce::Slider::rotarySliderOutlineColourId, juce::Colour (0xFFD0011B)); gainSlider->setReverse (false); gainSlider->setTooltip ("Gain"); gainSlider->setTextValueSuffix ("dB"); addAndMakeVisible (muteButton); muteButtonAttachmentArray.add ( new ButtonAttachment (*pVts, "mute" + juce::String (i), *muteButton)); muteButton->setType (MuteSoloButton::Type::mute); addAndMakeVisible (soloButton); soloButtonAttachmentArray.add ( new ButtonAttachment (*pVts, "solo" + juce::String (i), *soloButton)); soloButton->setType (MuteSoloButton::Type::solo); } } nChannels = nCh; setBounds (0, 0, 200, nChannels * (63)); // const int rotSliderHeight = 55; const int labelHeight = 15; } void updateColours() { for (int i = 0; i < nChannels; ++i) { colourChooserArray[i]->setColour (juce::TextButton::buttonColourId, processor.elementColours[i]); colourChooserArray[i]->setColour ( juce::TextButton::textColourOffId, juce::Colours::white.overlaidWith (processor.elementColours[i]).contrasting()); sphereElementArray[i]->setColour (processor.elementColours[i]); sphereElementArray[i]->setTextColour ( juce::Colours::white.overlaidWith (processor.elementColours[i]).contrasting()); } repaint(); } void paint (juce::Graphics& g) override {}; void resized() override { juce::Rectangle bounds = getBounds(); juce::Rectangle sliderRow; const int rotSliderSpacing = 10; const int rotSliderHeight = 55; const int rotSliderWidth = 42; for (int i = 0; i < nChannels; ++i) { sliderRow = bounds.removeFromTop (rotSliderHeight); auto colorChooserArea = sliderRow.removeFromLeft (23); colourChooserArray[i]->setBounds ( colorChooserArea.removeFromTop (rotSliderWidth).reduced (0, 12)); sliderRow.removeFromLeft (5); slAzimuthArray[i]->setBounds (sliderRow.removeFromLeft (rotSliderWidth)); sliderRow.removeFromLeft (rotSliderSpacing); slElevationArray[i]->setBounds (sliderRow.removeFromLeft (rotSliderWidth)); sliderRow.removeFromLeft (rotSliderSpacing); slGainArray[i]->setBounds (sliderRow.removeFromLeft (rotSliderWidth)); sliderRow.removeFromLeft (rotSliderSpacing); sliderRow.reduce (0, 6); sliderRow.setWidth (18); soloButtonArray[i]->setBounds (sliderRow.removeFromTop (18)); sliderRow.removeFromTop (5); muteButtonArray[i]->setBounds (sliderRow.removeFromTop (18)); bounds.removeFromTop (8); //spacing } repaint(); } juce::OwnedArray sphereElementArray; juce::OwnedArray& getAzimuthArray() { return slAzimuthArray; } juce::OwnedArray& getElevationArray() { return slElevationArray; } juce::OwnedArray& getGainArray() { return slGainArray; } private: MultiEncoderAudioProcessor& processor; SpherePanner& spherePanner; juce::AudioProcessorValueTreeState* pVts; int nChannels; juce::OwnedArray slAzimuthArray, slElevationArray, slGainArray; juce::OwnedArray muteButtonArray, soloButtonArray; juce::OwnedArray colourChooserArray; juce::OwnedArray slAzimuthSliderAttachment; juce::OwnedArray slElevationAttachmentArray; juce::OwnedArray slGainAttachmentArray; juce::OwnedArray muteButtonAttachmentArray; juce::OwnedArray soloButtonAttachmentArray; }; ././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/MultiEncoder/Source/PluginProcessor.hIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/MultiEncoder/Source/PluginProcessor.0000664002537200253720000001253315257173642031624 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once #include "../../resources/AudioProcessorBase.h" #include "../../resources/Conversions.h" #include "../../resources/Quaternion.h" #include "../../resources/ambisonicTools.h" #include "../../resources/efficientSHvanilla.h" #include "../JuceLibraryCode/JuceHeader.h" #define CONFIGURATIONHELPER_ENABLE_LOUDSPEAKERLAYOUT_METHODS 1 #include "../../resources/ConfigurationHelper.h" #define ProcessorClass MultiEncoderAudioProcessor constexpr int maxNumberOfInputs = 64; constexpr int startNnumberOfInputs = 5; //============================================================================== /** */ class MultiEncoderAudioProcessor : public AudioProcessorBase, IOTypes::Ambisonics<>> { public: constexpr static int numberOfInputChannels = 64; constexpr static int numberOfOutputChannels = 64; //============================================================================== MultiEncoderAudioProcessor(); ~MultiEncoderAudioProcessor(); //============================================================================== void prepareToPlay (double sampleRate, int samplesPerBlock) override; void releaseResources() override; void processBlock (juce::AudioSampleBuffer&, juce::MidiBuffer&) override; //============================================================================== juce::AudioProcessorEditor* createEditor() override; bool hasEditor() const override; //============================================================================== int getNumPrograms() override; int getCurrentProgram() override; void setCurrentProgram (int index) override; const juce::String getProgramName (int index) override; void changeProgramName (int index, const juce::String& newName) override; //============================================================================== void getStateInformation (juce::MemoryBlock& destData) override; void setStateInformation (const void* data, int sizeInBytes) override; void parameterChanged (const juce::String& parameterID, float newValue) override; inline const bool processNotYetConsumedOSCMessage (const juce::OSCMessage& message) override; //======= Parameters =========================================================== std::vector> createParameterLayout(); //============================================================================== juce::Result loadConfiguration (const juce::File& configFile); juce::Result loadConfigFromString (juce::String configString); void setLastDir (juce::File newLastDir); juce::File getLastDir() { return lastDir; }; float xyzGrab[3]; float xyz[maxNumberOfInputs][3]; std::atomic* azimuth[maxNumberOfInputs]; std::atomic* elevation[maxNumberOfInputs]; std::atomic* gain[maxNumberOfInputs]; std::atomic* mute[maxNumberOfInputs]; std::atomic* solo[maxNumberOfInputs]; juce::BigInteger muteMask; juce::BigInteger soloMask; std::atomic* masterAzimuth; std::atomic* masterElevation; std::atomic* masterRoll; std::atomic* lockedToMaster; std::atomic* inputSetting; std::atomic* orderSetting; std::atomic* useSN3D; std::atomic* analyzeRMS; std::atomic* dynamicRange; std::vector rms; float timeConstant; bool yprInput; double phi, theta; std::atomic updateColours = false; bool updateSphere = true; bool soloMuteChanged = true; juce::Colour elementColours[maxNumberOfInputs]; void updateBuffers() override; void updateQuaternions(); private: //============================================================================== void wrapSphericalCoordinates (float* azi, float* ele); juce::File lastDir; std::unique_ptr properties; bool processorUpdatingParams; float masterYpr[3]; iem::Quaternion quats[maxNumberOfInputs]; float dist[maxNumberOfInputs]; bool dontTriggerMasterUpdate = false; bool wasLockedBefore; bool locked = false; bool moving = false; float SH[maxNumberOfInputs][64]; float _SH[maxNumberOfInputs][64]; float _gain[maxNumberOfInputs]; juce::AudioBuffer bufferCopy; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MultiEncoderAudioProcessor) }; IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/MultiEncoder/Source/PluginEditor.h0000664002537200253720000001054215257173642031241 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once #include "../../resources/customComponents/MuteSoloButton.h" #include "../../resources/customComponents/ReverseSlider.h" #include "../../resources/customComponents/SimpleLabel.h" #include "../../resources/customComponents/SpherePanner.h" #include "../../resources/customComponents/TitleBar.h" #include "../../resources/lookAndFeel/IEM_LaF.h" #include "../JuceLibraryCode/JuceHeader.h" #include "EncoderList.h" #include "EnergySpherePanner.h" #include "MasterControlWithText.h" #include "PluginProcessor.h" typedef ReverseSlider::SliderAttachment SliderAttachment; typedef juce::AudioProcessorValueTreeState::ComboBoxAttachment ComboBoxAttachment; typedef juce::AudioProcessorValueTreeState::ButtonAttachment ButtonAttachment; //============================================================================== /** */ class MultiEncoderAudioProcessorEditor : public juce::AudioProcessorEditor, private juce::Timer, private SpherePanner::Listener { public: MultiEncoderAudioProcessorEditor (MultiEncoderAudioProcessor&, juce::AudioProcessorValueTreeState&); ~MultiEncoderAudioProcessorEditor(); //============================================================================== void paint (juce::Graphics&) override; void resized() override; void importLayout(); private: LaF globalLaF; TitleBar, AmbisonicIOWidget<>> title; OSCFooter footer; void timerCallback() override; void mouseWheelOnSpherePannerMoved (SpherePanner* sphere, const juce::MouseEvent& event, const juce::MouseWheelDetails& wheel) override; MultiEncoderAudioProcessor& processor; juce::AudioProcessorValueTreeState& valueTreeState; juce::GroupComponent masterGroup, encoderGroup, rmsGroup; juce::TextButton tbImport; ReverseSlider slMasterAzimuth, slMasterElevation, slMasterRoll; juce::ToggleButton tbLockedToMaster; ReverseSlider slDynamicRange; std::unique_ptr slDynamicRangeAttachment; SimpleLabel lbDynamicRange; ReverseSlider slPeakLevel; std::unique_ptr slPeakLevelAttachment; SimpleLabel lbPeakLevel; juce::ToggleButton tbAnalyzeRMS; std::unique_ptr tbAnalyzeRMSAttachment; juce::ComboBox inputChooser; EnergySpherePanner sphere; SpherePanner::AzimuthElevationParameterElement masterElement; std::unique_ptr slMasterAzimuthAttachment; std::unique_ptr slMasterElevationAttachment; std::unique_ptr slMasterRollAttachment; std::unique_ptr tbLockedToMasterAttachment; std::unique_ptr cbNumInputChannelsAttachment, cbNormalizationAtachment; std::unique_ptr cbOrderAtachment; juce::Viewport viewport; std::unique_ptr encoderList; juce::TooltipWindow tooltipWin; int maxPossibleOrder = -1; int maxNumInputs = -1; int lastSetNumChIn = -1; // labels SimpleLabel lbNum; std::unique_ptr lbAzimuth, lbElevation, lbGain; SimpleLabel lbMasterAzimuth, lbMasterElevation, lbMasterRoll; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MultiEncoderAudioProcessorEditor) }; ././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/MultiEncoder/Source/MasterControlWithText.hIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/MultiEncoder/Source/MasterControlWit0000664002537200253720000001261315257173642031667 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once #include "../../resources/customComponents/ReverseSlider.h" #include "../JuceLibraryCode/JuceHeader.h" class MasterControlWithText : public juce::Component { public: MasterControlWithText (juce::OwnedArray& sliderArray) : elements (sliderArray) {} void setText (juce::String newText) { text = newText; repaint(); } void mouseEnter (const juce::MouseEvent& e) override { repaint(); } void mouseExit (const juce::MouseEvent& e) override { repaint(); } void mouseMove (const juce::MouseEvent& e) override { if (triangleUp.contains (e.position)) isOverTriangle = 1; else if (triangleDown.contains (e.position)) isOverTriangle = -1; else isOverTriangle = 0; } void mouseDrag (const juce::MouseEvent& e) override { isDragging = true; const auto drag = e.getOffsetFromDragStart(); const auto dist = drag.getX() - drag.getY(); if (dist > 0) dragDirection = 1; else if (dist < 0) dragDirection = -1; else dragDirection = 0; repaint(); for (int i = 0; i < elements.size(); ++i) { if (elements[i] != nullptr) elements[i]->mouseDrag (e); } } void mouseWheelMove (const juce::MouseEvent& e, const juce::MouseWheelDetails& wheel) override { isDragging = true; for (int i = 0; i < elements.size(); ++i) { if (elements[i] != nullptr) elements[i]->mouseWheelMove (e, wheel); } } void mouseDown (const juce::MouseEvent& e) override { for (int i = 0; i < elements.size(); ++i) { if (elements[i] == nullptr) continue; if (auto* slider = dynamic_cast (elements[i])) { if (isOverTriangle == 1) { slider->increment(); } else if (isOverTriangle == -1) { slider->decrement(); } } elements[i]->mouseDown (e); } } void mouseUp (const juce::MouseEvent& e) override { isDragging = false; dragDirection = 0; for (int i = 0; i < elements.size(); ++i) { if (elements[i] != nullptr) elements[i]->mouseUp (e); } } void paint (juce::Graphics& g) override { auto bounds = getLocalBounds(); const bool filled = (! isDragging && isMouseOver()); const bool isDragginUp = dragDirection == 1; const bool isDragginDown = dragDirection == -1; g.setColour (juce::Colours::white.withAlpha ((filled || isDragginUp) ? 1.0f : 0.5f)); g.fillPath (triangleUp); g.setColour (juce::Colours::white.withAlpha ((filled || isDragginDown) ? 1.0f : 0.5f)); g.fillPath (triangleDown); bounds.removeFromLeft (bounds.getHeight() - 5); g.setColour (juce::Colours::white); g.setFont (bounds.getHeight()); auto currentFont = juce::FontOptions ( getLookAndFeel().getTypefaceForFont (juce::FontOptions (bounds.getHeight(), 0))); g.setFont (currentFont); g.drawText (text, bounds, juce::Justification::left, true); } void resized() override { auto bounds = getLocalBounds().toFloat(); bounds.reduce (0, 3); bounds.setWidth (bounds.getHeight()); auto height = bounds.getHeight(); auto upperHalf = bounds.removeFromTop (height / 2); auto lowerHalf = bounds; upperHalf.removeFromBottom (1); triangleUp.clear(); triangleUp.addTriangle (upperHalf.getBottomLeft(), upperHalf.getBottomRight(), { upperHalf.getCentreX(), upperHalf.getY() }); lowerHalf.removeFromTop (1); triangleDown.clear(); triangleDown.addTriangle (lowerHalf.getTopLeft(), lowerHalf.getTopRight(), { lowerHalf.getCentreX(), lowerHalf.getBottom() }); } private: juce::OwnedArray& elements; juce::String text; juce::Path triangleUp, triangleDown; bool isDragging = false; int dragDirection = 0; int isOverTriangle = 0; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MasterControlWithText) }; ././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/MultiEncoder/Source/EnergySpherePanner.hIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/MultiEncoder/Source/EnergySpherePann0000664002537200253720000001032215257173642031617 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once #include "../../resources/customComponents/SpherePanner.h" /** This is kind of hacky, I know! */ class EnergySpherePanner : public SpherePanner { public: EnergySpherePanner (const std::vector& rmsArray) : rms (rmsArray) {} void paintOverChildren (juce::Graphics& g) override { const auto bounds = getLocalBounds().toFloat(); const float centreX = bounds.getCentreX(); const float centreY = bounds.getCentreY(); auto currentFont = juce::FontOptions (getLookAndFeel().getTypefaceForFont (juce::FontOptions (12.0f, 1))); g.setFont (currentFont); const int size = elements.size(); for (int i = 0; i < size; ++i) { SpherePanner::Element* handle = elements.getUnchecked (i); auto pos = handle->getCoordinates(); const bool isUp = pos.z >= -0.0f; const float diam = 15.0f + 4.0f * pos.z; const juce::Colour colour = handle->isActive() ? handle->getColour() : juce::Colours::grey; g.setColour (colour); if (linearElevation) { const float r = sqrt (pos.y * pos.y + pos.x * pos.x); const float factor = std::asin (r) / r / juce::MathConstants::halfPi; pos *= factor; } const juce::Rectangle circleArea (centreX - pos.y * radius - diam / 2, centreY - pos.x * radius - diam / 2, diam, diam); juce::Path panPos; panPos.addEllipse (circleArea); g.strokePath (panPos, juce::PathStrokeType (1.0f)); if (visualize && i != 0) // assume and hope, the first element is the master control { const float level = juce::Decibels::gainToDecibels (rms[i - 1]); const float alpha = juce::jlimit (0.0f, 1.0f, (level - peakLevel) / dynRange + 1.0f); g.setColour (colour.withAlpha (alpha)); g.drawEllipse (circleArea.withSizeKeepingCentre (1.4f * diam, 1.4f * diam), 1.4f); } if (i == activeElem) { g.setColour (colour.withAlpha (0.8f)); g.drawEllipse (circleArea.withSizeKeepingCentre (1.3f * diam, 1.3f * diam), 0.9f); } g.setColour (colour.withAlpha (isUp ? 1.0f : 0.3f)); g.fillPath (panPos); g.setColour (isUp ? handle->getTextColour() : colour); g.setFont (isUp ? 15.0f : 10.0f); g.drawText (handle->getLabel(), circleArea.toNearestInt(), juce::Justification::centred, false); } }; void setPeakLevel (float peakLevelInDecibels) { peakLevel = peakLevelInDecibels; } void setDynamicRange (float dynamicRangeInDecibels) { dynRange = dynamicRangeInDecibels; } void visualizeRMS (float shouldVisualize) { visualize = shouldVisualize; repaint(); } private: bool visualize = false; float peakLevel = 0.0f; float dynRange = 60.0f; const std::vector& rms; }; IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/MultiEncoder/CMakeLists.txt0000664002537200253720000000441515257173642027765 0ustar zmoelnigzmoelnigset (PLUGIN_TARGET "") if (IEM_FORMATS) juce_add_plugin (MultiEncoder PLUGIN_MANUFACTURER_CODE IEMA PLUGIN_CODE MuEn ICON_BIG "../resources/Standalone/IEMPluginSuiteSmall.png" ICON_SMALL "../resources/Standalone/IEMPluginSuiteSmall.png" COMPANY_NAME "IEM" PRODUCT_NAME "MultiEncoder" FORMATS ${IEM_FORMATS} VERSION ${MultiEncoder_VERSION} LV2URI "http://plugins.iem.at/MultiEncoder" VST2_CATEGORY kPlugSurroundFx kPlugCategSpacializer VST3_CATEGORIES Spatial Surround Up-Downmix AAX_CATEGORY SoundField) list (APPEND PLUGIN_TARGET MultiEncoder) endif() juce_add_binary_data (MultiEncoderPresets HEADER_NAME "Presets.h" NAMESPACE Presets SOURCES ../_configurationFiles/t_design_12ch.json ../_configurationFiles/t_design_24ch.json ../_configurationFiles/t_design_36ch.json ../_configurationFiles/t_design_48ch.json ../_configurationFiles/t_design_60ch.json) foreach (TARGET IN LISTS PLUGIN_TARGET) juce_generate_juce_header(${TARGET}) target_sources(${TARGET} PRIVATE Source/PluginEditor.cpp Source/PluginEditor.h Source/PluginProcessor.cpp Source/PluginProcessor.h ../resources/OSC/OSCInputStream.h ../resources/OSC/OSCParameterInterface.cpp ../resources/OSC/OSCParameterInterface.h ../resources/OSC/OSCStatus.cpp ../resources/OSC/OSCStatus.h ../resources/OSC/OSCUtilities.h ../resources/efficientSHvanilla.cpp ) target_compile_definitions(${TARGET} PRIVATE JUCE_USE_CURL=0 JUCE_WEB_BROWSER=0 JUCE_USE_CUSTOM_PLUGIN_STANDALONE_APP=1 JUCE_USE_FLAC=0 JUCE_USE_OGGVORBIS=0 JUCE_USE_MP3AUDIOFORMAT=0 JUCE_USE_LAME_AUDIO_FORMAT=0 JUCE_USE_WINDOWS_MEDIA_FORMAT=0 JUCE_VST3_CAN_REPLACE_VST2=0) target_include_directories(${TARGET} PRIVATE Source) target_link_libraries(${TARGET} PRIVATE LAF_fonts IEM_logo MultiEncoderPresets juce::juce_audio_utils juce::juce_audio_plugin_client juce::juce_osc juce::juce_dsp juce::juce_opengl juce::juce_recommended_config_flags juce::juce_recommended_lto_flags) endforeach() IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/OmniCompressor/0000775002537200253720000000000015257173642025606 5ustar zmoelnigzmoelnigIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/OmniCompressor/Source/0000775002537200253720000000000015257173642027046 5ustar zmoelnigzmoelnig././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/OmniCompressor/Source/LookAheadGainReduction.hIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/OmniCompressor/Source/LookAheadGainR0000664002537200253720000001734415257173642031552 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Authors: Daniel Rudrich Copyright (c) 2018 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once #include "../JuceLibraryCode/JuceHeader.h" using namespace juce::dsp; class LookAheadGainReduction { public: LookAheadGainReduction() {} ~LookAheadGainReduction() {} void setDelayTime (float delayTimeInSeconds) { if (delayTimeInSeconds <= 0.0f) { delay = 0.0f; } else { delay = delayTimeInSeconds; } prepare (spec); } const int getDelayInSamples() { return delayInSamples; } void prepare (const juce::dsp::ProcessSpec& specs) { spec = specs; delayInSamples = delay * specs.sampleRate; buffer.setSize (specs.numChannels, specs.maximumBlockSize + delayInSamples); buffer.clear(); writePosition = 0; } void pushSamples (const float* src, int numSamples) { int startIndex, blockSize1, blockSize2; // write in delay line getWritePositions (numSamples, startIndex, blockSize1, blockSize2); buffer.copyFrom (0, startIndex, src, blockSize1); if (blockSize2 > 0) buffer.copyFrom (0, 0, src + blockSize1, blockSize2); writePosition += numSamples; writePosition = writePosition % buffer.getNumSamples(); lastPushedSamples = numSamples; } void readSamples (float* dest, int numSamples) { jassert (numSamples == lastPushedSamples); int startIndex, blockSize1, blockSize2; // read from delay line getReadPositions (numSamples, startIndex, blockSize1, blockSize2); juce::FloatVectorOperations::copy (dest, buffer.getReadPointer (0) + startIndex, blockSize1); if (blockSize2 > 0) juce::FloatVectorOperations::copy (dest + blockSize1, buffer.getReadPointer (0), blockSize2); } void process() { jassert (delayInSamples > 0); juce::ScopedNoDenormals noDenormals; float nextGainReductionValue = 0.0f; float step = 0.0f; // last pushed samples int startIndex = writePosition - 1; if (startIndex < 0) startIndex += buffer.getNumSamples(); int size1, size2; getProcessPositions (startIndex, lastPushedSamples, size1, size2); for (int i = 0; i < size1; ++i) { float smpl = buffer.getSample (0, startIndex); if (smpl > nextGainReductionValue) { buffer.setSample (0, startIndex, nextGainReductionValue); nextGainReductionValue += step; } else { step = -smpl / delayInSamples; nextGainReductionValue = smpl + step; } --startIndex; } if (size2 > 0) { startIndex = buffer.getNumSamples() - 1; for (int i = 0; i < size2; ++i) { float smpl = buffer.getSample (0, startIndex); if (smpl > nextGainReductionValue) { buffer.setSample (0, startIndex, nextGainReductionValue); nextGainReductionValue += step; } else { step = -smpl / delayInSamples; nextGainReductionValue = smpl + step; } --startIndex; } } if (startIndex < 0) startIndex = buffer.getNumSamples() - 1; getProcessPositions (startIndex, delayInSamples, size1, size2); bool breakWasUsed = false; for (int i = 0; i < size1; ++i) { float smpl = buffer.getSample (0, startIndex); if (smpl > nextGainReductionValue) { buffer.setSample (0, startIndex, nextGainReductionValue); nextGainReductionValue += step; } else { breakWasUsed = true; break; } --startIndex; } if (! breakWasUsed && size2 > 0) { startIndex = buffer.getNumSamples() - 1; for (int i = 0; i < size2; ++i) { float smpl = buffer.getSample (0, startIndex); if (smpl > nextGainReductionValue) { buffer.setSample (0, startIndex, nextGainReductionValue); nextGainReductionValue += step; } else { break; } --startIndex; } } } private: inline void getProcessPositions (int startIndex, int numSamples, int& blockSize1, int& blockSize2) { jassert (startIndex >= 0 && startIndex < buffer.getNumSamples()); if (numSamples <= 0) { blockSize1 = 0; blockSize2 = 0; } else { blockSize1 = juce::jmin (startIndex + 1, numSamples); numSamples -= blockSize1; blockSize2 = numSamples <= 0 ? 0 : numSamples; } } inline void getWritePositions (int numSamples, int& startIndex, int& blockSize1, int& blockSize2) { const int L = buffer.getNumSamples(); int pos = writePosition; if (pos < 0) pos = pos + L; pos = pos % L; jassert (pos >= 0 && pos < L); if (numSamples <= 0) { startIndex = 0; blockSize1 = 0; blockSize2 = 0; } else { startIndex = pos; blockSize1 = juce::jmin (L - pos, numSamples); numSamples -= blockSize1; blockSize2 = numSamples <= 0 ? 0 : numSamples; } } inline void getReadPositions (int numSamples, int& startIndex, int& blockSize1, int& blockSize2) { const int L = buffer.getNumSamples(); int pos = writePosition - lastPushedSamples - delayInSamples; if (pos < 0) pos = pos + L; pos = pos % L; jassert (pos >= 0 && pos < L); if (numSamples <= 0) { startIndex = 0; blockSize1 = 0; blockSize2 = 0; } else { startIndex = pos; blockSize1 = juce::jmin (L - pos, numSamples); numSamples -= blockSize1; blockSize2 = numSamples <= 0 ? 0 : numSamples; } } private: //============================================================================== juce::dsp::ProcessSpec spec = { -1, 0, 0 }; float delay; int delayInSamples = 0; int writePosition = 0; int lastPushedSamples = 0; juce::AudioBuffer buffer; }; ././@LongLink0000644000000000000000000000015200000000000011601 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/OmniCompressor/Source/PluginProcessor.cppIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/OmniCompressor/Source/PluginProcesso0000664002537200253720000003274415257173642031757 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #include "PluginProcessor.h" #include "PluginEditor.h" //============================================================================== OmniCompressorAudioProcessor::OmniCompressorAudioProcessor() : AudioProcessorBase ( #ifndef JucePlugin_PreferredChannelConfigurations BusesProperties() #if ! JucePlugin_IsMidiEffect #if ! JucePlugin_IsSynth .withInput ("Input", ((juce::PluginHostType::getPluginLoadedAs() == juce::AudioProcessor::wrapperType_VST3) ? juce::AudioChannelSet::ambisonic (1) : juce::AudioChannelSet::ambisonic (7)), true) #endif .withOutput ("Output", ((juce::PluginHostType::getPluginLoadedAs() == juce::AudioProcessor::wrapperType_VST3) ? juce::AudioChannelSet::ambisonic (1) : juce::AudioChannelSet::ambisonic (7)), true) #endif , #endif createParameterLayout()) { parameters.addParameterListener ("orderSetting", this); orderSetting = parameters.getRawParameterValue ("orderSetting"); threshold = parameters.getRawParameterValue ("threshold"); knee = parameters.getRawParameterValue ("knee"); outGain = parameters.getRawParameterValue ("outGain"); ratio = parameters.getRawParameterValue ("ratio"); attack = parameters.getRawParameterValue ("attack"); release = parameters.getRawParameterValue ("release"); lookAhead = parameters.getRawParameterValue ("lookAhead"); reportLatency = parameters.getRawParameterValue ("reportLatency"); GR = 0.0f; delay.setDelayTime (0.005f); grProcessing.setDelayTime (0.005f); } OmniCompressorAudioProcessor::~OmniCompressorAudioProcessor() { } //============================================================================== int OmniCompressorAudioProcessor::getNumPrograms() { return 1; // NB: some hosts don't cope very well if you tell them there are 0 programs, // so this should be at least 1, even if you're not really implementing programs. } int OmniCompressorAudioProcessor::getCurrentProgram() { return 0; } void OmniCompressorAudioProcessor::setCurrentProgram (int index) { } const juce::String OmniCompressorAudioProcessor::getProgramName (int index) { return {}; } void OmniCompressorAudioProcessor::changeProgramName (int index, const juce::String& newName) { } void OmniCompressorAudioProcessor::parameterChanged (const juce::String& parameterID, float newValue) { if (parameterID == "orderSetting") userChangedIOSettings = true; } //============================================================================== void OmniCompressorAudioProcessor::prepareToPlay (double sampleRate, int samplesPerBlock) { checkInputAndOutput (this, *orderSetting, *orderSetting, true); RMS.resize (samplesPerBlock); allGR.resize (samplesPerBlock); gains.setSize (1, samplesPerBlock); juce::dsp::ProcessSpec spec; spec.sampleRate = sampleRate; spec.numChannels = 1; spec.maximumBlockSize = samplesPerBlock; compressor.prepare (spec); grProcessing.prepare (spec); spec.numChannels = getTotalNumInputChannels(); delay.prepare (spec); if (*reportLatency >= 0.5f && *lookAhead >= 0.5f) setLatencySamples (delay.getDelayInSamples()); else setLatencySamples (0); } void OmniCompressorAudioProcessor::releaseResources() { // When playback stops, you can use this as an opportunity to free up any // spare memory, etc. } void OmniCompressorAudioProcessor::processBlock (juce::AudioSampleBuffer& buffer, juce::MidiBuffer& midiMessages) { checkInputAndOutput (this, *orderSetting, *orderSetting); const int totalNumInputChannels = getTotalNumInputChannels(); const int totalNumOutputChannels = getTotalNumOutputChannels(); const int bufferSize = buffer.getNumSamples(); const int numCh = juce::jmin (buffer.getNumChannels(), input.getNumberOfChannels(), output.getNumberOfChannels()); //const int ambisonicOrder = juce::jmin(input.getOrder(), output.getOrder()); const float* bufferReadPtr = buffer.getReadPointer (0); const bool useLookAhead = *lookAhead >= 0.5f; if (*ratio > 15.9f) compressor.setRatio (INFINITY); else compressor.setRatio (*ratio); compressor.setKnee (*knee); compressor.setAttackTime (*attack * 0.001f); compressor.setReleaseTime (*release * 0.001f); compressor.setThreshold (*threshold); compressor.setMakeUpGain (*outGain); for (int i = totalNumInputChannels; i < totalNumOutputChannels; ++i) buffer.clear (i, 0, buffer.getNumSamples()); if (useLookAhead) { compressor.getGainFromSidechainSignalInDecibelsWithoutMakeUpGain (bufferReadPtr, gains.getWritePointer (0), bufferSize); maxGR = juce::FloatVectorOperations::findMinimum (gains.getWritePointer (0), bufferSize); // delay input signal { juce::dsp::AudioBlock ab (buffer); juce::dsp::ProcessContextReplacing context (ab); delay.process (context); } grProcessing.pushSamples (gains.getReadPointer (0), bufferSize); grProcessing.process(); grProcessing.readSamples (gains.getWritePointer (0), bufferSize); // convert from decibels to gain values for (int i = 0; i < bufferSize; ++i) { gains.setSample (0, i, juce::Decibels::decibelsToGain (gains.getSample (0, i) + *outGain)); } } else { compressor.getGainFromSidechainSignal (bufferReadPtr, gains.getWritePointer (0), bufferSize); maxGR = juce::Decibels::gainToDecibels ( juce::FloatVectorOperations::findMinimum (gains.getWritePointer (0), bufferSize)) - *outGain; } maxRMS = compressor.getMaxLevelInDecibels(); for (int channel = 0; channel < numCh; ++channel) { float* channelData = buffer.getWritePointer (channel); juce::FloatVectorOperations::multiply (channelData, gains.getWritePointer (0), bufferSize); } } //============================================================================== bool OmniCompressorAudioProcessor::hasEditor() const { return true; // (change this to false if you choose to not supply an editor) } juce::AudioProcessorEditor* OmniCompressorAudioProcessor::createEditor() { return new OmniCompressorAudioProcessorEditor (*this, parameters); } //============================================================================== void OmniCompressorAudioProcessor::getStateInformation (juce::MemoryBlock& destData) { auto state = parameters.copyState(); auto oscConfig = state.getOrCreateChildWithName ("OSCConfig", nullptr); oscConfig.copyPropertiesFrom (oscParameterInterface.getConfig(), nullptr); std::unique_ptr xml (state.createXml()); copyXmlToBinary (*xml, destData); } void OmniCompressorAudioProcessor::setStateInformation (const void* data, int sizeInBytes) { std::unique_ptr xmlState (getXmlFromBinary (data, sizeInBytes)); if (xmlState.get() != nullptr) if (xmlState->hasTagName (parameters.state.getType())) { parameters.replaceState (juce::ValueTree::fromXml (*xmlState)); if (parameters.state.hasProperty ("OSCPort")) // legacy { oscParameterInterface.getOSCReceiver().connect ( parameters.state.getProperty ("OSCPort", juce::var (-1))); parameters.state.removeProperty ("OSCPort", nullptr); } auto oscConfig = parameters.state.getChildWithName ("OSCConfig"); if (oscConfig.isValid()) oscParameterInterface.setConfig (oscConfig); } } //============================================================================== std::vector> OmniCompressorAudioProcessor::createParameterLayout() { // add your audio parameters here std::vector> params; params.push_back (OSCParameterInterface::createParameterTheOldWay ( "orderSetting", "Ambisonics Order", "", juce::NormalisableRange (0.0f, 8.0f, 1.0f), 0.0f, [] (float value) { if (value >= 0.5f && value < 1.5f) return "0th"; else if (value >= 1.5f && value < 2.5f) return "1st"; else if (value >= 2.5f && value < 3.5f) return "2nd"; else if (value >= 3.5f && value < 4.5f) return "3rd"; else if (value >= 4.5f && value < 5.5f) return "4th"; else if (value >= 5.5f && value < 6.5f) return "5th"; else if (value >= 6.5f && value < 7.5f) return "6th"; else if (value >= 7.5f) return "7th"; else return "Auto"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "useSN3D", "Normalization", "", juce::NormalisableRange (0.0f, 1.0f, 1.0f), 1.0f, [] (float value) { if (value >= 0.5f) return "SN3D"; else return "N3D"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "threshold", "Threshold", "dB", juce::NormalisableRange (-50.0f, 10.0f, 0.1f), -10.0, [] (float value) { return juce::String (value, 1); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "knee", "Knee", "dB", juce::NormalisableRange (0.0f, 30.0f, 0.1f), 0.0f, [] (float value) { return juce::String (value, 1); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "attack", "Attack Time", "ms", juce::NormalisableRange (0.0f, 100.0f, 0.1f), 30.0, [] (float value) { return juce::String (value, 1); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "release", "Release Time", "ms", juce::NormalisableRange (0.0f, 500.0f, 0.1f), 150.0, [] (float value) { return juce::String (value, 1); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "ratio", "Ratio", " : 1", juce::NormalisableRange (1.0f, 16.0f, .2f), 4.0, [] (float value) { if (value > 15.9f) return juce::String ("inf"); return juce::String (value, 1); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "outGain", "MakeUp Gain", "dB", juce::NormalisableRange (-10.0f, 20.0f, 0.1f), 0.0, [] (float value) { return juce::String (value, 1); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "lookAhead", "LookAhead", "", juce::NormalisableRange (0.0f, 1.0f, 1.0f), 0.0, [] (float value) { return value >= 0.5f ? "ON (5ms)" : "OFF"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "reportLatency", "Report Latency to DAW", "", juce::NormalisableRange (0.0f, 1.0f, 1.0f), 1.0f, [] (float value) { if (value >= 0.5f) return "Yes"; else return "No"; }, nullptr)); return params; } //============================================================================== // This creates new instances of the plugin.. juce::AudioProcessor* JUCE_CALLTYPE createPluginFilter() { return new OmniCompressorAudioProcessor(); } ././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/OmniCompressor/Source/PluginEditor.cppIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/OmniCompressor/Source/PluginEditor.c0000664002537200253720000002274715257173642031633 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #include "PluginEditor.h" #include "PluginProcessor.h" //============================================================================== OmniCompressorAudioProcessorEditor::OmniCompressorAudioProcessorEditor ( OmniCompressorAudioProcessor& p, juce::AudioProcessorValueTreeState& vts) : juce::AudioProcessorEditor (&p), processor (p), valueTreeState (vts), footer (p.getOSCParameterInterface()), characteristic (&processor.compressor) { setSize (330, 500); setLookAndFeel (&globalLaF); addAndMakeVisible (&title); title.setTitle (juce::String ("Omni"), juce::String ("Compressor")); title.setFont (globalLaF.robotoBold, globalLaF.robotoLight); addAndMakeVisible (&footer); addAndMakeVisible (characteristic); addAndMakeVisible (&tbLookAhead); tbLookAheadAttachment.reset (new ButtonAttachment (valueTreeState, "lookAhead", tbLookAhead)); tbLookAhead.setButtonText ("Look ahead (5ms)"); tbLookAhead.setColour (juce::ToggleButton::tickColourId, globalLaF.ClWidgetColours[0]); addAndMakeVisible (&sliderKnee); KnAttachment.reset (new SliderAttachment (valueTreeState, "knee", sliderKnee)); sliderKnee.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); sliderKnee.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); sliderKnee.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[2]); sliderKnee.setTextValueSuffix (" dB"); cbNormalizationAtachement.reset ( new ComboBoxAttachment (valueTreeState, "useSN3D", *title.getInputWidgetPtr()->getNormCbPointer())); cbOrderAtachement.reset ( new ComboBoxAttachment (valueTreeState, "orderSetting", *title.getInputWidgetPtr()->getOrderCbPointer())); addAndMakeVisible (&sliderThreshold); ThAttachment.reset (new SliderAttachment (valueTreeState, "threshold", sliderThreshold)); sliderThreshold.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); sliderThreshold.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); sliderThreshold.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[2]); sliderThreshold.setTextValueSuffix (" dB"); addAndMakeVisible (&sliderRatio); RaAttachment.reset (new SliderAttachment (valueTreeState, "ratio", sliderRatio)); sliderRatio.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); sliderRatio.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); sliderRatio.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[3]); // sliderRatio.setTextValueSuffix(""); addAndMakeVisible (&sliderAttackTime); ATAttachment.reset (new SliderAttachment (valueTreeState, "attack", sliderAttackTime)); sliderAttackTime.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); sliderAttackTime.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); sliderAttackTime.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[0]); sliderAttackTime.setTextValueSuffix (" ms"); addAndMakeVisible (&sliderReleaseTime); RTAttachment.reset (new SliderAttachment (valueTreeState, "release", sliderReleaseTime)); sliderReleaseTime.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); sliderReleaseTime.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); sliderReleaseTime.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[0]); sliderReleaseTime.setTextValueSuffix (" ms"); addAndMakeVisible (&sliderMakeupGain); MGAttachment.reset (new SliderAttachment (valueTreeState, "outGain", sliderMakeupGain)); sliderMakeupGain.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); sliderMakeupGain.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); sliderMakeupGain.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[1]); sliderMakeupGain.setTextValueSuffix (" dB"); addAndMakeVisible (&dbGRmeter); dbGRmeter.setMinLevel (-25.0f); dbGRmeter.setColour (juce::Colours::red.withMultipliedAlpha (0.8f)); dbGRmeter.setGainReductionMeter (true); addAndMakeVisible (&inpMeter); inpMeter.setMinLevel (-60.0f); inpMeter.setColour (juce::Colours::green.withMultipliedAlpha (0.8f)); inpMeter.setGainReductionMeter (false); // ===== LABELS ===== addAndMakeVisible (&lbKnee); lbKnee.setText ("Knee"); addAndMakeVisible (&lbThreshold); lbThreshold.setText ("Threshold"); addAndMakeVisible (&lbOutGain); lbOutGain.setText ("Makeup"); addAndMakeVisible (&lbRatio); lbRatio.setText ("Ratio"); addAndMakeVisible (&lbAttack); lbAttack.setText ("Attack"); addAndMakeVisible (&lbRelease); lbRelease.setText ("Release"); startTimer (50); } OmniCompressorAudioProcessorEditor::~OmniCompressorAudioProcessorEditor() { setLookAndFeel (nullptr); } //============================================================================== void OmniCompressorAudioProcessorEditor::paint (juce::Graphics& g) { // (Our component is opaque, so we must completely fill the background with a solid colour) g.fillAll (globalLaF.ClBackground); } void OmniCompressorAudioProcessorEditor::timerCallback() { // === update titleBar widgets according to available input/output channel counts title.setMaxSize (processor.getMaxSize()); // ========================================== characteristic.setMarkerLevels (processor.maxRMS.get(), processor.maxGR.get()); characteristic.updateCharacteristic(); characteristic.repaint(); inpMeter.setLevel (processor.maxRMS.get()); dbGRmeter.setLevel (processor.maxGR.get()); } void OmniCompressorAudioProcessorEditor::resized() { const int leftRightMargin = 30; const int headerHeight = 60; const int footerHeight = 25; const int sliderHeight = 70; const int labelHeight = 15; const int sliderSpacing = 20; const int sliderWidth = 55; juce::Rectangle area (getLocalBounds()); juce::Rectangle footerArea (area.removeFromBottom (footerHeight)); footer.setBounds (footerArea); area.removeFromLeft (leftRightMargin); area.removeFromRight (leftRightMargin); juce::Rectangle headerArea = area.removeFromTop (headerHeight); title.setBounds (headerArea); area.removeFromTop (10); area.removeFromBottom (5); juce::Rectangle ctrlPlane = area.removeFromBottom (180); ctrlPlane.setWidth (270); ctrlPlane.setCentre (area.getCentreX(), ctrlPlane.getCentreY()); inpMeter.setBounds (ctrlPlane.removeFromLeft (20)); ctrlPlane.removeFromLeft (10); dbGRmeter.setBounds (ctrlPlane.removeFromRight (20)); ctrlPlane.removeFromRight (10); juce::Rectangle sliderRow; sliderRow = ctrlPlane.removeFromTop (sliderHeight); sliderThreshold.setBounds (sliderRow.removeFromLeft (sliderWidth)); sliderRow.removeFromLeft (sliderSpacing); sliderKnee.setBounds (sliderRow.removeFromLeft (sliderWidth)); sliderRow.removeFromLeft (sliderSpacing); sliderMakeupGain.setBounds (sliderRow.removeFromLeft (sliderWidth)); sliderRow = ctrlPlane.removeFromTop (labelHeight); lbThreshold.setBounds (sliderRow.removeFromLeft (sliderWidth)); sliderRow.removeFromLeft (sliderSpacing); lbKnee.setBounds (sliderRow.removeFromLeft (sliderWidth)); sliderRow.removeFromLeft (sliderSpacing); lbOutGain.setBounds (sliderRow.removeFromLeft (sliderWidth)); ctrlPlane.removeFromTop (10); sliderRow = ctrlPlane.removeFromTop (sliderHeight); sliderRatio.setBounds (sliderRow.removeFromLeft (sliderWidth)); sliderRow.removeFromLeft (sliderSpacing); sliderAttackTime.setBounds (sliderRow.removeFromLeft (sliderWidth)); sliderRow.removeFromLeft (sliderSpacing); sliderReleaseTime.setBounds (sliderRow.removeFromLeft (sliderWidth)); sliderRow = ctrlPlane.removeFromTop (labelHeight); lbRatio.setBounds (sliderRow.removeFromLeft (sliderWidth)); sliderRow.removeFromLeft (sliderSpacing); lbAttack.setBounds (sliderRow.removeFromLeft (sliderWidth)); sliderRow.removeFromLeft (sliderSpacing); lbRelease.setBounds (sliderRow.removeFromLeft (sliderWidth)); area.removeFromBottom (10); tbLookAhead.setBounds (area.removeFromBottom (20).removeFromLeft (130)); area.removeFromBottom (10); characteristic.setBounds (area); } ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/OmniCompressor/Source/PluginProcessor.hIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/OmniCompressor/Source/PluginProcesso0000664002537200253720000000750015257173642031747 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once #include "../../resources/AudioProcessorBase.h" #include "../../resources/Compressor.h" #include "../../resources/Delay.h" #include "../../resources/MaxRE.h" #include "../../resources/ambisonicTools.h" #include "../JuceLibraryCode/JuceHeader.h" #include "LookAheadGainReduction.h" #define ProcessorClass OmniCompressorAudioProcessor //============================================================================== /** */ class OmniCompressorAudioProcessor : public AudioProcessorBase, IOTypes::Ambisonics<>> { public: constexpr static int numberOfInputChannels = 64; constexpr static int numberOfOutputChannels = 64; //============================================================================== OmniCompressorAudioProcessor(); ~OmniCompressorAudioProcessor() override; //============================================================================== void prepareToPlay (double sampleRate, int samplesPerBlock) override; void releaseResources() override; void processBlock (juce::AudioSampleBuffer&, juce::MidiBuffer&) override; //============================================================================== juce::AudioProcessorEditor* createEditor() override; bool hasEditor() const override; //============================================================================== int getNumPrograms() override; int getCurrentProgram() override; void setCurrentProgram (int index) override; const juce::String getProgramName (int index) override; void changeProgramName (int index, const juce::String& newName) override; //============================================================================== void getStateInformation (juce::MemoryBlock& destData) override; void setStateInformation (const void* data, int sizeInBytes) override; void parameterChanged (const juce::String& parameterID, float newValue) override; //======= Parameters =========================================================== std::vector> createParameterLayout(); //============================================================================== juce::Atomic maxRMS; juce::Atomic maxGR; iem::Compressor compressor; private: //============================================================================== Delay delay; LookAheadGainReduction grProcessing; juce::Array RMS, allGR; juce::AudioBuffer gains; float GR; std::atomic* orderSetting; std::atomic* threshold; std::atomic* outGain; std::atomic* ratio; std::atomic* attack; std::atomic* release; std::atomic* knee; std::atomic* lookAhead; std::atomic* reportLatency; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (OmniCompressorAudioProcessor) }; IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/OmniCompressor/Source/PluginEditor.h0000664002537200253720000000637015257173642031632 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once #include "../../resources/customComponents/CompressorVisualizer.h" #include "../../resources/customComponents/LevelMeter.h" #include "../../resources/customComponents/ReverseSlider.h" #include "../../resources/customComponents/SimpleLabel.h" #include "../../resources/customComponents/TitleBar.h" #include "../../resources/lookAndFeel/IEM_LaF.h" #include "../JuceLibraryCode/JuceHeader.h" #include "PluginProcessor.h" typedef ReverseSlider::SliderAttachment SliderAttachment; typedef juce::AudioProcessorValueTreeState::ComboBoxAttachment ComboBoxAttachment; typedef juce::AudioProcessorValueTreeState::ButtonAttachment ButtonAttachment; //============================================================================== /** */ class OmniCompressorAudioProcessorEditor : public juce::AudioProcessorEditor, private juce::Timer { public: OmniCompressorAudioProcessorEditor (OmniCompressorAudioProcessor&, juce::AudioProcessorValueTreeState&); ~OmniCompressorAudioProcessorEditor(); //============================================================================== void paint (juce::Graphics&) override; void resized() override; private: LaF globalLaF; OmniCompressorAudioProcessor& processor; juce::AudioProcessorValueTreeState& valueTreeState; TitleBar, NoIOWidget> title; OSCFooter footer; void timerCallback() override; ReverseSlider sliderKnee, sliderThreshold, sliderRatio, sliderAttackTime, sliderReleaseTime, sliderMakeupGain; std::unique_ptr cbNormalizationAtachement; std::unique_ptr cbOrderAtachement; std::unique_ptr KnAttachment; std::unique_ptr ThAttachment; std::unique_ptr RaAttachment; std::unique_ptr ATAttachment; std::unique_ptr RTAttachment; std::unique_ptr MGAttachment; juce::ToggleButton tbLookAhead; std::unique_ptr tbLookAheadAttachment; CompressorVisualizer characteristic; LevelMeter inpMeter, dbGRmeter; SimpleLabel lbKnee, lbThreshold, lbOutGain, lbRatio, lbAttack, lbRelease; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (OmniCompressorAudioProcessorEditor) }; IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/OmniCompressor/CMakeLists.txt0000664002537200253720000000375615257173642030361 0ustar zmoelnigzmoelnigset (PLUGIN_TARGET "") if (IEM_FORMATS) juce_add_plugin (OmniCompressor PLUGIN_MANUFACTURER_CODE IEMA PLUGIN_CODE OmCo ICON_BIG "../resources/Standalone/IEMPluginSuiteSmall.png" ICON_SMALL "../resources/Standalone/IEMPluginSuiteSmall.png" COMPANY_NAME "IEM" PRODUCT_NAME "OmniCompressor" FORMATS ${IEM_FORMATS} VERSION ${OmniCompressor_VERSION} LV2URI "http://plugins.iem.at/OmniCompressor" VST2_CATEGORY kPlugSurroundFx kPlugCategSpacializer kPlugCategEffect VST3_CATEGORIES Spatial Surround Fx Dynamics AAX_CATEGORY SoundField Dynamics) list (APPEND PLUGIN_TARGET OmniCompressor) endif() foreach (TARGET IN LISTS PLUGIN_TARGET) juce_generate_juce_header(${TARGET}) target_sources(${TARGET} PRIVATE Source/PluginEditor.cpp Source/PluginEditor.h Source/PluginProcessor.cpp Source/PluginProcessor.h Source/LookAheadGainReduction.h ../resources/OSC/OSCInputStream.h ../resources/OSC/OSCParameterInterface.cpp ../resources/OSC/OSCParameterInterface.h ../resources/OSC/OSCStatus.cpp ../resources/OSC/OSCStatus.h ../resources/OSC/OSCUtilities.h ../resources/efficientSHvanilla.cpp ) target_compile_definitions(${TARGET} PRIVATE JUCE_USE_CURL=0 JUCE_WEB_BROWSER=0 JUCE_USE_CUSTOM_PLUGIN_STANDALONE_APP=1 JUCE_USE_FLAC=0 JUCE_USE_OGGVORBIS=0 JUCE_USE_MP3AUDIOFORMAT=0 JUCE_USE_LAME_AUDIO_FORMAT=0 JUCE_USE_WINDOWS_MEDIA_FORMAT=0 JUCE_VST3_CAN_REPLACE_VST2=0) target_include_directories(${TARGET} PRIVATE Source) target_link_libraries(${TARGET} PRIVATE LAF_fonts IEM_logo juce::juce_audio_utils juce::juce_audio_plugin_client juce::juce_osc juce::juce_dsp juce::juce_opengl juce::juce_recommended_config_flags juce::juce_recommended_lto_flags) endforeach() IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/RoomEncoder/0000775002537200253720000000000015257173642025043 5ustar zmoelnigzmoelnig././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/RoomEncoder/createListOfReflections.mIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/RoomEncoder/createListOfReflections.0000664002537200253720000000055515257173642031633 0ustar zmoelnigzmoelnigxRange = -3:3; yRange = -3:3; zRange = -2:2; maxOrder = 7; cmbs = allcomb(xRange,yRange,zRange); order = sum(abs(cmbs),2); [order,idx] = sort(order); cmbs = cmbs(idx,:); sum (order <= maxOrder) refl = [cmbs(order<=maxOrder,:) order(order<=maxOrder)]; for o = 1 : maxOrder fprintf ('%i ', find(refl(:, 4) == o, 1) - 1) end %% mat2header('reflections',refl,1);IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/RoomEncoder/Source/0000775002537200253720000000000015257173642026303 5ustar zmoelnigzmoelnig././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/RoomEncoder/Source/PluginProcessor.cppIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/RoomEncoder/Source/PluginProcessor.c0000664002537200253720000014332515257173642031615 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #include "PluginProcessor.h" #include "PluginEditor.h" //============================================================================== RoomEncoderAudioProcessor::RoomEncoderAudioProcessor() : AudioProcessorBase ( #ifndef JucePlugin_PreferredChannelConfigurations BusesProperties() #if ! JucePlugin_IsMidiEffect #if ! JucePlugin_IsSynth .withInput ("Input", ((juce::PluginHostType::getPluginLoadedAs() == juce::AudioProcessor::wrapperType_VST3) ? juce::AudioChannelSet::ambisonic (1) : juce::AudioChannelSet::ambisonic (7)), true) #endif .withOutput ("Output", ((juce::PluginHostType::getPluginLoadedAs() == juce::AudioProcessor::wrapperType_VST3) ? juce::AudioChannelSet::ambisonic (1) : juce::AudioChannelSet::ambisonic (7)), true) #endif , #endif createParameterLayout()) { initializeReflectionList(); directivityOrderSetting = parameters.getRawParameterValue ("directivityOrderSetting"); inputIsSN3D = parameters.getRawParameterValue ("inputIsSN3D"); orderSetting = parameters.getRawParameterValue ("orderSetting"); useSN3D = parameters.getRawParameterValue ("useSN3D"); roomX = parameters.getRawParameterValue ("roomX"); roomY = parameters.getRawParameterValue ("roomY"); roomZ = parameters.getRawParameterValue ("roomZ"); sourceX = parameters.getRawParameterValue ("sourceX"); sourceY = parameters.getRawParameterValue ("sourceY"); sourceZ = parameters.getRawParameterValue ("sourceZ"); listenerX = parameters.getRawParameterValue ("listenerX"); listenerY = parameters.getRawParameterValue ("listenerY"); listenerZ = parameters.getRawParameterValue ("listenerZ"); numRefl = parameters.getRawParameterValue ("numRefl"); reflCoeff = parameters.getRawParameterValue ("reflCoeff"); renderDirectPath = parameters.getRawParameterValue ("renderDirectPath"); directPathZeroDelay = parameters.getRawParameterValue ("directPathZeroDelay"); directPathUnityGain = parameters.getRawParameterValue ("directPathUnityGain"); lowShelfFreq = parameters.getRawParameterValue ("lowShelfFreq"); lowShelfGain = parameters.getRawParameterValue ("lowShelfGain"); highShelfFreq = parameters.getRawParameterValue ("highShelfFreq"); highShelfGain = parameters.getRawParameterValue ("highShelfGain"); wallAttenuationFront = parameters.getRawParameterValue ("wallAttenuationFront"); wallAttenuationBack = parameters.getRawParameterValue ("wallAttenuationBack"); wallAttenuationLeft = parameters.getRawParameterValue ("wallAttenuationLeft"); wallAttenuationRight = parameters.getRawParameterValue ("wallAttenuationRight"); wallAttenuationCeiling = parameters.getRawParameterValue ("wallAttenuationCeiling"); wallAttenuationFloor = parameters.getRawParameterValue ("wallAttenuationFloor"); constantGainDistance = parameters.getRawParameterValue ("constantGainDistance"); parameters.addParameterListener ("directivityOrderSetting", this); parameters.addParameterListener ("orderSetting", this); parameters.addParameterListener ("lowShelfFreq", this); parameters.addParameterListener ("lowShelfGain", this); parameters.addParameterListener ("highShelfFreq", this); parameters.addParameterListener ("highShelfGain", this); parameters.addParameterListener ("reflCoeff", this); parameters.addParameterListener ("numRefl", this); parameters.addParameterListener ("listenerX", this); parameters.addParameterListener ("listenerY", this); parameters.addParameterListener ("listenerZ", this); parameters.addParameterListener ("sourceX", this); parameters.addParameterListener ("sourceY", this); parameters.addParameterListener ("sourceZ", this); parameters.addParameterListener ("roomX", this); parameters.addParameterListener ("roomY", this); parameters.addParameterListener ("roomZ", this); parameters.addParameterListener ("wallAttenuationFront", this); parameters.addParameterListener ("wallAttenuationBack", this); parameters.addParameterListener ("wallAttenuationLeft", this); parameters.addParameterListener ("wallAttenuationRight", this); parameters.addParameterListener ("wallAttenuationCeiling", this); parameters.addParameterListener ("wallAttenuationFloor", this); roomSync.addGroup (RoomSync::roomDimensions, "syncRoomSize", { "roomX", "roomY", "roomZ" }); roomSync.addGroup (RoomSync::listenerPosition, "syncListener", { "listenerX", "listenerY", "listenerZ" }); roomSync.addGroup (RoomSync::reflectionProperties, "syncReflection", { "reflCoeff", "numRefl", "lowShelfFreq", "lowShelfGain", "highShelfFreq", "highShelfGain", "wallAttenuationFront", "wallAttenuationBack", "wallAttenuationLeft", "wallAttenuationRight", "wallAttenuationCeiling", "wallAttenuationFloor" }); _numRefl = 0; sourcePos = juce::Vector3D (*sourceX, *sourceY, *sourceZ); listenerPos = juce::Vector3D (*listenerX, *listenerY, *listenerZ); for (int i = 0; i < nImgSrc; ++i) { oldDelay[i] = 44100 / 343.2f * interpMult; //init oldRadius allGains[i] = 0.0f; juce::FloatVectorOperations::clear (SHcoeffsOld[i], 64); juce::FloatVectorOperations::clear ((float*) &SHsampleOld[i], 64); } lowShelfCoefficients = IIR::Coefficients::makeLowShelf ( 48000, *lowShelfFreq, 0.707f, juce::Decibels::decibelsToGain (lowShelfGain->load())); highShelfCoefficients = IIR::Coefficients::makeHighShelf ( 48000, *highShelfFreq, 0.707f, juce::Decibels::decibelsToGain (highShelfGain->load())); lowShelfArray.clear(); highShelfArray.clear(); for (int o = 0; o < maxOrderImgSrc; ++o) { lowShelfArray.add (new juce::OwnedArray>); highShelfArray.add (new juce::OwnedArray>); for (int i = 0; i < maxNumSIMDFilters; ++i) { lowShelfArray[o]->add (new IIR::Filter (lowShelfCoefficients)); highShelfArray[o]->add (new IIR::Filter (highShelfCoefficients)); } } } RoomEncoderAudioProcessor::~RoomEncoderAudioProcessor() { } //============================================================================== void RoomEncoderAudioProcessor::initializeReflectionList() { reflectionList.clear(); // just to be save for (int i = 0; i < nImgSrc; ++i) { const int x = reflList[i][0]; const int y = reflList[i][1]; const int z = reflList[i][2]; const int order = reflList[i][3]; int xPosRefl = 0; int xNegRefl = 0; int yPosRefl = 0; int yNegRefl = 0; int zPosRefl = 0; int zNegRefl = 0; for (int i = x; i != 0;) { if (i > 0) { --i; ++xPosRefl; } else { ++i; ++xNegRefl; } i *= -1; } for (int i = y; i != 0;) { if (i > 0) { --i; ++yPosRefl; } else { ++i; ++yNegRefl; } i *= -1; } for (int i = z; i != 0;) { if (i > 0) { --i; ++zPosRefl; } else { ++i; ++zNegRefl; } i *= -1; } reflectionList.add (new ReflectionProperty { x, y, z, order, xPosRefl, xNegRefl, yPosRefl, yNegRefl, zPosRefl, zNegRefl }); // DBG (xPosRefl << " " << xNegRefl << " " << yPosRefl << " " << yNegRefl << " " << zPosRefl << " " << zNegRefl); } } //============================================================================== int RoomEncoderAudioProcessor::getNumPrograms() { return 1; // NB: some hosts don't cope very well if you tell them there are 0 programs, // so this should be at least 1, even if you're not really implementing programs. } int RoomEncoderAudioProcessor::getCurrentProgram() { return 0; } void RoomEncoderAudioProcessor::setCurrentProgram (int index) { } const juce::String RoomEncoderAudioProcessor::getProgramName (int index) { return {}; } void RoomEncoderAudioProcessor::changeProgramName (int index, const juce::String& newName) { } //============================================================================== void RoomEncoderAudioProcessor::prepareToPlay (double sampleRate, int samplesPerBlock) { dist2smpls = sampleRate / 343.2f * interpMult; //factor 128 is a small hack for Lagrange lookuptable checkInputAndOutput (this, *directivityOrderSetting, *orderSetting, true); readOffset = 0; bufferReadIdx = 0; interleavedData.clear(); for (int i = 0; i < maxNumSIMDFilters; ++i) { for (int o = 0; o < maxOrderImgSrc; ++o) { lowShelfArray[o]->getUnchecked (i)->reset (IIRfloat (0.0f)); highShelfArray[o]->getUnchecked (i)->reset (IIRfloat (0.0f)); } interleavedData.add ( new juce::dsp::AudioBlock (interleavedBlockData[i], 1, samplesPerBlock)); //interleavedData.getLast()->clear(); // broken in JUCE 5.4.5 clear (*interleavedData.getLast()); } zero = juce::dsp::AudioBlock (zeroData, IIRfloat_elements, samplesPerBlock); zero.clear(); updateFv = true; const float rX = *roomX; const float rY = *roomY; const float rZ = *roomZ; const float rXHalfBound = rX / 2 - 0.1f; const float rYHalfBound = rY / 2 - 0.1f; const float rZHalfBound = rZ / 2 - 0.1f; sourcePos = juce::Vector3D (juce::jlimit (-rXHalfBound, rXHalfBound, sourceX->load()), juce::jlimit (-rYHalfBound, rYHalfBound, sourceY->load()), juce::jlimit (-rZHalfBound, rZHalfBound, sourceZ->load())); listenerPos = juce::Vector3D (juce::jlimit (-rXHalfBound, rXHalfBound, listenerX->load()), juce::jlimit (-rYHalfBound, rYHalfBound, listenerY->load()), juce::jlimit (-rZHalfBound, rZHalfBound, listenerZ->load())); calculateImageSourcePositions (rX, rY, rZ); for (int q = 0; q < nImgSrc; ++q) oldDelay[q] = mRadius[q] * dist2smpls; updateFilterCoefficients (sampleRate); } void RoomEncoderAudioProcessor::releaseResources() { } void RoomEncoderAudioProcessor::parameterChanged (const juce::String& parameterID, float newValue) { if (parameterID == "orderSetting" || parameterID == "directivityOrderSetting") userChangedIOSettings = true; else if (parameterID == "reflCoeff") { updateFv = true; } else if (parameterID == "lowShelfFreq" || parameterID == "lowShelfGain" || parameterID == "highShelfFreq" || parameterID == "highShelfGain") userChangedFilterSettings = true; else if (parameterID.startsWith ("source") || parameterID.startsWith ("listener")) { repaintPositionPlanes = true; } } void RoomEncoderAudioProcessor::updateFilterCoefficients (double sampleRate) { const auto lowFreq = juce::jmin (static_cast (0.5 * sampleRate), lowShelfFreq->load()); *lowShelfCoefficients = *IIR::Coefficients::makeLowShelf ( sampleRate, lowFreq, 0.707f, juce::Decibels::decibelsToGain (lowShelfGain->load())); const auto highFreq = juce::jmin (static_cast (0.5 * sampleRate), highShelfFreq->load()); *highShelfCoefficients = *IIR::Coefficients::makeHighShelf ( sampleRate, highFreq, 0.707f, juce::Decibels::decibelsToGain (highShelfGain->load())); userChangedFilterSettings = false; updateFv = true; } void RoomEncoderAudioProcessor::calculateImageSourcePositions (const float t, const float b, const float h) { for (int q = 0; q < nImgSrc; ++q) { const int m = reflectionList[q]->x; const int n = reflectionList[q]->y; const int o = reflectionList[q]->z; mx[q] = m * t + mSig[m & 1] * sourcePos.x - listenerPos.x; my[q] = n * b + mSig[n & 1] * sourcePos.y - listenerPos.y; mz[q] = o * h + mSig[o & 1] * sourcePos.z - listenerPos.z; mRadius[q] = sqrt (mx[q] * mx[q] + my[q] * my[q] + mz[q] * mz[q]); mx[q] /= mRadius[q]; my[q] /= mRadius[q]; mz[q] /= mRadius[q]; jassert (mRadius[q] >= mRadius[0]); smx[q] = -mSig[m & 1] * mx[q]; smy[q] = -mSig[n & 1] * my[q]; smz[q] = -mSig[o & 1] * mz[q]; } } void RoomEncoderAudioProcessor::processBlock (juce::AudioSampleBuffer& buffer, juce::MidiBuffer& midiMessages) { juce::ScopedNoDenormals noDenormals; checkInputAndOutput (this, *directivityOrderSetting, *orderSetting); // =============================== settings and parameters const int maxNChIn = juce::jmin (buffer.getNumChannels(), input.getNumberOfChannels()); const int maxNChOut = juce::jmin (buffer.getNumChannels(), output.getNumberOfChannels()); const int directivityOrder = input.getOrder(); const int ambisonicOrder = output.getOrder(); const int sampleRate = getSampleRate(); const int L = buffer.getNumSamples(); const float oneOverL = 1.0 / ((double) L); const bool doInputSn3dToN3dConversion = *inputIsSN3D > 0.5f; float* pBufferWrite = buffer.getWritePointer (0); const float* pBufferRead = buffer.getReadPointer (0); const int nSIMDFilters = 1 + (maxNChIn - 1) / IIRfloat_elements; const auto delayBufferWritePtrArray = delayBuffer.getArrayOfWritePointers(); if (maxNChIn < 1) return; // update iir filter coefficients if (userChangedFilterSettings) updateFilterCoefficients (sampleRate); using Format = juce::AudioData::Format; //interleave input data int partial = maxNChIn % IIRfloat_elements; if (partial == 0) { for (int i = 0; i < nSIMDFilters; ++i) { juce::AudioData::interleaveSamples ( juce::AudioData::NonInterleavedSource { buffer.getArrayOfReadPointers() + i * IIRfloat_elements, IIRfloat_elements }, juce::AudioData::InterleavedDest { reinterpret_cast (interleavedData[i]->getChannelPointer (0)), IIRfloat_elements }, L); } } else { int i; for (i = 0; i < nSIMDFilters - 1; ++i) { juce::AudioData::interleaveSamples ( juce::AudioData::NonInterleavedSource { buffer.getArrayOfReadPointers() + i * IIRfloat_elements, IIRfloat_elements }, juce::AudioData::InterleavedDest { reinterpret_cast (interleavedData[i]->getChannelPointer (0)), IIRfloat_elements }, L); } const float* addr[IIRfloat_elements]; size_t ch; for (ch = 0; ch < partial; ++ch) { addr[ch] = buffer.getReadPointer (i * IIRfloat_elements + static_cast (ch)); } for (; ch < IIRfloat_elements; ++ch) { addr[ch] = zero.getChannelPointer (ch); } juce::AudioData::interleaveSamples ( juce::AudioData::NonInterleavedSource { addr, IIRfloat_elements }, juce::AudioData::InterleavedDest { reinterpret_cast (interleavedData[i]->getChannelPointer (0)), IIRfloat_elements }, L); } int currNumRefl = juce::roundToInt (numRefl->load()); int workingNumRefl = (currNumRefl < _numRefl) ? _numRefl : currNumRefl; // calculating reflection coefficients (only if parameter changed) float reflCoeffGain = juce::Decibels::decibelsToGain (reflCoeff->load()); if (powReflCoeff[1] != reflCoeffGain) { powReflCoeff[0] = 1; powReflCoeff[1] = reflCoeffGain; for (int i = 2; i <= maxOrderImgSrc; ++i) { powReflCoeff[i] = powReflCoeff[i - 1] * reflCoeffGain; } } const float rX = *roomX; const float rY = *roomY; const float rZ = *roomZ; const float rXHalfBound = rX / 2 - 0.1f; const float rYHalfBound = rY / 2 - 0.1f; const float rZHalfBound = rZ / 2 - 0.1f; //===== LIMIT MOVING SPEED OF SOURCE AND LISTENER =============================== const float maxDist = 30.0f / sampleRate * L; // 30 meters per second { const juce::Vector3D targetSourcePos (*sourceX, *sourceY, *sourceZ); const auto sourcePosDiff = targetSourcePos - sourcePos; const float sourcePosDiffLength = sourcePosDiff.length(); if (sourcePosDiffLength > maxDist) sourcePos += sourcePosDiff * maxDist / sourcePosDiffLength; else sourcePos = targetSourcePos; sourcePos = juce::Vector3D (juce::jlimit (-rXHalfBound, rXHalfBound, sourcePos.x), juce::jlimit (-rYHalfBound, rYHalfBound, sourcePos.y), juce::jlimit (-rZHalfBound, rZHalfBound, sourcePos.z)); const juce::Vector3D listenerSourcePos (*listenerX, *listenerY, *listenerZ); const auto listenerPosDiff = listenerSourcePos - listenerPos; const float listenerPosDiffLength = listenerPosDiff.length(); if (listenerPosDiffLength > maxDist) listenerPos += listenerPosDiff * maxDist / listenerPosDiffLength; else listenerPos = listenerSourcePos; listenerPos = juce::Vector3D (juce::jlimit (-rXHalfBound, rXHalfBound, listenerPos.x), juce::jlimit (-rYHalfBound, rYHalfBound, listenerPos.y), juce::jlimit (-rZHalfBound, rZHalfBound, listenerPos.z)); } float* pMonoBufferWrite = monoBuffer.getWritePointer (0); calculateImageSourcePositions (rX, rY, rZ); for (int q = 0; q < workingNumRefl + 1; ++q) { const int idx = filterPoints.indexOf (q); if (idx != -1) { for (int i = 0; i < nSIMDFilters; ++i) { const IIRfloat* chPtr[1]; chPtr[0] = interleavedData[i]->getChannelPointer (0); juce::dsp::AudioBlock ab (const_cast (chPtr), 1, L); juce::dsp::ProcessContextReplacing context (ab); lowShelfArray[idx]->getUnchecked (i)->process (context); highShelfArray[idx]->getUnchecked (i)->process (context); } } // ======================================== CALCULATE SAMPLED MONO SIGNALS IIRfloat SHsample[maxNumSIMDFilters]; //TODO: can be smaller: (N+1)^2/IIRfloat_elements IIRfloat SHsampleStep[maxNumSIMDFilters]; #if JUCE_USE_SIMD juce::FloatVectorOperations::clear ((float*) &SHsample->value, IIRfloat_elements * sizeof (SHsample) / sizeof (*SHsample)); SHEval (directivityOrder, smx[q], smy[q], smz[q], (float*) &SHsample->value, false); // deoding -> false #else /* !JUCE_USE_SIMD */ juce::FloatVectorOperations::clear ((float*) SHsample, IIRfloat_elements * sizeof (SHsample) / sizeof (*SHsample)); SHEval (directivityOrder, smx[q], smy[q], smz[q], (float*) SHsample, false); // deoding -> false #endif /* JUCE_USE_SIMD */ if (doInputSn3dToN3dConversion) juce::FloatVectorOperations::multiply ((float*) SHsample, sn3d2n3d, maxNChIn); juce::Array interleavedDataPtr; interleavedDataPtr.resize (nSIMDFilters); IIRfloat** intrlvdDataArrayPtr = interleavedDataPtr.getRawDataPointer(); for (int i = 0; i < nSIMDFilters; ++i) { intrlvdDataArrayPtr[i] = reinterpret_cast (interleavedData[i]->getChannelPointer (0)); SHsampleStep[i] = SHsample[i] - SHsampleOld[q][i]; SHsampleStep[i] *= oneOverL; SHsample[i] = SHsampleOld[q][i]; } for (int smpl = 0; smpl < L; ++smpl) { IIRfloat SIMDTemp; SIMDTemp = 0.0f; for (int i = 0; i < nSIMDFilters; ++i) { SIMDTemp += SHsample[i] * *(intrlvdDataArrayPtr[i]++); SHsample[i] += SHsampleStep[i]; } #if JUCE_USE_SIMD pBufferWrite[smpl] = SIMDTemp.sum(); #else /* !JUCE_USE_SIMD */ pBufferWrite[smpl] = SIMDTemp; #endif /* JUCE_USE_SIMD */ } // ============================================ double delayOffset = *directPathZeroDelay > 0.5f ? mRadius[0] * dist2smpls : 0.0; double delay, delayStep; int firstIdx, copyL; delay = mRadius[q] * dist2smpls - delayOffset; // dist2smpls also contains factor 128 for LUT delayStep = (delay - oldDelay[q]) * oneOverL; //calculate firstIdx and copyL int startIdx = ((int) oldDelay[q]) >> interpShift; int stopIdx = L - 1 + (((int) (oldDelay[q] + delayStep * L - 1)) >> interpShift); // ((int)(startIdx + delayStep * L-1))>>7 firstIdx = juce::jmin (startIdx, stopIdx); copyL = abs (stopIdx - startIdx) + interpLength; monoBuffer.clear ( 0, firstIdx, copyL); //TODO: optimization idea: resample input to match delay stretching float* tempWritePtr = pMonoBufferWrite; //reset writePtr as it gets increased during the next for loop const float* readPtr = pBufferRead; double tempDelay = oldDelay[q]; //start from oldDelay and add delayStep after each iteration; //int interpCoeffIdx; for (int smplIdx = 0; smplIdx < L; ++smplIdx) { //int delayInt; = truncatePositiveToUnsignedInt(tempDelay); //(int)tempDelay; float integer; float fraction = modff (tempDelay, &integer); int delayInt = (int) integer; int interpCoeffIdx = delayInt & interpMask; delayInt = delayInt >> interpShift; int idx = delayInt; float* dest = tempWritePtr++ + idx; #if JUCE_USE_SSE_INTRINSICS __m128 destSamples = _mm_loadu_ps (dest); __m128 srcSample = _mm_set1_ps (*readPtr++); __m128 interp = getInterpolatedLagrangeWeights (interpCoeffIdx, fraction); destSamples = _mm_add_ps (destSamples, _mm_mul_ps (interp, srcSample)); _mm_storeu_ps (dest, destSamples); #else /* !JUCE_USE_SSE_INTRINSICS */ float interp[4]; getInterpolatedLagrangeWeights (interpCoeffIdx, fraction, interp); float src = *readPtr++; dest[0] += interp[0] * src; dest[1] += interp[1] * src; dest[2] += interp[2] * src; dest[3] += interp[3] * src; #endif /* JUCE_USE_SSE_INTRINSICS */ tempDelay += delayStep; } const float* monoBufferReadPtrWithOffset = monoBuffer.getReadPointer (0) + firstIdx; firstIdx = firstIdx + readOffset; if (firstIdx >= bufferSize) firstIdx -= bufferSize; float SHcoeffs[64]; float SHcoeffsStep[64]; if (q <= currNumRefl) { SHEval (ambisonicOrder, mx[q], my[q], mz[q], SHcoeffs, true); // encoding -> true if (*useSN3D > 0.5f) { juce::FloatVectorOperations::multiply (SHcoeffs, SHcoeffs, n3d2sn3d, maxNChOut); } } else juce::FloatVectorOperations::clear (SHcoeffs, 64); float gain = powReflCoeff[reflectionList[q]->order] / juce::jmax ( mRadius[q], constantGainDistance->load()); // Regularize radius to avoid division by zero if (*directPathUnityGain > 0.5f) gain *= mRadius[0]; // additional wall attenuations float extraAttenuationInDb = 0.0f; auto reflProp = *reflectionList[q]; extraAttenuationInDb += reflProp.xPlusReflections * *wallAttenuationFront; extraAttenuationInDb += reflProp.xMinusReflections * *wallAttenuationBack; extraAttenuationInDb += reflProp.yPlusReflections * *wallAttenuationLeft; extraAttenuationInDb += reflProp.yMinusReflections * *wallAttenuationRight; extraAttenuationInDb += reflProp.zPlusReflections * *wallAttenuationCeiling; extraAttenuationInDb += reflProp.zMinusReflections * *wallAttenuationFloor; gain *= juce::Decibels::decibelsToGain (extraAttenuationInDb); // direct path rendering if (q == 0 && *renderDirectPath < 0.5f) { allGains[0] = 0.0f; continue; } allGains[q] = gain; // for reflectionVisualizer juce::FloatVectorOperations::multiply (SHcoeffs, gain, maxNChOut); juce::FloatVectorOperations::subtract (SHcoeffsStep, SHcoeffs, SHcoeffsOld[q], maxNChOut); juce::FloatVectorOperations::multiply (SHcoeffsStep, 1.0f / copyL, maxNChOut); if (firstIdx + copyL - 1 >= bufferSize) { int firstNumCopy = bufferSize - firstIdx; int secondNumCopy = copyL - firstNumCopy; for (int channel = 0; channel < maxNChOut; ++channel) { if (SHcoeffsOld[q][channel] != SHcoeffs[channel]) { #if defined(JUCE_USE_VDSP_FRAMEWORK) && defined(JUCE_MAC) vDSP_vrampmuladd (monoBufferReadPtrWithOffset, 1, //input vector with stride &SHcoeffsOld[q][channel], //ramp start value (gets increased) &SHcoeffsStep[channel], //step value delayBufferWritePtrArray[channel] + firstIdx, 1, // output with stride (size_t) firstNumCopy //num ); vDSP_vrampmuladd (monoBufferReadPtrWithOffset + firstNumCopy, 1, //input vector with stride &SHcoeffsOld[q][channel], //ramp start value (gets increased) &SHcoeffsStep[channel], //step value delayBufferWritePtrArray[channel], 1, // output with stride (size_t) secondNumCopy //num ); #else delayBuffer.addFromWithRamp (channel, firstIdx, monoBufferReadPtrWithOffset, firstNumCopy, SHcoeffsOld[q][channel], SHcoeffsOld[q][channel] + SHcoeffsStep[channel] * firstNumCopy); delayBuffer.addFromWithRamp (channel, 0, monoBufferReadPtrWithOffset + firstNumCopy, secondNumCopy, SHcoeffsOld[q][channel] + SHcoeffsStep[channel] * firstNumCopy, SHcoeffs[channel]); #endif } else { juce::FloatVectorOperations::addWithMultiply (delayBufferWritePtrArray[channel] + firstIdx, monoBufferReadPtrWithOffset, SHcoeffs[channel], firstNumCopy); juce::FloatVectorOperations::addWithMultiply (delayBufferWritePtrArray[channel], monoBufferReadPtrWithOffset + firstNumCopy, SHcoeffs[channel], secondNumCopy); } } } else { for (int channel = 0; channel < maxNChOut; ++channel) { if (SHcoeffsOld[q][channel] != SHcoeffs[channel]) { #if defined(JUCE_USE_VDSP_FRAMEWORK) && defined(JUCE_MAC) vDSP_vrampmuladd (monoBufferReadPtrWithOffset, 1, //input vector with stride &SHcoeffsOld[q][channel], //ramp start value (gets increased) &SHcoeffsStep[channel], //step value delayBufferWritePtrArray[channel] + firstIdx, 1, // output with stride (size_t) copyL //num ); #else delayBuffer.addFromWithRamp (channel, firstIdx, monoBufferReadPtrWithOffset, copyL, SHcoeffsOld[q][channel], SHcoeffs[channel]); #endif } else { juce::FloatVectorOperations::addWithMultiply (delayBufferWritePtrArray[channel] + firstIdx, monoBufferReadPtrWithOffset, SHcoeffs[channel], copyL); } } } juce::FloatVectorOperations::copy (SHcoeffsOld[q], SHcoeffs, maxNChOut); #if JUCE_USE_SIMD juce::FloatVectorOperations::copy ((float*) &SHsampleOld[q]->value, (float*) &SHsample->value, maxNChIn); #else /* !JUCE_USE_SIMD */ juce::FloatVectorOperations::copy ((float*) SHsampleOld[q], (float*) SHsample, maxNChIn); #endif /* JUCE_USE_SIMD */ //oldDelay[q] = delay; oldDelay[q] = tempDelay; } //updating the remaining oldDelay values for (int q = workingNumRefl + 1; q < nImgSrc; ++q) oldDelay[q] = mRadius[q] * dist2smpls; // ======= Read from delayBuffer and clear read content ============== buffer.clear(); const int blockSize1 = juce::jmin (bufferSize - readOffset, L); for (int channel = 0; channel < maxNChOut; ++channel) { buffer.copyFrom (channel, 0, delayBufferWritePtrArray[channel] + readOffset, blockSize1); delayBuffer.clear (channel, readOffset, blockSize1); } const int numLeft = L - blockSize1; if (numLeft > 0) { for (int channel = 0; channel < maxNChOut; ++channel) { buffer.copyFrom (channel, 0, delayBufferWritePtrArray[channel], numLeft); delayBuffer.clear (channel, 0, numLeft); } } _numRefl = currNumRefl; readOffset += L; if (readOffset >= bufferSize) readOffset -= bufferSize; } //============================================================================== bool RoomEncoderAudioProcessor::hasEditor() const { return true; // (change this to false if you choose to not supply an editor) } juce::AudioProcessorEditor* RoomEncoderAudioProcessor::createEditor() { return new RoomEncoderAudioProcessorEditor (*this, parameters); } //============================================================================== void RoomEncoderAudioProcessor::getStateInformation (juce::MemoryBlock& destData) { auto state = parameters.copyState(); auto oscConfig = state.getOrCreateChildWithName ("OSCConfig", nullptr); oscConfig.copyPropertiesFrom (oscParameterInterface.getConfig(), nullptr); std::unique_ptr xml (state.createXml()); copyXmlToBinary (*xml, destData); } void RoomEncoderAudioProcessor::setStateInformation (const void* data, int sizeInBytes) { std::unique_ptr xmlState (getXmlFromBinary (data, sizeInBytes)); if (xmlState.get() != nullptr) if (xmlState->hasTagName (parameters.state.getType())) { parameters.replaceState (juce::ValueTree::fromXml (*xmlState)); if (parameters.state.hasProperty ("OSCPort")) // legacy { oscParameterInterface.getOSCReceiver().connect ( parameters.state.getProperty ("OSCPort", juce::var (-1))); parameters.state.removeProperty ("OSCPort", nullptr); } auto oscConfig = parameters.state.getChildWithName ("OSCConfig"); if (oscConfig.isValid()) oscParameterInterface.setConfig (oscConfig); } } void RoomEncoderAudioProcessor::updateBuffers() { DBG ("IOHelper: input size: " << input.getSize()); DBG ("IOHelper: output size: " << output.getSize()); const int nChOut = output.getNumberOfChannels(); const int samplesPerBlock = getBlockSize(); bufferSize = round (180.0f / 343.2f * getSampleRate()) + samplesPerBlock + 100; bufferSize += samplesPerBlock - bufferSize % samplesPerBlock; monoBuffer.setSize (1, bufferSize); monoBuffer.clear(); delayBuffer.setSize (nChOut, bufferSize); delayBuffer.clear(); if (input.getSize() != input.getPreviousSize()) { for (int i = 0; i < interleavedData.size(); ++i) { //interleavedData[i]->clear(); // broken in JUCE 5.4.5 clear (*interleavedData[i]); } } } //============================================================================== std::vector> RoomEncoderAudioProcessor::createParameterLayout() { std::vector> params; params.push_back (OSCParameterInterface::createParameterTheOldWay ( "directivityOrderSetting", "Input Directivity Order", "", juce::NormalisableRange (0.0f, 8.0f, 1.0f), 1.0f, [] (float value) { if (value >= 0.5f && value < 1.5f) return "0th"; else if (value >= 1.5f && value < 2.5f) return "1st"; else if (value >= 2.5f && value < 3.5f) return "2nd"; else if (value >= 3.5f && value < 4.5f) return "3rd"; else if (value >= 4.5f && value < 5.5f) return "4th"; else if (value >= 5.5f && value < 6.5f) return "5th"; else if (value >= 6.5f && value < 7.5f) return "6th"; else if (value >= 7.5f) return "7th"; else return "Auto"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "inputIsSN3D", "Input Directivity Normalization", "", juce::NormalisableRange (0.0f, 1.0f, 1.0f), 1.0f, [] (float value) { if (value >= 0.5f) return "SN3D"; else return "N3D"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "orderSetting", "Output Ambisonics Order", "", juce::NormalisableRange (0.0f, 8.0f, 1.0f), 0.0f, [] (float value) { if (value >= 0.5f && value < 1.5f) return "0th"; else if (value >= 1.5f && value < 2.5f) return "1st"; else if (value >= 2.5f && value < 3.5f) return "2nd"; else if (value >= 3.5f && value < 4.5f) return "3rd"; else if (value >= 4.5f && value < 5.5f) return "4th"; else if (value >= 5.5f && value < 6.5f) return "5th"; else if (value >= 6.5f && value < 7.5f) return "6th"; else if (value >= 7.5f) return "7th"; else return "Auto"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "useSN3D", "Normalization", "", juce::NormalisableRange (0.0f, 1.0f, 1.0f), 1.0f, [] (float value) { if (value >= 0.5f) return "SN3D"; else return "N3D"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "roomX", "room size x", "m", juce::NormalisableRange (1.0f, 30.0f, 0.01f), 10.0f, [] (float value) { return juce::String (value, 2); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "roomY", "room size y", "m", juce::NormalisableRange (1.0f, 30.0f, 0.01f), 11.0f, [] (float value) { return juce::String (value, 2); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "roomZ", "room size z", "m", juce::NormalisableRange (1.0f, 20.0f, 0.01f), 7.0f, [] (float value) { return juce::String (value, 2); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "sourceX", "source position x", "m", juce::NormalisableRange (-15.0f, 15.0f, 0.001f), 1.0f, [] (float value) { return juce::String (value, 3); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "sourceY", "source position y", "m", juce::NormalisableRange (-15.0f, 15.0f, 0.001f), 1.0f, [] (float value) { return juce::String (value, 3); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "sourceZ", "source position z", "m", juce::NormalisableRange (-10.0f, 10.0f, 0.001f), -1.0f, [] (float value) { return juce::String (value, 3); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "listenerX", "listener position x", "m", juce::NormalisableRange (-15.0f, 15.0f, 0.001f), -1.0f, [] (float value) { return juce::String (value, 3); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "listenerY", "listener position y", "m", juce::NormalisableRange (-15.0f, 15.0f, 0.001f), -1.0f, [] (float value) { return juce::String (value, 3); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "listenerZ", "listener position z", "m", juce::NormalisableRange (-10.0f, 10.0f, 0.001f), -1.0f, [] (float value) { return juce::String (value, 3); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "numRefl", "number of reflections", "", juce::NormalisableRange (0.0f, nImgSrc - 1, 1.0f), 33.0f, [] (float value) { return juce::String ((int) value); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "lowShelfFreq", "LowShelf Frequency", "Hz", juce::NormalisableRange (20.0f, 20000.0f, 1.0f, 0.2f), 100.0, [] (float value) { return juce::String ((int) value); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "lowShelfGain", "LowShelf Gain", "dB", juce::NormalisableRange (-15.0f, 5.0f, 0.1f), -5.0f, [] (float value) { return juce::String (value, 1); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "highShelfFreq", "HighShelf Frequency", "Hz", juce::NormalisableRange (20., 20000.0f, 1.0f, 0.2f), 8000.0, [] (float value) { return juce::String ((int) value); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "highShelfGain", "HighShelf Gain", "dB", juce::NormalisableRange (-15.0f, 5.0f, 0.1f), -5.0f, [] (float value) { return juce::String (value, 1); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "reflCoeff", "Reflection Coefficient", "dB", juce::NormalisableRange (-15.0f, 0.0f, 0.01f), -1.0f, [] (float value) { return juce::String (value, 2); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "syncChannel", "Synchronize to Channel", "", juce::NormalisableRange (0.0f, 4.0f, 1.0f), 0.0f, [] (float value) { if (value >= 0.5f && value < 1.5f) return "Channel 1"; else if (value >= 1.5f && value < 2.5f) return "Channel 2"; else if (value >= 2.5f && value < 3.5f) return "Channel 3"; else if (value >= 3.5f) return "Channel 4"; else return "None"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "syncRoomSize", "Synchronize Room Dimensions", "", juce::NormalisableRange (0.0f, 1.0f, 1.0f), 1.0f, [] (float value) { if (value >= 0.5f) return "YES"; else return "NO"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "syncReflection", "Synchronize Reflection Properties", "", juce::NormalisableRange (0.0f, 1.0f, 1.0f), 1.0f, [] (float value) { if (value >= 0.5f) return "YES"; else return "NO"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "syncListener", "Synchronize Listener Position", "", juce::NormalisableRange (0.0f, 1.0f, 1.0f), 1.0f, [] (float value) { if (value >= 0.5f) return "YES"; else return "NO"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "renderDirectPath", "Render Direct juce::Path", "", juce::NormalisableRange (0.0f, 1.0f, 1.0f), 1.0f, [] (float value) { if (value >= 0.5f) return "YES"; else return "NO"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "directPathZeroDelay", "Zero-Delay for Direct juce::Path", "", juce::NormalisableRange (0.0f, 1.0f, 1.0f), 0.0f, [] (float value) { if (value >= 0.5f) return "ON"; else return "OFF"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "directPathUnityGain", "Unity-Gain for Direct juce::Path", "", juce::NormalisableRange (0.0f, 1.0f, 1.0f), 0.0f, [] (float value) { if (value >= 0.5f) return "ON"; else return "OFF"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "wallAttenuationFront", "Front wall attenuation", "dB", juce::NormalisableRange (-50.0f, 0.0f, 0.01f, 3.0f), 0.0f, [] (float value) { return juce::String (value, 2); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "wallAttenuationBack", "Back wall attenuation", "dB", juce::NormalisableRange (-50.0f, 0.0f, 0.01f, 3.0f), 0.0f, [] (float value) { return juce::String (value, 2); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "wallAttenuationLeft", "Left wall attenuation", "dB", juce::NormalisableRange (-50.0f, 0.0f, 0.01f, 3.0f), 0.0f, [] (float value) { return juce::String (value, 2); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "wallAttenuationRight", "Right wall attenuation", "dB", juce::NormalisableRange (-50.0f, 0.0f, 0.01f, 3.0f), 0.0f, [] (float value) { return juce::String (value, 2); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "wallAttenuationCeiling", "Ceiling attenuation", "dB", juce::NormalisableRange (-50.0f, 0.0f, 0.01f, 3.0f), 0.0f, [] (float value) { return juce::String (value, 2); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "wallAttenuationFloor", "Floor attenuation", "dB", juce::NormalisableRange (-50.0f, 0.0f, 0.01f, 3.0f), 0.0f, [] (float value) { return juce::String (value, 2); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "constantGainDistance", "Constant Gain Distance", "m", juce::NormalisableRange (0.001f, 1.0f, 0.001f), 0.1f, [] (float value) { return juce::String (value, 3); }, nullptr)); return params; } inline void RoomEncoderAudioProcessor::clear (juce::dsp::AudioBlock& ab) { const int N = static_cast (ab.getNumSamples()) * IIRfloat_elements; const int nCh = static_cast (ab.getNumChannels()); for (int ch = 0; ch < nCh; ++ch) juce::FloatVectorOperations::clear (reinterpret_cast (ab.getChannelPointer (ch)), N); } //============================================================================== // This creates new instances of the plugin.. juce::AudioProcessor* JUCE_CALLTYPE createPluginFilter() { return new RoomEncoderAudioProcessor(); } IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/RoomEncoder/Source/PluginEditor.cpp0000664002537200253720000007566615257173642031440 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #include "PluginEditor.h" #include "PluginProcessor.h" //============================================================================== RoomEncoderAudioProcessorEditor::RoomEncoderAudioProcessorEditor ( RoomEncoderAudioProcessor& p, juce::AudioProcessorValueTreeState& vts) : juce::AudioProcessorEditor (&p), footer (p.getOSCParameterInterface()), processor (p), valueTreeState (vts), sourceElement (*valueTreeState.getParameter ("sourceX"), valueTreeState.getParameterRange ("sourceX"), *valueTreeState.getParameter ("sourceY"), valueTreeState.getParameterRange ("sourceY"), *valueTreeState.getParameter ("sourceZ"), valueTreeState.getParameterRange ("sourceZ")), listenerElement (*valueTreeState.getParameter ("listenerX"), valueTreeState.getParameterRange ("listenerX"), *valueTreeState.getParameter ("listenerY"), valueTreeState.getParameterRange ("listenerY"), *valueTreeState.getParameter ("listenerZ"), valueTreeState.getParameterRange ("listenerZ")) { setSize (820, 600); setLookAndFeel (&globalLaF); toolTipWin.setLookAndFeel (&globalLaF); toolTipWin.setMillisecondsBeforeTipAppears (500); toolTipWin.setOpaque (false); addAndMakeVisible (&title); title.setTitle (juce::String ("Room"), juce::String ("Encoder")); title.setFont (globalLaF.robotoBold, globalLaF.robotoLight); cbNormalizationAttachement.reset ( new ComboBoxAttachment (valueTreeState, "useSN3D", *title.getOutputWidgetPtr()->getNormCbPointer())); cbOrderAttachement.reset ( new ComboBoxAttachment (valueTreeState, "orderSetting", *title.getOutputWidgetPtr()->getOrderCbPointer())); cbDirectivityOrderAttachment.reset ( new ComboBoxAttachment (valueTreeState, "directivityOrderSetting", *title.getInputWidgetPtr()->getOrderCbPointer())); cbDirectivityNormalizationAttachment.reset ( new ComboBoxAttachment (valueTreeState, "inputIsSN3D", *title.getInputWidgetPtr()->getNormCbPointer())); addAndMakeVisible (&footer); addAndMakeVisible (&gcRoomDimensions); gcRoomDimensions.setText ("Room Dimensions"); gcRoomDimensions.setTextLabelPosition (juce::Justification::left); gcRoomDimensions.setColour (juce::GroupComponent::outlineColourId, globalLaF.ClSeperator); gcRoomDimensions.setColour (juce::GroupComponent::textColourId, juce::Colours::white); addAndMakeVisible (&gcListenerPosition); gcListenerPosition.setText ("Listener Position"); gcListenerPosition.setTextLabelPosition (juce::Justification::left); gcListenerPosition.setColour (juce::GroupComponent::outlineColourId, globalLaF.ClSeperator); gcListenerPosition.setColour (juce::GroupComponent::textColourId, juce::Colours::white); addAndMakeVisible (&gcSourcePosition); gcSourcePosition.setText ("Source Position"); gcSourcePosition.setTextLabelPosition (juce::Justification::left); gcSourcePosition.setColour (juce::GroupComponent::outlineColourId, globalLaF.ClSeperator); gcSourcePosition.setColour (juce::GroupComponent::textColourId, juce::Colours::white); addAndMakeVisible (&gcReflectionProperties); gcReflectionProperties.setText ("Reflection Properties"); gcReflectionProperties.setTextLabelPosition (juce::Justification::centredLeft); gcReflectionProperties.setColour (juce::GroupComponent::outlineColourId, globalLaF.ClSeperator); gcReflectionProperties.setColour (juce::GroupComponent::textColourId, juce::Colours::white); addAndMakeVisible (&gcSync); gcSync.setText ("Synchronize Room Settings"); gcSync.setTextLabelPosition (juce::Justification::left); gcSync.setColour (juce::GroupComponent::outlineColourId, globalLaF.ClSeperator); gcSync.setColour (juce::GroupComponent::textColourId, juce::Colours::white); addAndMakeVisible (&lbRoomX); lbRoomX.setText ("Depth"); addAndMakeVisible (&lbRoomY); lbRoomY.setText ("Width"); addAndMakeVisible (&lbRoomZ); lbRoomZ.setText ("Height"); addAndMakeVisible (&lbListenerX); lbListenerX.setText ("x"); addAndMakeVisible (&lbListenerY); lbListenerY.setText ("y"); addAndMakeVisible (&lbListenerZ); lbListenerZ.setText ("z"); addAndMakeVisible (&lbSourceX); lbSourceX.setText ("x"); addAndMakeVisible (&lbSourceY); lbSourceY.setText ("y"); addAndMakeVisible (&lbSourceZ); lbSourceZ.setText ("z"); addAndMakeVisible (&slRoomX); slRoomXAttachment.reset (new SliderAttachment (valueTreeState, "roomX", slRoomX)); slRoomX.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); slRoomX.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); slRoomX.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[0]); slRoomX.setTextValueSuffix (" m"); slRoomX.setTooltip ("room size x"); slRoomX.addListener (this); addAndMakeVisible (&slRoomY); slRoomYAttachment.reset (new SliderAttachment (valueTreeState, "roomY", slRoomY)); slRoomY.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); slRoomY.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); slRoomY.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[0]); slRoomY.setTextValueSuffix (" m"); slRoomY.setTooltip ("room size y"); slRoomY.addListener (this); addAndMakeVisible (&slRoomZ); slRoomZAttachment.reset (new SliderAttachment (valueTreeState, "roomZ", slRoomZ)); slRoomZ.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); slRoomZ.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); slRoomZ.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[0]); slRoomZ.setTextValueSuffix (" m"); slRoomZ.setTooltip ("room size z"); slRoomZ.addListener (this); addAndMakeVisible (&xyPlane); xyPlane.addElement (&sourceElement); xyPlane.addElement (&listenerElement); xyPlane.useAutoScale (false); addAndMakeVisible (&zyPlane); zyPlane.setPlane (PositionPlane::Planes::zy); zyPlane.addElement (&sourceElement); zyPlane.addElement (&listenerElement); zyPlane.useAutoScale (false); addAndMakeVisible (&slSourceX); slSourceXAttachment.reset (new SliderAttachment (valueTreeState, "sourceX", slSourceX)); slSourceX.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); slSourceX.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); slSourceX.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[2]); slSourceX.setTextValueSuffix (" m"); slSourceX.setTooltip ("source position x"); slSourceX.addListener (this); addAndMakeVisible (&slSourceY); slSourceYAttachment.reset (new SliderAttachment (valueTreeState, "sourceY", slSourceY)); slSourceY.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); slSourceY.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); slSourceY.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[2]); slSourceY.setTextValueSuffix (" m"); slSourceY.setTooltip ("source position y"); slSourceY.addListener (this); addAndMakeVisible (&slSourceZ); slSourceZAttachment.reset (new SliderAttachment (valueTreeState, "sourceZ", slSourceZ)); slSourceZ.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); slSourceZ.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); slSourceZ.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[2]); slSourceZ.setTextValueSuffix (" m"); slSourceZ.setTooltip ("source position z"); slSourceZ.addListener (this); addAndMakeVisible (&slListenerX); slListenerXAttachment.reset (new SliderAttachment (valueTreeState, "listenerX", slListenerX)); slListenerX.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); slListenerX.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); slListenerX.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[1]); slListenerX.setRotaryParameters (juce::MathConstants::pi, 3 * juce::MathConstants::pi, false); slListenerX.setTextValueSuffix (" m"); slListenerX.setTooltip ("listener position x"); slListenerX.addListener (this); addAndMakeVisible (&slListenerY); slListenerYAttachment.reset (new SliderAttachment (valueTreeState, "listenerY", slListenerY)); slListenerY.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); slListenerY.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); slListenerY.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[1]); slListenerY.setTextValueSuffix (" m"); slListenerY.setTooltip ("listener position y"); slListenerY.addListener (this); addAndMakeVisible (&slListenerZ); slListenerZAttachment.reset (new SliderAttachment (valueTreeState, "listenerZ", slListenerZ)); slListenerZ.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); slListenerZ.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); slListenerZ.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[1]); slListenerZ.setTextValueSuffix (" m"); slListenerZ.setTooltip ("listener position z"); slListenerZ.addListener (this); sourceElement.setColour (globalLaF.ClWidgetColours[2]); listenerElement.setColour (globalLaF.ClWidgetColours[1]); addAndMakeVisible (&lbNumReflections); lbNumReflections.setText ("Number of Reflections"); addAndMakeVisible (&slNumReflections); slNumReflectionsAttachment.reset ( new SliderAttachment (valueTreeState, "numRefl", slNumReflections)); slNumReflections.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); slNumReflections.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); slNumReflections.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[1]); addAndMakeVisible (lbWallAttenuation); lbWallAttenuation.setText ("Additional Attenuation", true, juce::Justification::left); addAndMakeVisible (slWallAttenuationFront); slWallAttenuationFrontAttachment.reset ( new SliderAttachment (valueTreeState, "wallAttenuationFront", slWallAttenuationFront)); slWallAttenuationFront.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); slWallAttenuationFront.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); slWallAttenuationFront.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[2]); addAndMakeVisible (lbWallAttenuationFront); lbWallAttenuationFront.setText ("Front"); addAndMakeVisible (slWallAttenuationBack); slWallAttenuationBackAttachment.reset ( new SliderAttachment (valueTreeState, "wallAttenuationBack", slWallAttenuationBack)); slWallAttenuationBack.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); slWallAttenuationBack.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); slWallAttenuationBack.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[2]); addAndMakeVisible (lbWallAttenuationBack); lbWallAttenuationBack.setText ("Back"); addAndMakeVisible (slWallAttenuationLeft); slWallAttenuationLeftAttachment.reset ( new SliderAttachment (valueTreeState, "wallAttenuationLeft", slWallAttenuationLeft)); slWallAttenuationLeft.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); slWallAttenuationLeft.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); slWallAttenuationLeft.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[2]); addAndMakeVisible (lbWallAttenuationLeft); lbWallAttenuationLeft.setText ("Left"); addAndMakeVisible (slWallAttenuationRight); slWallAttenuationRightAttachment.reset ( new SliderAttachment (valueTreeState, "wallAttenuationRight", slWallAttenuationRight)); slWallAttenuationRight.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); slWallAttenuationRight.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); slWallAttenuationRight.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[2]); addAndMakeVisible (lbWallAttenuationRight); lbWallAttenuationRight.setText ("Right"); addAndMakeVisible (slWallAttenuationCeiling); slWallAttenuationCeilingAttachment.reset ( new SliderAttachment (valueTreeState, "wallAttenuationCeiling", slWallAttenuationCeiling)); slWallAttenuationCeiling.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); slWallAttenuationCeiling.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); slWallAttenuationCeiling.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[2]); addAndMakeVisible (lbWallAttenuationCeiling); lbWallAttenuationCeiling.setText ("Ceiling"); addAndMakeVisible (slWallAttenuationFloor); slWallAttenuationFloorAttachment.reset ( new SliderAttachment (valueTreeState, "wallAttenuationFloor", slWallAttenuationFloor)); slWallAttenuationFloor.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); slWallAttenuationFloor.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); slWallAttenuationFloor.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[2]); addAndMakeVisible (lbWallAttenuationFloor); lbWallAttenuationFloor.setText ("Floor"); addAndMakeVisible (&lbReflCoeff); lbReflCoeff.setText ("Overall Attenuation"); addAndMakeVisible (&slReflCoeff); slReflCoeffAttachment.reset (new SliderAttachment (valueTreeState, "reflCoeff", slReflCoeff)); slReflCoeff.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); slReflCoeff.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); slReflCoeff.setColour (juce::Slider::rotarySliderOutlineColourId, juce::Colours::lightgrey); slReflCoeff.setTextValueSuffix (" dB"); addAndMakeVisible (&lbLSF); lbLSF.setText ("Freq."); addAndMakeVisible (&lbLSG); lbLSG.setText ("Gain"); addAndMakeVisible (&lbHSF); lbHSF.setText ("Freq."); addAndMakeVisible (&lbHSG); lbHSG.setText ("Gain"); addAndMakeVisible (&slLowShelfFreq); slLowShelfFreqAttachment.reset ( new SliderAttachment (valueTreeState, "lowShelfFreq", slLowShelfFreq)); slLowShelfFreq.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); slLowShelfFreq.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); slLowShelfFreq.setColour (juce::Slider::rotarySliderOutlineColourId, juce::Colours::cyan); slLowShelfFreq.setTooltip ("low shelf freq"); addAndMakeVisible (&slLowShelfGain); slLowShelfGainAttachment.reset ( new SliderAttachment (valueTreeState, "lowShelfGain", slLowShelfGain)); slLowShelfGain.setTextValueSuffix (" dB"); slLowShelfGain.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); slLowShelfGain.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); slLowShelfGain.setColour (juce::Slider::rotarySliderOutlineColourId, juce::Colours::cyan); addAndMakeVisible (&slHighShelfFreq); slHighShelfFreqAttachment.reset ( new SliderAttachment (valueTreeState, "highShelfFreq", slHighShelfFreq)); slHighShelfFreq.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); slHighShelfFreq.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); slHighShelfFreq.setColour (juce::Slider::rotarySliderOutlineColourId, juce::Colours::orangered); slHighShelfFreq.setTooltip ("high shelf freq"); addAndMakeVisible (&slHighShelfGain); slHighShelfGainAttachment.reset ( new SliderAttachment (valueTreeState, "highShelfGain", slHighShelfGain)); slHighShelfGain.setTextValueSuffix (" dB"); slHighShelfGain.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); slHighShelfGain.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); slHighShelfGain.setColour (juce::Slider::rotarySliderOutlineColourId, juce::Colours::orangered); addAndMakeVisible (&fv); fv.addCoefficients (processor.lowShelfCoefficients, juce::Colours::cyan, &slLowShelfFreq, &slLowShelfGain); fv.addCoefficients (processor.highShelfCoefficients, juce::Colours::orangered, &slHighShelfFreq, &slHighShelfGain); addAndMakeVisible (&rv); rv.setDataPointers (p.allGains, p.mRadius, p.numRefl); juce::Vector3D dims (slRoomX.getValue(), slRoomY.getValue(), slRoomZ.getValue()); float scale = juce::jmin (xyPlane.setDimensions (dims), zyPlane.setDimensions (dims)); xyPlane.setScale (scale); zyPlane.setScale (scale); addAndMakeVisible (&cbSyncChannel); cbSyncChannel.setJustificationType (juce::Justification::centred); cbSyncChannel.addItem ("none", 1); cbSyncChannel.addItem ("1", 2); cbSyncChannel.addItem ("2", 3); cbSyncChannel.addItem ("3", 4); cbSyncChannel.addItem ("4", 5); cbSyncChannelAttachment.reset ( new ComboBoxAttachment (valueTreeState, "syncChannel", cbSyncChannel)); addAndMakeVisible (&lbSyncChannel); lbSyncChannel.setText ("Synchronize to Channel"); addAndMakeVisible (&tbSyncRoomSize); tbSyncRoomSizeAttachment.reset ( new ButtonAttachment (valueTreeState, "syncRoomSize", tbSyncRoomSize)); tbSyncRoomSize.setButtonText ("Room Dimensions"); tbSyncRoomSize.setColour (juce::ToggleButton::tickColourId, globalLaF.ClWidgetColours[0]); addAndMakeVisible (&tbSyncListener); tbSyncListenerAttachment.reset ( new ButtonAttachment (valueTreeState, "syncListener", tbSyncListener)); tbSyncListener.setButtonText ("Listener Position"); tbSyncListener.setColour (juce::ToggleButton::tickColourId, globalLaF.ClWidgetColours[1]); addAndMakeVisible (&tbSyncReflection); tbSyncReflectionAttachment.reset ( new ButtonAttachment (valueTreeState, "syncReflection", tbSyncReflection)); tbSyncReflection.setButtonText ("Reflection Properties"); tbSyncReflection.setColour (juce::ToggleButton::tickColourId, juce::Colours::orangered); addAndMakeVisible (&tbDirectPathUnityGain); tbDirectPathUnityGainAttachment.reset ( new ButtonAttachment (valueTreeState, "directPathUnityGain", tbDirectPathUnityGain)); tbDirectPathUnityGain.setButtonText ("Direct Path Unity Gain"); tbDirectPathUnityGain.setColour (juce::ToggleButton::tickColourId, globalLaF.ClWidgetColours[0]); addAndMakeVisible (&tbDirectPathZeroDelay); tbDirectPathZeroDelayAttachment.reset ( new ButtonAttachment (valueTreeState, "directPathZeroDelay", tbDirectPathZeroDelay)); tbDirectPathZeroDelay.setButtonText ("Direct Path Zero Delay"); tbDirectPathZeroDelay.setColour (juce::ToggleButton::tickColourId, globalLaF.ClWidgetColours[1]); rv.setZeroDelay (tbDirectPathZeroDelay.getToggleState()); tbDirectPathZeroDelay.addListener (this); addAndMakeVisible (&tbRenderDirectPath); tbRenderDirectPathAttachment.reset ( new ButtonAttachment (valueTreeState, "renderDirectPath", tbRenderDirectPath)); tbRenderDirectPath.setButtonText ("Render Direct Path"); tbRenderDirectPath.setColour (juce::ToggleButton::tickColourId, globalLaF.ClWidgetColours[2]); tbRenderDirectPath.addListener (this); startTimer (20); } RoomEncoderAudioProcessorEditor::~RoomEncoderAudioProcessorEditor() { setLookAndFeel (nullptr); } //============================================================================== void RoomEncoderAudioProcessorEditor::paint (juce::Graphics& g) { g.fillAll (globalLaF.ClBackground); } void RoomEncoderAudioProcessorEditor::resized() { // This is generally where you'll want to lay out the positions of any // subcomponents in your editor.. const int leftRightMargin = 30; const int headerHeight = 60; const int footerHeight = 25; const int rotSliderHeight = 55; const int rotSliderSpacing = 10; const int sliderSpacing = 3; const int rotSliderWidth = 40; const int labelHeight = 15; juce::Rectangle area (getLocalBounds()); { juce::Rectangle footerArea (area.removeFromBottom (footerHeight)); footer.setBounds (footerArea); } area.removeFromLeft (leftRightMargin); area.removeFromRight (leftRightMargin); juce::Rectangle headerArea = area.removeFromTop (headerHeight); title.setBounds (headerArea); area.removeFromTop (10); { juce::Rectangle bottomStrip (area.removeFromBottom (120)); rv.setBounds (bottomStrip.removeFromRight (540)); bottomStrip.removeFromRight (20); gcSync.setBounds (bottomStrip); bottomStrip.removeFromTop (25); juce::Rectangle channelRow (bottomStrip.removeFromTop (20)); lbSyncChannel.setBounds (channelRow.removeFromLeft (130)); cbSyncChannel.setBounds (channelRow.removeFromLeft (50)); bottomStrip.removeFromLeft (5); tbSyncRoomSize.setBounds (bottomStrip.removeFromTop (20)); tbSyncListener.setBounds (bottomStrip.removeFromTop (20)); tbSyncReflection.setBounds (bottomStrip.removeFromTop (20)); } area.removeFromBottom (10); juce::Rectangle propArea ( area.removeFromRight (9 * rotSliderWidth + 8 * rotSliderSpacing + 20)); { juce::Rectangle coordinateArea (propArea.removeFromTop (100)); juce::Rectangle roomArea ( coordinateArea.removeFromLeft (3 * rotSliderWidth + 2 * rotSliderSpacing)); gcRoomDimensions.setBounds (roomArea); roomArea.removeFromTop (25); juce::Rectangle sliderRow = (roomArea.removeFromTop (rotSliderHeight)); slRoomX.setBounds (sliderRow.removeFromLeft (rotSliderWidth)); sliderRow.removeFromLeft (rotSliderSpacing); slRoomY.setBounds (sliderRow.removeFromLeft (rotSliderWidth)); sliderRow.removeFromLeft (rotSliderSpacing); slRoomZ.setBounds (sliderRow.removeFromLeft (rotSliderWidth)); lbRoomX.setBounds (roomArea.removeFromLeft (rotSliderWidth)); roomArea.removeFromLeft (rotSliderSpacing); lbRoomY.setBounds (roomArea.removeFromLeft (rotSliderWidth)); roomArea.removeFromLeft (rotSliderSpacing); lbRoomZ.setBounds (roomArea.removeFromLeft (rotSliderWidth)); coordinateArea.removeFromLeft (20); juce::Rectangle sourceArea ( coordinateArea.removeFromLeft (3 * rotSliderWidth + 2 * rotSliderSpacing)); gcSourcePosition.setBounds (sourceArea); sourceArea.removeFromTop (25); sliderRow = (sourceArea.removeFromTop (rotSliderHeight)); slSourceX.setBounds (sliderRow.removeFromLeft (rotSliderWidth)); sliderRow.removeFromLeft (rotSliderSpacing); slSourceY.setBounds (sliderRow.removeFromLeft (rotSliderWidth)); sliderRow.removeFromLeft (rotSliderSpacing); slSourceZ.setBounds (sliderRow.removeFromLeft (rotSliderWidth)); lbSourceX.setBounds (sourceArea.removeFromLeft (rotSliderWidth)); sourceArea.removeFromLeft (rotSliderSpacing); lbSourceY.setBounds (sourceArea.removeFromLeft (rotSliderWidth)); sourceArea.removeFromLeft (rotSliderSpacing); lbSourceZ.setBounds (sourceArea.removeFromLeft (rotSliderWidth)); coordinateArea.removeFromLeft (20); juce::Rectangle listenerArea ( coordinateArea.removeFromLeft (3 * rotSliderWidth + 2 * rotSliderSpacing)); gcListenerPosition.setBounds (listenerArea); listenerArea.removeFromTop (25); sliderRow = (listenerArea.removeFromTop (rotSliderHeight)); slListenerX.setBounds (sliderRow.removeFromLeft (rotSliderWidth)); sliderRow.removeFromLeft (rotSliderSpacing); slListenerY.setBounds (sliderRow.removeFromLeft (rotSliderWidth)); sliderRow.removeFromLeft (rotSliderSpacing); slListenerZ.setBounds (sliderRow.removeFromLeft (rotSliderWidth)); lbListenerX.setBounds (listenerArea.removeFromLeft (rotSliderWidth)); listenerArea.removeFromLeft (rotSliderSpacing); lbListenerY.setBounds (listenerArea.removeFromLeft (rotSliderWidth)); listenerArea.removeFromLeft (rotSliderSpacing); lbListenerZ.setBounds (listenerArea.removeFromLeft (rotSliderWidth)); } propArea.removeFromTop (10); gcReflectionProperties.setBounds (propArea); propArea.removeFromTop (20); auto buttonRow = propArea.removeFromBottom (20); tbDirectPathZeroDelay.setBounds (buttonRow.removeFromLeft (120)); buttonRow.removeFromLeft (10); tbDirectPathUnityGain.setBounds (buttonRow.removeFromLeft (120)); buttonRow.removeFromLeft (10); tbRenderDirectPath.setBounds (buttonRow.removeFromLeft (120)); juce::Rectangle fvCol (propArea.removeFromLeft (330)); { // 120 juce::Rectangle fvRow (fvCol.removeFromTop (130)); fv.setBounds (fvRow); fvCol.removeFromTop (10); juce::Rectangle sliderRow (fvCol.removeFromTop (rotSliderHeight)); sliderRow.removeFromLeft (20); slLowShelfFreq.setBounds (sliderRow.removeFromLeft (rotSliderWidth)); sliderRow.removeFromLeft (sliderSpacing); slLowShelfGain.setBounds (sliderRow.removeFromLeft (rotSliderWidth)); sliderRow.removeFromRight (10); slHighShelfGain.setBounds (sliderRow.removeFromRight (rotSliderWidth)); sliderRow.removeFromRight (sliderSpacing); slHighShelfFreq.setBounds (sliderRow.removeFromRight (rotSliderWidth)); slReflCoeff.setBounds (sliderRow); sliderRow = fvCol.removeFromTop (labelHeight); sliderRow.removeFromLeft (20); lbLSF.setBounds (sliderRow.removeFromLeft (rotSliderWidth)); sliderRow.removeFromLeft (sliderSpacing); lbLSG.setBounds (sliderRow.removeFromLeft (rotSliderWidth)); sliderRow.removeFromRight (10); lbHSG.setBounds (sliderRow.removeFromRight (rotSliderWidth)); sliderRow.removeFromRight (sliderSpacing); lbHSF.setBounds (sliderRow.removeFromRight (rotSliderWidth)); lbReflCoeff.setBounds (sliderRow); } auto wallAttenArea = propArea.removeFromTop (135); lbWallAttenuation.setBounds (wallAttenArea.removeFromTop (20)); auto sliderRow = wallAttenArea.removeFromTop (rotSliderHeight - 10); slWallAttenuationFront.setBounds (sliderRow.removeFromLeft (rotSliderWidth)); sliderRow.removeFromLeft (5); slWallAttenuationLeft.setBounds (sliderRow.removeFromLeft (rotSliderWidth)); sliderRow.removeFromLeft (5); slWallAttenuationRight.setBounds (sliderRow.removeFromLeft (rotSliderWidth)); sliderRow = wallAttenArea.removeFromTop (12); lbWallAttenuationFront.setBounds (sliderRow.removeFromLeft (rotSliderWidth)); sliderRow.removeFromLeft (5); lbWallAttenuationLeft.setBounds (sliderRow.removeFromLeft (rotSliderWidth)); sliderRow.removeFromLeft (5); lbWallAttenuationRight.setBounds (sliderRow.removeFromLeft (rotSliderWidth)); sliderRow = wallAttenArea.removeFromTop (rotSliderHeight - 10); slWallAttenuationBack.setBounds (sliderRow.removeFromLeft (rotSliderWidth)); sliderRow.removeFromLeft (5); slWallAttenuationCeiling.setBounds (sliderRow.removeFromLeft (rotSliderWidth)); sliderRow.removeFromLeft (5); slWallAttenuationFloor.setBounds (sliderRow.removeFromLeft (rotSliderWidth)); sliderRow = wallAttenArea.removeFromTop (15); lbWallAttenuationBack.setBounds (sliderRow.removeFromLeft (rotSliderWidth)); sliderRow.removeFromLeft (5); lbWallAttenuationCeiling.setBounds (sliderRow.removeFromLeft (rotSliderWidth)); sliderRow.removeFromLeft (5); lbWallAttenuationFloor.setBounds (sliderRow.removeFromLeft (rotSliderWidth)); propArea.removeFromTop (5); slNumReflections.setBounds (propArea.removeFromTop (rotSliderHeight)); lbNumReflections.setBounds (propArea.removeFromTop (labelHeight)); area.removeFromRight (10); { juce::Rectangle planeArea (area.removeFromLeft (300)); int height = planeArea.getHeight() / 2; xyPlane.setBounds (planeArea.removeFromTop (height)); zyPlane.setBounds (planeArea.removeFromTop (height)); } } void RoomEncoderAudioProcessorEditor::sliderValueChanged (juce::Slider* slider) { if (slider == &slRoomX || slider == &slRoomY || slider == &slRoomZ) { juce::Vector3D dims (slRoomX.getValue(), slRoomY.getValue(), slRoomZ.getValue()); float scale = juce::jmin (xyPlane.setDimensions (dims), zyPlane.setDimensions (dims)); xyPlane.setScale (scale); zyPlane.setScale (scale); } } void RoomEncoderAudioProcessorEditor::buttonStateChanged (juce::Button* button) { if (button == &tbDirectPathZeroDelay) rv.setZeroDelay (tbDirectPathZeroDelay.getToggleState()); } void RoomEncoderAudioProcessorEditor::timerCallback() { // === update titleBar widgets according to available input/output channel counts title.setMaxSize (processor.getMaxSize()); // ========================================== if (processor.updateFv) { fv.setOverallGainInDecibels (*valueTreeState.getRawParameterValue ("reflCoeff")); fv.setSampleRate (processor.getSampleRate()); processor.updateFv = false; } if (processor.repaintPositionPlanes.get()) { processor.repaintPositionPlanes = false; xyPlane.repaint(); zyPlane.repaint(); } } ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/RoomEncoder/Source/ReflectionsVisualizer.hIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/RoomEncoder/Source/ReflectionsVisual0000664002537200253720000001450515257173642031674 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once //============================================================================== /* */ class ReflectionsVisualizer : public juce::Component, private juce::Timer { const float mL = 23.0f; const float mR = 10.0f; const float mT = 7.0f; const float mB = 15.0f; public: ReflectionsVisualizer() { // In your constructor, you should add any child components, and // initialise any special settings that your component needs. startTimer (10); //TODO avoid using timer } ~ReflectionsVisualizer() {} void paint (juce::Graphics& g) override { g.setColour (juce::Colours::steelblue.withMultipliedAlpha (0.01f)); g.fillAll(); g.setColour (juce::Colours::steelblue.withMultipliedAlpha (0.9f)); g.strokePath (axes, juce::PathStrokeType (1.0f)); g.setColour (juce::Colours::steelblue.withMultipliedAlpha (0.8f)); g.strokePath (dBGrid, juce::PathStrokeType (0.5f)); g.setColour (juce::Colours::white); auto currentFont = juce::FontOptions (getLookAndFeel().getTypefaceForFont (juce::FontOptions (12.0f, 2))) .withHeight (12.0f); g.setFont (currentFont); for (int dB = 0; dB >= -60; dB -= 10) { float yPos = dBToY ((float) dB); g.drawText (juce::String (dB), 0, yPos - 6, 18, 12.0f, juce::Justification::right, false); } int msStep; if (xRangeInMs < 80) msStep = 5; else if (xRangeInMs < 200) msStep = 10; else msStep = 20; for (int timeInMs = 0; timeInMs <= xRangeInMs; timeInMs += msStep) { float xPos = timeToX ((float) timeInMs); g.drawText (juce::String (timeInMs), xPos - 15.0f, mT + plotHeight + 2.0f, 30, 12.0f, juce::Justification::centred, false); } const float xFactor = 1000.0f / 343.2f; if (radiusPtr != nullptr) { int numRef = juce::roundToInt (numReflPtr->load()); float gainDb = juce::Decibels::gainToDecibels (gainPtr[0]); if (gainDb > -60.0f && gainDb <= 20.0f) { const float xPos = timeToX (zeroDelay ? 0.0f : radiusPtr[0] * xFactor); const float yPos = dBToY (gainDb); g.drawLine (xPos, yPos, xPos, mT + plotHeight, 2.0f); } g.setColour (juce::Colours::white.withMultipliedAlpha (0.5f)); for (int i = 1; i <= numRef; ++i) { float gainDb = juce::Decibels::gainToDecibels (gainPtr[i]); if (gainDb > -60.0f && gainDb < 20.0f) { const float radius = radiusPtr[i] - (zeroDelay ? radiusPtr[0] : 0.0f); const float xPos = timeToX (radius * xFactor); const float yPos = dBToY (gainDb); g.drawLine (xPos, yPos, xPos, mT + plotHeight, 1.5f); } } } } inline float timeToX (float timeInMs) { return mL + timeInMs / xRangeInMs * plotWidth; } inline float dBToY (float gainInDB) { const float dynRange = -1.0f / 60.0f; return mT + dynRange * gainInDB * plotHeight; } void mouseWheelMove (const juce::MouseEvent& e, const juce::MouseWheelDetails& wheel) override { const double delta = 100 * (std::abs (wheel.deltaX) > std::abs (wheel.deltaY) ? -wheel.deltaX : wheel.deltaY); //bool positiveDelta = delta >= 0.0; xRangeInMs += juce::roundToInt (delta); xRangeInMs = juce::jmin (xRangeInMs, 550); xRangeInMs = juce::jmax (xRangeInMs, 40); } void setDataPointers (float* Gain, float* Radius, std::atomic* NumRefl) { gainPtr = Gain; numReflPtr = NumRefl; radiusPtr = Radius; } void setZeroDelay (const bool shouldBeZeroDelay) { if (zeroDelay != shouldBeZeroDelay) { zeroDelay = shouldBeZeroDelay; repaint(); } } void resized() override { plotWidth = getLocalBounds().getWidth() - mL - mR; plotHeight = getLocalBounds().getHeight() - mT - mB; axes.clear(); //horizontal axes.startNewSubPath (timeToX (0.0f) - 2, dBToY (-60.0f)); axes.lineTo (timeToX (xRangeInMs), dBToY (-60.0f)); //vertical axes.startNewSubPath (timeToX (0.0f), dBToY (-60.0f) + 2.0f); axes.lineTo (timeToX (0.0f), mT - 2.0f); dBGrid.clear(); for (int dB = 0; dB >= -50; dB -= 10) { float yPos = dBToY ((float) dB); dBGrid.startNewSubPath (mL - 2.0f, yPos); dBGrid.lineTo (mL + plotWidth, yPos); } } void timerCallback() override { repaint(); } private: JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ReflectionsVisualizer) juce::Path axes; juce::Path dBGrid; float plotWidth = 1.0f; float plotHeight = 1.0f; int xRangeInMs = 100; std::atomic* numReflPtr = nullptr; float* gainPtr = nullptr; float* radiusPtr = nullptr; bool zeroDelay = false; }; IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/RoomEncoder/Source/PluginProcessor.h0000664002537200253720000001716415257173642031623 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #define JUCE_USE_VDSP_FRAMEWORK 1 #pragma once #include "../../resources/AudioProcessorBase.h" #include "../../resources/RoomSync.h" #include "../../resources/ambisonicTools.h" #include "../../resources/customComponents/FilterVisualizer.h" #include "../../resources/efficientSHvanilla.h" #include "../../resources/interpLagrangeWeights.h" #include "../JuceLibraryCode/JuceHeader.h" #include "reflections.h" #ifdef JUCE_MAC #define VIMAGE_H // avoid namespace clashes #include #endif #if JUCE_USE_SIMD using IIRfloat = juce::dsp::SIMDRegister; static constexpr int IIRfloat_elements = juce::dsp::SIMDRegister::size(); #else /* !JUCE_USE_SIMD */ using IIRfloat = float; static constexpr int IIRfloat_elements = 1; #endif /* JUCE_USE_SIMD */ // 64 input channels (7th order directivity) packed into IIRfloat_elements-wide registers static constexpr int maxNumSIMDFilters = (64 + IIRfloat_elements - 1) / IIRfloat_elements; #define ProcessorClass RoomEncoderAudioProcessor const int mSig[] = { 1, -1 }; using namespace juce::dsp; struct ReflectionProperty { const int x; // coordinate in image source space const int y; // coordinate in image source space const int z; // coordinate in image source space const int order; // image source order const int xPlusReflections; // number of reflections at front wall const int xMinusReflections; // number of reflections at back wall const int yPlusReflections; // number of reflections at left wall const int yMinusReflections; // number of reflections at right wall const int zPlusReflections; // number of reflections at ceiling const int zMinusReflections; // number of reflections at floor }; //============================================================================== /** */ class RoomEncoderAudioProcessor : public AudioProcessorBase, IOTypes::Ambisonics<>> { public: constexpr static int numberOfInputChannels = 64; constexpr static int numberOfOutputChannels = 64; //============================================================================== RoomEncoderAudioProcessor(); ~RoomEncoderAudioProcessor(); //============================================================================== void initializeReflectionList(); //============================================================================== void prepareToPlay (double sampleRate, int samplesPerBlock) override; void releaseResources() override; void processBlock (juce::AudioSampleBuffer&, juce::MidiBuffer&) override; //============================================================================== juce::AudioProcessorEditor* createEditor() override; bool hasEditor() const override; //============================================================================== int getNumPrograms() override; int getCurrentProgram() override; void setCurrentProgram (int index) override; const juce::String getProgramName (int index) override; void changeProgramName (int index, const juce::String& newName) override; //============================================================================== void getStateInformation (juce::MemoryBlock& destData) override; void setStateInformation (const void* data, int sizeInBytes) override; void parameterChanged (const juce::String& parameterID, float newValue) override; //======= Parameters =========================================================== std::vector> createParameterLayout(); //============================================================================== double oldDelay[nImgSrc]; float allGains[nImgSrc]; //filter coefficients IIR::Coefficients::Ptr lowShelfCoefficients; IIR::Coefficients::Ptr highShelfCoefficients; bool userChangedFilterSettings = true; bool updateFv = false; void updateFilterCoefficients (double sampleRate); void calculateImageSourcePositions (const float t, const float b, const float h); std::atomic* numRefl; float mRadius[nImgSrc]; void updateBuffers() override; juce::Atomic repaintPositionPlanes = true; private: //============================================================================== inline void clear (juce::dsp::AudioBlock& ab); double phi; double theta; // Parameters std::atomic* directivityOrderSetting; std::atomic* inputIsSN3D; std::atomic* orderSetting; std::atomic* useSN3D; std::atomic* roomX; std::atomic* roomY; std::atomic* roomZ; std::atomic* sourceX; std::atomic* sourceY; std::atomic* sourceZ; std::atomic* listenerX; std::atomic* listenerY; std::atomic* listenerZ; std::atomic* reflCoeff; std::atomic* lowShelfFreq; std::atomic* lowShelfGain; std::atomic* highShelfFreq; std::atomic* highShelfGain; std::atomic* renderDirectPath; std::atomic* directPathZeroDelay; std::atomic* directPathUnityGain; std::atomic* wallAttenuationFront; std::atomic* wallAttenuationBack; std::atomic* wallAttenuationLeft; std::atomic* wallAttenuationRight; std::atomic* wallAttenuationCeiling; std::atomic* wallAttenuationFloor; std::atomic* constantGainDistance; int _numRefl; RoomSync roomSync { parameters, "syncChannel" }; //SIMD IIR Filter juce::OwnedArray>> lowShelfArray; juce::OwnedArray>> highShelfArray; juce::HeapBlock interleavedBlockData[maxNumSIMDFilters], zeroData; //todo: dynamically? juce::OwnedArray> interleavedData; juce::dsp::AudioBlock zero; juce::Array filterPoints { 1, 7, 25, 61, 113, 169, 213 }; juce::Vector3D sourcePos, listenerPos; float mx[nImgSrc]; float my[nImgSrc]; float mz[nImgSrc]; float smx[nImgSrc]; float smy[nImgSrc]; float smz[nImgSrc]; int bufferSize; int bufferReadIdx; int readOffset; float powReflCoeff[maxOrderImgSrc + 1]; double dist2smpls; float SHcoeffsOld[nImgSrc][64]; IIRfloat SHsampleOld[nImgSrc] [maxNumSIMDFilters]; //TODO: can be smaller: (N+1)^2/IIRfloat_elements() juce::AudioBuffer delayBuffer; juce::AudioBuffer monoBuffer; juce::OwnedArray reflectionList; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (RoomEncoderAudioProcessor) }; IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/RoomEncoder/Source/PluginEditor.h0000664002537200253720000001400015257173642031054 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once #include "../../resources/customComponents/FilterVisualizer.h" #include "../../resources/customComponents/PositionPlane.h" #include "../../resources/customComponents/ReverseSlider.h" #include "../../resources/customComponents/SimpleLabel.h" #include "../../resources/customComponents/TitleBar.h" #include "../../resources/lookAndFeel/IEM_LaF.h" #include "../JuceLibraryCode/JuceHeader.h" #include "PluginProcessor.h" #include "ReflectionsVisualizer.h" typedef ReverseSlider::SliderAttachment SliderAttachment; typedef juce::AudioProcessorValueTreeState::ComboBoxAttachment ComboBoxAttachment; typedef juce::AudioProcessorValueTreeState::ButtonAttachment ButtonAttachment; //============================================================================== /** */ class RoomEncoderAudioProcessorEditor : public juce::AudioProcessorEditor, private juce::Timer, private juce::Slider::Listener, private juce::Button::Listener { public: RoomEncoderAudioProcessorEditor (RoomEncoderAudioProcessor&, juce::AudioProcessorValueTreeState&); ~RoomEncoderAudioProcessorEditor(); //============================================================================== void paint (juce::Graphics&) override; void resized() override; //============================================================================== void sliderValueChanged (juce::Slider* slider) override; //============================================================================== void buttonClicked (juce::Button* button) override {}; void buttonStateChanged (juce::Button* button) override; private: //============================================================================== LaF globalLaF; TitleBar> title; OSCFooter footer; void timerCallback() override; RoomEncoderAudioProcessor& processor; juce::AudioProcessorValueTreeState& valueTreeState; SimpleLabel lbReflCoeff, lbNumReflections; TripleLabel lbRoomDim; FilterVisualizer fv; ReflectionsVisualizer rv; juce::ComboBox cbSyncChannel; SimpleLabel lbSyncChannel; juce::ToggleButton tbSyncRoomSize, tbSyncReflection, tbSyncListener; juce::ToggleButton tbDirectPathUnityGain, tbDirectPathZeroDelay, tbRenderDirectPath; std::unique_ptr cbSyncChannelAttachment; std::unique_ptr tbSyncRoomSizeAttachment, tbSyncReflectionAttachment, tbSyncListenerAttachment; std::unique_ptr tbDirectPathUnityGainAttachment, tbDirectPathZeroDelayAttachment, tbRenderDirectPathAttachment; juce::GroupComponent gcRoomDimensions, gcSourcePosition, gcListenerPosition; juce::GroupComponent gcReflectionProperties; juce::GroupComponent gcSync; SimpleLabel lbRoomX, lbRoomY, lbRoomZ; SimpleLabel lbListenerX, lbListenerY, lbListenerZ; SimpleLabel lbSourceX, lbSourceY, lbSourceZ; SimpleLabel lbLSF, lbLSG, lbHSF, lbHSG; SimpleLabel lbWallAttenuation; SimpleLabel lbWallAttenuationFront, lbWallAttenuationBack, lbWallAttenuationLeft, lbWallAttenuationRight, lbWallAttenuationCeiling, lbWallAttenuationFloor; ReverseSlider slSourceX, slSourceY, slSourceZ; ReverseSlider slListenerX, slListenerY, slListenerZ; ReverseSlider slRoomX, slRoomY, slRoomZ; ReverseSlider slReflCoeff, slLowShelfFreq, slLowShelfGain, slHighShelfFreq, slHighShelfGain; ReverseSlider slNumReflections; ReverseSlider slWallAttenuationFront, slWallAttenuationBack, slWallAttenuationLeft, slWallAttenuationRight, slWallAttenuationCeiling, slWallAttenuationFloor; std::unique_ptr slSourceXAttachment, slSourceYAttachment, slSourceZAttachment; std::unique_ptr slListenerXAttachment, slListenerYAttachment, slListenerZAttachment; std::unique_ptr slRoomXAttachment, slRoomYAttachment, slRoomZAttachment; std::unique_ptr slReflCoeffAttachment, slLowShelfFreqAttachment, slLowShelfGainAttachment, slHighShelfFreqAttachment, slHighShelfGainAttachment; std::unique_ptr slNumReflectionsAttachment; std::unique_ptr slWallAttenuationFrontAttachment, slWallAttenuationBackAttachment, slWallAttenuationLeftAttachment, slWallAttenuationRightAttachment, slWallAttenuationCeilingAttachment, slWallAttenuationFloorAttachment; std::unique_ptr cbNormalizationAttachement; std::unique_ptr cbOrderAttachement; std::unique_ptr cbDirectivityOrderAttachment; std::unique_ptr cbDirectivityNormalizationAttachment; PositionPlane xyPlane, zyPlane; PositionPlane::ParameterElement sourceElement, listenerElement; juce::OpenGLContext mOpenGlContext; juce::TooltipWindow toolTipWin; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (RoomEncoderAudioProcessorEditor) }; IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/RoomEncoder/Source/reflections.h0000664002537200253720000014775215257173642031011 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once #define nImgSrc 237 #define maxOrderImgSrc 7 const int reflList[237][4] = { { 0, 0, 0, 0, }, { -1, 0, 0, 1, }, { 0, -1, 0, 1, }, { 0, 0, -1, 1, }, { 0, 0, 1, 1, }, { 0, 1, 0, 1, }, { 1, 0, 0, 1, }, { -2, 0, 0, 2, }, { -1, -1, 0, 2, }, { -1, 0, -1, 2, }, { -1, 0, 1, 2, }, { -1, 1, 0, 2, }, { 0, -2, 0, 2, }, { 0, -1, -1, 2, }, { 0, -1, 1, 2, }, { 0, 0, -2, 2, }, { 0, 0, 2, 2, }, { 0, 1, -1, 2, }, { 0, 1, 1, 2, }, { 0, 2, 0, 2, }, { 1, -1, 0, 2, }, { 1, 0, -1, 2, }, { 1, 0, 1, 2, }, { 1, 1, 0, 2, }, { 2, 0, 0, 2, }, { -3, 0, 0, 3, }, { -2, -1, 0, 3, }, { -2, 0, -1, 3, }, { -2, 0, 1, 3, }, { -2, 1, 0, 3, }, { -1, -2, 0, 3, }, { -1, -1, -1, 3, }, { -1, -1, 1, 3, }, { -1, 0, -2, 3, }, { -1, 0, 2, 3, }, { -1, 1, -1, 3, }, { -1, 1, 1, 3, }, { -1, 2, 0, 3, }, { 0, -3, 0, 3, }, { 0, -2, -1, 3, }, { 0, -2, 1, 3, }, { 0, -1, -2, 3, }, { 0, -1, 2, 3, }, { 0, 1, -2, 3, }, { 0, 1, 2, 3, }, { 0, 2, -1, 3, }, { 0, 2, 1, 3, }, { 0, 3, 0, 3, }, { 1, -2, 0, 3, }, { 1, -1, -1, 3, }, { 1, -1, 1, 3, }, { 1, 0, -2, 3, }, { 1, 0, 2, 3, }, { 1, 1, -1, 3, }, { 1, 1, 1, 3, }, { 1, 2, 0, 3, }, { 2, -1, 0, 3, }, { 2, 0, -1, 3, }, { 2, 0, 1, 3, }, { 2, 1, 0, 3, }, { 3, 0, 0, 3, }, { -3, -1, 0, 4, }, { -3, 0, -1, 4, }, { -3, 0, 1, 4, }, { -3, 1, 0, 4, }, { -2, -2, 0, 4, }, { -2, -1, -1, 4, }, { -2, -1, 1, 4, }, { -2, 0, -2, 4, }, { -2, 0, 2, 4, }, { -2, 1, -1, 4, }, { -2, 1, 1, 4, }, { -2, 2, 0, 4, }, { -1, -3, 0, 4, }, { -1, -2, -1, 4, }, { -1, -2, 1, 4, }, { -1, -1, -2, 4, }, { -1, -1, 2, 4, }, { -1, 1, -2, 4, }, { -1, 1, 2, 4, }, { -1, 2, -1, 4, }, { -1, 2, 1, 4, }, { -1, 3, 0, 4, }, { 0, -3, -1, 4, }, { 0, -3, 1, 4, }, { 0, -2, -2, 4, }, { 0, -2, 2, 4, }, { 0, 2, -2, 4, }, { 0, 2, 2, 4, }, { 0, 3, -1, 4, }, { 0, 3, 1, 4, }, { 1, -3, 0, 4, }, { 1, -2, -1, 4, }, { 1, -2, 1, 4, }, { 1, -1, -2, 4, }, { 1, -1, 2, 4, }, { 1, 1, -2, 4, }, { 1, 1, 2, 4, }, { 1, 2, -1, 4, }, { 1, 2, 1, 4, }, { 1, 3, 0, 4, }, { 2, -2, 0, 4, }, { 2, -1, -1, 4, }, { 2, -1, 1, 4, }, { 2, 0, -2, 4, }, { 2, 0, 2, 4, }, { 2, 1, -1, 4, }, { 2, 1, 1, 4, }, { 2, 2, 0, 4, }, { 3, -1, 0, 4, }, { 3, 0, -1, 4, }, { 3, 0, 1, 4, }, { 3, 1, 0, 4, }, { -3, -2, 0, 5, }, { -3, -1, -1, 5, }, { -3, -1, 1, 5, }, { -3, 0, -2, 5, }, { -3, 0, 2, 5, }, { -3, 1, -1, 5, }, { -3, 1, 1, 5, }, { -3, 2, 0, 5, }, { -2, -3, 0, 5, }, { -2, -2, -1, 5, }, { -2, -2, 1, 5, }, { -2, -1, -2, 5, }, { -2, -1, 2, 5, }, { -2, 1, -2, 5, }, { -2, 1, 2, 5, }, { -2, 2, -1, 5, }, { -2, 2, 1, 5, }, { -2, 3, 0, 5, }, { -1, -3, -1, 5, }, { -1, -3, 1, 5, }, { -1, -2, -2, 5, }, { -1, -2, 2, 5, }, { -1, 2, -2, 5, }, { -1, 2, 2, 5, }, { -1, 3, -1, 5, }, { -1, 3, 1, 5, }, { 0, -3, -2, 5, }, { 0, -3, 2, 5, }, { 0, 3, -2, 5, }, { 0, 3, 2, 5, }, { 1, -3, -1, 5, }, { 1, -3, 1, 5, }, { 1, -2, -2, 5, }, { 1, -2, 2, 5, }, { 1, 2, -2, 5, }, { 1, 2, 2, 5, }, { 1, 3, -1, 5, }, { 1, 3, 1, 5, }, { 2, -3, 0, 5, }, { 2, -2, -1, 5, }, { 2, -2, 1, 5, }, { 2, -1, -2, 5, }, { 2, -1, 2, 5, }, { 2, 1, -2, 5, }, { 2, 1, 2, 5, }, { 2, 2, -1, 5, }, { 2, 2, 1, 5, }, { 2, 3, 0, 5, }, { 3, -2, 0, 5, }, { 3, -1, -1, 5, }, { 3, -1, 1, 5, }, { 3, 0, -2, 5, }, { 3, 0, 2, 5, }, { 3, 1, -1, 5, }, { 3, 1, 1, 5, }, { 3, 2, 0, 5, }, { -3, -3, 0, 6, }, { -3, -2, -1, 6, }, { -3, -2, 1, 6, }, { -3, -1, -2, 6, }, { -3, -1, 2, 6, }, { -3, 1, -2, 6, }, { -3, 1, 2, 6, }, { -3, 2, -1, 6, }, { -3, 2, 1, 6, }, { -3, 3, 0, 6, }, { -2, -3, -1, 6, }, { -2, -3, 1, 6, }, { -2, -2, -2, 6, }, { -2, -2, 2, 6, }, { -2, 2, -2, 6, }, { -2, 2, 2, 6, }, { -2, 3, -1, 6, }, { -2, 3, 1, 6, }, { -1, -3, -2, 6, }, { -1, -3, 2, 6, }, { -1, 3, -2, 6, }, { -1, 3, 2, 6, }, { 1, -3, -2, 6, }, { 1, -3, 2, 6, }, { 1, 3, -2, 6, }, { 1, 3, 2, 6, }, { 2, -3, -1, 6, }, { 2, -3, 1, 6, }, { 2, -2, -2, 6, }, { 2, -2, 2, 6, }, { 2, 2, -2, 6, }, { 2, 2, 2, 6, }, { 2, 3, -1, 6, }, { 2, 3, 1, 6, }, { 3, -3, 0, 6, }, { 3, -2, -1, 6, }, { 3, -2, 1, 6, }, { 3, -1, -2, 6, }, { 3, -1, 2, 6, }, { 3, 1, -2, 6, }, { 3, 1, 2, 6, }, { 3, 2, -1, 6, }, { 3, 2, 1, 6, }, { 3, 3, 0, 6, }, { -3, -3, -1, 7, }, { -3, -3, 1, 7, }, { -3, -2, -2, 7, }, { -3, -2, 2, 7, }, { -3, 2, -2, 7, }, { -3, 2, 2, 7, }, { -3, 3, -1, 7, }, { -3, 3, 1, 7, }, { -2, -3, -2, 7, }, { -2, -3, 2, 7, }, { -2, 3, -2, 7, }, { -2, 3, 2, 7, }, { 2, -3, -2, 7, }, { 2, -3, 2, 7, }, { 2, 3, -2, 7, }, { 2, 3, 2, 7, }, { 3, -3, -1, 7, }, { 3, -3, 1, 7, }, { 3, -2, -2, 7, }, { 3, -2, 2, 7, }, { 3, 2, -2, 7, }, { 3, 2, 2, 7, }, { 3, 3, -1, 7, }, { 3, 3, 1, 7, } }; IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/RoomEncoder/CMakeLists.txt0000664002537200253720000000374215257173642027611 0ustar zmoelnigzmoelnigset (PLUGIN_TARGET "") if (IEM_FORMATS) juce_add_plugin (RoomEncoder PLUGIN_MANUFACTURER_CODE IEMA PLUGIN_CODE RoEn ICON_BIG "../resources/Standalone/IEMPluginSuiteSmall.png" ICON_SMALL "../resources/Standalone/IEMPluginSuiteSmall.png" COMPANY_NAME "IEM" PRODUCT_NAME "RoomEncoder" FORMATS ${IEM_FORMATS} VERSION ${RoomEncoder_VERSION} LV2URI "http://plugins.iem.at/RoomEncoder" VST2_CATEGORY kPlugSurroundFx kPlugCategSpacializer kPlugCategRoomFx VST3_CATEGORIES Spatial Surround Up-Downmix Reverb AAX_CATEGORY SoundField Reverb) list (APPEND PLUGIN_TARGET RoomEncoder) endif() foreach (TARGET IN LISTS PLUGIN_TARGET) juce_generate_juce_header(${TARGET}) target_sources(${TARGET} PRIVATE Source/PluginEditor.cpp Source/PluginEditor.h Source/PluginProcessor.cpp Source/PluginProcessor.h Source/ReflectionsVisualizer.h ../resources/OSC/OSCInputStream.h ../resources/OSC/OSCParameterInterface.cpp ../resources/OSC/OSCParameterInterface.h ../resources/OSC/OSCStatus.cpp ../resources/OSC/OSCStatus.h ../resources/OSC/OSCUtilities.h ../resources/efficientSHvanilla.cpp ) target_compile_definitions(${TARGET} PRIVATE JUCE_USE_CURL=0 JUCE_WEB_BROWSER=0 JUCE_USE_CUSTOM_PLUGIN_STANDALONE_APP=1 JUCE_USE_FLAC=0 JUCE_USE_OGGVORBIS=0 JUCE_USE_MP3AUDIOFORMAT=0 JUCE_USE_LAME_AUDIO_FORMAT=0 JUCE_USE_WINDOWS_MEDIA_FORMAT=0 JUCE_VST3_CAN_REPLACE_VST2=0) target_include_directories(${TARGET} PRIVATE Source) target_link_libraries(${TARGET} PRIVATE LAF_fonts IEM_logo juce::juce_audio_utils juce::juce_audio_plugin_client juce::juce_osc juce::juce_dsp juce::juce_opengl juce::juce_recommended_config_flags juce::juce_recommended_lto_flags) endforeach() IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/FdnReverb/0000775002537200253720000000000015257173642024504 5ustar zmoelnigzmoelnigIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/FdnReverb/Source/0000775002537200253720000000000015257173642025744 5ustar zmoelnigzmoelnigIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/FdnReverb/Source/PluginProcessor.cpp0000664002537200253720000004461615257173642031621 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Sebastian Grill Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #include "PluginProcessor.h" #include "PluginEditor.h" //============================================================================== FdnReverbAudioProcessor::FdnReverbAudioProcessor() : AudioProcessorBase ( #ifndef JucePlugin_PreferredChannelConfigurations BusesProperties() #if ! JucePlugin_IsMidiEffect #if ! JucePlugin_IsSynth .withInput ("Input", ((juce::PluginHostType::getPluginLoadedAs() == juce::AudioProcessor::wrapperType_VST3) ? juce::AudioChannelSet::ambisonic (1) : juce::AudioChannelSet::ambisonic (7)), true) #endif .withOutput ("Output", ((juce::PluginHostType::getPluginLoadedAs() == juce::AudioProcessor::wrapperType_VST3) ? juce::AudioChannelSet::ambisonic (1) : juce::AudioChannelSet::ambisonic (7)), true) #endif , #endif createParameterLayout()) { parameters.addParameterListener ("delayLength", this); parameters.addParameterListener ("revTime", this); parameters.addParameterListener ("fadeInRatio", this); parameters.addParameterListener ("highCutoff", this); parameters.addParameterListener ("highQ", this); parameters.addParameterListener ("highGain", this); parameters.addParameterListener ("lowCutoff", this); parameters.addParameterListener ("lowQ", this); parameters.addParameterListener ("lowGain", this); parameters.addParameterListener ("hpOrder", this); parameters.addParameterListener ("hpFrequency", this); parameters.addParameterListener ("hpQ", this); parameters.addParameterListener ("dryWet", this); parameters.addParameterListener ("fdnSize", this); parameters.addParameterListener ("freeze", this); delayLength = parameters.getRawParameterValue ("delayLength"); revTime = parameters.getRawParameterValue ("revTime"); fadeInRatio = parameters.getRawParameterValue ("fadeInRatio"); highCutoff = parameters.getRawParameterValue ("highCutoff"); highQ = parameters.getRawParameterValue ("highQ"); highGain = parameters.getRawParameterValue ("highGain"); lowCutoff = parameters.getRawParameterValue ("lowCutoff"); lowQ = parameters.getRawParameterValue ("lowQ"); lowGain = parameters.getRawParameterValue ("lowGain"); hpOrder = parameters.getRawParameterValue ("hpOrder"); hpFrequency = parameters.getRawParameterValue ("hpFrequency"); hpQ = parameters.getRawParameterValue ("hpQ"); wet = parameters.getRawParameterValue ("dryWet"); freeze = parameters.getRawParameterValue ("freeze"); fdn.setFdnSize (FeedbackDelayNetwork::big); fdnFade.setFdnSize (FeedbackDelayNetwork::big); fdnFade.setDryWet (1.0f); fdn.setFreeze (static_cast (*freeze)); fdnFade.setFreeze (static_cast (*freeze)); // parameterChanged() isn't called for default values, so initialize the networks explicitly fdn.setDelayLength (*delayLength); fdnFade.setDelayLength (*delayLength); fdn.setT60InSeconds (*revTime); fdnFade.setT60InSeconds (*fadeInRatio * *revTime); fdn.setDryWet (*wet); } FdnReverbAudioProcessor::~FdnReverbAudioProcessor() { } //============================================================================== int FdnReverbAudioProcessor::getNumPrograms() { return 1; // NB: some hosts don't cope very well if you tell them there are 0 programs, // so this should be at least 1, even if you're not really implementing programs. } int FdnReverbAudioProcessor::getCurrentProgram() { return 0; } void FdnReverbAudioProcessor::setCurrentProgram (int index) { } const juce::String FdnReverbAudioProcessor::getProgramName (int index) { return {}; } void FdnReverbAudioProcessor::changeProgramName (int index, const juce::String& newName) { } void FdnReverbAudioProcessor::parameterChanged (const juce::String& parameterID, float newValue) { if (parameterID == "delayLength") { fdn.setDelayLength (*delayLength); fdnFade.setDelayLength (*delayLength); } else if (parameterID == "revTime") { fdn.setT60InSeconds (*revTime); fdnFade.setT60InSeconds (*fadeInRatio * *revTime); } else if (parameterID == "fadeInRatio") fdnFade.setT60InSeconds (*fadeInRatio * *revTime); else if (parameterID == "dryWet") fdn.setDryWet (*wet); else if (parameterID == "fdnSize") { FeedbackDelayNetwork::FdnSize size { FeedbackDelayNetwork::FdnSize::big }; if (newValue < 0.5f) size = FeedbackDelayNetwork::FdnSize::tiny; else if (newValue >= 0.5f && newValue < 1.5f) size = FeedbackDelayNetwork::FdnSize::small; else if (newValue >= 2.5f && newValue < 3.5f) size = FeedbackDelayNetwork::FdnSize::huge; else if (newValue >= 3.5f && newValue < 4.5f) size = FeedbackDelayNetwork::FdnSize::giant; fdn.setFdnSize (size); fdnFade.setFdnSize (size); juce::dsp::ProcessSpec spec; spec.sampleRate = getSampleRate(); spec.maximumBlockSize = getBlockSize(); spec.numChannels = 64; fdn.prepare (spec); fdnFade.prepare (spec); } else if (parameterID == "freeze") { fdn.setFreeze (static_cast (*freeze)); fdnFade.setFreeze (static_cast (*freeze)); } else { updateFilterParameters(); } } void FdnReverbAudioProcessor::updateFilterParameters() { FeedbackDelayNetwork::FilterParameter lowShelf; FeedbackDelayNetwork::FilterParameter highShelf; FeedbackDelayNetwork::HPFilterParameter hpFilter; lowShelf.frequency = *lowCutoff; lowShelf.q = *lowQ; lowShelf.linearGain = juce::Decibels::decibelsToGain (lowGain->load()); highShelf.frequency = *highCutoff; highShelf.q = *highQ; highShelf.linearGain = juce::Decibels::decibelsToGain (highGain->load()); hpFilter.frequency = *hpFrequency; hpFilter.q = *hpQ; hpFilter.mode = static_cast (hpOrder->load()); fdn.setFilterParameter (lowShelf, highShelf, hpFilter); fdnFade.setFilterParameter (lowShelf, highShelf, hpFilter); } //============================================================================== void FdnReverbAudioProcessor::prepareToPlay (double sampleRate, int samplesPerBlock) { updateFilterParameters(); copyBuffer.setSize (64, samplesPerBlock); copyBuffer.clear(); juce::dsp::ProcessSpec spec; spec.sampleRate = sampleRate; spec.maximumBlockSize = samplesPerBlock; spec.numChannels = 64; fdn.prepare (spec); fdnFade.prepare (spec); maxPossibleChannels = getTotalNumInputChannels(); } //------------------------------------------------------------------------------ void FdnReverbAudioProcessor::releaseResources() { // When playback stops, you can use this as an opportunity to free up any // spare memory, etc. } //------------------------------------------------------------------------------ void FdnReverbAudioProcessor::reset() { fdn.reset(); fdnFade.reset(); } //------------------------------------------------------------------------------ void FdnReverbAudioProcessor::processBlock (juce::AudioBuffer& buffer, juce::MidiBuffer& midiMessages) { const int nChannels = buffer.getNumChannels(); const int nSamples = buffer.getNumSamples(); const bool useFadeIn = *fadeInRatio >= 0.01f; // make copy of input data if (useFadeIn) { for (int i = 0; i < nChannels; i++) { copyBuffer.copyFrom (i, 0, buffer, i, 0, nSamples); } juce::dsp::AudioBlock blockFade (copyBuffer.getArrayOfWritePointers(), nChannels, nSamples); fdnFade.process (juce::dsp::ProcessContextReplacing (blockFade)); // the wet signal of the fdn also contains the direct input, so remove it from the fade-in // network's output to only subtract its reverb tail and keep the dry signal for (int i = 0; i < nChannels; i++) { copyBuffer.addFrom (i, 0, buffer, i, 0, nSamples, -1.0f); } } juce::dsp::AudioBlock block (buffer); fdn.process (juce::dsp::ProcessContextReplacing (block)); if (useFadeIn) { for (int i = 0; i < nChannels; i++) { buffer.addFrom (i, 0, copyBuffer, i, 0, nSamples, -*wet); } } auto fdnSize = fdn.getFdnSize(); if (fdnSize < nChannels) { for (int ch = fdnSize; ch < nChannels; ++ch) buffer.clear (ch, 0, nSamples); } } void FdnReverbAudioProcessor::getT60ForFrequencyArray (double* frequencies, double* t60Data, size_t numSamples) { fdn.getT60ForFrequencyArray (frequencies, t60Data, numSamples); } //============================================================================== bool FdnReverbAudioProcessor::hasEditor() const { return true; // (change this to false if you choose to not supply an editor) } juce::AudioProcessorEditor* FdnReverbAudioProcessor::createEditor() { return new FdnReverbAudioProcessorEditor (*this, parameters); } //============================================================================== void FdnReverbAudioProcessor::getStateInformation (juce::MemoryBlock& destData) { auto state = parameters.copyState(); auto oscConfig = state.getOrCreateChildWithName ("OSCConfig", nullptr); oscConfig.copyPropertiesFrom (oscParameterInterface.getConfig(), nullptr); std::unique_ptr xml (state.createXml()); copyXmlToBinary (*xml, destData); } void FdnReverbAudioProcessor::setStateInformation (const void* data, int sizeInBytes) { std::unique_ptr xmlState (getXmlFromBinary (data, sizeInBytes)); if (xmlState.get() != nullptr) if (xmlState->hasTagName (parameters.state.getType())) { parameters.replaceState (juce::ValueTree::fromXml (*xmlState)); if (parameters.state.hasProperty ("OSCPort")) // legacy { oscParameterInterface.getOSCReceiver().connect ( parameters.state.getProperty ("OSCPort", juce::var (-1))); parameters.state.removeProperty ("OSCPort", nullptr); } auto oscConfig = parameters.state.getChildWithName ("OSCConfig"); if (oscConfig.isValid()) oscParameterInterface.setConfig (oscConfig); // Add compatibility layer for the old absolute fade-in time parameter: it used to be // a time in seconds, but is a ratio of the reverberation time now. auto* oldFadeInTime = xmlState->getChildByAttribute ("id", "fadeInTime"); if (oldFadeInTime != nullptr) { // don't touch states which already hold the new parameter if (xmlState->getChildByAttribute ("id", "fadeInRatio") == nullptr) { const auto fadeInTimeInSeconds = oldFadeInTime->getStringAttribute ("value").getFloatValue(); const auto revTimeInSeconds = revTime->load(); // already restored above auto fadeInState = parameters.state.getChildWithProperty ("id", "fadeInRatio"); if (fadeInState.isValid()) fadeInState.setProperty ( "value", revTimeInSeconds > 0.0f ? juce::jlimit (0.0f, 1.0f, fadeInTimeInSeconds / revTimeInSeconds) : 0.0f, nullptr); } // don't carry the obsolete parameter around any longer parameters.state.removeChild ( parameters.state.getChildWithProperty ("id", "fadeInTime"), nullptr); } } } //============================================================================== std::vector> FdnReverbAudioProcessor::createParameterLayout() { // add your audio parameters here std::vector> params; params.push_back (OSCParameterInterface::createParameterTheOldWay ( "delayLength", "Room Size", "", juce::NormalisableRange (1.0f, 30.0f, 1.0f), 20.0f, [] (float value) { return juce::String (value, 0); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "revTime", "Reverberation Time", "s", juce::NormalisableRange (0.1f, 9.0f, 0.1f), 5.f, [] (float value) { return juce::String (value, 1); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "lowCutoff", "Lows Cutoff Frequency", "Hz", juce::NormalisableRange (20.f, 20000.f, 1.f, 0.2f), 100.f, [] (float value) { return juce::String (value, 0); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "lowQ", "Lows Q Factor", "", juce::NormalisableRange (0.01f, 0.9f, 0.01f), 0.5f, [] (float value) { return juce::String (value, 2); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "lowGain", "Lows Gain", "dB/s", juce::NormalisableRange (-80.0f, 6.0, 0.1f), 1.f, [] (float value) { return juce::String (value, 1); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "highCutoff", "Highs Cutoff Frequency", "Hz", juce::NormalisableRange (20.f, 20000.f, 1.f, 0.2f), 2000.f, [] (float value) { return juce::String (value, 0); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "highQ", "Highs Q Factor", "", juce::NormalisableRange (0.01f, 0.9f, 0.01f), 0.5f, [] (float value) { return juce::String (value, 2); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "highGain", "Highs Gain", "dB/s", juce::NormalisableRange (-80.0f, 4.0f, 0.1f), -10.f, [] (float value) { return juce::String (value, 1); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "hpOrder", "Highpass Slope", "", juce::NormalisableRange (0.0f, 3.0f, 1.0f), 0.0f, [] (float value) { if (value < 0.5f) return "disabled"; else if (value >= 0.5f && value < 1.5f) return "6 dB/oct"; else if (value >= 1.5f && value < 2.5f) return "12 dB/oct"; else return "24 dB/oct"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "hpFrequency", "Highpass Cutoff Frequency", "Hz", juce::NormalisableRange (20.0f, 20000.0f, 1.0f, 0.4f), 20.0f, [] (float value) { return juce::String (value, 0); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "hpQ", "Highpass Q Factor", "", juce::NormalisableRange (0.01f, 0.9f, 0.01f), 0.7f, [] (float value) { return juce::String (value, 2); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "dryWet", "Dry/Wet", "", juce::NormalisableRange (0.f, 1.f, 0.01f), 0.5f, [] (float value) { return juce::String (value, 2); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "fadeInRatio", "Fade-in Ratio", "", juce::NormalisableRange (0.0f, 1.0f, 0.01f), 0.1f, [] (float value) { return juce::String (value, 2); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "fdnSize", "Fdn Size (internal)", "", juce::NormalisableRange (0.0f, 4.0f, 1.0f), 2.0f, [] (float value) { if (value < 0.5f) return "16"; else if (value >= 0.5 && value < 1.5f) return "32"; else if (value >= 1.5 && value < 2.5f) return "64"; else if (value >= 2.5 && value < 3.5f) return "128"; else return "256"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "freeze", "Freeze", "", juce::NormalisableRange (0.0f, 1.0f, 1.0f), 0.0f, [] (float value) { return value < 0.5 ? "off" : "on"; }, nullptr)); return params; } //============================================================================== // This creates new instances of the plugin.. juce::AudioProcessor* JUCE_CALLTYPE createPluginFilter() { return new FdnReverbAudioProcessor(); } IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/FdnReverb/Source/PluginEditor.cpp0000664002537200253720000004722715257173642031071 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Sebastian Grill Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #include "PluginEditor.h" #include "PluginProcessor.h" //============================================================================== FdnReverbAudioProcessorEditor::FdnReverbAudioProcessorEditor ( FdnReverbAudioProcessor& p, juce::AudioProcessorValueTreeState& vts) : juce::AudioProcessorEditor (&p), processor (p), valueTreeState (vts), footer (p.getOSCParameterInterface()), tv (20.f, 20000.f, 0.1f, 25.f, 5.f), fv (20.f, 20000.f, -80.f, 5.f, 5.f, false) { // Make sure that before the constructor has finished, you've set the // editor's size to whatever you need it to be. setResizeLimits (650, 480, 1000, 950); setResizable (true, true); setLookAndFeel (&globalLaF); addAndMakeVisible (&freezeMode); freezeAttachment.reset (new ButtonAttachment (valueTreeState, "freeze", freezeMode)); freezeMode.setButtonText ("freeze"); addAndMakeVisible (&title); title.setTitle (juce::String ("FDN"), juce::String ("Reverb")); title.setFont (globalLaF.robotoBold, globalLaF.robotoLight); addAndMakeVisible (&footer); addAndMakeVisible (&delayGroup); delayGroup.setText ("General Settings"); delayGroup.setTextLabelPosition (juce::Justification::centredLeft); delayGroup.setColour (juce::GroupComponent::outlineColourId, globalLaF.ClSeperator); delayGroup.setColour (juce::GroupComponent::textColourId, juce::Colours::white); delayGroup.setVisible (true); addAndMakeVisible (&filterGroup); filterGroup.setText ("Filter Settings"); addAndMakeVisible (&t60Group); t60Group.setText ("Reverberation Time"); t60Group.setTextLabelPosition (juce::Justification::centredLeft); t60Group.setColour (juce::GroupComponent::outlineColourId, globalLaF.ClSeperator); t60Group.setColour (juce::GroupComponent::textColourId, juce::Colours::red); t60Group.setVisible (true); addAndMakeVisible (&delayLengthSlider); delayAttachment.reset (new SliderAttachment (valueTreeState, "delayLength", delayLengthSlider)); delayLengthSlider.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); delayLengthSlider.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); delayLengthSlider.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[1]); delayLengthSlider.setTooltip ("Room Size"); addAndMakeVisible (&revTimeSlider); feedbackAttachment.reset (new SliderAttachment (valueTreeState, "revTime", revTimeSlider)); revTimeSlider.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); revTimeSlider.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); revTimeSlider.setColour (juce::Slider::rotarySliderOutlineColourId, juce::Colours::white); revTimeSlider.setTooltip ("Reverberation Time"); revTimeSlider.addListener (this); addAndMakeVisible (&fadeInSlider); fadeInAttachment.reset (new SliderAttachment (valueTreeState, "fadeInRatio", fadeInSlider)); fadeInSlider.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); fadeInSlider.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); fadeInSlider.setColour (juce::Slider::rotarySliderOutlineColourId, juce::Colours::white); fadeInSlider.setTooltip ("FadeIn Time Ratio, Fraction of Reverberation Time"); addAndMakeVisible (&dryWetSlider); dryWetAttachment.reset (new SliderAttachment (valueTreeState, "dryWet", dryWetSlider)); dryWetSlider.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); dryWetSlider.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); dryWetSlider.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[2]); dryWetSlider.setTooltip ("Dry/Wet"); addAndMakeVisible (&lowCutoffSlider); lowCutoffAttachment.reset (new SliderAttachment (valueTreeState, "lowCutoff", lowCutoffSlider)); lowCutoffSlider.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); lowCutoffSlider.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); lowCutoffSlider.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[3]); lowCutoffSlider.setTooltip ("Low Shelf Cutoff Freq"); addAndMakeVisible (&lowQSlider); lowQAttachment.reset (new SliderAttachment (valueTreeState, "lowQ", lowQSlider)); lowQSlider.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); lowQSlider.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); lowQSlider.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[3]); lowQSlider.setTooltip ("Low Shelf Q"); addAndMakeVisible (&lowGainSlider); lowGainAttachment.reset (new SliderAttachment (valueTreeState, "lowGain", lowGainSlider)); lowGainSlider.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); lowGainSlider.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); lowGainSlider.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[3]); lowGainSlider.setTooltip ("Low Shelf Gain"); addAndMakeVisible (&highCutoffSlider); highCutoffAttachment.reset ( new SliderAttachment (valueTreeState, "highCutoff", highCutoffSlider)); highCutoffSlider.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); highCutoffSlider.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); highCutoffSlider.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[0]); ; highCutoffSlider.setTooltip ("High Shelf Cutoff Freq"); addAndMakeVisible (&highQSlider); highQAttachment.reset (new SliderAttachment (valueTreeState, "highQ", highQSlider)); highQSlider.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); highQSlider.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); highQSlider.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[0]); highQSlider.setTooltip ("High Shelf Q"); addAndMakeVisible (&highGainSlider); highGainAttachment.reset (new SliderAttachment (valueTreeState, "highGain", highGainSlider)); highGainSlider.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); highGainSlider.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); highGainSlider.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[0]); highGainSlider.setTooltip ("High Shelf Gain"); addAndMakeVisible (&hpCutoffSlider); hpCutoffAttachment.reset (new SliderAttachment (valueTreeState, "hpFrequency", hpCutoffSlider)); hpCutoffSlider.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); hpCutoffSlider.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); hpCutoffSlider.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[2]); hpCutoffSlider.setTooltip ("Highpass Cutoff Freq"); addAndMakeVisible (&hpQSlider); hpQAttachment.reset (new SliderAttachment (valueTreeState, "hpQ", hpQSlider)); hpQSlider.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); hpQSlider.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); hpQSlider.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[2]); hpQSlider.setTooltip ("Highpass Q"); addAndMakeVisible (cbHpMode); cbHpMode.addSectionHeading ("HP Mode"); cbHpMode.addItem ("off", 1); cbHpMode.addItem ("6 dB/oct", 2); cbHpMode.addItem ("12 dB/oct", 3); cbHpMode.addItem ("24 dB/oct", 4); cbHpMode.setJustificationType (juce::Justification::centred); cbHpModeAttachment.reset (new ComboBoxAttachment (valueTreeState, "hpOrder", cbHpMode)); cbHpMode.addListener (this); if (cbHpMode.getSelectedId() == 3) hpQSlider.setEnabled (true); else hpQSlider.setEnabled (false); addAndMakeVisible (cbFdnSize); cbFdnSize.addSectionHeading ("Fdn Size"); cbFdnSize.addItem ("16", 1); cbFdnSize.addItem ("32", 2); cbFdnSize.addItem ("64", 3); cbFdnSize.addItem ("128", 4); cbFdnSize.addItem ("256", 5); cbFdnSize.setJustificationType (juce::Justification::centred); cbFdnSizeAttachment.reset (new ComboBoxAttachment (valueTreeState, "fdnSize", cbFdnSize)); addAndMakeVisible (&freezeMode); freezeMode.setButtonText ("Freeze"); addAndMakeVisible (&lbDelay); lbDelay.setText ("Room Size"); addAndMakeVisible (&lbTime); lbTime.setText ("Rev. Time"); addAndMakeVisible (&lbDryWet); lbDryWet.setText ("Dry/Wet"); addAndMakeVisible (&lbHighCutoff); lbHighCutoff.setText ("Freq."); addAndMakeVisible (&lbHighQ); lbHighQ.setText ("Q"); addAndMakeVisible (&lbHighGain); lbHighGain.setText ("Gain"); addAndMakeVisible (&lbLowCutoff); lbLowCutoff.setText ("Freq."); addAndMakeVisible (&lbLowQ); lbLowQ.setText ("Q"); addAndMakeVisible (&lbLowGain); lbLowGain.setText ("Gain"); addAndMakeVisible (&lbHpCutoff); lbHpCutoff.setText ("Freq."); addAndMakeVisible (&lbHpQ); lbHpQ.setText ("Q"); addAndMakeVisible (fdnSize); fdnSize.setText ("Fdn Size"); addAndMakeVisible (&fdnLbTime); fdnLbTime.setText ("Fade In"); // left side addAndMakeVisible (&tv); addAndMakeVisible (&fv); auto fdnPtr = processor.getFdnPtr(); if (fdnPtr != nullptr) { fdnPtr->updateGuiCoefficients(); tv.addCoefficients (fdnPtr->getCoefficientsForGui (0), globalLaF.ClWidgetColours[2], &hpCutoffSlider); tv.addCoefficients (fdnPtr->getCoefficientsForGui (1), juce::Colours::orangered, &lowCutoffSlider, &lowGainSlider); tv.addCoefficients (fdnPtr->getCoefficientsForGui (2), juce::Colours::cyan, &highCutoffSlider, &highGainSlider); fv.addCoefficients (fdnPtr->getCoefficientsForGui (0), globalLaF.ClWidgetColours[2], &hpCutoffSlider, nullptr, &hpQSlider); fv.addCoefficients (fdnPtr->getCoefficientsForGui (1), globalLaF.ClWidgetColours[3], &lowCutoffSlider, &lowGainSlider, &lowQSlider); fv.addCoefficients (fdnPtr->getCoefficientsForGui (2), globalLaF.ClWidgetColours[0], &highCutoffSlider, &highGainSlider, &highQSlider); } float gain = pow (10.0, -3.0 / revTimeSlider.getValue()); tv.setOverallGain (gain); fv.setOverallGain (gain); startTimer (20); } FdnReverbAudioProcessorEditor::~FdnReverbAudioProcessorEditor() { setLookAndFeel (nullptr); } //============================================================================== void FdnReverbAudioProcessorEditor::paint (juce::Graphics& g) { // (Our component is opaque, so we must completely fill the background with a solid colour) g.fillAll (globalLaF.ClBackground); } void FdnReverbAudioProcessorEditor::timerCallback() { auto fdnPtr = processor.getFdnPtr(); if (fdnPtr != nullptr && fdnPtr->repaintFV) { updateVisualizers(); fdnPtr->repaintFV = false; } } void FdnReverbAudioProcessorEditor::sliderValueChanged (juce::Slider* slider) { if (slider == &revTimeSlider) { float gain = pow (10.0, -3.0 / revTimeSlider.getValue()); fv.setOverallGain (gain); tv.setOverallGain (gain); updateVisualizers(); } } void FdnReverbAudioProcessorEditor::comboBoxChanged (juce::ComboBox* comboBox) { if (comboBox == &cbHpMode) { if (cbHpMode.getSelectedId() == 3) hpQSlider.setEnabled (true); else hpQSlider.setEnabled (false); } } void FdnReverbAudioProcessorEditor::updateVisualizers() { auto fdnPtr = processor.getFdnPtr(); if (fdnPtr != nullptr && processor.getSampleRate() > 0) { fdnPtr->updateGuiCoefficients(); fv.setSampleRate (processor.getSampleRate()); tv.setSampleRate (processor.getSampleRate()); for (int i = 0; i < 3; ++i) { fv.replaceCoefficients (i, fdnPtr->getCoefficientsForGui (i)); tv.replaceCoefficients (i, fdnPtr->getCoefficientsForGui (i)); } } fv.repaint(); tv.repaint(); } void FdnReverbAudioProcessorEditor::resized() { // This is generally where you'll want to lay out the positions of any // subcomponents in your editor.. const int leftRightMargin = 30; const int headerHeight = 60; const int footerHeight = 25; const int rotSliderHeight = 55; const int rotSliderSpacing = 10; const int labelHeight = 20; juce::Rectangle area (getLocalBounds()); juce::Rectangle footerArea (area.removeFromBottom (footerHeight)); footer.setBounds (footerArea); area.removeFromLeft (leftRightMargin); area.removeFromRight (leftRightMargin); juce::Rectangle headerArea = area.removeFromTop (headerHeight); title.setBounds (headerArea); area.removeFromTop (10); area.removeFromBottom (5); { //====================== DELAY SETTINGS GROUP ================================== const int rotSliderWidth = 55; juce::Rectangle settingsArea ( area.removeFromRight (2 * rotSliderWidth + rotSliderSpacing)); delayGroup.setBounds (settingsArea); settingsArea.removeFromTop (25); //for box headline juce::Rectangle sliderRow (settingsArea.removeFromTop (rotSliderHeight)); delayLengthSlider.setBounds (sliderRow.removeFromLeft (rotSliderWidth)); sliderRow.removeFromLeft (rotSliderSpacing); revTimeSlider.setBounds (sliderRow.removeFromLeft (rotSliderWidth)); sliderRow.removeFromLeft (rotSliderSpacing); sliderRow = settingsArea.removeFromTop (labelHeight); lbDelay.setBounds (sliderRow.removeFromLeft (rotSliderWidth)); sliderRow.removeFromLeft (rotSliderSpacing); lbTime.setBounds (sliderRow.removeFromLeft (rotSliderWidth)); settingsArea.removeFromTop (25); sliderRow = settingsArea.removeFromTop (rotSliderHeight); auto cbArea = sliderRow.removeFromLeft (rotSliderWidth); cbFdnSize.setBounds (cbArea.removeFromBottom (24)); cbArea.removeFromBottom (5); freezeMode.setBounds (cbArea.removeFromBottom (24)); sliderRow.removeFromLeft (rotSliderSpacing); fadeInSlider.setBounds (sliderRow.removeFromLeft (rotSliderWidth)); sliderRow.removeFromLeft (rotSliderSpacing); sliderRow = settingsArea.removeFromTop (labelHeight); fdnSize.setBounds (sliderRow.removeFromLeft (rotSliderWidth)); sliderRow.removeFromLeft (rotSliderSpacing); fdnLbTime.setBounds (sliderRow.removeFromLeft (rotSliderWidth)); settingsArea.removeFromTop (25); sliderRow = settingsArea.removeFromTop (rotSliderHeight); dryWetSlider.setBounds (sliderRow.removeFromRight (rotSliderWidth)); sliderRow = settingsArea.removeFromTop (labelHeight); lbDryWet.setBounds (sliderRow.removeFromRight (rotSliderWidth)); } area.removeFromRight (10); //spacing const int height = (area.getHeight() - 10 - labelHeight - rotSliderHeight + 10) / 2; { //====================== T60 GROUP ================================== juce::Rectangle t60Area (area.removeFromTop (height)); t60Group.setBounds (t60Area); t60Area.removeFromTop (25); tv.setBounds (t60Area); } area.removeFromTop (10); //spacing { //====================== FILTER GROUP ================================== const int rotSliderWidth = 40; const int filterSliderHeight = rotSliderHeight - 5; juce::Rectangle filterArea (area); filterGroup.setBounds (filterArea); filterArea.removeFromTop (25); juce::FlexBox flexboxUI; juce::Array uiItems; juce::Array lbItems; flexboxUI.flexDirection = juce::FlexBox::Direction::row; flexboxUI.flexWrap = juce::FlexBox::Wrap::noWrap; flexboxUI.alignContent = juce::FlexBox::AlignContent::center; flexboxUI.justifyContent = juce::FlexBox::JustifyContent::spaceBetween; flexboxUI.alignItems = juce::FlexBox::AlignItems::center; juce::FlexBox flexboxLb = flexboxUI; uiItems.add (juce::FlexItem (rotSliderWidth, filterSliderHeight, hpCutoffSlider)); uiItems.add (juce::FlexItem (rotSliderWidth, filterSliderHeight, hpQSlider)); uiItems.add (juce::FlexItem ((int) rotSliderWidth * 2, 24, cbHpMode)); uiItems.add (juce::FlexItem ((int) rotSliderWidth / 2, filterSliderHeight)); uiItems.add (juce::FlexItem (rotSliderWidth, filterSliderHeight, lowCutoffSlider)); uiItems.add (juce::FlexItem (rotSliderWidth, filterSliderHeight, lowQSlider)); uiItems.add (juce::FlexItem (rotSliderWidth, filterSliderHeight, lowGainSlider)); uiItems.add (juce::FlexItem ((int) rotSliderWidth / 2, filterSliderHeight)); uiItems.add (juce::FlexItem (rotSliderWidth, filterSliderHeight, highCutoffSlider)); uiItems.add (juce::FlexItem (rotSliderWidth, filterSliderHeight, highQSlider)); uiItems.add (juce::FlexItem (rotSliderWidth, filterSliderHeight, highGainSlider)); lbItems.add (juce::FlexItem (rotSliderWidth, labelHeight, lbHpCutoff)); lbItems.add (juce::FlexItem (rotSliderWidth, labelHeight, lbHpQ)); lbItems.add (juce::FlexItem ((int) rotSliderWidth * 2, labelHeight)); lbItems.add (juce::FlexItem ((int) rotSliderWidth / 2, labelHeight)); lbItems.add (juce::FlexItem (rotSliderWidth, labelHeight, lbLowCutoff)); lbItems.add (juce::FlexItem (rotSliderWidth, labelHeight, lbLowQ)); lbItems.add (juce::FlexItem (rotSliderWidth, labelHeight, lbLowGain)); lbItems.add (juce::FlexItem ((int) rotSliderWidth / 2, labelHeight)); lbItems.add (juce::FlexItem (rotSliderWidth, labelHeight, lbHighCutoff)); lbItems.add (juce::FlexItem (rotSliderWidth, labelHeight, lbHighQ)); lbItems.add (juce::FlexItem (rotSliderWidth, labelHeight, lbHighGain)); juce::Rectangle sliderRow (filterArea.removeFromBottom (labelHeight)); flexboxLb.items = lbItems; flexboxLb.performLayout (sliderRow); sliderRow = filterArea.removeFromBottom (rotSliderHeight); flexboxUI.items = uiItems; flexboxUI.performLayout (sliderRow); fv.setBounds (filterArea); } } IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/FdnReverb/Source/PluginProcessor.h0000664002537200253720000000753415257173642031264 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Sebastian Grill Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once #include "../../resources/AudioProcessorBase.h" #include "../../resources/FeedbackDelayNetwork.h" #include "../JuceLibraryCode/JuceHeader.h" #define ProcessorClass FdnReverbAudioProcessor //============================================================================== /** */ class FdnReverbAudioProcessor : public AudioProcessorBase { public: constexpr static int numberOfInputChannels = 64; constexpr static int numberOfOutputChannels = 64; //============================================================================== FdnReverbAudioProcessor(); ~FdnReverbAudioProcessor(); //============================================================================== void prepareToPlay (double sampleRate, int samplesPerBlock) override; void releaseResources() override; void reset() override; void processBlock (juce::AudioBuffer& buffer, juce::MidiBuffer& midiMessages) override; //============================================================================== juce::AudioProcessorEditor* createEditor() override; bool hasEditor() const override; //============================================================================== int getNumPrograms() override; int getCurrentProgram() override; void setCurrentProgram (int index) override; const juce::String getProgramName (int index) override; void changeProgramName (int index, const juce::String& newName) override; //============================================================================== void getStateInformation (juce::MemoryBlock& destData) override; void setStateInformation (const void* data, int sizeInBytes) override; void parameterChanged (const juce::String& parameterID, float newValue) override; //======= Parameters =========================================================== std::vector> createParameterLayout(); int maxPossibleChannels = 64; void updateFilterParameters(); void getT60ForFrequencyArray (double* frequencies, double* t60Data, size_t numSamples); FeedbackDelayNetwork* getFdnPtr() { return &fdn; }; private: //============================================================================== juce::AudioBuffer copyBuffer; // parameters (from GUI) std::atomic* revTime; std::atomic* fadeInRatio; std::atomic* delayLength; std::atomic* highCutoff; std::atomic* highQ; std::atomic* highGain; std::atomic* lowCutoff; std::atomic* lowQ; std::atomic* lowGain; std::atomic* hpOrder; std::atomic* hpFrequency; std::atomic* hpQ; std::atomic* wet; std::atomic* freeze; FeedbackDelayNetwork fdn, fdnFade; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (FdnReverbAudioProcessor) }; IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/FdnReverb/Source/T60Visualizer.h0000664002537200253720000003506315257173642030553 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich, Sebastian Grill Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once template class T60Visualizer : public juce::Component { struct Settings { float fMin = 20.0f; // minimum displayed frequency float fMax = 20000.0f; // maximum displayed frequency float yMin = 0.1f; // min displayed seconds float yMax = 60.0f; // max displayed seconds float gridDiv = 5.0f; // how many seconds per divisions (between grid lines) }; const float mL = 23.0f; const float mR = 10.0f; const float mT = 7.0f; const float mB = 15.0f; const float OH = 3.0f; public: T60Visualizer() : juce::Component(), overallGainInDb (0.0f), sampleRate (48000) {}; T60Visualizer (float fMin, float fMax, float yMin, float yMax, float gridDiv) : juce::Component(), overallGainInDb (0.0f), sampleRate (48000), s { fMin, fMax, yMin, yMax, gridDiv } {}; ~T60Visualizer() {}; void paint (juce::Graphics& g) override { g.setColour (juce::Colours::steelblue.withMultipliedAlpha (0.01f)); g.fillAll(); //int width = getWidth(); g.setFont ( juce::FontOptions (getLookAndFeel().getTypefaceForFont (juce::FontOptions (12.0f, 2)))); g.setFont (12.0f); // time labels g.setColour (juce::Colours::white); juce::String axislabel = juce::String (0.1f); g.drawText (axislabel, 0, t60ToY (0.1f) - 6, 18, 12.0f, juce::Justification::right, false); axislabel = juce::String (1.f); g.drawText (axislabel, 0, t60ToY (1.f) - 6, 18, 12.0f, juce::Justification::right, false); for (float t = s.yMin; t <= s.yMax; t += powf (10, floorf (log10 (t)))) { int ypos = t60ToY (t); juce::String axislabel; bool drawText = false; if ((t == 1) || (t == 10) || (t == 60)) { axislabel = juce::String ((int) t); drawText = true; } if (drawText) { g.drawText (axislabel, 0, ypos - 6, 18, 12.0f, juce::Justification::right, false); } } // frequency labels for (float f = s.fMin; f <= s.fMax; f += powf (10, floorf (log10 (f)))) { int xpos = hzToX (f); juce::String axislabel; bool drawText = false; if ((f == 20) || (f == 50) || (f == 100) || (f == 500)) { axislabel = juce::String ((int) f); drawText = true; } else if ((f == 1000) || (f == 5000) || (f == 10000) || (f == 20000)) { axislabel = juce::String ((int) f / 1000); axislabel << "k"; drawText = true; } if (drawText) { g.drawText (axislabel, xpos - 10, t60ToY (s.yMin) + OH + 0.0f, 20, 12, juce::Justification::centred, false); } } g.setColour (juce::Colours::steelblue.withMultipliedAlpha (0.8f)); g.strokePath (dbGridPath, juce::PathStrokeType (0.5f)); g.setColour (juce::Colours::steelblue.withMultipliedAlpha (0.9f)); g.strokePath (dbGridPathBold, juce::PathStrokeType (1.0f)); g.setColour (juce::Colours::steelblue.withMultipliedAlpha (0.9f)); g.strokePath (hzGridPathBold, juce::PathStrokeType (1.0f)); g.setColour (juce::Colours::steelblue.withMultipliedAlpha (0.8f)); g.strokePath (hzGridPath, juce::PathStrokeType (0.5f)); // draw filter magnitude responses juce::Path magnitude; allMagnitudesInDb.fill (overallGainInDb); int xMin = hzToX (s.fMin); int xMax = hzToX (s.fMax); int yMax = t60ToY (s.yMin); int yMin = t60ToY (s.yMax); g.excludeClipRegion ( juce::Rectangle (0.0f, yMax + OH, getWidth(), getHeight() - yMax - OH)); for (int i = arrayOfCoefficients.size(); --i >= 0;) { //bool isActive = activeElem == i; typename juce::dsp::IIR::Coefficients::Ptr handle = (typename juce::dsp::IIR::Coefficients::Ptr) arrayOfCoefficients.getUnchecked (i); magnitude.clear(); float db = juce::Decibels::gainToDecibels ( handle->getMagnitudeForFrequency (xToHz (xMin), sampleRate)); allMagnitudesInDb.setUnchecked (0, allMagnitudesInDb[0] + db); for (int x = xMin + 1; x <= xMax; ++x) { float db = juce::Decibels::gainToDecibels ( handle->getMagnitudeForFrequency (xToHz (x), sampleRate)); allMagnitudesInDb.setUnchecked (x - xMin, allMagnitudesInDb[x - xMin] + db); } } //all magnitudes combined magnitude.clear(); magnitude.startNewSubPath ( xMin, juce::jlimit ((float) yMin, (float) yMax + OH + 1, t60ToYFloat (gainToT60Float (allMagnitudesInDb[0])))); for (int x = xMin + 1; x <= xMax; ++x) { magnitude.lineTo ( x, juce::jlimit ((float) yMin, (float) yMax + OH + 1, t60ToYFloat (gainToT60Float (allMagnitudesInDb[x - xMin])))); } g.setColour (juce::Colours::white); g.strokePath (magnitude, juce::PathStrokeType (1.5f)); g.setColour (juce::Colours::white.withMultipliedAlpha (0.3f)); g.fillPath (tolerancePath, juce::AffineTransform::translation (0.0f, t60ToY (gainToT60Float (overallGainInDb)) - t60ToY (10.0f))); }; void mouseWheelMove (const juce::MouseEvent& e, const juce::MouseWheelDetails& wheel) override { const double delta = 100 * (std::abs (wheel.deltaX) > std::abs (wheel.deltaY) ? -wheel.deltaX : wheel.deltaY); //bool positiveDelta = delta >= 0.0; float value = s.yMax + juce::roundToInt (delta); value = juce::jmin (value, 80.0f); value = juce::jmax (value, 5.0f); s.yMax = value; resized(); repaint(); } void createTolerancePath() { const float tRef = 10; //10 is our reference, can be anything tolerancePath.clear(); tolerancePath.startNewSubPath (hzToX (s.fMin), t60ToYFloat (getToleranceT60 (s.fMin, tRef, true))); tolerancePath.lineTo (hzToX (250.0f), t60ToYFloat (1.2f * tRef)); tolerancePath.lineTo (hzToX (s.fMax), t60ToYFloat (1.2f * tRef)); tolerancePath.lineTo (hzToX (s.fMax), t60ToYFloat (getToleranceT60 (s.fMax, tRef, false))); tolerancePath.lineTo (hzToX (2000.0f), t60ToYFloat (0.8 * tRef)); tolerancePath.lineTo (hzToX (250.0f), t60ToYFloat (0.8 * tRef)); tolerancePath.lineTo (hzToX (s.fMin), t60ToYFloat (getToleranceT60 (s.fMin, tRef, false))); tolerancePath.closeSubPath(); } float getToleranceT60 (float frequency, float tRef, bool upper) { if (frequency < 250) { if (upper) return tRef * (frequency * -0.002673797f + 1.868449198f); else return tRef * (frequency * -0.002139037f + 1.334759358f); } else if (frequency < 2000) { if (upper) return tRef * 1.2f; else return tRef * 0.8f; } else { if (upper) return tRef * 1.2f; else return tRef * juce::jlimit (0.1f, 1.f, frequency * -0.00005f + 0.9f); } } float gainToT60Float (float db) { return -3.f * 20.f / db; } float t60ToGain (float T60) { return -3.f * 20.f / T60; } int t60ToY (float db) { int ypos = t60ToYFloat (db); return ypos; } float t60ToYFloat (float db) { float height = (float) getHeight() - mB - mT; float ypos = mT + height * (1.f - (log (db / s.yMin) / log (s.yMax / s.yMin))); return ypos; } float yToT60 (float y) { float height = (float) getHeight() - mB - mT; float db = s.yMin * powf (s.yMax / s.yMin, 1.f - (y - mT) / height); return db; } int hzToX (float hz) { float width = (float) getWidth() - mL - mR; int xpos = mL + width * (log (hz / s.fMin) / log (s.fMax / s.fMin)); return xpos; } float xToHz (int x) { float width = (float) getWidth() - mL - mR; return s.fMin * powf ((s.fMax / s.fMin), ((x - mL) / width)); } void setSampleRate (int newSampleRate) { jassert (newSampleRate > 0); sampleRate = newSampleRate; } void setOverallGain (float newGain) { overallGainInDb = juce::Decibels::gainToDecibels (newGain, -500.0f); repaint(); } void mouseDrag (const juce::MouseEvent& event) override { juce::Point pos = event.getPosition(); float frequency = xToHz (pos.x); float gain = yToT60 (pos.y); if (activeElem != -1) { juce::Slider* slHandle; slHandle = arrayOfFrequencySliders[activeElem]; if (slHandle != nullptr) slHandle->setValue (frequency); slHandle = arrayOfGainSliders[activeElem]; if (slHandle != nullptr) slHandle->setValue (gain); } } void mouseMove (const juce::MouseEvent& event) override { juce::Point pos = event.getPosition(); int oldActiveElem = activeElem; activeElem = -1; for (int i = arrayOfCoefficients.size(); --i >= 0;) { juce::Point filterPos (arrayOfFrequencySliders[i] == nullptr ? hzToX (0.0f) : hzToX (arrayOfFrequencySliders[i]->getValue()), arrayOfGainSliders[i] == nullptr ? t60ToY (0.0f) : t60ToY (arrayOfGainSliders[i]->getValue())); if (pos.getDistanceSquaredFrom (filterPos) < 45) { activeElem = i; break; } } if (oldActiveElem != activeElem) repaint(); } void resized() override { int xMin = hzToX (s.fMin); int xMax = hzToX (s.fMax); allMagnitudesInDb.resize (xMax - xMin + 1); const float width = getWidth() - mL - mR; dbGridPath.clear(); dbGridPathBold.clear(); dbGridPathBold.startNewSubPath (mL - OH, t60ToY (0.1f)); dbGridPathBold.lineTo (mL + width + OH, t60ToY (0.1f)); dbGridPathBold.startNewSubPath (mL - OH, t60ToY (1.f)); dbGridPathBold.lineTo (mL + width + OH, t60ToY (1.f)); for (float t = s.yMin; t <= s.yMax; t += powf (10, floorf (log10 (t)))) { int ypos = t60ToY (t); if ((t == 10) || (t == 60)) { dbGridPathBold.startNewSubPath (mL - OH, ypos); dbGridPathBold.lineTo (mL + width + OH, ypos); } else { dbGridPath.startNewSubPath (mL - OH, ypos); dbGridPath.lineTo (mL + width + OH, ypos); } } hzGridPath.clear(); hzGridPathBold.clear(); for (float f = s.fMin; f <= s.fMax; f += powf (10, floorf (log10 (f)))) { int xpos = hzToX (f); if ((f == 20) || (f == 50) || (f == 100) || (f == 500) || (f == 1000) || (f == 5000) || (f == 10000) || (f == 20000)) { hzGridPathBold.startNewSubPath (xpos, t60ToY (s.yMax) - OH); hzGridPathBold.lineTo (xpos, t60ToY (s.yMin) + OH); } else { hzGridPath.startNewSubPath (xpos, t60ToY (s.yMax) - OH); hzGridPath.lineTo (xpos, t60ToY (s.yMin) + OH); } } createTolerancePath(); } void addCoefficients (typename juce::dsp::IIR::Coefficients::Ptr newCoeffs, juce::Colour newColourForCoeffs, juce::Slider* frequencySlider = nullptr, juce::Slider* gainSlider = nullptr) { arrayOfCoefficients.add (newCoeffs); arrayOfColours.add (newColourForCoeffs); arrayOfGainSliders.add (gainSlider); arrayOfFrequencySliders.add (frequencySlider); } void replaceCoefficients ( int filterIdx, typename juce::dsp::IIR::Coefficients::Ptr newCoefficients) { if (filterIdx < arrayOfCoefficients.size()) { arrayOfCoefficients.setUnchecked (filterIdx, newCoefficients); repaint(); } } private: float overallGainInDb; int sampleRate; int activeElem = 0; Settings s; juce::Path dbGridPath; juce::Path dbGridPathBold; juce::Path hzGridPath; juce::Path hzGridPathBold; juce::Path tolerancePath; juce::Array allMagnitudesInDb; juce::Array::Ptr> arrayOfCoefficients; juce::Array arrayOfGainSliders, arrayOfFrequencySliders; juce::Array arrayOfColours; }; IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/FdnReverb/Source/PluginEditor.h0000664002537200253720000000777415257173642030541 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Sebastian Grill Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once #include "../../resources/customComponents/FilterVisualizer.h" #include "../../resources/customComponents/ReverseSlider.h" #include "../../resources/customComponents/SimpleLabel.h" #include "../../resources/customComponents/TitleBar.h" #include "../../resources/lookAndFeel/IEM_LaF.h" #include "../JuceLibraryCode/JuceHeader.h" #include "PluginProcessor.h" #include "T60Visualizer.h" using namespace juce::dsp; typedef ReverseSlider::SliderAttachment SliderAttachment; typedef juce::AudioProcessorValueTreeState::ComboBoxAttachment ComboBoxAttachment; typedef juce::AudioProcessorValueTreeState::ButtonAttachment ButtonAttachment; //============================================================================== class FdnReverbAudioProcessorEditor : public juce::AudioProcessorEditor, private juce::Timer, private juce::Slider::Listener, private juce::ComboBox::Listener { public: FdnReverbAudioProcessorEditor (FdnReverbAudioProcessor&, juce::AudioProcessorValueTreeState&); ~FdnReverbAudioProcessorEditor(); //============================================================================== void paint (juce::Graphics&) override; void resized() override; void sliderValueChanged (juce::Slider* slider) override; void comboBoxChanged (juce::ComboBox* comboBox) override; void updateVisualizers(); private: LaF globalLaF; FdnReverbAudioProcessor& processor; juce::AudioProcessorValueTreeState& valueTreeState; // Layout stuff (footers, headers, logos, etc.) TitleBar title; OSCFooter footer; void timerCallback() override; SimpleLabel lbDelay, lbTime, lbDryWet, lbHighCutoff, lbHighQ, lbHighGain, lbLowCutoff, lbLowQ, lbLowGain, lbHpCutoff, lbHpQ; SimpleLabel fdnLbTime, fdnSize; // Functional stuff (sliders, Indicators, OpenGL Voodoo magic, etc.) // Groups juce::GroupComponent delayGroup, filterGroup, t60Group; // juce::Sliders ReverseSlider delayLengthSlider, revTimeSlider, fadeInSlider, dryWetSlider, highCutoffSlider, highQSlider, highGainSlider, lowCutoffSlider, lowQSlider, lowGainSlider, hpCutoffSlider, hpQSlider; // ComboBox juce::ComboBox cbFdnSize, cbHpMode; // juce::Pointers for value tree state std::unique_ptr delayAttachment, feedbackAttachment, fadeInAttachment, dryWetAttachment, highCutoffAttachment, highQAttachment, highGainAttachment, lowCutoffAttachment, lowQAttachment, lowGainAttachment, hpCutoffAttachment, hpQAttachment; std::unique_ptr cbFdnSizeAttachment, cbHpModeAttachment; // juce::Buttons juce::ToggleButton networkOrder, freezeMode; std::unique_ptr networkOrderAttachment, freezeAttachment; // filter visualization T60Visualizer tv; FilterVisualizer fv; int maxPossibleChannels = 64; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (FdnReverbAudioProcessorEditor) }; IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/FdnReverb/CMakeLists.txt0000664002537200253720000000365615257173642027256 0ustar zmoelnigzmoelnigset (PLUGIN_TARGET "") if (IEM_FORMATS) juce_add_plugin (FdnReverb PLUGIN_MANUFACTURER_CODE IEMA PLUGIN_CODE FdRe ICON_BIG "../resources/Standalone/IEMPluginSuiteSmall.png" ICON_SMALL "../resources/Standalone/IEMPluginSuiteSmall.png" COMPANY_NAME "IEM" PRODUCT_NAME "FdnReverb" FORMATS ${IEM_FORMATS} VERSION ${FdnReverb_VERSION} LV2URI "http://plugins.iem.at/FdnReverb" VST2_CATEGORY kPlugSurroundFx kPlugCategSpacializer kPlugCategRoomFx VST3_CATEGORIES Spatial Surround Reverb Fx AAX_CATEGORY SoundField Reverb) list (APPEND PLUGIN_TARGET FdnReverb) endif() foreach (TARGET IN LISTS PLUGIN_TARGET) juce_generate_juce_header (${TARGET}) target_sources (${TARGET} PRIVATE Source/PluginEditor.cpp Source/PluginEditor.h Source/PluginProcessor.cpp Source/PluginProcessor.h ../resources/OSC/OSCInputStream.h ../resources/OSC/OSCParameterInterface.cpp ../resources/OSC/OSCParameterInterface.h ../resources/OSC/OSCStatus.cpp ../resources/OSC/OSCStatus.h ../resources/OSC/OSCUtilities.h ../resources/efficientSHvanilla.cpp ) target_compile_definitions (${TARGET} PRIVATE JUCE_USE_CURL=0 JUCE_WEB_BROWSER=0 JUCE_USE_CUSTOM_PLUGIN_STANDALONE_APP=1 JUCE_USE_FLAC=0 JUCE_USE_OGGVORBIS=0 JUCE_USE_MP3AUDIOFORMAT=0 JUCE_USE_LAME_AUDIO_FORMAT=0 JUCE_USE_WINDOWS_MEDIA_FORMAT=0 JUCE_VST3_CAN_REPLACE_VST2=0) target_include_directories (${TARGET} PRIVATE Source) target_link_libraries (${TARGET} PRIVATE LAF_fonts IEM_logo juce::juce_audio_utils juce::juce_audio_plugin_client juce::juce_osc juce::juce_dsp juce::juce_opengl juce::juce_recommended_config_flags juce::juce_recommended_lto_flags) endforeach() IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/DistanceCompensator/0000775002537200253720000000000015257173642026574 5ustar zmoelnigzmoelnigIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/DistanceCompensator/Source/0000775002537200253720000000000015257173642030034 5ustar zmoelnigzmoelnig././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/DistanceCompensator/Source/PluginProcessor.cppIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/DistanceCompensator/Source/PluginPro0000664002537200253720000005131515257173642031703 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2018 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #include "PluginProcessor.h" #include "PluginEditor.h" //============================================================================== DistanceCompensatorAudioProcessor::DistanceCompensatorAudioProcessor() : AudioProcessorBase ( #ifndef JucePlugin_PreferredChannelConfigurations BusesProperties() #if ! JucePlugin_IsMidiEffect #if ! JucePlugin_IsSynth .withInput ("Input", ((juce::PluginHostType::getPluginLoadedAs() == juce::AudioProcessor::wrapperType_VST3) ? juce::AudioChannelSet::ambisonic (1) : juce::AudioChannelSet::ambisonic (7)), true) #endif .withOutput ("Output", ((juce::PluginHostType::getPluginLoadedAs() == juce::AudioProcessor::wrapperType_VST3) ? juce::AudioChannelSet::ambisonic (1) : juce::AudioChannelSet::ambisonic (7)), true) #endif , #endif createParameterLayout()) { // get pointers to the parameters inputChannelsSetting = parameters.getRawParameterValue ("inputChannelsSetting"); enableGains = parameters.getRawParameterValue ("enableGains"); enableDelays = parameters.getRawParameterValue ("enableDelays"); speedOfSound = parameters.getRawParameterValue ("speedOfSound"); distanceExponent = parameters.getRawParameterValue ("distanceExponent"); gainNormalization = parameters.getRawParameterValue ("gainNormalization"); referenceX = parameters.getRawParameterValue ("referenceX"); referenceY = parameters.getRawParameterValue ("referenceY"); referenceZ = parameters.getRawParameterValue ("referenceZ"); // add listeners to parameter changes parameters.addParameterListener ("inputChannelsSetting", this); parameters.addParameterListener ("speedOfSound", this); parameters.addParameterListener ("distanceExponent", this); parameters.addParameterListener ("gainNormalization", this); for (int i = 0; i < 64; ++i) { enableCompensation[i] = parameters.getRawParameterValue ("enableCompensation" + juce::String (i)); parameters.addParameterListener ("enableCompensation" + juce::String (i), this); distance[i] = parameters.getRawParameterValue ("distance" + juce::String (i)); parameters.addParameterListener ("distance" + juce::String (i), this); } // global properties juce::PropertiesFile::Options options; options.applicationName = "DistanceCompensator"; options.filenameSuffix = "settings"; options.folderName = "IEM"; options.osxLibrarySubFolder = "Preferences"; properties.reset (new juce::PropertiesFile (options)); lastDir = juce::File (properties->getValue ("presetFolder")); tempValues.resize (64); } DistanceCompensatorAudioProcessor::~DistanceCompensatorAudioProcessor() { } float DistanceCompensatorAudioProcessor::distanceToGainInDecibels (const float distance) { jassert (distance >= 1.0f); const float gainInDecibels = juce::Decibels::gainToDecibels (1.0f / pow (distance, *distanceExponent)); return gainInDecibels; } float DistanceCompensatorAudioProcessor::distanceToDelayInSeconds (const float distance) { jassert (distance >= 1.0f); const float delayInSeconds = distance / *speedOfSound; return delayInSeconds; } void DistanceCompensatorAudioProcessor::setLastDir (juce::File newLastDir) { lastDir = newLastDir; const juce::var v (lastDir.getFullPathName()); properties->setValue ("presetFolder", v); } void DistanceCompensatorAudioProcessor::loadConfiguration (const juce::File& configFile) { juce::ValueTree loudspeakers { "Loudspeakers" }; juce::Result result = ConfigurationHelper::parseFileForLoudspeakerLayout (configFile, loudspeakers, nullptr); if (! result.wasOk()) { DBG ("Configuration could not be loaded."); MailBox::Message newMessage; newMessage.messageColour = juce::Colours::red; newMessage.headline = "Error loading configuration"; newMessage.text = result.getErrorMessage(); messageToEditor = newMessage; updateMessage = true; DBG (result.getErrorMessage()); } else { const int nLsp = loudspeakers.getNumChildren(); loadedLoudspeakerPositions.clear(); int maxChannel = 0; for (int i = 0; i < nLsp; ++i) { auto lsp = loudspeakers.getChild (i); const bool isImaginary = lsp.getProperty ("Imaginary"); if (isImaginary) continue; const float radius = lsp.getProperty ("Radius"); const float azimuth = lsp.getProperty ("Azimuth"); const float elevation = lsp.getProperty ("Elevation"); const int channel = lsp.getProperty ("Channel"); const juce::Vector3D cart = Conversions::sphericalToCartesian (juce::degreesToRadians (azimuth), juce::degreesToRadians (elevation), radius); loadedLoudspeakerPositions.add ({ cart, channel }); if (channel > maxChannel) maxChannel = channel; } DBG ("num lsps: " << loadedLoudspeakerPositions.size()); if (maxChannel > 0) parameters.getParameter ("inputChannelsSetting") ->setValueNotifyingHost (parameters.getParameterRange ("inputChannelsSetting") .convertTo0to1 (maxChannel)); updateParameters(); } } //============================================================================== int DistanceCompensatorAudioProcessor::getNumPrograms() { return 1; // NB: some hosts don't cope very well if you tell them there are 0 programs, // so this should be at least 1, even if you're not really implementing programs. } int DistanceCompensatorAudioProcessor::getCurrentProgram() { return 0; } void DistanceCompensatorAudioProcessor::setCurrentProgram (int index) { } const juce::String DistanceCompensatorAudioProcessor::getProgramName (int index) { return {}; } void DistanceCompensatorAudioProcessor::changeProgramName (int index, const juce::String& newName) { } //============================================================================== void DistanceCompensatorAudioProcessor::prepareToPlay (double sampleRate, int samplesPerBlock) { checkInputAndOutput (this, *inputChannelsSetting, 0, true); juce::dsp::ProcessSpec specs; specs.sampleRate = sampleRate; specs.maximumBlockSize = samplesPerBlock; specs.numChannels = 64; gain.prepare (specs); delay.prepare (specs); updateDelays(); updateGains(); } void DistanceCompensatorAudioProcessor::releaseResources() { // When playback stops, you can use this as an opportunity to free up any // spare memory, etc. } void DistanceCompensatorAudioProcessor::processBlock (juce::AudioSampleBuffer& buffer, juce::MidiBuffer& midiMessages) { checkInputAndOutput (this, *inputChannelsSetting, 0, false); juce::ScopedNoDenormals noDenormals; const int totalNumInputChannels = getTotalNumInputChannels(); const int totalNumOutputChannels = getTotalNumOutputChannels(); for (int i = totalNumInputChannels; i < totalNumOutputChannels; ++i) buffer.clear (i, 0, buffer.getNumSamples()); juce::dsp::AudioBlock ab (buffer); juce::dsp::ProcessContextReplacing context (ab); if (*enableGains > 0.5f) gain.process (context); if (*enableDelays > 0.5f) delay.process (context); } //============================================================================== bool DistanceCompensatorAudioProcessor::hasEditor() const { return true; // (change this to false if you choose to not supply an editor) } juce::AudioProcessorEditor* DistanceCompensatorAudioProcessor::createEditor() { return new DistanceCompensatorAudioProcessorEditor (*this, parameters); } //============================================================================== void DistanceCompensatorAudioProcessor::getStateInformation (juce::MemoryBlock& destData) { auto state = parameters.copyState(); auto oscConfig = state.getOrCreateChildWithName ("OSCConfig", nullptr); oscConfig.copyPropertiesFrom (oscParameterInterface.getConfig(), nullptr); std::unique_ptr xml (state.createXml()); copyXmlToBinary (*xml, destData); } void DistanceCompensatorAudioProcessor::setStateInformation (const void* data, int sizeInBytes) { // You should use this method to restore your parameters from this memory block, // whose contents will have been created by the getStateInformation() call. std::unique_ptr xmlState (getXmlFromBinary (data, sizeInBytes)); if (xmlState != nullptr) if (xmlState->hasTagName (parameters.state.getType())) { parameters.state = juce::ValueTree::fromXml (*xmlState); loadedLoudspeakerPositions.clear(); if (parameters.state.hasProperty ("OSCPort")) // legacy { oscParameterInterface.getOSCReceiver().connect ( parameters.state.getProperty ("OSCPort", juce::var (-1))); parameters.state.removeProperty ("OSCPort", nullptr); } auto oscConfig = parameters.state.getChildWithName ("OSCConfig"); if (oscConfig.isValid()) oscParameterInterface.setConfig (oscConfig); } } //============================================================================== void DistanceCompensatorAudioProcessor::parameterChanged (const juce::String& parameterID, float newValue) { DBG ("Parameter with ID " << parameterID << " has changed. New value: " << newValue); if (parameterID == "inputChannelsSetting") { userChangedIOSettings = true; } else if (parameterID == "speedOfSound") { updateDelays(); } else if (parameterID == "distanceExponent") { updateGains(); } else if (parameterID == "gainNormalization") { updateGains(); } else if (parameterID.startsWith ("distance")) { updateDelays(); updateGains(); } else if (parameterID.startsWith ("enableCompensation")) { updateDelays(); updateGains(); } } void DistanceCompensatorAudioProcessor::updateDelays() { if (updatingParameters.get()) return; tempValues.clearQuick(); const int selected = juce::roundToInt (inputChannelsSetting->load()); int nCh; if (selected > 0) nCh = selected; else nCh = input.getSize(); for (int i = 0; i < nCh; ++i) { if (*enableCompensation[i] >= 0.5f) tempValues.add (distanceToDelayInSeconds (*distance[i])); } const int nActive = tempValues.size(); const float maxDelay = juce::FloatVectorOperations::findMaximum (tempValues.getRawDataPointer(), nActive); for (int i = 0; i < nCh; ++i) { if (*enableCompensation[i] >= 0.5f) delay.setDelayTime (i, maxDelay - distanceToDelayInSeconds (*distance[i])); else delay.setDelayTime (i, 0.0f); } } void DistanceCompensatorAudioProcessor::updateGains() { if (updatingParameters.get()) return; tempValues.clearQuick(); const int selected = juce::roundToInt (inputChannelsSetting->load()); int nCh; if (selected > 0) nCh = selected; else nCh = input.getSize(); for (int i = 0; i < nCh; ++i) { if (*enableCompensation[i] >= 0.5f) tempValues.add (distanceToGainInDecibels (*distance[i])); } const int nActive = tempValues.size(); const float minGain = juce::FloatVectorOperations::findMinimum (tempValues.getRawDataPointer(), nActive); float ref = 0.0f; if (*gainNormalization >= 0.5f) // zero mean { for (int i = 0; i < nActive; ++i) ref += tempValues.getUnchecked (i); ref /= nActive; } else { ref = minGain; } DBG ("Gain ref: " << ref); for (int i = 0; i < nCh; ++i) { if (*enableCompensation[i] >= 0.5f) { gain.setGainDecibels (i, ref - distanceToGainInDecibels (*distance[i])); DBG (i << ": " << ref - distanceToGainInDecibels (*distance[i])); } else gain.setGainDecibels (i, 0.0f); } } void DistanceCompensatorAudioProcessor::updateParameters() { const int nLsp = loadedLoudspeakerPositions.size(); if (nLsp == 0) { DBG ("No loudspeakers loaded."); MailBox::Message newMessage; newMessage.messageColour = juce::Colours::red; newMessage.headline = "Can't update reference position."; newMessage.text = "The reference position can only be updated, if a loudspeaker layout has been loaded. An already loaded layout will vanish every time the session is reloaded."; messageToEditor = newMessage; updateMessage = true; return; } updatingParameters = true; for (int i = 0; i < 64; ++i) { parameters.getParameter ("enableCompensation" + juce::String (i)) ->setValueNotifyingHost (0.0f); parameters.getParameter ("distance" + juce::String (i))->setValueNotifyingHost (0.0f); } const juce::Vector3D reference { *referenceX, *referenceY, *referenceZ }; for (int i = 0; i < nLsp; ++i) { auto lsp = loadedLoudspeakerPositions.getReference (i); const float radius = juce::jmax (1.0f, (lsp.position - reference).length()); parameters.getParameter ("enableCompensation" + juce::String (lsp.channel - 1)) ->setValueNotifyingHost (1.0f); parameters.getParameter ("distance" + juce::String (lsp.channel - 1)) ->setValueNotifyingHost ( parameters.getParameterRange ("distance" + juce::String (lsp.channel - 1)) .convertTo0to1 (radius)); } updatingParameters = false; updateDelays(); updateGains(); } void DistanceCompensatorAudioProcessor::updateBuffers() { DBG ("IOHelper: input size: " << input.getSize()); DBG ("IOHelper: output size: " << output.getSize()); updateDelays(); updateGains(); } //============================================================================== const bool DistanceCompensatorAudioProcessor::processNotYetConsumedOSCMessage ( const juce::OSCMessage& message) { juce::String prefix ("/" + juce::String (JucePlugin_Name)); if (! message.getAddressPattern().toString().startsWith (prefix)) return false; juce::OSCMessage msg (message); msg.setAddressPattern (message.getAddressPattern().toString().substring ( juce::String (JucePlugin_Name).length() + 1)); if (msg.getAddressPattern().toString().equalsIgnoreCase ("/loadFile") && msg.size() >= 1) { if (msg[0].isString()) { juce::File fileToLoad (msg[0].getString()); loadConfiguration (fileToLoad); } return true; } else if (msg.getAddressPattern().toString().equalsIgnoreCase ("/updateReference")) { updateParameters(); return true; } return false; } //============================================================================== std::vector> DistanceCompensatorAudioProcessor::createParameterLayout() { // add your audio parameters here std::vector> params; params.push_back (OSCParameterInterface::createParameterTheOldWay ( "inputChannelsSetting", "Number of input channels ", "", juce::NormalisableRange (0.0f, 64.0f, 1.0f), 0.0f, [] (float value) { return value < 0.5f ? "Auto" : juce::String (value); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "enableGains", "Enable Gain Compensation", "", juce::NormalisableRange (0.0f, 1.0f, 1.0f), 1.0f, [] (float value) { if (value >= 0.5f) return "Yes"; else return "No"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "enableDelays", "Enable Delay Compensation", "", juce::NormalisableRange (0.0f, 1.0f, 1.0f), 1.0f, [] (float value) { if (value >= 0.5f) return "Yes"; else return "No"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "speedOfSound", "Speed of Sound", "m/s", juce::NormalisableRange (330.0, 350.0, 0.1f), 343.2f, [] (float value) { return juce::String (value, 1); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "distanceExponent", "Distance-Gain Exponent", "", juce::NormalisableRange (0.5f, 1.5f, 0.1f), 1.0f, [] (float value) { return juce::String (value, 1); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "gainNormalization", "Gain Normalization", "", juce::NormalisableRange (0.0f, 1.0f, 1.0f), 0.0f, [] (float value) { if (value >= 0.5f) return "Zero-mean"; else return "Attenuation only"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "referenceX", "Reference position x", "m", juce::NormalisableRange (-20.0f, 20.0f, 0.01f), 0.0f, [] (float value) { return juce::String (value, 2); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "referenceY", "Reference position x", "m", juce::NormalisableRange (-20.0f, 20.0f, 0.01f), 0.0f, [] (float value) { return juce::String (value, 2); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "referenceZ", "Reference position x", "m", juce::NormalisableRange (-20.0f, 20.0f, 0.01f), 0.0f, [] (float value) { return juce::String (value, 2); }, nullptr)); for (int i = 0; i < 64; ++i) { params.push_back (OSCParameterInterface::createParameterTheOldWay ( "enableCompensation" + juce::String (i), "Enable Compensation of loudspeaker " + juce::String (i + 1), "", juce::NormalisableRange (0.0f, 1.0f, 1.0f), 1.0f, [] (float value) { if (value >= 0.5f) return "ON"; else return "OFF"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "distance" + juce::String (i), "Distance of loudspeaker " + juce::String (i + 1), "m", juce::NormalisableRange (1.0f, 50.0f, 0.01f), 5.0f, [] (float value) { return juce::String (value, 2); }, nullptr)); } return params; } //============================================================================== // This creates new instances of the plugin.. juce::AudioProcessor* JUCE_CALLTYPE createPluginFilter() { return new DistanceCompensatorAudioProcessor(); } ././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/DistanceCompensator/Source/PluginEditor.cppIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/DistanceCompensator/Source/PluginEdi0000664002537200253720000003444015257173642031644 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2018 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #include "PluginEditor.h" #include "PluginProcessor.h" //============================================================================== DistanceCompensatorAudioProcessorEditor::DistanceCompensatorAudioProcessorEditor ( DistanceCompensatorAudioProcessor& p, juce::AudioProcessorValueTreeState& vts) : juce::AudioProcessorEditor (&p), processor (p), valueTreeState (vts), footer (p.getOSCParameterInterface()) { setLookAndFeel (&globalLaF); // make title and footer visible, and set the PluginName addAndMakeVisible (&title); title.setTitle (juce::String ("Distance"), juce::String ("Compensator")); title.setFont (globalLaF.robotoBold, globalLaF.robotoLight); addAndMakeVisible (&footer); // ============= END: essentials ======================== // create the connection between title component's comboBoxes and parameters cbInputChannelsSettingAttachment.reset ( new ComboBoxAttachment (valueTreeState, "inputChannelsSetting", *title.getInputWidgetPtr()->getChannelsCbPointer())); addAndMakeVisible (lbSpeedOfSound); lbSpeedOfSound.setEditable (true); lbSpeedOfSound.setJustificationType (juce::Justification::centred); lbSpeedOfSoundAttachment.reset ( new LabelAttachment (valueTreeState, "speedOfSound", lbSpeedOfSound)); addAndMakeVisible (slbSpeedOfSound); slbSpeedOfSound.setText ("Speed of sound"); slbSpeedOfSound.setJustification (juce::Justification::left); addAndMakeVisible (lbDistanceExponent); lbDistanceExponent.setEditable (true); lbDistanceExponent.setJustificationType (juce::Justification::centred); lbDistanceExponentAttachment.reset ( new LabelAttachment (valueTreeState, "distanceExponent", lbDistanceExponent)); addAndMakeVisible (slbDistanceExponent); slbDistanceExponent.setText ("Distance-Gain exponent"); slbDistanceExponent.setJustification (juce::Justification::left); addAndMakeVisible (cbGainNormalization); cbGainNormalization.addSectionHeading ("Gain normalization"); cbGainNormalization.addItem ("Attenuation only", 1); cbGainNormalization.addItem ("Zero-mean", 2); cbGainNormalization.setJustificationType (juce::Justification::centred); cbGainNormalizationAttachment.reset ( new ComboBoxAttachment (valueTreeState, "gainNormalization", cbGainNormalization)); addAndMakeVisible (slbGainNormalization); slbGainNormalization.setText ("Normalization"); slbGainNormalization.setJustification (juce::Justification::left); addAndMakeVisible (lbReferenceX); lbReferenceX.setEditable (true); lbReferenceX.setJustificationType (juce::Justification::centred); lbReferenceXAttachment.reset (new LabelAttachment (valueTreeState, "referenceX", lbReferenceX)); addAndMakeVisible (lbReferenceY); lbReferenceY.setEditable (true); lbReferenceY.setJustificationType (juce::Justification::centred); lbReferenceYAttachment.reset (new LabelAttachment (valueTreeState, "referenceY", lbReferenceY)); addAndMakeVisible (lbReferenceZ); lbReferenceZ.setEditable (true); lbReferenceZ.setJustificationType (juce::Justification::centred); lbReferenceZAttachment.reset (new LabelAttachment (valueTreeState, "referenceZ", lbReferenceZ)); addAndMakeVisible (slbReference); slbReference.setText ("Reference position", true); slbReference.setJustification (juce::Justification::left); addAndMakeVisible (slbReferenceX); slbReferenceX.setText ("x"); slbReferenceX.setJustification (juce::Justification::centred); addAndMakeVisible (slbReferenceY); slbReferenceY.setText ("y"); slbReferenceY.setJustification (juce::Justification::centred); addAndMakeVisible (slbReferenceZ); slbReferenceZ.setText ("z"); slbReferenceZ.setJustification (juce::Justification::centred); addAndMakeVisible (gcLayout); gcLayout.setText ("From loudspeaker layout"); addAndMakeVisible (btLoadFile); btLoadFile.setButtonText ("LOAD LAYOUT"); btLoadFile.addListener (this); btLoadFile.setColour (juce::TextButton::buttonColourId, juce::Colours::orange); addAndMakeVisible (btReference); btReference.setButtonText ("UPDATE REFERENCE"); btReference.addListener (this); btReference.setColour (juce::TextButton::buttonColourId, juce::Colours::cornflowerblue); addAndMakeVisible (gcCompensation); gcCompensation.setText ("Settings"); addAndMakeVisible (tbEnableGains); tbEnableGainsAttachment.reset ( new ButtonAttachment (valueTreeState, "enableGains", tbEnableGains)); tbEnableGains.setButtonText ("Gain compensation"); tbEnableGains.setColour (juce::ToggleButton::tickColourId, juce::Colours::limegreen); addAndMakeVisible (tbEnableDelays); tbEnableDelaysAttachment.reset ( new ButtonAttachment (valueTreeState, "enableDelays", tbEnableDelays)); tbEnableDelays.setButtonText ("Delay compensation"); tbEnableDelays.setColour (juce::ToggleButton::tickColourId, juce::Colours::orange); addAndMakeVisible (gcDistances); gcDistances.setText ("Loudspeaker Distances"); for (int i = 0; i < 64; ++i) { auto enHandle = tbEnableCompensation.add (new RoundButton()); addAndMakeVisible (enHandle); enHandle->setColour (juce::ToggleButton::tickColourId, juce::Colours::cornflowerblue); enHandle->setButtonText ("C"); enHandle->setTooltip ( "Enable compensation and \n factoring in the distance in gain/delay-calculation."); tbEnableCompensationAttachment.add ( new ButtonAttachment (valueTreeState, "enableCompensation" + juce::String (i), *enHandle)); enHandle->onStateChange = [this, i]() { updateEnableSetting (i); }; bool isOn = enHandle->getToggleState(); auto handle = slDistance.add (new juce::Label()); addAndMakeVisible (handle); handle->setJustificationType (juce::Justification::centred); handle->setEditable (true); handle->setEnabled (isOn); handle->setExplicitFocusOrder (i + 1); slDistanceAttachment.add ( new LabelAttachment (valueTreeState, "distance" + juce::String (i), *handle)); auto lbHandle = lbDistance.add (new SimpleLabel()); addAndMakeVisible (lbHandle); lbHandle->setEnabled (isOn); lbHandle->setText (juce::String (i + 1), true, juce::Justification::right); } toolTipWin.setLookAndFeel (&globalLaF); toolTipWin.setMillisecondsBeforeTipAppears (500); toolTipWin.setOpaque (false); setResizeLimits (500, 650, 500, 650); // use this to create a resizable GUI setResizable (true, true); // start timer after everything is set up properly startTimer (20); } DistanceCompensatorAudioProcessorEditor::~DistanceCompensatorAudioProcessorEditor() { setLookAndFeel (nullptr); } void DistanceCompensatorAudioProcessorEditor::updateEnableSetting (const int ch) { bool shouldBeEnabled = tbEnableCompensation.getUnchecked (ch)->getToggleState(); slDistance.getUnchecked (ch)->setEnabled (shouldBeEnabled); lbDistance.getUnchecked (ch)->setEnabled (shouldBeEnabled); } void DistanceCompensatorAudioProcessorEditor::showControls (const int nCh) { for (int i = 0; i < nCh; ++i) { lbDistance.getUnchecked (i)->setVisible (true); tbEnableCompensation.getUnchecked (i)->setVisible (true); slDistance.getUnchecked (i)->setVisible (true); } for (int i = nCh; i < 64; ++i) { lbDistance.getUnchecked (i)->setVisible (false); tbEnableCompensation.getUnchecked (i)->setVisible (false); slDistance.getUnchecked (i)->setVisible (false); } } //============================================================================== void DistanceCompensatorAudioProcessorEditor::paint (juce::Graphics& g) { g.fillAll (globalLaF.ClBackground); } void DistanceCompensatorAudioProcessorEditor::resized() { // ============ BEGIN: header and footer ============ const int leftRightMargin = 30; const int headerHeight = 60; const int footerHeight = 25; juce::Rectangle area (getLocalBounds()); juce::Rectangle footerArea (area.removeFromBottom (footerHeight)); footer.setBounds (footerArea); area.removeFromLeft (leftRightMargin); area.removeFromRight (leftRightMargin); juce::Rectangle headerArea = area.removeFromTop (headerHeight); title.setBounds (headerArea); area.removeFromTop (10); area.removeFromBottom (5); // =========== END: header and footer ================= juce::Rectangle controls = area.removeFromTop (150); auto settingsArea = controls.removeFromLeft (200); gcCompensation.setBounds (settingsArea); settingsArea.removeFromTop (25); tbEnableGains.setBounds (settingsArea.removeFromTop (20)); settingsArea.removeFromTop (3); auto rowDistanceGain (settingsArea.removeFromTop (18)); rowDistanceGain.removeFromLeft (26); slbDistanceExponent.setBounds (rowDistanceGain.removeFromLeft (120)); rowDistanceGain.removeFromLeft (5); lbDistanceExponent.setBounds (rowDistanceGain); settingsArea.removeFromTop (5); auto rowNormalization (settingsArea.removeFromTop (18)); rowNormalization.removeFromLeft (26); slbGainNormalization.setBounds (rowNormalization.removeFromLeft (70)); rowNormalization.removeFromLeft (5); cbGainNormalization.setBounds (rowNormalization); settingsArea.removeFromTop (8); tbEnableDelays.setBounds (settingsArea.removeFromTop (20)); settingsArea.removeFromTop (5); auto rowSpeed (settingsArea.removeFromTop (18)); rowSpeed.removeFromLeft (26); slbSpeedOfSound.setBounds (rowSpeed.removeFromLeft (80)); rowSpeed.removeFromLeft (5); lbSpeedOfSound.setBounds (rowSpeed.removeFromLeft (60)); controls.removeFromLeft (50); gcLayout.setBounds (controls); controls.removeFromTop (25); auto col = controls.removeFromLeft (130); btLoadFile.setBounds (col.removeFromTop (21)); col.removeFromTop (20); slbReference.setBounds (col.removeFromTop (18)); auto labelArea (col.removeFromTop (18)); lbReferenceX.setBounds (labelArea.removeFromLeft (40)); labelArea.removeFromLeft (5); lbReferenceY.setBounds (labelArea.removeFromLeft (40)); labelArea.removeFromLeft (5); lbReferenceZ.setBounds (labelArea.removeFromLeft (40)); labelArea = col.removeFromTop (12); slbReferenceX.setBounds (labelArea.removeFromLeft (40)); labelArea.removeFromLeft (5); slbReferenceY.setBounds (labelArea.removeFromLeft (40)); labelArea.removeFromLeft (5); slbReferenceZ.setBounds (labelArea.removeFromLeft (40)); col.removeFromTop (5); btReference.setBounds (col.removeFromTop (21)); area.removeFromTop (10); gcDistances.setBounds (area.removeFromTop (25)); juce::Rectangle sliderCol; for (int i = 0; i < 64; ++i) { if (i % 16 == 0) sliderCol = area.removeFromLeft (100); else if (i % 8 == 0) sliderCol.removeFromTop (15); auto sliderRow = sliderCol.removeFromTop (18); lbDistance.getUnchecked (i)->setBounds (sliderRow.removeFromLeft (20)); sliderRow.removeFromLeft (8); tbEnableCompensation.getUnchecked (i)->setBounds (sliderRow.removeFromLeft (18)); sliderRow.removeFromLeft (2); slDistance.getUnchecked (i)->setBounds (sliderRow); sliderCol.removeFromTop (2); if ((i - 1) % 16 == 0) area.removeFromLeft (10); } } void DistanceCompensatorAudioProcessorEditor::timerCallback() { // === update titleBar widgets according to available input/output channel counts title.setMaxSize (processor.getMaxSize()); // ========================================== // insert stuff you want to do be done at every timer callback const int selected = title.getInputWidgetPtr()->getChannelsCbPointer()->getSelectedId(); int nChIn; if (selected > 1) nChIn = selected - 1; else nChIn = processor.input.getSize(); if (nChIn != lastSetNumChIn) { showControls (nChIn); lastSetNumChIn = nChIn; } if (processor.updateMessage) { processor.updateMessage = false; juce::AlertWindow alert (processor.messageToEditor.headline, processor.messageToEditor.text, juce::AlertWindow::NoIcon); alert.setLookAndFeel (&globalLaF); alert.addButton ("OK", 1, juce::KeyPress (juce::KeyPress::returnKey, 0, 0)); alert.runModalLoop(); } } void DistanceCompensatorAudioProcessorEditor::buttonClicked (juce::Button* button) { if (button == &btLoadFile) { juce::FileChooser myChooser ( "Load loudspeaker layout...", processor.getLastDir().exists() ? processor.getLastDir() : juce::File::getSpecialLocation (juce::File::userHomeDirectory), "*.json"); if (myChooser.browseForFileToOpen()) { juce::File configFile (myChooser.getResult()); processor.setLastDir (configFile.getParentDirectory()); processor.loadConfiguration (configFile); } } else if (button == &btReference) { processor.updateParameters(); } } void DistanceCompensatorAudioProcessorEditor::buttonStateChanged (juce::Button* button) { } ././@LongLink0000644000000000000000000000015500000000000011604 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/DistanceCompensator/Source/PluginProcessor.hIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/DistanceCompensator/Source/PluginPro0000664002537200253720000001231015257173642031673 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2018 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once #include "../JuceLibraryCode/JuceHeader.h" using namespace juce::dsp; #include "../../resources/AudioProcessorBase.h" #include "../../resources/customComponents/MailBox.h" #define CONFIGURATIONHELPER_ENABLE_LOUDSPEAKERLAYOUT_METHODS 1 #include "../../resources/ConfigurationHelper.h" #include "../../resources/Conversions.h" #include "../../resources/MultiChannelDelay.h" #include "../../resources/MultiChannelGain.h" #define ProcessorClass DistanceCompensatorAudioProcessor //============================================================================== class DistanceCompensatorAudioProcessor : public AudioProcessorBase, IOTypes::AudioChannels<64>> { struct PositionAndChannel { juce::Vector3D position; int channel; }; public: constexpr static int numberOfInputChannels = 64; constexpr static int numberOfOutputChannels = 64; //============================================================================== DistanceCompensatorAudioProcessor(); ~DistanceCompensatorAudioProcessor(); //============================================================================== void prepareToPlay (double sampleRate, int samplesPerBlock) override; void releaseResources() override; void processBlock (juce::AudioSampleBuffer&, juce::MidiBuffer&) override; //============================================================================== juce::AudioProcessorEditor* createEditor() override; bool hasEditor() const override; //============================================================================== int getNumPrograms() override; int getCurrentProgram() override; void setCurrentProgram (int index) override; const juce::String getProgramName (int index) override; void changeProgramName (int index, const juce::String& newName) override; //============================================================================== void getStateInformation (juce::MemoryBlock& destData) override; void setStateInformation (const void* data, int sizeInBytes) override; //============================================================================== void parameterChanged (const juce::String& parameterID, float newValue) override; void updateBuffers() override; // use this to implement a buffer update method //======= Parameters =========================================================== std::vector> createParameterLayout(); //============================================================================== inline const bool processNotYetConsumedOSCMessage (const juce::OSCMessage& message) override; //============================================================================== void setLastDir (juce::File newLastDir); juce::File getLastDir() { return lastDir; }; void loadConfiguration (const juce::File& presetFile); float distanceToGainInDecibels (const float distance); float distanceToDelayInSeconds (const float distance); void updateDelays(); void updateGains(); void updateParameters(); bool updateMessage = false; MailBox::Message messageToEditor; private: //============================================================================== juce::Atomic updatingParameters = false; // list of used audio parameters std::atomic* inputChannelsSetting; std::atomic* speedOfSound; std::atomic* distanceExponent; std::atomic* gainNormalization; std::atomic* referenceX; std::atomic* referenceY; std::atomic* referenceZ; std::atomic* enableGains; std::atomic* enableDelays; std::atomic* enableCompensation[64]; std::atomic* distance[64]; // ===== last directory loaded from juce::File lastDir; std::unique_ptr properties; juce::Array tempValues; juce::Array loadedLoudspeakerPositions; // processors MultiChannelGain gain; MultiChannelDelay delay; //============================================================================== JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DistanceCompensatorAudioProcessor) }; ././@LongLink0000644000000000000000000000015200000000000011601 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/DistanceCompensator/Source/PluginEditor.hIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/DistanceCompensator/Source/PluginEdi0000664002537200253720000001127715257173642031647 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2018 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once #include "../JuceLibraryCode/JuceHeader.h" #include "PluginProcessor.h" //Plugin Design Essentials #include "../../resources/customComponents/TitleBar.h" #include "../../resources/lookAndFeel/IEM_LaF.h" //Custom juce::Components #include "../../resources/LabelAttachment.h" #include "../../resources/customComponents/MailBox.h" #include "../../resources/customComponents/ReverseSlider.h" #include "../../resources/customComponents/RoundButton.h" #include "../../resources/customComponents/SimpleLabel.h" typedef ReverseSlider::SliderAttachment SliderAttachment; // all ReverseSliders will make use of the parameters' valueToText() function typedef juce::AudioProcessorValueTreeState::ComboBoxAttachment ComboBoxAttachment; typedef juce::AudioProcessorValueTreeState::ButtonAttachment ButtonAttachment; //============================================================================== /** */ class DistanceCompensatorAudioProcessorEditor : public juce::AudioProcessorEditor, private juce::Timer, private juce::Button::Listener { public: DistanceCompensatorAudioProcessorEditor (DistanceCompensatorAudioProcessor&, juce::AudioProcessorValueTreeState&); ~DistanceCompensatorAudioProcessorEditor(); //============================================================================== void paint (juce::Graphics&) override; void resized() override; void timerCallback() override; void buttonClicked (juce::Button* button) override; void buttonStateChanged (juce::Button* button) override; private: // ====================== begin essentials ================== LaF globalLaF; DistanceCompensatorAudioProcessor& processor; juce::AudioProcessorValueTreeState& valueTreeState; TitleBar, NoIOWidget> title; OSCFooter footer; // ====================== end essentials ==================== void updateEnableSetting (const int ch); void showControls (const int nCh); std::unique_ptr cbInputChannelsSettingAttachment; juce::Label lbSpeedOfSound; std::unique_ptr lbSpeedOfSoundAttachment; SimpleLabel slbSpeedOfSound; juce::Label lbDistanceExponent; std::unique_ptr lbDistanceExponentAttachment; SimpleLabel slbDistanceExponent; juce::ComboBox cbGainNormalization; SimpleLabel slbGainNormalization; std::unique_ptr cbGainNormalizationAttachment; juce::Label lbReferenceX, lbReferenceY, lbReferenceZ; std::unique_ptr lbReferenceXAttachment, lbReferenceYAttachment, lbReferenceZAttachment; SimpleLabel slbReference, slbReferenceX, slbReferenceY, slbReferenceZ; juce::TooltipWindow toolTipWin; // load juce::GroupComponent gcLayout; juce::TextButton btLoadFile; juce::TextButton btReference; // buttons juce::GroupComponent gcCompensation; juce::ToggleButton tbEnableGains; juce::ToggleButton tbEnableDelays; std::unique_ptr tbEnableGainsAttachment; std::unique_ptr tbEnableDelaysAttachment; std::unique_ptr tbEnableFiltersAttachment; int maxNumInputs = -1; int lastSetNumChIn = -1; // distances juce::GroupComponent gcDistances; juce::OwnedArray tbEnableCompensation; juce::OwnedArray tbEnableCompensationAttachment; juce::OwnedArray slDistance; juce::OwnedArray slDistanceAttachment; juce::OwnedArray lbDistance; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DistanceCompensatorAudioProcessorEditor) }; IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/DistanceCompensator/CMakeLists.txt0000664002537200253720000000372415257173642031342 0ustar zmoelnigzmoelnig set (PLUGIN_TARGET "") if (IEM_FORMATS) juce_add_plugin (DistanceCompensator PLUGIN_MANUFACTURER_CODE IEMA PLUGIN_CODE DisC ICON_BIG "../resources/Standalone/IEMPluginSuiteSmall.png" ICON_SMALL "../resources/Standalone/IEMPluginSuiteSmall.png" COMPANY_NAME "IEM" PRODUCT_NAME "DistanceCompensator" FORMATS ${IEM_FORMATS} VERSION ${DistanceCompensator_VERSION} LV2URI "http://plugins.iem.at/DistanceCompensator" VST2_CATEGORY kPlugSurroundFx kPlugCategSpacializer VST3_CATEGORIES Spatial Surround Delay Tools AAX_CATEGORY SoundField) list (APPEND PLUGIN_TARGET DistanceCompensator) endif() foreach (TARGET IN LISTS PLUGIN_TARGET) juce_generate_juce_header (${TARGET}) target_sources (${TARGET} PRIVATE Source/PluginEditor.cpp Source/PluginEditor.h Source/PluginProcessor.cpp Source/PluginProcessor.h ../resources/OSC/OSCInputStream.h ../resources/OSC/OSCParameterInterface.cpp ../resources/OSC/OSCParameterInterface.h ../resources/OSC/OSCStatus.cpp ../resources/OSC/OSCStatus.h ../resources/OSC/OSCUtilities.h ../resources/efficientSHvanilla.cpp ) target_compile_definitions (${TARGET} PRIVATE JUCE_USE_CURL=0 JUCE_WEB_BROWSER=0 JUCE_USE_CUSTOM_PLUGIN_STANDALONE_APP=1 JUCE_USE_FLAC=0 JUCE_USE_OGGVORBIS=0 JUCE_USE_MP3AUDIOFORMAT=0 JUCE_USE_LAME_AUDIO_FORMAT=0 JUCE_USE_WINDOWS_MEDIA_FORMAT=0 JUCE_VST3_CAN_REPLACE_VST2=0) target_include_directories (${TARGET} PRIVATE Source) target_link_libraries (${TARGET} PRIVATE LAF_fonts IEM_logo juce::juce_audio_utils juce::juce_audio_plugin_client juce::juce_osc juce::juce_dsp juce::juce_opengl juce::juce_recommended_config_flags juce::juce_recommended_lto_flags) endforeach() IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/ToolBox/0000775002537200253720000000000015257173642024215 5ustar zmoelnigzmoelnigIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/ToolBox/Source/0000775002537200253720000000000015257173642025455 5ustar zmoelnigzmoelnigIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/ToolBox/Source/PluginProcessor.cpp0000664002537200253720000003623715257173642031332 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #include "PluginProcessor.h" #include "PluginEditor.h" //============================================================================== ToolBoxAudioProcessor::ToolBoxAudioProcessor() : AudioProcessorBase ( #ifndef JucePlugin_PreferredChannelConfigurations BusesProperties() #if ! JucePlugin_IsMidiEffect #if ! JucePlugin_IsSynth .withInput ("Input", ((juce::PluginHostType::getPluginLoadedAs() == juce::AudioProcessor::wrapperType_VST3) ? juce::AudioChannelSet::ambisonic (1) : juce::AudioChannelSet::ambisonic (7)), true) #endif .withOutput ("Output", ((juce::PluginHostType::getPluginLoadedAs() == juce::AudioProcessor::wrapperType_VST3) ? juce::AudioChannelSet::ambisonic (1) : juce::AudioChannelSet::ambisonic (7)), true) #endif , #endif createParameterLayout()), flipXMask (juce::int64 (0)), flipYMask (juce::int64 (0)), flipZMask (juce::int64 (0)) { // get pointers to the parameters inputOrderSetting = parameters.getRawParameterValue ("inputOrderSetting"); outputOrderSetting = parameters.getRawParameterValue ("outputOrderSetting"); useSn3dInput = parameters.getRawParameterValue ("useSn3dInput"); useSn3dOutput = parameters.getRawParameterValue ("useSn3dOutput"); flipX = parameters.getRawParameterValue ("flipX"); flipY = parameters.getRawParameterValue ("flipY"); flipZ = parameters.getRawParameterValue ("flipZ"); loaWeights = parameters.getRawParameterValue ("loaWeights"); gain = parameters.getRawParameterValue ("gain"); // add listeners to parameter changes parameters.addParameterListener ("inputOrderSetting", this); parameters.addParameterListener ("outputOrderSetting", this); parameters.addParameterListener ("flipX", this); parameters.addParameterListener ("flipY", this); parameters.addParameterListener ("flipZ", this); // calculate flip masks for (int ch = 0; ch < 64; ++ch) { int l, m; ACNtoLM (ch, l, m); if (((m < 0) && (m % 2 == 0)) || ((m > 0) && (m % 2 == 1))) flipXMask.setBit (ch); if (m < 0) flipYMask.setBit (ch); if ((l + m) % 2) flipZMask.setBit (ch); } } ToolBoxAudioProcessor::~ToolBoxAudioProcessor() { } //============================================================================== int ToolBoxAudioProcessor::getNumPrograms() { return 1; // NB: some hosts don't cope very well if you tell them there are 0 programs, // so this should be at least 1, even if you're not really implementing programs. } int ToolBoxAudioProcessor::getCurrentProgram() { return 0; } void ToolBoxAudioProcessor::setCurrentProgram (int index) { } const juce::String ToolBoxAudioProcessor::getProgramName (int index) { return {}; } void ToolBoxAudioProcessor::changeProgramName (int index, const juce::String& newName) { } //============================================================================== void ToolBoxAudioProcessor::prepareToPlay (double sampleRate, int samplesPerBlock) { checkInputAndOutput (this, *inputOrderSetting, *outputOrderSetting, true); doFlipX = *flipX >= 0.5f; doFlipY = *flipY >= 0.5f; doFlipZ = *flipZ >= 0.5f; calculateWeights (previousWeights, input.getNumberOfChannels(), output.getNumberOfChannels()); } void ToolBoxAudioProcessor::releaseResources() { // When playback stops, you can use this as an opportunity to free up any // spare memory, etc. } void ToolBoxAudioProcessor::processBlock (juce::AudioSampleBuffer& buffer, juce::MidiBuffer& midiMessages) { checkInputAndOutput (this, *inputOrderSetting, *outputOrderSetting, false); juce::ScopedNoDenormals noDenormals; const int nChIn = juce::jmin (buffer.getNumChannels(), input.getNumberOfChannels()); const int nChOut = juce::jmin (buffer.getNumChannels(), output.getNumberOfChannels()); const int nCh = juce::jmin (nChIn, nChOut); const int L = buffer.getNumSamples(); float weights[64]; calculateWeights (weights, nChIn, nChOut); // apply weights; for (int ch = 0; ch < nCh; ++ch) { if (weights[ch] != previousWeights[ch]) { buffer.applyGainRamp (ch, 0, L, previousWeights[ch], weights[ch]); previousWeights[ch] = weights[ch]; } else if (weights[ch] != 1.0f) { juce::FloatVectorOperations::multiply (buffer.getWritePointer (ch), weights[ch], L); } } // clear not used channels for (int ch = nCh; ch < buffer.getNumChannels(); ++ch) { buffer.clear (ch, 0, L); previousWeights[ch] = 0.0f; } } void ToolBoxAudioProcessor::calculateWeights (float* weights, const int nChannelsIn, const int nChannelsOut) { const int nCh = juce::jmin (nChannelsIn, nChannelsOut); const int orderIn = input.getOrder(); const int orderOut = output.getOrder(); juce::FloatVectorOperations::fill (weights, juce::Decibels::decibelsToGain (gain->load()), nCh); // create mask for all flips if (doFlipX || doFlipY || doFlipZ) { juce::BigInteger mask (juce::int64 (0)); if (doFlipX) mask ^= flipXMask; if (doFlipY) mask ^= flipYMask; if (doFlipZ) mask ^= flipZMask; for (int ch = 0; ch < nCh; ++ch) if (mask[ch]) weights[ch] *= -1.0f; } // lower order ambisonics weighting if (orderIn < orderOut) { const int weightType = juce::roundToInt (loaWeights->load()); if (weightType == 1) // maxrE { juce::FloatVectorOperations::multiply (weights, getMaxRELUT (orderIn), nChannelsIn); const float* deWeights = getMaxRELUT (orderOut); for (int i = 0; i < nChannelsIn; ++i) weights[i] /= deWeights[i]; } else if (weightType == 2) // inPhase { juce::FloatVectorOperations::multiply (weights, getInPhaseLUT (orderIn), nChannelsIn); const float* deWeights = getInPhaseLUT (orderOut); for (int i = 0; i < nChannelsIn; ++i) weights[i] /= deWeights[i]; } } // normalization const bool inSN3D = *useSn3dInput >= 0.5f; const bool outSN3D = *useSn3dOutput >= 0.5f; if (inSN3D != outSN3D) { if (inSN3D) juce::FloatVectorOperations::multiply (weights, sn3d2n3d, nCh); else juce::FloatVectorOperations::multiply (weights, n3d2sn3d, nCh); } } //============================================================================== bool ToolBoxAudioProcessor::hasEditor() const { return true; // (change this to false if you choose to not supply an editor) } juce::AudioProcessorEditor* ToolBoxAudioProcessor::createEditor() { return new ToolBoxAudioProcessorEditor (*this, parameters); } //============================================================================== void ToolBoxAudioProcessor::getStateInformation (juce::MemoryBlock& destData) { auto state = parameters.copyState(); auto oscConfig = state.getOrCreateChildWithName ("OSCConfig", nullptr); oscConfig.copyPropertiesFrom (oscParameterInterface.getConfig(), nullptr); std::unique_ptr xml (state.createXml()); copyXmlToBinary (*xml, destData); } void ToolBoxAudioProcessor::setStateInformation (const void* data, int sizeInBytes) { std::unique_ptr xmlState (getXmlFromBinary (data, sizeInBytes)); if (xmlState.get() != nullptr) if (xmlState->hasTagName (parameters.state.getType())) { parameters.replaceState (juce::ValueTree::fromXml (*xmlState)); if (parameters.state.hasProperty ("OSCPort")) // legacy { oscParameterInterface.getOSCReceiver().connect ( parameters.state.getProperty ("OSCPort", juce::var (-1))); parameters.state.removeProperty ("OSCPort", nullptr); } auto oscConfig = parameters.state.getChildWithName ("OSCConfig"); if (oscConfig.isValid()) oscParameterInterface.setConfig (oscConfig); } } //============================================================================== void ToolBoxAudioProcessor::parameterChanged (const juce::String& parameterID, float newValue) { DBG ("Parameter with ID " << parameterID << " has changed. New value: " << newValue); if (parameterID == "inputOrderSetting" || parameterID == "outputOrderSetting") userChangedIOSettings = true; else if (parameterID == "flipX") doFlipX = newValue >= 0.5f; else if (parameterID == "flipY") doFlipY = newValue >= 0.5f; else if (parameterID == "flipZ") doFlipZ = newValue >= 0.5f; } void ToolBoxAudioProcessor::updateBuffers() { DBG ("IOHelper: input size: " << input.getSize()); DBG ("IOHelper: output size: " << output.getSize()); } //============================================================================== std::vector> ToolBoxAudioProcessor::createParameterLayout() { // add your audio parameters here std::vector> params; params.push_back (OSCParameterInterface::createParameterTheOldWay ( "inputOrderSetting", "Input Ambisonic Order", "", juce::NormalisableRange (0.0f, 8.0f, 1.0f), 0.0f, [] (float value) { if (value >= 0.5f && value < 1.5f) return "0th"; else if (value >= 1.5f && value < 2.5f) return "1st"; else if (value >= 2.5f && value < 3.5f) return "2nd"; else if (value >= 3.5f && value < 4.5f) return "3rd"; else if (value >= 4.5f && value < 5.5f) return "4th"; else if (value >= 5.5f && value < 6.5f) return "5th"; else if (value >= 6.5f && value < 7.5f) return "6th"; else if (value >= 7.5f) return "7th"; else return "Auto"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "useSn3dInput", "Input Normalization", "", juce::NormalisableRange (0.0f, 1.0f, 1.0f), 1.0f, [] (float value) { if (value >= 0.5f) return "SN3D"; else return "N3D"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "outputOrderSetting", "Output Ambisonic Order", "", juce::NormalisableRange (0.0f, 8.0f, 1.0f), 0.0f, [] (float value) { if (value >= 0.5f && value < 1.5f) return "0th"; else if (value >= 1.5f && value < 2.5f) return "1st"; else if (value >= 2.5f && value < 3.5f) return "2nd"; else if (value >= 3.5f && value < 4.5f) return "3rd"; else if (value >= 4.5f && value < 5.5f) return "4th"; else if (value >= 5.5f && value < 6.5f) return "5th"; else if (value >= 6.5f && value < 7.5f) return "6th"; else if (value >= 7.5f) return "7th"; else return "Auto"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "useSn3dOutput", "Output Normalization", "", juce::NormalisableRange (0.0f, 1.0f, 1.0f), 1.0f, [] (float value) { if (value >= 0.5f) return "SN3D"; else return "N3D"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "flipX", "Flip X axis", "", juce::NormalisableRange (0.0f, 1.0f, 1.0f), 0.0f, [] (float value) { if (value >= 0.5f) return "ON"; else return "OFF"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "flipY", "Flip Y axis", "", juce::NormalisableRange (0.0f, 1.0f, 1.0f), 0.0f, [] (float value) { if (value >= 0.5f) return "ON"; else return "OFF"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "flipZ", "Flip Z axis", "", juce::NormalisableRange (0.0f, 1.0f, 1.0f), 0.0f, [] (float value) { if (value >= 0.5f) return "ON"; else return "OFF"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "loaWeights", "Lower Order Ambisonic Weighting", "", juce::NormalisableRange (0.0f, 2.0f, 1.0f), 0.0f, [] (float value) { if (value >= 0.5f && value < 1.5f) return "maxrE"; else if (value >= 1.5f) return "inPhase"; else return "none"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "gain", "Gain", "dB", juce::NormalisableRange (-50.0f, 24.0f, 0.01f), 0.0f, [] (float value) { return juce::String (value, 2); }, nullptr)); return params; } //============================================================================== // This creates new instances of the plugin.. juce::AudioProcessor* JUCE_CALLTYPE createPluginFilter() { return new ToolBoxAudioProcessor(); } IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/ToolBox/Source/PluginEditor.cpp0000664002537200253720000001646515257173642030602 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #include "PluginEditor.h" #include "PluginProcessor.h" //============================================================================== ToolBoxAudioProcessorEditor::ToolBoxAudioProcessorEditor (ToolBoxAudioProcessor& p, juce::AudioProcessorValueTreeState& vts) : juce::AudioProcessorEditor (&p), processor (p), valueTreeState (vts), footer (p.getOSCParameterInterface()) { // ============== BEGIN: essentials ====================== // set GUI size and lookAndFeel //setSize(500, 300); // use this to create a fixed-size GUI setResizeLimits (370, 250, 800, 500); // use this to create a resizable GUI setResizable (true, true); setLookAndFeel (&globalLaF); // make title and footer visible, and set the PluginName addAndMakeVisible (&title); title.setTitle (juce::String ("Tool"), juce::String ("Box")); title.setFont (globalLaF.robotoBold, globalLaF.robotoLight); addAndMakeVisible (&footer); // ============= END: essentials ======================== // create the connection between title component's comboBoxes and parameters cbInputOrderSettingAttachment.reset ( new ComboBoxAttachment (valueTreeState, "inputOrderSetting", *title.getInputWidgetPtr()->getOrderCbPointer())); cbInputNormalizationSettingAttachment.reset ( new ComboBoxAttachment (valueTreeState, "useSn3dInput", *title.getInputWidgetPtr()->getNormCbPointer())); cbOutputOrderSettingAttachment.reset ( new ComboBoxAttachment (valueTreeState, "outputOrderSetting", *title.getOutputWidgetPtr()->getOrderCbPointer())); cbOutputNormalizationSettingAttachment.reset ( new ComboBoxAttachment (valueTreeState, "useSn3dOutput", *title.getOutputWidgetPtr()->getNormCbPointer())); // ================= FLIPs ================== addAndMakeVisible (gcFlip); gcFlip.setText ("Flip"); addAndMakeVisible (tbFlipX); tbFlipXAttachment.reset (new ButtonAttachment (valueTreeState, "flipX", tbFlipX)); tbFlipX.setButtonText ("Flip X (front/back)"); tbFlipX.setColour (juce::ToggleButton::tickColourId, globalLaF.ClWidgetColours[2]); addAndMakeVisible (tbFlipY); tbFlipYAttachment.reset (new ButtonAttachment (valueTreeState, "flipY", tbFlipY)); tbFlipY.setButtonText ("Flip Y (left/right)"); tbFlipY.setColour (juce::ToggleButton::tickColourId, globalLaF.ClWidgetColours[1]); addAndMakeVisible (tbFlipZ); tbFlipZAttachment.reset (new ButtonAttachment (valueTreeState, "flipZ", tbFlipZ)); tbFlipZ.setButtonText ("Flip Z (bottom/top)"); tbFlipZ.setColour (juce::ToggleButton::tickColourId, globalLaF.ClWidgetColours[0]); // ================= LOA WEIGHTS ================== addAndMakeVisible (gcLOAWeighting); gcLOAWeighting.setText ("LOA Weighting"); addAndMakeVisible (cbLoaWeights); cbLoaWeights.setJustificationType (juce::Justification::centred); cbLoaWeights.addSectionHeading ("Target Decoder Weights"); cbLoaWeights.addItem ("none", 1); cbLoaWeights.addItem ("maxrE", 2); cbLoaWeights.addItem ("inPhase", 3); cbLoaWeightsAttachment.reset ( new ComboBoxAttachment (valueTreeState, "loaWeights", cbLoaWeights)); addAndMakeVisible (lbLoaWeights); lbLoaWeights.setText ("Weights"); // ================= GAIN ========================= addAndMakeVisible (gcGain); gcGain.setText ("Overall Gain"); addAndMakeVisible (slGain); slGainAttachment.reset (new SliderAttachment (valueTreeState, "gain", slGain)); slGain.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); slGain.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); slGain.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[2]); // start timer after everything is set up properly startTimer (20); } ToolBoxAudioProcessorEditor::~ToolBoxAudioProcessorEditor() { setLookAndFeel (nullptr); } //============================================================================== void ToolBoxAudioProcessorEditor::paint (juce::Graphics& g) { g.fillAll (globalLaF.ClBackground); } void ToolBoxAudioProcessorEditor::resized() { // ============ BEGIN: header and footer ============ const int leftRightMargin = 30; const int headerHeight = 60; const int footerHeight = 25; juce::Rectangle area (getLocalBounds()); juce::Rectangle footerArea (area.removeFromBottom (footerHeight)); footer.setBounds (footerArea); area.removeFromLeft (leftRightMargin); area.removeFromRight (leftRightMargin); juce::Rectangle headerArea = area.removeFromTop (headerHeight); title.setBounds (headerArea); area.removeFromTop (10); area.removeFromBottom (5); // =========== END: header and footer ================= juce::Rectangle leftColumn = area.removeFromLeft (150); { juce::Rectangle flipArea = leftColumn.removeFromTop (85); gcFlip.setBounds (flipArea); flipArea.removeFromTop (25); tbFlipX.setBounds (flipArea.removeFromTop (20)); tbFlipY.setBounds (flipArea.removeFromTop (20)); tbFlipZ.setBounds (flipArea.removeFromTop (20)); leftColumn.removeFromTop (10); juce::Rectangle loaArea = leftColumn.removeFromTop (45); gcLOAWeighting.setBounds (loaArea); loaArea.removeFromTop (25); juce::Rectangle row = loaArea.removeFromTop (20); lbLoaWeights.setBounds (row.removeFromLeft (60)); cbLoaWeights.setBounds (row); } juce::Rectangle rightColumn = area.removeFromRight (120); { juce::Rectangle gainArea = rightColumn.removeFromTop (85); gcGain.setBounds (gainArea); gainArea.removeFromTop (25); juce::Rectangle row = gainArea.removeFromTop (80); slGain.setBounds (row.removeFromLeft (100)); } } void ToolBoxAudioProcessorEditor::timerCallback() { // === update titleBar widgets according to available input/output channel counts title.setMaxSize (processor.getMaxSize()); // ========================================== // insert stuff you want to do be done at every timer callback } IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/ToolBox/Source/PluginProcessor.h0000664002537200253720000000764015257173642030773 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once #include "../../resources/AudioProcessorBase.h" #include "../../resources/MaxRE.h" #include "../../resources/ambisonicTools.h" #include "../../resources/inPhase.h" #include "../JuceLibraryCode/JuceHeader.h" #define ProcessorClass ToolBoxAudioProcessor //============================================================================== class ToolBoxAudioProcessor : public AudioProcessorBase, IOTypes::Ambisonics<7>> { public: constexpr static int numberOfInputChannels = 64; constexpr static int numberOfOutputChannels = 64; //============================================================================== ToolBoxAudioProcessor(); ~ToolBoxAudioProcessor() override; //============================================================================== void prepareToPlay (double sampleRate, int samplesPerBlock) override; void releaseResources() override; void processBlock (juce::AudioSampleBuffer&, juce::MidiBuffer&) override; //============================================================================== juce::AudioProcessorEditor* createEditor() override; bool hasEditor() const override; //============================================================================== int getNumPrograms() override; int getCurrentProgram() override; void setCurrentProgram (int index) override; const juce::String getProgramName (int index) override; void changeProgramName (int index, const juce::String& newName) override; //============================================================================== void getStateInformation (juce::MemoryBlock& destData) override; void setStateInformation (const void* data, int sizeInBytes) override; //============================================================================== void parameterChanged (const juce::String& parameterID, float newValue) override; void updateBuffers() override; // use this to implement a buffer update method //======= Parameters =========================================================== std::vector> createParameterLayout(); private: //============================================================================== // list of used audio parameters std::atomic* inputOrderSetting; std::atomic* outputOrderSetting; std::atomic* useSn3dInput; std::atomic* useSn3dOutput; std::atomic* flipX; std::atomic* flipY; std::atomic* flipZ; std::atomic* loaWeights; std::atomic* gain; float previousWeights[64]; void calculateWeights (float* weights, const int nChannelsIn, const int nChannelsOut); bool doFlipX, doFlipY, doFlipZ; // flips juce::BigInteger flipXMask, flipYMask, flipZMask; //============================================================================== JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ToolBoxAudioProcessor) }; IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/ToolBox/Source/PluginEditor.h0000664002537200253720000000751615257173642030244 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once #include "../JuceLibraryCode/JuceHeader.h" #include "PluginProcessor.h" //Plugin Design Essentials #include "../../resources/customComponents/TitleBar.h" #include "../../resources/lookAndFeel/IEM_LaF.h" //Custom juce::Components #include "../../resources/customComponents/ReverseSlider.h" #include "../../resources/customComponents/SimpleLabel.h" typedef ReverseSlider::SliderAttachment SliderAttachment; // all ReverseSliders will make use of the parameters' valueToText() function typedef juce::AudioProcessorValueTreeState::ComboBoxAttachment ComboBoxAttachment; typedef juce::AudioProcessorValueTreeState::ButtonAttachment ButtonAttachment; //============================================================================== /** */ class ToolBoxAudioProcessorEditor : public juce::AudioProcessorEditor, private juce::Timer { public: ToolBoxAudioProcessorEditor (ToolBoxAudioProcessor&, juce::AudioProcessorValueTreeState&); ~ToolBoxAudioProcessorEditor() override; //============================================================================== void paint (juce::Graphics&) override; void resized() override; void timerCallback() override; private: // ====================== beging essentials ================== // lookAndFeel class with the IEM plug-in suite design LaF globalLaF; // stored references to the AudioProcessor and juce::ValueTreeState holding all the parameters ToolBoxAudioProcessor& processor; juce::AudioProcessorValueTreeState& valueTreeState; /* title and footer component title component can hold different widgets for in- and output: - NoIOWidget (if there's no need for an input or output widget) - AudioChannelsIOWidget - AmbisonicIOWidget - DirectivitiyIOWidget */ TitleBar, AmbisonicIOWidget<>> title; OSCFooter footer; // =============== end essentials ============ // Attachments to create a connection between IOWidgets comboboxes // and the associated parameters std::unique_ptr cbInputOrderSettingAttachment; std::unique_ptr cbOutputOrderSettingAttachment; std::unique_ptr cbInputNormalizationSettingAttachment; std::unique_ptr cbOutputNormalizationSettingAttachment; juce::GroupComponent gcFlip; juce::ToggleButton tbFlipX, tbFlipY, tbFlipZ; std::unique_ptr tbFlipXAttachment, tbFlipYAttachment, tbFlipZAttachment; juce::GroupComponent gcLOAWeighting; juce::ComboBox cbLoaWeights; std::unique_ptr cbLoaWeightsAttachment; SimpleLabel lbLoaWeights; juce::GroupComponent gcGain; ReverseSlider slGain; std::unique_ptr slGainAttachment; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ToolBoxAudioProcessorEditor) }; IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/ToolBox/CMakeLists.txt0000664002537200253720000000360315257173642026757 0ustar zmoelnigzmoelnigset (PLUGIN_TARGET "") if (IEM_FORMATS) juce_add_plugin (ToolBox PLUGIN_MANUFACTURER_CODE IEMA PLUGIN_CODE ToBo ICON_BIG "../resources/Standalone/IEMPluginSuiteSmall.png" ICON_SMALL "../resources/Standalone/IEMPluginSuiteSmall.png" COMPANY_NAME "IEM" PRODUCT_NAME "ToolBox" FORMATS ${IEM_FORMATS} VERSION ${ToolBox_VERSION} LV2URI "http://plugins.iem.at/ToolBox" VST2_CATEGORY kPlugSurroundFx kPlugCategSpacializer VST3_CATEGORIES Spatial Surround Tools AAX_CATEGORY SoundField) list (APPEND PLUGIN_TARGET ToolBox) endif() foreach (TARGET IN LISTS PLUGIN_TARGET) juce_generate_juce_header(${TARGET}) target_sources(${TARGET} PRIVATE Source/PluginEditor.cpp Source/PluginEditor.h Source/PluginProcessor.cpp Source/PluginProcessor.h ../resources/OSC/OSCInputStream.h ../resources/OSC/OSCParameterInterface.cpp ../resources/OSC/OSCParameterInterface.h ../resources/OSC/OSCStatus.cpp ../resources/OSC/OSCStatus.h ../resources/OSC/OSCUtilities.h ../resources/efficientSHvanilla.cpp ) target_compile_definitions(${TARGET} PRIVATE JUCE_USE_CURL=0 JUCE_WEB_BROWSER=0 JUCE_USE_CUSTOM_PLUGIN_STANDALONE_APP=1 JUCE_USE_FLAC=0 JUCE_USE_OGGVORBIS=0 JUCE_USE_MP3AUDIOFORMAT=0 JUCE_USE_LAME_AUDIO_FORMAT=0 JUCE_USE_WINDOWS_MEDIA_FORMAT=0 JUCE_VST3_CAN_REPLACE_VST2=0) target_include_directories(${TARGET} PRIVATE Source) target_link_libraries(${TARGET} PRIVATE LAF_fonts IEM_logo juce::juce_audio_utils juce::juce_audio_plugin_client juce::juce_osc juce::juce_dsp juce::juce_opengl juce::juce_recommended_config_flags juce::juce_recommended_lto_flags) endforeach() IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/EnergyVisualizer/0000775002537200253720000000000015257173642026136 5ustar zmoelnigzmoelnigIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/EnergyVisualizer/vertexIndex.h0000664002537200253720000055172615257173642030634 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #ifndef vertexIndex_h #define vertexIndex_h const unsigned int indices[1380][1] = { { 28, }, { 138, }, { 51, }, { 107, }, { 13, }, { 69, }, { 16, }, { 207, }, { 158, }, { 116, }, { 126, }, { 64, }, { 207, }, { 141, }, { 158, }, { 237, }, { 229, }, { 81, }, { 184, }, { 138, }, { 92, }, { 37, }, { 177, }, { 192, }, { 161, }, { 114, }, { 205, }, { 54, }, { 94, }, { 180, }, { 12, }, { 66, }, { 103, }, { 92, }, { 227, }, { 184, }, { 78, }, { 188, }, { 226, }, { 205, }, { 227, }, { 92, }, { 132, }, { 56, }, { 35, }, { 174, }, { 6, }, { 227, }, { 162, }, { 86, }, { 132, }, { 113, }, { 130, }, { 146, }, { 56, }, { 232, }, { 231, }, { 188, }, { 133, }, { 88, }, { 148, }, { 157, }, { 134, }, { 58, }, { 72, }, { 10, }, { 8, }, { 176, }, { 101, }, { 42, }, { 44, }, { 202, }, { 129, }, { 65, }, { 149, }, { 211, }, { 156, }, { 20, }, { 101, }, { 176, }, { 47, }, { 62, }, { 130, }, { 156, }, { 25, }, { 69, }, { 125, }, { 89, }, { 135, }, { 213, }, { 75, }, { 9, }, { 25, }, { 69, }, { 111, }, { 153, }, { 140, }, { 25, }, { 125, }, { 153, }, { 157, }, { 148, }, { 185, }, { 224, }, { 9, }, { 37, }, { 192, }, { 40, }, { 22, }, { 90, }, { 163, }, { 163, }, { 64, }, { 22, }, { 28, }, { 3, }, { 63, }, { 59, }, { 11, }, { 31, }, { 59, }, { 31, }, { 89, }, { 9, }, { 107, }, { 69, }, { 131, }, { 117, }, { 158, }, { 16, }, { 192, }, { 207, }, { 166, }, { 120, }, { 111, }, { 59, }, { 219, }, { 11, }, { 196, }, { 19, }, { 71, }, { 43, }, { 100, }, { 31, }, { 171, }, { 89, }, { 213, }, { 222, }, { 230, }, { 187, }, { 230, }, { 180, }, { 74, }, { 184, }, { 237, }, { 51, }, { 230, }, { 74, }, { 187, }, { 219, }, { 74, }, { 94, }, { 54, }, { 180, }, { 229, }, { 94, }, { 74, }, { 180, }, { 6, }, { 24, }, { 184, }, { 24, }, { 94, }, { 54, }, { 6, }, { 184, }, { 227, }, { 28, }, { 81, }, { 3, }, { 174, }, { 36, }, { 6, }, { 36, }, { 24, }, { 6, }, { 127, }, { 161, }, { 138, }, { 161, }, { 205, }, { 92, }, { 16, }, { 63, }, { 96, }, { 118, }, { 17, }, { 204, }, { 144, }, { 147, }, { 117, }, { 127, }, { 28, }, { 63, }, { 138, }, { 161, }, { 92, }, { 114, }, { 128, }, { 61, }, { 127, }, { 145, }, { 161, }, { 161, }, { 145, }, { 114, }, { 144, }, { 145, }, { 147, }, { 128, }, { 114, }, { 145, }, { 14, }, { 205, }, { 114, }, { 14, }, { 195, }, { 174, }, { 99, }, { 169, }, { 38, }, { 99, }, { 1, }, { 169, }, { 195, }, { 36, }, { 174, }, { 103, }, { 199, }, { 210, }, { 103, }, { 36, }, { 199, }, { 128, }, { 160, }, { 142, }, { 55, }, { 77, }, { 32, }, { 123, }, { 150, }, { 109, }, { 164, }, { 143, }, { 150, }, { 204, }, { 178, }, { 223, }, { 188, }, { 55, }, { 133, }, { 183, }, { 58, }, { 93, }, { 109, }, { 150, }, { 124, }, { 146, }, { 164, }, { 151, }, { 124, }, { 66, }, { 109, }, { 67, }, { 32, }, { 7, }, { 55, }, { 233, }, { 77, }, { 211, }, { 137, }, { 156, }, { 119, }, { 164, }, { 146, }, { 102, }, { 198, }, { 62, }, { 137, }, { 33, }, { 102, }, { 144, }, { 131, }, { 118, }, { 141, }, { 207, }, { 91, }, { 97, }, { 29, }, { 0, }, { 93, }, { 209, }, { 175, }, { 27, }, { 139, }, { 93, }, { 182, }, { 234, }, { 49, }, { 56, }, { 231, }, { 76, }, { 231, }, { 75, }, { 57, }, { 76, }, { 8, }, { 35, }, { 176, }, { 201, }, { 47, }, { 15, }, { 200, }, { 168, }, { 193, }, { 178, }, { 17, }, { 39, }, { 104, }, { 10, }, { 44, }, { 194, }, { 20, }, { 167, }, { 209, }, { 139, }, { 5, }, { 79, }, { 239, }, { 44, }, { 217, }, { 175, }, { 183, }, { 7, }, { 228, }, { 125, }, { 148, }, { 116, }, { 163, }, { 116, }, { 64, }, { 163, }, { 125, }, { 116, }, { 148, }, { 134, }, { 126, }, { 110, }, { 155, }, { 120, }, { 116, }, { 148, }, { 126, }, { 125, }, { 153, }, { 148, }, { 69, }, { 153, }, { 125, }, { 71, }, { 120, }, { 166, }, { 163, }, { 140, }, { 125, }, { 25, }, { 9, }, { 69, }, { 22, }, { 208, }, { 90, }, { 57, }, { 25, }, { 140, }, { 90, }, { 181, }, { 140, }, { 231, }, { 238, }, { 75, }, { 134, }, { 64, }, { 126, }, { 208, }, { 22, }, { 105, }, { 64, }, { 134, }, { 105, }, { 208, }, { 105, }, { 201, }, { 22, }, { 64, }, { 105, }, { 76, }, { 181, }, { 216, }, { 90, }, { 140, }, { 163, }, { 101, }, { 68, }, { 8, }, { 216, }, { 176, }, { 8, }, { 208, }, { 201, }, { 176, }, { 212, }, { 112, }, { 23, }, { 201, }, { 105, }, { 46, }, { 197, }, { 101, }, { 47, }, { 68, }, { 35, }, { 8, }, { 56, }, { 76, }, { 35, }, { 181, }, { 57, }, { 140, }, { 68, }, { 121, }, { 35, }, { 232, }, { 238, }, { 231, }, { 108, }, { 122, }, { 15, }, { 191, }, { 232, }, { 56, }, { 176, }, { 216, }, { 208, }, { 181, }, { 231, }, { 57, }, { 216, }, { 181, }, { 90, }, { 76, }, { 231, }, { 181, }, { 76, }, { 216, }, { 8, }, { 90, }, { 208, }, { 216, }, { 57, }, { 75, }, { 25, }, { 238, }, { 185, }, { 9, }, { 132, }, { 191, }, { 56, }, { 191, }, { 225, }, { 82, }, { 86, }, { 191, }, { 132, }, { 82, }, { 0, }, { 48, }, { 162, }, { 214, }, { 86, }, { 214, }, { 225, }, { 86, }, { 162, }, { 108, }, { 214, }, { 168, }, { 225, }, { 214, }, { 232, }, { 191, }, { 82, }, { 168, }, { 200, }, { 41, }, { 86, }, { 225, }, { 191, }, { 168, }, { 0, }, { 225, }, { 39, }, { 193, }, { 41, }, { 168, }, { 214, }, { 15, }, { 82, }, { 48, }, { 185, }, { 91, }, { 207, }, { 177, }, { 238, }, { 82, }, { 185, }, { 141, }, { 60, }, { 131, }, { 232, }, { 82, }, { 238, }, { 225, }, { 0, }, { 82, }, { 71, }, { 166, }, { 135, }, { 13, }, { 107, }, { 37, }, { 13, }, { 37, }, { 203, }, { 177, }, { 207, }, { 192, }, { 48, }, { 91, }, { 185, }, { 37, }, { 107, }, { 224, }, { 120, }, { 155, }, { 111, }, { 157, }, { 153, }, { 155, }, { 153, }, { 111, }, { 155, }, { 69, }, { 13, }, { 111, }, { 238, }, { 9, }, { 75, }, { 224, }, { 107, }, { 9, }, { 134, }, { 157, }, { 215, }, { 215, }, { 19, }, { 196, }, { 215, }, { 110, }, { 19, }, { 157, }, { 110, }, { 215, }, { 157, }, { 155, }, { 110, }, { 196, }, { 71, }, { 100, }, { 166, }, { 111, }, { 13, }, { 19, }, { 120, }, { 71, }, { 19, }, { 110, }, { 120, }, { 203, }, { 213, }, { 13, }, { 135, }, { 31, }, { 100, }, { 43, }, { 31, }, { 11, }, { 100, }, { 71, }, { 135, }, { 213, }, { 135, }, { 166, }, { 213, }, { 203, }, { 171, }, { 13, }, { 213, }, { 166, }, { 203, }, { 37, }, { 40, }, { 224, }, { 177, }, { 37, }, { 224, }, { 185, }, { 91, }, { 224, }, { 91, }, { 177, }, { 48, }, { 0, }, { 29, }, { 40, }, { 171, }, { 203, }, { 187, }, { 74, }, { 59, }, { 96, }, { 40, }, { 192, }, { 222, }, { 187, }, { 171, }, { 192, }, { 16, }, { 96, }, { 158, }, { 117, }, { 16, }, { 196, }, { 100, }, { 43, }, { 40, }, { 222, }, { 171, }, { 74, }, { 219, }, { 59, }, { 187, }, { 89, }, { 171, }, { 31, }, { 135, }, { 89, }, { 89, }, { 187, }, { 59, }, { 222, }, { 3, }, { 230, }, { 96, }, { 222, }, { 40, }, { 3, }, { 81, }, { 230, }, { 43, }, { 11, }, { 179, }, { 179, }, { 219, }, { 94, }, { 179, }, { 11, }, { 219, }, { 229, }, { 230, }, { 81, }, { 229, }, { 180, }, { 230, }, { 73, }, { 237, }, { 184, }, { 54, }, { 229, }, { 237, }, { 73, }, { 24, }, { 54, }, { 237, }, { 73, }, { 54, }, { 184, }, { 24, }, { 73, }, { 96, }, { 3, }, { 222, }, { 96, }, { 63, }, { 3, }, { 184, }, { 51, }, { 138, }, { 237, }, { 81, }, { 51, }, { 81, }, { 28, }, { 51, }, { 63, }, { 147, }, { 127, }, { 145, }, { 127, }, { 147, }, { 138, }, { 28, }, { 127, }, { 204, }, { 95, }, { 160, }, { 95, }, { 182, }, { 142, }, { 205, }, { 174, }, { 227, }, { 205, }, { 14, }, { 174, }, { 160, }, { 128, }, { 145, }, { 61, }, { 14, }, { 114, }, { 61, }, { 99, }, { 14, }, { 38, }, { 36, }, { 195, }, { 14, }, { 99, }, { 195, }, { 169, }, { 226, }, { 210, }, { 99, }, { 38, }, { 195, }, { 199, }, { 36, }, { 38, }, { 61, }, { 1, }, { 99, }, { 26, }, { 49, }, { 78, }, { 26, }, { 61, }, { 128, }, { 26, }, { 1, }, { 61, }, { 128, }, { 142, }, { 26, }, { 234, }, { 72, }, { 228, }, { 160, }, { 95, }, { 142, }, { 160, }, { 118, }, { 204, }, { 17, }, { 118, }, { 131, }, { 160, }, { 145, }, { 118, }, { 178, }, { 204, }, { 17, }, { 223, }, { 72, }, { 182, }, { 60, }, { 97, }, { 193, }, { 10, }, { 72, }, { 223, }, { 63, }, { 117, }, { 147, }, { 63, }, { 16, }, { 117, }, { 131, }, { 144, }, { 117, }, { 118, }, { 145, }, { 144, }, { 131, }, { 60, }, { 17, }, { 131, }, { 158, }, { 141, }, { 48, }, { 29, }, { 91, }, { 29, }, { 60, }, { 141, }, { 91, }, { 29, }, { 141, }, { 0, }, { 168, }, { 41, }, { 41, }, { 97, }, { 0, }, { 60, }, { 29, }, { 97, }, { 39, }, { 41, }, { 200, }, { 39, }, { 178, }, { 193, }, { 60, }, { 193, }, { 17, }, { 97, }, { 41, }, { 193, }, { 104, }, { 39, }, { 200, }, { 10, }, { 178, }, { 39, }, { 15, }, { 70, }, { 200, }, { 27, }, { 10, }, { 104, }, { 70, }, { 27, }, { 104, }, { 93, }, { 175, }, { 217, }, { 27, }, { 58, }, { 10, }, { 228, }, { 7, }, { 77, }, { 27, }, { 93, }, { 58, }, { 139, }, { 209, }, { 93, }, { 93, }, { 217, }, { 183, }, { 217, }, { 44, }, { 98, }, { 58, }, { 183, }, { 72, }, { 77, }, { 233, }, { 228, }, { 7, }, { 183, }, { 217, }, { 228, }, { 72, }, { 183, }, { 7, }, { 32, }, { 77, }, { 7, }, { 98, }, { 67, }, { 204, }, { 223, }, { 95, }, { 178, }, { 10, }, { 223, }, { 223, }, { 182, }, { 95, }, { 234, }, { 233, }, { 49, }, { 72, }, { 234, }, { 182, }, { 228, }, { 233, }, { 234, }, { 142, }, { 49, }, { 26, }, { 142, }, { 182, }, { 49, }, { 26, }, { 78, }, { 1, }, { 49, }, { 233, }, { 78, }, { 38, }, { 169, }, { 199, }, { 226, }, { 88, }, { 210, }, { 1, }, { 226, }, { 169, }, { 1, }, { 78, }, { 226, }, { 226, }, { 188, }, { 88, }, { 78, }, { 233, }, { 188, }, { 169, }, { 210, }, { 199, }, { 88, }, { 165, }, { 12, }, { 143, }, { 103, }, { 66, }, { 210, }, { 12, }, { 103, }, { 210, }, { 88, }, { 12, }, { 123, }, { 133, }, { 32, }, { 188, }, { 233, }, { 55, }, { 88, }, { 133, }, { 165, }, { 55, }, { 32, }, { 133, }, { 12, }, { 165, }, { 66, }, { 133, }, { 123, }, { 165, }, { 156, }, { 130, }, { 113, }, { 151, }, { 123, }, { 67, }, { 113, }, { 146, }, { 151, }, { 164, }, { 150, }, { 151, }, { 165, }, { 109, }, { 66, }, { 165, }, { 123, }, { 109, }, { 67, }, { 123, }, { 32, }, { 151, }, { 150, }, { 123, }, { 143, }, { 124, }, { 150, }, { 143, }, { 66, }, { 124, }, { 119, }, { 206, }, { 164, }, { 67, }, { 113, }, { 151, }, { 130, }, { 119, }, { 146, }, { 62, }, { 21, }, { 130, }, { 130, }, { 21, }, { 119, }, { 20, }, { 113, }, { 67, }, { 20, }, { 156, }, { 113, }, { 119, }, { 21, }, { 206, }, { 206, }, { 143, }, { 164, }, { 198, }, { 206, }, { 21, }, { 194, }, { 173, }, { 211, }, { 137, }, { 62, }, { 156, }, { 194, }, { 44, }, { 42, }, { 87, }, { 33, }, { 137, }, { 62, }, { 198, }, { 21, }, { 67, }, { 98, }, { 20, }, { 7, }, { 217, }, { 98, }, { 98, }, { 44, }, { 20, }, { 175, }, { 209, }, { 202, }, { 20, }, { 194, }, { 211, }, { 44, }, { 175, }, { 202, }, { 209, }, { 18, }, { 202, }, { 173, }, { 87, }, { 211, }, { 209, }, { 167, }, { 18, }, { 87, }, { 137, }, { 211, }, { 173, }, { 189, }, { 87, }, { 137, }, { 102, }, { 62, }, { 50, }, { 2, }, { 33, }, { 87, }, { 50, }, { 33, }, { 45, }, { 102, }, { 33, }, { 45, }, { 198, }, { 102, }, { 2, }, { 45, }, { 33, }, { 173, }, { 220, }, { 189, }, { 220, }, { 5, }, { 239, }, { 83, }, { 221, }, { 50, }, { 50, }, { 221, }, { 2, }, { 239, }, { 236, }, { 190, }, { 221, }, { 170, }, { 2, }, { 189, }, { 239, }, { 83, }, { 2, }, { 170, }, { 45, }, { 53, }, { 235, }, { 79, }, { 42, }, { 106, }, { 220, }, { 65, }, { 30, }, { 5, }, { 189, }, { 220, }, { 239, }, { 106, }, { 65, }, { 5, }, { 212, }, { 23, }, { 172, }, { 172, }, { 23, }, { 197, }, { 194, }, { 42, }, { 173, }, { 202, }, { 106, }, { 42, }, { 42, }, { 220, }, { 173, }, { 106, }, { 5, }, { 220, }, { 50, }, { 189, }, { 83, }, { 50, }, { 87, }, { 189, }, { 115, }, { 167, }, { 122, }, { 70, }, { 104, }, { 200, }, { 106, }, { 18, }, { 65, }, { 106, }, { 202, }, { 18, }, { 214, }, { 108, }, { 15, }, { 122, }, { 139, }, { 70, }, { 122, }, { 70, }, { 15, }, { 139, }, { 27, }, { 70, }, { 115, }, { 122, }, { 154, }, { 167, }, { 139, }, { 122, }, { 121, }, { 162, }, { 132, }, { 149, }, { 65, }, { 115, }, { 152, }, { 149, }, { 154, }, { 154, }, { 122, }, { 108, }, { 162, }, { 152, }, { 108, }, { 115, }, { 18, }, { 167, }, { 108, }, { 152, }, { 154, }, { 30, }, { 79, }, { 5, }, { 149, }, { 115, }, { 154, }, { 65, }, { 18, }, { 115, }, { 152, }, { 159, }, { 129, }, { 136, }, { 159, }, { 85, }, { 136, }, { 129, }, { 159, }, { 23, }, { 68, }, { 101, }, { 65, }, { 129, }, { 30, }, { 149, }, { 152, }, { 129, }, { 197, }, { 23, }, { 101, }, { 112, }, { 121, }, { 68, }, { 35, }, { 121, }, { 132, }, { 112, }, { 159, }, { 152, }, { 121, }, { 152, }, { 162, }, { 121, }, { 112, }, { 152, }, { 212, }, { 85, }, { 159, }, { 47, }, { 201, }, { 46, }, { 129, }, { 136, }, { 30, }, { 197, }, { 47, }, { 46, }, { 46, }, { 172, }, { 197, }, { 112, }, { 68, }, { 23, }, { 4, }, { 172, }, { 46, }, { 186, }, { 4, }, { 34, }, { 218, }, { 212, }, { 172, }, { 159, }, { 112, }, { 212, }, { 218, }, { 85, }, { 212, }, { 218, }, { 4, }, { 186, }, { 53, }, { 79, }, { 30, }, { 236, }, { 239, }, { 79, }, { 218, }, { 172, }, { 4, }, { 84, }, { 83, }, { 190, }, { 186, }, { 136, }, { 85, }, { 186, }, { 53, }, { 136, }, { 218, }, { 186, }, { 85, }, { 80, }, { 235, }, { 186, }, { 136, }, { 53, }, { 30, }, { 235, }, { 236, }, { 79, }, { 52, }, { 236, }, { 235, }, { 190, }, { 83, }, { 239, }, { 221, }, { 83, }, { 84, }, { 80, }, { 186, }, { 34, }, { 221, }, { 84, }, { 170, }, { 52, }, { 80, }, { 34, }, { 190, }, { 52, }, { 84, }, { 4, }, { 46, }, { 34, }, { 186, }, { 235, }, { 53, }, { 80, }, { 52, }, { 235, }, { 84, }, { 52, }, { 34, }, { 190, }, { 236, }, { 52, } }; #endif IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/EnergyVisualizer/tDesignProjected.h0000664002537200253720000017617015257173642031560 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #ifndef tDesignProjected_h #define tDesignProjected_h const float vertices[480][1] = { { -1.5083745967625314e-01, }, { -1.2971360094073983e-01, }, { 7.7301807731255182e-02, }, { 7.4359716652229757e-01, }, { 8.7268041478894887e-01, }, { -1.6502634378234862e-01, }, { -5.6185741091886632e-01, }, { 3.2857362907245419e-01, }, { 4.2194432105780882e-01, }, { -8.5391205288152849e-01, }, { 5.6185741086104357e-01, }, { -3.2857362908501453e-01, }, { -4.2194432094872081e-01, }, { 8.5391205287582062e-01, }, { 4.4134044692715046e-01, }, { 3.1589518207661066e-01, }, { -7.7301807638299816e-02, }, { -7.4359716663777531e-01, }, { -4.4134044688063828e-01, }, { -3.1589518201034222e-01, }, { 1.5083745960357042e-01, }, { 1.2971360087091244e-01, }, { -8.7268041482182379e-01, }, { 1.6502634375975889e-01, }, { 3.5607223839689411e-01, }, { 8.4435561417965721e-01, }, { -6.1913244584205196e-01, }, { -2.3370824133583401e-01, }, { -1.3626111414296407e-01, }, { 7.7323070595105015e-01, }, { 1.0603159199847075e-01, }, { -2.1214327591085563e-01, }, { -4.2201334723829009e-01, }, { 2.1931546638715044e-01, }, { -1.0603159191057145e-01, }, { 2.1214327598892491e-01, }, { 4.2201334731726692e-01, }, { -2.1931546642369848e-01, }, { -8.8088615166342055e-01, }, { -2.7606503817561162e-01, }, { 6.1913244573607329e-01, }, { 2.3370824159482012e-01, }, { 8.8088615176284935e-01, }, { 2.7606503826930029e-01, }, { -3.5607223827973639e-01, }, { -8.4435561429817196e-01, }, { 1.3626111396563459e-01, }, { -7.7323070587038834e-01, }, { -5.7216418024341931e-01, }, { 8.1275163261455863e-01, }, { -4.5233964021321071e-01, }, { -4.5663254119945429e-01, }, { 9.6101313249481648e-03, }, { 6.5138530877647016e-01, }, { 2.1586300853193277e-01, }, { 1.7259363997000326e-02, }, { -4.6840486276264987e-01, }, { 4.5910672782042289e-01, }, { -2.1586300858623456e-01, }, { -1.7259364221144578e-02, }, { 4.6840486275003368e-01, }, { -4.5910672764293681e-01, }, { -8.3539022857578304e-01, }, { 2.1141516233632477e-02, }, { 4.5233964024409706e-01, }, { 4.5663254118602781e-01, }, { 8.3539022860249879e-01, }, { -2.1141516397181398e-02, }, { 5.7216418014400905e-01, }, { -8.1275163271963857e-01, }, { -9.6101311721389637e-03, }, { -6.5138530894775570e-01, }, { -1.3467238766480905e-01, }, { 9.7736748194835166e-01, }, { -5.2047837609366177e-01, }, { -9.8250098290342577e-02, }, { 2.4967184689322804e-02, }, { 9.2893691445077065e-01, }, { 4.5684329492850791e-02, }, { 3.6976607156224292e-02, }, { -5.5465592655231000e-01, }, { 9.9323314230176485e-02, }, { -4.5684329475916427e-02, }, { -3.6976606861904786e-02, }, { 5.5465592655066287e-01, }, { -9.9323314261662257e-02, }, { -9.6585927152589379e-01, }, { 5.0638791002628997e-02, }, { 5.2047837614227022e-01, }, { 9.8250098376885392e-02, }, { 9.6585927153043782e-01, }, { -5.0638790719475774e-02, }, { 1.3467238763355874e-01, }, { -9.7736748205598889e-01, }, { -2.4967184802706450e-02, }, { -9.2893691440411519e-01, }, { -2.5536328369687478e-01, }, { -1.6547796628115302e-01, }, { 8.9241365165950118e-02, }, { 5.5291470921446173e-01, }, { 7.8019742425685412e-01, }, { -1.9650082614443182e-01, }, { -5.0605672862906337e-01, }, { 5.4697596066486787e-01, }, { 6.4970660923896273e-01, }, { -6.7970131835451209e-01, }, { 5.0605672863888485e-01, }, { -5.4697596059229325e-01, }, { -6.4970660936000368e-01, }, { 6.7970131818304758e-01, }, { 3.5068070971690007e-01, }, { 5.1842040551056534e-01, }, { -8.9241365182032517e-02, }, { -5.5291470918717511e-01, }, { -3.5068070967864307e-01, }, { -5.1842040552342861e-01, }, { 2.5536328375274769e-01, }, { 1.6547796641064658e-01, }, { -7.8019742415315052e-01, }, { 1.9650082623015494e-01, }, { -1.7286802415215452e-01, }, { 1.3530409604168453e-01, }, { -7.8728144676120271e-02, }, { 7.0580781880547716e-01, }, { 8.5423049233275350e-01, }, { 1.6965033053389883e-01, }, { -4.2633304612725925e-01, }, { 3.6030855265237216e-01, }, { -4.7337229982025125e-01, }, { -8.2440105511652340e-01, }, { 4.2633304624588692e-01, }, { -3.6030855265438599e-01, }, { 4.7337229987230223e-01, }, { 8.2440105501304461e-01, }, { 5.5224315498646281e-01, }, { 3.7557159810802410e-01, }, { 7.8728144561005589e-02, }, { -7.0580781882393251e-01, }, { -5.5224315503779065e-01, }, { -3.7557159805096824e-01, }, { 1.7286802414958838e-01, }, { -1.3530409599220150e-01, }, { -8.5423049229027748e-01, }, { -1.6965033054877052e-01, }, { 1.9655910721813954e-01, }, { 2.6797293812936057e-01, }, { -5.5353406597882626e-01, }, { 7.0727147514374700e-01, }, { -7.8929269003969182e-01, }, { 3.2684058144294276e-01, }, { -3.4792524201847358e-01, }, { -3.9381251977012921e-01, }, { -1.5264664785919368e-01, }, { -6.0992700726013682e-01, }, { 3.4792524200408131e-01, }, { 3.9381251973012221e-01, }, { 1.5264664771339154e-01, }, { 6.0992700734903704e-01, }, { 5.9972582876342384e-01, }, { -4.2838950244979168e-01, }, { 5.5353406594820209e-01, }, { -7.0727147513431321e-01, }, { -5.9972582870997293e-01, }, { 4.2838950251027397e-01, }, { -1.9655910721116779e-01, }, { -2.6797293799408206e-01, }, { 7.8929269013237902e-01, }, { -3.2684058123531629e-01, }, { 8.3600232933918706e-01, }, { -5.1760210042320298e-01, }, { 3.4221600046264555e-01, }, { -7.2948788883561178e-01, }, { -2.4401999615162456e-02, }, { -3.8683685195312290e-01, }, { 7.1550038009586314e-01, }, { -5.4425812795235194e-02, }, { 2.9666659655112204e-01, }, { 7.1712031808043841e-01, }, { -7.1550038013921313e-01, }, { 5.4425812684104576e-02, }, { -2.9666659648964505e-01, }, { -7.1712031810728372e-01, }, { -3.5455409072400257e-01, }, { -4.8477053865087952e-02, }, { -3.4221600047320050e-01, }, { 7.2948788879996673e-01, }, { 3.5455409070126515e-01, }, { 4.8477053876695493e-02, }, { -8.3600232924204521e-01, }, { 5.1760210056032607e-01, }, { 2.4401999680457816e-02, }, { 3.8683685197787920e-01, }, { -5.1327227032872702e-01, }, { 2.5742452882851224e-01, }, { -1.1976883009496286e-01, }, { 6.9587922034356348e-03, }, { 5.1971721557728234e-01, }, { 2.5796051771620671e-01, }, { -4.2473178230026977e-03, }, { 8.1681056374212002e-01, }, { -9.1167406184123345e-01, }, { -9.0701890459999063e-03, }, { 4.2473178637267642e-03, }, { -8.1681056363571658e-01, }, { 9.1167406184292676e-01, }, { 9.0701890357095753e-03, }, { 3.3198951934911297e-01, }, { 9.4068036830599944e-01, }, { 1.1976883013062584e-01, }, { -6.9587922146728143e-03, }, { -3.3198951947328065e-01, }, { -9.4068036820867373e-01, }, { 5.1327227026590116e-01, }, { -2.5742452902732443e-01, }, { -5.1971721554846240e-01, }, { -2.5796051770661799e-01, }, { 1.5289060531157969e-01, }, { -3.4297912673847525e-01, }, { 5.0198253910797130e-01, }, { 7.0068833883581938e-01, }, { -7.8139774486647928e-01, }, { -4.2539300844191669e-01, }, { -6.5961896514934093e-01, }, { -3.3625151294546307e-01, }, { 2.0561885584145251e-01, }, { -6.2841628748755229e-01, }, { 6.5961896519462671e-01, }, { 3.3625151307447565e-01, }, { -2.0561885586980597e-01, }, { 6.2841628765760627e-01, }, { 3.3726846152511686e-01, }, { -3.0242418293759654e-01, }, { -5.0198253923605374e-01, }, { -7.0068833865092683e-01, }, { -3.3726846150224071e-01, }, { 3.0242418286292083e-01, }, { -1.5289060523976319e-01, }, { 3.4297912694474986e-01, }, { 7.8139774490100478e-01, }, { 4.2539300852992779e-01, }, { -7.8502851332144530e-01, }, { -2.3082214659951120e-01, }, { 1.0542390542638935e-01, }, { -5.7198443372251773e-01, }, { 2.3938884904277249e-01, }, { -1.9287384490045059e-01, }, { 5.3272140456215689e-01, }, { 5.1550732658017551e-01, }, { 6.2087481373659237e-01, }, { 6.9182001270093219e-01, }, { -5.3272140454663974e-01, }, { -5.1550732667833865e-01, }, { -6.2087481372884734e-01, }, { -6.9182001271214222e-01, }, { -3.5158057285901967e-01, }, { 4.8456972312648983e-01, }, { -1.0542390548741461e-01, }, { 5.7198443347103178e-01, }, { 3.5158057294516409e-01, }, { -4.8456972309318364e-01, }, { 7.8502851322799061e-01, }, { 2.3082214668829568e-01, }, { -2.3938884914581324e-01, }, { 1.9287384498953694e-01, }, { 1.0459626449553294e-02, }, { -5.2213930485667925e-01, }, { 4.0766749602095725e-01, }, { 5.9833336739994469e-01, }, { -7.2231341270388894e-01, }, { -6.8155464755442108e-01, }, { -7.7696885979648989e-01, }, { -2.3266948120455353e-02, }, { 3.8910983244846342e-01, }, { -5.9443090283866462e-01, }, { 7.7696885983401698e-01, }, { 2.3266948234356610e-02, }, { -3.8910983246555186e-01, }, { 5.9443090286657219e-01, }, { 2.8578194226796272e-01, }, { -1.9848637183416167e-02, }, { -4.0766749608136271e-01, }, { -5.9833336733360720e-01, }, { -2.8578194229312298e-01, }, { 1.9848637165986026e-02, }, { -1.0459626444180938e-02, }, { 5.2213930494864236e-01, }, { 7.2231341262115090e-01, }, { 6.8155464766492302e-01, }, { -2.2948753454748863e-01, }, { 3.4692782241537773e-01, }, { -1.9049920296466488e-01, }, { 5.0972794411168565e-01, }, { 7.2248081556984078e-01, }, { 4.0967431716006164e-01, }, { -2.8553726751292086e-01, }, { 4.4256706153787123e-01, }, { -6.2991271241719027e-01, }, { -5.9543729485455910e-01, }, { 2.8553726745549779e-01, }, { -4.4256706163220771e-01, }, { 6.2991271246869363e-01, }, { 5.9543729486454666e-01, }, { 6.1629116549976071e-01, }, { 4.9540220304308619e-01, }, { 1.9049920304788867e-01, }, { -5.0972794416180445e-01, }, { -6.1629116537088624e-01, }, { -4.9540220331968771e-01, }, { 2.2948753457408191e-01, }, { -3.4692782244286074e-01, }, { -7.2248081557919119e-01, }, { -4.0967431726970571e-01, }, { 7.2441257821407434e-01, }, { 1.9829006682850767e-01, }, { -7.6120072021603102e-01, }, { -5.4813803310158393e-01, }, { -3.1893267920356616e-01, }, { 1.7384768021029062e-01, }, { 2.8328238338988715e-01, }, { -6.3181724686992946e-01, }, { -8.9391309569607572e-02, }, { 4.3172627793474916e-01, }, { -2.8328238325531024e-01, }, { 6.3181724699432906e-01, }, { 8.9391309454116372e-02, }, { -4.3172627791560636e-01, }, { -4.4813823844660533e-01, }, { -6.7071158772131423e-01, }, { 7.6120072023979890e-01, }, { 5.4813803300500119e-01, }, { 4.4813823827905408e-01, }, { 6.7071158787481977e-01, }, { -7.2441257815567373e-01, }, { -1.9829006663320495e-01, }, { 3.1893267919504753e-01, }, { -1.7384768017951074e-01, }, { -3.6137435991316628e-02, }, { -1.8983876222699278e-01, }, { 1.4540008062828702e-01, }, { 8.6292014860984323e-01, }, { 9.3917518570705871e-01, }, { -2.5946734162987356e-01, }, { -6.2566935920986022e-01, }, { 7.9883508935339367e-02, }, { 2.1733130296244260e-01, }, { -8.8951319538415485e-01, }, { 6.2566935922605094e-01, }, { -7.9883509130214470e-02, }, { -2.1733130273278728e-01, }, { 8.8951319551393648e-01, }, { 4.4982802587234555e-01, }, { 7.5534741160615287e-02, }, { -1.4540008052215039e-01, }, { -8.6292014873988265e-01, }, { -4.4982802578942488e-01, }, { -7.5534741211934681e-02, }, { 3.6137435993550869e-02, }, { 1.8983876199056787e-01, }, { -9.3917518590011528e-01, }, { 2.5946734122711246e-01, }, { -7.6821689190692777e-01, }, { 5.1527399350966296e-01, }, { -2.6095527993484768e-01, }, { -6.3425322837757914e-01, }, { 1.0693604799646027e-01, }, { 4.0838127985748252e-01, }, { 3.2488718812333894e-01, }, { 2.0899197832419153e-01, }, { -4.6050110443048670e-01, }, { 6.8205162399528374e-01, }, { -3.2488718817187684e-01, }, { -2.0899197813780099e-01, }, { 4.6050110439006908e-01, }, { -6.8205162412070541e-01, }, { -7.0848707005241596e-01, }, { 2.3676927312628115e-01, }, { 2.6095528002764251e-01, }, { 6.3425322847213073e-01, }, { 7.0848706996548350e-01, }, { -2.3676927323471658e-01, }, { 7.6821689210414701e-01, }, { -5.1527399334318802e-01, }, { -1.0693604791813210e-01, }, { -4.0838127982423966e-01, }, { -4.8322073691312539e-01, }, { 8.5513226638675471e-02, }, { -4.0324498196787878e-02, }, { 1.1831218725060733e-01, }, { 5.9265849956936434e-01, }, { 8.8541292369841637e-02, }, { -8.6854611211938937e-02, }, { 9.0236506843323228e-01, }, { -9.5755517645034960e-01, }, { -1.6212284032164645e-01, }, { 8.6854611049604763e-02, }, { -9.0236506846709263e-01, }, { 9.5755517645501975e-01, }, { 1.6212284051794323e-01, }, { 1.7034467593670613e-01, }, { 9.3632616084348863e-01, }, { 4.0324498282732886e-02, }, { -1.1831218715256855e-01, }, { -1.7034467591896632e-01, }, { -9.3632616083140807e-01, }, { 4.8322073691550266e-01, }, { -8.5513226714055396e-02, }, { -5.9265849963975847e-01, }, { -8.8541292305483091e-02, }, { -3.5893892067376754e-02, }, { 3.0185125109189193e-01, }, { -2.2985389383600605e-01, }, { 7.8165707661691686e-01, }, { 8.8590366891976735e-01, }, { 4.0693924957377930e-01, }, { -3.9559925377383320e-01, }, { 7.3022093237472899e-02, }, { -2.9881780877984698e-01, }, { -8.0312663071929991e-01, }, { 3.9559925381279898e-01, }, { -7.3022093298740556e-02, }, { 2.9881780892895476e-01, }, { 8.0312663056852052e-01, }, { 6.7621769645298624e-01, }, { 7.9873355882200445e-02, }, { 2.2985389409896351e-01, }, { -7.8165707652047789e-01, }, { -6.7621769641336671e-01, }, { -7.9873356038631479e-02, }, { 3.5893891991328711e-02, }, { -3.0185125131370139e-01, }, { -8.8590366882801608e-01, }, { -4.0693925002161480e-01, }, { -1.6366594460033757e-01, }, { -7.5533398537907315e-01, }, { 4.0452679314679446e-01, }, { 2.0818134241645225e-01, }, { 3.6854604988025852e-01, }, { -8.1874056292607111e-01, }, { -8.6722086767984474e-01, }, { 3.2701940619989062e-01, }, { 6.3868512615913042e-01, }, { -2.2451100276466299e-01, }, { 8.6722086772860052e-01, }, { -3.2701940612557939e-01, }, { -6.3868512620252571e-01, }, { 2.2451100266728019e-01, }, { 1.0158053150949675e-01, }, { 2.5167923285273874e-01, }, { -4.0452679318435081e-01, }, { -2.0818134227952420e-01, }, { -1.0158053146395131e-01, }, { -2.5167923293268224e-01, }, { 1.6366594459630165e-01, }, { 7.5533398543898467e-01, }, { -3.6854604978216615e-01, }, { 8.1874056299365916e-01, }, { 2.7964041927248123e-01, }, { 3.6050674521247567e-01, }, { -7.0718006382705023e-01, }, { 4.9654609025287688e-01, }, { -6.7544587187872995e-01, }, { 4.1164020020484238e-01, }, { -2.3641873166847394e-01, }, { -5.2378812916237349e-01, }, { -1.8926377168640324e-01, }, { -4.1529844317504283e-01, }, { 2.3641873175753292e-01, }, { 5.2378812902052208e-01, }, { 1.8926377166617417e-01, }, { 4.1529844301001329e-01, }, { 5.8617337213160459e-01, }, { -5.9237075772564007e-01, }, { 7.0718006370171793e-01, }, { -4.9654609026089719e-01, }, { -5.8617337202427711e-01, }, { 5.9237075780163828e-01, }, { -2.7964041920953314e-01, }, { -3.6050674536265476e-01, }, { 6.7544587177826565e-01, }, { -4.1164020040882343e-01, } }; #endif ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/EnergyVisualizer/EnergyVisualizerGrid.jsonIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/EnergyVisualizer/EnergyVisualizerGri0000664002537200253720000016713415257173642032046 0ustar zmoelnigzmoelnig{ "Description" : "Cartesian and spherical coordinates of the EnergyVisualizer's 426-point grid.", "x" : [-0.989428233027905, -0.94562237517123438, -0.97653817229723083, -0.9589215425049169, -0.98867544588247824, -0.95892154250491679, -0.97653817229723083, -0.94562237517123438, -0.8611291433269268, -0.90596313391326455, -0.87329387676999282, -0.91550845659717472, -0.853005976182839, -0.90991995150389882, -0.853005976182839, -0.91550845659717472, -0.87329387676999282, -0.90596313391326455, -0.8611291433269268, -0.79501230438537918, -0.83029661458928494, -0.74131433526537283, -0.7909995000356862, -0.69443022574358737, -0.77120003770640355, -0.69443022574358737, -0.7909995000356862, -0.74131433526537283, -0.830296614589285, -0.79501230438537918, -0.7084289337574271, -0.75639574473324822, -0.671693594139846, -0.69740562672519, -0.565796078717367, -0.61967008938249135, -0.49914036122026817, -0.58910886481124225, -0.49914036122026817, -0.61967008938249135, -0.565796078717367, -0.69740562672518946, -0.671693594139846, -0.75639574473324844, -0.7084289337574271, -0.63578880451330455, -0.6510652764094137, -0.50601581936609574, -0.52284594190360856, -0.36182364198623596, -0.41692267240601072, -0.2816752392322821, -0.37879446564668046, -0.2816752392322821, -0.41692267240601072, -0.36182364198623596, -0.52284594190360856, -0.50601581936609574, -0.65106527640941425, -0.63578880451330455, -0.59406355775518038, -0.51491783695621851, -0.50125373644613047, -0.31266629474366164, -0.32149019791965894, -0.14334621098231232, -0.19685353171630268, -0.055154542350804789, -0.15395974554799582, -0.055154542350804789, -0.19685353171630268, -0.14334621098231232, -0.32149019791965838, -0.31266629474366164, -0.50125373644613136, -0.51491783695621851, -0.59406355775518038, -0.51723990890365068, -0.35813645747788386, -0.32107853426731159, -0.10593532535962329, -0.10734775411014962, 0.076927088897341719, 0.027793804570801141, 0.16873206582647687, 0.073137517642518926, 0.16873206582647685, 0.027793804570801141, 0.076927088897341719, -0.10734775411014963, -0.10593532535962329, -0.32107853426731153, -0.35813645747788386, -0.51723990890365068, -0.41017625752326192, -0.39923569231691663, -0.17923749366896338, -0.1250308586682381, 0.1005719913636212, 0.1066234997577299, 0.28762707223681083, 0.24567150099224064, 0.37973464499968468, 0.29168467357555738, 0.37973464499968462, 0.24567150099224064, 0.28762707223681083, 0.10662349975773046, 0.1005719913636212, -0.12503085866823868, -0.17923749366896338, -0.39923569231691663, -0.41017625752326214, -0.32005431801006917, -0.25041665829459026, 0.0065619957937038181, 0.072363248743749289, 0.29426214880030638, 0.30870777333893895, 0.47881751974206366, 0.44686631023507467, 0.569051519498278, 0.49231419939479937, 0.569051519498278, 0.44686631023507467, 0.47881751974206366, 0.308707773338939, 0.29426214880030638, 0.072363248743748387, 0.0065619957937038181, -0.25041665829459026, -0.32005431801006951, -0.20070155681837162, -0.084187208008073583, 0.18303324579757904, 0.25703093956542011, 0.46390296134897951, 0.48861785714056805, 0.64207936349823835, 0.6229340635398003, 0.729336636819478, 0.66710369973691064, 0.729336636819478, 0.6229340635398003, 0.64207936349823835, 0.4886178571405681, 0.46390296134897951, 0.25703093956542, 0.18303324579757904, -0.084187208008073583, -0.20070155681837176, -0.060887670498268653, 0.081951095935592855, 0.33387283654542532, 0.41598002486746927, 0.5999757337779692, 0.63767020905662375, 0.77058414869815461, 0.76692942851300172, 0.854705726246426, 0.809575906731543, 0.854705726246426, 0.76692942851300172, 0.77058414869815461, 0.63767020905662386, 0.5999757337779692, 0.41598002486746904, 0.33387283654542532, 0.081951095935592855, -0.060887670498268105, 0.079279895879067155, 0.22628589161077531, 0.44421736619701735, 0.53802221305675013, 0.69500437457812791, 0.748941175708626, 0.85915506593126645, 0.87343064723672637, 0.940741243162931, 0.91469868000133425, 0.940741243162931, 0.87343064723672637, 0.85915506593126645, 0.748941175708626, 0.69500437457812791, 0.53802221305675, 0.44421736619701735, 0.22628589161077531, 0.079279895879067558, 0.17599693312597767, 0.32535083529900866, 0.50255352882351878, 0.61451170162552049, 0.74383409240983211, 0.81739717339059925, 0.90431409325138068, 0.93855901281978116, 0.98449608748550044, 0.97888500666190836, 0.98449608748550033, 0.93855901281978116, 0.90431409325138068, 0.81739717339059936, 0.74383409240983211, 0.61451170162552, 0.50255352882351878, 0.32535083529900866, 0.17599693312597864, -0.0013227466940842578, 0.17599693312597775, 0.35998833559701332, 0.50255352882351878, 0.63999152504706647, 0.74383409240983211, 0.83999250141852788, 0.90431409325138079, 0.95999289196795967, 0.98449608748550044, 0.9999930013218753, 0.98449608748550033, 0.95999289196795967, 0.90431409325138079, 0.839992501418528, 0.74383409240983211, 0.63999152504706647, 0.50255352882351878, 0.35998833559701332, 0.17599693312597875, -0.0013227466940842578, 0.079279895879067155, 0.32283468078535987, 0.44421736619701735, 0.61263607740967, 0.69500437457812791, 0.81572983410625177, 0.85915506593126645, 0.93697615394646783, 0.940741243162931, 0.977325906082831, 0.940741243162931, 0.93697615394646783, 0.85915506593126645, 0.81572983410625188, 0.69500437457812791, 0.61263607740966985, 0.44421736619701735, 0.32283468078535987, 0.079279895879067558, -0.060887670498268549, 0.22177449618114994, 0.33387283654542549, 0.53440518945971827, 0.59997573377796931, 0.74568024443584235, 0.770584148698155, 0.87032092156909413, 0.85470572624642627, 0.91163209053935768, 0.85470572624642627, 0.87032092156909413, 0.770584148698155, 0.74568024443584269, 0.59997573377796931, 0.534405189459718, 0.33387283654542549, 0.22177449618114994, -0.060887670498267994, -0.20070155681837162, 0.076253809019891552, 0.18303324579757904, 0.41087884302695143, 0.46390296134897951, 0.63296170396166584, 0.64207936349823835, 0.76240461660885883, 0.729336636819478, 0.80510505177902292, 0.729336636819478, 0.76240461660885883, 0.64207936349823835, 0.632961703961666, 0.46390296134897951, 0.41087884302695127, 0.18303324579757904, 0.076253809019891552, -0.20070155681837176, -0.32005431801006917, -0.090239646018537414, 0.0065619957937040679, 0.25080566036358554, 0.29426214880030654, 0.48267719196242531, 0.47881751974206388, 0.617161329277089, 0.56905151949827826, 0.661383414382382, 0.56905151949827826, 0.617161329277089, 0.47881751974206388, 0.48267719196242559, 0.29426214880030654, 0.25080566036358543, 0.0065619957937040679, -0.090239646018537414, -0.32005431801006951, -0.41017625752326192, -0.25612202158127184, -0.17923749366896338, 0.065451277050613585, 0.1005719913636212, 0.30181563122906424, 0.28762707223681083, 0.44006759814169177, 0.37973464499968468, 0.48555093042297365, 0.37973464499968462, 0.44006759814169177, 0.28762707223681083, 0.30181563122906468, 0.1005719913636212, 0.065451277050613266, -0.17923749366896338, -0.25612202158127184, -0.41017625752326214, -0.40404983400147271, -0.35813645747788364, -0.13214144559497293, -0.10593532535962294, 0.099120661508992708, 0.076927088897342122, 0.23812274204495956, 0.16873206582647707, 0.28413647946732529, 0.16873206582647707, 0.23812274204495956, 0.076927088897342122, 0.099120661508992722, -0.10593532535962294, -0.13214144559497348, -0.35813645747788364, -0.40404983400147271, -0.52074726026037255, -0.51491783695621851, -0.3278734151146776, -0.31266629474366164, -0.11506638250603425, -0.14334621098231232, 0.019823938272352508, -0.055154542350804789, 0.065114068574948947, -0.055154542350804789, 0.019823938272352508, -0.14334621098231232, -0.11506638250603426, -0.31266629474366164, -0.32787341511467749, -0.51491783695621851, -0.52074726026037255, -0.59593591488260522, -0.63578880451330455, -0.50721232435235164, -0.50601581936609552, -0.32898209341939294, -0.36182364198623596, -0.20486370948021143, -0.28167523923228188, -0.1620971677016565, -0.28167523923228188, -0.20486370948021143, -0.36182364198623596, -0.32898209341939244, -0.50601581936609552, -0.5072123243523522, -0.63578880451330455, -0.59593591488260522, -0.7084289337574271, -0.655675362281081, -0.671693594139846, -0.52962774272594793, -0.565796078717367, -0.42454182469795182, -0.49914036122026817, -0.38663296731700841, -0.49914036122026817, -0.42454182469795182, -0.565796078717367, -0.529627742725948, -0.671693594139846, -0.65567536228108148, -0.7084289337574271, -0.75916297247481712, -0.795012304385379, -0.70295993195600792, -0.74131433526537227, -0.62641780435651429, -0.694430225743587, -0.59618394073263437, -0.694430225743587, -0.62641780435651429, -0.74131433526537227, -0.70295993195600737, -0.795012304385379, -0.75916297247481723, -0.8611291433269268, -0.83407858641754351, -0.87329387676999282, -0.79634789437509146, -0.853005976182839, -0.77699557091707838, -0.853005976182839, -0.79634789437509146, -0.87329387676999282, -0.83407858641754329, -0.8611291433269268, -0.9074067231374644, -0.94562237517123426, -0.91888390180491852, -0.95892154250491679, -0.91386821334589863, -0.95892154250491668, -0.91888390180491852, -0.94562237517123426, -0.90740672313746429, -0.97732312869673676, -0.990157096001666, -0.97732312869673676], "y" : [-0.14502334876590658, 0.10516091195246342, 0.070450506826574583, 0.26295030618542486, 0.15006952625061076, 0.26295030618542486, 0.070450506826574583, 0.10516091195246342, 0.048677437164362423, 0.10428127232973203, 0.36161643598064663, 0.33905045618789836, 0.50964430770037672, 0.41478389777707442, 0.50964430770037672, 0.33905045618789836, 0.36161643598064663, 0.10428127232973285, 0.048677437164362423, 0.2858146318456839, 0.34941469027490019, 0.577059356370298, 0.56779447376482761, 0.70987044190454907, 0.63659288547834225, 0.70987044190454907, 0.56779447376482761, 0.577059356370298, 0.34941469027490024, 0.2858146318456839, 0.02959574449826962, 0.18517965346228996, 0.48489941353137678, 0.55380829345905946, 0.74333215895898042, 0.74798298031953436, 0.85785248663564728, 0.80805367730170585, 0.85785248663564728, 0.74798298031953436, 0.74333215895898042, 0.55380829345906, 0.48489941353137678, 0.18517965346228929, 0.02959574449826962, 0.22388612418870393, 0.38089331196621884, 0.636833069318911, 0.70926816166, 0.85607398304439508, 0.874918731232357, 0.9511694876879262, 0.92548082248928631, 0.9511694876879262, 0.874918731232357, 0.85607398304439508, 0.70926816166, 0.636833069318911, 0.3808933119662179, 0.22388612418870393, 0.020796765907848576, 0.38235348708435191, 0.53310477466356254, 0.73613876542295353, 0.81128296954442525, 0.91396369817120859, 0.94701250681214821, 0.99002242207495472, 0.988077120851807, 0.99002242207495472, 0.94701250681214821, 0.91396369817120859, 0.81128296954442536, 0.73613876542295353, 0.53310477466356165, 0.38235348708435191, 0.020796765907848576, 0.18236614835183212, 0.49541118493620717, 0.63466959987904992, 0.7805343112851294, 0.858414290156182, 0.91817559351392286, 0.96515654838564335, 0.97670247984328662, 0.997321865554491, 0.97670247984328651, 0.96515654838564335, 0.91817559351392286, 0.85841429015618209, 0.7805343112851294, 0.63466959987904981, 0.49541118493620717, 0.18236614835183212, 0.047957087157740871, 0.30964372482880231, 0.55615151776505711, 0.68165661806374045, 0.77063640807825973, 0.85185005892223731, 0.87195695932850859, 0.9322552155911068, 0.91518381068672094, 0.956514532665929, 0.91518381068672083, 0.9322552155911068, 0.87195695932850859, 0.8518500589222372, 0.77063640807825973, 0.68165661806374023, 0.55615151776505711, 0.30964372482880231, 0.0479570871577409, 0.15383508547502925, 0.39250099379286774, 0.56080423024050707, 0.67334550750424416, 0.709709493779817, 0.79504144162431489, 0.78027801634293037, 0.85285306271472039, 0.81079681749980492, 0.87041756018261585, 0.81079681749980492, 0.85285306271472039, 0.78027801634293037, 0.79504144162431511, 0.709709493779817, 0.67334550750424427, 0.56080423024050707, 0.39250099379286774, 0.15383508547502941, 0.22419484725373706, 0.42213567136375907, 0.50944514822845888, 0.61225687199936851, 0.60340523972663873, 0.69337875107392843, 0.64952557585190318, 0.73282571473111024, 0.66995538943124355, 0.74496486749196822, 0.66995538943124355, 0.73282571473111024, 0.64952557585190318, 0.69337875107392855, 0.60340523972663873, 0.61225687199936829, 0.50944514822845888, 0.42213567136375907, 0.22419484725373723, 0.24529669659225309, 0.39257333922580839, 0.40673427430575182, 0.50411049022905641, 0.45945892861125803, 0.55388099505278954, 0.48722324403524375, 0.57911235069757172, 0.49992105081671656, 0.587015205288415, 0.49992105081671656, 0.57911235069757172, 0.48722324403524375, 0.55388099505278954, 0.45945892861125803, 0.50411049022905619, 0.40673427430575182, 0.39257333922580839, 0.24529669659225367, 0.19953620751483692, 0.30363073203448121, 0.26233626185686593, 0.3576211252604824, 0.28732444913433969, 0.384884848847874, 0.30176759898264788, 0.39947617244805805, 0.30859256342690228, 0.40413651753314334, 0.30859256342690228, 0.39947617244805805, 0.30176759898264788, 0.38488484884787383, 0.28732444913433969, 0.35762112526048229, 0.26233626185686593, 0.30363073203448121, 0.19953620751483792, 0.078969555154888751, 0.16472461001914751, 0.0906206615631628, 0.18406727126692463, 0.0977434319888648, 0.19572608851910697, 0.10217376149020091, 0.20228368607784558, 0.10431285226119984, 0.20441170155476796, 0.10431285226119982, 0.20228368607784558, 0.10217376149020091, 0.195726088519107, 0.0977434319888648, 0.18406727126692449, 0.0906206615631628, 0.16472461001914751, 0.078969555154889182, 3.4993390631858086E-6, -0.078969555154888516, -0.0030851294254100881, -0.090620661563162536, -0.0033878827477248348, -0.09774343198886451, -0.003588524489842624, -0.1021737614902006, -0.003703695159673284, -0.10431285226119952, -0.0037412975379981514, -0.1043128522611995, -0.003703695159673284, -0.1021737614902006, -0.0035885244898426231, -0.09774343198886451, -0.0033878827477248387, -0.090620661563162536, -0.0030851294254100881, -0.07896955515488896, 3.4993390631858086E-6, -0.19953620751483692, -0.17034073177417974, -0.26233626185686593, -0.190587307858797, -0.28732444913433969, -0.20271750480354181, -0.30176759898264788, -0.2095306044158747, -0.30859256342690228, -0.21174058019041458, -0.30859256342690228, -0.2095306044158747, -0.30176759898264788, -0.20271750480354184, -0.28732444913433969, -0.19058730785879693, -0.26233626185686593, -0.17034073177417974, -0.19953620751483792, -0.24529669659225312, -0.3077574770957261, -0.40673427430575165, -0.36339242067279393, -0.45945892861125787, -0.39132546687416669, -0.48722324403524336, -0.40624519132005521, -0.49992105081671634, -0.41100721587198485, -0.49992105081671634, -0.40624519132005521, -0.48722324403524336, -0.39132546687416664, -0.45945892861125787, -0.36339242067279381, -0.40673427430575165, -0.3077574770957261, -0.2452966965922537, -0.22419484725373706, -0.39467412372257271, -0.50944514822845888, -0.5086930550182831, -0.60340523972663873, -0.55942386269223454, -0.64952557585190318, -0.585096654221666, -0.66995538943124355, -0.593132241241274, -0.66995538943124355, -0.585096654221666, -0.64952557585190318, -0.55942386269223465, -0.60340523972663873, -0.508693055018283, -0.50944514822845888, -0.39467412372257271, -0.22419484725373723, -0.15383508547502925, -0.42207362946537791, -0.56080423024050707, -0.61529202483993461, -0.70970949377981685, -0.69770700437947086, -0.78027801634293026, -0.73773638757022364, -0.81079681749980481, -0.75004798458492128, -0.81079681749980481, -0.73773638757022364, -0.78027801634293026, -0.69770700437947075, -0.70970949377981685, -0.61529202483993439, -0.56080423024050707, -0.42207362946537791, -0.15383508547502941, -0.047957087157740871, -0.390411586864514, -0.55615151776505711, -0.67457557764084219, -0.77063640807825973, -0.7978798462300184, -0.87195695932850859, -0.85642672782577345, -0.91518381068672094, -0.87420838131728329, -0.91518381068672083, -0.85642672782577345, -0.87195695932850859, -0.79787984623001829, -0.77063640807825973, -0.67457557764084208, -0.55615151776505711, -0.390411586864514, -0.0479570871577409, -0.30580566222612315, -0.49541118493620728, -0.68093587052823434, -0.78053431128512951, -0.85297622318184441, -0.91817559351392286, -0.934262219847231, -0.97670247984328662, -0.95878384479293044, -0.97670247984328651, -0.934262219847231, -0.91817559351392286, -0.85297622318184452, -0.78053431128512951, -0.68093587052823423, -0.49541118493620728, -0.30580566222612315, -0.17712327984382462, -0.38235348708435191, -0.63196804045766808, -0.73613876542295353, -0.85766970271183318, -0.91396369817120859, -0.96540996954898972, -0.99002242207495472, -0.99787782722817164, -0.99002242207495472, -0.96540996954898972, -0.91396369817120859, -0.85766970271183329, -0.73613876542295353, -0.63196804045766786, -0.38235348708435191, -0.17712327984382462, -0.014528049607708819, -0.22388612418870393, -0.52850772453275841, -0.63683306931891137, -0.80858422686043452, -0.85607398304439508, -0.94537837819971893, -0.95116948768792631, -0.98677480116949734, -0.95116948768792631, -0.94537837819971893, -0.85607398304439508, -0.80858422686043485, -0.63683306931891137, -0.52850772453275763, -0.22388612418870393, -0.014528049607708819, -0.02959574449826962, -0.37460028005071766, -0.48489941353137678, -0.70461906881828829, -0.74333215895898042, -0.87132808607548462, -0.85785248663564728, -0.92223367352512409, -0.85785248663564728, -0.87132808607548462, -0.74333215895898042, -0.7046190688182884, -0.48489941353137678, -0.37460028005071677, -0.02959574449826962, -0.17750645812039359, -0.28581463184568423, -0.547314032585461, -0.57705935637029881, -0.74244667379906981, -0.7098704419045494, -0.80284787401630875, -0.7098704419045494, -0.74244667379906981, -0.57705935637029881, -0.54731403258546163, -0.28581463184568423, -0.17750645812039326, -0.048677437164362423, -0.34130015525555257, -0.36161643598064663, -0.56042238731049643, -0.50964430770037672, -0.62950606254049957, -0.50964430770037672, -0.56042238731049643, -0.36161643598064663, -0.34130015525555335, -0.048677437164362423, -0.094917443622638362, -0.10516091195246384, -0.33007793864252843, -0.26295030618542531, -0.406010946448461, -0.26295030618542531, -0.33007793864252843, -0.10516091195246384, -0.09491744362263875, -0.060277522057913181, -0.13996044168817004, -0.060277522057913181], "z" : [0, -0.30779783328158683, -0.20349428526192753, -0.106426555882365, 0, 0.10642655588236512, 0.20349428526192753, 0.30779783328158683, -0.50605049710887806, -0.41031233984776588, -0.32648331967298327, -0.21653880497000325, -0.11244324890790776, 0, 0.11244324890790788, 0.21653880497000325, 0.32648331967298327, 0.41031233984776577, 0.50605049710887806, -0.53503778567383953, -0.43418533602790871, -0.34271789500339134, -0.22787985102991656, -0.11768864551837875, 0, 0.11768864551837889, 0.22787985102991656, 0.34271789500339134, 0.43418533602790854, 0.53503778567383953, -0.70516135580653327, -0.62735474278355541, -0.56008952351246721, -0.45488654179697308, -0.35683623521922797, -0.23776131198536549, -0.12226205860338232, 0, 0.12226205860338248, 0.23776131198536549, 0.35683623521922797, 0.45488654179697297, 0.56008952351246721, 0.62735474278355541, 0.70516135580653327, -0.73867963248711765, -0.65653201807173, -0.58171439072203968, -0.47283273563742667, -0.3690812751337042, -0.24635888247147314, -0.12623654500549572, 0, 0.12623654500549589, 0.24635888247147314, 0.3690812751337042, 0.4728327356374265, 0.58171439072203968, 0.65653201807173, 0.73867963248711765, -0.8041492298541556, -0.76724535325980669, -0.68157464076189433, -0.60028285513817525, -0.48832775465742045, -0.37963432698087546, -0.2538030712820265, -0.12966719032551594, 0, 0.12966719032551607, 0.2538030712820265, 0.37963432698087546, 0.48832775465742034, 0.60028285513817525, 0.68157464076189433, 0.76724535325980669, 0.8041492298541556, -0.83618506598280062, -0.79139499345478237, -0.70292465728705344, -0.61607133981999151, -0.50159880994990924, -0.388633249309855, -0.26019289293866438, -0.13259621348252737, 0, 0.13259621348252754, 0.26019289293866438, 0.388633249309855, 0.501598809949909, 0.61607133981999151, 0.70292465728705356, 0.79139499345478237, 0.83618506598280062, -0.91074450619015845, -0.86297834599390566, -0.81152289564182456, -0.72091021592885407, -0.62928912361282208, -0.51281859015990661, -0.39618395777096, -0.26560445516481557, -0.13505625510836489, 0, 0.13505625510836505, 0.26560445516481557, 0.39618395777096, 0.5128185901599065, 0.62928912361282208, 0.72091021592885418, 0.81152289564182456, 0.86297834599390566, 0.91074450619015834, -0.93482618705297293, -0.88500534863930713, -0.82792243329647475, -0.73577808322557559, -0.64009547898905073, -0.52211935108751273, -0.40236799077461427, -0.27009656457461895, -0.13707256796634723, 0, 0.1370725679663474, 0.27009656457461895, 0.40236799077461427, 0.52211935108751251, 0.64009547898905073, 0.73577808322557559, 0.82792243329647475, 0.88500534863930713, 0.93482618705297282, -0.95365379229338543, -0.90261508350463193, -0.84081179337547751, -0.74771426280074815, -0.64861094588519319, -0.529602206606542, -0.40724761175966478, -0.27371449415518639, -0.13866451011301845, 0, 0.13866451011301861, 0.27371449415518639, 0.40724761175966478, 0.52960220660654189, 0.64861094588519319, 0.74771426280074837, 0.84081179337547751, 0.90261508350463193, 0.95365379229338532, -0.9675340935709823, -0.91606232932265785, -0.8503506095264971, -0.7568574717556007, -0.65492489019503775, -0.53534339241370443, -0.41086929825300122, -0.27649256219698448, -0.1398465747591956, 0, 0.13984657475919574, 0.27649256219698448, 0.41086929825300122, 0.53534339241370421, 0.65492489019503775, 0.756857471755601, 0.8503506095264971, 0.91606232932265785, 0.96753409357098219, -0.976678043164686, -0.92552853755144771, -0.85665081409168742, -0.76330808264091066, -0.65910058431692631, -0.53939852470648308, -0.41326612356796072, -0.27845590694737032, -0.14062909801984982, 0, 0.14062909801985, 0.27845590694737032, 0.41326612356796072, 0.539398524706483, 0.65910058431692631, 0.76330808264091088, 0.85665081409168742, 0.92552853755144771, 0.97667804316468576, -0.9812180638822795, -0.93113513349259736, -0.8597836043824536, -0.76713402232833849, -0.661178542053415, -0.54180546251036388, -0.41445933842763955, -0.27962169050615027, -0.14101873130501197, 0, 0.14101873130501213, 0.27962169050615027, 0.41445933842763955, 0.54180546251036366, 0.661178542053415, 0.76713402232833872, 0.8597836043824536, 0.93113513349259736, 0.98121806388227928, -0.99999912516408629, -0.9812180638822795, -0.932951703042832, -0.8597836043824536, -0.76837449861276486, -0.661178542053415, -0.54258614067503619, -0.41445933842763955, -0.27999987502346763, -0.14101873130501197, 0, 0.14101873130501213, 0.27999987502346763, 0.41445933842763955, 0.54258614067503608, 0.661178542053415, 0.76837449861276486, 0.8597836043824536, 0.932951703042832, 0.98121806388227928, 0.99999912516408629, -0.976678043164686, -0.93100043178338632, -0.85665081409168742, -0.76704205539150783, -0.65910058431692631, -0.54174758974564252, -0.41326612356796072, -0.27959365648884665, -0.14062909801984982, 0, 0.14062909801985, 0.27959365648884665, 0.41326612356796072, 0.5417475897456423, 0.65910058431692631, 0.767042055391508, 0.85665081409168742, 0.93100043178338632, 0.97667804316468576, -0.9675340935709823, -0.9252574820747308, -0.8503506095264971, -0.76312321552688311, -0.65492489019503775, -0.5392822563684232, -0.41086929825300122, -0.27839960130800184, -0.1398465747591956, 0, 0.13984657475919574, 0.27839960130800184, 0.41086929825300122, 0.53928225636842309, 0.65492489019503775, 0.76312321552688334, 0.8503506095264971, 0.9252574820747308, 0.96753409357098219, -0.95365379229338543, -0.9156515126803304, -0.84081179337547751, -0.7565777898729249, -0.64861094588519319, -0.5351676589335761, -0.40724761175966478, -0.2764074995221929, -0.13866451011301845, 0, 0.13866451011301861, 0.2764074995221929, 0.40724761175966478, 0.53516765893357587, 0.64861094588519319, 0.75657778987292512, 0.84081179337547751, 0.9156515126803304, 0.95365379229338532, -0.93482618705297293, -0.9020591208986094, -0.82792243329647475, -0.74733676806240379, -0.64009547898905073, -0.52936534113888967, -0.40236799077461427, -0.27359991977296561, -0.13707256796634723, 0, 0.1370725679663474, 0.27359991977296561, 0.40236799077461427, 0.52936534113888956, 0.64009547898905073, 0.747336768062404, 0.82792243329647475, 0.9020591208986094, 0.93482618705297282, -0.91074450619015845, -0.88429650169106433, -0.81152289564182456, -0.73529852467074075, -0.62928912361282208, -0.52181900667354353, -0.39618395777096, -0.26995141957663576, -0.13505625510836489, 0, 0.13505625510836505, 0.26995141957663576, 0.39618395777096, 0.52181900667354331, 0.62928912361282208, 0.73529852467074086, 0.81152289564182456, 0.88429650169106433, 0.91074450619015834, -0.86210592655069052, -0.79139499345478237, -0.720322829420272, -0.61607133981999151, -0.51245161444614085, -0.388633249309855, -0.2654273239271232, -0.13259621348252737, 0, 0.13259621348252754, 0.2654273239271232, 0.388633249309855, 0.51245161444614062, 0.61607133981999151, 0.72032282942027215, 0.79139499345478237, 0.86210592655069052, -0.83513450094501673, -0.76724535325980669, -0.70222177373044592, -0.60028285513817525, -0.50116106060544119, -0.37963432698087546, -0.25998192661566422, -0.12966719032551594, 0, 0.12966719032551607, 0.25998192661566422, 0.37963432698087546, 0.501161060605441, 0.60028285513817525, 0.70222177373044614, 0.76724535325980669, 0.83513450094501673, -0.80290056739774962, -0.73867963248711765, -0.68074609299965194, -0.58171439072203968, -0.48781382748125035, -0.3690812751337042, -0.25355587662382567, -0.12623654500549572, 0, 0.12623654500549589, 0.25355587662382567, 0.3690812751337042, 0.48781382748125024, 0.58171439072203968, 0.680746092999652, 0.73867963248711765, 0.80290056739774962, -0.70516135580653327, -0.65556422224180078, -0.56008952351246721, -0.47223555773857756, -0.35683623521922797, -0.24607235825701007, -0.12226205860338232, 0, 0.12226205860338248, 0.24607235825701007, 0.35683623521922797, 0.47223555773857739, 0.56008952351246721, 0.65556422224180078, 0.70516135580653327, -0.62622922204952469, -0.53503778567383953, -0.45419674569446861, -0.34271789500339139, -0.23743140261949641, -0.11768864551837875, 0, 0.11768864551837889, 0.23743140261949641, 0.34271789500339139, 0.4541967456944685, 0.53503778567383953, 0.62622922204952469, -0.50605049710887806, -0.43339025796878267, -0.32648331967298327, -0.22750116247079261, -0.11244324890790776, 0, 0.11244324890790788, 0.22750116247079261, 0.32648331967298327, 0.43339025796878256, 0.50605049710887806, -0.40939433032355521, -0.30779783328158689, -0.21610397827265473, -0.10642655588236502, 0, 0.10642655588236513, 0.21610397827265473, 0.30779783328158689, 0.40939433032355516, -0.20299291231217795, 0, 0.20299291231217795], "azimuthInRadians" : [-2.9960560828851843, 3.0308395810714948, 3.0695743073934971, 2.8739567509261343, 2.9909540585654026, 2.8739567509261343, 3.0695743073934971, 3.0308395810714948, 3.0851252938220028, 3.0269915782803181, 2.7490047378605453, 2.7869126959441584, 2.6030365373132187, 2.7138873593374244, 2.6030365373132187, 2.7869126959441584, 2.7490047378605453, 3.0269915782803172, 3.0851252938220028, 2.7964711918294651, 2.7432583405093767, 2.4801448762705265, 2.5190074640120468, 2.3451999828350369, 2.4515204264201591, 2.3451999828350369, 2.5190074640120468, 2.4801448762705265, 2.7432583405093767, 2.7964711918294651, 3.0998403430300123, 2.9014966330300704, 2.5163156835557889, 2.4704609725220426, 2.2214028286972898, 2.2626485513405772, 2.0977623599213335, 2.2007519068346362, 2.0977623599213335, 2.2626485513405772, 2.2214028286972898, 2.4704609725220417, 2.5163156835557889, 2.9014966330300713, 3.0998403430300123, 2.8030134122072292, 2.6122525542950452, 2.2422246038918221, 2.2060307293177468, 1.9706787580757059, 2.015490076012151, 1.858704129476882, 1.9592896721962199, 1.858704129476882, 2.015490076012151, 1.9706787580757059, 2.2060307293177468, 2.2422246038918221, 2.6122525542950465, 2.8030134122072292, 3.1065992995027938, 2.5028750584934358, 2.3254111820545118, 1.9724452530693912, 1.9480863544439282, 1.7263691101924183, 1.7757456330362789, 1.6264491959041667, 1.7253708866341413, 1.6264491959041667, 1.7757456330362789, 1.7263691101924183, 1.9480863544439277, 1.9724452530693912, 2.3254111820545136, 2.5028750584934358, 3.1065992995027938, 2.8026251976062495, 2.19673158077513, 2.0391517639208372, 1.7056936204631721, 1.6952040468673826, 1.4872089968745159, 1.5420070847784573, 1.3997279591673446, 1.49759344842734, 1.3997279591673446, 1.5420070847784573, 1.4872089968745159, 1.6952040468673826, 1.7056936204631721, 2.0391517639208372, 2.19673158077513, 2.8026251976062495, 3.025202836282205, 2.4819132802899988, 1.8825677157195131, 1.7522019378374203, 1.4410246365994521, 1.4462769240087188, 1.2521715583348578, 1.31313037171311, 1.1774882813093068, 1.2748086979434188, 1.1774882813093068, 1.31313037171311, 1.2521715583348578, 1.4462769240087181, 1.4410246365994521, 1.7522019378374212, 1.8825677157195131, 2.4819132802899988, 3.025202836282205, 2.6935420478681622, 2.1386912416994917, 1.559095815302485, 1.463738986795952, 1.1777474949569553, 1.200424120427467, 1.020400552110339, 1.0881599750163828, 0.9588349758639817, 1.0560498435832424, 0.9588349758639817, 1.0881599750163828, 1.020400552110339, 1.200424120427467, 1.1777474949569553, 1.4637389867959534, 1.559095815302485, 2.1386912416994917, 2.6935420478681622, 2.3009589247086728, 1.7676453241476662, 1.2258786461577957, 1.1733307138775428, 0.91536616723720476, 0.95692888534990694, 0.79116318460001567, 0.86627674919093134, 0.74298697344602893, 0.84048217531117209, 0.74298697344602893, 0.86627674919093134, 0.79116318460001567, 0.95692888534990694, 0.91536616723720476, 1.1733307138775428, 1.2258786461577957, 1.7676453241476662, 2.3009589247086728, 1.8140994734039368, 1.364998191348733, 0.8834632818421867, 0.88089139470572508, 0.65353404545960991, 0.71519428596976453, 0.5638156739496849, 0.64676039772080229, 0.52924576399881185, 0.62736702902110264, 0.52924576399881185, 0.64676039772080229, 0.5638156739496849, 0.71519428596976442, 0.65353404545960991, 0.88089139470572519, 0.8834632818421867, 1.364998191348733, 1.8140994734039342, 1.1926016920159646, 0.9303313809300503, 0.53344816283483387, 0.58663694166882574, 0.39201630982090152, 0.4747098754115936, 0.337776969505417, 0.4289613437272683, 0.31697114942808269, 0.41603462597346785, 0.31697114942808269, 0.4289613437272683, 0.337776969505417, 0.47470987541159343, 0.39201630982090152, 0.58663694166882574, 0.53344816283483387, 0.9303313809300503, 1.1926016920159646, 0.42177104823675521, 0.46867363076025265, 0.17840328156293922, 0.29102940075425, 0.13065629028655615, 0.23502525848550415, 0.11250769340328891, 0.21227867850416987, 0.10556172147276406, 0.20586268119898793, 0.10556172147276406, 0.21227867850416987, 0.11250769340328891, 0.23502525848550415, 0.13065629028655615, 0.29102940075425, 0.17840328156293922, 0.46867363076025265, 0.42177104823675515, 3.1389471501723683, -0.42177104823675388, -0.008569871835362796, -0.17840328156293872, -0.0052935874459529263, -0.13065629028655576, -0.00427206511119928, -0.11250769340328856, -0.0038580252155343457, -0.10556172147276374, -0.0037413062660683312, -0.10556172147276373, -0.0038580252155343457, -0.11250769340328856, -0.0042720651111992792, -0.13065629028655576, -0.0052935874459529323, -0.17840328156293872, -0.008569871835362796, -0.42177104823675382, 3.1389471501723683, -1.1926016920159646, -0.48551490962192473, -0.53344816283483387, -0.30160329627390486, -0.39201630982090152, -0.24357637779540167, -0.337776969505417, -0.22000461348781911, -0.31697114942808269, -0.21335557912607792, -0.31697114942808269, -0.22000461348781911, -0.337776969505417, -0.24357637779540167, -0.39201630982090152, -0.30160329627390481, -0.53344816283483387, -0.48551490962192473, -1.1926016920159646, -1.8140994734039364, -0.94636869860308848, -0.88346328184218637, -0.59717268098205967, -0.65353404545960969, -0.48328229002070888, -0.56381567394968435, -0.43671719447703827, -0.52924576399881162, -0.42355863645031849, -0.52924576399881162, -0.43671719447703827, -0.56381567394968435, -0.4832822900207086, -0.65353404545960969, -0.59717268098205967, -0.88346328184218637, -0.94636869860308848, -1.8140994734039337, -2.3009589247086728, -1.3799409346524056, -1.2258786461577957, -0.89136898808025589, -0.91536616723720476, -0.72380330621405209, -0.79116318460001567, -0.65456700056242578, -0.74298697344602893, -0.63494376627960114, -0.74298697344602893, -0.65456700056242578, -0.79116318460001567, -0.72380330621405209, -0.91536616723720476, -0.891368988080256, -1.2258786461577957, -1.3799409346524056, -2.3009589247086728, -2.6935420478681622, -1.7814259124474605, -1.5590958153024845, -1.1837378399749452, -1.1777474949569551, -0.96559156527650292, -1.0204005521103388, -0.87415634762160122, -0.95883497586398148, -0.84813462783898552, -0.95883497586398148, -0.87415634762160122, -1.0204005521103388, -0.96559156527650258, -1.1777474949569551, -1.1837378399749452, -1.5590958153024845, -1.7814259124474605, -2.6935420478681622, -3.025202836282205, -2.1513994420897609, -1.8825677157195131, -1.4740732240357877, -1.4410246365994521, -1.209160115595701, -1.2521715583348578, -1.0961369298253898, -1.1774882813093068, -1.0638030644097818, -1.1774882813093068, -1.0961369298253898, -1.2521715583348578, -1.2091601155957006, -1.4410246365994521, -1.4740732240357881, -1.8825677157195131, -2.1513994420897609, -3.025202836282205, -2.4937210817953379, -2.1967315807751295, -1.7624725066879161, -1.7056936204631716, -1.4551095441463151, -1.4872089968745155, -1.3212320451595403, -1.3997279591673444, -1.28269066048167, -1.3997279591673444, -1.3212320451595403, -1.4872089968745155, -1.4551095441463151, -1.7056936204631716, -1.7624725066879168, -2.1967315807751295, -2.4937210817953379, -2.8137350159535912, -2.5028750584934358, -2.0493810380811253, -1.9724452530693912, -1.7041616189019273, -1.7263691101924183, -1.5502649946969136, -1.6264491959041667, -1.5056361579833759, -1.6264491959041667, -1.5502649946969136, -1.7263691101924183, -1.7041616189019273, -1.9724452530693912, -2.0493810380811253, -2.5028750584934358, -2.8137350159535912, -3.1172189378942234, -2.8030134122072292, -2.3356364252353505, -2.2422246038918217, -1.9572040798035435, -1.9706787580757059, -1.7841970245562802, -1.8587041294768818, -1.7336118853734275, -1.8587041294768818, -1.7841970245562802, -1.9706787580757059, -1.9572040798035426, -2.2422246038918217, -2.3356364252353519, -2.8030134122072292, -3.1172189378942234, -3.0998403430300123, -2.6225285824137092, -2.5163156835557889, -2.21535334280785, -2.2214028286972898, -2.0241801502113406, -2.0977623599213335, -1.9677741590203226, -2.0977623599213335, -2.0241801502113406, -2.2214028286972898, -2.21535334280785, -2.5163156835557889, -2.6225285824137106, -3.0998403430300123, -2.9119005156409576, -2.7964711918294647, -2.4800467429804711, -2.4801448762705256, -2.2716337583714807, -2.3451999828350365, -2.2095358457714775, -2.3451999828350365, -2.2716337583714807, -2.4801448762705256, -2.4800467429804702, -2.7964711918294647, -2.9119005156409581, -3.0851252938220028, -2.7531854194857162, -2.7490047378605453, -2.5283605930939421, -2.6030365373132187, -2.46067530762723, -2.6030365373132187, -2.5283605930939421, -2.7490047378605453, -2.7531854194857153, -3.0851252938220028, -3.0373687067377162, -3.0308395810714943, -2.7967311633910943, -2.8739567509261339, -2.7235078666234807, -2.8739567509261339, -2.7967311633910943, -3.0308395810714943, -3.0373687067377158, -3.0799945357994409, -3.0011711905438685, -3.0799945357994409], "elevationInRadians" : [0, -0.31287763002792568, -0.2049255673751002, -0.10662849558070053, 0, 0.10662849558070066, 0.2049255673751002, 0.31287763002792568, -0.53059949297468978, -0.42279653434545617, -0.33258061703040692, -0.21826775698568443, -0.11268155300132326, 0, 0.11268155300132339, 0.21826775698568443, 0.33258061703040692, 0.42279653434545605, 0.53059949297468978, -0.56455247237179085, -0.4491337248210614, -0.3498084826585407, -0.22989968703972624, -0.1179620296435841, 0, 0.11796202964358424, 0.22989968703972624, 0.3498084826585407, 0.44913372482106118, 0.56455247237179085, -0.782650687293933, -0.6781516738652289, -0.59449385984543013, -0.47224480750180292, -0.36487897038022915, -0.24006041768532532, -0.12256872168220534, 0, 0.12256872168220549, 0.24006041768532532, 0.36487897038022915, 0.47224480750180292, 0.59449385984543013, 0.6781516738652289, 0.782650687293933, -0.8311094125712839, -0.71621188084667864, -0.62083480859008233, -0.49250282393975331, -0.37802030942184123, -0.24892154018520668, -0.12657424957273644, 0, 0.12657424957273661, 0.24892154018520668, 0.37802030942184123, 0.49250282393975325, 0.62083480859008233, 0.71621188084667864, 0.8311094125712839, -0.93424283645665884, -0.87453499615365049, -0.74991237170989777, -0.64385472461492854, -0.51017246173866571, -0.38940100060253569, -0.25661005410898508, -0.1300333290115695, 0, 0.13003332901156964, 0.25661005410898508, 0.38940100060253569, 0.51017246173866559, 0.64385472461492854, 0.74991237170989777, 0.87453499615365049, 0.93424283645665884, -0.99029000452155314, -0.913087630548229, -0.77950110050556709, -0.66374534701411891, -0.52544590828877058, -0.39914777448623517, -0.26322197134947478, -0.13298786584424671, 0, 0.13298786584424688, 0.26322197134947478, 0.39914777448623517, 0.52544590828877036, 0.66374534701411891, 0.7795011005055672, 0.913087630548229, 0.99029000452155314, -1.1450833013705817, -1.041135226361777, -0.94675368531668225, -0.80511481227954984, -0.68063817525949422, -0.5384647513393318, -0.40735696681548333, -0.26883084301087451, -0.1354702375342979, 0, 0.1354702375342981, 0.26883084301087451, 0.40735696681548333, 0.53846475133933169, 0.68063817525949422, 0.80511481227955006, 0.94675368531668225, 1.041135226361777, 1.1450833013705815, -1.2077692804198195, -1.0865054990232932, -0.97539312482772156, -0.82681489758918858, -0.69462253299890608, -0.54933402270807985, -0.41410199705216322, -0.27349332216428363, -0.13750547851556788, 0, 0.13750547851556805, 0.27349332216428363, 0.41410199705216322, 0.54933402270807952, 0.69462253299890608, 0.82681489758918858, 0.97539312482772156, 1.0865054990232932, 1.207769280419819, -1.2651537435610658, -1.125806590647054, -0.99878111473971165, -0.84461310637786691, -0.70575800133629207, -0.55813153678445315, -0.41943841502733392, -0.2772529004485213, -0.13911276961064467, 0, 0.13911276961064484, 0.2772529004485213, 0.41943841502733392, 0.55813153678445282, 0.70575800133629207, 0.84461310637786713, 0.99878111473971165, 1.125806590647054, 1.2651537435610656, -1.3152846210077103, -1.1581489206383797, -1.0166512193089066, -0.85849145818471517, -0.714083224368267, -0.56491425218247249, -0.42340735511898231, -0.2801424646616188, -0.14030646512869493, 0, 0.14030646512869507, 0.2801424646616188, 0.42340735511898231, 0.56491425218247227, 0.714083224368267, 0.85849145818471562, 1.0166512193089066, 1.1581489206383797, 1.3152846210077098, -1.3544023474006803, -1.1824289663572651, -1.0287422814601745, -0.86841833626613085, -0.71962218883204865, -0.56972264757739677, -0.42603789668006053, -0.28218605535332159, -0.14109679860798402, 0, 0.14109679860798419, 0.28218605535332159, 0.42603789668006053, 0.56972264757739666, 0.71962218883204865, 0.86841833626613119, 1.0287422814601745, 1.1824289663572651, 1.3544023474006792, -1.3766776728925689, -1.1975133091521721, -1.0348457632448564, -0.87436142675666528, -0.72238858620947333, -0.572583697387741, -0.42734863323613886, -0.2834000594530045, -0.14149035380777275, 0, 0.14149035380777289, 0.2834000594530045, 0.42734863323613886, 0.57258369738774073, 0.72238858620947333, 0.87436142675666584, 1.0348457632448564, 1.1975133091521721, 1.3766776728925678, -1.5694735750863227, -1.3766776728925689, -1.2025267663273684, -1.0348457632448564, -0.87629742073237282, -0.72238858620947333, -0.57351279731004956, -0.42734863323613886, -0.28379397902444242, -0.14149035380777275, 0, 0.14149035380777292, 0.28379397902444242, 0.42734863323613886, 0.57351279731004945, 0.72238858620947333, 0.87629742073237282, 1.0348457632448564, 1.2025267663273684, 1.3766776728925678, 1.5694735750863227, -1.3544023474006803, -1.1971441078079408, -1.0287422814601745, -0.874218073773897, -0.71962218883204865, -0.57251484407361775, -0.42603789668006053, -0.28337086082937124, -0.14109679860798402, 0, 0.14109679860798419, 0.28337086082937124, 0.42603789668006053, 0.57251484407361752, 0.71962218883204865, 0.87421807377389726, 1.0287422814601745, 1.1971441078079408, 1.3544023474006792, -1.3152846210077103, -1.1817137969867002, -1.0166512193089066, -0.86813222796730893, -0.714083224368267, -0.56958457607025847, -0.42340735511898231, -0.28212743156371167, -0.14030646512869493, 0, 0.14030646512869507, 0.28212743156371167, 0.42340735511898231, 0.56958457607025825, 0.714083224368267, 0.86813222796730938, 1.0166512193089066, 1.1817137969867002, 1.3152846210077098, -1.2651537435610658, -1.1571257275276221, -0.99878111473971165, -0.85806364117011713, -0.70575800133629207, -0.56470620728947774, -0.41943841502733392, -0.2800539525174674, -0.13911276961064467, 0, 0.13911276961064484, 0.2800539525174674, 0.41943841502733392, 0.5647062072894774, 0.70575800133629207, 0.85806364117011746, 0.99878111473971165, 1.1571257275276221, 1.2651537435610656, -1.2077692804198195, -1.1245167458218877, -0.97539312482772156, -0.84404478967417607, -0.69462253299890608, -0.5578523196834938, -0.41410199705216322, -0.27713377887267904, -0.13750547851556788, 0, 0.13750547851556805, 0.27713377887267904, 0.41410199705216322, 0.55785231968349369, 0.69462253299890608, 0.8440447896741764, 0.97539312482772156, 1.1245167458218877, 1.207769280419819, -1.1450833013705817, -1.0849851949864247, -0.94675368531668225, -0.82610704440030291, -0.68063817525949422, -0.54898190433582039, -0.40735696681548333, -0.27334257754533026, -0.1354702375342979, 0, 0.1354702375342981, 0.27334257754533026, 0.40735696681548333, 0.54898190433582028, 0.68063817525949422, 0.82610704440030314, 0.94675368531668225, 1.0849851949864247, 1.1450833013705815, -1.0394110248943884, -0.913087630548229, -0.80426762072347169, -0.66374534701411891, -0.53803734287319671, -0.39914777448623517, -0.26864711720781576, -0.13298786584424671, 0, 0.13298786584424688, 0.26864711720781576, 0.39914777448623517, 0.53803734287319649, 0.66374534701411891, 0.80426762072347169, 0.913087630548229, 1.0394110248943884, -0.988377266699848, -0.87453499615365049, -0.7785133653389863, -0.64385472461492854, -0.52493997257803571, -0.38940100060253569, -0.26300348586463984, -0.1300333290115695, 0, 0.13003332901156964, 0.26300348586463984, 0.38940100060253569, 0.52493997257803549, 0.64385472461492854, 0.77851336533898674, 0.87453499615365049, 0.988377266699848, -0.93214519751506764, -0.8311094125712839, -0.74878068319038127, -0.62083480859008233, -0.509583638631291, -0.37802030942184123, -0.2563544998446835, -0.12657424957273644, 0, 0.12657424957273661, 0.2563544998446835, 0.37802030942184123, 0.50958363863129086, 0.62083480859008233, 0.74878068319038138, 0.8311094125712839, 0.93214519751506764, -0.782650687293933, -0.71492955462224683, -0.59449385984543013, -0.491825223187094, -0.36487897038022915, -0.24862591517680549, -0.12256872168220534, 0, 0.12256872168220549, 0.24862591517680549, 0.36487897038022915, 0.49182522318709382, 0.59449385984543013, 0.71492955462224683, 0.782650687293933, -0.6767071919239791, -0.56455247237179085, -0.47147038693914955, -0.34980848265854075, -0.23972078251623014, -0.1179620296435841, 0, 0.11796202964358424, 0.23972078251623014, 0.34980848265854075, 0.47147038693914944, 0.56455247237179085, 0.6767071919239791, -0.53059949297468978, -0.4482512999495652, -0.33258061703040692, -0.22951078336011502, -0.11268155300132326, 0, 0.11268155300132339, 0.22951078336011502, 0.33258061703040692, 0.44825129994956503, 0.53059949297468978, -0.42179011200224753, -0.31287763002792573, -0.21782238485594854, -0.10662849558070055, 0, 0.10662849558070067, 0.21782238485594854, 0.31287763002792573, 0.42179011200224753, -0.20441350679511722, 0, 0.20441350679511722], "azimuthInDegrees" : [-171.66136873381865, 173.65431637659518, 175.87365271544019, 164.66559233119824, 171.369044273322, 164.66559233119824, 175.87365271544019, 173.65431637659518, 176.76465860505877, 173.43384205710618, 157.50636934087649, 159.67833534902633, 149.14300750639546, 155.49429176393829, 149.14300750639546, 159.67833534902633, 157.50636934087649, 173.43384205710612, 176.76465860505877, 160.22599682174757, 157.17712502524935, 142.10183399129693, 144.32849624984289, 134.37006113060073, 140.461773823987, 134.37006113060073, 144.32849624984289, 142.10183399129693, 157.17712502524935, 160.22599682174757, 177.60776882000505, 166.24351134404168, 144.17426859032349, 141.54698717729786, 127.2770066827773, 129.64021251320486, 120.19292964489595, 126.09379601699281, 120.19292964489595, 129.64021251320486, 127.2770066827773, 141.54698717729781, 144.17426859032349, 166.24351134404171, 177.60776882000505, 160.60083843803793, 149.67104638337503, 128.47000652339418, 126.39625026607382, 112.91157561382055, 115.47907500599773, 106.49590198256305, 112.25902906041395, 106.49590198256305, 115.47907500599773, 112.91157561382055, 126.39625026607382, 128.47000652339418, 149.67104638337509, 160.60083843803793, 177.99502849980806, 143.40417750023292, 133.23624636425143, 113.01278832148969, 111.61712623666365, 98.913663895780914, 101.74273026176542, 93.188674517755175, 98.856469898881116, 93.188674517755175, 101.74273026176542, 98.913663895780914, 111.61712623666362, 113.01278832148969, 133.23624636425154, 143.40417750023292, 177.99502849980806, 160.57859537985644, 125.86344830151663, 116.83478985932119, 97.729045594929033, 97.128037298998422, 85.2107987747946, 88.350497937077336, 80.198504526748863, 85.8057840213295, 80.198504526748863, 88.350497937077336, 85.2107987747946, 97.128037298998422, 97.729045594929033, 116.83478985932119, 125.86344830151663, 160.57859537985644, 173.33135468997651, 142.20315607808666, 107.86318475831227, 100.39377589272841, 82.5646298515218, 82.865563752862471, 71.74414551890672, 75.236828249606177, 67.4651089451363, 73.041158078725687, 67.4651089451363, 75.236828249606177, 71.74414551890672, 82.865563752862442, 82.5646298515218, 100.39377589272846, 107.86318475831227, 142.20315607808666, 173.33135468997651, 154.32859128387045, 122.53798183097433, 89.3296100733405, 83.866066252163378, 67.479960793138744, 68.779235726197939, 58.464645048741453, 62.346974003499838, 54.937197366534306, 60.507198992770533, 54.937197366534306, 62.346974003499838, 58.464645048741453, 68.779235726197939, 67.479960793138744, 83.866066252163463, 89.3296100733405, 122.53798183097433, 154.32859128387045, 131.83523521876711, 101.27861674969563, 70.237672620052919, 67.226897878255173, 52.446618091758126, 54.8279864247079, 45.330311383710544, 49.634001618953313, 42.570017811656022, 48.156081401304718, 42.570017811656022, 49.634001618953313, 45.330311383710544, 54.8279864247079, 52.446618091758126, 67.226897878255173, 70.237672620052919, 101.27861674969563, 131.83523521876711, 103.9402434429507, 78.208635407273164, 50.618717404334028, 50.4713591260308, 37.444742572946524, 40.977614117939979, 32.304258540641058, 37.056641145604523, 30.323548602308726, 35.945482968570616, 30.323548602308726, 37.056641145604523, 32.304258540641058, 40.977614117939972, 37.444742572946524, 50.471359126030805, 50.618717404334028, 78.208635407273164, 103.94024344295056, 68.331043592675613, 53.304061675869562, 30.564328319443476, 33.611820864085971, 22.460880053030539, 27.198872354265443, 19.353194769379506, 24.577674569833086, 18.161109089639695, 23.837028199583486, 18.161109089639695, 24.577674569833086, 19.353194769379506, 27.198872354265436, 22.460880053030539, 33.611820864085971, 30.564328319443476, 53.304061675869562, 68.331043592675613, 24.165700984774737, 26.853021011635196, 10.22175508484051, 16.674756377439984, 7.4860540002558, 13.465955390190626, 6.4462159947603084, 12.162672358903405, 6.0482411185248983, 11.795062791949171, 6.0482411185248983, 12.162672358903405, 6.4462159947603084, 13.465955390190626, 7.4860540002558, 16.674756377439984, 10.22175508484051, 26.853021011635196, 24.16570098477473, 179.84842381949412, -24.165700984774659, -0.49101748713432086, -10.221755084840481, -0.30330021913653943, -7.4860540002557787, -0.24477130067680547, -6.4462159947602879, -0.2210485621051678, -6.0482411185248788, -0.21436105891156443, -6.0482411185248788, -0.2210485621051678, -6.4462159947602879, -0.24477130067680541, -7.4860540002557787, -0.30330021913653982, -10.221755084840481, -0.49101748713432086, -24.165700984774656, 179.84842381949412, -68.331043592675613, -27.817955212011888, -30.564328319443476, -17.280595963728498, -22.460880053030539, -13.955898436760576, -19.353194769379506, -12.60533582625898, -18.161109089639695, -12.224374219493749, -18.161109089639695, -12.60533582625898, -19.353194769379506, -13.955898436760576, -22.460880053030539, -17.280595963728491, -30.564328319443476, -27.817955212011888, -68.331043592675613, -103.94024344295069, -54.222932293245222, -50.618717404334014, -34.21547426078434, -37.444742572946517, -27.690035531604043, -32.30425854064103, -25.02205208432828, -30.323548602308712, -24.26812224491924, -30.323548602308712, -25.02205208432828, -32.30425854064103, -27.690035531604025, -37.444742572946517, -34.21547426078434, -50.618717404334014, -54.222932293245222, -103.94024344295055, -131.83523521876711, -79.064791532920978, -70.237672620052919, -51.071681005845647, -52.446618091758126, -41.470874643680339, -45.330311383710544, -37.503926540764382, -42.570017811656022, -36.379598035962104, -42.570017811656022, -37.503926540764382, -45.330311383710544, -41.470874643680339, -52.446618091758126, -51.071681005845655, -70.237672620052919, -79.064791532920978, -131.83523521876711, -154.32859128387045, -102.06818629848119, -89.329610073340476, -67.8231822804968, -67.47996079313873, -55.324321423774542, -58.464645048741438, -50.085469353288609, -54.937197366534292, -48.594534634072645, -54.937197366534292, -50.085469353288609, -58.464645048741438, -55.324321423774528, -67.47996079313873, -67.8231822804968, -89.329610073340476, -102.06818629848119, -154.32859128387045, -173.33135468997651, -123.26610807854327, -107.86318475831227, -84.458174430492889, -82.5646298515218, -69.27977137918441, -71.74414551890672, -62.804019847422524, -67.4651089451363, -60.951425823764176, -67.4651089451363, -62.804019847422524, -71.74414551890672, -69.2797713791844, -82.5646298515218, -84.4581744304929, -107.86318475831227, -123.26610807854327, -173.33135468997651, -142.87969326967081, -125.86344830151661, -100.98223614106035, -97.729045594929, -83.371635608789, -85.210798774794583, -75.70101994507985, -80.198504526748863, -73.4927612664477, -80.198504526748863, -75.70101994507985, -85.210798774794583, -83.371635608789, -97.729045594929, -100.9822361410604, -125.86344830151661, -142.87969326967081, -161.21514108231614, -143.40417750023292, -117.42088409618792, -113.01278832148969, -97.641268371262242, -98.913663895780914, -88.8236413230041, -93.188674517755175, -86.2665973347399, -93.188674517755175, -88.8236413230041, -98.913663895780914, -97.641268371262242, -113.01278832148969, -117.42088409618792, -143.40417750023292, -161.21514108231614, -178.60348895959208, -160.60083843803793, -133.82210964300842, -128.47000652339418, -112.139533418529, -112.91157561382055, -102.22695932687417, -106.49590198256304, -99.328644345614848, -106.49590198256304, -102.22695932687417, -112.91157561382055, -112.13953341852894, -128.47000652339418, -133.8221096430085, -160.60083843803793, -178.60348895959208, -177.60776882000505, -150.25981942473223, -144.17426859032349, -126.93039667308845, -127.2770066827773, -115.97697958126683, -120.19292964489595, -112.7451543467694, -120.19292964489595, -115.97697958126683, -127.2770066827773, -126.93039667308845, -144.17426859032349, -150.25981942473231, -177.60776882000505, -166.83960990819503, -160.22599682174754, -142.09621136794703, -142.10183399129687, -130.1550269541269, -134.3700611306007, -126.59707864557444, -134.3700611306007, -130.1550269541269, -142.10183399129687, -142.09621136794698, -160.22599682174754, -166.83960990819509, -176.76465860505877, -157.74590475348666, -157.50636934087649, -144.86439107147658, -149.14300750639546, -140.98630987909578, -149.14300750639546, -144.86439107147658, -157.50636934087649, -157.7459047534866, -176.76465860505877, -174.02840772118017, -173.65431637659515, -160.24089209502236, -164.66559233119821, -156.04550622820418, -164.66559233119821, -160.24089209502236, -173.65431637659515, -174.02840772118017, -176.47068782466309, -171.95444281441627, -176.47068782466309], "elevationInDegrees" : [0, -17.926567704655774, -11.741370124917038, -6.1093627726034905, 0, 6.1093627726034985, 11.741370124917038, 17.926567704655774, -30.401111559231097, -24.224457010752591, -19.055465703699067, -12.505821279066808, -6.4561774159555174, 0, 6.4561774159555245, 12.505821279066808, 19.055465703699067, 24.224457010752587, 30.401111559231097, -32.346473980579624, -25.733466869236924, -20.04254969420963, -13.172281778754783, -6.758726441374475, 0, 6.758726441374483, 13.172281778754783, 20.04254969420963, 25.73346686923691, 32.346473980579624, -44.842581214955516, -38.855228782209871, -34.061989115585028, -27.057634366821304, -20.906025035866104, -13.754448761516848, -7.02267045270399, 0, 7.0226704527039985, 13.754448761516848, 20.906025035866104, 27.057634366821304, 34.061989115585028, 38.855228782209871, 44.842581214955516, -47.619061653931652, -41.035918009641286, -35.571214307024022, -28.218333210022507, -21.65896830010097, -14.262153682508462, -7.2521702955533618, 0, 7.2521702955533707, 14.262153682508462, 21.65896830010097, 28.218333210022504, 35.571214307024022, 41.035918009641286, 47.619061653931652, -53.528171569297349, -50.107164316093858, -42.966813903622935, -36.890158339993285, -29.230728881425019, -22.31103387269652, -14.702673081068534, -7.450360948398977, 0, 7.450360948398985, 14.702673081068534, 22.31103387269652, 29.230728881425012, 36.890158339993285, 42.966813903622935, 50.107164316093858, 53.528171569297349, -56.73943775307621, -52.3160675560141, -44.662123184771993, -38.029807055355271, -30.105832907364672, -22.869482880100836, -15.08150803343838, -7.6196434393273318, 0, 7.6196434393273407, 15.08150803343838, 22.869482880100836, 30.105832907364665, 38.029807055355271, 44.662123184772, 52.3160675560141, 56.73943775307621, -65.608440359441246, -59.652654372927429, -54.244990407102755, -46.129680767085759, -38.997694817854665, -30.851757668305055, -23.339834953777927, -15.402872707467115, -7.7618728603500218, 0, 7.7618728603500333, 15.402872707467115, 23.339834953777927, 30.851757668305048, 38.997694817854665, 46.129680767085766, 54.244990407102755, 59.652654372927429, 65.608440359441232, -69.200082393608071, -62.252179511790082, -55.885909418705516, -47.37300407040189, -39.798939495524074, -31.474521044116702, -23.726296719027808, -15.670013085025184, -7.8784835788688552, 0, 7.878483578868865, 15.670013085025184, 23.726296719027808, 31.474521044116685, 39.798939495524074, 47.37300407040189, 55.885909418705516, 62.252179511790082, 69.200082393608042, -72.487969941225529, -64.503966192088541, -57.225942531957095, -48.392766316885805, -40.436954834157852, -31.978581470899826, -24.03205094672284, -15.885421053461039, -7.970574575065716, 0, 7.9705745750657258, 15.885421053461039, 24.03205094672284, 31.9785814708998, 40.436954834157852, 48.392766316885819, 57.225942531957095, 64.503966192088541, 72.4879699412255, -75.360257642205809, -66.357045200210891, -58.249824103229408, -49.187937302015975, -40.913954977395122, -32.367202436844728, -24.259454463114558, -16.050980887503567, -8.03896829027368, 0, 8.0389682902736865, 16.050980887503567, 24.259454463114558, 32.367202436844714, 40.913954977395122, 49.187937302016, 58.249824103229408, 66.357045200210891, 75.360257642205781, -77.60153826867051, -67.7481893462877, -58.942590934327434, -49.75670551982202, -41.231314264042751, -32.642703199204028, -24.410173392398097, -16.168070009190359, -8.0842510630448334, 0, 8.0842510630448423, 16.168070009190359, 24.410173392398097, 32.642703199204021, 41.231314264042751, 49.756705519822034, 58.942590934327434, 67.7481893462877, 77.601538268670438, -78.8778204066359, -68.612458525164442, -59.292294680924691, -50.097219522193974, -41.389817158225242, -32.806629278313459, -24.4852730651149, -16.237627320413768, -8.1068001149981548, 0, 8.1068001149981637, 16.237627320413768, 24.4852730651149, 32.806629278313444, 41.389817158225242, 50.09721952219401, 59.292294680924691, 68.612458525164442, 78.877820406635834, -89.924211909755, -78.8778204066359, -68.899708462072766, -59.292294680924691, -50.20814380616477, -41.389817158225242, -32.859862782607671, -24.4852730651149, -16.260197249324765, -8.1068001149981548, 0, 8.1068001149981654, 16.260197249324765, 24.4852730651149, 32.859862782607664, 41.389817158225242, 50.20814380616477, 59.292294680924691, 68.899708462072766, 78.877820406635834, 89.924211909755, -77.60153826867051, -68.591304846349431, -58.942590934327434, -50.089006001300739, -41.231314264042751, -32.802684274008705, -24.410173392398097, -16.23595436251199, -8.0842510630448334, 0, 8.0842510630448423, 16.23595436251199, 24.410173392398097, 32.802684274008691, 41.231314264042751, 50.089006001300753, 58.942590934327434, 68.591304846349431, 77.601538268670438, -75.360257642205809, -67.7072131597173, -58.249824103229408, -49.740312721815847, -40.913954977395122, -32.634792284574, -24.259454463114558, -16.164711113466645, -8.03896829027368, 0, 8.0389682902736865, 16.164711113466645, 24.259454463114558, 32.634792284573983, 40.913954977395122, 49.740312721815876, 58.249824103229408, 67.7072131597173, 75.360257642205781, -72.487969941225529, -66.2984205533376, -57.225942531957095, -49.163425192675625, -40.436954834157852, -32.355282342526877, -24.03205094672284, -16.045909515208038, -7.970574575065716, 0, 7.9705745750657258, 16.045909515208038, 24.03205094672284, 32.355282342526863, 40.436954834157852, 49.163425192675639, 57.225942531957095, 66.2984205533376, 72.4879699412255, -69.200082393608071, -64.430063527379716, -55.885909418705516, -48.360204168337532, -39.798939495524074, -31.962583509446976, -23.726296719027808, -15.87859588991633, -7.8784835788688552, 0, 7.878483578868865, 15.87859588991633, 23.726296719027808, 31.962583509446972, 39.798939495524074, 48.360204168337553, 55.885909418705516, 64.430063527379716, 69.200082393608042, -65.608440359441246, -62.16507250690082, -54.244990407102755, -47.332447070163866, -38.997694817854665, -31.454346147497215, -23.339834953777927, -15.661376054574848, -7.7618728603500218, 0, 7.7618728603500333, 15.661376054574848, 23.339834953777927, 31.454346147497212, 38.997694817854665, 47.332447070163873, 54.244990407102755, 62.16507250690082, 65.608440359441232, -59.5538649058158, -52.3160675560141, -46.081140266483352, -38.029807055355271, -30.827268967067354, -22.869482880100836, -15.392345994364195, -7.6196434393273318, 0, 7.6196434393273407, 15.392345994364195, 22.869482880100836, 30.82726896706734, 38.029807055355271, 46.081140266483352, 52.3160675560141, 59.5538649058158, -56.629845948577454, -50.107164316093858, -44.605530128450269, -36.890158339993285, -30.076844926434614, -22.31103387269652, -15.068989737272467, -7.450360948398977, 0, 7.450360948398985, 15.068989737272467, 22.31103387269652, 30.0768449264346, 36.890158339993285, 44.60553012845029, 50.107164316093858, 56.629845948577454, -53.407985711001892, -47.619061653931652, -42.901972927731229, -35.571214307024022, -29.196991802492668, -21.65896830010097, -14.688030900287483, -7.2521702955533618, 0, 7.2521702955533707, 14.688030900287483, 21.65896830010097, 29.196991802492661, 35.571214307024022, 42.901972927731236, 47.619061653931652, 53.407985711001892, -44.842581214955516, -40.962446129022396, -34.061989115585028, -28.179509546700242, -20.906025035866104, -14.245215617208554, -7.02267045270399, 0, 7.0226704527039985, 14.245215617208554, 20.906025035866104, 28.179509546700231, 34.061989115585028, 40.962446129022396, 44.842581214955516, -38.772466063393388, -32.346473980579624, -27.013263337013118, -20.042549694209633, -13.734989099753482, -6.758726441374475, 0, 6.758726441374483, 13.734989099753482, 20.042549694209633, 27.013263337013115, 32.346473980579624, 38.772466063393388, -30.401111559231097, -25.682907648362814, -19.055465703699067, -13.149999239275953, -6.4561774159555174, 0, 6.4561774159555245, 13.149999239275953, 19.055465703699067, 25.682907648362807, 30.401111559231097, -24.166793258079071, -17.926567704655778, -12.48030333572019, -6.1093627726034914, 0, 6.1093627726034985, 12.48030333572019, 17.926567704655778, 24.166793258079071, -11.712031214828992, 0, 11.712031214828992] } ././@LongLink0000644000000000000000000000017100000000000011602 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/EnergyVisualizer/createTDesignProjectedAndTriangulated.mIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/EnergyVisualizer/createTDesignProjec0000664002537200253720000000514015257173642031745 0ustar zmoelnigzmoelnigclear % hammer aitov projection hap = @(azi, ele) [-cos(ele).*sin(azi/2) sin(ele)] ./ (sqrt(1+cos(ele).*cos(azi/2))); %inverse z = @(x,y) sqrt(1-(x*2*sqrt(2)/4).^2-(y*sqrt(2)/2).^2); ihap = @(x,y,z) [2*atan(sqrt(2)*2*-x.*z/2./(2*z.^2-1)) asin(sqrt(2)*y.*z)]; % inverse test % azi = 0; % ele = 0; % % xy = hap(azi,ele) % x = xy(1); % y = xy(2); % % hz = z(x,y) % ihap(x,y,z(x,y)) % nx = 28; ny = 21; [X, Y] = meshgrid(linspace(-1,1,nx), linspace(-1,1,ny)); X(1:2:end,:) = X(1:2:end,:) - 1 / nx; X = X(:); Y = Y(:); figure, scatter(X,Y) aziele = ihap(X,Y,z(X,Y)); azi = aziele(:,1); ele = aziele(:,2); rePro = hap(azi,ele); xre = rePro(:,1); yre = rePro(:,2); dmax = 0.00001; for ii=1:size(X,1) r(ii) = abs(X(ii) - xre(ii)) < dmax || abs(Y(ii) - yre(ii)) < dmax; end X(~r) = []; Y(~r) = []; hold all scatter(X,Y) aziele = ihap(X,Y,z(X,Y)); azi = aziele(:,1); ele = aziele(:,2); rePro = hap(azi,ele); xre = rePro(:,1); yre = rePro(:,2); tri = delaunay(xre,yre) triplot (tri, xre, yre, 'Color', [0.2 0.2 0.2]); scatter (xre, yre, 300, '.r'); xlim ([-1 1]) [x,y,z] = sph2cart(azi,ele,1); vertices = [xre yre]'; hammerAitovSampleVertices = vertices(:); hammerAitovSampleX = x; hammerAitovSampleY = y; hammerAitovSampleZ = z; %% str = ''; str = [str mat2header('hammerAitovSampleX',hammerAitovSampleX,false)]; str = [str mat2header('hammerAitovSampleY',hammerAitovSampleY,false)]; str = [str mat2header('hammerAitovSampleZ',hammerAitovSampleZ,false)]; str = [str mat2header('hammerAitovSampleVertices',hammerAitovSampleVertices,false)]; indices = (tri-1)'; hammerAitovSampleIndices = indices(:); str = [str mat2header('hammerAitovSampleIndices',hammerAitovSampleIndices,true)]; fid=fopen('hammerAitovSample.h', 'wt+'); fprintf(fid, '%s', ['#ifndef hammerAitovSample_h ' newline ' #define hammerAitovSample_h ' newline newline '#define nSamplePoints ' num2str(length(hammerAitovSampleX)) newline str newline ' #endif']); fclose(fid); %% X(r) = []; Y(r) = []; aziele = ihap(X,Y,z(X,Y)); azi = aziele(:,1); ele = aziele(:,2); hold all scatter(X,Y) %% tDesign = getTdesign(21); % tDesign for 10th order (Spherical Harmonic Transform Toolbox) [tDesign(:,4),tDesign(:,5)] = cart2sph(tDesign(:,1),tDesign(:,2),tDesign(:,3)) tDesignProjected = hap(tDesign(:,4),tDesign(:,5)); scatter(tDesignProjected(:,1),tDesignProjected(:,2)); %% tri = delaunay(tDesignProjected(:,1),tDesignProjected(:,2)) triplot(tri,tDesignProjected(:,1),tDesignProjected(:,2)); %% vertices = tDesignProjected'; vertices = vertices(:); mat2header('tDesignProjected',vertices,0); %% indices = (tri-1)'; indices = indices(:); mat2header('vertexIndex',indices,1);IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/EnergyVisualizer/hammerAitovSample.h0000664002537200253720000021033515257173642031731 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #ifndef hammerAitovSample_h #define hammerAitovSample_h #define nSamplePoints 426 const float hammerAitovSampleX[426] = { -9.8942823302790495e-01, -9.4562237517123438e-01, -9.7653817229723083e-01, -9.5892154250491690e-01, -9.8867544588247824e-01, -9.5892154250491679e-01, -9.7653817229723083e-01, -9.4562237517123438e-01, -8.6112914332692680e-01, -9.0596313391326455e-01, -8.7329387676999282e-01, -9.1550845659717472e-01, -8.5300597618283902e-01, -9.0991995150389882e-01, -8.5300597618283902e-01, -9.1550845659717472e-01, -8.7329387676999282e-01, -9.0596313391326455e-01, -8.6112914332692680e-01, -7.9501230438537918e-01, -8.3029661458928494e-01, -7.4131433526537283e-01, -7.9099950003568620e-01, -6.9443022574358737e-01, -7.7120003770640355e-01, -6.9443022574358737e-01, -7.9099950003568620e-01, -7.4131433526537283e-01, -8.3029661458928505e-01, -7.9501230438537918e-01, -7.0842893375742710e-01, -7.5639574473324822e-01, -6.7169359413984597e-01, -6.9740562672519002e-01, -5.6579607871736703e-01, -6.1967008938249135e-01, -4.9914036122026817e-01, -5.8910886481124225e-01, -4.9914036122026817e-01, -6.1967008938249135e-01, -5.6579607871736703e-01, -6.9740562672518946e-01, -6.7169359413984597e-01, -7.5639574473324844e-01, -7.0842893375742710e-01, -6.3578880451330455e-01, -6.5106527640941370e-01, -5.0601581936609574e-01, -5.2284594190360856e-01, -3.6182364198623596e-01, -4.1692267240601072e-01, -2.8167523923228210e-01, -3.7879446564668046e-01, -2.8167523923228210e-01, -4.1692267240601072e-01, -3.6182364198623596e-01, -5.2284594190360856e-01, -5.0601581936609574e-01, -6.5106527640941425e-01, -6.3578880451330455e-01, -5.9406355775518038e-01, -5.1491783695621851e-01, -5.0125373644613047e-01, -3.1266629474366164e-01, -3.2149019791965894e-01, -1.4334621098231232e-01, -1.9685353171630268e-01, -5.5154542350804789e-02, -1.5395974554799582e-01, -5.5154542350804789e-02, -1.9685353171630268e-01, -1.4334621098231232e-01, -3.2149019791965838e-01, -3.1266629474366164e-01, -5.0125373644613136e-01, -5.1491783695621851e-01, -5.9406355775518038e-01, -5.1723990890365068e-01, -3.5813645747788386e-01, -3.2107853426731159e-01, -1.0593532535962329e-01, -1.0734775411014962e-01, 7.6927088897341719e-02, 2.7793804570801141e-02, 1.6873206582647687e-01, 7.3137517642518926e-02, 1.6873206582647685e-01, 2.7793804570801141e-02, 7.6927088897341719e-02, -1.0734775411014963e-01, -1.0593532535962329e-01, -3.2107853426731153e-01, -3.5813645747788386e-01, -5.1723990890365068e-01, -4.1017625752326192e-01, -3.9923569231691663e-01, -1.7923749366896338e-01, -1.2503085866823810e-01, 1.0057199136362120e-01, 1.0662349975772990e-01, 2.8762707223681083e-01, 2.4567150099224064e-01, 3.7973464499968468e-01, 2.9168467357555738e-01, 3.7973464499968462e-01, 2.4567150099224064e-01, 2.8762707223681083e-01, 1.0662349975773046e-01, 1.0057199136362120e-01, -1.2503085866823868e-01, -1.7923749366896338e-01, -3.9923569231691663e-01, -4.1017625752326214e-01, -3.2005431801006917e-01, -2.5041665829459026e-01, 6.5619957937038181e-03, 7.2363248743749289e-02, 2.9426214880030638e-01, 3.0870777333893895e-01, 4.7881751974206366e-01, 4.4686631023507467e-01, 5.6905151949827804e-01, 4.9231419939479937e-01, 5.6905151949827804e-01, 4.4686631023507467e-01, 4.7881751974206366e-01, 3.0870777333893901e-01, 2.9426214880030638e-01, 7.2363248743748387e-02, 6.5619957937038181e-03, -2.5041665829459026e-01, -3.2005431801006951e-01, -2.0070155681837162e-01, -8.4187208008073583e-02, 1.8303324579757904e-01, 2.5703093956542011e-01, 4.6390296134897951e-01, 4.8861785714056805e-01, 6.4207936349823835e-01, 6.2293406353980030e-01, 7.2933663681947802e-01, 6.6710369973691064e-01, 7.2933663681947802e-01, 6.2293406353980030e-01, 6.4207936349823835e-01, 4.8861785714056810e-01, 4.6390296134897951e-01, 2.5703093956542000e-01, 1.8303324579757904e-01, -8.4187208008073583e-02, -2.0070155681837176e-01, -6.0887670498268653e-02, 8.1951095935592855e-02, 3.3387283654542532e-01, 4.1598002486746927e-01, 5.9997573377796920e-01, 6.3767020905662375e-01, 7.7058414869815461e-01, 7.6692942851300172e-01, 8.5470572624642605e-01, 8.0957590673154300e-01, 8.5470572624642605e-01, 7.6692942851300172e-01, 7.7058414869815461e-01, 6.3767020905662386e-01, 5.9997573377796920e-01, 4.1598002486746904e-01, 3.3387283654542532e-01, 8.1951095935592855e-02, -6.0887670498268105e-02, 7.9279895879067155e-02, 2.2628589161077531e-01, 4.4421736619701735e-01, 5.3802221305675013e-01, 6.9500437457812791e-01, 7.4894117570862595e-01, 8.5915506593126645e-01, 8.7343064723672637e-01, 9.4074124316293095e-01, 9.1469868000133425e-01, 9.4074124316293095e-01, 8.7343064723672637e-01, 8.5915506593126645e-01, 7.4894117570862595e-01, 6.9500437457812791e-01, 5.3802221305675002e-01, 4.4421736619701735e-01, 2.2628589161077531e-01, 7.9279895879067558e-02, 1.7599693312597767e-01, 3.2535083529900866e-01, 5.0255352882351878e-01, 6.1451170162552049e-01, 7.4383409240983211e-01, 8.1739717339059925e-01, 9.0431409325138068e-01, 9.3855901281978116e-01, 9.8449608748550044e-01, 9.7888500666190836e-01, 9.8449608748550033e-01, 9.3855901281978116e-01, 9.0431409325138068e-01, 8.1739717339059936e-01, 7.4383409240983211e-01, 6.1451170162552005e-01, 5.0255352882351878e-01, 3.2535083529900866e-01, 1.7599693312597864e-01, -1.3227466940842578e-03, 1.7599693312597775e-01, 3.5998833559701332e-01, 5.0255352882351878e-01, 6.3999152504706647e-01, 7.4383409240983211e-01, 8.3999250141852788e-01, 9.0431409325138079e-01, 9.5999289196795967e-01, 9.8449608748550044e-01, 9.9999300132187530e-01, 9.8449608748550033e-01, 9.5999289196795967e-01, 9.0431409325138079e-01, 8.3999250141852799e-01, 7.4383409240983211e-01, 6.3999152504706647e-01, 5.0255352882351878e-01, 3.5998833559701332e-01, 1.7599693312597875e-01, -1.3227466940842578e-03, 7.9279895879067155e-02, 3.2283468078535987e-01, 4.4421736619701735e-01, 6.1263607740966997e-01, 6.9500437457812791e-01, 8.1572983410625177e-01, 8.5915506593126645e-01, 9.3697615394646783e-01, 9.4074124316293095e-01, 9.7732590608283099e-01, 9.4074124316293095e-01, 9.3697615394646783e-01, 8.5915506593126645e-01, 8.1572983410625188e-01, 6.9500437457812791e-01, 6.1263607740966985e-01, 4.4421736619701735e-01, 3.2283468078535987e-01, 7.9279895879067558e-02, -6.0887670498268549e-02, 2.2177449618114994e-01, 3.3387283654542549e-01, 5.3440518945971827e-01, 5.9997573377796931e-01, 7.4568024443584235e-01, 7.7058414869815495e-01, 8.7032092156909413e-01, 8.5470572624642627e-01, 9.1163209053935768e-01, 8.5470572624642627e-01, 8.7032092156909413e-01, 7.7058414869815495e-01, 7.4568024443584269e-01, 5.9997573377796931e-01, 5.3440518945971804e-01, 3.3387283654542549e-01, 2.2177449618114994e-01, -6.0887670498267994e-02, -2.0070155681837162e-01, 7.6253809019891552e-02, 1.8303324579757904e-01, 4.1087884302695143e-01, 4.6390296134897951e-01, 6.3296170396166584e-01, 6.4207936349823835e-01, 7.6240461660885883e-01, 7.2933663681947802e-01, 8.0510505177902292e-01, 7.2933663681947802e-01, 7.6240461660885883e-01, 6.4207936349823835e-01, 6.3296170396166596e-01, 4.6390296134897951e-01, 4.1087884302695127e-01, 1.8303324579757904e-01, 7.6253809019891552e-02, -2.0070155681837176e-01, -3.2005431801006917e-01, -9.0239646018537414e-02, 6.5619957937040679e-03, 2.5080566036358554e-01, 2.9426214880030654e-01, 4.8267719196242531e-01, 4.7881751974206388e-01, 6.1716132927708900e-01, 5.6905151949827826e-01, 6.6138341438238202e-01, 5.6905151949827826e-01, 6.1716132927708900e-01, 4.7881751974206388e-01, 4.8267719196242559e-01, 2.9426214880030654e-01, 2.5080566036358543e-01, 6.5619957937040679e-03, -9.0239646018537414e-02, -3.2005431801006951e-01, -4.1017625752326192e-01, -2.5612202158127184e-01, -1.7923749366896338e-01, 6.5451277050613585e-02, 1.0057199136362120e-01, 3.0181563122906424e-01, 2.8762707223681083e-01, 4.4006759814169177e-01, 3.7973464499968468e-01, 4.8555093042297365e-01, 3.7973464499968462e-01, 4.4006759814169177e-01, 2.8762707223681083e-01, 3.0181563122906468e-01, 1.0057199136362120e-01, 6.5451277050613266e-02, -1.7923749366896338e-01, -2.5612202158127184e-01, -4.1017625752326214e-01, -4.0404983400147271e-01, -3.5813645747788364e-01, -1.3214144559497293e-01, -1.0593532535962294e-01, 9.9120661508992708e-02, 7.6927088897342122e-02, 2.3812274204495956e-01, 1.6873206582647707e-01, 2.8413647946732529e-01, 1.6873206582647707e-01, 2.3812274204495956e-01, 7.6927088897342122e-02, 9.9120661508992722e-02, -1.0593532535962294e-01, -1.3214144559497348e-01, -3.5813645747788364e-01, -4.0404983400147271e-01, -5.2074726026037255e-01, -5.1491783695621851e-01, -3.2787341511467760e-01, -3.1266629474366164e-01, -1.1506638250603425e-01, -1.4334621098231232e-01, 1.9823938272352508e-02, -5.5154542350804789e-02, 6.5114068574948947e-02, -5.5154542350804789e-02, 1.9823938272352508e-02, -1.4334621098231232e-01, -1.1506638250603426e-01, -3.1266629474366164e-01, -3.2787341511467749e-01, -5.1491783695621851e-01, -5.2074726026037255e-01, -5.9593591488260522e-01, -6.3578880451330455e-01, -5.0721232435235164e-01, -5.0601581936609552e-01, -3.2898209341939294e-01, -3.6182364198623596e-01, -2.0486370948021143e-01, -2.8167523923228188e-01, -1.6209716770165650e-01, -2.8167523923228188e-01, -2.0486370948021143e-01, -3.6182364198623596e-01, -3.2898209341939244e-01, -5.0601581936609552e-01, -5.0721232435235220e-01, -6.3578880451330455e-01, -5.9593591488260522e-01, -7.0842893375742710e-01, -6.5567536228108103e-01, -6.7169359413984597e-01, -5.2962774272594793e-01, -5.6579607871736703e-01, -4.2454182469795182e-01, -4.9914036122026817e-01, -3.8663296731700841e-01, -4.9914036122026817e-01, -4.2454182469795182e-01, -5.6579607871736703e-01, -5.2962774272594804e-01, -6.7169359413984597e-01, -6.5567536228108148e-01, -7.0842893375742710e-01, -7.5916297247481712e-01, -7.9501230438537895e-01, -7.0295993195600792e-01, -7.4131433526537227e-01, -6.2641780435651429e-01, -6.9443022574358704e-01, -5.9618394073263437e-01, -6.9443022574358704e-01, -6.2641780435651429e-01, -7.4131433526537227e-01, -7.0295993195600737e-01, -7.9501230438537895e-01, -7.5916297247481723e-01, -8.6112914332692680e-01, -8.3407858641754351e-01, -8.7329387676999282e-01, -7.9634789437509146e-01, -8.5300597618283902e-01, -7.7699557091707838e-01, -8.5300597618283902e-01, -7.9634789437509146e-01, -8.7329387676999282e-01, -8.3407858641754329e-01, -8.6112914332692680e-01, -9.0740672313746440e-01, -9.4562237517123426e-01, -9.1888390180491852e-01, -9.5892154250491679e-01, -9.1386821334589863e-01, -9.5892154250491668e-01, -9.1888390180491852e-01, -9.4562237517123426e-01, -9.0740672313746429e-01, -9.7732312869673676e-01, -9.9015709600166602e-01, -9.7732312869673676e-01 }; const float hammerAitovSampleY[426] = { -1.4502334876590658e-01, 1.0516091195246342e-01, 7.0450506826574583e-02, 2.6295030618542486e-01, 1.5006952625061076e-01, 2.6295030618542486e-01, 7.0450506826574583e-02, 1.0516091195246342e-01, 4.8677437164362423e-02, 1.0428127232973203e-01, 3.6161643598064663e-01, 3.3905045618789836e-01, 5.0964430770037672e-01, 4.1478389777707442e-01, 5.0964430770037672e-01, 3.3905045618789836e-01, 3.6161643598064663e-01, 1.0428127232973285e-01, 4.8677437164362423e-02, 2.8581463184568390e-01, 3.4941469027490019e-01, 5.7705935637029804e-01, 5.6779447376482761e-01, 7.0987044190454907e-01, 6.3659288547834225e-01, 7.0987044190454907e-01, 5.6779447376482761e-01, 5.7705935637029804e-01, 3.4941469027490024e-01, 2.8581463184568390e-01, 2.9595744498269620e-02, 1.8517965346228996e-01, 4.8489941353137678e-01, 5.5380829345905946e-01, 7.4333215895898042e-01, 7.4798298031953436e-01, 8.5785248663564728e-01, 8.0805367730170585e-01, 8.5785248663564728e-01, 7.4798298031953436e-01, 7.4333215895898042e-01, 5.5380829345906002e-01, 4.8489941353137678e-01, 1.8517965346228929e-01, 2.9595744498269620e-02, 2.2388612418870393e-01, 3.8089331196621884e-01, 6.3683306931891104e-01, 7.0926816165999995e-01, 8.5607398304439508e-01, 8.7491873123235697e-01, 9.5116948768792620e-01, 9.2548082248928631e-01, 9.5116948768792620e-01, 8.7491873123235697e-01, 8.5607398304439508e-01, 7.0926816165999995e-01, 6.3683306931891104e-01, 3.8089331196621790e-01, 2.2388612418870393e-01, 2.0796765907848576e-02, 3.8235348708435191e-01, 5.3310477466356254e-01, 7.3613876542295353e-01, 8.1128296954442525e-01, 9.1396369817120859e-01, 9.4701250681214821e-01, 9.9002242207495472e-01, 9.8807712085180699e-01, 9.9002242207495472e-01, 9.4701250681214821e-01, 9.1396369817120859e-01, 8.1128296954442536e-01, 7.3613876542295353e-01, 5.3310477466356165e-01, 3.8235348708435191e-01, 2.0796765907848576e-02, 1.8236614835183212e-01, 4.9541118493620717e-01, 6.3466959987904992e-01, 7.8053431128512940e-01, 8.5841429015618198e-01, 9.1817559351392286e-01, 9.6515654838564335e-01, 9.7670247984328662e-01, 9.9732186555449098e-01, 9.7670247984328651e-01, 9.6515654838564335e-01, 9.1817559351392286e-01, 8.5841429015618209e-01, 7.8053431128512940e-01, 6.3466959987904981e-01, 4.9541118493620717e-01, 1.8236614835183212e-01, 4.7957087157740871e-02, 3.0964372482880231e-01, 5.5615151776505711e-01, 6.8165661806374045e-01, 7.7063640807825973e-01, 8.5185005892223731e-01, 8.7195695932850859e-01, 9.3225521559110680e-01, 9.1518381068672094e-01, 9.5651453266592901e-01, 9.1518381068672083e-01, 9.3225521559110680e-01, 8.7195695932850859e-01, 8.5185005892223720e-01, 7.7063640807825973e-01, 6.8165661806374023e-01, 5.5615151776505711e-01, 3.0964372482880231e-01, 4.7957087157740899e-02, 1.5383508547502925e-01, 3.9250099379286774e-01, 5.6080423024050707e-01, 6.7334550750424416e-01, 7.0970949377981696e-01, 7.9504144162431489e-01, 7.8027801634293037e-01, 8.5285306271472039e-01, 8.1079681749980492e-01, 8.7041756018261585e-01, 8.1079681749980492e-01, 8.5285306271472039e-01, 7.8027801634293037e-01, 7.9504144162431511e-01, 7.0970949377981696e-01, 6.7334550750424427e-01, 5.6080423024050707e-01, 3.9250099379286774e-01, 1.5383508547502941e-01, 2.2419484725373706e-01, 4.2213567136375907e-01, 5.0944514822845888e-01, 6.1225687199936851e-01, 6.0340523972663873e-01, 6.9337875107392843e-01, 6.4952557585190318e-01, 7.3282571473111024e-01, 6.6995538943124355e-01, 7.4496486749196822e-01, 6.6995538943124355e-01, 7.3282571473111024e-01, 6.4952557585190318e-01, 6.9337875107392855e-01, 6.0340523972663873e-01, 6.1225687199936829e-01, 5.0944514822845888e-01, 4.2213567136375907e-01, 2.2419484725373723e-01, 2.4529669659225309e-01, 3.9257333922580839e-01, 4.0673427430575182e-01, 5.0411049022905641e-01, 4.5945892861125803e-01, 5.5388099505278954e-01, 4.8722324403524375e-01, 5.7911235069757172e-01, 4.9992105081671656e-01, 5.8701520528841500e-01, 4.9992105081671656e-01, 5.7911235069757172e-01, 4.8722324403524375e-01, 5.5388099505278954e-01, 4.5945892861125803e-01, 5.0411049022905619e-01, 4.0673427430575182e-01, 3.9257333922580839e-01, 2.4529669659225367e-01, 1.9953620751483692e-01, 3.0363073203448121e-01, 2.6233626185686593e-01, 3.5762112526048240e-01, 2.8732444913433969e-01, 3.8488484884787399e-01, 3.0176759898264788e-01, 3.9947617244805805e-01, 3.0859256342690228e-01, 4.0413651753314334e-01, 3.0859256342690228e-01, 3.9947617244805805e-01, 3.0176759898264788e-01, 3.8488484884787383e-01, 2.8732444913433969e-01, 3.5762112526048229e-01, 2.6233626185686593e-01, 3.0363073203448121e-01, 1.9953620751483792e-01, 7.8969555154888751e-02, 1.6472461001914751e-01, 9.0620661563162799e-02, 1.8406727126692463e-01, 9.7743431988864801e-02, 1.9572608851910697e-01, 1.0217376149020091e-01, 2.0228368607784558e-01, 1.0431285226119984e-01, 2.0441170155476796e-01, 1.0431285226119982e-01, 2.0228368607784558e-01, 1.0217376149020091e-01, 1.9572608851910700e-01, 9.7743431988864801e-02, 1.8406727126692449e-01, 9.0620661563162799e-02, 1.6472461001914751e-01, 7.8969555154889182e-02, 3.4993390631858086e-06, -7.8969555154888516e-02, -3.0851294254100881e-03, -9.0620661563162536e-02, -3.3878827477248348e-03, -9.7743431988864510e-02, -3.5885244898426240e-03, -1.0217376149020060e-01, -3.7036951596732840e-03, -1.0431285226119952e-01, -3.7412975379981514e-03, -1.0431285226119950e-01, -3.7036951596732840e-03, -1.0217376149020060e-01, -3.5885244898426231e-03, -9.7743431988864510e-02, -3.3878827477248387e-03, -9.0620661563162536e-02, -3.0851294254100881e-03, -7.8969555154888960e-02, 3.4993390631858086e-06, -1.9953620751483692e-01, -1.7034073177417974e-01, -2.6233626185686593e-01, -1.9058730785879699e-01, -2.8732444913433969e-01, -2.0271750480354181e-01, -3.0176759898264788e-01, -2.0953060441587470e-01, -3.0859256342690228e-01, -2.1174058019041458e-01, -3.0859256342690228e-01, -2.0953060441587470e-01, -3.0176759898264788e-01, -2.0271750480354184e-01, -2.8732444913433969e-01, -1.9058730785879693e-01, -2.6233626185686593e-01, -1.7034073177417974e-01, -1.9953620751483792e-01, -2.4529669659225312e-01, -3.0775747709572610e-01, -4.0673427430575165e-01, -3.6339242067279393e-01, -4.5945892861125787e-01, -3.9132546687416669e-01, -4.8722324403524336e-01, -4.0624519132005521e-01, -4.9992105081671634e-01, -4.1100721587198485e-01, -4.9992105081671634e-01, -4.0624519132005521e-01, -4.8722324403524336e-01, -3.9132546687416664e-01, -4.5945892861125787e-01, -3.6339242067279381e-01, -4.0673427430575165e-01, -3.0775747709572610e-01, -2.4529669659225370e-01, -2.2419484725373706e-01, -3.9467412372257271e-01, -5.0944514822845888e-01, -5.0869305501828310e-01, -6.0340523972663873e-01, -5.5942386269223454e-01, -6.4952557585190318e-01, -5.8509665422166601e-01, -6.6995538943124355e-01, -5.9313224124127395e-01, -6.6995538943124355e-01, -5.8509665422166601e-01, -6.4952557585190318e-01, -5.5942386269223465e-01, -6.0340523972663873e-01, -5.0869305501828299e-01, -5.0944514822845888e-01, -3.9467412372257271e-01, -2.2419484725373723e-01, -1.5383508547502925e-01, -4.2207362946537791e-01, -5.6080423024050707e-01, -6.1529202483993461e-01, -7.0970949377981685e-01, -6.9770700437947086e-01, -7.8027801634293026e-01, -7.3773638757022364e-01, -8.1079681749980481e-01, -7.5004798458492128e-01, -8.1079681749980481e-01, -7.3773638757022364e-01, -7.8027801634293026e-01, -6.9770700437947075e-01, -7.0970949377981685e-01, -6.1529202483993439e-01, -5.6080423024050707e-01, -4.2207362946537791e-01, -1.5383508547502941e-01, -4.7957087157740871e-02, -3.9041158686451399e-01, -5.5615151776505711e-01, -6.7457557764084219e-01, -7.7063640807825973e-01, -7.9787984623001840e-01, -8.7195695932850859e-01, -8.5642672782577345e-01, -9.1518381068672094e-01, -8.7420838131728329e-01, -9.1518381068672083e-01, -8.5642672782577345e-01, -8.7195695932850859e-01, -7.9787984623001829e-01, -7.7063640807825973e-01, -6.7457557764084208e-01, -5.5615151776505711e-01, -3.9041158686451399e-01, -4.7957087157740899e-02, -3.0580566222612315e-01, -4.9541118493620728e-01, -6.8093587052823434e-01, -7.8053431128512951e-01, -8.5297622318184441e-01, -9.1817559351392286e-01, -9.3426221984723101e-01, -9.7670247984328662e-01, -9.5878384479293044e-01, -9.7670247984328651e-01, -9.3426221984723101e-01, -9.1817559351392286e-01, -8.5297622318184452e-01, -7.8053431128512951e-01, -6.8093587052823423e-01, -4.9541118493620728e-01, -3.0580566222612315e-01, -1.7712327984382462e-01, -3.8235348708435191e-01, -6.3196804045766808e-01, -7.3613876542295353e-01, -8.5766970271183318e-01, -9.1396369817120859e-01, -9.6540996954898972e-01, -9.9002242207495472e-01, -9.9787782722817164e-01, -9.9002242207495472e-01, -9.6540996954898972e-01, -9.1396369817120859e-01, -8.5766970271183329e-01, -7.3613876542295353e-01, -6.3196804045766786e-01, -3.8235348708435191e-01, -1.7712327984382462e-01, -1.4528049607708819e-02, -2.2388612418870393e-01, -5.2850772453275841e-01, -6.3683306931891137e-01, -8.0858422686043452e-01, -8.5607398304439508e-01, -9.4537837819971893e-01, -9.5116948768792631e-01, -9.8677480116949734e-01, -9.5116948768792631e-01, -9.4537837819971893e-01, -8.5607398304439508e-01, -8.0858422686043485e-01, -6.3683306931891137e-01, -5.2850772453275763e-01, -2.2388612418870393e-01, -1.4528049607708819e-02, -2.9595744498269620e-02, -3.7460028005071766e-01, -4.8489941353137678e-01, -7.0461906881828829e-01, -7.4333215895898042e-01, -8.7132808607548462e-01, -8.5785248663564728e-01, -9.2223367352512409e-01, -8.5785248663564728e-01, -8.7132808607548462e-01, -7.4333215895898042e-01, -7.0461906881828840e-01, -4.8489941353137678e-01, -3.7460028005071677e-01, -2.9595744498269620e-02, -1.7750645812039359e-01, -2.8581463184568423e-01, -5.4731403258546096e-01, -5.7705935637029881e-01, -7.4244667379906981e-01, -7.0987044190454940e-01, -8.0284787401630875e-01, -7.0987044190454940e-01, -7.4244667379906981e-01, -5.7705935637029881e-01, -5.4731403258546163e-01, -2.8581463184568423e-01, -1.7750645812039326e-01, -4.8677437164362423e-02, -3.4130015525555257e-01, -3.6161643598064663e-01, -5.6042238731049643e-01, -5.0964430770037672e-01, -6.2950606254049957e-01, -5.0964430770037672e-01, -5.6042238731049643e-01, -3.6161643598064663e-01, -3.4130015525555335e-01, -4.8677437164362423e-02, -9.4917443622638362e-02, -1.0516091195246384e-01, -3.3007793864252843e-01, -2.6295030618542531e-01, -4.0601094644846097e-01, -2.6295030618542531e-01, -3.3007793864252843e-01, -1.0516091195246384e-01, -9.4917443622638750e-02, -6.0277522057913181e-02, -1.3996044168817004e-01, -6.0277522057913181e-02 }; const float hammerAitovSampleZ[426] = { 0.0000000000000000e+00, -3.0779783328158683e-01, -2.0349428526192753e-01, -1.0642655588236501e-01, 0.0000000000000000e+00, 1.0642655588236512e-01, 2.0349428526192753e-01, 3.0779783328158683e-01, -5.0605049710887806e-01, -4.1031233984776588e-01, -3.2648331967298327e-01, -2.1653880497000325e-01, -1.1244324890790776e-01, 0.0000000000000000e+00, 1.1244324890790788e-01, 2.1653880497000325e-01, 3.2648331967298327e-01, 4.1031233984776577e-01, 5.0605049710887806e-01, -5.3503778567383953e-01, -4.3418533602790871e-01, -3.4271789500339134e-01, -2.2787985102991656e-01, -1.1768864551837875e-01, 0.0000000000000000e+00, 1.1768864551837889e-01, 2.2787985102991656e-01, 3.4271789500339134e-01, 4.3418533602790854e-01, 5.3503778567383953e-01, -7.0516135580653327e-01, -6.2735474278355541e-01, -5.6008952351246721e-01, -4.5488654179697308e-01, -3.5683623521922797e-01, -2.3776131198536549e-01, -1.2226205860338232e-01, 0.0000000000000000e+00, 1.2226205860338248e-01, 2.3776131198536549e-01, 3.5683623521922797e-01, 4.5488654179697297e-01, 5.6008952351246721e-01, 6.2735474278355541e-01, 7.0516135580653327e-01, -7.3867963248711765e-01, -6.5653201807173001e-01, -5.8171439072203968e-01, -4.7283273563742667e-01, -3.6908127513370420e-01, -2.4635888247147314e-01, -1.2623654500549572e-01, 0.0000000000000000e+00, 1.2623654500549589e-01, 2.4635888247147314e-01, 3.6908127513370420e-01, 4.7283273563742650e-01, 5.8171439072203968e-01, 6.5653201807173001e-01, 7.3867963248711765e-01, -8.0414922985415560e-01, -7.6724535325980669e-01, -6.8157464076189433e-01, -6.0028285513817525e-01, -4.8832775465742045e-01, -3.7963432698087546e-01, -2.5380307128202650e-01, -1.2966719032551594e-01, 0.0000000000000000e+00, 1.2966719032551607e-01, 2.5380307128202650e-01, 3.7963432698087546e-01, 4.8832775465742034e-01, 6.0028285513817525e-01, 6.8157464076189433e-01, 7.6724535325980669e-01, 8.0414922985415560e-01, -8.3618506598280062e-01, -7.9139499345478237e-01, -7.0292465728705344e-01, -6.1607133981999151e-01, -5.0159880994990924e-01, -3.8863324930985499e-01, -2.6019289293866438e-01, -1.3259621348252737e-01, 0.0000000000000000e+00, 1.3259621348252754e-01, 2.6019289293866438e-01, 3.8863324930985499e-01, 5.0159880994990902e-01, 6.1607133981999151e-01, 7.0292465728705356e-01, 7.9139499345478237e-01, 8.3618506598280062e-01, -9.1074450619015845e-01, -8.6297834599390566e-01, -8.1152289564182456e-01, -7.2091021592885407e-01, -6.2928912361282208e-01, -5.1281859015990661e-01, -3.9618395777095999e-01, -2.6560445516481557e-01, -1.3505625510836489e-01, 0.0000000000000000e+00, 1.3505625510836505e-01, 2.6560445516481557e-01, 3.9618395777095999e-01, 5.1281859015990650e-01, 6.2928912361282208e-01, 7.2091021592885418e-01, 8.1152289564182456e-01, 8.6297834599390566e-01, 9.1074450619015834e-01, -9.3482618705297293e-01, -8.8500534863930713e-01, -8.2792243329647475e-01, -7.3577808322557559e-01, -6.4009547898905073e-01, -5.2211935108751273e-01, -4.0236799077461427e-01, -2.7009656457461895e-01, -1.3707256796634723e-01, 0.0000000000000000e+00, 1.3707256796634740e-01, 2.7009656457461895e-01, 4.0236799077461427e-01, 5.2211935108751251e-01, 6.4009547898905073e-01, 7.3577808322557559e-01, 8.2792243329647475e-01, 8.8500534863930713e-01, 9.3482618705297282e-01, -9.5365379229338543e-01, -9.0261508350463193e-01, -8.4081179337547751e-01, -7.4771426280074815e-01, -6.4861094588519319e-01, -5.2960220660654200e-01, -4.0724761175966478e-01, -2.7371449415518639e-01, -1.3866451011301845e-01, 0.0000000000000000e+00, 1.3866451011301861e-01, 2.7371449415518639e-01, 4.0724761175966478e-01, 5.2960220660654189e-01, 6.4861094588519319e-01, 7.4771426280074837e-01, 8.4081179337547751e-01, 9.0261508350463193e-01, 9.5365379229338532e-01, -9.6753409357098230e-01, -9.1606232932265785e-01, -8.5035060952649710e-01, -7.5685747175560070e-01, -6.5492489019503775e-01, -5.3534339241370443e-01, -4.1086929825300122e-01, -2.7649256219698448e-01, -1.3984657475919560e-01, 0.0000000000000000e+00, 1.3984657475919574e-01, 2.7649256219698448e-01, 4.1086929825300122e-01, 5.3534339241370421e-01, 6.5492489019503775e-01, 7.5685747175560103e-01, 8.5035060952649710e-01, 9.1606232932265785e-01, 9.6753409357098219e-01, -9.7667804316468598e-01, -9.2552853755144771e-01, -8.5665081409168742e-01, -7.6330808264091066e-01, -6.5910058431692631e-01, -5.3939852470648308e-01, -4.1326612356796072e-01, -2.7845590694737032e-01, -1.4062909801984982e-01, 0.0000000000000000e+00, 1.4062909801984999e-01, 2.7845590694737032e-01, 4.1326612356796072e-01, 5.3939852470648297e-01, 6.5910058431692631e-01, 7.6330808264091088e-01, 8.5665081409168742e-01, 9.2552853755144771e-01, 9.7667804316468576e-01, -9.8121806388227950e-01, -9.3113513349259736e-01, -8.5978360438245360e-01, -7.6713402232833849e-01, -6.6117854205341497e-01, -5.4180546251036388e-01, -4.1445933842763955e-01, -2.7962169050615027e-01, -1.4101873130501197e-01, 0.0000000000000000e+00, 1.4101873130501213e-01, 2.7962169050615027e-01, 4.1445933842763955e-01, 5.4180546251036366e-01, 6.6117854205341497e-01, 7.6713402232833872e-01, 8.5978360438245360e-01, 9.3113513349259736e-01, 9.8121806388227928e-01, -9.9999912516408629e-01, -9.8121806388227950e-01, -9.3295170304283204e-01, -8.5978360438245360e-01, -7.6837449861276486e-01, -6.6117854205341497e-01, -5.4258614067503619e-01, -4.1445933842763955e-01, -2.7999987502346763e-01, -1.4101873130501197e-01, 0.0000000000000000e+00, 1.4101873130501213e-01, 2.7999987502346763e-01, 4.1445933842763955e-01, 5.4258614067503608e-01, 6.6117854205341497e-01, 7.6837449861276486e-01, 8.5978360438245360e-01, 9.3295170304283204e-01, 9.8121806388227928e-01, 9.9999912516408629e-01, -9.7667804316468598e-01, -9.3100043178338632e-01, -8.5665081409168742e-01, -7.6704205539150783e-01, -6.5910058431692631e-01, -5.4174758974564252e-01, -4.1326612356796072e-01, -2.7959365648884665e-01, -1.4062909801984982e-01, 0.0000000000000000e+00, 1.4062909801984999e-01, 2.7959365648884665e-01, 4.1326612356796072e-01, 5.4174758974564230e-01, 6.5910058431692631e-01, 7.6704205539150805e-01, 8.5665081409168742e-01, 9.3100043178338632e-01, 9.7667804316468576e-01, -9.6753409357098230e-01, -9.2525748207473080e-01, -8.5035060952649710e-01, -7.6312321552688311e-01, -6.5492489019503775e-01, -5.3928225636842320e-01, -4.1086929825300122e-01, -2.7839960130800184e-01, -1.3984657475919560e-01, 0.0000000000000000e+00, 1.3984657475919574e-01, 2.7839960130800184e-01, 4.1086929825300122e-01, 5.3928225636842309e-01, 6.5492489019503775e-01, 7.6312321552688334e-01, 8.5035060952649710e-01, 9.2525748207473080e-01, 9.6753409357098219e-01, -9.5365379229338543e-01, -9.1565151268033040e-01, -8.4081179337547751e-01, -7.5657778987292490e-01, -6.4861094588519319e-01, -5.3516765893357610e-01, -4.0724761175966478e-01, -2.7640749952219290e-01, -1.3866451011301845e-01, 0.0000000000000000e+00, 1.3866451011301861e-01, 2.7640749952219290e-01, 4.0724761175966478e-01, 5.3516765893357587e-01, 6.4861094588519319e-01, 7.5657778987292512e-01, 8.4081179337547751e-01, 9.1565151268033040e-01, 9.5365379229338532e-01, -9.3482618705297293e-01, -9.0205912089860940e-01, -8.2792243329647475e-01, -7.4733676806240379e-01, -6.4009547898905073e-01, -5.2936534113888967e-01, -4.0236799077461427e-01, -2.7359991977296561e-01, -1.3707256796634723e-01, 0.0000000000000000e+00, 1.3707256796634740e-01, 2.7359991977296561e-01, 4.0236799077461427e-01, 5.2936534113888956e-01, 6.4009547898905073e-01, 7.4733676806240401e-01, 8.2792243329647475e-01, 9.0205912089860940e-01, 9.3482618705297282e-01, -9.1074450619015845e-01, -8.8429650169106433e-01, -8.1152289564182456e-01, -7.3529852467074075e-01, -6.2928912361282208e-01, -5.2181900667354353e-01, -3.9618395777095999e-01, -2.6995141957663576e-01, -1.3505625510836489e-01, 0.0000000000000000e+00, 1.3505625510836505e-01, 2.6995141957663576e-01, 3.9618395777095999e-01, 5.2181900667354331e-01, 6.2928912361282208e-01, 7.3529852467074086e-01, 8.1152289564182456e-01, 8.8429650169106433e-01, 9.1074450619015834e-01, -8.6210592655069052e-01, -7.9139499345478237e-01, -7.2032282942027204e-01, -6.1607133981999151e-01, -5.1245161444614085e-01, -3.8863324930985499e-01, -2.6542732392712320e-01, -1.3259621348252737e-01, 0.0000000000000000e+00, 1.3259621348252754e-01, 2.6542732392712320e-01, 3.8863324930985499e-01, 5.1245161444614062e-01, 6.1607133981999151e-01, 7.2032282942027215e-01, 7.9139499345478237e-01, 8.6210592655069052e-01, -8.3513450094501673e-01, -7.6724535325980669e-01, -7.0222177373044592e-01, -6.0028285513817525e-01, -5.0116106060544119e-01, -3.7963432698087546e-01, -2.5998192661566422e-01, -1.2966719032551594e-01, 0.0000000000000000e+00, 1.2966719032551607e-01, 2.5998192661566422e-01, 3.7963432698087546e-01, 5.0116106060544097e-01, 6.0028285513817525e-01, 7.0222177373044614e-01, 7.6724535325980669e-01, 8.3513450094501673e-01, -8.0290056739774962e-01, -7.3867963248711765e-01, -6.8074609299965194e-01, -5.8171439072203968e-01, -4.8781382748125035e-01, -3.6908127513370420e-01, -2.5355587662382567e-01, -1.2623654500549572e-01, 0.0000000000000000e+00, 1.2623654500549589e-01, 2.5355587662382567e-01, 3.6908127513370420e-01, 4.8781382748125024e-01, 5.8171439072203968e-01, 6.8074609299965205e-01, 7.3867963248711765e-01, 8.0290056739774962e-01, -7.0516135580653327e-01, -6.5556422224180078e-01, -5.6008952351246721e-01, -4.7223555773857756e-01, -3.5683623521922797e-01, -2.4607235825701007e-01, -1.2226205860338232e-01, 0.0000000000000000e+00, 1.2226205860338248e-01, 2.4607235825701007e-01, 3.5683623521922797e-01, 4.7223555773857739e-01, 5.6008952351246721e-01, 6.5556422224180078e-01, 7.0516135580653327e-01, -6.2622922204952469e-01, -5.3503778567383953e-01, -4.5419674569446861e-01, -3.4271789500339139e-01, -2.3743140261949641e-01, -1.1768864551837875e-01, 0.0000000000000000e+00, 1.1768864551837889e-01, 2.3743140261949641e-01, 3.4271789500339139e-01, 4.5419674569446850e-01, 5.3503778567383953e-01, 6.2622922204952469e-01, -5.0605049710887806e-01, -4.3339025796878267e-01, -3.2648331967298327e-01, -2.2750116247079261e-01, -1.1244324890790776e-01, 0.0000000000000000e+00, 1.1244324890790788e-01, 2.2750116247079261e-01, 3.2648331967298327e-01, 4.3339025796878256e-01, 5.0605049710887806e-01, -4.0939433032355521e-01, -3.0779783328158689e-01, -2.1610397827265473e-01, -1.0642655588236502e-01, 0.0000000000000000e+00, 1.0642655588236513e-01, 2.1610397827265473e-01, 3.0779783328158689e-01, 4.0939433032355516e-01, -2.0299291231217795e-01, 0.0000000000000000e+00, 2.0299291231217795e-01 }; const float hammerAitovSampleVertices[852] = { 9.6296205447948291e-01, 0.0000000000000000e+00, -9.2592592592592604e-01, -3.0000000000000004e-01, -9.6164021164021185e-01, -1.9999999999999996e-01, -9.2592592592592615e-01, -9.9999999999999978e-02, -9.6164021164021163e-01, 0.0000000000000000e+00, -9.2592592592592604e-01, 1.0000000000000009e-01, -9.6164021164021185e-01, 1.9999999999999996e-01, -9.2592592592592604e-01, 3.0000000000000004e-01, -8.5185185185185197e-01, -5.0000000000000000e-01, -8.8756613756613767e-01, -4.0000000000000008e-01, -8.5185185185185197e-01, -3.0000000000000010e-01, -8.8756613756613745e-01, -1.9999999999999996e-01, -8.5185185185185208e-01, -9.9999999999999978e-02, -8.8756613756613756e-01, 0.0000000000000000e+00, -8.5185185185185208e-01, 1.0000000000000009e-01, -8.8756613756613745e-01, 1.9999999999999996e-01, -8.5185185185185197e-01, 3.0000000000000010e-01, -8.8756613756613756e-01, 3.9999999999999986e-01, -8.5185185185185197e-01, 5.0000000000000000e-01, -7.7777777777777790e-01, -5.0000000000000011e-01, -8.1349206349206338e-01, -4.0000000000000008e-01, -7.7777777777777790e-01, -3.0000000000000004e-01, -8.1349206349206349e-01, -1.9999999999999996e-01, -7.7777777777777768e-01, -9.9999999999999964e-02, -8.1349206349206360e-01, 0.0000000000000000e+00, -7.7777777777777768e-01, 1.0000000000000009e-01, -8.1349206349206349e-01, 1.9999999999999996e-01, -7.7777777777777790e-01, 3.0000000000000004e-01, -8.1349206349206349e-01, 3.9999999999999991e-01, -7.7777777777777790e-01, 5.0000000000000011e-01, -7.0370370370370350e-01, -6.9999999999999996e-01, -7.3941798941798942e-01, -6.0000000000000009e-01, -7.0370370370370350e-01, -5.0000000000000000e-01, -7.3941798941798953e-01, -4.0000000000000008e-01, -7.0370370370370350e-01, -3.0000000000000010e-01, -7.3941798941798942e-01, -1.9999999999999998e-01, -7.0370370370370372e-01, -9.9999999999999978e-02, -7.3941798941798942e-01, 0.0000000000000000e+00, -7.0370370370370372e-01, 1.0000000000000010e-01, -7.3941798941798942e-01, 1.9999999999999998e-01, -7.0370370370370350e-01, 3.0000000000000010e-01, -7.3941798941798920e-01, 3.9999999999999986e-01, -7.0370370370370350e-01, 5.0000000000000000e-01, -7.3941798941798964e-01, 6.0000000000000020e-01, -7.0370370370370350e-01, 6.9999999999999996e-01, -6.2962962962962965e-01, -7.0000000000000007e-01, -6.6534391534391535e-01, -6.0000000000000009e-01, -6.2962962962962976e-01, -5.0000000000000000e-01, -6.6534391534391546e-01, -4.0000000000000002e-01, -6.2962962962962976e-01, -3.0000000000000010e-01, -6.6534391534391557e-01, -1.9999999999999998e-01, -6.2962962962962965e-01, -9.9999999999999978e-02, -6.6534391534391546e-01, 0.0000000000000000e+00, -6.2962962962962965e-01, 1.0000000000000012e-01, -6.6534391534391557e-01, 1.9999999999999998e-01, -6.2962962962962976e-01, 3.0000000000000010e-01, -6.6534391534391557e-01, 3.9999999999999991e-01, -6.2962962962962976e-01, 5.0000000000000000e-01, -6.6534391534391557e-01, 6.0000000000000020e-01, -6.2962962962962965e-01, 7.0000000000000007e-01, -5.9126984126984128e-01, -8.0000000000000016e-01, -5.5555555555555558e-01, -7.0000000000000007e-01, -5.9126984126984117e-01, -6.0000000000000009e-01, -5.5555555555555569e-01, -5.0000000000000000e-01, -5.9126984126984150e-01, -3.9999999999999997e-01, -5.5555555555555580e-01, -3.0000000000000010e-01, -5.9126984126984139e-01, -1.9999999999999993e-01, -5.5555555555555558e-01, -9.9999999999999978e-02, -5.9126984126984128e-01, 0.0000000000000000e+00, -5.5555555555555558e-01, 1.0000000000000007e-01, -5.9126984126984139e-01, 1.9999999999999993e-01, -5.5555555555555580e-01, 3.0000000000000010e-01, -5.9126984126984139e-01, 3.9999999999999986e-01, -5.5555555555555569e-01, 5.0000000000000000e-01, -5.9126984126984150e-01, 6.0000000000000020e-01, -5.5555555555555558e-01, 7.0000000000000007e-01, -5.9126984126984128e-01, 8.0000000000000016e-01, -5.1719576719576688e-01, -8.0000000000000016e-01, -4.8148148148148145e-01, -7.0000000000000007e-01, -5.1719576719576710e-01, -6.0000000000000009e-01, -4.8148148148148157e-01, -5.0000000000000000e-01, -5.1719576719576721e-01, -4.0000000000000008e-01, -4.8148148148148140e-01, -3.0000000000000010e-01, -5.1719576719576710e-01, -1.9999999999999998e-01, -4.8148148148148140e-01, -9.9999999999999978e-02, -5.1719576719576721e-01, 0.0000000000000000e+00, -4.8148148148148140e-01, 1.0000000000000010e-01, -5.1719576719576710e-01, 1.9999999999999998e-01, -4.8148148148148140e-01, 3.0000000000000010e-01, -5.1719576719576721e-01, 3.9999999999999986e-01, -4.8148148148148157e-01, 5.0000000000000000e-01, -5.1719576719576710e-01, 6.0000000000000020e-01, -4.8148148148148145e-01, 7.0000000000000007e-01, -5.1719576719576688e-01, 8.0000000000000016e-01, -4.0740740740740744e-01, -9.0000000000000002e-01, -4.4312169312169292e-01, -8.0000000000000016e-01, -4.0740740740740755e-01, -7.0000000000000007e-01, -4.4312169312169325e-01, -5.9999999999999998e-01, -4.0740740740740744e-01, -5.0000000000000000e-01, -4.4312169312169325e-01, -4.0000000000000002e-01, -4.0740740740740738e-01, -3.0000000000000010e-01, -4.4312169312169319e-01, -1.9999999999999993e-01, -4.0740740740740761e-01, -9.9999999999999978e-02, -4.4312169312169319e-01, 0.0000000000000000e+00, -4.0740740740740750e-01, 1.0000000000000010e-01, -4.4312169312169319e-01, 1.9999999999999993e-01, -4.0740740740740738e-01, 3.0000000000000010e-01, -4.4312169312169308e-01, 3.9999999999999991e-01, -4.0740740740740744e-01, 5.0000000000000000e-01, -4.4312169312169325e-01, 6.0000000000000009e-01, -4.0740740740740755e-01, 7.0000000000000007e-01, -4.4312169312169292e-01, 8.0000000000000016e-01, -4.0740740740740766e-01, 8.9999999999999991e-01, -3.3333333333333348e-01, -9.0000000000000013e-01, -3.6904761904761890e-01, -8.0000000000000027e-01, -3.3333333333333320e-01, -7.0000000000000007e-01, -3.6904761904761896e-01, -5.9999999999999998e-01, -3.3333333333333337e-01, -5.0000000000000000e-01, -3.6904761904761918e-01, -4.0000000000000008e-01, -3.3333333333333337e-01, -3.0000000000000004e-01, -3.6904761904761918e-01, -1.9999999999999996e-01, -3.3333333333333348e-01, -9.9999999999999978e-02, -3.6904761904761907e-01, 0.0000000000000000e+00, -3.3333333333333348e-01, 1.0000000000000010e-01, -3.6904761904761918e-01, 1.9999999999999996e-01, -3.3333333333333337e-01, 3.0000000000000004e-01, -3.6904761904761918e-01, 3.9999999999999980e-01, -3.3333333333333337e-01, 5.0000000000000000e-01, -3.6904761904761935e-01, 6.0000000000000009e-01, -3.3333333333333320e-01, 7.0000000000000007e-01, -3.6904761904761890e-01, 8.0000000000000027e-01, -3.3333333333333381e-01, 9.0000000000000002e-01, -2.5925925925925952e-01, -8.9999999999999991e-01, -2.9497354497354517e-01, -8.0000000000000016e-01, -2.5925925925925936e-01, -6.9999999999999996e-01, -2.9497354497354511e-01, -5.9999999999999987e-01, -2.5925925925925941e-01, -5.0000000000000000e-01, -2.9497354497354500e-01, -4.0000000000000002e-01, -2.5925925925925936e-01, -3.0000000000000004e-01, -2.9497354497354500e-01, -1.9999999999999996e-01, -2.5925925925925924e-01, -9.9999999999999978e-02, -2.9497354497354500e-01, 0.0000000000000000e+00, -2.5925925925925924e-01, 1.0000000000000010e-01, -2.9497354497354500e-01, 1.9999999999999996e-01, -2.5925925925925936e-01, 3.0000000000000004e-01, -2.9497354497354505e-01, 3.9999999999999997e-01, -2.5925925925925941e-01, 5.0000000000000000e-01, -2.9497354497354511e-01, 6.0000000000000020e-01, -2.5925925925925936e-01, 6.9999999999999996e-01, -2.9497354497354517e-01, 8.0000000000000016e-01, -2.5925925925925969e-01, 8.9999999999999980e-01, -1.8518518518518509e-01, -9.0000000000000013e-01, -2.2089947089947121e-01, -8.0000000000000016e-01, -1.8518518518518520e-01, -7.0000000000000007e-01, -2.2089947089947107e-01, -5.9999999999999987e-01, -1.8518518518518526e-01, -5.0000000000000011e-01, -2.2089947089947101e-01, -4.0000000000000008e-01, -1.8518518518518526e-01, -3.0000000000000010e-01, -2.2089947089947096e-01, -1.9999999999999996e-01, -1.8518518518518529e-01, -9.9999999999999978e-02, -2.2089947089947098e-01, 0.0000000000000000e+00, -1.8518518518518529e-01, 1.0000000000000009e-01, -2.2089947089947096e-01, 1.9999999999999996e-01, -1.8518518518518526e-01, 3.0000000000000010e-01, -2.2089947089947107e-01, 3.9999999999999991e-01, -1.8518518518518526e-01, 5.0000000000000011e-01, -2.2089947089947098e-01, 6.0000000000000020e-01, -1.8518518518518520e-01, 7.0000000000000007e-01, -2.2089947089947121e-01, 8.0000000000000016e-01, -1.8518518518518517e-01, 8.9999999999999980e-01, -1.1111111111111098e-01, -9.0000000000000036e-01, -1.4682539682539689e-01, -8.0000000000000004e-01, -1.1111111111111108e-01, -7.0000000000000018e-01, -1.4682539682539686e-01, -5.9999999999999998e-01, -1.1111111111111117e-01, -5.0000000000000011e-01, -1.4682539682539689e-01, -4.0000000000000008e-01, -1.1111111111111116e-01, -3.0000000000000010e-01, -1.4682539682539683e-01, -1.9999999999999996e-01, -1.1111111111111119e-01, -9.9999999999999978e-02, -1.4682539682539689e-01, 0.0000000000000000e+00, -1.1111111111111119e-01, 1.0000000000000009e-01, -1.4682539682539683e-01, 1.9999999999999996e-01, -1.1111111111111116e-01, 3.0000000000000010e-01, -1.4682539682539686e-01, 4.0000000000000002e-01, -1.1111111111111117e-01, 5.0000000000000011e-01, -1.4682539682539680e-01, 6.0000000000000009e-01, -1.1111111111111108e-01, 7.0000000000000018e-01, -1.4682539682539689e-01, 8.0000000000000004e-01, -1.1111111111111148e-01, 8.9999999999999980e-01, -3.7037037037036979e-02, -9.0000000000000036e-01, -7.2751322751322886e-02, -8.0000000000000004e-01, -3.7037037037037090e-02, -6.9999999999999996e-01, -7.2751322751322858e-02, -5.9999999999999998e-01, -3.7037037037037084e-02, -5.0000000000000011e-01, -7.2751322751322817e-02, -4.0000000000000008e-01, -3.7037037037037084e-02, -3.0000000000000010e-01, -7.2751322751322817e-02, -1.9999999999999996e-01, -3.7037037037037104e-02, -9.9999999999999978e-02, -7.2751322751322817e-02, 0.0000000000000000e+00, -3.7037037037037097e-02, 1.0000000000000010e-01, -7.2751322751322817e-02, 1.9999999999999996e-01, -3.7037037037037084e-02, 3.0000000000000010e-01, -7.2751322751322831e-02, 3.9999999999999991e-01, -3.7037037037037084e-02, 5.0000000000000011e-01, -7.2751322751322817e-02, 6.0000000000000020e-01, -3.7037037037037090e-02, 6.9999999999999996e-01, -7.2751322751322886e-02, 8.0000000000000004e-01, -3.7037037037037174e-02, 8.9999999999999969e-01, -1.3227490084659948e-03, -9.9999825033046841e-01, 3.7037037037036862e-02, -9.0000000000000036e-01, 1.3227513227512676e-03, -8.0000000000000016e-01, 3.7037037037036979e-02, -6.9999999999999996e-01, 1.3227513227512665e-03, -6.0000000000000009e-01, 3.7037037037036973e-02, -5.0000000000000011e-01, 1.3227513227512676e-03, -4.0000000000000008e-01, 3.7037037037036973e-02, -3.0000000000000010e-01, 1.3227513227512672e-03, -1.9999999999999996e-01, 3.7037037037036993e-02, -9.9999999999999978e-02, 1.3227513227512674e-03, 0.0000000000000000e+00, 3.7037037037036986e-02, 1.0000000000000010e-01, 1.3227513227512672e-03, 1.9999999999999996e-01, 3.7037037037036973e-02, 3.0000000000000010e-01, 1.3227513227512672e-03, 4.0000000000000002e-01, 3.7037037037036973e-02, 5.0000000000000011e-01, 1.3227513227512680e-03, 6.0000000000000009e-01, 3.7037037037036979e-02, 6.9999999999999996e-01, 1.3227513227512676e-03, 8.0000000000000016e-01, 3.7037037037037063e-02, 8.9999999999999969e-01, -1.3227490084659948e-03, 9.9999825033046841e-01, 1.1111111111111098e-01, -9.0000000000000036e-01, 7.5396825396825462e-02, -8.0000000000000016e-01, 1.1111111111111108e-01, -7.0000000000000018e-01, 7.5396825396825462e-02, -6.0000000000000009e-01, 1.1111111111111117e-01, -5.0000000000000011e-01, 7.5396825396825434e-02, -4.0000000000000008e-01, 1.1111111111111116e-01, -3.0000000000000010e-01, 7.5396825396825462e-02, -1.9999999999999996e-01, 1.1111111111111119e-01, -9.9999999999999978e-02, 7.5396825396825434e-02, 0.0000000000000000e+00, 1.1111111111111119e-01, 1.0000000000000009e-01, 7.5396825396825462e-02, 1.9999999999999996e-01, 1.1111111111111116e-01, 3.0000000000000010e-01, 7.5396825396825448e-02, 3.9999999999999991e-01, 1.1111111111111117e-01, 5.0000000000000011e-01, 7.5396825396825420e-02, 6.0000000000000020e-01, 1.1111111111111108e-01, 7.0000000000000018e-01, 7.5396825396825462e-02, 8.0000000000000016e-01, 1.1111111111111148e-01, 8.9999999999999980e-01, 1.8518518518518504e-01, -9.0000000000000013e-01, 1.4947089947089945e-01, -8.0000000000000016e-01, 1.8518518518518512e-01, -7.0000000000000007e-01, 1.4947089947089948e-01, -6.0000000000000009e-01, 1.8518518518518515e-01, -5.0000000000000011e-01, 1.4947089947089942e-01, -4.0000000000000002e-01, 1.8518518518518512e-01, -3.0000000000000010e-01, 1.4947089947089939e-01, -1.9999999999999996e-01, 1.8518518518518517e-01, -9.9999999999999978e-02, 1.4947089947089939e-01, 0.0000000000000000e+00, 1.8518518518518517e-01, 1.0000000000000009e-01, 1.4947089947089939e-01, 1.9999999999999996e-01, 1.8518518518518512e-01, 3.0000000000000010e-01, 1.4947089947089939e-01, 3.9999999999999997e-01, 1.8518518518518515e-01, 5.0000000000000011e-01, 1.4947089947089942e-01, 6.0000000000000020e-01, 1.8518518518518512e-01, 7.0000000000000007e-01, 1.4947089947089945e-01, 8.0000000000000016e-01, 1.8518518518518515e-01, 8.9999999999999980e-01, 2.5925925925925952e-01, -8.9999999999999991e-01, 2.2354497354497380e-01, -7.9999999999999993e-01, 2.5925925925925936e-01, -6.9999999999999996e-01, 2.2354497354497360e-01, -6.0000000000000009e-01, 2.5925925925925941e-01, -5.0000000000000000e-01, 2.2354497354497360e-01, -4.0000000000000008e-01, 2.5925925925925936e-01, -3.0000000000000004e-01, 2.2354497354497352e-01, -1.9999999999999998e-01, 2.5925925925925924e-01, -9.9999999999999978e-02, 2.2354497354497366e-01, 0.0000000000000000e+00, 2.5925925925925924e-01, 1.0000000000000010e-01, 2.2354497354497352e-01, 1.9999999999999998e-01, 2.5925925925925936e-01, 3.0000000000000004e-01, 2.2354497354497366e-01, 3.9999999999999991e-01, 2.5925925925925941e-01, 5.0000000000000000e-01, 2.2354497354497352e-01, 6.0000000000000020e-01, 2.5925925925925936e-01, 6.9999999999999996e-01, 2.2354497354497380e-01, 7.9999999999999993e-01, 2.5925925925925969e-01, 8.9999999999999980e-01, 3.3333333333333348e-01, -9.0000000000000013e-01, 2.9761904761904773e-01, -8.0000000000000016e-01, 3.3333333333333320e-01, -7.0000000000000007e-01, 2.9761904761904767e-01, -5.9999999999999998e-01, 3.3333333333333337e-01, -5.0000000000000000e-01, 2.9761904761904762e-01, -4.0000000000000002e-01, 3.3333333333333331e-01, -3.0000000000000004e-01, 2.9761904761904756e-01, -1.9999999999999996e-01, 3.3333333333333337e-01, -9.9999999999999978e-02, 2.9761904761904756e-01, 0.0000000000000000e+00, 3.3333333333333337e-01, 1.0000000000000010e-01, 2.9761904761904756e-01, 1.9999999999999996e-01, 3.3333333333333331e-01, 3.0000000000000004e-01, 2.9761904761904756e-01, 3.9999999999999997e-01, 3.3333333333333337e-01, 5.0000000000000000e-01, 2.9761904761904762e-01, 6.0000000000000020e-01, 3.3333333333333320e-01, 7.0000000000000007e-01, 2.9761904761904773e-01, 8.0000000000000016e-01, 3.3333333333333381e-01, 9.0000000000000002e-01, 4.0740740740740744e-01, -9.0000000000000002e-01, 3.7169312169312152e-01, -8.0000000000000038e-01, 4.0740740740740755e-01, -7.0000000000000007e-01, 3.7169312169312180e-01, -5.9999999999999987e-01, 4.0740740740740744e-01, -5.0000000000000000e-01, 3.7169312169312174e-01, -4.0000000000000008e-01, 4.0740740740740738e-01, -3.0000000000000010e-01, 3.7169312169312169e-01, -1.9999999999999996e-01, 4.0740740740740761e-01, -9.9999999999999978e-02, 3.7169312169312180e-01, 0.0000000000000000e+00, 4.0740740740740750e-01, 1.0000000000000010e-01, 3.7169312169312169e-01, 1.9999999999999996e-01, 4.0740740740740738e-01, 3.0000000000000010e-01, 3.7169312169312158e-01, 3.9999999999999986e-01, 4.0740740740740744e-01, 5.0000000000000000e-01, 3.7169312169312180e-01, 6.0000000000000009e-01, 4.0740740740740755e-01, 7.0000000000000007e-01, 3.7169312169312152e-01, 8.0000000000000038e-01, 4.0740740740740766e-01, 8.9999999999999991e-01, 4.4576719576719553e-01, -8.0000000000000004e-01, 4.8148148148148145e-01, -7.0000000000000007e-01, 4.4576719576719553e-01, -5.9999999999999998e-01, 4.8148148148148145e-01, -5.0000000000000000e-01, 4.4576719576719570e-01, -4.0000000000000008e-01, 4.8148148148148134e-01, -3.0000000000000010e-01, 4.4576719576719581e-01, -1.9999999999999996e-01, 4.8148148148148140e-01, -9.9999999999999978e-02, 4.4576719576719581e-01, 0.0000000000000000e+00, 4.8148148148148140e-01, 1.0000000000000010e-01, 4.4576719576719581e-01, 1.9999999999999996e-01, 4.8148148148148134e-01, 3.0000000000000010e-01, 4.4576719576719565e-01, 3.9999999999999986e-01, 4.8148148148148145e-01, 5.0000000000000000e-01, 4.4576719576719570e-01, 6.0000000000000020e-01, 4.8148148148148145e-01, 7.0000000000000007e-01, 4.4576719576719553e-01, 8.0000000000000004e-01, 5.1984126984127010e-01, -8.0000000000000004e-01, 5.5555555555555558e-01, -7.0000000000000007e-01, 5.1984126984127010e-01, -5.9999999999999987e-01, 5.5555555555555569e-01, -5.0000000000000000e-01, 5.1984126984126988e-01, -4.0000000000000013e-01, 5.5555555555555580e-01, -3.0000000000000010e-01, 5.1984126984126988e-01, -1.9999999999999996e-01, 5.5555555555555558e-01, -9.9999999999999978e-02, 5.1984126984126988e-01, 0.0000000000000000e+00, 5.5555555555555558e-01, 1.0000000000000007e-01, 5.1984126984126988e-01, 1.9999999999999996e-01, 5.5555555555555580e-01, 3.0000000000000010e-01, 5.1984126984126999e-01, 3.9999999999999997e-01, 5.5555555555555569e-01, 5.0000000000000000e-01, 5.1984126984126988e-01, 6.0000000000000009e-01, 5.5555555555555558e-01, 7.0000000000000007e-01, 5.1984126984127010e-01, 8.0000000000000004e-01, 5.9391534391534351e-01, -8.0000000000000004e-01, 6.2962962962962965e-01, -7.0000000000000007e-01, 5.9391534391534384e-01, -5.9999999999999998e-01, 6.2962962962962965e-01, -5.0000000000000000e-01, 5.9391534391534395e-01, -4.0000000000000008e-01, 6.2962962962962976e-01, -3.0000000000000010e-01, 5.9391534391534395e-01, -1.9999999999999993e-01, 6.2962962962962954e-01, -9.9999999999999978e-02, 5.9391534391534384e-01, 0.0000000000000000e+00, 6.2962962962962954e-01, 1.0000000000000012e-01, 5.9391534391534395e-01, 1.9999999999999993e-01, 6.2962962962962976e-01, 3.0000000000000010e-01, 5.9391534391534373e-01, 3.9999999999999991e-01, 6.2962962962962965e-01, 5.0000000000000000e-01, 5.9391534391534384e-01, 6.0000000000000009e-01, 6.2962962962962965e-01, 7.0000000000000007e-01, 5.9391534391534351e-01, 8.0000000000000004e-01, 7.0370370370370350e-01, -6.9999999999999996e-01, 6.6798941798941802e-01, -6.0000000000000009e-01, 7.0370370370370350e-01, -5.0000000000000000e-01, 6.6798941798941813e-01, -4.0000000000000002e-01, 7.0370370370370350e-01, -3.0000000000000010e-01, 6.6798941798941813e-01, -1.9999999999999996e-01, 7.0370370370370372e-01, -9.9999999999999978e-02, 6.6798941798941802e-01, 0.0000000000000000e+00, 7.0370370370370372e-01, 1.0000000000000010e-01, 6.6798941798941813e-01, 1.9999999999999996e-01, 7.0370370370370350e-01, 3.0000000000000010e-01, 6.6798941798941824e-01, 3.9999999999999991e-01, 7.0370370370370350e-01, 5.0000000000000000e-01, 6.6798941798941813e-01, 6.0000000000000020e-01, 7.0370370370370350e-01, 6.9999999999999996e-01, 7.4206349206349209e-01, -6.0000000000000009e-01, 7.7777777777777768e-01, -5.0000000000000000e-01, 7.4206349206349209e-01, -4.0000000000000008e-01, 7.7777777777777757e-01, -3.0000000000000004e-01, 7.4206349206349209e-01, -1.9999999999999998e-01, 7.7777777777777768e-01, -9.9999999999999964e-02, 7.4206349206349198e-01, 0.0000000000000000e+00, 7.7777777777777768e-01, 1.0000000000000009e-01, 7.4206349206349209e-01, 1.9999999999999998e-01, 7.7777777777777757e-01, 3.0000000000000004e-01, 7.4206349206349176e-01, 3.9999999999999991e-01, 7.7777777777777768e-01, 5.0000000000000000e-01, 7.4206349206349209e-01, 6.0000000000000009e-01, 8.5185185185185197e-01, -5.0000000000000000e-01, 8.1613756613756627e-01, -4.0000000000000008e-01, 8.5185185185185197e-01, -3.0000000000000010e-01, 8.1613756613756627e-01, -1.9999999999999998e-01, 8.5185185185185208e-01, -9.9999999999999978e-02, 8.1613756613756594e-01, 0.0000000000000000e+00, 8.5185185185185208e-01, 1.0000000000000009e-01, 8.1613756613756627e-01, 1.9999999999999998e-01, 8.5185185185185197e-01, 3.0000000000000010e-01, 8.1613756613756605e-01, 3.9999999999999991e-01, 8.5185185185185197e-01, 5.0000000000000000e-01, 8.9021164021164012e-01, -4.0000000000000002e-01, 9.2592592592592604e-01, -3.0000000000000010e-01, 8.9021164021164012e-01, -1.9999999999999996e-01, 9.2592592592592615e-01, -9.9999999999999992e-02, 8.9021164021164023e-01, 0.0000000000000000e+00, 9.2592592592592604e-01, 1.0000000000000010e-01, 8.9021164021164012e-01, 1.9999999999999996e-01, 9.2592592592592604e-01, 3.0000000000000010e-01, 8.9021164021164012e-01, 3.9999999999999997e-01, 9.6428571428571441e-01, -1.9999999999999996e-01, 9.6428571428571430e-01, 0.0000000000000000e+00, 9.6428571428571441e-01, 1.9999999999999996e-01 }; const int hammerAitovSampleIndices[2472] = { 137, 118, 117, 322, 303, 302, 5, 13, 14, 379, 363, 378, 391, 390, 403, 397, 398, 383, 49, 34, 48, 164, 145, 144, 32, 19, 31, 218, 219, 199, 141, 122, 121, 3, 11, 12, 12, 13, 3, 24, 23, 37, 258, 276, 277, 5, 6, 4, 16, 26, 27, 16, 27, 28, 89, 73, 72, 131, 228, 112, 54, 55, 40, 25, 38, 39, 82, 100, 101, 241, 221, 240, 161, 180, 181, 105, 124, 106, 169, 187, 188, 206, 205, 226, 387, 388, 371, 158, 159, 140, 338, 319, 337, 367, 383, 384, 332, 331, 349, 406, 394, 393, 383, 382, 396, 292, 312, 293, 210, 230, 211, 116, 135, 117, 248, 249, 229, 254, 272, 273, 275, 256, 274, 378, 362, 361, 30, 31, 8, 119, 100, 118, 30, 46, 31, 138, 137, 156, 64, 47, 63, 173, 172, 192, 77, 61, 60, 62, 45, 61, 79, 78, 97, 232, 231, 251, 191, 210, 211, 95, 114, 96, 133, 113, 132, 173, 154, 153, 230, 229, 249, 134, 115, 133, 133, 114, 113, 172, 190, 191, 171, 152, 151, 154, 134, 153, 235, 236, 215, 213, 214, 193, 252, 270, 271, 175, 157, 156, 176, 194, 195, 81, 99, 82, 117, 98, 116, 121, 139, 140, 179, 180, 161, 34, 50, 35, 47, 46, 62, 19, 33, 20, 1, 10, 11, 21, 33, 34, 9, 1, 8, 35, 50, 36, 23, 35, 36, 37, 36, 52, 83, 66, 65, 141, 140, 160, 177, 157, 176, 87, 70, 69, 24, 14, 13, 53, 38, 52, 26, 14, 25, 40, 55, 56, 54, 38, 53, 16, 28, 17, 26, 16, 15, 28, 41, 29, 91, 75, 74, 187, 206, 188, 90, 109, 91, 42, 29, 41, 128, 127, 147, 72, 56, 55, 129, 110, 128, 317, 298, 316, 130, 149, 131, 185, 166, 165, 148, 167, 168, 186, 205, 206, 226, 205, 225, 183, 164, 163, 186, 167, 185, 181, 182, 163, 199, 200, 180, 144, 125, 143, 182, 183, 163, 73, 91, 74, 104, 124, 105, 196, 177, 176, 140, 159, 160, 234, 215, 214, 220, 200, 199, 180, 179, 198, 240, 219, 239, 197, 198, 178, 335, 317, 334, 294, 314, 295, 337, 336, 353, 260, 280, 261, 352, 370, 353, 318, 319, 300, 321, 339, 340, 260, 279, 280, 301, 302, 283, 224, 204, 203, 244, 225, 224, 205, 204, 224, 188, 207, 228, 246, 225, 245, 265, 245, 264, 247, 228, 227, 354, 372, 355, 322, 304, 303, 356, 355, 372, 386, 371, 370, 323, 322, 340, 302, 301, 320, 357, 356, 374, 371, 354, 370, 372, 388, 373, 372, 354, 371, 373, 388, 389, 397, 410, 398, 335, 353, 336, 330, 312, 311, 350, 333, 349, 296, 277, 295, 331, 313, 330, 410, 409, 420, 366, 365, 382, 405, 414, 415, 420, 419, 425, 418, 417, 0, 424, 423, 425, 416, 415, 423, 364, 380, 365, 345, 329, 328, 365, 381, 382, 332, 333, 315, 418, 408, 407, 396, 382, 381, 365, 366, 348, 366, 350, 349, 198, 179, 178, 274, 254, 273, 257, 238, 237, 195, 194, 214, 293, 275, 274, 255, 235, 254, 290, 289, 308, 288, 287, 306, 233, 252, 253, 290, 308, 309, 232, 212, 211, 231, 250, 251, 287, 268, 267, 229, 208, 248, 268, 250, 249, 270, 251, 250, 308, 289, 288, 287, 269, 268, 307, 308, 288, 267, 208, 286, 307, 325, 326, 289, 270, 269, 405, 393, 404, 392, 379, 378, 359, 358, 375, 290, 310, 291, 360, 342, 359, 286, 287, 267, 95, 96, 78, 77, 95, 78, 45, 46, 30, 63, 62, 79, 45, 60, 61, 60, 45, 30, 47, 62, 63, 46, 45, 62, 31, 19, 8, 31, 46, 32, 1, 9, 10, 8, 19, 20, 64, 81, 65, 63, 80, 81, 48, 32, 47, 33, 19, 32, 81, 64, 63, 32, 46, 47, 80, 79, 97, 62, 61, 79, 81, 80, 99, 63, 79, 80, 80, 98, 99, 116, 97, 96, 99, 98, 118, 80, 97, 98, 97, 116, 98, 134, 133, 152, 94, 95, 77, 114, 133, 115, 97, 78, 96, 79, 61, 78, 61, 77, 78, 60, 94, 77, 94, 114, 95, 94, 113, 114, 208, 113, 94, 152, 171, 153, 208, 132, 113, 170, 190, 171, 96, 115, 116, 96, 114, 115, 117, 136, 137, 135, 115, 134, 132, 152, 133, 151, 170, 171, 152, 153, 134, 172, 191, 192, 229, 209, 208, 209, 210, 189, 170, 151, 208, 189, 170, 208, 189, 190, 170, 132, 151, 152, 132, 208, 151, 171, 172, 153, 171, 190, 172, 175, 155, 174, 211, 231, 232, 233, 234, 213, 192, 191, 212, 174, 193, 194, 192, 212, 193, 172, 173, 153, 192, 193, 174, 156, 155, 175, 173, 192, 174, 135, 154, 136, 173, 174, 155, 134, 154, 135, 173, 155, 154, 115, 135, 116, 154, 155, 136, 136, 117, 135, 118, 98, 117, 156, 136, 155, 156, 137, 136, 81, 82, 65, 99, 118, 100, 120, 100, 119, 82, 99, 100, 84, 101, 102, 101, 100, 120, 138, 119, 137, 139, 120, 119, 157, 138, 156, 119, 118, 137, 174, 194, 175, 193, 214, 194, 216, 195, 215, 176, 175, 194, 197, 178, 196, 158, 140, 139, 158, 138, 157, 139, 119, 138, 196, 176, 195, 157, 175, 176, 178, 177, 196, 158, 157, 177, 216, 217, 197, 179, 160, 159, 237, 238, 217, 218, 199, 198, 178, 159, 177, 178, 179, 159, 218, 198, 197, 199, 180, 198, 142, 143, 123, 102, 101, 120, 159, 158, 177, 139, 138, 158, 121, 102, 120, 84, 67, 83, 86, 85, 103, 68, 52, 51, 139, 121, 120, 140, 141, 121, 85, 67, 84, 83, 65, 82, 51, 52, 36, 68, 53, 52, 68, 51, 67, 21, 35, 22, 51, 66, 67, 51, 36, 50, 103, 84, 102, 67, 66, 83, 101, 83, 82, 101, 84, 83, 66, 50, 49, 48, 47, 64, 65, 49, 64, 33, 32, 48, 51, 50, 66, 35, 23, 22, 64, 49, 48, 65, 66, 49, 21, 34, 35, 21, 20, 33, 48, 34, 33, 49, 50, 34, 20, 9, 8, 20, 10, 9, 11, 22, 12, 11, 10, 22, 10, 21, 22, 10, 20, 21, 11, 2, 1, 4, 3, 13, 2, 11, 3, 38, 37, 52, 23, 12, 22, 38, 25, 37, 13, 12, 24, 37, 23, 36, 24, 12, 23, 2, 4, 6, 2, 3, 4, 13, 5, 4, 14, 15, 5, 86, 87, 69, 71, 55, 70, 24, 25, 14, 24, 37, 25, 70, 53, 69, 70, 54, 53, 103, 85, 84, 69, 53, 68, 121, 122, 102, 142, 141, 160, 86, 105, 87, 124, 104, 123, 85, 68, 67, 85, 69, 68, 85, 86, 69, 122, 141, 123, 38, 54, 39, 70, 55, 54, 88, 87, 105, 88, 71, 87, 87, 71, 70, 72, 57, 56, 56, 41, 40, 56, 42, 41, 28, 27, 41, 39, 54, 40, 39, 27, 26, 40, 41, 27, 27, 39, 40, 26, 25, 39, 5, 15, 6, 14, 26, 15, 15, 7, 6, 7, 16, 17, 7, 15, 16, 71, 72, 55, 57, 42, 56, 88, 89, 71, 145, 127, 126, 58, 43, 42, 29, 18, 28, 17, 18, 7, 17, 28, 18, 43, 29, 42, 43, 18, 29, 57, 58, 42, 44, 18, 43, 93, 76, 75, 44, 43, 58, 59, 76, 44, 58, 59, 44, 58, 57, 74, 75, 59, 74, 59, 58, 74, 111, 93, 92, 73, 57, 72, 109, 92, 91, 76, 59, 75, 92, 93, 75, 112, 76, 93, 91, 92, 75, 111, 112, 93, 110, 111, 92, 129, 148, 149, 108, 109, 90, 128, 147, 129, 89, 90, 73, 145, 126, 125, 91, 73, 90, 74, 57, 73, 71, 89, 72, 106, 125, 126, 89, 107, 90, 89, 88, 107, 107, 108, 90, 146, 165, 166, 183, 165, 164, 166, 147, 146, 129, 147, 148, 166, 148, 147, 108, 128, 109, 127, 146, 147, 109, 128, 110, 149, 168, 150, 109, 110, 92, 129, 130, 110, 111, 130, 112, 111, 110, 130, 130, 131, 112, 129, 149, 130, 148, 168, 149, 149, 150, 131, 168, 187, 169, 150, 169, 228, 150, 168, 169, 169, 188, 228, 303, 284, 283, 150, 228, 131, 168, 167, 187, 167, 166, 185, 188, 206, 207, 187, 186, 206, 203, 204, 184, 205, 186, 204, 187, 167, 186, 148, 166, 167, 184, 185, 165, 204, 186, 185, 242, 223, 222, 204, 185, 184, 202, 203, 184, 223, 224, 203, 181, 180, 200, 222, 203, 202, 202, 201, 222, 202, 183, 182, 163, 144, 162, 163, 164, 144, 184, 183, 202, 184, 165, 183, 162, 181, 163, 201, 202, 182, 145, 125, 144, 164, 165, 146, 108, 127, 128, 108, 107, 126, 88, 106, 107, 88, 105, 106, 108, 126, 127, 107, 106, 126, 146, 145, 164, 146, 127, 145, 144, 143, 162, 104, 105, 86, 125, 124, 143, 125, 106, 124, 103, 104, 86, 123, 143, 124, 103, 122, 104, 103, 102, 122, 122, 123, 104, 142, 160, 161, 143, 142, 162, 160, 179, 161, 141, 142, 123, 161, 162, 142, 219, 220, 199, 201, 182, 200, 161, 181, 162, 200, 182, 181, 240, 220, 219, 201, 200, 220, 257, 258, 239, 258, 278, 259, 259, 240, 239, 259, 241, 240, 296, 297, 277, 241, 259, 260, 258, 259, 239, 278, 297, 279, 278, 258, 277, 257, 256, 276, 334, 316, 315, 297, 278, 277, 315, 316, 296, 334, 317, 316, 297, 298, 279, 317, 336, 318, 278, 279, 260, 318, 336, 319, 316, 297, 296, 316, 298, 297, 262, 280, 281, 279, 298, 299, 298, 318, 299, 298, 317, 318, 283, 282, 301, 299, 318, 300, 261, 280, 262, 280, 299, 281, 281, 299, 300, 280, 279, 299, 223, 242, 243, 240, 221, 220, 242, 241, 261, 259, 278, 260, 261, 241, 260, 221, 201, 220, 242, 221, 241, 222, 201, 221, 243, 242, 261, 222, 221, 242, 263, 244, 243, 225, 205, 224, 222, 223, 203, 243, 244, 223, 262, 263, 243, 264, 284, 265, 223, 244, 224, 263, 245, 244, 244, 245, 225, 283, 302, 303, 265, 247, 246, 207, 206, 226, 207, 227, 228, 207, 226, 227, 226, 246, 227, 266, 228, 247, 227, 246, 247, 226, 225, 246, 245, 265, 246, 284, 266, 265, 228, 266, 285, 247, 265, 266, 303, 285, 284, 266, 284, 285, 228, 304, 323, 228, 285, 304, 321, 322, 302, 304, 285, 303, 340, 322, 321, 323, 304, 322, 264, 283, 284, 301, 281, 300, 263, 264, 245, 263, 282, 264, 261, 262, 243, 281, 282, 262, 264, 282, 283, 263, 262, 282, 281, 301, 282, 300, 319, 320, 337, 353, 354, 336, 317, 335, 400, 401, 387, 354, 353, 370, 337, 355, 338, 372, 373, 356, 338, 320, 319, 301, 300, 320, 336, 337, 319, 354, 355, 337, 320, 321, 302, 320, 338, 321, 356, 357, 339, 357, 323, 340, 339, 357, 340, 374, 323, 357, 339, 338, 355, 339, 321, 338, 374, 356, 373, 339, 355, 356, 386, 387, 371, 388, 372, 371, 373, 389, 374, 389, 402, 413, 389, 388, 402, 400, 387, 386, 402, 388, 387, 402, 401, 413, 402, 387, 401, 401, 400, 412, 421, 425, 422, 352, 369, 370, 401, 412, 413, 400, 385, 399, 386, 370, 369, 385, 400, 386, 412, 422, 413, 399, 412, 400, 411, 422, 412, 411, 421, 422, 419, 418, 0, 411, 420, 421, 417, 416, 423, 421, 420, 425, 411, 399, 410, 412, 399, 411, 385, 384, 398, 411, 410, 420, 398, 384, 383, 351, 352, 335, 369, 385, 386, 351, 335, 334, 352, 353, 335, 333, 351, 334, 368, 369, 352, 351, 368, 352, 384, 385, 369, 399, 398, 410, 399, 385, 398, 369, 368, 384, 351, 333, 350, 295, 314, 296, 333, 334, 315, 333, 332, 349, 315, 296, 314, 382, 367, 366, 368, 351, 350, 348, 366, 349, 382, 383, 367, 397, 383, 396, 384, 368, 367, 350, 367, 368, 350, 366, 367, 407, 417, 418, 419, 420, 409, 408, 397, 396, 409, 410, 397, 409, 418, 419, 408, 396, 395, 419, 0, 424, 409, 408, 418, 409, 397, 408, 393, 394, 379, 395, 396, 381, 395, 407, 408, 407, 395, 406, 419, 424, 425, 0, 417, 424, 407, 416, 417, 406, 395, 394, 417, 423, 424, 415, 414, 423, 416, 405, 415, 393, 392, 404, 405, 406, 393, 395, 381, 394, 416, 406, 405, 416, 407, 406, 345, 362, 346, 379, 394, 380, 344, 361, 362, 392, 393, 379, 345, 346, 329, 363, 379, 380, 310, 328, 311, 331, 348, 349, 346, 347, 329, 346, 363, 364, 347, 330, 329, 347, 348, 331, 363, 380, 364, 394, 381, 380, 347, 364, 348, 380, 381, 365, 314, 313, 332, 330, 347, 331, 348, 364, 365, 347, 346, 364, 315, 314, 332, 295, 276, 275, 330, 313, 312, 331, 332, 313, 293, 294, 275, 294, 295, 275, 275, 276, 256, 295, 277, 276, 313, 294, 312, 313, 314, 294, 258, 257, 276, 239, 219, 238, 217, 238, 218, 257, 239, 238, 217, 218, 197, 238, 219, 218, 196, 216, 197, 237, 256, 257, 236, 237, 217, 236, 255, 237, 256, 255, 274, 256, 237, 255, 195, 216, 196, 236, 217, 216, 216, 215, 236, 195, 214, 215, 254, 235, 253, 255, 236, 235, 272, 253, 252, 235, 215, 234, 272, 254, 253, 274, 255, 254, 310, 292, 291, 292, 293, 273, 273, 293, 274, 312, 294, 293, 291, 292, 273, 311, 312, 292, 310, 311, 292, 329, 330, 311, 290, 309, 310, 328, 329, 311, 326, 309, 308, 327, 328, 309, 269, 270, 250, 289, 271, 270, 291, 272, 271, 291, 273, 272, 271, 290, 291, 271, 289, 290, 213, 234, 214, 253, 235, 234, 212, 213, 193, 233, 253, 234, 233, 232, 251, 213, 212, 232, 232, 233, 213, 252, 271, 272, 251, 252, 233, 251, 270, 252, 267, 268, 248, 250, 231, 249, 191, 211, 212, 191, 190, 210, 230, 210, 209, 190, 189, 210, 208, 209, 189, 229, 230, 209, 231, 230, 249, 231, 211, 230, 248, 268, 249, 287, 288, 269, 268, 269, 250, 288, 289, 269, 306, 287, 286, 248, 208, 267, 358, 341, 305, 305, 306, 286, 286, 208, 305, 306, 324, 307, 306, 305, 324, 325, 341, 342, 324, 305, 341, 343, 325, 342, 341, 358, 342, 306, 307, 288, 326, 325, 343, 324, 325, 307, 324, 341, 325, 309, 326, 327, 308, 307, 326, 309, 328, 310, 362, 378, 363, 327, 345, 328, 327, 344, 345, 360, 344, 343, 327, 326, 343, 343, 344, 327, 344, 360, 361, 376, 361, 360, 377, 378, 361, 346, 362, 363, 345, 344, 362, 377, 392, 378, 404, 414, 405, 391, 377, 390, 391, 392, 377, 391, 404, 392, 391, 403, 404, 404, 403, 414, 390, 376, 375, 377, 361, 376, 343, 342, 360, 376, 359, 375, 342, 358, 359, 377, 376, 390, 360, 359, 376, 390, 375, 403 }; #endif IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/EnergyVisualizer/Source/0000775002537200253720000000000015257173642027376 5ustar zmoelnigzmoelnig././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/EnergyVisualizer/Source/PluginProcessor.cppIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/EnergyVisualizer/Source/PluginProces0000664002537200253720000003122115257173642031732 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #include "PluginProcessor.h" #include "PluginEditor.h" //============================================================================== EnergyVisualizerAudioProcessor::EnergyVisualizerAudioProcessor() : AudioProcessorBase ( #ifndef JucePlugin_PreferredChannelConfigurations BusesProperties() #if ! JucePlugin_IsMidiEffect #if ! JucePlugin_IsSynth .withInput ("Input", ((juce::PluginHostType::getPluginLoadedAs() == juce::AudioProcessor::wrapperType_VST3) ? juce::AudioChannelSet::ambisonic (1) : juce::AudioChannelSet::ambisonic (7)), true) #endif .withOutput ("Output", ((juce::PluginHostType::getPluginLoadedAs() == juce::AudioProcessor::wrapperType_VST3) ? juce::AudioChannelSet::ambisonic (1) : juce::AudioChannelSet::ambisonic (7)), true) #endif , #endif createParameterLayout()), decoderMatrix (nSamplePoints, 64) { orderSetting = parameters.getRawParameterValue ("orderSetting"); useSN3D = parameters.getRawParameterValue ("useSN3D"); peakLevel = parameters.getRawParameterValue ("peakLevel"); dynamicRange = parameters.getRawParameterValue ("dynamicRange"); holdMax = parameters.getRawParameterValue ("holdMax"); RMStimeConstant = parameters.getRawParameterValue ("RMStimeConstant"); parameters.addParameterListener ("orderSetting", this); parameters.addParameterListener ("RMStimeConstant", this); for (int point = 0; point < nSamplePoints; ++point) { auto* matrixRowPtr = decoderMatrix.getRawDataPointer() + point * 64; SHEval (7, hammerAitovSampleX[point], hammerAitovSampleY[point], hammerAitovSampleZ[point], matrixRowPtr, false); juce::FloatVectorOperations::multiply ( matrixRowPtr, matrixRowPtr, sn3d2n3d, 64); //expecting sn3d normalization -> converting it to handle n3d } decoderMatrix *= 1.0f / decodeCorrection (7); // revert 7th order correction rms.resize (nSamplePoints); std::fill (rms.begin(), rms.end(), 0.0f); weights.resize (64); startTimer (200); } EnergyVisualizerAudioProcessor::~EnergyVisualizerAudioProcessor() { } //============================================================================== int EnergyVisualizerAudioProcessor::getNumPrograms() { return 1; // NB: some hosts don't cope very well if you tell them there are 0 programs, // so this should be at least 1, even if you're not really implementing programs. } int EnergyVisualizerAudioProcessor::getCurrentProgram() { return 0; } void EnergyVisualizerAudioProcessor::setCurrentProgram (int index) { } const juce::String EnergyVisualizerAudioProcessor::getProgramName (int index) { return {}; } void EnergyVisualizerAudioProcessor::changeProgramName (int index, const juce::String& newName) { } //============================================================================== void EnergyVisualizerAudioProcessor::prepareToPlay (double sampleRate, int samplesPerBlock) { checkInputAndOutput (this, *orderSetting, 0, true); timeConstant = exp (-1.0 / (sampleRate * (*RMStimeConstant / 1000) / samplesPerBlock)); sampledSignal.resize (samplesPerBlock); std::fill (rms.begin(), rms.end(), 0.0f); } void EnergyVisualizerAudioProcessor::releaseResources() { // When playback stops, you can use this as an opportunity to free up any // spare memory, etc. } void EnergyVisualizerAudioProcessor::processBlock (juce::AudioSampleBuffer& buffer, juce::MidiBuffer& midiMessages) { juce::ScopedNoDenormals noDenormals; checkInputAndOutput (this, *orderSetting, 0); if (! doProcessing.get() && ! oscParameterInterface.getOSCSender().isConnected()) return; //const int nCh = buffer.getNumChannels(); const int L = buffer.getNumSamples(); const int workingOrder = juce::jmin (isqrt (buffer.getNumChannels()) - 1, input.getOrder()); const int nCh = squares[workingOrder + 1]; copyMaxRE (workingOrder, weights.data()); juce::FloatVectorOperations::multiply (weights.data(), maxRECorrection[workingOrder] * decodeCorrection (workingOrder), nCh); if (*useSN3D < 0.5f) juce::FloatVectorOperations::multiply (weights.data(), n3d2sn3d, nCh); const float oneMinusTimeConstant = 1.0f - timeConstant; for (int i = 0; i < nSamplePoints; ++i) { juce::FloatVectorOperations::copyWithMultiply (sampledSignal.data(), buffer.getReadPointer (0), decoderMatrix (i, 0) * weights[0], buffer.getNumSamples()); for (int ch = 1; ch < nCh; ++ch) juce::FloatVectorOperations::addWithMultiply (sampledSignal.data(), buffer.getReadPointer (ch), decoderMatrix (i, ch) * weights[ch], L); // calculate rms float sum = 0.0f; for (int i = 0; i < L; ++i) { const auto sample = sampledSignal[i]; sum += sample * sample; } rms[i] = timeConstant * rms[i] + oneMinusTimeConstant * std::sqrt (sum / L); } } //============================================================================== bool EnergyVisualizerAudioProcessor::hasEditor() const { return true; // (change this to false if you choose to not supply an editor) } juce::AudioProcessorEditor* EnergyVisualizerAudioProcessor::createEditor() { return new EnergyVisualizerAudioProcessorEditor (*this, parameters); } //============================================================================== void EnergyVisualizerAudioProcessor::getStateInformation (juce::MemoryBlock& destData) { auto state = parameters.copyState(); auto oscConfig = state.getOrCreateChildWithName ("OSCConfig", nullptr); oscConfig.copyPropertiesFrom (oscParameterInterface.getConfig(), nullptr); std::unique_ptr xml (state.createXml()); copyXmlToBinary (*xml, destData); } void EnergyVisualizerAudioProcessor::setStateInformation (const void* data, int sizeInBytes) { std::unique_ptr xmlState (getXmlFromBinary (data, sizeInBytes)); if (xmlState.get() != nullptr) if (xmlState->hasTagName (parameters.state.getType())) { parameters.replaceState (juce::ValueTree::fromXml (*xmlState)); if (parameters.state.hasProperty ("OSCPort")) // legacy { oscParameterInterface.getOSCReceiver().connect ( parameters.state.getProperty ("OSCPort", juce::var (-1))); parameters.state.removeProperty ("OSCPort", nullptr); } auto oscConfig = parameters.state.getChildWithName ("OSCConfig"); if (oscConfig.isValid()) oscParameterInterface.setConfig (oscConfig); } } //============================================================================== void EnergyVisualizerAudioProcessor::parameterChanged (const juce::String& parameterID, float newValue) { if (parameterID == "orderSetting") userChangedIOSettings = true; if (parameterID == "RMStimeConstant") timeConstant = exp (-1.0 / (getSampleRate() * (*RMStimeConstant / 1000) / getBlockSize())); } //============================================================================== std::vector> EnergyVisualizerAudioProcessor::createParameterLayout() { // add your audio parameters here std::vector> params; params.push_back (OSCParameterInterface::createParameterTheOldWay ( "orderSetting", "Ambisonics Order", "", juce::NormalisableRange (0.0f, 8.0f, 1.0f), 0.0f, [] (float value) { if (value >= 0.5f && value < 1.5f) return "0th"; else if (value >= 1.5f && value < 2.5f) return "1st"; else if (value >= 2.5f && value < 3.5f) return "2nd"; else if (value >= 3.5f && value < 4.5f) return "3rd"; else if (value >= 4.5f && value < 5.5f) return "4th"; else if (value >= 5.5f && value < 6.5f) return "5th"; else if (value >= 6.5f && value < 7.5f) return "6th"; else if (value >= 7.5f) return "7th"; else return "Auto"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "useSN3D", "Normalization", "", juce::NormalisableRange (0.0f, 1.0f, 1.0f), 1.0f, [] (float value) { if (value >= 0.5f) return "SN3D"; else return "N3D"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "peakLevel", "Peak level", "dB", juce::NormalisableRange (-50.0f, 10.0f, 0.1f), 0.0f, [] (float value) { return juce::String (value, 1); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "dynamicRange", "Dynamic Range", "dB", juce::NormalisableRange (10.0f, 60.0f, 1.f), 35.0f, [] (float value) { return juce::String (value, 0); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "holdMax", "Hold maximal RMS value", "", juce::NormalisableRange (0.0f, 1.0f, 1.0f), 0.0f, [] (float value) { if (value >= 0.5f) return "ON"; else return "OFF"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "RMStimeConstant", "RMS time constant", "ms", juce::NormalisableRange (10.0f, 1000.0f, 1.0f, 0.4f), 100.0f, [] (float value) { return juce::String (value, 0); }, nullptr)); return params; } //============================================================================== void EnergyVisualizerAudioProcessor::timerCallback() { juce::RelativeTime timeDifference = juce::Time::getCurrentTime() - lastEditorTime.get(); if (timeDifference.inMilliseconds() > 800) doProcessing = false; else doProcessing = true; } //============================================================================== void EnergyVisualizerAudioProcessor::sendAdditionalOSCMessages ( juce::OSCSender& oscSender, const juce::OSCAddressPattern& address) { juce::OSCMessage message (address.toString() + "/RMS"); for (int i = 0; i < nSamplePoints; ++i) message.addFloat32 (rms[i]); oscSender.send (message); } //============================================================================== // This creates new instances of the plugin.. juce::AudioProcessor* JUCE_CALLTYPE createPluginFilter() { return new EnergyVisualizerAudioProcessor(); } ././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/EnergyVisualizer/Source/PluginEditor.cppIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/EnergyVisualizer/Source/PluginEditor0000664002537200253720000001712715257173642031736 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #include "PluginEditor.h" #include "PluginProcessor.h" //============================================================================== EnergyVisualizerAudioProcessorEditor::EnergyVisualizerAudioProcessorEditor ( EnergyVisualizerAudioProcessor& p, juce::AudioProcessorValueTreeState& vts) : juce::AudioProcessorEditor (&p), processor (p), valueTreeState (vts), footer (p.getOSCParameterInterface()) { // Make sure that before the constructor has finished, you've set the // editor's size to whatever you need it to be. setResizeLimits (710, 410, 1500, 1200); setResizable (true, true); setLookAndFeel (&globalLaF); addAndMakeVisible (&title); title.setTitle (juce::String ("Energy"), juce::String ("Visualizer")); title.setFont (globalLaF.robotoBold, globalLaF.robotoLight); addAndMakeVisible (&footer); cbNormalizationAtachement.reset ( new ComboBoxAttachment (valueTreeState, "useSN3D", *title.getInputWidgetPtr()->getNormCbPointer())); cbOrderAtachement.reset ( new ComboBoxAttachment (valueTreeState, "orderSetting", *title.getInputWidgetPtr()->getOrderCbPointer())); addAndMakeVisible (&slPeakLevel); slPeakLevelAttachment.reset (new SliderAttachment (valueTreeState, "peakLevel", slPeakLevel)); slPeakLevel.setSliderStyle (juce::Slider::LinearVertical); slPeakLevel.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 100, 12); slPeakLevel.setTextValueSuffix (" dB"); slPeakLevel.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[0]); slPeakLevel.setReverse (false); slPeakLevel.addListener (this); addAndMakeVisible (&slDynamicRange); slDynamicRangeAttachment.reset ( new SliderAttachment (valueTreeState, "dynamicRange", slDynamicRange)); slDynamicRange.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); slDynamicRange.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 100, 12); slDynamicRange.setTextValueSuffix (" dB"); slDynamicRange.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[0]); slDynamicRange.setReverse (false); slDynamicRange.addListener (this); addAndMakeVisible (&slRMStimeConstant); slRMStimeConstantAttachment.reset ( new SliderAttachment (valueTreeState, "RMStimeConstant", slRMStimeConstant)); slRMStimeConstant.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); slRMStimeConstant.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 100, 12); slRMStimeConstant.setTextValueSuffix (" ms"); slRMStimeConstant.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[2]); slRMStimeConstant.setReverse (false); slRMStimeConstant.addListener (this); addAndMakeVisible (tbHoldMax); tbHoldMaxAttachment.reset (new ButtonAttachment (valueTreeState, "holdMax", tbHoldMax)); tbHoldMax.setButtonText ("Hold max"); tbHoldMax.setColour (juce::ToggleButton::tickColourId, globalLaF.ClWidgetColours[2]); addAndMakeVisible (&lbPeakLevel); lbPeakLevel.setText ("Peak level"); addAndMakeVisible (&lbDynamicRange); lbDynamicRange.setText ("Range"); addAndMakeVisible (&lbRMStimeConstant); lbRMStimeConstant.setText ("Time Constant"); addAndMakeVisible (&visualizer); visualizer.setRmsDataPtr (p.rms.data()); addAndMakeVisible (&colormap); startTimer (20); } EnergyVisualizerAudioProcessorEditor::~EnergyVisualizerAudioProcessorEditor() { setLookAndFeel (nullptr); } //============================================================================== void EnergyVisualizerAudioProcessorEditor::paint (juce::Graphics& g) { g.fillAll (getLookAndFeel().findColour (juce::ResizableWindow::backgroundColourId)); } void EnergyVisualizerAudioProcessorEditor::resized() { // This is generally where you'll want to lay out the positions of any // subcomponents in your editor.. const int leftRightMargin = 30; const int headerHeight = 60; const int footerHeight = 25; juce::Rectangle area (getLocalBounds()); juce::Rectangle footerArea (area.removeFromBottom (footerHeight)); footer.setBounds (footerArea); area.removeFromLeft (leftRightMargin); area.removeFromRight (leftRightMargin); juce::Rectangle headerArea = area.removeFromTop (headerHeight); title.setBounds (headerArea); area.removeFromTop (10); area.removeFromBottom (5); juce::Rectangle UIarea = area.removeFromRight (106); const juce::Point UIareaCentre = UIarea.getCentre(); UIarea.setHeight (320); UIarea.setCentre (UIareaCentre); juce::Rectangle dynamicsArea = UIarea.removeFromTop (210); juce::Rectangle sliderCol = dynamicsArea.removeFromRight (50); lbDynamicRange.setBounds (sliderCol.removeFromBottom (12)); slDynamicRange.setBounds (sliderCol.removeFromBottom (50)); sliderCol.removeFromBottom (20); lbPeakLevel.setBounds (sliderCol.removeFromBottom (12)); slPeakLevel.setBounds (sliderCol); dynamicsArea.removeFromRight (6); sliderCol = dynamicsArea.removeFromRight (50); colormap.setBounds (sliderCol); colormap.setMaxLevel (processor.getPeakLevelSetting()); colormap.setRange (processor.getDynamicRange()); UIarea.removeFromTop (20); juce::Rectangle sliderArea = UIarea.removeFromTop (45); sliderArea.removeFromRight (28); sliderArea.removeFromLeft (28); slRMStimeConstant.setBounds (sliderArea); lbRMStimeConstant.setBounds (UIarea.removeFromTop (12)); UIarea.removeFromTop (10); UIarea.removeFromLeft (15); tbHoldMax.setBounds (UIarea.removeFromTop (20)); area.removeFromRight (5); visualizer.setBounds (area); } void EnergyVisualizerAudioProcessorEditor::sliderValueChanged (juce::Slider* slider) { if (slider == &slPeakLevel) colormap.setMaxLevel ((float) slider->getValue()); else if (slider == &slDynamicRange) colormap.setRange ((float) slider->getValue()); } void EnergyVisualizerAudioProcessorEditor::timerCallback() { // === update titleBar widgets according to available input/output channel counts title.setMaxSize (processor.getMaxSize()); // ========================================== visualizer.setColormap (colormap.getColormap()); visualizer.setPeakLevel (processor.getPeakLevelSetting()); visualizer.setDynamicRange (processor.getDynamicRange()); visualizer.setHoldMax (processor.getHoldRMSSetting()); processor.lastEditorTime = juce::Time::getCurrentTime(); } ././@LongLink0000644000000000000000000000015500000000000011604 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/EnergyVisualizer/Source/VisualizerColormap.hIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/EnergyVisualizer/Source/VisualizerCo0000664002537200253720000001150615257173642031743 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once #include "../../resources/heatmap.h" #include "../../resources/viridis_cropped.h" #include "../JuceLibraryCode/JuceHeader.h" //============================================================================== /* */ class VisualizerColormap : public juce::Component { public: VisualizerColormap() { // In your constructor, you should add any child components, and // initialise any special settings that your component needs. } ~VisualizerColormap() {} void paint (juce::Graphics& g) override { juce::Colour colormapData[256]; if (usePerceptualColormap) for (int i = 0; i < 256; ++i) { const float alpha = juce::jlimit (0.0f, 1.0f, (float) i / 50.0f); colormapData[i] = juce::Colour::fromFloatRGBA (viridis_cropped[i][0], viridis_cropped[i][1], viridis_cropped[i][2], alpha); } else for (int i = 0; i < 256; ++i) { colormapData[i] = juce::Colour::fromFloatRGBA (heatmap[i][0], heatmap[i][1], heatmap[i][2], heatmap[i][3]); } juce::Rectangle colormapArea (getLocalBounds()); colormapArea.removeFromTop (12); colormapArea.removeFromBottom (6); colormapArea.removeFromRight (25); juce::ColourGradient gradient; gradient.point1 = colormapArea.getTopLeft().toFloat(); gradient.point2 = colormapArea.getBottomLeft().toFloat(); for (int i = 0; i < 256; ++i) gradient.addColour (1.0f - i * 1.0f / 256, colormapData[i]); juce::Path path; path.addRectangle (colormapArea); g.setGradientFill (gradient); g.fillPath (path); g.setColour (juce::Colours::white); int width = colormapArea.getWidth(); auto currentFont = juce::FontOptions (getLookAndFeel().getTypefaceForFont (juce::FontOptions (12.0f, 1))); g.setFont (currentFont); g.drawText ("dB", 25, 0, width, 12, juce::Justification::centred); currentFont = juce::FontOptions (getLookAndFeel().getTypefaceForFont (juce::FontOptions (12.0f, 0))) .withHeight (12.0f); g.setFont (currentFont); const float yStep = (float) colormapArea.getHeight() / 7; g.drawText (juce::String (maxLevel, 1), 25, 12, width, 12, juce::Justification::centred); for (int i = 1; i < 8; ++i) { g.drawText (juce::String (maxLevel - range / 7.0 * i, 1), 25, 6 + yStep * i, width, 12, juce::Justification::centred); } } void setMaxLevel (const float newMaxLevel) { maxLevel = newMaxLevel; repaint(); } void setRange (const float newRange) { range = newRange; repaint(); } void mouseDown (const juce::MouseEvent& event) override { usePerceptualColormap = ! usePerceptualColormap; repaint(); } void setColormap (bool shouldUsePerceptualColormap) { if (usePerceptualColormap != shouldUsePerceptualColormap) { usePerceptualColormap = shouldUsePerceptualColormap; repaint(); } } bool getColormap() { return usePerceptualColormap; } void resized() override {} private: bool usePerceptualColormap = true; float maxLevel = 0.0f; float range = 35.0f; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (VisualizerColormap) }; ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/EnergyVisualizer/Source/VisualizerComponent.hIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/EnergyVisualizer/Source/VisualizerCo0000664002537200253720000003146615257173642031752 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once #include "../../resources/heatmap.h" #include "../../resources/viridis_cropped.h" #include "../JuceLibraryCode/JuceHeader.h" //============================================================================== /* */ class VisualizerComponent : public juce::Component, public juce::OpenGLRenderer, private juce::Timer { public: VisualizerComponent() { // In your constructor, you should add any child components, and // initialise any special settings that your component needs. openGLContext.setComponentPaintingEnabled (true); openGLContext.setContinuousRepainting (false); openGLContext.setRenderer (this); openGLContext.attachTo (*this); addAndMakeVisible (&hammerAitovGrid); visualizedRMS.resize (nSamplePoints); startTimer (20); } ~VisualizerComponent() { openGLContext.detach(); openGLContext.setRenderer (nullptr); } void timerCallback() override { openGLContext.triggerRepaint(); } void setRmsDataPtr (float* rmsPtr) { pRMS = rmsPtr; } void newOpenGLContextCreated() override { createShaders(); } void setPeakLevel (const float newPeakLevel) { peakLevel = newPeakLevel; } void setDynamicRange (const float newDynamicRange) { dynamicRange = newDynamicRange; } void setHoldMax (const bool newHoldMax) { holdMax = newHoldMax; } void renderOpenGL() override { using namespace juce; using namespace juce::gl; jassert (juce::OpenGLHelpers::isContextActive()); juce::OpenGLHelpers::clear (juce::Colour (0xFF2D2D2D)); const float desktopScale = (float) openGLContext.getRenderingScale(); glViewport (-5, -5, juce::roundToInt (desktopScale * getWidth() + 10), juce::roundToInt (desktopScale * getHeight() + 10)); glEnable (GL_DEPTH_TEST); glDepthFunc (GL_LESS); glEnable (GL_BLEND); glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); openGLContext.extensions.glActiveTexture (GL_TEXTURE0); glEnable (GL_TEXTURE_2D); texture.bind(); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); // linear interpolation when too small glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); // linear interpolation when too bi glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glClear (GL_COLOR_BUFFER_BIT); shader->use(); if (firstRun) { juce::PixelARGB colormapData[512]; for (int i = 0; i < 256; ++i) { const float alpha = juce::jlimit (0.0f, 1.0f, (float) i / 50.0f); colormapData[i] = juce::Colour::fromFloatRGBA (viridis_cropped[i][0], viridis_cropped[i][1], viridis_cropped[i][2], alpha) .getPixelARGB(); colormapData[256 + i] = juce::Colour::fromFloatRGBA (heatmap[i][0], heatmap[i][1], heatmap[i][2], heatmap[i][3]) .getPixelARGB(); } texture.loadARGB (colormapData, 256, 2); firstRun = false; openGLContext.extensions.glGenBuffers (1, &vertexBuffer); openGLContext.extensions.glBindBuffer (GL_ARRAY_BUFFER, vertexBuffer); openGLContext.extensions.glBufferData (GL_ARRAY_BUFFER, sizeof (hammerAitovSampleVertices), hammerAitovSampleVertices, GL_STATIC_DRAW); openGLContext.extensions.glGenBuffers (1, &indexBuffer); openGLContext.extensions.glBindBuffer (GL_ELEMENT_ARRAY_BUFFER, indexBuffer); openGLContext.extensions.glBufferData (GL_ELEMENT_ARRAY_BUFFER, sizeof (hammerAitovSampleIndices), hammerAitovSampleIndices, GL_STATIC_DRAW); } static GLfloat g_colorMap_data[nSamplePoints]; for (int i = 0; i < nSamplePoints; i++) { if (holdMax) visualizedRMS[i] = std::max (pRMS[i], visualizedRMS[i]); else visualizedRMS[i] = pRMS[i]; const float val = (juce::Decibels::gainToDecibels (visualizedRMS[i]) - peakLevel) / dynamicRange + 1.0f; g_colorMap_data[i] = juce::jlimit (0.0f, 1.0f, val); } GLuint colorBuffer; openGLContext.extensions.glGenBuffers (1, &colorBuffer); openGLContext.extensions.glBindBuffer (GL_ARRAY_BUFFER, colorBuffer); openGLContext.extensions.glBufferData (GL_ARRAY_BUFFER, sizeof (g_colorMap_data), g_colorMap_data, GL_STATIC_DRAW); if (colormapChooser != nullptr) colormapChooser->set (usePerceptualColormap ? 0.0f : 1.0f); GLint attributeID; GLint programID = shader->getProgramID(); // 1st attribute buffer : vertices attributeID = openGLContext.extensions.glGetAttribLocation (programID, "position"); openGLContext.extensions.glEnableVertexAttribArray (attributeID); openGLContext.extensions.glBindBuffer (GL_ARRAY_BUFFER, vertexBuffer); openGLContext.extensions.glBindBuffer (GL_ELEMENT_ARRAY_BUFFER, indexBuffer); openGLContext.extensions.glVertexAttribPointer ( attributeID, // attribute 0. No particular reason for 0, but must match the layout in the shader. 2, // size GL_FLOAT, // type GL_FALSE, // normalized? 0, // stride (void*) 0 // array buffer offset ); // 2nd attribute buffer : colors attributeID = openGLContext.extensions.glGetAttribLocation (programID, "colormapDepthIn"); openGLContext.extensions.glEnableVertexAttribArray (attributeID); openGLContext.extensions.glBindBuffer (GL_ARRAY_BUFFER, colorBuffer); openGLContext.extensions.glVertexAttribPointer ( attributeID, // attribute. No particular reason for 1, but must match the layout in the shader. 1, // size GL_FLOAT, // type GL_FALSE, // normalized? 0, // stride (void*) 0 // array buffer offset ); //glDrawElements (GL_TRIANGLES, 3, GL_UNSIGNED_INT, 0); // Draw triangles! //glDrawArrays(GL_TRIANGLES, 0, 3); // glPointSize(20.0); // glDrawElements (GL_POINTS, 100, GL_UNSIGNED_INT, 0); // Draw triangles! glDrawElements (GL_TRIANGLES, // mode sizeof (hammerAitovSampleIndices), // count GL_UNSIGNED_INT, // type (void*) 0 // element array buffer offset ); openGLContext.extensions.glDisableVertexAttribArray (0); openGLContext.extensions.glDisableVertexAttribArray (1); openGLContext.extensions.glBindBuffer (GL_ARRAY_BUFFER, 0); openGLContext.extensions.glBindBuffer (GL_ELEMENT_ARRAY_BUFFER, 0); openGLContext.extensions.glDeleteBuffers (1, &colorBuffer); } void openGLContextClosing() override { openGLContext.extensions.glDeleteBuffers (1, &vertexBuffer); openGLContext.extensions.glDeleteBuffers (1, &indexBuffer); texture.release(); } void paint (juce::Graphics& g) override {} void resized() override { // This method is where you should set the bounds of any child // components that your component contains.. hammerAitovGrid.setBounds (getLocalBounds()); } void createShaders() { // vertexShader = // "attribute vec3 position;\n" // "void main()\n" // "{\n" // " gl_Position.xyz = position;\n" // " gl_Position.w = 1.0;\n" // "}"; // // fragmentShader = // "void main()\n" // "{\n" // " gl_FragColor = vec4(1,0,0,0.5);\n" // "}"; vertexShader = "attribute vec2 position;\n" "attribute float colormapDepthIn;\n" "uniform float colormapChooser;\n" "varying float colormapChooserOut;\n" "varying float colormapDepthOut;\n" "void main()\n" "{\n" " gl_Position.xy = position;\n" " gl_Position.z = 0.0;\n" " gl_Position.w = 1.0;\n" " colormapDepthOut = colormapDepthIn;\n" " colormapChooserOut = colormapChooser;\n" "}"; fragmentShader = "varying float colormapDepthOut;\n" "varying float colormapChooserOut;\n" "uniform sampler2D tex0;\n" "void main()\n" "{\n" //" gl_FragColor = fragmentColor;\n" " gl_FragColor = texture2D(tex0, vec2(colormapDepthOut, colormapChooserOut));\n" "}"; std::unique_ptr newShader ( new juce::OpenGLShaderProgram (openGLContext)); juce::String statusText; if (newShader->addVertexShader ( juce::OpenGLHelpers::translateVertexShaderToV3 (vertexShader)) && newShader->addFragmentShader ( juce::OpenGLHelpers::translateFragmentShaderToV3 (fragmentShader)) && newShader->link()) { shader = std::move (newShader); shader->use(); colormapChooser.reset (createUniform (openGLContext, *shader, "colormapChooser")); statusText = "GLSL: v" + juce::String (juce::OpenGLShaderProgram::getLanguageVersion(), 2); } else { statusText = newShader->getLastError(); } } void setColormap (bool shouldUsePerceptualColormap) { usePerceptualColormap = shouldUsePerceptualColormap; } private: HammerAitovGrid hammerAitovGrid; GLuint vertexBuffer, indexBuffer; const char* vertexShader; const char* fragmentShader; std::unique_ptr shader; std::unique_ptr colormapChooser; bool usePerceptualColormap = true; std::vector visualizedRMS; static juce::OpenGLShaderProgram::Uniform* createUniform (juce::OpenGLContext& openGLContext, juce::OpenGLShaderProgram& shaderProgram, const char* uniformName) { if (openGLContext.extensions.glGetUniformLocation (shaderProgram.getProgramID(), uniformName) < 0) return nullptr; // Return if error return new juce::OpenGLShaderProgram::Uniform (shaderProgram, uniformName); } float peakLevel = 0.0f; // dB float dynamicRange = 35.0f; // dB juce::OpenGLTexture texture; bool firstRun = true; bool holdMax = false; float* pRMS; juce::OpenGLContext openGLContext; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (VisualizerComponent) }; ././@LongLink0000644000000000000000000000015200000000000011601 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/EnergyVisualizer/Source/PluginProcessor.hIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/EnergyVisualizer/Source/PluginProces0000664002537200253720000001072515257173642031740 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once #include "../../resources/AudioProcessorBase.h" #include "../../resources/MaxRE.h" #include "../../resources/ambisonicTools.h" #include "../../resources/efficientSHvanilla.h" #include "../JuceLibraryCode/JuceHeader.h" #include "../hammerAitovSample.h" #define ProcessorClass EnergyVisualizerAudioProcessor //============================================================================== /** */ class EnergyVisualizerAudioProcessor : public AudioProcessorBase, IOTypes::Nothing>, private juce::Timer { public: constexpr static int numberOfInputChannels = 64; constexpr static int numberOfOutputChannels = 64; //============================================================================== EnergyVisualizerAudioProcessor(); ~EnergyVisualizerAudioProcessor(); //============================================================================== void prepareToPlay (double sampleRate, int samplesPerBlock) override; void releaseResources() override; void processBlock (juce::AudioSampleBuffer&, juce::MidiBuffer&) override; //============================================================================== juce::AudioProcessorEditor* createEditor() override; bool hasEditor() const override; //============================================================================== int getNumPrograms() override; int getCurrentProgram() override; void setCurrentProgram (int index) override; const juce::String getProgramName (int index) override; void changeProgramName (int index, const juce::String& newName) override; //============================================================================== void getStateInformation (juce::MemoryBlock& destData) override; void setStateInformation (const void* data, int sizeInBytes) override; //============================================================================== void parameterChanged (const juce::String& parameterID, float newValue) override; //======= Parameters =========================================================== std::vector> createParameterLayout(); //============================================================================== float getPeakLevelSetting() const { return peakLevel->load (std::memory_order_relaxed); } float getDynamicRange() const { return dynamicRange->load (std::memory_order_relaxed); } bool getHoldRMSSetting() const { if (holdMax->load (std::memory_order_relaxed) >= 0.5f) return true; else return false; } std::vector rms; juce::Atomic lastEditorTime; private: //============================================================================== // parameters std::atomic* orderSetting; std::atomic* useSN3D; std::atomic* peakLevel; std::atomic* dynamicRange; std::atomic* holdMax; std::atomic* RMStimeConstant; float timeConstant; juce::Atomic doProcessing = true; juce::dsp::Matrix decoderMatrix; std::vector weights; std::vector sampledSignal; void timerCallback() override; void sendAdditionalOSCMessages (juce::OSCSender& oscSender, const juce::OSCAddressPattern& address) override; //============================================================================== JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (EnergyVisualizerAudioProcessor) }; ././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/EnergyVisualizer/Source/PluginEditor.hIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/EnergyVisualizer/Source/PluginEditor0000664002537200253720000000633615257173642031736 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once #include "../JuceLibraryCode/JuceHeader.h" #include "PluginProcessor.h" //Plugin Design Essentials #include "../../resources/customComponents/TitleBar.h" #include "../../resources/lookAndFeel/IEM_LaF.h" //Custom juce::Components #include "../../resources/customComponents/HammerAitovGrid.h" #include "../../resources/customComponents/ReverseSlider.h" #include "../../resources/customComponents/SimpleLabel.h" #include "VisualizerColormap.h" #include "VisualizerComponent.h" typedef ReverseSlider::SliderAttachment SliderAttachment; typedef juce::AudioProcessorValueTreeState::ComboBoxAttachment ComboBoxAttachment; typedef juce::AudioProcessorValueTreeState::ButtonAttachment ButtonAttachment; //============================================================================== /** */ class EnergyVisualizerAudioProcessorEditor : public juce::AudioProcessorEditor, private juce::Timer, juce::Slider::Listener { public: EnergyVisualizerAudioProcessorEditor (EnergyVisualizerAudioProcessor&, juce::AudioProcessorValueTreeState&); ~EnergyVisualizerAudioProcessorEditor(); //============================================================================== void paint (juce::Graphics&) override; void resized() override; private: LaF globalLaF; EnergyVisualizerAudioProcessor& processor; juce::AudioProcessorValueTreeState& valueTreeState; VisualizerComponent visualizer; VisualizerColormap colormap; void sliderValueChanged (juce::Slider* slider) override; void timerCallback() override; TitleBar, NoIOWidget> title; OSCFooter footer; ReverseSlider slPeakLevel, slDynamicRange, slRMStimeConstant; juce::ToggleButton tbHoldMax; SimpleLabel lbPeakLevel, lbDynamicRange, lbRMStimeConstant; std::unique_ptr slPeakLevelAttachment, slDynamicRangeAttachment, slRMStimeConstantAttachment; std::unique_ptr cbNormalizationAtachement; std::unique_ptr cbOrderAtachement; std::unique_ptr tbHoldMaxAttachment; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (EnergyVisualizerAudioProcessorEditor) }; IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/EnergyVisualizer/CMakeLists.txt0000664002537200253720000000363515257173642030705 0ustar zmoelnigzmoelnigset (PLUGIN_TARGET "") if (IEM_FORMATS) juce_add_plugin (EnergyVisualizer PLUGIN_MANUFACTURER_CODE IEMA PLUGIN_CODE EnVi ICON_BIG "../resources/Standalone/IEMPluginSuiteSmall.png" ICON_SMALL "../resources/Standalone/IEMPluginSuiteSmall.png" COMPANY_NAME "IEM" PRODUCT_NAME "EnergyVisualizer" FORMATS ${IEM_FORMATS} VERSION ${EnergyVisualizer_VERSION} LV2URI "http://plugins.iem.at/EnergyVisualizer" VST2_CATEGORY kPlugSurroundFx kPlugCategSpacializer kPlugCategAnalysis VST3_CATEGORIES Spatial Surround Analyzer Tools AAX_CATEGORY SoundField) list (APPEND PLUGIN_TARGET EnergyVisualizer) endif() foreach (TARGET IN LISTS PLUGIN_TARGET) juce_generate_juce_header (${TARGET}) target_sources (${TARGET} PRIVATE Source/PluginEditor.cpp Source/PluginEditor.h Source/PluginProcessor.cpp Source/PluginProcessor.h ../resources/OSC/OSCInputStream.h ../resources/OSC/OSCParameterInterface.cpp ../resources/OSC/OSCParameterInterface.h ../resources/OSC/OSCStatus.cpp ../resources/OSC/OSCStatus.h ../resources/OSC/OSCUtilities.h ../resources/efficientSHvanilla.cpp ) target_compile_definitions (${TARGET} PRIVATE JUCE_USE_CURL=0 JUCE_WEB_BROWSER=0 JUCE_USE_CUSTOM_PLUGIN_STANDALONE_APP=1 JUCE_USE_FLAC=0 JUCE_USE_OGGVORBIS=0 JUCE_USE_MP3AUDIOFORMAT=0 JUCE_USE_LAME_AUDIO_FORMAT=0 JUCE_USE_WINDOWS_MEDIA_FORMAT=0 JUCE_VST3_CAN_REPLACE_VST2=0) target_include_directories (${TARGET} PRIVATE Source) target_link_libraries (${TARGET} PRIVATE LAF_fonts IEM_logo juce::juce_audio_utils juce::juce_audio_plugin_client juce::juce_osc juce::juce_dsp juce::juce_opengl juce::juce_recommended_config_flags juce::juce_recommended_lto_flags) endforeach() IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/CoordinateConverter/0000775002537200253720000000000015257173642026606 5ustar zmoelnigzmoelnigIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/CoordinateConverter/Source/0000775002537200253720000000000015257173642030046 5ustar zmoelnigzmoelnig././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/CoordinateConverter/Source/PluginProcessor.cppIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/CoordinateConverter/Source/PluginPro0000664002537200253720000005274415257173642031724 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #include "PluginProcessor.h" #include "PluginEditor.h" //============================================================================== CoordinateConverterAudioProcessor::CoordinateConverterAudioProcessor() : AudioProcessorBase ( #ifndef JucePlugin_PreferredChannelConfigurations BusesProperties() #if ! JucePlugin_IsMidiEffect #if ! JucePlugin_IsSynth .withInput ("Input", ((juce::PluginHostType::getPluginLoadedAs() == juce::AudioProcessor::wrapperType_VST3) ? juce::AudioChannelSet::ambisonic (1) : juce::AudioChannelSet::ambisonic (7)), true) #endif .withOutput ("Output", ((juce::PluginHostType::getPluginLoadedAs() == juce::AudioProcessor::wrapperType_VST3) ? juce::AudioChannelSet::ambisonic (1) : juce::AudioChannelSet::ambisonic (7)), true) #endif , #endif createParameterLayout()) { // get pointers to the parameters azimuth = parameters.getRawParameterValue ("azimuth"); elevation = parameters.getRawParameterValue ("elevation"); radius = parameters.getRawParameterValue ("radius"); xPos = parameters.getRawParameterValue ("xPos"); yPos = parameters.getRawParameterValue ("yPos"); zPos = parameters.getRawParameterValue ("zPos"); roomX = parameters.getRawParameterValue ("roomX"); roomY = parameters.getRawParameterValue ("roomY"); roomZ = parameters.getRawParameterValue ("roomZ"); listenerX = parameters.getRawParameterValue ("listenerX"); listenerY = parameters.getRawParameterValue ("listenerY"); listenerZ = parameters.getRawParameterValue ("listenerZ"); radiusRange = parameters.getRawParameterValue ("radiusRange"); azimuthFlip = parameters.getRawParameterValue ("azimuthFlip"); elevationFlip = parameters.getRawParameterValue ("elevationFlip"); radiusFlip = parameters.getRawParameterValue ("radiusFlip"); xFlip = parameters.getRawParameterValue ("xFlip"); yFlip = parameters.getRawParameterValue ("yFlip"); zFlip = parameters.getRawParameterValue ("zFlip"); // add listeners to parameter changes parameters.addParameterListener ("azimuth", this); parameters.addParameterListener ("elevation", this); parameters.addParameterListener ("radius", this); parameters.addParameterListener ("xPos", this); parameters.addParameterListener ("yPos", this); parameters.addParameterListener ("zPos", this); parameters.addParameterListener ("roomX", this); parameters.addParameterListener ("roomY", this); parameters.addParameterListener ("roomZ", this); parameters.addParameterListener ("listenerX", this); parameters.addParameterListener ("listenerY", this); parameters.addParameterListener ("listenerZ", this); parameters.addParameterListener ("radiusRange", this); parameters.addParameterListener ("azimuthFlip", this); parameters.addParameterListener ("elevationFlip", this); parameters.addParameterListener ("radiusFlip", this); parameters.addParameterListener ("xFlip", this); parameters.addParameterListener ("yFlip", this); parameters.addParameterListener ("zFlip", this); // same parameters and order as in the RoomEncoder roomSync.addGroup (RoomSync::roomDimensions, "syncRoomSize", { "roomX", "roomY", "roomZ" }); roomSync.addGroup (RoomSync::listenerPosition, "syncListener", { "listenerX", "listenerY", "listenerZ" }); } CoordinateConverterAudioProcessor::~CoordinateConverterAudioProcessor() { } //============================================================================== int CoordinateConverterAudioProcessor::getNumPrograms() { return 1; // NB: some hosts don't cope very well if you tell them there are 0 programs, // so this should be at least 1, even if you're not really implementing programs. } int CoordinateConverterAudioProcessor::getCurrentProgram() { return 0; } void CoordinateConverterAudioProcessor::setCurrentProgram (int index) { } const juce::String CoordinateConverterAudioProcessor::getProgramName (int index) { return {}; } void CoordinateConverterAudioProcessor::changeProgramName (int index, const juce::String& newName) { } //============================================================================== void CoordinateConverterAudioProcessor::prepareToPlay (double sampleRate, int samplesPerBlock) { } void CoordinateConverterAudioProcessor::releaseResources() { // When playback stops, you can use this as an opportunity to free up any // spare memory, etc. } void CoordinateConverterAudioProcessor::processBlock (juce::AudioSampleBuffer& buffer, juce::MidiBuffer& midiMessages) { // nothing to do } //============================================================================== bool CoordinateConverterAudioProcessor::hasEditor() const { return true; // (change this to false if you choose to not supply an editor) } juce::AudioProcessorEditor* CoordinateConverterAudioProcessor::createEditor() { return new CoordinateConverterAudioProcessorEditor (*this, parameters); } //============================================================================== void CoordinateConverterAudioProcessor::getStateInformation (juce::MemoryBlock& destData) { auto state = parameters.copyState(); auto oscConfig = state.getOrCreateChildWithName ("OSCConfig", nullptr); oscConfig.copyPropertiesFrom (oscParameterInterface.getConfig(), nullptr); std::unique_ptr xml (state.createXml()); copyXmlToBinary (*xml, destData); } void CoordinateConverterAudioProcessor::setStateInformation (const void* data, int sizeInBytes) { std::unique_ptr xmlState (getXmlFromBinary (data, sizeInBytes)); if (xmlState.get() != nullptr) if (xmlState->hasTagName (parameters.state.getType())) { // Add compatibility layer for the former cartesian coordinates: they used to be // normalized to +/- x/y/zRange around the origin, and got shifted by the x/y/zReference. // Now, they are positions in meters within the room, like in the RoomEncoder. if (xmlState->getChildByAttribute ("id", "xRange") != nullptr && xmlState->getChildByAttribute ("id", "roomX") == nullptr) convertLegacyCartesianParameters (*xmlState); parameters.replaceState (juce::ValueTree::fromXml (*xmlState)); if (parameters.state.hasProperty ("OSCPort")) // legacy { oscParameterInterface.getOSCReceiver().connect ( parameters.state.getProperty ("OSCPort", juce::var (-1))); parameters.state.removeProperty ("OSCPort", nullptr); } auto oscConfig = parameters.state.getChildWithName ("OSCConfig"); if (oscConfig.isValid()) oscParameterInterface.setConfig (oscConfig); } } void CoordinateConverterAudioProcessor::convertLegacyCartesianParameters (juce::XmlElement& xml) { auto getValue = [&xml] (const juce::String& id, float defaultValue) { if (auto* element = xml.getChildByAttribute ("id", id)) return static_cast (element->getDoubleAttribute ("value", defaultValue)); return defaultValue; }; auto setValue = [&xml] (const juce::String& id, float value) { auto* element = xml.getChildByAttribute ("id", id); if (element == nullptr) { element = xml.createNewChildElement ("PARAM"); element->setAttribute ("id", id); } element->setAttribute ("value", value); }; for (const juce::String axis : { "x", "y", "z" }) { const auto upperAxis = axis.toUpperCase(); const auto range = getValue (axis + "Range", 1.0f); const auto roomRange = parameters.getParameterRange ("room" + upperAxis); const auto roomSize = roomRange.getRange().clipValue (2.0f * range); setValue ("room" + upperAxis, roomSize); const auto position = getValue (axis + "Pos", 0.0f) * range; setValue (axis + "Pos", juce::jlimit (-0.5f * roomSize, 0.5f * roomSize, position)); const auto listenerRange = parameters.getParameterRange ("listener" + upperAxis); setValue ("listener" + upperAxis, listenerRange.getRange().clipValue (getValue (axis + "Reference", 0.0f))); xml.removeChildElement (xml.getChildByAttribute ("id", axis + "Range"), true); xml.removeChildElement (xml.getChildByAttribute ("id", axis + "Reference"), true); } } //============================================================================== void CoordinateConverterAudioProcessor::parameterChanged (const juce::String& parameterID, float newValue) { DBG ("Parameter with ID " << parameterID << " has changed. New value: " << newValue); if (parameterID == "azimuth" || parameterID == "elevation" || parameterID == "radius") { repaintSphere = true; if (! updatingParams.get()) updateCartesianCoordinates(); return; } else if (parameterID == "xPos" || parameterID == "yPos" || parameterID == "zPos") { repaintPositionPlanes = true; if (! updatingParams.get()) updateSphericalCoordinates(); return; } else if (parameterID == "listenerX" || parameterID == "listenerY" || parameterID == "listenerZ" || parameterID == "roomX" || parameterID == "roomY" || parameterID == "roomZ" || parameterID == "radiusRange") { if (parameterID == "roomX" || parameterID == "roomY" || parameterID == "roomZ") updatePlaneDimensions = true; if (cartesianWasLastUpdated) updateCartesianCoordinates(); else updateSphericalCoordinates(); return; } else if (parameterID == "azimuthFlip") azimuthFlipFactor = newValue >= 0.5f ? -1.0f : 1.0f; else if (parameterID == "elevationFlip") elevationFlipFactor = newValue >= 0.5f ? -1.0f : 1.0f; else if (parameterID == "radiusFlip") radiusFlipFactor = newValue >= 0.5f ? -1.0f : 1.0f; else if (parameterID == "xFlip") xFlipFactor = newValue >= 0.5f ? -1.0f : 1.0f; else if (parameterID == "yFlip") yFlipFactor = newValue >= 0.5f ? -1.0f : 1.0f; else if (parameterID == "zFlip") zFlipFactor = newValue >= 0.5f ? -1.0f : 1.0f; if (cartesianWasLastUpdated) updateCartesianCoordinates(); else updateSphericalCoordinates(); } void CoordinateConverterAudioProcessor::updateCartesianCoordinates() { updatingParams = true; auto cartesian = Conversions::sphericalToCartesian ( juce::degreesToRadians (azimuth->load()) * azimuthFlipFactor, juce::degreesToRadians (elevation->load()) * elevationFlipFactor, (0.5f - radiusFlipFactor * (0.5f - *radius)) * *radiusRange); cartesian += { *listenerX, *listenerY, *listenerZ }; // keep the position within the room cartesian.x = juce::jlimit (-0.5f * *roomX, 0.5f * *roomX, cartesian.x) * xFlipFactor; cartesian.y = juce::jlimit (-0.5f * *roomY, 0.5f * *roomY, cartesian.y) * yFlipFactor; cartesian.z = juce::jlimit (-0.5f * *roomZ, 0.5f * *roomZ, cartesian.z) * zFlipFactor; parameters.getParameter ("xPos")->setValueNotifyingHost ( parameters.getParameterRange ("xPos").convertTo0to1 (cartesian.x)); parameters.getParameter ("yPos")->setValueNotifyingHost ( parameters.getParameterRange ("yPos").convertTo0to1 (cartesian.y)); parameters.getParameter ("zPos")->setValueNotifyingHost ( parameters.getParameterRange ("zPos").convertTo0to1 (cartesian.z)); repaintPositionPlanes = true; cartesianWasLastUpdated = true; updatingParams = false; } void CoordinateConverterAudioProcessor::updateSphericalCoordinates() { updatingParams = true; auto cartesian = juce::Vector3D (*xPos * xFlipFactor, *yPos * yFlipFactor, *zPos * zFlipFactor); cartesian -= { *listenerX, *listenerY, *listenerZ }; auto spherical = Conversions::cartesianToSpherical (cartesian); spherical.x /= *radiusRange; // radius component if (spherical.x >= 1.0f) spherical.x = 1.0f; spherical.x = 0.5f - radiusFlipFactor * (0.5 - spherical.x); spherical.y *= azimuthFlipFactor; spherical.z *= elevationFlipFactor; parameters.getParameter ("radius")->setValueNotifyingHost ( parameters.getParameterRange ("radius").convertTo0to1 (spherical.x)); parameters.getParameter ("azimuth")->setValueNotifyingHost ( parameters.getParameterRange ("azimuth").convertTo0to1 (spherical.y)); parameters.getParameter ("elevation") ->setValueNotifyingHost ( parameters.getParameterRange ("elevation").convertTo0to1 (spherical.z)); repaintPositionPlanes = true; cartesianWasLastUpdated = false; updatingParams = false; } void CoordinateConverterAudioProcessor::updateBuffers() { DBG ("IOHelper: input size: " << input.getSize()); DBG ("IOHelper: output size: " << output.getSize()); } //============================================================================== std::vector> CoordinateConverterAudioProcessor::createParameterLayout() { // add your audio parameters here std::vector> params; params.push_back (OSCParameterInterface::createParameterTheOldWay ( "azimuth", "Azimuth Angle", juce::CharPointer_UTF8 (R"(°)"), juce::NormalisableRange (-180.0f, 180.0f, 0.01f), 0.0, [] (float value) { return juce::String (value, 2); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "elevation", "Elevation Angle", juce::CharPointer_UTF8 (R"(°)"), juce::NormalisableRange (-180.0f, 180.0f, 0.01f), 0.0, [] (float value) { return juce::String (value, 2); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "radius", "Radius", "", juce::NormalisableRange (0.0f, 1.0f, 0.001f), 1.0, [] (float value) { return juce::String (value, 3); }, nullptr)); // same coordinate definition and ranges as in the RoomEncoder params.push_back (OSCParameterInterface::createParameterTheOldWay ( "xPos", "X Coordinate", "m", juce::NormalisableRange (-15.0f, 15.0f, 0.001f), 0.0f, [] (float value) { return juce::String (value, 3); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "yPos", "Y Coordinate", "m", juce::NormalisableRange (-15.0f, 15.0f, 0.001f), -1.0f, [] (float value) { return juce::String (value, 3); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "zPos", "Z Coordinate", "m", juce::NormalisableRange (-10.0f, 10.0f, 0.001f), -1.0f, [] (float value) { return juce::String (value, 3); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "roomX", "room size x", "m", juce::NormalisableRange (1.0f, 30.0f, 0.01f), 10.0f, [] (float value) { return juce::String (value, 2); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "roomY", "room size y", "m", juce::NormalisableRange (1.0f, 30.0f, 0.01f), 11.0f, [] (float value) { return juce::String (value, 2); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "roomZ", "room size z", "m", juce::NormalisableRange (1.0f, 20.0f, 0.01f), 7.0f, [] (float value) { return juce::String (value, 2); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "listenerX", "listener position x", "m", juce::NormalisableRange (-15.0f, 15.0f, 0.001f), -1.0f, [] (float value) { return juce::String (value, 3); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "listenerY", "listener position y", "m", juce::NormalisableRange (-15.0f, 15.0f, 0.001f), -1.0f, [] (float value) { return juce::String (value, 3); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "listenerZ", "listener position z", "m", juce::NormalisableRange (-10.0f, 10.0f, 0.001f), -1.0f, [] (float value) { return juce::String (value, 3); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "radiusRange", "Radius juce::Range", "m", juce::NormalisableRange (0.1f, 50.0f, 0.01f), 1.0, [] (float value) { return juce::String (value, 2); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "azimuthFlip", "Invert Azimuth", "", juce::NormalisableRange (0.0f, 1.0f, 1.0f), 0.0, [] (float value) { return value >= 0.5f ? "ON" : "OFF"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "elevationFlip", "Invert Elevation", "", juce::NormalisableRange (0.0f, 1.0f, 1.0f), 0.0, [] (float value) { return value >= 0.5f ? "ON" : "OFF"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "radiusFlip", "Invert Radius Axis", "", juce::NormalisableRange (0.0f, 1.0f, 1.0f), 0.0, [] (float value) { return value >= 0.5f ? "ON" : "OFF"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "xFlip", "Invert X Axis", "", juce::NormalisableRange (0.0f, 1.0f, 1.0f), 0.0, [] (float value) { return value >= 0.5f ? "ON" : "OFF"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "yFlip", "Invert Y Axis", "", juce::NormalisableRange (0.0f, 1.0f, 1.0f), 0.0, [] (float value) { return value >= 0.5f ? "ON" : "OFF"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "zFlip", "Invert Z Axis", "", juce::NormalisableRange (0.0f, 1.0f, 1.0f), 0.0, [] (float value) { return value >= 0.5f ? "ON" : "OFF"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "syncChannel", "Synchronize to Channel", "", juce::NormalisableRange (0.0f, 4.0f, 1.0f), 0.0f, [] (float value) { if (value >= 0.5f && value < 1.5f) return "Channel 1"; else if (value >= 1.5f && value < 2.5f) return "Channel 2"; else if (value >= 2.5f && value < 3.5f) return "Channel 3"; else if (value >= 3.5f) return "Channel 4"; else return "None"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "syncRoomSize", "Synchronize Room Dimensions", "", juce::NormalisableRange (0.0f, 1.0f, 1.0f), 1.0f, [] (float value) { return value >= 0.5f ? "YES" : "NO"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "syncListener", "Synchronize Listener Position", "", juce::NormalisableRange (0.0f, 1.0f, 1.0f), 1.0f, [] (float value) { return value >= 0.5f ? "YES" : "NO"; }, nullptr)); return params; } //============================================================================== // This creates new instances of the plugin.. juce::AudioProcessor* JUCE_CALLTYPE createPluginFilter() { return new CoordinateConverterAudioProcessor(); } ././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/CoordinateConverter/Source/PluginEditor.cppIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/CoordinateConverter/Source/PluginEdi0000664002537200253720000005432215257173642031657 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #include "PluginEditor.h" #include "PluginProcessor.h" //============================================================================== CoordinateConverterAudioProcessorEditor::CoordinateConverterAudioProcessorEditor ( CoordinateConverterAudioProcessor& p, juce::AudioProcessorValueTreeState& vts) : juce::AudioProcessorEditor (&p), processor (p), valueTreeState (vts), footer (p.getOSCParameterInterface()), panner (*valueTreeState.getParameter ("azimuth"), valueTreeState.getParameterRange ("azimuth"), *valueTreeState.getParameter ("elevation"), valueTreeState.getParameterRange ("elevation")), xyzPanner (*valueTreeState.getParameter ("xPos"), valueTreeState.getParameterRange ("xPos"), *valueTreeState.getParameter ("yPos"), valueTreeState.getParameterRange ("yPos"), *valueTreeState.getParameter ("zPos"), valueTreeState.getParameterRange ("zPos")), listenerElement (*valueTreeState.getParameter ("listenerX"), valueTreeState.getParameterRange ("listenerX"), *valueTreeState.getParameter ("listenerY"), valueTreeState.getParameterRange ("listenerY"), *valueTreeState.getParameter ("listenerZ"), valueTreeState.getParameterRange ("listenerZ")) { // ============== BEGIN: essentials ====================== // set GUI size and lookAndFeel //setSize(500, 300); // use this to create a fixed-size GUI setResizeLimits (470, 645, 800, 705); // use this to create a resizable GUI setResizable (true, true); setLookAndFeel (&globalLaF); // make title and footer visible, and set the PluginName addAndMakeVisible (&title); title.setTitle (juce::String ("Coordinate"), juce::String ("Converter")); title.setFont (globalLaF.robotoBold, globalLaF.robotoLight); addAndMakeVisible (&footer); // ============= END: essentials ======================== addAndMakeVisible (gcSpherical); gcSpherical.setText ("Spherical Coordinates"); addAndMakeVisible (gcCartesian); gcCartesian.setText ("Cartesian Coordinates"); addAndMakeVisible (gcRange); gcRange.setText ("Radius Range / Room Dimensions"); addAndMakeVisible (gcListener); gcListener.setText ("Listener Position"); addAndMakeVisible (gcSync); gcSync.setText ("Synchronize Room Settings"); addAndMakeVisible (sphere); panner.setColour (juce::Colours::white); sphere.addElement (&panner); // ============== BEGIN: SPHERICAL COORDINATES ============ addAndMakeVisible (slAzimuth); slAzimuthAttachment.reset (new SliderAttachment (valueTreeState, "azimuth", slAzimuth)); slAzimuth.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); slAzimuth.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); slAzimuth.setReverse (true); slAzimuth.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[0]); slAzimuth.setRotaryParameters (juce::MathConstants::pi, 3 * juce::MathConstants::pi, false); slAzimuth.setTooltip ("Azimuth angle"); addAndMakeVisible (slElevation); slElevationAttachment.reset (new SliderAttachment (valueTreeState, "elevation", slElevation)); slElevation.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); slElevation.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); slElevation.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[1]); slElevation.setRotaryParameters (0.5 * juce::MathConstants::pi, 2.5 * juce::MathConstants::pi, false); slElevation.setTooltip ("Elevation angle"); addAndMakeVisible (slRadius); slRadiusAttachment.reset (new SliderAttachment (valueTreeState, "radius", slRadius)); slRadius.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); slRadius.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); slRadius.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[2]); slRadius.setReverse (false); slRadius.setTooltip ("Radius (normalized)"); addAndMakeVisible (lbAzimuth); lbAzimuth.setText ("Azimuth"); addAndMakeVisible (lbElevation); lbElevation.setText ("Elevation"); addAndMakeVisible (lbRadius); lbRadius.setText ("Radius"); addAndMakeVisible (tbAzimuthFlip); tbAzimuthFlipAttachment.reset ( new ButtonAttachment (valueTreeState, "azimuthFlip", tbAzimuthFlip)); tbAzimuthFlip.setColour (juce::ToggleButton::ColourIds::tickColourId, globalLaF.ClWidgetColours[0]); tbAzimuthFlip.setButtonText ("Flip"); addAndMakeVisible (tbElevationFlip); tbElevationFlipAttachment.reset ( new ButtonAttachment (valueTreeState, "elevationFlip", tbElevationFlip)); tbElevationFlip.setColour (juce::ToggleButton::ColourIds::tickColourId, globalLaF.ClWidgetColours[1]); tbElevationFlip.setButtonText ("Flip"); addAndMakeVisible (tbRadiusFlip); tbRadiusFlipAttachment.reset ( new ButtonAttachment (valueTreeState, "radiusFlip", tbRadiusFlip)); tbRadiusFlip.setColour (juce::ToggleButton::ColourIds::tickColourId, globalLaF.ClWidgetColours[2]); tbRadiusFlip.setButtonText ("Flip"); // ============== END: SPHERICAL COORDINATES ============ // ============== BEGIN: CARTESIAN COORDINATES ============ listenerElement.setColour (globalLaF.ClWidgetColours[1]); addAndMakeVisible (&xyPlane); xyPlane.addElement (&xyzPanner); xyPlane.addElement (&listenerElement); xyPlane.useAutoScale (false); addAndMakeVisible (&zyPlane); zyPlane.setPlane (PositionPlane::Planes::zy); zyPlane.addElement (&xyzPanner); zyPlane.addElement (&listenerElement); zyPlane.useAutoScale (false); setPlaneDimensions(); addAndMakeVisible (slXPos); slXPosAttachment.reset (new SliderAttachment (valueTreeState, "xPos", slXPos)); slXPos.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); slXPos.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); slXPos.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[0]); slXPos.setTextValueSuffix (" m"); slXPos.setTooltip ("x coordinate"); addAndMakeVisible (slYPos); slYPosAttachment.reset (new SliderAttachment (valueTreeState, "yPos", slYPos)); slYPos.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); slYPos.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); slYPos.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[1]); slYPos.setTextValueSuffix (" m"); slYPos.setTooltip ("y coordinate"); addAndMakeVisible (slZPos); slZPosAttachment.reset (new SliderAttachment (valueTreeState, "zPos", slZPos)); slZPos.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); slZPos.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); slZPos.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[2]); slZPos.setTextValueSuffix (" m"); slZPos.setTooltip ("z coordinate"); addAndMakeVisible (lbXPos); lbXPos.setText ("X"); addAndMakeVisible (lbYPos); lbYPos.setText ("Y"); addAndMakeVisible (lbZPos); lbZPos.setText ("Z"); addAndMakeVisible (tbXFlip); tbXFlipAttachment.reset (new ButtonAttachment (valueTreeState, "xFlip", tbXFlip)); tbXFlip.setColour (juce::ToggleButton::ColourIds::tickColourId, globalLaF.ClWidgetColours[0]); tbXFlip.setButtonText ("Flip"); tbXFlip.addListener (this); addAndMakeVisible (tbYFlip); tbYFlipAttachment.reset (new ButtonAttachment (valueTreeState, "yFlip", tbYFlip)); tbYFlip.setColour (juce::ToggleButton::ColourIds::tickColourId, globalLaF.ClWidgetColours[1]); tbYFlip.setButtonText ("Flip"); tbYFlip.addListener (this); addAndMakeVisible (tbZFlip); tbZFlipAttachment.reset (new ButtonAttachment (valueTreeState, "zFlip", tbZFlip)); tbZFlip.setColour (juce::ToggleButton::ColourIds::tickColourId, globalLaF.ClWidgetColours[2]); tbZFlip.setButtonText ("Flip"); tbZFlip.addListener (this); updatePlaneFlips(); // ============== END: CARTESIAN COORDINATES ============ // ============== BEGIN: LISTENER POSITION ============ addAndMakeVisible (slListenerX); slListenerX.setJustificationType (juce::Justification::centred); slListenerX.setEditable (true); slListenerXAttachment.reset (new LabelAttachment (valueTreeState, "listenerX", slListenerX)); addAndMakeVisible (slListenerY); slListenerY.setJustificationType (juce::Justification::centred); slListenerY.setEditable (true); slListenerYAttachment.reset (new LabelAttachment (valueTreeState, "listenerY", slListenerY)); addAndMakeVisible (slListenerZ); slListenerZ.setJustificationType (juce::Justification::centred); slListenerZ.setEditable (true); slListenerZAttachment.reset (new LabelAttachment (valueTreeState, "listenerZ", slListenerZ)); addAndMakeVisible (lbListenerX); lbListenerX.setText ("x"); addAndMakeVisible (lbListenerY); lbListenerY.setText ("y"); addAndMakeVisible (lbListenerZ); lbListenerZ.setText ("z"); // ============== END: LISTENER POSITION ============ // ============== BEGIN: RANGE SETTINGS ============ addAndMakeVisible (slRadiusRange); slRadiusRange.setJustificationType (juce::Justification::centred); slRadiusRange.setEditable (true); slRadiusRangeAttachment.reset ( new LabelAttachment (valueTreeState, "radiusRange", slRadiusRange)); addAndMakeVisible (lbRadiusRange); lbRadiusRange.setText ("Radius"); addAndMakeVisible (slRoomX); slRoomX.setJustificationType (juce::Justification::centred); slRoomX.setEditable (true); slRoomXAttachment.reset (new LabelAttachment (valueTreeState, "roomX", slRoomX)); addAndMakeVisible (lbRoomX); lbRoomX.setText ("Depth"); addAndMakeVisible (slRoomY); slRoomY.setJustificationType (juce::Justification::centred); slRoomY.setEditable (true); slRoomYAttachment.reset (new LabelAttachment (valueTreeState, "roomY", slRoomY)); addAndMakeVisible (lbRoomY); lbRoomY.setText ("Width"); addAndMakeVisible (slRoomZ); slRoomZ.setJustificationType (juce::Justification::centred); slRoomZ.setEditable (true); slRoomZAttachment.reset (new LabelAttachment (valueTreeState, "roomZ", slRoomZ)); addAndMakeVisible (lbRoomZ); lbRoomZ.setText ("Height"); // ============== END: RANGE SETTINGS ============ // ============== BEGIN: SYNCHRONIZATION ============ addAndMakeVisible (cbSyncChannel); cbSyncChannel.setJustificationType (juce::Justification::centred); cbSyncChannel.addItem ("none", 1); cbSyncChannel.addItem ("1", 2); cbSyncChannel.addItem ("2", 3); cbSyncChannel.addItem ("3", 4); cbSyncChannel.addItem ("4", 5); cbSyncChannelAttachment.reset ( new ComboBoxAttachment (valueTreeState, "syncChannel", cbSyncChannel)); cbSyncChannel.setTooltip ("Synchronizes the room settings with other CoordinateConverters " "and RoomEncoders set to the same channel."); addAndMakeVisible (lbSyncChannel); lbSyncChannel.setText ("Channel", false, juce::Justification::left); addAndMakeVisible (tbSyncRoomSize); tbSyncRoomSizeAttachment.reset ( new ButtonAttachment (valueTreeState, "syncRoomSize", tbSyncRoomSize)); tbSyncRoomSize.setButtonText ("Room Dimensions"); tbSyncRoomSize.setColour (juce::ToggleButton::tickColourId, globalLaF.ClWidgetColours[0]); addAndMakeVisible (tbSyncListener); tbSyncListenerAttachment.reset ( new ButtonAttachment (valueTreeState, "syncListener", tbSyncListener)); tbSyncListener.setButtonText ("Listener Position"); tbSyncListener.setColour (juce::ToggleButton::tickColourId, globalLaF.ClWidgetColours[1]); // ============== END: SYNCHRONIZATION ============ // start timer after everything is set up properly startTimer (20); } CoordinateConverterAudioProcessorEditor::~CoordinateConverterAudioProcessorEditor() { setLookAndFeel (nullptr); } //============================================================================== void CoordinateConverterAudioProcessorEditor::paint (juce::Graphics& g) { g.fillAll (globalLaF.ClBackground); } void CoordinateConverterAudioProcessorEditor::resized() { // ============ BEGIN: header and footer ============ const int leftRightMargin = 30; const int headerHeight = 60; const int footerHeight = 25; const int rotSliderHeight = 55; const int rotSliderSpacing = 17; const int rotSliderWidth = 45; const int sphericalWidth = 240; juce::Rectangle area (getLocalBounds()); juce::Rectangle footerArea (area.removeFromBottom (footerHeight)); footer.setBounds (footerArea); area.removeFromLeft (leftRightMargin); area.removeFromRight (leftRightMargin); juce::Rectangle headerArea = area.removeFromTop (headerHeight); title.setBounds (headerArea); area.removeFromTop (10); area.removeFromBottom (5); // =========== END: header and footer ================= // ===== SYNCHRONIZATION auto syncArea = area.removeFromBottom (45); gcSync.setBounds (syncArea); syncArea.removeFromTop (25); { auto row = syncArea.removeFromTop (20); lbSyncChannel.setBounds (row.removeFromLeft (50)); cbSyncChannel.setBounds (row.removeFromLeft (60)); row.removeFromLeft (20); tbSyncRoomSize.setBounds (row.removeFromLeft (130)); row.removeFromLeft (10); tbSyncListener.setBounds (row.removeFromLeft (130)); } area.removeFromBottom (10); // ===== RANGE SETTINGS auto settingsArea = area.removeFromBottom (60); auto rangeArea = settingsArea.removeFromLeft (sphericalWidth); gcRange.setBounds (rangeArea); rangeArea.removeFromTop (25); { auto sliderRow = rangeArea.removeFromTop (18); slRadiusRange.setBounds (sliderRow.removeFromLeft (50)); sliderRow.removeFromLeft (20); slRoomX.setBounds (sliderRow.removeFromLeft (50)); sliderRow.removeFromLeft (5); slRoomY.setBounds (sliderRow.removeFromLeft (50)); sliderRow.removeFromLeft (5); slRoomZ.setBounds (sliderRow.removeFromLeft (50)); sliderRow = rangeArea.removeFromTop (18); lbRadiusRange.setBounds (sliderRow.removeFromLeft (50)); sliderRow.removeFromLeft (20); lbRoomX.setBounds (sliderRow.removeFromLeft (50)); sliderRow.removeFromLeft (5); lbRoomY.setBounds (sliderRow.removeFromLeft (50)); sliderRow.removeFromLeft (5); lbRoomZ.setBounds (sliderRow.removeFromLeft (50)); } settingsArea.removeFromLeft (20); auto listenerArea = settingsArea; { gcListener.setBounds (listenerArea); listenerArea.removeFromTop (25); auto sliderRow = listenerArea.removeFromTop (18); slListenerX.setBounds (sliderRow.removeFromLeft (45)); sliderRow.removeFromLeft (5); slListenerY.setBounds (sliderRow.removeFromLeft (45)); sliderRow.removeFromLeft (5); slListenerZ.setBounds (sliderRow.removeFromLeft (45)); sliderRow = listenerArea.removeFromTop (12); lbListenerX.setBounds (sliderRow.removeFromLeft (45)); sliderRow.removeFromLeft (5); lbListenerY.setBounds (sliderRow.removeFromLeft (45)); sliderRow.removeFromLeft (5); lbListenerZ.setBounds (sliderRow.removeFromLeft (45)); } area.removeFromBottom (10); // ===== SPHERICAL auto sphericalArea = area.removeFromLeft (sphericalWidth); gcSpherical.setBounds (sphericalArea); sphericalArea.removeFromTop (25); auto sliderArea = sphericalArea.removeFromBottom (rotSliderHeight + 12 + 5 + 20); // slider + spacing + label const int w = sphericalArea.getWidth(); const int leftMargin = 0.5f * (w - 3 * rotSliderWidth - 2 * rotSliderSpacing); auto sliderRow = sliderArea.removeFromTop (rotSliderHeight); sliderRow.removeFromLeft (leftMargin); slAzimuth.setBounds (sliderRow.removeFromLeft (rotSliderWidth)); sliderRow.removeFromLeft (rotSliderSpacing); slElevation.setBounds (sliderRow.removeFromLeft (rotSliderWidth)); sliderRow.removeFromLeft (rotSliderSpacing); slRadius.setBounds (sliderRow.removeFromLeft (rotSliderWidth)); sliderArea.removeFromBottom (5); sliderRow = sliderArea.removeFromTop (12); sliderRow.removeFromLeft (leftMargin); lbAzimuth.setBounds (sliderRow.removeFromLeft (rotSliderWidth)); sliderRow.removeFromLeft (rotSliderSpacing - 5); lbElevation.setBounds (sliderRow.removeFromLeft (rotSliderWidth + 10)); sliderRow.removeFromLeft (rotSliderSpacing - 5); lbRadius.setBounds (sliderRow.removeFromLeft (rotSliderWidth)); sliderRow = sliderArea.removeFromTop (20); sliderRow.removeFromLeft (leftMargin); tbAzimuthFlip.setBounds (sliderRow.removeFromLeft (rotSliderWidth)); sliderRow.removeFromLeft (rotSliderSpacing); tbElevationFlip.setBounds (sliderRow.removeFromLeft (rotSliderWidth)); sliderRow.removeFromLeft (rotSliderSpacing); tbRadiusFlip.setBounds (sliderRow.removeFromLeft (rotSliderWidth)); sphere.setBounds (sphericalArea); area.removeFromLeft (20); // ==== CARTESIAN auto cartesianArea = area; gcCartesian.setBounds (cartesianArea); cartesianArea.removeFromTop (25); { auto sliderArea = cartesianArea.removeFromBottom (rotSliderHeight + 12 + 5 + 20); // slider + spacing + label const int w = cartesianArea.getWidth(); const int leftMargin = 0.5f * (w - 3 * rotSliderWidth - 2 * rotSliderSpacing); sliderArea.removeFromLeft (leftMargin); auto sliderRow = sliderArea.removeFromTop (rotSliderHeight); slXPos.setBounds (sliderRow.removeFromLeft (rotSliderWidth)); sliderRow.removeFromLeft (rotSliderSpacing - 2); slYPos.setBounds (sliderRow.removeFromLeft (rotSliderWidth)); sliderRow.removeFromLeft (rotSliderSpacing - 2); slZPos.setBounds (sliderRow.removeFromLeft (rotSliderWidth)); sliderRow = sliderArea.removeFromTop (12); lbXPos.setBounds (sliderRow.removeFromLeft (rotSliderWidth)); sliderRow.removeFromLeft (rotSliderSpacing - 2); lbYPos.setBounds (sliderRow.removeFromLeft (rotSliderWidth)); sliderRow.removeFromLeft (rotSliderSpacing - 2); lbZPos.setBounds (sliderRow.removeFromLeft (rotSliderWidth)); sliderRow = sliderArea.removeFromTop (20); sliderRow.removeFromLeft (leftMargin); tbXFlip.setBounds (sliderRow.removeFromLeft (rotSliderWidth)); sliderRow.removeFromLeft (rotSliderSpacing); tbYFlip.setBounds (sliderRow.removeFromLeft (rotSliderWidth)); sliderRow.removeFromLeft (rotSliderSpacing); tbZFlip.setBounds (sliderRow.removeFromLeft (rotSliderWidth)); const int sphereHeight = sphere.getHeight(); const int planeHeight = (sphereHeight - 11) / 2; auto planeArea = cartesianArea.removeFromLeft (planeHeight); xyPlane.setBounds (planeArea.removeFromTop (planeHeight)); planeArea.removeFromTop (6); // 5 left zyPlane.setBounds (planeArea.removeFromTop (planeHeight)); } setPlaneDimensions(); } void CoordinateConverterAudioProcessorEditor::setPlaneDimensions() { const juce::Vector3D dims (*valueTreeState.getRawParameterValue ("roomX"), *valueTreeState.getRawParameterValue ("roomY"), *valueTreeState.getRawParameterValue ("roomZ")); const float scale = juce::jmin (xyPlane.setDimensions (dims), zyPlane.setDimensions (dims)); xyPlane.setScale (scale); zyPlane.setScale (scale); } void CoordinateConverterAudioProcessorEditor::updatePlaneFlips() { xyPlane.setXFlip (tbXFlip.getToggleState()); xyPlane.setYFlip (tbYFlip.getToggleState()); zyPlane.setYFlip (tbYFlip.getToggleState()); zyPlane.setZFlip (tbZFlip.getToggleState()); // the planes flip the drawn positions, as the cartesian parameters are flipped, however the // listener position isn't, so its flip is undone listenerElement.setScaling ({ tbXFlip.getToggleState() ? -1.0f : 1.0f, tbYFlip.getToggleState() ? -1.0f : 1.0f, tbZFlip.getToggleState() ? -1.0f : 1.0f }); xyPlane.repaint(); zyPlane.repaint(); } void CoordinateConverterAudioProcessorEditor::timerCallback() { if (processor.updatePlaneDimensions.get()) { processor.updatePlaneDimensions = false; setPlaneDimensions(); } if (processor.repaintPositionPlanes.get()) { processor.repaintPositionPlanes = false; xyPlane.repaint(); zyPlane.repaint(); } if (processor.repaintSphere.get()) { processor.repaintSphere = false; sphere.repaint(); } } void CoordinateConverterAudioProcessorEditor::buttonStateChanged (juce::Button* button) { if (button == &tbXFlip || button == &tbYFlip || button == &tbZFlip) updatePlaneFlips(); } ././@LongLink0000644000000000000000000000015500000000000011604 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/CoordinateConverter/Source/PluginProcessor.hIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/CoordinateConverter/Source/PluginPro0000664002537200253720000001133515257173642031713 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once #include "../../resources/AudioProcessorBase.h" #include "../../resources/Conversions.h" #include "../../resources/RoomSync.h" #include "../JuceLibraryCode/JuceHeader.h" #define ProcessorClass CoordinateConverterAudioProcessor //============================================================================== class CoordinateConverterAudioProcessor : public AudioProcessorBase, IOTypes::AudioChannels<64>> { public: constexpr static int numberOfInputChannels = 64; constexpr static int numberOfOutputChannels = 64; //============================================================================== CoordinateConverterAudioProcessor(); ~CoordinateConverterAudioProcessor(); //============================================================================== void prepareToPlay (double sampleRate, int samplesPerBlock) override; void releaseResources() override; void processBlock (juce::AudioSampleBuffer&, juce::MidiBuffer&) override; //============================================================================== juce::AudioProcessorEditor* createEditor() override; bool hasEditor() const override; //============================================================================== int getNumPrograms() override; int getCurrentProgram() override; void setCurrentProgram (int index) override; const juce::String getProgramName (int index) override; void changeProgramName (int index, const juce::String& newName) override; //============================================================================== void getStateInformation (juce::MemoryBlock& destData) override; void setStateInformation (const void* data, int sizeInBytes) override; //============================================================================== void parameterChanged (const juce::String& parameterID, float newValue) override; void updateBuffers() override; // use this to implement a buffer update method //======= Parameters =========================================================== std::vector> createParameterLayout(); //============================================================================== void updateCartesianCoordinates(); void updateSphericalCoordinates(); juce::Atomic repaintSphere = true; juce::Atomic repaintPositionPlanes = true; juce::Atomic updatePlaneDimensions = true; private: //============================================================================== void convertLegacyCartesianParameters (juce::XmlElement& xml); juce::Atomic updatingParams = false; bool cartesianWasLastUpdated = true; // list of used audio parameters std::atomic* azimuth; std::atomic* elevation; std::atomic* radius; std::atomic* xPos; std::atomic* yPos; std::atomic* zPos; std::atomic* roomX; std::atomic* roomY; std::atomic* roomZ; std::atomic* listenerX; std::atomic* listenerY; std::atomic* listenerZ; std::atomic* radiusRange; std::atomic* azimuthFlip; std::atomic* elevationFlip; std::atomic* radiusFlip; std::atomic* xFlip; std::atomic* yFlip; std::atomic* zFlip; float azimuthFlipFactor = 1.0f; float elevationFlipFactor = 1.0f; float radiusFlipFactor = 1.0f; float xFlipFactor = 1.0f; float yFlipFactor = 1.0f; float zFlipFactor = 1.0f; RoomSync roomSync { parameters, "syncChannel" }; //============================================================================== JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (CoordinateConverterAudioProcessor) }; ././@LongLink0000644000000000000000000000015200000000000011601 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/CoordinateConverter/Source/PluginEditor.hIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/CoordinateConverter/Source/PluginEdi0000664002537200253720000001256015257173642031655 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once #include "../JuceLibraryCode/JuceHeader.h" #include "PluginProcessor.h" //Plugin Design Essentials #include "../../resources/customComponents/TitleBar.h" #include "../../resources/lookAndFeel/IEM_LaF.h" //Custom juce::Components #include "../../resources/LabelAttachment.h" #include "../../resources/customComponents/PositionPlane.h" #include "../../resources/customComponents/ReverseSlider.h" #include "../../resources/customComponents/SimpleLabel.h" #include "../../resources/customComponents/SpherePanner.h" typedef ReverseSlider::SliderAttachment SliderAttachment; // all ReverseSliders will make use of the parameters' valueToText() function typedef juce::AudioProcessorValueTreeState::ComboBoxAttachment ComboBoxAttachment; typedef juce::AudioProcessorValueTreeState::ButtonAttachment ButtonAttachment; //============================================================================== /** */ class CoordinateConverterAudioProcessorEditor : public juce::AudioProcessorEditor, private juce::Timer, private juce::Button::Listener { public: CoordinateConverterAudioProcessorEditor (CoordinateConverterAudioProcessor&, juce::AudioProcessorValueTreeState&); ~CoordinateConverterAudioProcessorEditor(); //============================================================================== void paint (juce::Graphics&) override; void resized() override; void timerCallback() override; void buttonClicked (juce::Button* button) override {}; void buttonStateChanged (juce::Button* button) override; private: void setPlaneDimensions(); void updatePlaneFlips(); // ====================== begin essentials ================== // lookAndFeel class with the IEM plug-in suite design LaF globalLaF; // stored references to the AudioProcessor and juce::ValueTreeState holding all the parameters CoordinateConverterAudioProcessor& processor; juce::AudioProcessorValueTreeState& valueTreeState; /* title and footer component title component can hold different widgets for in- and output: - NoIOWidget (if there's no need for an input or output widget) - AudioChannelsIOWidget - AmbisonicIOWidget - DirectivitiyIOWidget */ TitleBar title; OSCFooter footer; // =============== end essentials ============ // === Spherical juce::GroupComponent gcSpherical, gcCartesian, gcRange, gcListener, gcSync; SpherePanner sphere; SpherePanner::AzimuthElevationParameterElement panner; ReverseSlider slAzimuth, slElevation, slRadius; std::unique_ptr slAzimuthAttachment, slElevationAttachment, slRadiusAttachment; SimpleLabel lbAzimuth, lbElevation, lbRadius; // === Cartesian PositionPlane xyPlane, zyPlane; PositionPlane::ParameterElement xyzPanner, listenerElement; ReverseSlider slXPos, slYPos, slZPos; std::unique_ptr slXPosAttachment, slYPosAttachment, slZPosAttachment; SimpleLabel lbXPos, lbYPos, lbZPos; juce::ToggleButton tbAzimuthFlip, tbElevationFlip, tbRadiusFlip, tbXFlip, tbYFlip, tbZFlip; std::unique_ptr tbAzimuthFlipAttachment, tbElevationFlipAttachment, tbRadiusFlipAttachment, tbXFlipAttachment, tbYFlipAttachment, tbZFlipAttachment; // === Listener Position juce::Label slListenerX, slListenerY, slListenerZ; std::unique_ptr slListenerXAttachment, slListenerYAttachment, slListenerZAttachment; SimpleLabel lbListenerX, lbListenerY, lbListenerZ; // === Radius Range and Room Dimensions juce::Label slRadiusRange; std::unique_ptr slRadiusRangeAttachment; SimpleLabel lbRadiusRange; juce::Label slRoomX, slRoomY, slRoomZ; std::unique_ptr slRoomXAttachment, slRoomYAttachment, slRoomZAttachment; SimpleLabel lbRoomX, lbRoomY, lbRoomZ; // === Synchronization juce::ComboBox cbSyncChannel; std::unique_ptr cbSyncChannelAttachment; SimpleLabel lbSyncChannel; juce::ToggleButton tbSyncRoomSize, tbSyncListener; std::unique_ptr tbSyncRoomSizeAttachment, tbSyncListenerAttachment; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (CoordinateConverterAudioProcessorEditor) }; IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/CoordinateConverter/CMakeLists.txt0000664002537200253720000000365515257173642031357 0ustar zmoelnigzmoelnigset (PLUGIN_TARGET "") if (IEM_FORMATS) juce_add_plugin (CoordinateConverter PLUGIN_MANUFACTURER_CODE IEMA PLUGIN_CODE CoCo ICON_BIG "../resources/Standalone/IEMPluginSuiteSmall.png" ICON_SMALL "../resources/Standalone/IEMPluginSuiteSmall.png" COMPANY_NAME "IEM" PRODUCT_NAME "CoordinateConverter" FORMATS ${IEM_FORMATS} VERSION ${CoordinateConverter_VERSION} LV2URI "http://plugins.iem.at/CoordinateConverter" VST2_CATEGORY kPlugSurroundFx VST3_CATEGORIES Spatial Surround Tools AAX_CATEGORY SoundField) list (APPEND PLUGIN_TARGET CoordinateConverter) endif() foreach (TARGET IN LISTS PLUGIN_TARGET) juce_generate_juce_header (${TARGET}) target_sources (${TARGET} PRIVATE Source/PluginEditor.cpp Source/PluginEditor.h Source/PluginProcessor.cpp Source/PluginProcessor.h ../resources/OSC/OSCInputStream.h ../resources/OSC/OSCParameterInterface.cpp ../resources/OSC/OSCParameterInterface.h ../resources/OSC/OSCStatus.cpp ../resources/OSC/OSCStatus.h ../resources/OSC/OSCUtilities.h ../resources/efficientSHvanilla.cpp ) target_compile_definitions (${TARGET} PRIVATE JUCE_USE_CURL=0 JUCE_WEB_BROWSER=0 JUCE_USE_CUSTOM_PLUGIN_STANDALONE_APP=1 JUCE_USE_FLAC=0 JUCE_USE_OGGVORBIS=0 JUCE_USE_MP3AUDIOFORMAT=0 JUCE_USE_LAME_AUDIO_FORMAT=0 JUCE_USE_WINDOWS_MEDIA_FORMAT=0 JUCE_VST3_CAN_REPLACE_VST2=0) target_include_directories (${TARGET} PRIVATE Source) target_link_libraries (${TARGET} PRIVATE LAF_fonts IEM_logo juce::juce_audio_utils juce::juce_audio_plugin_client juce::juce_osc juce::juce_dsp juce::juce_opengl juce::juce_recommended_config_flags juce::juce_recommended_lto_flags) endforeach()IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/ProbeDecoder/0000775002537200253720000000000015257173642025164 5ustar zmoelnigzmoelnigIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/ProbeDecoder/Source/0000775002537200253720000000000015257173642026424 5ustar zmoelnigzmoelnig././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/ProbeDecoder/Source/PluginProcessor.cppIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/ProbeDecoder/Source/PluginProcessor.0000664002537200253720000002166415257173642031574 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #include "PluginProcessor.h" #include "PluginEditor.h" //============================================================================== ProbeDecoderAudioProcessor::ProbeDecoderAudioProcessor() : AudioProcessorBase ( #ifndef JucePlugin_PreferredChannelConfigurations BusesProperties() #if ! JucePlugin_IsMidiEffect #if ! JucePlugin_IsSynth .withInput ("Input", ((juce::PluginHostType::getPluginLoadedAs() == juce::AudioProcessor::wrapperType_VST3) ? juce::AudioChannelSet::ambisonic (1) : juce::AudioChannelSet::ambisonic (7)), true) #endif .withOutput ("Output", juce::AudioChannelSet::mono(), true) #endif , #endif createParameterLayout()) { orderSetting = parameters.getRawParameterValue ("orderSetting"); useSN3D = parameters.getRawParameterValue ("useSN3D"); azimuth = parameters.getRawParameterValue ("azimuth"); elevation = parameters.getRawParameterValue ("elevation"); parameters.addParameterListener ("orderSetting", this); parameters.addParameterListener ("azimuth", this); parameters.addParameterListener ("elevation", this); juce::FloatVectorOperations::clear (previousSH, 64); } ProbeDecoderAudioProcessor::~ProbeDecoderAudioProcessor() = default; //============================================================================== int ProbeDecoderAudioProcessor::getNumPrograms() { return 1; // NB: some hosts don't cope very well if you tell them there are 0 programs, // so this should be at least 1, even if you're not really implementing programs. } int ProbeDecoderAudioProcessor::getCurrentProgram() { return 0; } void ProbeDecoderAudioProcessor::setCurrentProgram (int index) { } const juce::String ProbeDecoderAudioProcessor::getProgramName (int index) { return juce::String(); } void ProbeDecoderAudioProcessor::changeProgramName (int index, const juce::String& newName) { } //============================================================================== void ProbeDecoderAudioProcessor::prepareToPlay (double sampleRate, int samplesPerBlock) { checkInputAndOutput (this, *orderSetting, 1, true); } void ProbeDecoderAudioProcessor::releaseResources() { // When playback stops, you can use this as an opportunity to free up any // spare memory, etc. } void ProbeDecoderAudioProcessor::processBlock (juce::AudioSampleBuffer& buffer, juce::MidiBuffer& midiMessages) { checkInputAndOutput (this, *orderSetting, 1); const int ambisonicOrder = input.getOrder(); const int nChannels = juce::jmin (buffer.getNumChannels(), input.getNumberOfChannels()); juce::Vector3D xyz = Conversions::sphericalToCartesian (juce::degreesToRadians (azimuth->load()), juce::degreesToRadians (elevation->load())); float sh[64]; SHEval (ambisonicOrder, xyz, sh, false); const int nCh = juce::jmin (buffer.getNumChannels(), nChannels); const int numSamples = buffer.getNumSamples(); if (*useSN3D >= 0.5f) juce::FloatVectorOperations::multiply (sh, sh, sn3d2n3d, nChannels); buffer.applyGainRamp (0, 0, numSamples, previousSH[0], sh[0]); for (int i = 1; i < nCh; i++) { buffer.addFromWithRamp (0, 0, buffer.getReadPointer (i), numSamples, previousSH[i], sh[i]); buffer.clear (i, 0, numSamples); } juce::FloatVectorOperations::copy (previousSH, sh, nChannels); } //============================================================================== bool ProbeDecoderAudioProcessor::hasEditor() const { return true; // (change this to false if you choose to not supply an editor) } juce::AudioProcessorEditor* ProbeDecoderAudioProcessor::createEditor() { return new ProbeDecoderAudioProcessorEditor (*this, parameters); } void ProbeDecoderAudioProcessor::parameterChanged (const juce::String& parameterID, float newValue) { if (parameterID == "orderSetting") userChangedIOSettings = true; else if (parameterID == "azimuth" || parameterID == "elevation") { updatedPositionData = true; } } //============================================================================== void ProbeDecoderAudioProcessor::getStateInformation (juce::MemoryBlock& destData) { auto state = parameters.copyState(); auto oscConfig = state.getOrCreateChildWithName ("OSCConfig", nullptr); oscConfig.copyPropertiesFrom (oscParameterInterface.getConfig(), nullptr); std::unique_ptr xml (state.createXml()); copyXmlToBinary (*xml, destData); } void ProbeDecoderAudioProcessor::setStateInformation (const void* data, int sizeInBytes) { std::unique_ptr xmlState (getXmlFromBinary (data, sizeInBytes)); if (xmlState.get() != nullptr) if (xmlState->hasTagName (parameters.state.getType())) { parameters.replaceState (juce::ValueTree::fromXml (*xmlState)); if (parameters.state.hasProperty ("OSCPort")) // legacy { oscParameterInterface.getOSCReceiver().connect ( parameters.state.getProperty ("OSCPort", juce::var (-1))); parameters.state.removeProperty ("OSCPort", nullptr); } auto oscConfig = parameters.state.getChildWithName ("OSCConfig"); if (oscConfig.isValid()) oscParameterInterface.setConfig (oscConfig); } } //============================================================================== std::vector> ProbeDecoderAudioProcessor::createParameterLayout() { // add your audio parameters here std::vector> params; params.push_back (OSCParameterInterface::createParameterTheOldWay ( "orderSetting", "Ambisonics Order", "", juce::NormalisableRange (0.0f, 8.0f, 1.0f), 0.0f, [] (float value) { if (value >= 0.5f && value < 1.5f) return "0th"; else if (value >= 1.5f && value < 2.5f) return "1st"; else if (value >= 2.5f && value < 3.5f) return "2nd"; else if (value >= 3.5f && value < 4.5f) return "3rd"; else if (value >= 4.5f && value < 5.5f) return "4th"; else if (value >= 5.5f && value < 6.5f) return "5th"; else if (value >= 6.5f && value < 7.5f) return "6th"; else if (value >= 7.5f) return "7th"; else return "Auto"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "useSN3D", "Normalization", "", juce::NormalisableRange (0.0f, 1.0f, 1.0f), 1.0f, [] (float value) { if (value >= 0.5f) return "SN3D"; else return "N3D"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "azimuth", "Azimuth angle", juce::CharPointer_UTF8 (R"(°)"), juce::NormalisableRange (-180.0f, 180.0f, 0.01f), 0.0, [] (float value) { return juce::String (value, 2); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "elevation", "Elevation angle", juce::CharPointer_UTF8 (R"(°)"), juce::NormalisableRange (-180.0f, 180.0f, 0.01f), 0.0, [] (float value) { return juce::String (value, 2); }, nullptr)); return params; } //============================================================================== // This creates new instances of the plugin.. juce::AudioProcessor* JUCE_CALLTYPE createPluginFilter() { return new ProbeDecoderAudioProcessor(); } IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/ProbeDecoder/Source/PluginEditor.cpp0000664002537200253720000001607215257173642031543 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #include "PluginEditor.h" #include "PluginProcessor.h" //============================================================================== ProbeDecoderAudioProcessorEditor::ProbeDecoderAudioProcessorEditor ( ProbeDecoderAudioProcessor& p, juce::AudioProcessorValueTreeState& vts) : juce::AudioProcessorEditor (&p), footer (p.getOSCParameterInterface()), processor (p), valueTreeState (vts), probe (*valueTreeState.getParameter ("azimuth"), valueTreeState.getParameterRange ("azimuth"), *valueTreeState.getParameter ("elevation"), valueTreeState.getParameterRange ("elevation")) { // Make sure that before the constructor has finished, you've set the // editor's size to whatever you need it to be. setSize (415, 325); setLookAndFeel (&globalLaF); // ==== SPHERE AND ELEMENTS =============== addAndMakeVisible (&sphere); //sphere.addListener(this); probe.setColour (juce::Colours::aqua); sphere.addElement (&probe); // ====================================== addAndMakeVisible (&title); title.setTitle (juce::String ("Probe"), juce::String ("Decoder")); title.setFont (globalLaF.robotoBold, globalLaF.robotoLight); addAndMakeVisible (&footer); toolTipWin.setLookAndFeel (&globalLaF); toolTipWin.setMillisecondsBeforeTipAppears (500); toolTipWin.setOpaque (false); cbNormalizationAtachement.reset ( new ComboBoxAttachment (valueTreeState, "useSN3D", *title.getInputWidgetPtr()->getNormCbPointer())); cbOrderAtachement.reset ( new ComboBoxAttachment (valueTreeState, "orderSetting", *title.getInputWidgetPtr()->getOrderCbPointer())); // ======================== YAW PITCH ROLL GROUP ypGroup.setText ("Direction"); ypGroup.setTextLabelPosition (juce::Justification::centredLeft); ypGroup.setColour (juce::GroupComponent::outlineColourId, globalLaF.ClSeperator); ypGroup.setColour (juce::GroupComponent::textColourId, juce::Colours::white); addAndMakeVisible (&ypGroup); ypGroup.setVisible (true); addAndMakeVisible (&slAzimuth); slAzimuthAttachment.reset (new SliderAttachment (valueTreeState, "azimuth", slAzimuth)); slAzimuth.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); slAzimuth.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); slAzimuth.setReverse (true); slAzimuth.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[0]); slAzimuth.setRotaryParameters (juce::MathConstants::pi, 3 * juce::MathConstants::pi, false); slAzimuth.setTooltip ("Azimuth angle"); slAzimuth.setTextValueSuffix (juce::CharPointer_UTF8 (R"(°)")); addAndMakeVisible (&slElevation); slElevationAttachment.reset (new SliderAttachment (valueTreeState, "elevation", slElevation)); slElevation.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); slElevation.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); slElevation.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[1]); slElevation.setRotaryParameters (0.5 * juce::MathConstants::pi, 2.5 * juce::MathConstants::pi, false); slElevation.setTooltip ("Elevation angle"); // ================ LABELS =================== addAndMakeVisible (&lbAzimuth); lbAzimuth.setText ("Azimuth"); addAndMakeVisible (&lbElevation); lbElevation.setText ("Elevation"); startTimer (20); } ProbeDecoderAudioProcessorEditor::~ProbeDecoderAudioProcessorEditor() { setLookAndFeel (nullptr); } //============================================================================== void ProbeDecoderAudioProcessorEditor::paint (juce::Graphics& g) { g.fillAll (globalLaF.ClBackground); } void ProbeDecoderAudioProcessorEditor::timerCallback() { // === update titleBar widgets according to available input/output channel counts title.setMaxSize (processor.getMaxSize()); // ========================================== if (processor.updatedPositionData.get()) { processor.updatedPositionData = false; sphere.repaint(); } } void ProbeDecoderAudioProcessorEditor::resized() { const int leftRightMargin = 30; const int headerHeight = 60; const int footerHeight = 25; juce::Rectangle area (getLocalBounds()); juce::Rectangle footerArea (area.removeFromBottom (footerHeight)); footer.setBounds (footerArea); area.removeFromLeft (leftRightMargin); area.removeFromRight (leftRightMargin); juce::Rectangle headerArea = area.removeFromTop (headerHeight); title.setBounds (headerArea); area.removeFromTop (10); juce::Rectangle sliderRow; // ============== SIDEBAR RIGHT ==================== // ================================================= juce::Rectangle sideBarArea (area.removeFromRight (95)); const int rotSliderHeight = 55; const int rotSliderSpacing = 15; const int rotSliderWidth = 40; const int labelHeight = 15; // -------------- Yaw Pitch Roll ------------------ juce::Rectangle yprArea (sideBarArea.removeFromTop (25 + rotSliderHeight + labelHeight)); ypGroup.setBounds (yprArea); yprArea.removeFromTop (25); //for box headline sliderRow = (yprArea.removeFromTop (rotSliderHeight)); slAzimuth.setBounds (sliderRow.removeFromLeft (rotSliderWidth)); sliderRow.removeFromLeft (rotSliderSpacing); slElevation.setBounds (sliderRow.removeFromLeft (rotSliderWidth)); lbAzimuth.setBounds (yprArea.removeFromLeft (rotSliderWidth)); yprArea.removeFromLeft (rotSliderSpacing - 5); lbElevation.setBounds (yprArea.removeFromLeft (rotSliderWidth + 10)); sideBarArea.removeFromTop (20); // ============== SIDEBAR LEFT ==================== area.removeFromRight (10); // spacing sphere.setBounds (area.getX(), area.getY(), area.getWidth() - 20, area.getWidth() - 20); } ././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/ProbeDecoder/Source/PluginProcessor.hIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/ProbeDecoder/Source/PluginProcessor.0000664002537200253720000000667415257173642031600 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once #include "../../resources/AudioProcessorBase.h" #include "../../resources/Conversions.h" #include "../../resources/ambisonicTools.h" #include "../../resources/efficientSHvanilla.h" #include "../JuceLibraryCode/JuceHeader.h" #define ProcessorClass ProbeDecoderAudioProcessor //============================================================================== /** */ class ProbeDecoderAudioProcessor : public AudioProcessorBase, IOTypes::AudioChannels<1>> { public: constexpr static int numberOfInputChannels = 64; constexpr static int numberOfOutputChannels = 1; //============================================================================== ProbeDecoderAudioProcessor(); ~ProbeDecoderAudioProcessor() override; //============================================================================== void prepareToPlay (double sampleRate, int samplesPerBlock) override; void releaseResources() override; void processBlock (juce::AudioSampleBuffer&, juce::MidiBuffer&) override; //============================================================================== juce::AudioProcessorEditor* createEditor() override; bool hasEditor() const override; //============================================================================== int getNumPrograms() override; int getCurrentProgram() override; void setCurrentProgram (int index) override; const juce::String getProgramName (int index) override; void changeProgramName (int index, const juce::String& newName) override; //============================================================================== void getStateInformation (juce::MemoryBlock& destData) override; void setStateInformation (const void* data, int sizeInBytes) override; void parameterChanged (const juce::String& parameterID, float newValue) override; //======= Parameters =========================================================== std::vector> createParameterLayout(); //============================================================================== std::atomic* orderSetting; std::atomic* useSN3D; juce::Atomic updatedPositionData { true }; private: //============================================================================== std::atomic* azimuth; std::atomic* elevation; float previousSH[64]; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ProbeDecoderAudioProcessor) }; IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/ProbeDecoder/Source/PluginEditor.h0000664002537200253720000000567015257173642031212 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once #include "../../resources/customComponents/ReverseSlider.h" #include "../../resources/customComponents/SimpleLabel.h" #include "../../resources/customComponents/SpherePanner.h" #include "../../resources/customComponents/TitleBar.h" #include "../../resources/lookAndFeel/IEM_LaF.h" #include "../JuceLibraryCode/JuceHeader.h" #include "PluginProcessor.h" typedef ReverseSlider::SliderAttachment SliderAttachment; typedef juce::AudioProcessorValueTreeState::ComboBoxAttachment ComboBoxAttachment; //============================================================================== /** */ class ProbeDecoderAudioProcessorEditor : public juce::AudioProcessorEditor, private juce::Timer { public: ProbeDecoderAudioProcessorEditor (ProbeDecoderAudioProcessor&, juce::AudioProcessorValueTreeState&); ~ProbeDecoderAudioProcessorEditor(); //============================================================================== void paint (juce::Graphics&) override; void resized() override; private: LaF globalLaF; TitleBar, AudioChannelsIOWidget<1, false>> title; OSCFooter footer; void timerCallback() override; // This reference is provided as a quick way for your editor to // access the processor object that created it. ProbeDecoderAudioProcessor& processor; juce::AudioProcessorValueTreeState& valueTreeState; juce::GroupComponent ypGroup, settingsGroup; ReverseSlider slAzimuth, slElevation; SpherePanner sphere; SpherePanner::AzimuthElevationParameterElement probe; std::unique_ptr slAzimuthAttachment; std::unique_ptr slElevationAttachment; std::unique_ptr cbNormalizationAtachement; std::unique_ptr cbOrderAtachement; juce::TooltipWindow toolTipWin; // labels SimpleLabel lbAzimuth, lbElevation; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ProbeDecoderAudioProcessorEditor) }; IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/ProbeDecoder/CMakeLists.txt0000664002537200253720000000364115257173642027730 0ustar zmoelnigzmoelnigset (PLUGIN_TARGET "") if (IEM_FORMATS) juce_add_plugin (ProbeDecoder PLUGIN_MANUFACTURER_CODE IEMA PLUGIN_CODE PrDe ICON_BIG "../resources/Standalone/IEMPluginSuiteSmall.png" ICON_SMALL "../resources/Standalone/IEMPluginSuiteSmall.png" COMPANY_NAME "IEM" PRODUCT_NAME "ProbeDecoder" FORMATS ${IEM_FORMATS} VERSION ${ProbeDecoder_VERSION} LV2URI "http://plugins.iem.at/ProbeDecoder" VST2_CATEGORY kPlugSurroundFx kPlugCategSpacializer VST3_CATEGORIES Spatial Surround Up-Downmix AAX_CATEGORY SoundField) list (APPEND PLUGIN_TARGET ProbeDecoder) endif() foreach (TARGET IN LISTS PLUGIN_TARGET) juce_generate_juce_header(${TARGET}) target_sources(${TARGET} PRIVATE Source/PluginEditor.cpp Source/PluginEditor.h Source/PluginProcessor.cpp Source/PluginProcessor.h ../resources/OSC/OSCInputStream.h ../resources/OSC/OSCParameterInterface.cpp ../resources/OSC/OSCParameterInterface.h ../resources/OSC/OSCStatus.cpp ../resources/OSC/OSCStatus.h ../resources/OSC/OSCUtilities.h ../resources/efficientSHvanilla.cpp ) target_compile_definitions(${TARGET} PRIVATE JUCE_USE_CURL=0 JUCE_WEB_BROWSER=0 JUCE_USE_CUSTOM_PLUGIN_STANDALONE_APP=1 JUCE_USE_FLAC=0 JUCE_USE_OGGVORBIS=0 JUCE_USE_MP3AUDIOFORMAT=0 JUCE_USE_LAME_AUDIO_FORMAT=0 JUCE_USE_WINDOWS_MEDIA_FORMAT=0 JUCE_VST3_CAN_REPLACE_VST2=0) target_include_directories(${TARGET} PRIVATE Source) target_link_libraries(${TARGET} PRIVATE LAF_fonts IEM_logo juce::juce_audio_utils juce::juce_audio_plugin_client juce::juce_osc juce::juce_dsp juce::juce_opengl juce::juce_recommended_config_flags juce::juce_recommended_lto_flags) endforeach() IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/GranularEncoder/0000775002537200253720000000000015257173642025702 5ustar zmoelnigzmoelnigIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/GranularEncoder/Source/0000775002537200253720000000000015257173642027142 5ustar zmoelnigzmoelnig././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/GranularEncoder/Source/PluginProcessor.cppIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/GranularEncoder/Source/PluginProcess0000664002537200253720000013046315257173642031671 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Stefan Riedel Copyright (c) 2022 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #include "PluginProcessor.h" #include "PluginEditor.h" //============================================================================== GranularEncoderAudioProcessor::GranularEncoderAudioProcessor() : AudioProcessorBase ( #ifndef JucePlugin_PreferredChannelConfigurations BusesProperties() #if ! JucePlugin_IsMidiEffect #if ! JucePlugin_IsSynth .withInput ("Input", juce::AudioChannelSet::stereo(), true) #endif .withOutput ("Output", ((juce::PluginHostType::getPluginLoadedAs() == juce::AudioProcessor::wrapperType_VST3) ? juce::AudioChannelSet::ambisonic (1) : juce::AudioChannelSet::ambisonic (7)), true) #endif , #endif createParameterLayout()), posC (1.0f, 0.0f, 0.0f), posL (1.0f, 0.0f, 0.0f), posR (1.0f, 0.0f, 0.0f), updatedPositionData (true) { parameters.addParameterListener ("qw", this); parameters.addParameterListener ("qx", this); parameters.addParameterListener ("qy", this); parameters.addParameterListener ("qz", this); parameters.addParameterListener ("azimuth", this); parameters.addParameterListener ("elevation", this); parameters.addParameterListener ("roll", this); parameters.addParameterListener ("width", this); parameters.addParameterListener ("deltaTime", this); parameters.addParameterListener ("grainLength", this); parameters.addParameterListener ("orderSetting", this); parameters.addParameterListener ("useSN3D", this); orderSetting = parameters.getRawParameterValue ("orderSetting"); useSN3D = parameters.getRawParameterValue ("useSN3D"); qw = parameters.getRawParameterValue ("qw"); qx = parameters.getRawParameterValue ("qx"); qy = parameters.getRawParameterValue ("qy"); qz = parameters.getRawParameterValue ("qz"); azimuth = parameters.getRawParameterValue ("azimuth"); elevation = parameters.getRawParameterValue ("elevation"); shape = parameters.getRawParameterValue ("shape"); size = parameters.getRawParameterValue ("size"); roll = parameters.getRawParameterValue ("roll"); width = parameters.getRawParameterValue ("width"); deltaTime = parameters.getRawParameterValue ("deltaTime"); deltaTimeMod = parameters.getRawParameterValue ("deltaTimeMod"); grainLength = parameters.getRawParameterValue ("grainLength"); grainLengthMod = parameters.getRawParameterValue ("grainLengthMod"); position = parameters.getRawParameterValue ("position"); positionMod = parameters.getRawParameterValue ("positionMod"); pitch = parameters.getRawParameterValue ("pitch"); pitchMod = parameters.getRawParameterValue ("pitchMod"); windowAttack = parameters.getRawParameterValue ("windowAttack"); windowAttackMod = parameters.getRawParameterValue ("windowAttackMod"); windowDecay = parameters.getRawParameterValue ("windowDecay"); windowDecayMod = parameters.getRawParameterValue ("windowDecayMod"); mix = parameters.getRawParameterValue ("mix"); sourceProbability = parameters.getRawParameterValue ("sourceProbability"); freeze = parameters.getRawParameterValue ("freeze"); spatialize2D = parameters.getRawParameterValue ("spatialize2D"); highQuality = parameters.getRawParameterValue ("highQuality"); processorUpdatingParams = false; sphericalInput = true; // input from ypr juce::FloatVectorOperations::clear (SHC, 64); } GranularEncoderAudioProcessor::~GranularEncoderAudioProcessor() = default; //============================================================================== int GranularEncoderAudioProcessor::getNumPrograms() { return 1; // NB: some hosts don't cope very well if you tell them there are 0 programs, // so this should be at least 1, even if you're not really implementing programs. } int GranularEncoderAudioProcessor::getCurrentProgram() { return 0; } void GranularEncoderAudioProcessor::setCurrentProgram (int index) { } const juce::String GranularEncoderAudioProcessor::getProgramName (int index) { return juce::String(); } void GranularEncoderAudioProcessor::changeProgramName (int index, const juce::String& newName) { } //============================================================================== void GranularEncoderAudioProcessor::prepareToPlay (double sampleRate, int samplesPerBlock) { checkInputAndOutput (this, 2, *orderSetting, true); bufferCopy.setSize (2, samplesPerBlock); dryAmbiBuffer.setSize (64, samplesPerBlock); wetAmbiBuffer.setSize (64, samplesPerBlock); circularBuffer.setSize (2, juce::roundToInt (sampleRate * CIRC_BUFFER_SECONDS), true); // seconds long circular buffer circularBufferLength = circularBuffer.getNumSamples(); if (*freeze < 0.5f) // if in real-time mode, clean up state before processing { circularBufferWriteHead = 0; circularBuffer.clear(); } writeGainCircBuffer.reset (sampleRate, 0.005f); writeGainCircBuffer.setCurrentAndTargetValue (1.0f); lastSampleRate = sampleRate; deltaTimeSamples = 0; for (int g = 0; g < maxNumGrains; g++) { grains[g].setBlockSize (samplesPerBlock); } const iem::Quaternion quatC = quaternionDirection; const auto center = quatC.getCartesian(); SHEval (7, center, _SHC); positionHasChanged = true; // just to be sure } void GranularEncoderAudioProcessor::releaseResources() { // When playback stops, you can use this as an opportunity to free up any // spare memory, etc. } inline void GranularEncoderAudioProcessor::updateQuaternions() { float ypr[3]; ypr[0] = Conversions::degreesToRadians (*azimuth); ypr[1] = -Conversions::degreesToRadians (*elevation); // pitch ypr[2] = Conversions::degreesToRadians (*roll); // updating not active params quaternionDirection.fromYPR (ypr); processorUpdatingParams = true; parameters.getParameter ("qw")->setValueNotifyingHost ( parameters.getParameterRange ("qw").convertTo0to1 (quaternionDirection.w)); parameters.getParameter ("qx")->setValueNotifyingHost ( parameters.getParameterRange ("qx").convertTo0to1 (quaternionDirection.x)); parameters.getParameter ("qy")->setValueNotifyingHost ( parameters.getParameterRange ("qy").convertTo0to1 (quaternionDirection.y)); parameters.getParameter ("qz")->setValueNotifyingHost ( parameters.getParameterRange ("qz").convertTo0to1 (quaternionDirection.z)); processorUpdatingParams = false; } void GranularEncoderAudioProcessor::updateEuler() { float ypr[3]; quaternionDirection = iem::Quaternion (*qw, *qx, *qy, *qz); quaternionDirection.normalize(); quaternionDirection.toYPR (ypr); // updating not active params processorUpdatingParams = true; parameters.getParameter ("azimuth")->setValueNotifyingHost ( parameters.getParameterRange ("azimuth").convertTo0to1 ( Conversions::radiansToDegrees (ypr[0]))); parameters.getParameter ("elevation") ->setValueNotifyingHost ( parameters.getParameterRange ("elevation") .convertTo0to1 (-Conversions::radiansToDegrees (ypr[1]))); parameters.getParameter ("roll")->setValueNotifyingHost ( parameters.getParameterRange ("roll").convertTo0to1 ( Conversions::radiansToDegrees (ypr[2]))); processorUpdatingParams = false; } juce::Vector3D GranularEncoderAudioProcessor::getRandomGrainDirection3D() { float shape_abs = std::abs (*shape); float shape_param = std::pow (2, shape_abs); float size_param = *size; juce::Vector3D centerDir = quaternionDirection.getCartesian(); float azi_center; float ele_center; Conversions::cartesianToSpherical (centerDir, azi_center, ele_center); float zen_center = (juce::MathConstants::pi / 2.0f) - ele_center; // Uniform random distribution in [0,2*pi] float rand_phi = juce::Random::getSystemRandom().nextFloat() * 2.0f * juce::MathConstants::pi; // Beta distribution to control shape of rotationally symmetric distribution around centerDir jassert (shape_param >= 1.0f); // beta_distribution dist(shape, shape); // -> realized with std::gamma_distribution std::gamma_distribution dist1 (shape_param, 1.0f); std::gamma_distribution dist2 (shape_param, 1.0f); float gamma1 = dist1 (rng); float gamma2 = dist2 (rng); float eps = 1e-16f; float beta_val = (gamma1 + eps) / (gamma1 + gamma2 + eps); float sym_beta_sample; if (*shape < 0.0f) sym_beta_sample = 1.0f - abs (beta_val - 0.5f) * 2.0f; else sym_beta_sample = abs (beta_val - 0.5f) * 2.0f; // Input parameter size defines opening angle of distribution cap jassert (size_param >= 0.0f && size_param <= 360.0f); float size_factor = (size_param / 2.0f) / 180.0f; float beta_sized = sym_beta_sample * size_factor; // To achieve uniform distribution on a sphere float rand_theta = acos (2 * (1 - beta_sized) - 1); float sinZenith = sin (rand_theta); float x = cos (rand_phi) * sinZenith; float y = sin (rand_phi) * sinZenith; float z = cos (rand_theta); // Rotate random direction (on 'polar cap') to target center direction float cosAzi = cos (azi_center); float sinAzi = sin (azi_center); float cosZen = cos (zen_center); float sinZen = sin (zen_center); float target_x = cosAzi * cosZen * x - sinAzi * y + cosAzi * sinZen * z; float target_y = sinAzi * cosZen * x + cosAzi * y + sinAzi * sinZen * z; float target_z = -sinZen * x + cosZen * z; juce::Vector3D vec (target_x, target_y, target_z); return vec; } juce::Vector3D GranularEncoderAudioProcessor::getRandomGrainDirection2D() { float shape_abs = std::abs (*shape); float shape_param = std::pow (2, shape_abs); float size_param = *size; juce::Vector3D centerDir = quaternionDirection.getCartesian(); float azi_center; float ele_center; Conversions::cartesianToSpherical (centerDir, azi_center, ele_center); float zen_center = (juce::MathConstants::pi / 2.0f) - ele_center; // Uniform random distribution in [0,2*pi] // float rand_phi = juce::Random::getSystemRandom().nextFloat() * 2.0f * juce::MathConstants::pi; // Beta distribution to control shape of rotationally symmetric distribution around centerDir jassert (shape_param >= 1.0f); // beta_distribution dist(shape, shape); // -> realized with std::gamma_distribution std::gamma_distribution dist1 (shape_param, 1.0f); std::gamma_distribution dist2 (shape_param, 1.0f); float gamma1 = dist1 (rng); float gamma2 = dist2 (rng); float eps = 1e-16f; float beta_val = (gamma1 + eps) / (gamma1 + gamma2 + eps); float sym_beta_sample; if (*shape < 0.0f) sym_beta_sample = 1.0f - abs (beta_val - 0.5f) * 2.0f; else sym_beta_sample = abs (beta_val - 0.5f) * 2.0f; // Input parameter size defines opening angle of distribution cap jassert (size_param >= 0.0f && size_param <= 360.0f); float size_factor = (size_param / 2.0f) / 180.0f; float beta_sized = sym_beta_sample * size_factor; // azi_center +- random spread float sign = (juce::Random::getSystemRandom().nextFloat() > 0.5f) * 2.0f - 1.0f; float rand_phi = azi_center + juce::MathConstants::pi * beta_sized * sign; float sinZenith = sin (zen_center); float x = cos (rand_phi) * sinZenith; float y = sin (rand_phi) * sinZenith; float z = cos (zen_center); juce::Vector3D vec (x, y, z); return vec; } juce::AudioBuffer GranularEncoderAudioProcessor::getWindowBuffer (float modWeight) { const float attackPercentage = *windowAttack; const float decayPercentage = *windowDecay; const float attackModPercentage = *windowAttackMod; const float decayModPercentage = *windowDecayMod; float newAttackPercentage = attackPercentage + (juce::Random::getSystemRandom().nextFloat() - 0.5f) * 2.0f * modWeight * attackModPercentage; newAttackPercentage = std::min (newAttackPercentage, 50.0f); newAttackPercentage = std::max (newAttackPercentage, 0.0f); float newDecayPercentage = decayPercentage + (juce::Random::getSystemRandom().nextFloat() - 0.5f) * 2.0f * modWeight * decayModPercentage; newDecayPercentage = std::min (newDecayPercentage, 50.0f); newDecayPercentage = std::max (newDecayPercentage, 0.0f); const int windowNumSamples = windowResolution; const int windowHalfNumSamples = windowResolution / 2; const int windowAttackSamples = newAttackPercentage / 100.0f * windowNumSamples; const int windowDecaySamples = newDecayPercentage / 100.0f * windowNumSamples; juce::AudioBuffer windowBuffer; windowBuffer.setSize (1, windowResolution); float* windowBufferWritePtr = windowBuffer.getWritePointer (0); float pi_over_two = (juce::MathConstants::pi / 2.0f); float windowAttackSamplesFloat = static_cast (windowAttackSamples); float windowDecaySamplesFloat = static_cast (windowDecaySamples); for (int i = 0; i < windowAttackSamples; i++) { // sine-squared fade-in windowBufferWritePtr[i] = std::pow (std::sin (static_cast (i) / windowAttackSamplesFloat * pi_over_two), 2); } for (int i = windowAttackSamples; i < (windowNumSamples - windowDecaySamples); i++) { // rectangular part windowBufferWritePtr[i] = 1.0f; } int c = 0; for (int i = (windowNumSamples - windowDecaySamples); i < windowNumSamples; i++) { // cosine-squared fade-out windowBufferWritePtr[i] = std::pow (std::cos (static_cast (c) / windowDecaySamplesFloat * pi_over_two), 2); c++; } return windowBuffer; } int GranularEncoderAudioProcessor::getStartPositionCircBuffer() const { float modulatedPosition = *position + (*positionMod * juce::Random::getSystemRandom().nextFloat()); // Unidirectional modulation of seed index parameter int startPositionCircBuffer = circularBufferWriteHead - juce::roundToInt (modulatedPosition * lastSampleRate); if (startPositionCircBuffer < 0) { startPositionCircBuffer += circularBufferLength; } return startPositionCircBuffer; } std::pair GranularEncoderAudioProcessor::getGrainLengthAndPitchFactor() const { // Bidirectional modulation of grain length float grainLengthModSeconds = *grainLengthMod / 100.0f * *grainLength * 2 * (juce::Random::getSystemRandom().nextFloat() - 0.5f); float newGrainLengthSeconds = *grainLength + grainLengthModSeconds; newGrainLengthSeconds = std::min (newGrainLengthSeconds, MAX_GRAIN_LENGTH); newGrainLengthSeconds = std::max (newGrainLengthSeconds, MIN_GRAIN_LENGTH); // jassert(newGrainLengthSeconds >= 0.001f && newGrainLengthSeconds =< 0.5f); float grainLengthSamplesFloat = newGrainLengthSeconds * lastSampleRate; // Unidirectional modulation of pitch (due to hard real-time constraint) const float maxPitchModulation = 12.0f; float pitchModSemitones = *pitchMod * (juce::Random::getSystemRandom().nextFloat() - 0.5f) * 2.0f; float pitchToUse = *pitch - pitchModSemitones; if (mode != OperationMode::Freeze) { // If in real-time mode, only pitching down is available. pitchToUse = std::min (pitchToUse, 0.0f); pitchToUse = std::max (pitchToUse, -12.0f); } float pitchReadFactor = std::pow (2.0f, (pitchToUse) / 12.0f); // Updated length of grain in samples int grainLengthSamples = static_cast ( std::min (newGrainLengthSeconds * (1 / pitchReadFactor), MAX_GRAIN_LENGTH * 2.0f) * lastSampleRate); return std::make_pair (grainLengthSamples, pitchReadFactor); } int GranularEncoderAudioProcessor::getDeltaTimeSamples() { // Bidirectional modulation of deltaTime between grains float deltaTimeModSeconds = *deltaTimeMod / 100.0f * *deltaTime * 2.0f * (juce::Random::getSystemRandom().nextFloat() - 0.5f); float newDeltaTime = *deltaTime + deltaTimeModSeconds; newDeltaTime = std::min (newDeltaTime, MAX_DELTA_T); newDeltaTime = std::max (newDeltaTime, MIN_DELTA_T); jassert (MIN_DELTA_T >= 0.001f && newDeltaTime <= MAX_DELTA_T); int deltaTimeSamples = juce::roundToInt (lastSampleRate * newDeltaTime); return deltaTimeSamples; } bool GranularEncoderAudioProcessor::getChannelToSeed() { float seedSetting = (*sourceProbability / 2.0f) + 0.5f; float randomNumber = juce::Random::getSystemRandom().nextFloat(); bool seedLeft; if (randomNumber > seedSetting) seedLeft = true; else seedLeft = false; return seedLeft; } bool GranularEncoderAudioProcessor::getFreezeGUIBool() { if (*freeze < 0.5f) return false; else return true; } void GranularEncoderAudioProcessor::initializeModeTransition (bool freeze) { if (mode == OperationMode::Realtime && freeze) { mode = OperationMode::ToFreeze; writeGainCircBuffer.setTargetValue (0.0f); } if (mode == OperationMode::Freeze && ! freeze) { mode = OperationMode::ToRealtime; writeGainCircBuffer.setTargetValue (1.0f); } } void GranularEncoderAudioProcessor::finishModeTransition() { if (mode == OperationMode::ToFreeze && ! writeGainCircBuffer.isSmoothing()) { // Reached Freeze State mode = OperationMode::Freeze; // writeCircularBufferToDisk("/Users/stefanriedel/Documents/CircularBufferFreezed.wav"); } if (mode == OperationMode::ToRealtime && ! writeGainCircBuffer.isSmoothing()) { // Reached Realtime State mode = OperationMode::Realtime; } } float GranularEncoderAudioProcessor::getMeanWindowGain() { juce::AudioBuffer meanWindow = getWindowBuffer (0.0f); const float* meanWindowReadPtr = meanWindow.getReadPointer (0); const int numSamplesWindow = meanWindow.getNumSamples(); float windowGain = 0.0f; for (int i = 0; i < numSamplesWindow; i++) { windowGain += std::pow (meanWindowReadPtr[i], 2.0f); } windowGain = windowGain / static_cast (numSamplesWindow); return windowGain; } // void GranularEncoderAudioProcessor::writeCircularBufferToDisk(juce::String filename) // { // // Just a debug function to write buffer state to disk // float *writePointerLeft = circularBuffer.getWritePointer(0); // float *writePointerRight = circularBuffer.getWritePointer(1); // writePointerLeft[circularBufferWriteHead] = 0.5f; // writePointerRight[circularBufferWriteHead] = -0.5f; // juce::WavAudioFormat format; // std::unique_ptr writer; // writer.reset(format.createWriterFor(new juce::FileOutputStream(filename), // lastSampleRate, // circularBuffer.getNumChannels(), // 24, // {}, // 0)); // if (writer != nullptr) // writer->writeFromAudioSampleBuffer(circularBuffer, 0, circularBuffer.getNumSamples()); // } void GranularEncoderAudioProcessor::processBlock (juce::AudioBuffer& buffer, juce::MidiBuffer& midiMessages) { checkInputAndOutput (this, 2, *orderSetting); const int L = buffer.getNumSamples(); const int totalNumInputChannels = getTotalNumInputChannels() < 2 ? 1 : 2; const int ambisonicOrder = *orderSetting < 0.5f ? output.getOrder() : juce::roundToInt (orderSetting->load()) - 1; const int nChOut = juce::jmin (buffer.getNumChannels(), juce::square (ambisonicOrder + 1)); for (int i = 0; i < totalNumInputChannels; ++i) bufferCopy.copyFrom (i, 0, buffer.getReadPointer (i), buffer.getNumSamples()); // SH eval for center direction const iem::Quaternion quatC = quaternionDirection; const auto center = quatC.getCartesian(); if (positionHasChanged.compareAndSetBool (false, true)) { SHEval (ambisonicOrder, center.x, center.y, center.z, SHC); if (*useSN3D > 0.5f) { juce::FloatVectorOperations::multiply (SHC, SHC, n3d2sn3d, nChOut); } } // init dry and wet ambi buffers buffer.clear(); dryAmbiBuffer.clear(); wetAmbiBuffer.clear(); float mixAmount = *mix / 100.0f; float dryFactor = std::sqrt (1 - mixAmount); float wetFactor = std::sqrt (mixAmount); // DRY PROCESSING const float* leftIn = bufferCopy.getReadPointer (0); const float* rightIn = bufferCopy.getReadPointer (1); for (int i = 0; i < nChOut; ++i) { dryAmbiBuffer.copyFromWithRamp (i, 0, leftIn, buffer.getNumSamples(), _SHC[i], SHC[i]); dryAmbiBuffer.addFromWithRamp (i, 0, rightIn, buffer.getNumSamples(), _SHC[i], SHC[i]); } // GRANULAR PROCESSING float windowGain = getMeanWindowGain(); float gainFactor; float overlap = std::min (*grainLength / *deltaTime, static_cast (maxNumGrains)); if (*positionMod > 0.0f) { // Formula for uncorrelated grain signals gainFactor = juce::jmin (std::sqrt (1.0f / overlap / windowGain), 1.0f) * 1.41f; } else { // More gain reduction if grains are highly correlated gainFactor = juce::jmin (1.0f / overlap / windowGain, 1.0f) * 1.41f; } // Get GUI state of Freeze button bool freeze_gui_state = getFreezeGUIBool(); initializeModeTransition (freeze_gui_state); for (int i = 0; i < buffer.getNumSamples(); i++) { float nextCircBuffGain = writeGainCircBuffer.getNextValue(); finishModeTransition(); if (mode != OperationMode::Freeze) { // Fill circular buffer with audio input circularBuffer.setSample (0, circularBufferWriteHead, leftIn[i] * nextCircBuffGain); circularBuffer.setSample (1, circularBufferWriteHead, rightIn[i] * nextCircBuffGain); } if (grainTimeCounter >= deltaTimeSamples) { // start a grain at this sample time stamp (index i) grainTimeCounter = 0; // reset (possibly modulating) deltaTime after a grain is started deltaTimeSamples = getDeltaTimeSamples(); for (int g = 0; g < maxNumGrains; g++) { if (! grains[g].isActive()) { // find the first free grain processor and pass parameters juce::Vector3D grainDir; if (*spatialize2D > 0.5f) grainDir = getRandomGrainDirection2D(); else grainDir = getRandomGrainDirection3D(); SHEval (ambisonicOrder, grainDir.x, grainDir.y, grainDir.z, _grainSH[g]); if (*useSN3D > 0.5f) { juce::FloatVectorOperations::multiply (_grainSH[g], _grainSH[g], n3d2sn3d, nChOut); } std::array channelWeights; std::copy (_grainSH[g], _grainSH[g] + 64, channelWeights.begin()); Grain::GrainJobParameters params; params.startPositionCircBuffer = getStartPositionCircBuffer(); auto grainLengthAndPitch = getGrainLengthAndPitchFactor(); params.grainLengthSamples = grainLengthAndPitch.first; params.pitchReadFactor = grainLengthAndPitch.second; params.startOffsetInBlock = i; params.channelWeights = channelWeights; params.gainFactor = gainFactor; params.seedFromLeftCircBuffer = getChannelToSeed(); params.windowBuffer = getWindowBuffer (1.0f); grains[g].startGrain (params); break; } } } else { // if it's not time for a grain yet, just increment the counter grainTimeCounter++; } if (mode != OperationMode::Freeze) { // increment circular buffer write head and wrap if needed circularBufferWriteHead++; if (circularBufferWriteHead >= circularBufferLength) { circularBufferWriteHead = 0; } } } // Render all active grains int numActiveGrains = 0; for (int g = 0; g < maxNumGrains; g++) { if (grains[g].isActive()) { numActiveGrains++; grains[g].processBlock (wetAmbiBuffer, circularBuffer); } } for (int i = 0; i < nChOut; ++i) { buffer.addFrom (i, 0, dryAmbiBuffer, i, 0, buffer.getNumSamples(), dryFactor); buffer.addFrom (i, 0, wetAmbiBuffer, i, 0, buffer.getNumSamples(), wetFactor); } juce::FloatVectorOperations::copy (_SHC, SHC, nChOut); } //============================================================================== bool GranularEncoderAudioProcessor::hasEditor() const { return true; // (change this to false if you choose to not supply an editor) } juce::AudioProcessorEditor* GranularEncoderAudioProcessor::createEditor() { return new GranularEncoderAudioProcessorEditor (*this, parameters); } void GranularEncoderAudioProcessor::parameterChanged (const juce::String& parameterID, float newValue) { if (! processorUpdatingParams) { if (parameterID == "qw" || parameterID == "qx" || parameterID == "qy" || parameterID == "qz") { sphericalInput = false; updateEuler(); updatedPositionData = true; positionHasChanged = true; } else if (parameterID == "azimuth" || parameterID == "elevation" || parameterID == "roll") { sphericalInput = true; updateQuaternions(); updatedPositionData = true; positionHasChanged = true; } else if (parameterID == "width") { updatedPositionData = true; positionHasChanged = true; } } if (parameterID == "orderSetting") { userChangedIOSettings = true; positionHasChanged = true; } else if (parameterID == "useSN3D") { positionHasChanged = true; } } //============================================================================== void GranularEncoderAudioProcessor::getStateInformation (juce::MemoryBlock& destData) { auto state = parameters.copyState(); auto oscConfig = state.getOrCreateChildWithName ("OSCConfig", nullptr); oscConfig.copyPropertiesFrom (oscParameterInterface.getConfig(), nullptr); if (mode == OperationMode::Freeze) { for (int i = 0; i < circularBuffer.getNumChannels(); i++) { juce::MemoryBlock channelMemory (circularBuffer.getReadPointer (i), circularBuffer.getNumSamples() * sizeof (float)); auto strXmlData = channelMemory.toBase64Encoding(); juce::String attribute_name = "CircularBufferChannel" + juce::String (i); state.setProperty (attribute_name, strXmlData, nullptr); } sampleRateAtSerialize = lastSampleRate; state.setProperty ("SampleRateAtSerialize", sampleRateAtSerialize, nullptr); state.setProperty ("WriteHead", circularBufferWriteHead, nullptr); } state.setProperty ("FreezeModeState", (int) mode, nullptr); std::unique_ptr xml (state.createXml()); copyXmlToBinary (*xml, destData); } void GranularEncoderAudioProcessor::setStateInformation (const void* data, int sizeInBytes) { std::unique_ptr xmlState (getXmlFromBinary (data, sizeInBytes)); if (xmlState.get() != nullptr) { if (xmlState->hasTagName (parameters.state.getType())) { parameters.replaceState (juce::ValueTree::fromXml (*xmlState)); if (parameters.state.hasProperty ("OSCPort")) // legacy { oscParameterInterface.getOSCReceiver().connect ( parameters.state.getProperty ("OSCPort", juce::var (-1))); parameters.state.removeProperty ("OSCPort", nullptr); } auto oscConfig = parameters.state.getChildWithName ("OSCConfig"); if (oscConfig.isValid()) oscParameterInterface.setConfig (oscConfig); mode = static_cast ( (int) parameters.state.getProperty ("FreezeModeState", 0)); if (mode == OperationMode::Freeze) { sampleRateAtSerialize = parameters.state.getProperty ("SampleRateAtSerialize", lastSampleRate); juce::AudioBuffer tempCircularBuffer; tempCircularBuffer.setSize ( 2, juce::roundToInt (sampleRateAtSerialize * CIRC_BUFFER_SECONDS)); tempCircularBuffer.clear(); for (int i = 0; i < circularBuffer.getNumChannels(); i++) { juce::String attribute_name = "CircularBufferChannel" + juce::String (i); if (parameters.state.hasProperty (attribute_name)) // legacy { juce::String strXmlData = parameters.state.getProperty (attribute_name); juce::StringRef ref = juce::StringRef (strXmlData); juce::MemoryBlock channelMemory; channelMemory.fromBase64Encoding (strXmlData); tempCircularBuffer.copyFrom ( i, 0, static_cast (channelMemory.getData()), tempCircularBuffer.getNumSamples()); } } if (sampleRateAtSerialize != lastSampleRate) resampleAudioBuffer (tempCircularBuffer, sampleRateAtSerialize, circularBuffer, lastSampleRate); else circularBuffer = tempCircularBuffer; circularBufferWriteHead = parameters.state.getProperty ("WriteHead", 0); circularBufferWriteHead = static_cast (lastSampleRate / sampleRateAtSerialize * static_cast (circularBufferWriteHead)); } } } } void GranularEncoderAudioProcessor::resampleAudioBuffer (juce::AudioBuffer& inAudioBuffer, float inSampleRate, juce::AudioBuffer& outAudioBuffer, float outSampleRate) { double ratio = static_cast (inSampleRate / outSampleRate); const float* const* inputs = inAudioBuffer.getArrayOfReadPointers(); float* const* outputs = outAudioBuffer.getArrayOfWritePointers(); for (int c = 0; c < outAudioBuffer.getNumChannels(); c++) { std::unique_ptr resampler = std::make_unique(); resampler->reset(); resampler->process (ratio, inputs[c], outputs[c], outAudioBuffer.getNumSamples()); } } //============================================================================== const bool GranularEncoderAudioProcessor::processNotYetConsumedOSCMessage (const juce::OSCMessage& message) { juce::String prefix ("/" + juce::String (JucePlugin_Name)); if (! message.getAddressPattern().toString().startsWith (prefix)) return false; juce::OSCMessage msg (message); msg.setAddressPattern (message.getAddressPattern().toString().substring ( juce::String (JucePlugin_Name).length() + 1)); if (msg.getAddressPattern().toString().equalsIgnoreCase ("/quaternions") && msg.size() == 4) { float qs[4]; for (int i = 0; i < 4; ++i) if (msg[i].isFloat32()) qs[i] = msg[i].getFloat32(); else if (msg[i].isInt32()) qs[i] = msg[i].getInt32(); oscParameterInterface.setValue ("qw", qs[0]); oscParameterInterface.setValue ("qx", qs[1]); oscParameterInterface.setValue ("qy", qs[2]); oscParameterInterface.setValue ("qz", qs[3]); return true; } return false; } //============================================================================== std::vector> GranularEncoderAudioProcessor::createParameterLayout() { // add your audio parameters here std::vector> params; params.push_back (OSCParameterInterface::createParameterTheOldWay ( "orderSetting", "Ambisonics Order", "", juce::NormalisableRange (0.0f, 8.0f, 1.0f), 0.0f, [] (float value) { if (value >= 0.5f && value < 1.5f) return "0th"; else if (value >= 1.5f && value < 2.5f) return "1st"; else if (value >= 2.5f && value < 3.5f) return "2nd"; else if (value >= 3.5f && value < 4.5f) return "3rd"; else if (value >= 4.5f && value < 5.5f) return "4th"; else if (value >= 5.5f && value < 6.5f) return "5th"; else if (value >= 6.5f && value < 7.5f) return "6th"; else if (value >= 7.5f) return "7th"; else return "Auto"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "useSN3D", "Normalization", "", juce::NormalisableRange (0.0f, 1.0f, 1.0f), 1.0f, [] (float value) { if (value >= 0.5f) return "SN3D"; else return "N3D"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "qw", "Quaternion W", "", juce::NormalisableRange (-1.0f, 1.0f, 0.001f), 1.0, [] (float value) { return juce::String (value, 2); }, nullptr, true)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "qx", "Quaternion X", "", juce::NormalisableRange (-1.0f, 1.0f, 0.001f), 0.0, [] (float value) { return juce::String (value, 2); }, nullptr, true)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "qy", "Quaternion Y", "", juce::NormalisableRange (-1.0f, 1.0f, 0.001f), 0.0, [] (float value) { return juce::String (value, 2); }, nullptr, true)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "qz", "Quaternion Z", "", juce::NormalisableRange (-1.0f, 1.0f, 0.001f), 0.0, [] (float value) { return juce::String (value, 2); }, nullptr, true)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "azimuth", "Azimuth Angle", juce::CharPointer_UTF8 (R"(°)"), juce::NormalisableRange (-180.0f, 180.0f, 0.01f), 0.0, [] (float value) { return juce::String (value, 2); }, nullptr, true)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "elevation", "Elevation Angle", juce::CharPointer_UTF8 (R"(°)"), juce::NormalisableRange (-180.0f, 180.0f, 0.01f), 0.0, [] (float value) { return juce::String (value, 2); }, nullptr, true)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "shape", "Grain Shape", juce::CharPointer_UTF8 (R"()"), juce::NormalisableRange (-10.0f, 10.0f, 0.1f), 0.0, [] (float value) { return juce::String (value, 1); }, nullptr, true)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "size", "Size", juce::CharPointer_UTF8 (R"(°)"), juce::NormalisableRange (0.0f, 360.0f, 0.01f), 180.0f, [] (float value) { return juce::String (value, 2); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "roll", "Roll Angle", juce::CharPointer_UTF8 (R"(°)"), juce::NormalisableRange (-180.0f, 180.0f, 0.01f), 0.0, [] (float value) { return juce::String (value, 2); }, nullptr, true)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "width", "Stereo Width", juce::CharPointer_UTF8 (R"(°)"), juce::NormalisableRange (-360.0f, 360.0f, 0.01f), 0.0, [] (float value) { return juce::String (value, 2); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "deltaTime", "Delta Time", juce::CharPointer_UTF8 (R"(s)"), juce::NormalisableRange (MIN_DELTA_T, MAX_DELTA_T, 1e-6f, GUI_SKEW), 0.005f, [] (float value) { return juce::String (value, 3); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "deltaTimeMod", "Delta Time Modulation", juce::CharPointer_UTF8 (R"(%)"), juce::NormalisableRange (0.0f, 100.0f, 0.1f), 0.0f, [] (float value) { return juce::String (value, 1); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "grainLength", "Grain Length", juce::CharPointer_UTF8 (R"(s)"), juce::NormalisableRange (MIN_GRAIN_LENGTH, MAX_GRAIN_LENGTH, 0.0001f, GUI_SKEW), 0.250f, [] (float value) { return juce::String (value, 3); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "grainLengthMod", "Grain Length Modulation", juce::CharPointer_UTF8 (R"(%)"), juce::NormalisableRange (0.0f, 100.0f, 0.1f), 0.0f, [] (float value) { return juce::String (value, 1); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "position", "Read Position in Buffer", juce::CharPointer_UTF8 (R"(s)"), juce::NormalisableRange (0.0f, CIRC_BUFFER_SECONDS / 2, 1e-6f), 0.0f, [] (float value) { return juce::String (value, 3); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "positionMod", "ReadPosition Modulation", juce::CharPointer_UTF8 (R"(s)"), juce::NormalisableRange (0.0f, CIRC_BUFFER_SECONDS / 2, 1e-6f, GUI_SKEW), 0.05f, [] (float value) { return juce::String (value, 3); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "pitch", "Pitch", juce::CharPointer_UTF8 (R"(st)"), juce::NormalisableRange (-12.0f, 12.0f, 0.001f), 0.0f, [] (float value) { return juce::String (value, 1); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "pitchMod", "Pitch Modulation", juce::CharPointer_UTF8 (R"(st)"), juce::NormalisableRange (0.0f, 12.0f, 0.001f, GUI_SKEW), 0.0f, [] (float value) { return juce::String (value, 2); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "windowAttack", "Grain Attack Time", juce::CharPointer_UTF8 (R"(%)"), juce::NormalisableRange (0.0f, 50.0f, 0.1f), 50.0f, [] (float value) { return juce::String (value, 1); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "windowAttackMod", "Attack Time Modulation", juce::CharPointer_UTF8 (R"(%)"), juce::NormalisableRange (0.0f, 100.0f, 0.1f), 0.0f, [] (float value) { return juce::String (value, 1); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "windowDecay", "Grain Decay Time", juce::CharPointer_UTF8 (R"(%)"), juce::NormalisableRange (0.0f, 50.0f, 0.1f), 50.0f, [] (float value) { return juce::String (value, 1); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "windowDecayMod", "Decay Time Modulation", juce::CharPointer_UTF8 (R"(%)"), juce::NormalisableRange (0.0f, 100.0f, 0.1f), 0.0f, [] (float value) { return juce::String (value, 1); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "mix", "Mix", juce::CharPointer_UTF8 (R"(%)"), juce::NormalisableRange (0.0f, 100.0f, 0.1f), 50.0f, [] (float value) { return juce::String (value, 1); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "sourceProbability", "Source Probability", juce::CharPointer_UTF8 (R"()"), juce::NormalisableRange (-1.0f, 1.0f, 0.01f), 0.0f, [] (float value) { return juce::String (value, 2); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "freeze", "Freeze Mode", "", juce::NormalisableRange (0.0f, 1.0f, 1.0f), 0.0f, [] (float value) { if (value >= 0.5f) return "Yes"; else return "No"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "spatialize2D", "2D mode", "", juce::NormalisableRange (0.0f, 1.0f, 1.0f), 0.0f, [] (float value) { if (value >= 0.5f) return "2D"; else return "3D"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "highQuality", "Sample-wise Panning", "", juce::NormalisableRange (0.0f, 1.0f, 1.0f), 0.0f, [] (float value) { return value < 0.5f ? "OFF" : "ON"; }, nullptr)); return params; } //============================================================================== // This creates new instances of the plugin.. juce::AudioProcessor* JUCE_CALLTYPE createPluginFilter() { return new GranularEncoderAudioProcessor(); } ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/GranularEncoder/Source/PluginEditor.cppIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/GranularEncoder/Source/PluginEditor.0000664002537200253720000010151415257173642031552 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Stefan Riedel Copyright (c) 2022 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #include "PluginEditor.h" #include "PluginProcessor.h" //============================================================================== GranularEncoderAudioProcessorEditor::GranularEncoderAudioProcessorEditor ( GranularEncoderAudioProcessor& p, juce::AudioProcessorValueTreeState& vts) : juce::AudioProcessorEditor (&p), footer (p.getOSCParameterInterface()), processor (p), valueTreeState (vts), centerElement (*valueTreeState.getParameter ("azimuth"), valueTreeState.getParameterRange ("azimuth"), *valueTreeState.getParameter ("elevation"), valueTreeState.getParameterRange ("elevation")) { // Make sure that before the constructor has finished, you've set the // editor's size to whatever you need it to be. // setSize(500, 325); // setSize(500, 470); setSize (500, 480); setLookAndFeel (&globalLaF); // ==== SPHERE AND ELEMENTS =============== addAndMakeVisible (&sphere); sphere.addListener (this); centerElement.setColour (juce::Colours::white); sphere.addElement (¢erElement); centerElement.setGrabPriority (1); // ====================================== addAndMakeVisible (&title); title.setTitle (juce::String ("Granular"), juce::String ("Encoder")); title.setFont (globalLaF.robotoBold, globalLaF.robotoLight); addAndMakeVisible (&footer); toolTipWin.setLookAndFeel (&globalLaF); toolTipWin.setMillisecondsBeforeTipAppears (500); toolTipWin.setOpaque (false); cbNormalizationAtachement.reset ( new ComboBoxAttachment (valueTreeState, "useSN3D", *title.getOutputWidgetPtr()->getNormCbPointer())); cbOrderAtachement.reset ( new ComboBoxAttachment (valueTreeState, "orderSetting", *title.getOutputWidgetPtr()->getOrderCbPointer())); // ======================== AZIMUTH ELEVATION ROLL WIDTH GROUP ypGroup.setText ("Azimuth, Elevation, Size, Shape"); ypGroup.setTextLabelPosition (juce::Justification::centredLeft); ypGroup.setColour (juce::GroupComponent::outlineColourId, globalLaF.ClSeperator); ypGroup.setColour (juce::GroupComponent::textColourId, juce::Colours::white); addAndMakeVisible (&ypGroup); ypGroup.setVisible (true); addAndMakeVisible (&azimuthSlider); azimuthAttachment.reset (new SliderAttachment (valueTreeState, "azimuth", azimuthSlider)); azimuthSlider.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); azimuthSlider.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); azimuthSlider.setReverse (true); azimuthSlider.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[0]); azimuthSlider.setRotaryParameters (juce::MathConstants::pi, 3 * juce::MathConstants::pi, false); azimuthSlider.setTooltip ("Azimuth angle"); azimuthSlider.setTextValueSuffix (juce::CharPointer_UTF8 (R"(°)")); addAndMakeVisible (&elevationSlider); elevationAttachment.reset (new SliderAttachment (valueTreeState, "elevation", elevationSlider)); elevationSlider.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); elevationSlider.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); elevationSlider.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[1]); elevationSlider.setRotaryParameters (0.5 * juce::MathConstants::pi, 2.5 * juce::MathConstants::pi, false); elevationSlider.setTooltip ("Elevation angle"); elevationSlider.setTextValueSuffix (juce::CharPointer_UTF8 (R"(°)")); addAndMakeVisible (&shapeSlider); shapeAttachment.reset (new SliderAttachment (valueTreeState, "shape", shapeSlider)); shapeSlider.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); shapeSlider.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); shapeSlider.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[2]); shapeSlider.setReverse (false); shapeSlider.setRotaryParameters (juce::MathConstants::pi, 3 * juce::MathConstants::pi, true); shapeSlider.setTooltip ("Shape the grain distribution: edgy(-) / uniform(0) / peaky(+)"); shapeSlider.setTextValueSuffix (juce::CharPointer_UTF8 (R"()")); addAndMakeVisible (&sizeSlider); sizeAttachment.reset (new SliderAttachment (valueTreeState, "size", sizeSlider)); sizeSlider.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); sizeSlider.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); sizeSlider.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[3]); sizeSlider.setReverse (false); sizeSlider.setRotaryParameters (juce::MathConstants::pi, 3 * juce::MathConstants::pi, true); sizeSlider.setTooltip ("Set the maximum spread of the grain distribution"); sizeSlider.setTextValueSuffix (juce::CharPointer_UTF8 (R"(°)")); // ======================== TEMPORAL GRAIN PARAMETERS GROUP grainGroup.setText ("Grain Parameters"); grainGroup.setTextLabelPosition (juce::Justification::centredLeft); grainGroup.setColour (juce::GroupComponent::outlineColourId, globalLaF.ClSeperator); grainGroup.setColour (juce::GroupComponent::textColourId, juce::Colours::white); addAndMakeVisible (&grainGroup); grainGroup.setVisible (true); // Delta Time addAndMakeVisible (&deltaTimeSlider); deltaTimeAttachment.reset (new SliderAttachment (valueTreeState, "deltaTime", deltaTimeSlider)); deltaTimeSlider.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); deltaTimeSlider.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); deltaTimeSlider.setReverse (false); deltaTimeSlider.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[0]); deltaTimeSlider.setRotaryParameters (juce::MathConstants::pi, 3 * juce::MathConstants::pi, true); deltaTimeSlider.setTooltip ("Time between grains"); deltaTimeSlider.setTextValueSuffix (juce::CharPointer_UTF8 (R"(s)")); // Delta Time Modulation Amount addAndMakeVisible (&deltaTimeModSlider); deltaTimeModAttachment.reset ( new SliderAttachment (valueTreeState, "deltaTimeMod", deltaTimeModSlider)); deltaTimeModSlider.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); deltaTimeModSlider.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); deltaTimeModSlider.setReverse (false); deltaTimeModSlider.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[0]); deltaTimeModSlider.setRotaryParameters (juce::MathConstants::pi, 3 * juce::MathConstants::pi, true); deltaTimeModSlider.setTooltip ( "Spread in percent of the current time between grains (bipolar)"); deltaTimeModSlider.setTextValueSuffix (juce::CharPointer_UTF8 (R"(%)")); // Grain Length addAndMakeVisible (&grainLengthSlider); grainLengthAttachment.reset ( new SliderAttachment (valueTreeState, "grainLength", grainLengthSlider)); grainLengthSlider.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); grainLengthSlider.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); grainLengthSlider.setReverse (false); grainLengthSlider.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[0]); grainLengthSlider.setRotaryParameters (juce::MathConstants::pi, 3 * juce::MathConstants::pi, true); grainLengthSlider.setTooltip ("Length of grains"); grainLengthSlider.setTextValueSuffix (juce::CharPointer_UTF8 (R"(s)")); // Grain Length Modulation Amount addAndMakeVisible (&grainLengthModSlider); grainLengthModAttachment.reset ( new SliderAttachment (valueTreeState, "grainLengthMod", grainLengthModSlider)); grainLengthModSlider.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); grainLengthModSlider.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); grainLengthModSlider.setReverse (false); grainLengthModSlider.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[0]); grainLengthModSlider.setRotaryParameters (juce::MathConstants::pi, 3 * juce::MathConstants::pi, true); grainLengthModSlider.setTooltip ("Spread in percent of the current grain length (bipolar)"); grainLengthModSlider.setTextValueSuffix (juce::CharPointer_UTF8 (R"(%)")); // Buffer Position addAndMakeVisible (&positionSlider); positionAttachment.reset (new SliderAttachment (valueTreeState, "position", positionSlider)); positionSlider.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); positionSlider.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); positionSlider.setReverse (false); positionSlider.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[0]); positionSlider.setRotaryParameters (juce::MathConstants::pi, 3 * juce::MathConstants::pi, true); positionSlider.setTooltip ("Read position in the buffer (relative to write head)"); positionSlider.setTextValueSuffix (juce::CharPointer_UTF8 (R"(s)")); // Buffer Position Modulation Amount addAndMakeVisible (&positionModSlider); positionModAttachment.reset ( new SliderAttachment (valueTreeState, "positionMod", positionModSlider)); positionModSlider.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); positionModSlider.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); positionModSlider.setReverse (false); positionModSlider.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[0]); positionModSlider.setRotaryParameters (juce::MathConstants::pi, 3 * juce::MathConstants::pi, true); positionModSlider.setTooltip ("Spread amount for the read position in the buffer (unipolar)"); positionModSlider.setTextValueSuffix (juce::CharPointer_UTF8 (R"(%)")); // Pitch addAndMakeVisible (&pitchSlider); pitchAttachment.reset (new SliderAttachment (valueTreeState, "pitch", pitchSlider)); pitchSlider.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); pitchSlider.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); pitchSlider.setReverse (false); pitchSlider.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[0]); pitchSlider.setRotaryParameters (juce::MathConstants::pi, 3 * juce::MathConstants::pi, true); pitchSlider.setTooltip ( "Pitch of grains in semitones: -12 to +12 in Freeze mode, -12 to 0 in real-time input mode"); pitchSlider.setTextValueSuffix (juce::CharPointer_UTF8 (R"(st)")); // Pitch Modulation Amount addAndMakeVisible (&pitchModSlider); pitchModAttachment.reset (new SliderAttachment (valueTreeState, "pitchMod", pitchModSlider)); pitchModSlider.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); pitchModSlider.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); pitchModSlider.setReverse (false); pitchModSlider.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[0]); pitchModSlider.setRotaryParameters (juce::MathConstants::pi, 3 * juce::MathConstants::pi, true); pitchModSlider.setTooltip ("Spread amount for the pitch of grains (bipolar)"); pitchModSlider.setTextValueSuffix (juce::CharPointer_UTF8 (R"(%)")); // Window Attack addAndMakeVisible (&windowAttackSlider); windowAttackAttachment.reset ( new SliderAttachment (valueTreeState, "windowAttack", windowAttackSlider)); windowAttackSlider.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); windowAttackSlider.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); windowAttackSlider.setReverse (false); windowAttackSlider.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[1]); windowAttackSlider.setRotaryParameters (juce::MathConstants::pi, 3 * juce::MathConstants::pi, true); windowAttackSlider.setTooltip ("Window attack time in percent of grain length"); windowAttackSlider.setTextValueSuffix (juce::CharPointer_UTF8 (R"(%)")); addAndMakeVisible (&windowAttackModSlider); windowAttackModAttachment.reset ( new SliderAttachment (valueTreeState, "windowAttackMod", windowAttackModSlider)); windowAttackModSlider.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); windowAttackModSlider.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); windowAttackModSlider.setReverse (false); windowAttackModSlider.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[1]); windowAttackModSlider.setRotaryParameters (juce::MathConstants::pi, 3 * juce::MathConstants::pi, true); windowAttackModSlider.setTooltip ("Spread amount for window attack time"); windowAttackModSlider.setTextValueSuffix (juce::CharPointer_UTF8 (R"(%)")); // Window Decay addAndMakeVisible (&windowDecaySlider); windowDecayAttachment.reset ( new SliderAttachment (valueTreeState, "windowDecay", windowDecaySlider)); windowDecaySlider.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); windowDecaySlider.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); windowDecaySlider.setReverse (false); windowDecaySlider.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[1]); windowDecaySlider.setRotaryParameters (juce::MathConstants::pi, 3 * juce::MathConstants::pi, true); windowDecaySlider.setTooltip ("Window decay time in percent of grain length"); windowDecaySlider.setTextValueSuffix (juce::CharPointer_UTF8 (R"(%)")); addAndMakeVisible (&windowDecayModSlider); windowDecayModAttachment.reset ( new SliderAttachment (valueTreeState, "windowDecayMod", windowDecayModSlider)); windowDecayModSlider.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); windowDecayModSlider.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); windowDecayModSlider.setReverse (false); windowDecayModSlider.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[1]); windowDecayModSlider.setRotaryParameters (juce::MathConstants::pi, 3 * juce::MathConstants::pi, true); windowDecayModSlider.setTooltip ("Spread amount for window decay time"); windowAttackModSlider.setTextValueSuffix (juce::CharPointer_UTF8 (R"(%)")); // Mix between Dry Encoding and Granular Encoding addAndMakeVisible (&mixSlider); mixAttachment.reset (new SliderAttachment (valueTreeState, "mix", mixSlider)); mixSlider.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); mixSlider.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); mixSlider.setReverse (false); mixSlider.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[2]); mixSlider.setRotaryParameters (juce::MathConstants::pi, 3 * juce::MathConstants::pi, true); mixSlider.setTooltip ("Mix between standard encoding (0) and granular encoding (100)."); mixSlider.setTextValueSuffix (juce::CharPointer_UTF8 (R"(%)")); // Blend between seeding left or right channel (only relevant for stereo input) addAndMakeVisible (&sourceSlider); sourceAttachment.reset ( new SliderAttachment (valueTreeState, "sourceProbability", sourceSlider)); sourceSlider.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); sourceSlider.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); sourceSlider.setReverse (false); sourceSlider.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[2]); sourceSlider.setRotaryParameters (juce::MathConstants::pi, 3 * juce::MathConstants::pi, true); sourceSlider.setTooltip ( "Seed grains from left (-1), both (0), or right (+1) input channel (for stereo input)."); sourceSlider.setTextValueSuffix (juce::CharPointer_UTF8 (R"(%)")); // ====================== QUATERNION GROUP quatGroup.setText ("Quaternions"); quatGroup.setTextLabelPosition (juce::Justification::centredLeft); quatGroup.setColour (juce::GroupComponent::outlineColourId, globalLaF.ClSeperator); quatGroup.setColour (juce::GroupComponent::textColourId, juce::Colours::white); addAndMakeVisible (&quatGroup); quatGroup.setVisible (true); addAndMakeVisible (&qwSlider); qwAttachment.reset (new SliderAttachment (valueTreeState, "qw", qwSlider)); qwSlider.setSliderStyle (juce::Slider::LinearHorizontal); qwSlider.setTextBoxStyle (juce::Slider::TextBoxLeft, false, 50, 15); qwSlider.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[0]); addAndMakeVisible (&qxSlider); qxAttachment.reset (new SliderAttachment (valueTreeState, "qx", qxSlider)); qxSlider.setSliderStyle (juce::Slider::LinearHorizontal); qxSlider.setTextBoxStyle (juce::Slider::TextBoxLeft, false, 50, 15); qxSlider.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[0]); addAndMakeVisible (&qySlider); qyAttachment.reset (new SliderAttachment (valueTreeState, "qy", qySlider)); qySlider.setSliderStyle (juce::Slider::LinearHorizontal); qySlider.setTextBoxStyle (juce::Slider::TextBoxLeft, false, 50, 15); qySlider.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[0]); addAndMakeVisible (&qzSlider); qzAttachment.reset (new SliderAttachment (valueTreeState, "qz", qzSlider)); qzSlider.setSliderStyle (juce::Slider::LinearHorizontal); qzSlider.setTextBoxStyle (juce::Slider::TextBoxLeft, false, 50, 15); qzSlider.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[0]); // FREEZE STATE addAndMakeVisible (tbFreeze); tbFreezeAttachment.reset (new ButtonAttachment (valueTreeState, "freeze", tbFreeze)); tbFreeze.setButtonText ("Freeze Audio"); tbFreeze.setColour (juce::ToggleButton::tickColourId, globalLaF.ClWidgetColours[2]); tbFreeze.setTooltip ( "Toggle to switch between a freezed audio buffer and realtime audio input."); // 2D/3D Spatialization Toggle /* addAndMakeVisible(tb2D); tb2DAttachment.reset(new ButtonAttachment(valueTreeState, "spatialize2D", tb2D)); tb2D.setButtonText(""); tb2D.setColour(juce::ToggleButton::tickColourId, juce::Colours::white); tb2D.setTooltip("Toggle for 2D spatialization mode (azimuth spread only).");*/ addAndMakeVisible (cb2D3D); cb2D3D.setJustificationType (juce::Justification::centred); cb2D3D.addSectionHeading ("Distribution"); // cb2D3D.addItem("3D", 1); // cb2D3D.addItem("2D", 2); cb2D3D.addItem ("Spherical", 1); cb2D3D.addItem ("Circular", 2); cb2D3DAtachement.reset (new ComboBoxAttachment (valueTreeState, "spatialize2D", cb2D3D)); // addAndMakeVisible(&lb2D); // lb2D.setText("2D"); // ================ LABELS =================== addAndMakeVisible (&lbAzimuth); lbAzimuth.setText ("Azimuth"); addAndMakeVisible (&lbElevation); lbElevation.setText ("Elevation"); addAndMakeVisible (&lbShape); lbShape.setText ("Shape"); addAndMakeVisible (&lbSize); lbSize.setText ("Size"); addAndMakeVisible (&lbDeltaTime); lbDeltaTime.setText ("Delta-t"); addAndMakeVisible (&lbDeltaTimeMod); lbDeltaTimeMod.setText ("t-Mod"); addAndMakeVisible (&lbGrainLength); lbGrainLength.setText ("Length"); addAndMakeVisible (&lbGrainLengthMod); lbGrainLengthMod.setText ("L-Mod"); addAndMakeVisible (&lbPosition); lbPosition.setText ("Position"); addAndMakeVisible (&lbPositionMod); lbPositionMod.setText ("Pos-Mod"); addAndMakeVisible (&lbPitch); lbPitch.setText ("Pitch"); addAndMakeVisible (&lbPitchMod); lbPitchMod.setText ("Pitch-Mod"); addAndMakeVisible (&lbWindowAttack); lbWindowAttack.setText ("Attack"); addAndMakeVisible (&lbWindowDecay); lbWindowDecay.setText ("Decay"); addAndMakeVisible (&lbMix); lbMix.setText ("Mix"); addAndMakeVisible (&lbSource); lbSource.setText ("Source"); addAndMakeVisible (&lbW); lbW.setText ("W"); addAndMakeVisible (&lbX); lbX.setText ("X"); addAndMakeVisible (&lbY); lbY.setText ("Y"); addAndMakeVisible (&lbZ); lbZ.setText ("Z"); // KeyListener addKeyListener (this); startTimer (20); } void GranularEncoderAudioProcessorEditor::mouseWheelOnSpherePannerMoved ( SpherePanner* sphere, const juce::MouseEvent& event, const juce::MouseWheelDetails& wheel) { if (event.mods.isAltDown()) elevationSlider.mouseWheelMove (event, wheel); else if (event.mods.isCommandDown()) azimuthSlider.mouseWheelMove (event, wheel); } GranularEncoderAudioProcessorEditor::~GranularEncoderAudioProcessorEditor() { setLookAndFeel (nullptr); } //============================================================================== void GranularEncoderAudioProcessorEditor::paint (juce::Graphics& g) { g.fillAll (globalLaF.ClBackground); } void GranularEncoderAudioProcessorEditor::timerCallback() { // === update titleBar widgets according to available input/output channel counts title.setMaxSize (processor.getMaxSize()); // ========================================== if (processor.updatedPositionData.get()) { processor.updatedPositionData = false; sphere.repaint(); } } void GranularEncoderAudioProcessorEditor::resized() { const int leftRightMargin = 30; const int headerHeight = 60; const int footerHeight = 25; juce::Rectangle area (getLocalBounds()); juce::Rectangle footerArea (area.removeFromBottom (footerHeight)); footer.setBounds (footerArea); area.removeFromLeft (leftRightMargin); area.removeFromRight (leftRightMargin); juce::Rectangle headerArea = area.removeFromTop (headerHeight); title.setBounds (headerArea); area.removeFromTop (10); juce::Rectangle sliderRow; juce::Rectangle sliderRowTwo; // ============== SIDEBAR RIGHT ==================== // ================================================= juce::Rectangle sideBarArea (area.removeFromRight (190)); const int sliderHeight = 15; const int rotSliderHeight = 55; const int modSliderHeight = 40; const int rotSliderSpacing = 10; const int sliderSpacing = 3; const int rotSliderWidth = 40; const int labelHeight = 15; const int labelWidth = 20; // -------------- Azimuth Elevation Roll Width ------------------ juce::Rectangle yprArea (sideBarArea.removeFromTop (25 + rotSliderHeight + labelHeight)); ypGroup.setBounds (yprArea); yprArea.removeFromTop (25); // for box headline sliderRow = (yprArea.removeFromTop (rotSliderHeight)); azimuthSlider.setBounds (sliderRow.removeFromLeft (rotSliderWidth)); sliderRow.removeFromLeft (rotSliderSpacing); elevationSlider.setBounds (sliderRow.removeFromLeft (rotSliderWidth)); sliderRow.removeFromLeft (rotSliderSpacing); sizeSlider.setBounds (sliderRow.removeFromLeft (rotSliderWidth)); sliderRow.removeFromLeft (rotSliderSpacing); shapeSlider.setBounds (sliderRow.removeFromLeft (rotSliderWidth)); lbAzimuth.setBounds (yprArea.removeFromLeft (rotSliderWidth)); yprArea.removeFromLeft (rotSliderSpacing - 5); lbElevation.setBounds (yprArea.removeFromLeft (rotSliderWidth + 10)); yprArea.removeFromLeft (rotSliderSpacing - 5); lbSize.setBounds (yprArea.removeFromLeft (rotSliderWidth)); yprArea.removeFromLeft (rotSliderSpacing); lbShape.setBounds (yprArea.removeFromLeft (rotSliderWidth)); sideBarArea.removeFromTop (5); juce::Rectangle ModeArea2D (sideBarArea.removeFromTop (15)); // lb2D.setBounds(ModeArea2D.removeFromRight(20)); // tb2D.setBounds(ModeArea2D.removeFromRight(20)); ModeArea2D.removeFromRight (5); cb2D3D.setBounds (ModeArea2D.removeFromRight (70)); sideBarArea.removeFromTop (5); // -------------- DeltaTime GrainLength Position Pitch ------------------ juce::Rectangle grainArea (sideBarArea.removeFromTop ( 25 + 10 + 2 * rotSliderHeight + 2 * modSliderHeight + 2 * labelHeight)); grainGroup.setBounds (grainArea); grainArea.removeFromTop (25); // for box headline sliderRow = (grainArea.removeFromTop (rotSliderHeight)); deltaTimeSlider.setBounds (sliderRow.removeFromLeft (rotSliderWidth)); sliderRow.removeFromLeft (rotSliderSpacing); grainLengthSlider.setBounds (sliderRow.removeFromLeft (rotSliderWidth)); sliderRow.removeFromLeft (rotSliderSpacing); positionSlider.setBounds (sliderRow.removeFromLeft (rotSliderWidth)); sliderRow.removeFromLeft (rotSliderSpacing); pitchSlider.setBounds (sliderRow.removeFromLeft (rotSliderWidth)); juce::Rectangle labelRow = (grainArea.removeFromTop (labelHeight)); lbDeltaTime.setBounds (labelRow.removeFromLeft (rotSliderWidth)); labelRow.removeFromLeft (rotSliderSpacing - 5); lbGrainLength.setBounds (labelRow.removeFromLeft (rotSliderWidth + 10)); labelRow.removeFromLeft (rotSliderSpacing - 10); lbPosition.setBounds (labelRow.removeFromLeft (rotSliderWidth + 10)); labelRow.removeFromLeft (rotSliderSpacing - 5); lbPitch.setBounds (labelRow.removeFromLeft (rotSliderWidth + 10)); juce::Rectangle grainModArea (grainArea.removeFromTop (modSliderHeight)); sliderRow = (grainModArea.removeFromTop (modSliderHeight)); deltaTimeModSlider.setBounds (sliderRow.removeFromLeft (rotSliderWidth)); sliderRow.removeFromLeft (rotSliderSpacing); grainLengthModSlider.setBounds (sliderRow.removeFromLeft (rotSliderWidth)); sliderRow.removeFromLeft (rotSliderSpacing); positionModSlider.setBounds (sliderRow.removeFromLeft (rotSliderWidth)); sliderRow.removeFromLeft (rotSliderSpacing); pitchModSlider.setBounds (sliderRow.removeFromLeft (rotSliderWidth)); grainArea.removeFromTop (10); sliderRowTwo = (grainArea.removeFromTop (rotSliderHeight)); windowAttackSlider.setBounds (sliderRowTwo.removeFromLeft (rotSliderWidth)); sliderRowTwo.removeFromLeft (rotSliderSpacing); windowDecaySlider.setBounds (sliderRowTwo.removeFromLeft (rotSliderWidth)); sliderRowTwo.removeFromLeft (rotSliderSpacing); mixSlider.setBounds (sliderRowTwo.removeFromLeft (rotSliderWidth)); sliderRowTwo.removeFromLeft (rotSliderSpacing); sourceSlider.setBounds (sliderRowTwo.removeFromLeft (rotSliderWidth)); labelRow = (grainArea.removeFromTop (labelHeight)); lbWindowAttack.setBounds (labelRow.removeFromLeft (rotSliderWidth)); labelRow.removeFromLeft (rotSliderSpacing - 5); lbWindowDecay.setBounds (labelRow.removeFromLeft (rotSliderWidth + 10)); labelRow.removeFromLeft (rotSliderSpacing - 5); lbMix.setBounds (labelRow.removeFromLeft (rotSliderWidth)); labelRow.removeFromLeft (rotSliderSpacing); lbSource.setBounds (labelRow.removeFromLeft (rotSliderWidth)); juce::Rectangle grainModAreaTwo (grainArea.removeFromTop (modSliderHeight)); sliderRow = (grainModAreaTwo.removeFromTop (modSliderHeight)); windowAttackModSlider.setBounds (sliderRow.removeFromLeft (rotSliderWidth)); sliderRow.removeFromLeft (rotSliderSpacing); windowDecayModSlider.setBounds (sliderRow.removeFromLeft (rotSliderWidth)); sliderRow.removeFromLeft (rotSliderSpacing); tbFreeze.setBounds (sliderRow.removeFromLeft (90)); // ============== SIDEBAR LEFT ==================== area.removeFromRight (10); // spacing // Sphere-Panner sphere.setBounds (area.getX(), area.getY(), area.getWidth() - 20, area.getWidth() - 20); // ------------- Quaternion ------------------------ area.removeFromTop (10); area.removeFromTop (area.getWidth()); juce::Rectangle quatArea (area.getX(), area.getY(), area.getWidth() - 20, 165); quatGroup.setBounds (quatArea); quatArea.removeFromTop (25); // for box headline sliderRow = quatArea.removeFromTop (sliderHeight); qwSlider.setBounds (sliderRow.removeFromRight (185 - labelWidth)); lbW.setBounds (sliderRow); quatArea.removeFromTop (sliderSpacing); sliderRow = quatArea.removeFromTop (sliderHeight); qxSlider.setBounds (sliderRow.removeFromRight (185 - labelWidth)); lbX.setBounds (sliderRow); quatArea.removeFromTop (sliderSpacing); sliderRow = quatArea.removeFromTop (sliderHeight); qySlider.setBounds (sliderRow.removeFromRight (185 - labelWidth)); lbY.setBounds (sliderRow); quatArea.removeFromTop (sliderSpacing); sliderRow = quatArea.removeFromTop (sliderHeight); qzSlider.setBounds (sliderRow.removeFromRight (185 - labelWidth)); lbZ.setBounds (sliderRow); quatArea.removeFromTop (sliderSpacing); } bool GranularEncoderAudioProcessorEditor::keyPressed (const juce::KeyPress& key, juce::Component* originatingComponent) { DBG ("Key pressed: " << key.getKeyCode()); if (key.getModifiers().isShiftDown()) { switch (key.getKeyCode()) { case 90: // zenith case 84: // top case 85: // up azimuthSlider.setValue (0.0); elevationSlider.setValue (90.0); break; case 68: // down case 78: // nadir azimuthSlider.setValue (0.0); elevationSlider.setValue (-90.0); break; case 70: // front azimuthSlider.setValue (0.0); elevationSlider.setValue (0.0); break; case 66: // back azimuthSlider.setValue (-180.0); elevationSlider.setValue (0.0); break; case 76: // left azimuthSlider.setValue (90.0); elevationSlider.setValue (0.0); break; case 82: // right azimuthSlider.setValue (-90.0); elevationSlider.setValue (0.0); break; default: return false; } return true; } return false; } ././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/GranularEncoder/Source/PluginProcessor.hIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/GranularEncoder/Source/PluginProcess0000664002537200253720000001536515257173642031674 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Stefan Riedel Copyright (c) 2022 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once #include "../../resources/AudioProcessorBase.h" #include "../JuceLibraryCode/JuceHeader.h" #include "../../resources/Quaternion.h" #include "../../resources/ambisonicTools.h" #include "../../resources/efficientSHvanilla.h" #include "../../resources/Conversions.h" #include "Grain.h" #include #define ProcessorClass GranularEncoderAudioProcessor #define maxNumGrains 512 #define windowResolution 1024 #define CIRC_BUFFER_SECONDS 8.0f #define MAX_GRAIN_LENGTH 2.0f #define MIN_GRAIN_LENGTH 0.001f #define MAX_DELTA_T 2.0f #define MIN_DELTA_T 0.001f #define GUI_SKEW 0.5f //============================================================================== /** */ class GranularEncoderAudioProcessor : public AudioProcessorBase, IOTypes::Ambisonics<>> { public: constexpr static int numberOfInputChannels = 2; constexpr static int numberOfOutputChannels = 64; //============================================================================== GranularEncoderAudioProcessor(); ~GranularEncoderAudioProcessor(); //============================================================================== void prepareToPlay (double sampleRate, int samplesPerBlock) override; void releaseResources() override; void processBlock (juce::AudioBuffer&, juce::MidiBuffer&) override; //============================================================================== juce::AudioProcessorEditor* createEditor() override; bool hasEditor() const override; //============================================================================== int getNumPrograms() override; int getCurrentProgram() override; void setCurrentProgram (int index) override; const juce::String getProgramName (int index) override; void changeProgramName (int index, const juce::String& newName) override; //============================================================================== void getStateInformation (juce::MemoryBlock& destData) override; void setStateInformation (const void* data, int sizeInBytes) override; void resampleAudioBuffer (juce::AudioBuffer& inAudioBuffer, float inSampleRate, juce::AudioBuffer& outAudioBuffer, float outSampleRate); void parameterChanged (const juce::String& parameterID, float newValue) override; // ====== OSC ================================================================== const bool processNotYetConsumedOSCMessage (const juce::OSCMessage& message) override; // ================= //======= Parameters =========================================================== std::vector> createParameterLayout(); //============================================================================== inline void updateQuaternions(); inline void updateEuler(); juce::Vector3D getRandomGrainDirection3D(); juce::Vector3D getRandomGrainDirection2D(); juce::AudioBuffer getWindowBuffer (float modWeight); int getStartPositionCircBuffer() const; std::pair getGrainLengthAndPitchFactor() const; int getDeltaTimeSamples(); bool getChannelToSeed(); bool getFreezeGUIBool(); void initializeModeTransition (bool freeze); void finishModeTransition(); float getMeanWindowGain(); // void writeCircularBufferToDisk(juce::String filename); // Debug function juce::Vector3D posC, posL, posR; juce::Atomic updatedPositionData; std::atomic* orderSetting; std::atomic* useSN3D; std::atomic* qw; std::atomic* qx; std::atomic* qy; std::atomic* qz; std::atomic* azimuth; std::atomic* elevation; std::atomic* shape; // distribution parameter (circular to peaky, uniform at 0.0) std::atomic* size; // total opening angle of distribution cap std::atomic* roll; // legacy parameter from StereoEncoder std::atomic* width; // legacy parameter from StereoEncoder std::atomic* deltaTime; std::atomic* deltaTimeMod; std::atomic* grainLength; std::atomic* grainLengthMod; std::atomic* pitch; std::atomic* pitchMod; std::atomic* position; std::atomic* positionMod; std::atomic* windowAttack; std::atomic* windowAttackMod; std::atomic* windowDecay; std::atomic* windowDecayMod; std::atomic* mix; std::atomic* sourceProbability; std::atomic* highQuality; std::atomic* freeze; std::atomic* spatialize2D; // -------------------- bool sphericalInput; double phi, theta; enum class OperationMode { Realtime, ToFreeze, Freeze, ToRealtime }; private: //============================================================================== bool processorUpdatingParams; float SHC[64]; float _SHC[64]; juce::Atomic positionHasChanged = true; iem::Quaternion quaternionDirection; juce::AudioBuffer bufferCopy; juce::AudioBuffer dryAmbiBuffer; juce::AudioBuffer wetAmbiBuffer; juce::AudioBuffer circularBuffer; int circularBufferWriteHead; int circularBufferLength; int deltaTimeSamples = 0; float lastSampleRate; float sampleRateAtSerialize; int grainTimeCounter = 0; Grain grains[maxNumGrains]; float _grainSH[maxNumGrains][64]; std::mt19937 rng; juce::SmoothedValue writeGainCircBuffer = 1.0f; OperationMode mode = OperationMode::Realtime; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (GranularEncoderAudioProcessor) }; ././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/GranularEncoder/Source/PluginEditor.hIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/GranularEncoder/Source/PluginEditor.0000664002537200253720000001343315257173642031554 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Stefan Riedel Copyright (c) 2022 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #include "../JuceLibraryCode/JuceHeader.h" #include "PluginProcessor.h" #include "../../resources/customComponents/ReverseSlider.h" #include "../../resources/customComponents/SimpleLabel.h" #include "../../resources/customComponents/SpherePanner.h" #include "../../resources/customComponents/TitleBar.h" #include "../../resources/lookAndFeel/IEM_LaF.h" typedef ReverseSlider::SliderAttachment SliderAttachment; typedef juce::AudioProcessorValueTreeState::ComboBoxAttachment ComboBoxAttachment; typedef juce::AudioProcessorValueTreeState::ButtonAttachment ButtonAttachment; //============================================================================== /** */ class GranularEncoderAudioProcessorEditor : public juce::AudioProcessorEditor, private juce::Timer, public SpherePanner::Listener, private juce::KeyListener { public: GranularEncoderAudioProcessorEditor (GranularEncoderAudioProcessor&, juce::AudioProcessorValueTreeState&); ~GranularEncoderAudioProcessorEditor(); //============================================================================== void paint (juce::Graphics&) override; void resized() override; void mouseWheelOnSpherePannerMoved (SpherePanner* sphere, const juce::MouseEvent& event, const juce::MouseWheelDetails& wheel) override; bool keyPressed (const juce::KeyPress& key, juce::Component* originatingComponent) override; private: LaF globalLaF; TitleBar, AmbisonicIOWidget<>> title; OSCFooter footer; void timerCallback() override; // This reference is provided as a quick way for your editor to // access the processor object that created it. GranularEncoderAudioProcessor& processor; juce::AudioProcessorValueTreeState& valueTreeState; juce::GroupComponent quatGroup, ypGroup, grainGroup; ReverseSlider azimuthSlider, elevationSlider, shapeSlider, sizeSlider, qwSlider, qxSlider, qySlider, qzSlider; ReverseSlider deltaTimeSlider, deltaTimeModSlider, grainLengthSlider, grainLengthModSlider; ReverseSlider positionSlider, positionModSlider, pitchSlider, pitchModSlider; ReverseSlider windowAttackSlider, windowAttackModSlider, windowDecaySlider, windowDecayModSlider; ReverseSlider mixSlider, sourceSlider; juce::ComboBox inputChooser; SpherePanner sphere; SpherePanner::AzimuthElevationParameterElement centerElement; std::unique_ptr qwAttachment; std::unique_ptr qxAttachment; std::unique_ptr qyAttachment; std::unique_ptr qzAttachment; std::unique_ptr azimuthAttachment; std::unique_ptr elevationAttachment; std::unique_ptr shapeAttachment; std::unique_ptr sizeAttachment; std::unique_ptr rollAttachment; std::unique_ptr widthAttachment; std::unique_ptr deltaTimeAttachment; std::unique_ptr deltaTimeModAttachment; std::unique_ptr grainLengthAttachment; std::unique_ptr grainLengthModAttachment; std::unique_ptr positionAttachment; std::unique_ptr positionModAttachment; std::unique_ptr pitchAttachment; std::unique_ptr pitchModAttachment; std::unique_ptr windowAttackAttachment; std::unique_ptr windowAttackModAttachment; std::unique_ptr windowDecayAttachment; std::unique_ptr windowDecayModAttachment; std::unique_ptr mixAttachment; std::unique_ptr sourceAttachment; std::unique_ptr cbNormalizationAtachement; std::unique_ptr cbOrderAtachement; juce::TooltipWindow toolTipWin; // labels SimpleLabel lbAzimuth, lbElevation, lbShape, lbSize, lbW, lbX, lbY, lbZ; SimpleLabel lbDeltaTime, lbDeltaTimeMod, lbGrainLength, lbGrainLengthMod; SimpleLabel lbPosition, lbPositionMod, lbPitch, lbPitchMod; SimpleLabel lbWindowAttack, lbWindowAttackMod, lbWindowDecay, lbWindowDecayMod; SimpleLabel lbMix, lbSource; juce::ToggleButton tbFreeze; // juce::ToggleButton tb2D; // SimpleLabel lb2D; juce::ComboBox cb2D3D; std::unique_ptr cb2D3DAtachement; std::unique_ptr tbFreezeAttachment; std::unique_ptr tb2DAttachment; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (GranularEncoderAudioProcessorEditor) }; IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/GranularEncoder/Source/Grain.cpp0000664002537200253720000001144015257173642030706 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Stefan Riedel Copyright (c) 2022 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #include "Grain.h" Grain::Grain() { _isActive = false; _currentIndex = 0; _blockCounter = 0; } void Grain::setBlockSize (int numSampOutBuffer) { _outputBuffer.setSize (1, numSampOutBuffer); _outputBuffer.clear(); } void Grain::startGrain (const GrainJobParameters& grainParameters) // Type envelopeType) { _params = grainParameters; _isActive = true; _currentIndex = 0; _blockCounter = 0; _outputBuffer.clear(); } void Grain::processBlock (juce::AudioBuffer& buffer, juce::AudioBuffer& circularBuffer) { if (! _isActive) return; int numSampCircBuffer = circularBuffer.getNumSamples(); int numSampOutBuffer = buffer.getNumSamples(); jassert (_outputBuffer.getNumSamples() == numSampOutBuffer); _outputBuffer.clear(); int nChOut = buffer.getNumChannels(); const float* circularLeftChannel = circularBuffer.getReadPointer (0); const float* circularRightChannel = circularBuffer.getReadPointer (1); const float* circularBuffToSeed; if (_params.seedFromLeftCircBuffer) circularBuffToSeed = circularLeftChannel; else circularBuffToSeed = circularRightChannel; const float* window_ptr = _params.windowBuffer.getReadPointer (0); const int windowNumSamples = _params.windowBuffer.getNumSamples(); float* outputBufferWritePtr = _outputBuffer.getWritePointer (0); int outStart; if (_blockCounter == 0) { outStart = _params.startOffsetInBlock; } else { outStart = 0; } // Write samples to internal mono buffer for (int i = outStart; i < numSampOutBuffer; i++) { if (_currentIndex < _params.grainLengthSamples) // grain still needs samples { // Linear interpolation of buffer samples float readIndex = _params.startPositionCircBuffer + (_currentIndex * _params.pitchReadFactor); int readIndexInt = static_cast (readIndex); int readIndexIntNext = readIndexInt + 1; float sampleFracWeight = readIndex - readIndexInt; readIndexInt %= numSampCircBuffer; readIndexIntNext %= numSampCircBuffer; float sampleIntPart = circularBuffToSeed[readIndexInt]; float sampleFracPart = circularBuffToSeed[readIndexIntNext] - sampleIntPart; float sampleValue = sampleIntPart + sampleFracWeight * sampleFracPart; // Linear interpolation for grain window function float windowIndex = static_cast (_currentIndex) / static_cast (_params.grainLengthSamples) * (windowNumSamples - 1); int windowIndexInt = static_cast (windowIndex); jassert (windowIndexInt >= 0 && windowIndexInt < (windowNumSamples - 1)); int windowIndexIntNext = windowIndexInt + 1; float windowFracWeight = windowIndex - windowIndexInt; float windowIntPart = window_ptr[windowIndexInt]; float windFracPart = window_ptr[windowIndexIntNext] - windowIntPart; float windowValue = windowIntPart + windowFracWeight * windFracPart; jassert (windowValue >= 0.0f && windowValue <= 1.0f); outputBufferWritePtr[i] = sampleValue * windowValue; _currentIndex++; } else { _isActive = false; break; } } const float* outputBufferReadPtr = _outputBuffer.getReadPointer (0); for (int ch = 0; ch < nChOut; ++ch) { buffer.addFrom (ch, 0, outputBufferReadPtr, buffer.getNumSamples(), _params.channelWeights[ch] * _params.gainFactor); } _blockCounter++; }; bool Grain::isActive() const { return _isActive; }; IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/GranularEncoder/Source/Grain.h0000664002537200253720000000337315257173642030361 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Stefan Riedel Copyright (c) 2022 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #include "JuceHeader.h" class Grain { public: struct GrainJobParameters { int startPositionCircBuffer = 0; int startOffsetInBlock = 0; int grainLengthSamples = 0; float pitchReadFactor = 1.0f; std::array channelWeights; float gainFactor = 1.0f; bool seedFromLeftCircBuffer = true; juce::AudioBuffer windowBuffer; }; Grain(); void setBlockSize (int numSampOutBuffer); void startGrain (const GrainJobParameters& grainParameters); void processBlock (juce::AudioBuffer& buffer, juce::AudioBuffer& circularBuffer); bool isActive() const; private: GrainJobParameters _params; int _currentIndex; bool _isActive; int _blockCounter; juce::AudioBuffer _outputBuffer; }; IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/GranularEncoder/CMakeLists.txt0000664002537200253720000000356615257173642030454 0ustar zmoelnigzmoelnigset (PLUGIN_TARGET "") if (IEM_FORMATS) juce_add_plugin (GranularEncoder PLUGIN_MANUFACTURER_CODE IEMA PLUGIN_CODE GrEn ICON_BIG "../resources/Standalone/IEMPluginSuiteSmall.png" ICON_SMALL "../resources/Standalone/IEMPluginSuiteSmall.png" COMPANY_NAME "IEM" PRODUCT_NAME "GranularEncoder" FORMATS ${IEM_FORMATS} VERSION ${GranularEncoder_VERSION} LV2URI "http://plugins.iem.at/GranularEncoder" VST2_CATEGORY kPlugSurroundFx kPlugCategSpacializer kPlugCategEffect kPlugCategRoomFx kPlugCategSynth VST3_CATEGORIES Spatial Surround Up-Downmix Synth AAX_CATEGORY SoundField) list (APPEND PLUGIN_TARGET GranularEncoder) endif() foreach (TARGET IN LISTS PLUGIN_TARGET) juce_generate_juce_header (${TARGET}) target_sources (${TARGET} PRIVATE Source/PluginEditor.cpp Source/PluginEditor.h Source/PluginProcessor.cpp Source/PluginProcessor.h Source/Grain.cpp Source/Grain.h ../resources/OSC/OSCInputStream.h ../resources/OSC/OSCParameterInterface.cpp ../resources/OSC/OSCParameterInterface.h ../resources/OSC/OSCStatus.cpp ../resources/OSC/OSCStatus.h ../resources/OSC/OSCUtilities.h ../resources/efficientSHvanilla.cpp ) target_compile_definitions (${TARGET} PRIVATE JUCE_USE_CURL=0 JUCE_WEB_BROWSER=0 JUCE_USE_CUSTOM_PLUGIN_STANDALONE_APP=1 JUCE_USE_FLAC=0 JUCE_USE_OGGVORBIS=0 JUCE_USE_MP3AUDIOFORMAT=0 JUCE_USE_LAME_AUDIO_FORMAT=0 JUCE_USE_WINDOWS_MEDIA_FORMAT=0 JUCE_VST3_CAN_REPLACE_VST2=0) target_include_directories (${TARGET} PRIVATE Source) target_link_libraries (${TARGET} PRIVATE LAF_fonts IEM_logo juce::juce_audio_utils juce::juce_audio_plugin_client juce::juce_osc juce::juce_opengl juce::juce_recommended_config_flags juce::juce_recommended_lto_flags) endforeach() IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/0000775002537200253720000000000015257173642024641 5ustar zmoelnigzmoelnigIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/WalshHadamard/0000775002537200253720000000000015257173642027341 5ustar zmoelnigzmoelnigIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/WalshHadamard/fwht.h0000664002537200253720000001212115257173642030457 0ustar zmoelnigzmoelnig#ifndef __FWHT__ #define __FWHT__ //================================================ // @title fwht.h // @author Jonathan Hadida // @contact Jonathan.hadida [at] dtc.ox.ac.uk //================================================ #include #include #include #include #include #define for_i(n) for (unsigned i = 0; i < n; ++i) /******************** ********** ********************/ /******************** ********** ********************/ /** * Count the number of bits set. */ template unsigned bit_count (IntType n) { unsigned c; for (c = 0; n; ++c) n &= n - 1; return c; } // ------------------------------------------------------------------------ /** * Reverse the bits (left-right) of an integer. */ template IntType bit_reverse (IntType n, unsigned nbits) { IntType r = n; IntType l, m; // Compute shift and bitmask l = (IntType) (nbits - 1); m = (1 << nbits) - 1; // Permute while (n >>= 1) { r <<= 1; r |= n & 1; --l; } // Final shift and masking r <<= l; return r & m; } template inline IntType bit_reverse (IntType n) { return bit_reverse (n, 8 * sizeof (n)); } // ------------------------------------------------------------------------ /** * Print the bits of an integer. */ template void bit_print (IntType n) { static const unsigned b = 8 * sizeof (IntType); static char buf[b + 1]; buf[b] = '\0'; std::cout << n; for (unsigned m = b; m; n >>= 1, --m) buf[m - 1] = (n & 1) + '0'; printf (" = %s\n", buf); } // ------------------------------------------------------------------------ /** * Gray codes transforms. */ template inline IntType bin2gray (IntType n) { return (n >> 1) ^ n; } template IntType gray2bin (IntType n) { for (IntType m = n; m >>= 1; n = n ^ m) ; return n; } // ------------------------------------------------------------------------ /** * Integer logarithm base 2. */ template unsigned ilog2 (IntType n) { unsigned l; for (l = 0; n; n >>= 1, ++l) ; return l; } template inline bool is_pow2 (IntType n) { return (n > 1) && ((n & (n - 1)) == 0); } // ------------------------------------------------------------------------ /** * Orthogonal transformation. */ template void rotate (T& a, T& b) { T A; A = a; a = A + b; b = A - b; } // ------------------------------------------------------------------------ /** * Compute the permutation of WH coefficients to sort them by sequency. */ template void fwht_sequency_permutation (std::vector& perm, unsigned order) { if (perm.size() == (size_t) (1 << order)) return; perm.resize (1 << order); IntType k = 0; for (auto& p : perm) p = bit_reverse (bin2gray (k++), order); } // ------------------------------------------------------------------------ /** * Fast Walsh-Hadamard transform. */ template void fwht (T* data, unsigned n, bool sequency_ordered = false, bool normalize = true) { // Require n to be a power of 2 unsigned l2 = ilog2 (n) - 1; if (n != (unsigned) (1 << l2)) throw std::length_error ("Data length should be a power of 2."); // Normalizer const T norm = sqrt (T (n)); // Compute the WHT for (unsigned i = 0; i < l2; ++i) { for (unsigned j = 0; j < n; j += (1 << (i + 1))) for (unsigned k = 0; k < (unsigned) (1 << i); ++k) rotate (data[j + k], data[j + k + (unsigned) (1 << i)]); } static std::vector perm; if (sequency_ordered) { // Compute permutation fwht_sequency_permutation (perm, l2); // Copy transform std::vector tmp (data, data + n); for_i (n) data[i] = tmp[perm[i]] / norm; } else if (normalize) for_i (n) data[i] /= norm; } // ------------------------------------------------------------------------ template void ifwht (T* data, unsigned n, bool sequency_ordered = false) { fwht (data, n, sequency_ordered, false); } // ------------------------------------------------------------------------ template void fwht (std::vector& data, bool sequency_ordered = false) { // Round to the next power of 2 unsigned n = data.size(); unsigned l2 = ilog2 (n) - is_pow2 (n); unsigned N = 1 << l2; // 0-padding to the next power of 2 data.resize (N, T (0)); fwht (data.data(), N, sequency_ordered); } // ------------------------------------------------------------------------ template void ifwht (std::vector& data, bool sequency_ordered = false) { // Round to the next power of 2 unsigned n = data.size(); unsigned l2 = ilog2 (n) - is_pow2 (n); unsigned N = 1 << l2; // 0-padding to the next power of 2 data.resize (N, T (0)); ifwht (data.data(), N, sequency_ordered); } #endif IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/WalshHadamard/mx_fwht.cpp0000664002537200253720000000226615257173642031527 0ustar zmoelnigzmoelnig//================================================ // @title mx_fwht.cpp // @author Jonathan Hadida // @contact Jonathan.hadida [at] dtc.ox.ac.uk //================================================ #include "fwht.h" #include "ndArray.h" #include #define SEQUENCY_ORDER false /******************** ********** ********************/ /******************** ********** ********************/ /** * Dependency to ndArray (see https://github.com/Sheljohn/ndArray). * Use the script start_matlab.sh to start Matlab, and compile with: * mex CXXFLAGS="\$CXXFLAGS -std=c++0x -Wall -O2" mx_fwht.cpp */ void mexFunction (int nargout, mxArray* out[], int nargin, const mxArray* in[]) { if (nargin != 1) { mexErrMsgTxt ("Usage: w = mx_fwht(sequence);"); return; } ndArray input (in[0]); ndArray output; std::vector d (input.begin(), input.end()); fwht (d, SEQUENCY_ORDER); int size[2]; size[0] = 1; size[1] = d.size(); out[0] = mxCreateNumericArray (2, size, mx_type::id, mxREAL); output.assign (out[0]); std::copy (d.begin(), d.end(), output.begin()); }IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/WalshHadamard/README.md0000664002537200253720000000021315257173642030614 0ustar zmoelnigzmoelnigWalsh-Hadamard ============== C++(11) templated header to compute the fast Walsh-Hadamard transform. Bundled with a Mex wrapper (Matlab). ././@LongLink0000644000000000000000000000015500000000000011604 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/WalshHadamard/mx_sequency_perm.cppIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/WalshHadamard/mx_sequency_0000664002537200253720000000226615257173642031771 0ustar zmoelnigzmoelnig//================================================ // @title mx_sequency_perm.cpp // @author Jonathan Hadida // @contact Jonathan.hadida [at] dtc.ox.ac.uk //================================================ #include "fwht.h" #include "mexArray.h" #include /******************** ********** ********************/ /******************** ********** ********************/ /** * Returns the sequency permutation (bitrev of Gray code) of order n. * Use the script start_matlab.sh to start Matlab, and compile with: * mex CXXFLAGS="\$CXXFLAGS -std=c++0x -Wall -O2" mx_sequency_perm.cpp */ void mexFunction (int nargout, mxArray* out[], int nargin, const mxArray* in[]) { if (nargin != 1) { mexErrMsgTxt ("Usage: p = mx_sequency_perm(order);"); return; } ndArray output; unsigned n = static_cast (mxGetScalar (in[0])); std::vector p; fwht_sequency_permutation (p, n); int size[2]; size[0] = 1; size[1] = p.size(); out[0] = mxCreateNumericArray (2, size, mx_type::id, mxREAL); output.assign (out[0]); std::copy (p.begin(), p.end(), output.begin()); }IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/WalshHadamard/LICENSE0000664002537200253720000000206015257173642030344 0ustar zmoelnigzmoelnigThe MIT License (MIT) Copyright (c) 2014 John H Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/WalshHadamard/mx_ifwht.cpp0000664002537200253720000000227215257173642031675 0ustar zmoelnigzmoelnig//================================================ // @title mx_ifwht.cpp // @author Jonathan Hadida // @contact Jonathan.hadida [at] dtc.ox.ac.uk //================================================ #include "fwht.h" #include "ndArray.h" #include #define SEQUENCY_ORDER false /******************** ********** ********************/ /******************** ********** ********************/ /** * Dependency to ndArray (see https://github.com/Sheljohn/ndArray). * Use the script start_matlab.sh to start Matlab, and compile with: * mex CXXFLAGS="\$CXXFLAGS -std=c++0x -Wall -O2" mx_ifwht.cpp */ void mexFunction (int nargout, mxArray* out[], int nargin, const mxArray* in[]) { if (nargin != 1) { mexErrMsgTxt ("Usage: w = mx_ifwht(sequence);"); return; } ndArray input (in[0]); ndArray output; std::vector d (input.begin(), input.end()); ifwht (d, SEQUENCY_ORDER); int size[2]; size[0] = 1; size[1] = d.size(); out[0] = mxCreateNumericArray (2, size, mx_type::id, mxREAL); output.assign (out[0]); std::copy (d.begin(), d.end(), output.begin()); }././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/WalshHadamard/start_matlab.shIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/WalshHadamard/start_matlab0000664002537200253720000000112315257173642031736 0ustar zmoelnigzmoelnig#!/bin/bash -eu # Use this script to force Matlab to load the most recent C++ library # available on your system (GCC 4.6+ min.). You should chmod +x the # script and run it from the command line as: ./start_matlab.sh & # # Close all previous instances of Matlab beforehand. You will NOT # be able to run (or maybe even compile) the sources of the simulation # if you do not start Matlab using this script. # # Update the path to the appropriate library on your system if necessary. LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libstdc++.so.6 \ LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu \ matlab $@IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/ReferenceCountedDecoder.h0000664002537200253720000000774315257173642031533 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once #include "MaxRE.h" #include "ReferenceCountedMatrix.h" #include "ambisonicTools.h" #include "inPhase.h" class ReferenceCountedDecoder : public ReferenceCountedMatrix { public: typedef juce::ReferenceCountedObjectPtr Ptr; enum class Normalization { n3d, sn3d }; enum class Weights { none, maxrE, inPhase }; struct Settings { Normalization expectedNormalization = Normalization::sn3d; Weights weights = Weights::none; bool weightsAlreadyApplied = false; int subwooferChannel = -1; }; ReferenceCountedDecoder (const juce::String& nameToUse, const juce::String& descriptionToUse, int rows, int columns) : ReferenceCountedMatrix (nameToUse, descriptionToUse, rows, columns), order (isqrt (columns) - 1) { } ~ReferenceCountedDecoder() override = default; virtual juce::String getConstructorMessage() const override { return "Decoder named '" + name + "' constructed. Size: " + juce::String (matrix.getNumRows()) + "x" + juce::String (matrix.getNumColumns()); } virtual juce::String getDeconstructorMessage() const override { return "Decoder named '" + name + "' destroyed."; } const juce::String getName() { return name; } const juce::String getDescription() { return description; } void setSettings (const Settings newSettings) { settings = newSettings; } const Settings getSettings() { return settings; } const juce::String getWeightsString() const { switch (settings.weights) { case Weights::maxrE: return "maxrE"; case Weights::inPhase: return "inPhase"; default: return "none"; } } /** Applies the inverse weights to the decoder matrix, so it can be used with different orders. This method has to be called before the decoder processes audio input. */ void removeAppliedWeights() { if (settings.weightsAlreadyApplied && settings.weights != Weights::none) { const auto nCols = static_cast (matrix.getNumColumns()); const auto nRows = static_cast (matrix.getNumRows()); if (settings.weights == Weights::maxrE) for (int i = 0; i < nCols; ++i) for (int j = 0; j < nRows; ++j) matrix (j, i) /= getMaxRELUT (order)[i]; else if (settings.weights == Weights::inPhase) for (int i = 0; i < nCols; ++i) for (int j = 0; j < nRows; ++j) matrix (j, i) /= getInPhaseLUT (order)[i]; settings.weightsAlreadyApplied = false; } } const int getOrder() { return order; } private: Settings settings; const int order; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ReferenceCountedDecoder) }; IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/RoomSync.h0000664002537200253720000002432015257173642026564 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Felix Holzmüller Copyright (c) 2026 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once #include /** Synchronizes room settings (room dimensions, listener position and reflection properties) between all plug-in instances set to the same synchronization channel, e.g. several RoomEncoders and CoordinateConverters. The settings are stored in a memory-mapped file, so they are shared across different plug-in binaries (which don't share any static data) and even across host processes. As instances can't reliably tell whether others are still alive (e.g. after a crash), every synchronized instance periodically refreshes a time stamp of its groups. Groups which haven't been refreshed for a while are considered orphaned. An instance joining a channel takes over the channel's settings, or publishes its own ones if nobody else is synchronized to that channel. Afterwards, the instance publishes its parameter changes immediately and takes over the channel's settings periodically. */ class RoomSync : private juce::AudioProcessorValueTreeState::Listener, private juce::Timer { public: static constexpr int numChannels = 4; enum Group { roomDimensions, listenerPosition, reflectionProperties, numGroups }; /** @param channelParameterID parameter selecting the channel: 0 disables the synchronization, 1 to numChannels select the respective channel */ RoomSync (juce::AudioProcessorValueTreeState& state, const juce::String& channelParameterID) : parameters (state), channel (parameters.getRawParameterValue (channelParameterID)) { jassert (channel != nullptr); startTimer (50); } ~RoomSync() override { stopTimer(); for (auto& settings : groups) for (auto& id : settings.parameterIDs) parameters.removeParameterListener (id, this); } /** Adds a group of parameters, which are synchronized as long as the given toggle parameter is on. All plug-ins have to use the same parameters in the same order for a group. */ void addGroup (Group group, const juce::String& enableParameterID, const juce::StringArray& parameterIDs) { jassert (parameterIDs.size() <= maxNumValues); auto& settings = groups[group]; settings.enabled = parameters.getRawParameterValue (enableParameterID); jassert (settings.enabled != nullptr); for (auto& id : parameterIDs) { auto* parameter = parameters.getParameter (id); jassert (parameter != nullptr); settings.parameterIDs.add (id); settings.parameters.add (parameter); settings.values.add (parameters.getRawParameterValue (id)); parameters.addParameterListener (id, this); } } private: static constexpr int maxNumValues = 12; static constexpr juce::int64 orphanedAfterMs = 1000; struct SharedGroup { std::atomic lastRefresh; // milliseconds since epoch std::atomic values[maxNumValues]; }; struct SharedData { SharedGroup groups[numChannels][numGroups]; }; static_assert (std::atomic::is_always_lock_free && std::atomic::is_always_lock_free, "Atomics in shared memory have to be lock-free."); /** Maps the shared file once per plug-in binary. If that fails, it falls back to memory which is only shared between the instances of this binary. */ struct SharedMemory { SharedMemory() { const auto file = getFile(); const auto size = static_cast (sizeof (SharedData)); if (file.getParentDirectory().createDirectory().wasOk() && file.getSize() < size) { // appends to the file, so data of instances already using it isn't overwritten juce::FileOutputStream stream (file); if (stream.openedOk() && stream.getPosition() < size) stream.writeRepeatedByte (0, static_cast (size - stream.getPosition())); } mappedFile = std::make_unique (file, juce::Range (0, size), juce::MemoryMappedFile::readWrite); if (mappedFile->getData() != nullptr && mappedFile->getSize() == sizeof (SharedData)) { data = static_cast (mappedFile->getData()); } else { DBG ("RoomSync: couldn't map " << file.getFullPathName() << ", synchronizing only within this plug-in."); mappedFile.reset(); fallback = std::make_unique(); data = fallback.get(); } } static juce::File getFile() { #if JUCE_WINDOWS const auto directory = juce::File::getSpecialLocation (juce::File::windowsLocalAppData); #elif JUCE_MAC const auto directory = juce::File::getSpecialLocation (juce::File::userApplicationDataDirectory) .getChildFile ("Application Support"); #else const auto directory = juce::File::getSpecialLocation (juce::File::userApplicationDataDirectory); #endif // change the file name whenever the layout of SharedData changes return directory.getChildFile ("IEM").getChildFile ("RoomSync_v1.dat"); } std::unique_ptr mappedFile; std::unique_ptr fallback; SharedData* data = nullptr; }; struct GroupSettings { std::atomic* enabled = nullptr; juce::StringArray parameterIDs; juce::Array parameters; juce::Array*> values; std::atomic joinedChannel = -1; }; static juce::int64 now() { return juce::Time::currentTimeMillis(); } int getChannel() const { return juce::roundToInt (channel->load()) - 1; } SharedGroup& getSharedGroup (int ch, int group) { return memory->data->groups[ch][group]; } void publish (int ch, int group) { auto& settings = groups[group]; auto& shared = getSharedGroup (ch, group); for (int i = 0; i < settings.values.size(); ++i) shared.values[i] = settings.values[i]->load(); shared.lastRefresh = now(); } void takeOver (int ch, int group) { auto& settings = groups[group]; auto& shared = getSharedGroup (ch, group); updatingParameters = true; for (int i = 0; i < settings.parameters.size(); ++i) { auto* parameter = settings.parameters[i]; const auto& range = parameter->getNormalisableRange(); const auto newValue = range.convertTo0to1 (range.snapToLegalValue (shared.values[i])); if (std::abs (parameter->getValue() - newValue) > 1.0e-6f) parameter->setValueNotifyingHost (newValue); } updatingParameters = false; } void parameterChanged (const juce::String& parameterID, float) override { // ignore the changes caused by taking over the channel's settings if (updatingParameters && juce::MessageManager::existsAndIsCurrentThread()) return; const int ch = getChannel(); if (ch < 0 || ch >= numChannels) return; for (int group = 0; group < numGroups; ++group) { auto& settings = groups[group]; const int index = settings.parameterIDs.indexOf (parameterID); // only publish the changed value, so simultaneous changes of other values in the same // group made by other instances aren't overwritten if (index >= 0 && settings.joinedChannel == ch) { auto& shared = getSharedGroup (ch, group); shared.values[index] = settings.values[index]->load(); shared.lastRefresh = now(); } } } void timerCallback() override { const int ch = getChannel(); for (int group = 0; group < numGroups; ++group) { auto& settings = groups[group]; if (settings.enabled == nullptr || settings.enabled->load() < 0.5f || ch < 0 || ch >= numChannels) { settings.joinedChannel = -1; continue; } auto& shared = getSharedGroup (ch, group); const bool alreadyJoined = settings.joinedChannel == ch; const bool orphaned = now() - shared.lastRefresh > orphanedAfterMs; if (alreadyJoined || ! orphaned) takeOver (ch, group); else publish (ch, group); shared.lastRefresh = now(); settings.joinedChannel = ch; } } juce::AudioProcessorValueTreeState& parameters; std::atomic* channel; GroupSettings groups[numGroups]; std::atomic updatingParameters = false; juce::SharedResourcePointer memory; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (RoomSync) }; IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/OnePoleFilter.h0000664002537200253720000000416115257173642027523 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Felix Holzmüller Copyright (c) 2024 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #define _USE_MATH_DEFINES #include template class OnePoleFilter { public: OnePoleFilter() { a0 = 1; b1 = 0; z1 = 0; targetValue = 0; }; OnePoleFilter (T newa0, T newb1) { a0 = newa0; b1 = newb1; z1 = 0; targetValue = 0; }; void setCoefficients (T newa0, T newb1) { a0 = newa0; b1 = newb1; reset = true; }; void setFrequency (T frequency, T sampleRate) { b1 = std::exp (-2.0 * M_PI * frequency / sampleRate); a0 = 1.0 - b1; reset = true; }; void setTargetValue (T newTargetValue) { targetValue = newTargetValue; }; T process (bool forceReset = false) { if (reset || forceReset) { z1 = targetValue; reset = false; } else { z1 = a0 * targetValue + b1 * z1; } return z1; } T process (T newTargetValue, bool forceReset = false) { targetValue = newTargetValue; return process (forceReset); } private: T a0, b1; T z1; T targetValue; bool reset = true; };IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/inPhase.h0000664002537200253720000003451515257173642026411 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once const float inPhase0 = 1.0f; const float inPhase1[4] = { 1.0f, 3.3333333333333331e-01f, 3.3333333333333331e-01f, 3.3333333333333331e-01f, }; const float inPhase2[9] = { 1.0f, 5.0000000000000000e-01f, 5.0000000000000000e-01f, 5.0000000000000000e-01f, 1.0000000000000001e-01f, 1.0000000000000001e-01f, 1.0000000000000001e-01f, 1.0000000000000001e-01f, 1.0000000000000001e-01f }; const float inPhase3[16] = { 1.0f, 5.9999999999999998e-01f, 5.9999999999999998e-01f, 5.9999999999999998e-01f, 2.0000000000000001e-01f, 2.0000000000000001e-01f, 2.0000000000000001e-01f, 2.0000000000000001e-01f, 2.0000000000000001e-01f, 2.8571428571428571e-02f, 2.8571428571428571e-02f, 2.8571428571428571e-02f, 2.8571428571428571e-02f, 2.8571428571428571e-02f, 2.8571428571428571e-02f, 2.8571428571428571e-02f }; const float inPhase4[25] = { 1.0f, 6.6666666666666663e-01f, 6.6666666666666663e-01f, 6.6666666666666663e-01f, 2.8571428571428570e-01f, 2.8571428571428570e-01f, 2.8571428571428570e-01f, 2.8571428571428570e-01f, 2.8571428571428570e-01f, 7.1428571428571425e-02f, 7.1428571428571425e-02f, 7.1428571428571425e-02f, 7.1428571428571425e-02f, 7.1428571428571425e-02f, 7.1428571428571425e-02f, 7.1428571428571425e-02f, 7.9365079365079361e-03f, 7.9365079365079361e-03f, 7.9365079365079361e-03f, 7.9365079365079361e-03f, 7.9365079365079361e-03f, 7.9365079365079361e-03f, 7.9365079365079361e-03f, 7.9365079365079361e-03f, 7.9365079365079361e-03f }; const float inPhase5[36] = { 1.0f, 7.1428571428571430e-01f, 7.1428571428571430e-01f, 7.1428571428571430e-01f, 3.5714285714285715e-01f, 3.5714285714285715e-01f, 3.5714285714285715e-01f, 3.5714285714285715e-01f, 3.5714285714285715e-01f, 1.1904761904761904e-01f, 1.1904761904761904e-01f, 1.1904761904761904e-01f, 1.1904761904761904e-01f, 1.1904761904761904e-01f, 1.1904761904761904e-01f, 1.1904761904761904e-01f, 2.3809523809523808e-02f, 2.3809523809523808e-02f, 2.3809523809523808e-02f, 2.3809523809523808e-02f, 2.3809523809523808e-02f, 2.3809523809523808e-02f, 2.3809523809523808e-02f, 2.3809523809523808e-02f, 2.3809523809523808e-02f, 2.1645021645021645e-03f, 2.1645021645021645e-03f, 2.1645021645021645e-03f, 2.1645021645021645e-03f, 2.1645021645021645e-03f, 2.1645021645021645e-03f, 2.1645021645021645e-03f, 2.1645021645021645e-03f, 2.1645021645021645e-03f, 2.1645021645021645e-03f, 2.1645021645021645e-03f }; const float inPhase6[49] = { 1.0f, 7.5000000000000000e-01f, 7.5000000000000000e-01f, 7.5000000000000000e-01f, 4.1666666666666669e-01f, 4.1666666666666669e-01f, 4.1666666666666669e-01f, 4.1666666666666669e-01f, 4.1666666666666669e-01f, 1.6666666666666666e-01f, 1.6666666666666666e-01f, 1.6666666666666666e-01f, 1.6666666666666666e-01f, 1.6666666666666666e-01f, 1.6666666666666666e-01f, 1.6666666666666666e-01f, 4.5454545454545456e-02f, 4.5454545454545456e-02f, 4.5454545454545456e-02f, 4.5454545454545456e-02f, 4.5454545454545456e-02f, 4.5454545454545456e-02f, 4.5454545454545456e-02f, 4.5454545454545456e-02f, 4.5454545454545456e-02f, 7.5757575757575760e-03f, 7.5757575757575760e-03f, 7.5757575757575760e-03f, 7.5757575757575760e-03f, 7.5757575757575760e-03f, 7.5757575757575760e-03f, 7.5757575757575760e-03f, 7.5757575757575760e-03f, 7.5757575757575760e-03f, 7.5757575757575760e-03f, 7.5757575757575760e-03f, 5.8275058275058275e-04f, 5.8275058275058275e-04f, 5.8275058275058275e-04f, 5.8275058275058275e-04f, 5.8275058275058275e-04f, 5.8275058275058275e-04f, 5.8275058275058275e-04f, 5.8275058275058275e-04f, 5.8275058275058275e-04f, 5.8275058275058275e-04f, 5.8275058275058275e-04f, 5.8275058275058275e-04f, 5.8275058275058275e-04f }; const float inPhase7[64] = { 1.0f, 7.7777777777777779e-01f, 7.7777777777777779e-01f, 7.7777777777777779e-01f, 4.6666666666666667e-01f, 4.6666666666666667e-01f, 4.6666666666666667e-01f, 4.6666666666666667e-01f, 4.6666666666666667e-01f, 2.1212121212121213e-01f, 2.1212121212121213e-01f, 2.1212121212121213e-01f, 2.1212121212121213e-01f, 2.1212121212121213e-01f, 2.1212121212121213e-01f, 2.1212121212121213e-01f, 7.0707070707070704e-02f, 7.0707070707070704e-02f, 7.0707070707070704e-02f, 7.0707070707070704e-02f, 7.0707070707070704e-02f, 7.0707070707070704e-02f, 7.0707070707070704e-02f, 7.0707070707070704e-02f, 7.0707070707070704e-02f, 1.6317016317016316e-02f, 1.6317016317016316e-02f, 1.6317016317016316e-02f, 1.6317016317016316e-02f, 1.6317016317016316e-02f, 1.6317016317016316e-02f, 1.6317016317016316e-02f, 1.6317016317016316e-02f, 1.6317016317016316e-02f, 1.6317016317016316e-02f, 1.6317016317016316e-02f, 2.3310023310023310e-03f, 2.3310023310023310e-03f, 2.3310023310023310e-03f, 2.3310023310023310e-03f, 2.3310023310023310e-03f, 2.3310023310023310e-03f, 2.3310023310023310e-03f, 2.3310023310023310e-03f, 2.3310023310023310e-03f, 2.3310023310023310e-03f, 2.3310023310023310e-03f, 2.3310023310023310e-03f, 2.3310023310023310e-03f, 1.5540015540015540e-04f, 1.5540015540015540e-04f, 1.5540015540015540e-04f, 1.5540015540015540e-04f, 1.5540015540015540e-04f, 1.5540015540015540e-04f, 1.5540015540015540e-04f, 1.5540015540015540e-04f, 1.5540015540015540e-04f, 1.5540015540015540e-04f, 1.5540015540015540e-04f, 1.5540015540015540e-04f, 1.5540015540015540e-04f, 1.5540015540015540e-04f, 1.5540015540015540e-04f }; // as inPhase attenuates higher orders, encoding and sampling at same directions won't result the same amplitude // these are the correction factors for that problem // calculated with the Matlab RUMS toolbox: n = (N + 1)^2; correction = n / sum (inPhase (N, true)); const float inPhaseCorrection[8] = { 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f }; // energy correction // calculated with the Matlab RUMS toolbox: n = (N + 1)^2; correction = sqrt (sqrt ((N+1) / sum (inPhase(N)))); const float inPhaseCorrectionEnergy[8] = { 1.0f, 1.10668192f, 1.17017366f, 1.21614964f, 1.252492535f, 1.28269475f, 1.308620875f, 1.331388035f }; inline void multiplyInPhase (const int N, float* data) { switch (N) { case 0: break; case 1: juce::FloatVectorOperations::multiply (data, inPhase1, 4); break; case 2: juce::FloatVectorOperations::multiply (data, inPhase2, 9); break; case 3: juce::FloatVectorOperations::multiply (data, inPhase3, 16); break; case 4: juce::FloatVectorOperations::multiply (data, inPhase4, 25); break; case 5: juce::FloatVectorOperations::multiply (data, inPhase5, 36); break; case 6: juce::FloatVectorOperations::multiply (data, inPhase6, 47); break; case 7: juce::FloatVectorOperations::multiply (data, inPhase7, 64); break; } } inline void copyInPhase (const int N, float* data) { switch (N) { case 0: *data = 1.0f; break; case 1: juce::FloatVectorOperations::copy (data, inPhase1, 4); break; case 2: juce::FloatVectorOperations::copy (data, inPhase2, 9); break; case 3: juce::FloatVectorOperations::copy (data, inPhase3, 16); break; case 4: juce::FloatVectorOperations::copy (data, inPhase4, 25); break; case 5: juce::FloatVectorOperations::copy (data, inPhase5, 36); break; case 6: juce::FloatVectorOperations::copy (data, inPhase6, 47); break; case 7: juce::FloatVectorOperations::copy (data, inPhase7, 64); break; } } inline const float* getInPhaseLUT (const int N) { switch (N) { case 1: return &inPhase1[0]; case 2: return &inPhase2[0]; case 3: return &inPhase3[0]; case 4: return &inPhase4[0]; case 5: return &inPhase5[0]; case 6: return &inPhase6[0]; case 7: return &inPhase7[0]; default: return &inPhase0; } } IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/AmbisonicRotator.h0000664002537200253720000002373115257173642030277 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Authors: Felix Holzmüller, based on the SceneRotator code by Daniel Rudrich Copyright (c) 2024 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #include #include "Conversions.h" #include "Quaternion.h" #include "ambisonicTools.h" template class AmbisonicRotator { public: AmbisonicRotator() { orderMatrices.add (new juce::dsp::Matrix (0, 0)); // 0th orderMatricesCopy.add (new juce::dsp::Matrix (0, 0)); // 0th for (int l = 1; l <= maxOrder; ++l) { const int nCh = (2 * l + 1); auto elem = orderMatrices.add (new juce::dsp::Matrix (nCh, nCh)); elem->clear(); auto elemCopy = orderMatricesCopy.add (new juce::dsp::Matrix (nCh, nCh)); elemCopy->clear(); } copyBuffer.setSize (maxChannels, maxChannels); }; ~AmbisonicRotator() {}; void process (juce::AudioBuffer* bufferToRotate) { // Get samples per block and actual number of channels const int samples = bufferToRotate->getNumSamples(); const int bufferChannels = bufferToRotate->getNumChannels(); const int workingOrder = juce::jmin (isqrt (bufferToRotate->getNumChannels()) - 1, orderSetting, maxOrder); const int actualChannels = squares[workingOrder + 1]; // Resize copyBuffer if necessary if ((copyBuffer.getNumChannels() != actualChannels) || (copyBuffer.getNumSamples() != samples)) copyBuffer.setSize (actualChannels, samples); // Calculate new rotation matrix if necessary if (workingOrder != orderSetting) { orderSetting = workingOrder; rotationParamsHaveChanged = true; } bool newRotationMatrix = false; if (rotationParamsHaveChanged.get()) { newRotationMatrix = true; calcRotationMatrix (workingOrder); } // make copy of input for (int ch = 0; ch < actualChannels; ++ch) copyBuffer.copyFrom (ch, 0, bufferToRotate->getReadPointer (ch), samples); // clear all channels except first for (int ch = 1; ch < bufferToRotate->getNumChannels(); ++ch) bufferToRotate->clear (ch, 0, samples); // rotate buffer for (int l = 1; l <= workingOrder; ++l) { const int offset = l * l; const int nCh = 2 * l + 1; auto R = orderMatrices[l]; auto Rcopy = orderMatricesCopy[l]; for (int o = 0; o < nCh; ++o) { const int chOut = offset + o; for (int p = 0; p < nCh; ++p) { bufferToRotate->addFromWithRamp (chOut, 0, copyBuffer.getReadPointer (offset + p), samples, Rcopy->operator() (o, p), R->operator() (o, p)); } } } // make copies for fading between old and new matrices if (newRotationMatrix) for (int l = 1; l <= workingOrder; ++l) *orderMatricesCopy[l] = *orderMatrices[l]; } void updateParams (float yaw, float pitch, float roll, float order) { yawRadians = Conversions::degreesToRadians (yaw); pitchRadians = Conversions::degreesToRadians (pitch); rollRadians = Conversions::degreesToRadians (roll); orderSetting = order; rotationParamsHaveChanged = true; } const int getOrder() { return orderSetting; } private: double P (int i, int l, int a, int b, juce::dsp::Matrix& R1, juce::dsp::Matrix& Rlm1) { double ri1 = R1 (i + 1, 2); double rim1 = R1 (i + 1, 0); double ri0 = R1 (i + 1, 1); if (b == -l) return ri1 * Rlm1 (a + l - 1, 0) + rim1 * Rlm1 (a + l - 1, 2 * l - 2); else if (b == l) return ri1 * Rlm1 (a + l - 1, 2 * l - 2) - rim1 * Rlm1 (a + l - 1, 0); else return ri0 * Rlm1 (a + l - 1, b + l - 1); }; double U (int l, int m, int n, juce::dsp::Matrix& Rone, juce::dsp::Matrix& Rlm1) { return P (0, l, m, n, Rone, Rlm1); } double V (int l, int m, int n, juce::dsp::Matrix& Rone, juce::dsp::Matrix& Rlm1) { if (m == 0) { auto p0 = P (1, l, 1, n, Rone, Rlm1); auto p1 = P (-1, l, -1, n, Rone, Rlm1); return p0 + p1; } else if (m > 0) { auto p0 = P (1, l, m - 1, n, Rone, Rlm1); if (m == 1) // d = 1; return p0 * sqrt (2); else // d = 0; return p0 - P (-1, l, 1 - m, n, Rone, Rlm1); } else { auto p1 = P (-1, l, -m - 1, n, Rone, Rlm1); if (m == -1) // d = 1; return p1 * sqrt (2); else // d = 0; return p1 + P (1, l, m + 1, n, Rone, Rlm1); } } double W (int l, int m, int n, juce::dsp::Matrix& Rone, juce::dsp::Matrix& Rlm1) { if (m > 0) { auto p0 = P (1, l, m + 1, n, Rone, Rlm1); auto p1 = P (-1, l, -m - 1, n, Rone, Rlm1); return p0 + p1; } else if (m < 0) { auto p0 = P (1, l, m - 1, n, Rone, Rlm1); auto p1 = P (-1, l, 1 - m, n, Rone, Rlm1); return p0 - p1; } return 0.0; } void calcRotationMatrix (const int order) { auto ca = std::cos (yawRadians); auto cb = std::cos (pitchRadians); auto cy = std::cos (rollRadians); auto sa = std::sin (yawRadians); auto sb = std::sin (pitchRadians); auto sy = std::sin (rollRadians); juce::dsp::Matrix rotMat (3, 3); // if (*rotationSequence >= 0.5f) // roll -> pitch -> yaw (extrinsic rotations) // { // rotMat (0, 0) = ca * cb; // rotMat (1, 0) = sa * cb; // rotMat (2, 0) = -sb; // rotMat (0, 1) = ca * sb * sy - sa * cy; // rotMat (1, 1) = sa * sb * sy + ca * cy; // rotMat (2, 1) = cb * sy; // rotMat (0, 2) = ca * sb * cy + sa * sy; // rotMat (1, 2) = sa * sb * cy - ca * sy; // rotMat (2, 2) = cb * cy; // } // else // yaw -> pitch -> roll (extrinsic rotations) // { rotMat (0, 0) = ca * cb; rotMat (1, 0) = sa * cy + ca * sb * sy; rotMat (2, 0) = sa * sy - ca * sb * cy; rotMat (0, 1) = -sa * cb; rotMat (1, 1) = ca * cy - sa * sb * sy; rotMat (2, 1) = ca * sy + sa * sb * cy; rotMat (0, 2) = sb; rotMat (1, 2) = -cb * sy; rotMat (2, 2) = cb * cy; // } auto Rl = orderMatrices[1]; Rl->operator() (0, 0) = rotMat (1, 1); Rl->operator() (0, 1) = rotMat (1, 2); Rl->operator() (0, 2) = rotMat (1, 0); Rl->operator() (1, 0) = rotMat (2, 1); Rl->operator() (1, 1) = rotMat (2, 2); Rl->operator() (1, 2) = rotMat (2, 0); Rl->operator() (2, 0) = rotMat (0, 1); Rl->operator() (2, 1) = rotMat (0, 2); Rl->operator() (2, 2) = rotMat (0, 0); for (int l = 2; l <= order; ++l) { auto Rone = orderMatrices[1]; auto Rlm1 = orderMatrices[l - 1]; auto Rl = orderMatrices[l]; for (int m = -l; m <= l; ++m) { for (int n = -l; n <= l; ++n) { const int d = (m == 0) ? 1 : 0; double denom; if (abs (n) == l) denom = (2 * l) * (2 * l - 1); else denom = l * l - n * n; double u = sqrt ((l * l - m * m) / denom); double v = sqrt ((1.0 + d) * (l + abs (m) - 1.0) * (l + abs (m)) / denom) * (1.0 - 2.0 * d) * 0.5; double w = sqrt ((l - abs (m) - 1.0) * (l - abs (m)) / denom) * (1.0 - d) * (-0.5); if (u != 0.0) u *= U (l, m, n, *Rone, *Rlm1); if (v != 0.0) v *= V (l, m, n, *Rone, *Rlm1); if (w != 0.0) w *= W (l, m, n, *Rone, *Rlm1); Rl->operator() (m + l, n + l) = u + v + w; } } } rotationParamsHaveChanged = false; } static constexpr int maxChannels = (maxOrder + 1) * (maxOrder + 1); float yawRadians { 0.0f }; float pitchRadians { 0.0f }; float rollRadians { 0.0f }; int orderSetting { 0 }; juce::AudioBuffer copyBuffer; juce::OwnedArray> orderMatrices; juce::OwnedArray> orderMatricesCopy; juce::Atomic rotationParamsHaveChanged { true }; };IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/MaxRE.h0000664002537200253720000003433015257173642025771 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once const float maxre0 = 1.0f; const float maxre1[4] = { 1.0f, 5.7754104119288496e-01f, 5.7754104119288496e-01f, 5.7754104119288496e-01f, }; const float maxre2[9] = { 1.0f, 7.7520766107019334e-01f, 7.7520766107019334e-01f, 7.7520766107019334e-01f, 4.0142037667287966e-01f, 4.0142037667287966e-01f, 4.0142037667287966e-01f, 4.0142037667287966e-01f, 4.0142037667287966e-01f }; const float maxre3[16] = { 1.0f, 8.6155075887658639e-01f, 8.6155075887658639e-01f, 8.6155075887658639e-01f, 6.1340456518123299e-01f, 6.1340456518123299e-01f, 6.1340456518123299e-01f, 6.1340456518123299e-01f, 6.1340456518123299e-01f, 3.0643144179936538e-01f, 3.0643144179936538e-01f, 3.0643144179936538e-01f, 3.0643144179936538e-01f, 3.0643144179936538e-01f, 3.0643144179936538e-01f, 3.0643144179936538e-01f }; const float maxre4[25] = { 1.0f, 9.0644136637224459e-01f, 9.0644136637224459e-01f, 9.0644136637224459e-01f, 7.3245392600617265e-01f, 7.3245392600617265e-01f, 7.3245392600617265e-01f, 7.3245392600617265e-01f, 7.3245392600617265e-01f, 5.0224998490808703e-01f, 5.0224998490808703e-01f, 5.0224998490808703e-01f, 5.0224998490808703e-01f, 5.0224998490808703e-01f, 5.0224998490808703e-01f, 5.0224998490808703e-01f, 2.4736484001129033e-01f, 2.4736484001129033e-01f, 2.4736484001129033e-01f, 2.4736484001129033e-01f, 2.4736484001129033e-01f, 2.4736484001129033e-01f, 2.4736484001129033e-01f, 2.4736484001129033e-01f, 2.4736484001129033e-01f }; const float maxre5[36] = { 1.0f, 9.3263709143129281e-01f, 9.3263709143129281e-01f, 9.3263709143129281e-01f, 8.0471791647013236e-01f, 8.0471791647013236e-01f, 8.0471791647013236e-01f, 8.0471791647013236e-01f, 8.0471791647013236e-01f, 6.2909156744472861e-01f, 6.2909156744472861e-01f, 6.2909156744472861e-01f, 6.2909156744472861e-01f, 6.2909156744472861e-01f, 6.2909156744472861e-01f, 6.2909156744472861e-01f, 4.2321128963220900e-01f, 4.2321128963220900e-01f, 4.2321128963220900e-01f, 4.2321128963220900e-01f, 4.2321128963220900e-01f, 4.2321128963220900e-01f, 4.2321128963220900e-01f, 4.2321128963220900e-01f, 4.2321128963220900e-01f, 2.0719132924646289e-01f, 2.0719132924646289e-01f, 2.0719132924646289e-01f, 2.0719132924646289e-01f, 2.0719132924646289e-01f, 2.0719132924646289e-01f, 2.0719132924646289e-01f, 2.0719132924646289e-01f, 2.0719132924646289e-01f, 2.0719132924646289e-01f, 2.0719132924646289e-01f }; const float maxre6[49] = { 1.0f, 9.4921830632793713e-01f, 9.4921830632793713e-01f, 9.4921830632793713e-01f, 8.5152308960211620e-01f, 8.5152308960211620e-01f, 8.5152308960211620e-01f, 8.5152308960211620e-01f, 8.5152308960211620e-01f, 7.1432330396679700e-01f, 7.1432330396679700e-01f, 7.1432330396679700e-01f, 7.1432330396679700e-01f, 7.1432330396679700e-01f, 7.1432330396679700e-01f, 7.1432330396679700e-01f, 5.4794300713180655e-01f, 5.4794300713180655e-01f, 5.4794300713180655e-01f, 5.4794300713180655e-01f, 5.4794300713180655e-01f, 5.4794300713180655e-01f, 5.4794300713180655e-01f, 5.4794300713180655e-01f, 5.4794300713180655e-01f, 3.6475291657556469e-01f, 3.6475291657556469e-01f, 3.6475291657556469e-01f, 3.6475291657556469e-01f, 3.6475291657556469e-01f, 3.6475291657556469e-01f, 3.6475291657556469e-01f, 3.6475291657556469e-01f, 3.6475291657556469e-01f, 3.6475291657556469e-01f, 3.6475291657556469e-01f, 1.7813609450688817e-01f, 1.7813609450688817e-01f, 1.7813609450688817e-01f, 1.7813609450688817e-01f, 1.7813609450688817e-01f, 1.7813609450688817e-01f, 1.7813609450688817e-01f, 1.7813609450688817e-01f, 1.7813609450688817e-01f, 1.7813609450688817e-01f, 1.7813609450688817e-01f, 1.7813609450688817e-01f, 1.7813609450688817e-01f }; const float maxre7[64] = { 1.0f, 9.6036452263662697e-01f, 9.6036452263662697e-01f, 9.6036452263662697e-01f, 8.8345002450861454e-01f, 8.8345002450861454e-01f, 8.8345002450861454e-01f, 8.8345002450861454e-01f, 8.8345002450861454e-01f, 7.7381375334313540e-01f, 7.7381375334313540e-01f, 7.7381375334313540e-01f, 7.7381375334313540e-01f, 7.7381375334313540e-01f, 7.7381375334313540e-01f, 7.7381375334313540e-01f, 6.3791321433685355e-01f, 6.3791321433685355e-01f, 6.3791321433685355e-01f, 6.3791321433685355e-01f, 6.3791321433685355e-01f, 6.3791321433685355e-01f, 6.3791321433685355e-01f, 6.3791321433685355e-01f, 6.3791321433685355e-01f, 4.8368159255186721e-01f, 4.8368159255186721e-01f, 4.8368159255186721e-01f, 4.8368159255186721e-01f, 4.8368159255186721e-01f, 4.8368159255186721e-01f, 4.8368159255186721e-01f, 4.8368159255186721e-01f, 4.8368159255186721e-01f, 4.8368159255186721e-01f, 4.8368159255186721e-01f, 3.2000849790781744e-01f, 3.2000849790781744e-01f, 3.2000849790781744e-01f, 3.2000849790781744e-01f, 3.2000849790781744e-01f, 3.2000849790781744e-01f, 3.2000849790781744e-01f, 3.2000849790781744e-01f, 3.2000849790781744e-01f, 3.2000849790781744e-01f, 3.2000849790781744e-01f, 3.2000849790781744e-01f, 3.2000849790781744e-01f, 1.5616185043093761e-01f, 1.5616185043093761e-01f, 1.5616185043093761e-01f, 1.5616185043093761e-01f, 1.5616185043093761e-01f, 1.5616185043093761e-01f, 1.5616185043093761e-01f, 1.5616185043093761e-01f, 1.5616185043093761e-01f, 1.5616185043093761e-01f, 1.5616185043093761e-01f, 1.5616185043093761e-01f, 1.5616185043093761e-01f, 1.5616185043093761e-01f, 1.5616185043093761e-01f }; // as max re attenuates higher orders, encoding and sampling at same directions won't result the same amplitude // these are the correction factors for that problem // calculated with the Matlab RUMS toolbox: n = (N + 1)^2; correction = n / sum (maxrE (N, true)); const float maxRECorrection[8] = { 1.0f, 1.463794976147894f, 1.687692544652202f, 1.818864885628318f, 1.904961155192695f, 1.965800739863925f, 2.011075537215868f, 2.046081944498225f }; // energy correction // calculated with the Matlab RUMS toolbox: n = (N + 1)^2; correction = sqrt (sqrt ((N+1) / sum (maxrE(N)))); const float maxRECorrectionEnergy[8] = { 1.0f, 1.061114703f, 1.083513331f, 1.095089593f, 1.102148983f, 1.106899961f, 1.110314372f, 1.112886124f }; inline void multiplyMaxRE (const int N, float* data) { switch (N) { case 0: break; case 1: juce::FloatVectorOperations::multiply (data, maxre1, 4); break; case 2: juce::FloatVectorOperations::multiply (data, maxre2, 9); break; case 3: juce::FloatVectorOperations::multiply (data, maxre3, 16); break; case 4: juce::FloatVectorOperations::multiply (data, maxre4, 25); break; case 5: juce::FloatVectorOperations::multiply (data, maxre5, 36); break; case 6: juce::FloatVectorOperations::multiply (data, maxre6, 47); break; case 7: juce::FloatVectorOperations::multiply (data, maxre7, 64); break; } } inline void copyMaxRE (const int N, float* data) { switch (N) { case 0: *data = 1.0f; break; case 1: juce::FloatVectorOperations::copy (data, maxre1, 4); break; case 2: juce::FloatVectorOperations::copy (data, maxre2, 9); break; case 3: juce::FloatVectorOperations::copy (data, maxre3, 16); break; case 4: juce::FloatVectorOperations::copy (data, maxre4, 25); break; case 5: juce::FloatVectorOperations::copy (data, maxre5, 36); break; case 6: juce::FloatVectorOperations::copy (data, maxre6, 47); break; case 7: juce::FloatVectorOperations::copy (data, maxre7, 64); break; } } inline const float* getMaxRELUT (const int N) { switch (N) { case 1: return &maxre1[0]; case 2: return &maxre2[0]; case 3: return &maxre3[0]; case 4: return &maxre4[0]; case 5: return &maxre5[0]; case 6: return &maxre6[0]; case 7: return &maxre7[0]; default: return &maxre0; } } IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/Weights.h0000664002537200253720000002323715257173642026433 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2018 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once #ifndef sqrt4PI #define sqrt4PI 3.544907701811032 #endif namespace Weights { constexpr const static float maxRe[8][8] = { { 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f }, { 1.0f, 5.7754104119288496e-01f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f }, { 1.0f, 7.7520766107019334e-01f, 4.0142037667287966e-01f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f }, { 1.0f, 8.6155075887658639e-01f, 6.1340456518123299e-01f, 3.0643144179936538e-01f, 0.0f, 0.0f, 0.0f, 0.0f }, { 1.0f, 9.0644136637224459e-01f, 7.3245392600617265e-01f, 5.0224998490808703e-01f, 2.4736484001129033e-01f, 0.0f, 0.0f, 0.0f }, { 1.0f, 9.3263709143129281e-01f, 8.0471791647013236e-01f, 6.2909156744472861e-01f, 4.2321128963220900e-01f, 2.0719132924646289e-01f, 0.0f, 0.0f }, { 1.0f, 9.4921830632793713e-01f, 8.5152308960211620e-01f, 7.1432330396679700e-01f, 5.4794300713180655e-01f, 3.6475291657556469e-01f, 1.7813609450688817e-01f, 0.0f }, { 1.0f, 9.6036452263662697e-01f, 8.8345002450861454e-01f, 7.7381375334313540e-01f, 6.3791321433685355e-01f, 4.8368159255186721e-01f, 3.2000849790781744e-01f, 1.5616185043093761e-01f } }; constexpr const static float inPhase[8][8] = { { 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f }, { 1.0f, 3.3333333333333331e-01f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f }, { 1.0f, 5.0000000000000000e-01f, 1.0000000000000001e-01f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f }, { 1.0f, 5.9999999999999998e-01f, 2.0000000000000001e-01f, 2.8571428571428571e-02f, 0.0f, 0.0f, 0.0f, 0.0f }, { 1.0f, 6.6666666666666663e-01f, 2.8571428571428570e-01f, 7.1428571428571425e-02f, 7.9365079365079361e-03f, 0.0f, 0.0f, 0.0f }, { 1.0f, 7.1428571428571430e-01f, 3.5714285714285715e-01f, 1.1904761904761904e-01f, 2.3809523809523808e-02f, 2.1645021645021645e-03f, 0.0f, 0.0f }, { 1.0f, 7.5000000000000000e-01f, 4.1666666666666669e-01f, 1.6666666666666666e-01f, 4.5454545454545456e-02f, 7.5757575757575760e-03f, 5.8275058275058275e-04f, 0.0f }, { 1.0f, 7.7777777777777779e-01f, 4.6666666666666667e-01f, 2.1212121212121213e-01f, 7.0707070707070704e-02f, 1.6317016317016316e-02f, 2.3310023310023310e-03f, 1.5540015540015540e-04f } }; constexpr const static float basic[8][8] = { { 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f }, { 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f }, { 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f }, { 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f }, { 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f }, { 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f }, { 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f }, { 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f }, }; static constexpr const float n3d2sn3d[8] = { 1.0000000000000000e+00f, 5.7735026918962584e-01f, 4.4721359549995793e-01f, 3.7796447300922720e-01f, 3.3333333333333331e-01f, 3.0151134457776363e-01f, 2.7735009811261457e-01f, 2.5819888974716110e-01f }; } // namespace Weights struct WeightsHelper { public: enum Normalization { BasicDecode, OnAxis, ConstantEnergy }; static void applyNormalization (float* weights, const float order, const int decodeOrder, const Normalization normalization, const bool useSN3D = false) { float orderBlend, integer; orderBlend = modff (order, &integer); int lowerOrder = juce::roundToInt (integer); if (lowerOrder == 7) { lowerOrder = 6; orderBlend = 1.0f; } int higherOrder = lowerOrder + 1; if (normalization == Normalization::BasicDecode) { const float correction = decodeCorrection (order) / decodeCorrection (decodeOrder); for (int i = 0; i <= decodeOrder; ++i) weights[i] *= correction; } else if (normalization == Normalization::OnAxis) { const float ssqrt4PI = 3.544907701811032f; float correction; float sum = 0.0f; for (int i = 0; i <= decodeOrder; ++i) sum += (2 * i + 1) * weights[i]; if (higherOrder > decodeOrder) correction = ssqrt4PI * decodeCorrection (order) / decodeCorrection (decodeOrder) / decodeCorrection (decodeOrder); else correction = ssqrt4PI / decodeCorrection (decodeOrder); correction = correction / sum; for (int i = 0; i <= decodeOrder; ++i) weights[i] *= correction; } else // ConstantEnergy { float sum = 0.0f; for (int i = 0; i <= decodeOrder; ++i) sum += weights[i] * weights[i] * (2 * i + 1); sum = 1.0f / sqrt (sum) * (decodeOrder + 1); for (int i = 0; i < decodeOrder; ++i) weights[i] *= sum; } if (useSN3D) // apply SN3D normalization { juce::FloatVectorOperations::multiply (weights, Weights::n3d2sn3d, decodeOrder + 1); } } static void getWeights (const float order, const float shape, float* dest, const int decodeOrder, Normalization normalization) { float weights[8]; for (int i = 0; i <= decodeOrder; ++i) weights[i] = 0.0f; getWeights (order, shape, weights); // Normalization applyNormalization (weights, order, decodeOrder, normalization); // for (int i = 0; i <= decodeOrder; ++i) dest[i] = weights[i]; } /** Returns number of weights shape: 0: basic, 0.5: maxrE, 1.0: inPhase */ static int getWeights (const float order, const float shape, float* dest) { float orderBlend, integer; modff (order, &integer); orderBlend = getFractionalOrderBlendFactor (order); int lowerOrder = juce::roundToInt (integer); if (lowerOrder == 7) { lowerOrder = 6; orderBlend = 1.0f; } int higherOrder = lowerOrder + 1; float tempWeights[8]; if (shape >= 0.5f) { const float blend = shape * 2.0f - 1.0f; for (int i = 0; i <= higherOrder; ++i) { tempWeights[i] = (1.0f - blend) * Weights::maxRe[lowerOrder][i] + blend * Weights::inPhase[lowerOrder][i]; tempWeights[i] *= (1.0f - orderBlend); tempWeights[i] += orderBlend * ((1.0f - blend) * Weights::maxRe[higherOrder][i] + blend * Weights::inPhase[higherOrder][i]); ; } } else { const float blend = shape * 2.0f; for (int i = 0; i <= higherOrder; ++i) { tempWeights[i] = (1.0f - blend) * Weights::basic[lowerOrder][i] + blend * Weights::maxRe[lowerOrder][i]; tempWeights[i] *= (1.0f - orderBlend); tempWeights[i] += orderBlend * ((1.0f - blend) * Weights::basic[higherOrder][i] + blend * Weights::maxRe[higherOrder][i]); ; } } // copy weights to destination for (int i = 0; i <= higherOrder; ++i) { dest[i] = tempWeights[i]; } return higherOrder + 1; } static float decodeCorrection (const float N) { return sqrt4PI / (N + 1.0f) / (N + 1.0f); }; private: /* Returns the correction optimized order blend factor for the fractional order N. */ static float getFractionalOrderBlendFactor (const float N) { float f, n; f = modff (N, &n); return getFractionalOrderBlendFactor (n, f); } /* Returns the correction optimized order blend factor for fractional orders. */ static float getFractionalOrderBlendFactor (const float truncatedOrder, const float fraction) { return fraction * (fraction + 2 * truncatedOrder + 2) / (2 * truncatedOrder + 3); } }; IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/heatmap.h0000664002537200253720000016716515257173642026451 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2018 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ /* This data originates from https://matplotlib.org/examples/color/colormaps_reference.html. The following rgb color data is cropped and stretched. */ #pragma once const float heatmap[256][4] = { { 5.2941176470588236e-01, 8.0784313725490198e-01, 9.2156862745098034e-01, 0.0000000000000000e+00 }, { 5.2941176470588236e-01, 8.0784313725490198e-01, 9.2156862745098034e-01, 5.4901960784313726e-03 }, { 5.2941176470588236e-01, 8.0784313725490198e-01, 9.2156862745098034e-01, 1.0980392156862745e-02 }, { 5.2941176470588236e-01, 8.0784313725490198e-01, 9.2156862745098034e-01, 1.6470588235294119e-02 }, { 5.2941176470588236e-01, 8.0784313725490198e-01, 9.2156862745098034e-01, 2.1960784313725491e-02 }, { 5.2941176470588236e-01, 8.0784313725490198e-01, 9.2156862745098034e-01, 2.7450980392156866e-02 }, { 5.2941176470588236e-01, 8.0784313725490198e-01, 9.2156862745098034e-01, 3.2941176470588238e-02 }, { 5.2941176470588236e-01, 8.0784313725490198e-01, 9.2156862745098034e-01, 3.8431372549019613e-02 }, { 5.2941176470588236e-01, 8.0784313725490198e-01, 9.2156862745098034e-01, 4.3921568627450981e-02 }, { 5.2941176470588236e-01, 8.0784313725490198e-01, 9.2156862745098034e-01, 4.9411764705882356e-02 }, { 5.2941176470588236e-01, 8.0784313725490198e-01, 9.2156862745098034e-01, 5.4901960784313732e-02 }, { 5.2941176470588236e-01, 8.0784313725490198e-01, 9.2156862745098034e-01, 6.0392156862745107e-02 }, { 5.2941176470588236e-01, 8.0784313725490198e-01, 9.2156862745098034e-01, 6.5882352941176475e-02 }, { 5.2941176470588236e-01, 8.0784313725490198e-01, 9.2156862745098034e-01, 7.1372549019607850e-02 }, { 5.2941176470588236e-01, 8.0784313725490198e-01, 9.2156862745098034e-01, 7.6862745098039226e-02 }, { 5.2941176470588236e-01, 8.0784313725490198e-01, 9.2156862745098034e-01, 8.2352941176470601e-02 }, { 5.2941176470588236e-01, 8.0784313725490198e-01, 9.2156862745098034e-01, 8.7843137254901962e-02 }, { 5.2941176470588236e-01, 8.0784313725490198e-01, 9.2156862745098034e-01, 9.3333333333333338e-02 }, { 5.2941176470588236e-01, 8.0784313725490198e-01, 9.2156862745098034e-01, 9.8823529411764713e-02 }, { 5.2941176470588236e-01, 8.0784313725490198e-01, 9.2156862745098034e-01, 1.0431372549019609e-01 }, { 5.2941176470588236e-01, 8.0784313725490198e-01, 9.2156862745098034e-01, 1.0980392156862746e-01 }, { 5.2941176470588236e-01, 8.0784313725490198e-01, 9.2156862745098034e-01, 1.1529411764705884e-01 }, { 5.2941176470588236e-01, 8.0784313725490198e-01, 9.2156862745098034e-01, 1.2078431372549021e-01 }, { 5.2941176470588236e-01, 8.0784313725490198e-01, 9.2156862745098034e-01, 1.2627450980392158e-01 }, { 5.2941176470588236e-01, 8.0784313725490198e-01, 9.2156862745098034e-01, 1.3176470588235295e-01 }, { 5.2941176470588236e-01, 8.0784313725490198e-01, 9.2156862745098034e-01, 1.3725490196078433e-01 }, { 5.2941176470588236e-01, 8.0784313725490198e-01, 9.2156862745098034e-01, 1.4274509803921570e-01 }, { 5.2941176470588236e-01, 8.0784313725490198e-01, 9.2156862745098034e-01, 1.4823529411764708e-01 }, { 5.2941176470588236e-01, 8.0784313725490198e-01, 9.2156862745098034e-01, 1.5372549019607845e-01 }, { 5.2941176470588236e-01, 8.0784313725490198e-01, 9.2156862745098034e-01, 1.5921568627450983e-01 }, { 5.2941176470588236e-01, 8.0784313725490198e-01, 9.2156862745098034e-01, 1.6470588235294120e-01 }, { 5.2941176470588236e-01, 8.0784313725490198e-01, 9.2156862745098034e-01, 1.7019607843137258e-01 }, { 5.2941176470588236e-01, 8.0784313725490198e-01, 9.2156862745098034e-01, 1.7568627450980392e-01 }, { 5.2941176470588236e-01, 8.0784313725490198e-01, 9.2156862745098034e-01, 1.8117647058823533e-01 }, { 5.2941176470588236e-01, 8.0784313725490198e-01, 9.2156862745098034e-01, 1.8666666666666668e-01 }, { 5.2941176470588236e-01, 8.0784313725490198e-01, 9.2156862745098034e-01, 1.9215686274509808e-01 }, { 5.2941176470588236e-01, 8.0784313725490198e-01, 9.2156862745098034e-01, 1.9764705882352943e-01 }, { 5.2941176470588236e-01, 8.0784313725490198e-01, 9.2156862745098034e-01, 2.0156862745098042e-01 }, { 5.2941176470588236e-01, 8.0784313725490198e-01, 9.2156862745098034e-01, 2.0431372549019611e-01 }, { 5.2941176470588236e-01, 8.0784313725490198e-01, 9.2156862745098034e-01, 2.0705882352941177e-01 }, { 5.2941176470588236e-01, 8.0784313725490198e-01, 9.2156862745098034e-01, 2.0980392156862746e-01 }, { 5.2941176470588236e-01, 8.0784313725490198e-01, 9.2156862745098034e-01, 2.1254901960784317e-01 }, { 5.2941176470588236e-01, 8.0784313725490198e-01, 9.2156862745098034e-01, 2.1529411764705886e-01 }, { 5.2941176470588236e-01, 8.0784313725490198e-01, 9.2156862745098034e-01, 2.1803921568627455e-01 }, { 5.2941176470588236e-01, 8.0784313725490198e-01, 9.2156862745098034e-01, 2.2078431372549023e-01 }, { 5.2941176470588236e-01, 8.0784313725490198e-01, 9.2156862745098034e-01, 2.2352941176470592e-01 }, { 5.2941176470588236e-01, 8.0784313725490198e-01, 9.2156862745098034e-01, 2.2627450980392155e-01 }, { 5.2941176470588236e-01, 8.0784313725490198e-01, 9.2156862745098034e-01, 2.2901960784313727e-01 }, { 5.2941176470588236e-01, 8.0784313725490198e-01, 9.2156862745098034e-01, 2.3176470588235296e-01 }, { 5.2941176470588236e-01, 8.0784313725490198e-01, 9.2156862745098034e-01, 2.3450980392156864e-01 }, { 5.2941176470588236e-01, 8.0784313725490198e-01, 9.2156862745098034e-01, 2.3725490196078433e-01 }, { 5.2941176470588236e-01, 8.0784313725490198e-01, 9.2156862745098034e-01, 2.4000000000000002e-01 }, { 5.2941176470588236e-01, 8.0784313725490198e-01, 9.2156862745098034e-01, 2.4274509803921568e-01 }, { 5.2941176470588236e-01, 8.0784313725490198e-01, 9.2156862745098034e-01, 2.4549019607843137e-01 }, { 5.2941176470588236e-01, 8.0784313725490198e-01, 9.2156862745098034e-01, 2.4823529411764705e-01 }, { 5.2941176470588236e-01, 8.0784313725490198e-01, 9.2156862745098034e-01, 2.5098039215686274e-01 }, { 5.2941176470588236e-01, 8.0784313725490198e-01, 9.2156862745098034e-01, 2.5372549019607843e-01 }, { 5.2941176470588236e-01, 8.0784313725490198e-01, 9.2156862745098034e-01, 2.5647058823529412e-01 }, { 5.2941176470588236e-01, 8.0784313725490198e-01, 9.2156862745098034e-01, 2.5921568627450980e-01 }, { 5.2941176470588236e-01, 8.0784313725490198e-01, 9.2156862745098034e-01, 2.6196078431372549e-01 }, { 5.2941176470588236e-01, 8.0784313725490198e-01, 9.2156862745098034e-01, 2.6470588235294118e-01 }, { 5.2941176470588236e-01, 8.0784313725490198e-01, 9.2156862745098034e-01, 2.6745098039215687e-01 }, { 5.2941176470588236e-01, 8.0784313725490198e-01, 9.2156862745098034e-01, 2.7019607843137255e-01 }, { 5.2941176470588236e-01, 8.0784313725490198e-01, 9.2156862745098034e-01, 2.7294117647058824e-01 }, { 5.2941176470588236e-01, 8.0784313725490198e-01, 9.2156862745098034e-01, 2.7568627450980393e-01 }, { 5.2941176470588236e-01, 8.0784313725490198e-01, 9.2156862745098034e-01, 2.7843137254901962e-01 }, { 5.2941176470588236e-01, 8.0784313725490198e-01, 9.2156862745098034e-01, 2.8117647058823531e-01 }, { 5.2941176470588236e-01, 8.0784313725490198e-01, 9.2156862745098034e-01, 2.8392156862745094e-01 }, { 5.2941176470588236e-01, 8.0784313725490198e-01, 9.2156862745098034e-01, 2.8666666666666668e-01 }, { 5.2941176470588236e-01, 8.0784313725490198e-01, 9.2156862745098034e-01, 2.8941176470588231e-01 }, { 5.2941176470588236e-01, 8.0784313725490198e-01, 9.2156862745098034e-01, 2.9215686274509806e-01 }, { 5.2941176470588236e-01, 8.0784313725490198e-01, 9.2156862745098034e-01, 2.9490196078431369e-01 }, { 5.2941176470588236e-01, 8.0784313725490198e-01, 9.2156862745098034e-01, 2.9764705882352943e-01 }, { 5.2799054209919261e-01, 8.0710649750096120e-01, 9.1825659361783929e-01, 3.0274509803921568e-01 }, { 5.1804198385236444e-01, 8.0195001922337550e-01, 8.9507235678585129e-01, 3.2196078431372566e-01 }, { 5.0809342560553628e-01, 7.9679354094579002e-01, 8.7188811995386362e-01, 3.4117647058823541e-01 }, { 4.9814486735870811e-01, 7.9163706266820444e-01, 8.4870388312187606e-01, 3.6039215686274512e-01 }, { 4.8819630911188000e-01, 7.8648058439061896e-01, 8.2551964628988839e-01, 3.7960784313725487e-01 }, { 4.7824775086505183e-01, 7.8132410611303349e-01, 8.0233540945790061e-01, 3.9882352941176491e-01 }, { 4.6829919261822373e-01, 7.7616762783544790e-01, 7.7915117262591294e-01, 4.1803921568627461e-01 }, { 4.5835063437139562e-01, 7.7101114955786232e-01, 7.5596693579392538e-01, 4.3725490196078437e-01 }, { 4.4840207612456751e-01, 7.6585467128027673e-01, 7.3278269896193771e-01, 4.5647058823529407e-01 }, { 4.3845351787773928e-01, 7.6069819300269126e-01, 7.0959846212994981e-01, 4.7568627450980416e-01 }, { 4.2850495963091112e-01, 7.5554171472510567e-01, 6.8641422529796214e-01, 4.9490196078431387e-01 }, { 4.1855640138408301e-01, 7.5038523644752031e-01, 6.6322998846597458e-01, 5.1411764705882357e-01 }, { 4.0860784313725496e-01, 7.4522875816993472e-01, 6.4004575163398691e-01, 5.3333333333333333e-01 }, { 3.9865928489042668e-01, 7.4007227989234903e-01, 6.1686151480199902e-01, 5.5254901960784331e-01 }, { 3.8871072664359857e-01, 7.3491580161476344e-01, 5.9367727797001135e-01, 5.7176470588235306e-01 }, { 3.7876216839677046e-01, 7.2975932333717797e-01, 5.7049304113802379e-01, 5.9098039215686282e-01 }, { 3.6881361014994235e-01, 7.2460284505959249e-01, 5.4730880430603612e-01, 6.1019607843137247e-01 }, { 3.5886505190311407e-01, 7.1944636678200680e-01, 5.2412456747404812e-01, 6.2941176470588256e-01 }, { 3.4891649365628596e-01, 7.1428988850442132e-01, 5.0094033064206056e-01, 6.4862745098039221e-01 }, { 3.3896793540945785e-01, 7.0913341022683585e-01, 4.7775609381007289e-01, 6.6784313725490208e-01 }, { 3.2901937716262974e-01, 7.0397693194925037e-01, 4.5457185697808533e-01, 6.8705882352941172e-01 }, { 3.1907081891580152e-01, 6.9882045367166468e-01, 4.3138762014609738e-01, 7.0627450980392181e-01 }, { 3.0912226066897341e-01, 6.9366397539407920e-01, 4.0820338331410977e-01, 7.2549019607843146e-01 }, { 2.9917370242214530e-01, 6.8850749711649373e-01, 3.8501914648212221e-01, 7.4470588235294122e-01 }, { 2.8922514417531719e-01, 6.8335101883890814e-01, 3.6183490965013460e-01, 7.6392156862745098e-01 }, { 2.7927658592848892e-01, 6.7819454056132256e-01, 3.3865067281814654e-01, 7.8313725490196107e-01 }, { 2.6932802768166081e-01, 6.7303806228373697e-01, 3.1546643598615898e-01, 8.0235294117647071e-01 }, { 2.5937946943483270e-01, 6.6788158400615139e-01, 2.9228219915417136e-01, 8.2156862745098047e-01 }, { 2.4943091118800462e-01, 6.6272510572856591e-01, 2.6909796232218375e-01, 8.4078431372549023e-01 }, { 2.3948235294117637e-01, 6.5756862745098033e-01, 2.4591372549019583e-01, 8.6000000000000021e-01 }, { 2.2953379469434826e-01, 6.5241214917339485e-01, 2.2272948865820824e-01, 8.7921568627450997e-01 }, { 2.1958523644752015e-01, 6.4725567089580927e-01, 1.9954525182622063e-01, 8.9843137254901961e-01 }, { 2.0963667820069207e-01, 6.4209919261822368e-01, 1.7636101499423301e-01, 9.1764705882352937e-01 }, { 1.9968811995386376e-01, 6.3694271434063809e-01, 1.5317677816224501e-01, 9.3686274509803946e-01 }, { 1.8973956170703571e-01, 6.3178623606305262e-01, 1.2999254133025739e-01, 9.5607843137254922e-01 }, { 1.7979100346020757e-01, 6.2662975778546715e-01, 1.0680830449826978e-01, 9.7529411764705887e-01 }, { 1.6984244521337946e-01, 6.2147327950788156e-01, 8.3624067666282179e-02, 9.9450980392156862e-01 }, { 1.6700000000000001e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 1.0000000000000000e+00 }, { 1.6700000000000001e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 1.0000000000000000e+00 }, { 1.6700000000000001e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 1.0000000000000000e+00 }, { 1.6700000000000001e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 1.0000000000000000e+00 }, { 1.6700000000000001e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 1.0000000000000000e+00 }, { 1.6700000000000001e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 1.0000000000000000e+00 }, { 1.6700000000000001e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 1.0000000000000000e+00 }, { 1.6700000000000001e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 1.0000000000000000e+00 }, { 1.6700000000000001e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 1.0000000000000000e+00 }, { 1.6700000000000001e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 1.0000000000000000e+00 }, { 1.6700000000000001e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 1.0000000000000000e+00 }, { 1.6700000000000001e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 1.0000000000000000e+00 }, { 1.6700000000000001e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 1.0000000000000000e+00 }, { 1.6700000000000001e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 1.0000000000000000e+00 }, { 1.6700000000000001e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 1.0000000000000000e+00 }, { 1.6700000000000001e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 1.0000000000000000e+00 }, { 1.6700000000000001e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 1.0000000000000000e+00 }, { 1.6700000000000001e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 1.0000000000000000e+00 }, { 1.6700000000000001e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 1.0000000000000000e+00 }, { 1.6700000000000001e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 1.0000000000000000e+00 }, { 1.6700000000000001e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 1.0000000000000000e+00 }, { 1.6700000000000001e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 1.0000000000000000e+00 }, { 1.6700000000000001e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 1.0000000000000000e+00 }, { 1.6700000000000001e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 1.0000000000000000e+00 }, { 1.6700000000000001e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 1.0000000000000000e+00 }, { 1.6700000000000001e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 1.0000000000000000e+00 }, { 1.6700000000000001e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 1.0000000000000000e+00 }, { 1.6700000000000001e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 1.0000000000000000e+00 }, { 1.6700000000000001e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 1.0000000000000000e+00 }, { 1.6700000000000001e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 1.0000000000000000e+00 }, { 1.6700000000000001e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 1.0000000000000000e+00 }, { 1.6700000000000001e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 1.0000000000000000e+00 }, { 1.6700000000000001e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 1.0000000000000000e+00 }, { 1.6700000000000001e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 1.0000000000000000e+00 }, { 1.6700000000000001e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 1.0000000000000000e+00 }, { 1.6700000000000001e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 1.0000000000000000e+00 }, { 1.7196470588235294e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 9.9843137254901959e-01 }, { 1.8934117647058815e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 9.9294117647058822e-01 }, { 2.0671764705882387e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 9.8745098039215673e-01 }, { 2.2409411764705911e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 9.8196078431372535e-01 }, { 2.4147058823529433e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 9.7647058823529398e-01 }, { 2.5884705882352954e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 9.7098039215686271e-01 }, { 2.7622352941176481e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 9.6549019607843145e-01 }, { 2.9360000000000008e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 9.6000000000000008e-01 }, { 3.1097647058823524e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 9.5450980392156870e-01 }, { 3.2835294117647046e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 9.4901960784313732e-01 }, { 3.4572941176470617e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 9.4352941176470584e-01 }, { 3.6310588235294139e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 9.3803921568627446e-01 }, { 3.8048235294117660e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 9.3254901960784309e-01 }, { 3.9785882352941193e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 9.2705882352941171e-01 }, { 4.1523529411764709e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 9.2156862745098045e-01 }, { 4.3261176470588236e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 9.1607843137254918e-01 }, { 4.4998823529411758e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 9.1058823529411770e-01 }, { 4.6736470588235279e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 9.0509803921568643e-01 }, { 4.8474117647058845e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 8.9960784313725484e-01 }, { 5.0211764705882367e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 8.9411764705882346e-01 }, { 5.1949411764705888e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 8.8862745098039220e-01 }, { 5.3687058823529421e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 8.8313725490196082e-01 }, { 5.5424705882352943e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 8.7764705882352945e-01 }, { 5.7162352941176464e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 8.7215686274509807e-01 }, { 5.8899999999999986e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 8.6666666666666670e-01 }, { 6.0637647058823518e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 8.6117647058823543e-01 }, { 6.2375294117647073e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 8.5568627450980383e-01 }, { 6.4112941176470606e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 8.5019607843137257e-01 }, { 6.5850588235294127e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 8.4470588235294120e-01 }, { 6.7588235294117649e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 8.3921568627450982e-01 }, { 6.9325882352941171e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 8.3372549019607844e-01 }, { 7.1063529411764692e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 8.2823529411764718e-01 }, { 7.2801176470588214e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 8.2274509803921581e-01 }, { 7.4538823529411735e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 8.1725490196078443e-01 }, { 7.6276470588235312e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 8.1176470588235294e-01 }, { 7.8014117647058834e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 8.0627450980392157e-01 }, { 7.9751764705882355e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 8.0078431372549019e-01 }, { 8.0000000000000004e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 8.0470588235294116e-01 }, { 8.0000000000000004e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 8.1019607843137254e-01 }, { 8.0000000000000004e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 8.1568627450980391e-01 }, { 8.0000000000000004e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 8.2117647058823529e-01 }, { 8.0000000000000004e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 8.2666666666666666e-01 }, { 8.0000000000000004e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 8.3215686274509815e-01 }, { 8.0000000000000004e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 8.3764705882352952e-01 }, { 8.0000000000000004e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 8.4313725490196090e-01 }, { 8.0000000000000004e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 8.4862745098039216e-01 }, { 8.0000000000000004e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 8.5411764705882354e-01 }, { 8.0000000000000004e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 8.5960784313725491e-01 }, { 8.0000000000000004e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 8.6509803921568640e-01 }, { 8.0000000000000004e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 8.7058823529411766e-01 }, { 8.0000000000000004e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 8.7607843137254915e-01 }, { 8.0000000000000004e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 8.8156862745098041e-01 }, { 8.0000000000000004e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 8.8705882352941179e-01 }, { 8.0000000000000004e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 8.9254901960784316e-01 }, { 8.0000000000000004e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 8.9803921568627454e-01 }, { 8.0000000000000004e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 9.0352941176470591e-01 }, { 8.0000000000000004e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 9.0901960784313718e-01 }, { 8.0000000000000004e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 9.1450980392156866e-01 }, { 8.0000000000000004e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 9.2000000000000015e-01 }, { 8.0000000000000004e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 9.2549019607843142e-01 }, { 8.0000000000000004e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 9.3098039215686290e-01 }, { 8.0000000000000004e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 9.3647058823529417e-01 }, { 8.0000000000000004e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 9.4196078431372554e-01 }, { 8.0000000000000004e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 9.4745098039215692e-01 }, { 8.0000000000000004e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 9.5294117647058818e-01 }, { 8.0000000000000004e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 9.5843137254901956e-01 }, { 8.0000000000000004e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 9.6392156862745115e-01 }, { 8.0000000000000004e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 9.6941176470588242e-01 }, { 8.0000000000000004e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 9.7490196078431379e-01 }, { 8.0000000000000004e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 9.8039215686274517e-01 }, { 8.0000000000000004e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 9.8588235294117654e-01 }, { 8.0000000000000004e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 9.9137254901960792e-01 }, { 8.0000000000000004e-01, 6.2000000000000000e-01, 7.6999999999999999e-02, 9.9686274509803918e-01 }, { 8.0235294117647060e-01, 6.1270588235294121e-01, 7.6094117647058826e-02, 1.0000000000000000e+00 }, { 8.0784313725490209e-01, 5.9568627450980349e-01, 7.3980392156862695e-02, 1.0000000000000000e+00 }, { 8.1333333333333346e-01, 5.7866666666666633e-01, 7.1866666666666620e-02, 1.0000000000000000e+00 }, { 8.1882352941176484e-01, 5.6164705882352917e-01, 6.9752941176470559e-02, 1.0000000000000000e+00 }, { 8.2431372549019621e-01, 5.4462745098039189e-01, 6.7639215686274484e-02, 1.0000000000000000e+00 }, { 8.2980392156862748e-01, 5.2760784313725484e-01, 6.5525490196078423e-02, 1.0000000000000000e+00 }, { 8.3529411764705896e-01, 5.1058823529411757e-01, 6.3411764705882348e-02, 1.0000000000000000e+00 }, { 8.4078431372549023e-01, 4.9356862745098040e-01, 6.1298039215686280e-02, 1.0000000000000000e+00 }, { 8.4627450980392160e-01, 4.7654901960784324e-01, 5.9184313725490205e-02, 1.0000000000000000e+00 }, { 8.5176470588235309e-01, 4.5952941176470558e-01, 5.7070588235294074e-02, 1.0000000000000000e+00 }, { 8.5725490196078447e-01, 4.4250980392156836e-01, 5.4956862745098006e-02, 1.0000000000000000e+00 }, { 8.6274509803921573e-01, 4.2549019607843119e-01, 5.2843137254901938e-02, 1.0000000000000000e+00 }, { 8.6823529411764711e-01, 4.0847058823529397e-01, 5.0729411764705863e-02, 1.0000000000000000e+00 }, { 8.7372549019607848e-01, 3.9145098039215676e-01, 4.8615686274509795e-02, 1.0000000000000000e+00 }, { 8.7921568627450986e-01, 3.7443137254901959e-01, 4.6501960784313720e-02, 1.0000000000000000e+00 }, { 8.8470588235294123e-01, 3.5741176470588248e-01, 4.4388235294117659e-02, 1.0000000000000000e+00 }, { 8.9019607843137250e-01, 3.4039215686274527e-01, 4.2274509803921591e-02, 1.0000000000000000e+00 }, { 8.9568627450980398e-01, 3.2337254901960749e-01, 4.0160784313725446e-02, 1.0000000000000000e+00 }, { 9.0117647058823536e-01, 3.0635294117647038e-01, 3.8047058823529385e-02, 1.0000000000000000e+00 }, { 9.0666666666666673e-01, 2.8933333333333322e-01, 3.5933333333333317e-02, 1.0000000000000000e+00 }, { 9.1215686274509811e-01, 2.7231372549019600e-01, 3.3819607843137242e-02, 1.0000000000000000e+00 }, { 9.1764705882352948e-01, 2.5529411764705878e-01, 3.1705882352941174e-02, 1.0000000000000000e+00 }, { 9.2313725490196075e-01, 2.3827450980392162e-01, 2.9592156862745102e-02, 1.0000000000000000e+00 }, { 9.2862745098039212e-01, 2.2125490196078443e-01, 2.7478431372549034e-02, 1.0000000000000000e+00 }, { 9.3411764705882350e-01, 2.0423529411764724e-01, 2.5364705882352963e-02, 1.0000000000000000e+00 }, { 9.3960784313725498e-01, 1.8721568627450955e-01, 2.3250980392156832e-02, 1.0000000000000000e+00 }, { 9.4509803921568636e-01, 1.7019607843137236e-01, 2.1137254901960761e-02, 1.0000000000000000e+00 }, { 9.5058823529411773e-01, 1.5317647058823516e-01, 1.9023529411764689e-02, 1.0000000000000000e+00 }, { 9.5607843137254900e-01, 1.3615686274509797e-01, 1.6909803921568618e-02, 1.0000000000000000e+00 }, { 9.6156862745098037e-01, 1.1913725490196077e-01, 1.4796078431372548e-02, 1.0000000000000000e+00 }, { 9.6705882352941175e-01, 1.0211764705882365e-01, 1.2682352941176485e-02, 1.0000000000000000e+00 }, { 9.7254901960784312e-01, 8.5098039215686455e-02, 1.0568627450980415e-02, 1.0000000000000000e+00 }, { 9.7803921568627450e-01, 6.8078431372549264e-02, 8.4549019607843435e-03, 1.0000000000000000e+00 }, { 9.8352941176470599e-01, 5.1058823529411580e-02, 6.3411764705882129e-03, 1.0000000000000000e+00 }, { 9.8901960784313725e-01, 3.4039215686274389e-02, 4.2274509803921414e-03, 1.0000000000000000e+00 }, { 9.9450980392156862e-01, 1.7019607843137195e-02, 2.1137254901960707e-03, 1.0000000000000000e+00 }, { 1.0000000000000000e+00, 0.0000000000000000e+00, 0.0000000000000000e+00, 1.0000000000000000e+00 } }; IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/interpLagrangeWeights.h0000664002537200253720000012227715257173642031322 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #ifndef interpLagrangeWeights_h #define interpLagrangeWeights_h #define interpLength 4 #define interpOffset 1 #define interpShift 7 #define interpMult 128 #define interpMask 127 const float lagrange_weights[129][4] = { { 0.0f, 1.0f, 0.0f, 0.0f, }, { -0.0025737f, 0.99603f, 0.0078428f, -0.001302f, }, { -0.0050869f, 0.99195f, 0.015745f, -0.0026035f, }, { -0.00754f, 0.98774f, 0.023706f, -0.0039041f, }, { -0.0099335f, 0.98341f, 0.031723f, -0.0052032f, }, { -0.012268f, 0.97897f, 0.039796f, -0.0065005f, }, { -0.014544f, 0.97442f, 0.047922f, -0.0077953f, }, { -0.016761f, 0.96975f, 0.056101f, -0.0090873f, }, { -0.018921f, 0.96497f, 0.064331f, -0.010376f, }, { -0.021024f, 0.96007f, 0.072611f, -0.011661f, }, { -0.023069f, 0.95507f, 0.080938f, -0.012941f, }, { -0.025059f, 0.94996f, 0.089313f, -0.014217f, }, { -0.026993f, 0.94475f, 0.097733f, -0.015488f, }, { -0.028871f, 0.93943f, 0.1062f, -0.016752f, }, { -0.030695f, 0.934f, 0.1147f, -0.018011f, }, { -0.032464f, 0.92848f, 0.12325f, -0.019263f, }, { -0.03418f, 0.92285f, 0.13184f, -0.020508f, }, { -0.035842f, 0.91713f, 0.14046f, -0.021745f, }, { -0.037451f, 0.9113f, 0.14912f, -0.022974f, }, { -0.039007f, 0.90538f, 0.15782f, -0.024194f, }, { -0.040512f, 0.89937f, 0.16655f, -0.025406f, }, { -0.041965f, 0.89326f, 0.17531f, -0.026608f, }, { -0.043367f, 0.88706f, 0.18411f, -0.0278f, }, { -0.044719f, 0.88077f, 0.19293f, -0.028981f, }, { -0.046021f, 0.87439f, 0.20178f, -0.030151f, }, { -0.047272f, 0.86792f, 0.21066f, -0.03131f, }, { -0.048475f, 0.86137f, 0.21956f, -0.032457f, }, { -0.049629f, 0.85473f, 0.22849f, -0.033592f, }, { -0.050735f, 0.84801f, 0.23744f, -0.034714f, }, { -0.051794f, 0.8412f, 0.24641f, -0.035822f, }, { -0.052805f, 0.83432f, 0.2554f, -0.036917f, }, { -0.053769f, 0.82735f, 0.26441f, -0.037997f, }, { -0.054688f, 0.82031f, 0.27344f, -0.039063f, }, { -0.05556f, 0.81319f, 0.28248f, -0.040113f, }, { -0.056387f, 0.806f, 0.29153f, -0.041147f, }, { -0.057169f, 0.79874f, 0.3006f, -0.042166f, }, { -0.057907f, 0.7914f, 0.30968f, -0.043167f, }, { -0.058601f, 0.78399f, 0.31876f, -0.044152f, }, { -0.059252f, 0.77651f, 0.32786f, -0.045118f, }, { -0.05986f, 0.76896f, 0.33696f, -0.046067f, }, { -0.060425f, 0.76135f, 0.34607f, -0.046997f, }, { -0.060948f, 0.75368f, 0.35518f, -0.047908f, }, { -0.06143f, 0.74594f, 0.36429f, -0.0488f, }, { -0.061871f, 0.73813f, 0.37341f, -0.049671f, }, { -0.062271f, 0.73027f, 0.38252f, -0.050522f, }, { -0.062631f, 0.72235f, 0.39163f, -0.051352f, }, { -0.062952f, 0.71437f, 0.40074f, -0.05216f, }, { -0.063234f, 0.70633f, 0.40985f, -0.052947f, }, { -0.063477f, 0.69824f, 0.41895f, -0.053711f, }, { -0.063681f, 0.6901f, 0.42804f, -0.054452f, }, { -0.063848f, 0.6819f, 0.43712f, -0.05517f, }, { -0.063978f, 0.67366f, 0.44619f, -0.055864f, }, { -0.064072f, 0.66536f, 0.45525f, -0.056534f, }, { -0.064129f, 0.65702f, 0.46429f, -0.057179f, }, { -0.06415f, 0.64863f, 0.47332f, -0.057798f, }, { -0.064136f, 0.64019f, 0.48234f, -0.058392f, }, { -0.064087f, 0.63171f, 0.49133f, -0.05896f, }, { -0.064004f, 0.62319f, 0.50031f, -0.059501f, }, { -0.063887f, 0.61463f, 0.50927f, -0.060015f, }, { -0.063736f, 0.60603f, 0.5182f, -0.060501f, }, { -0.063553f, 0.5974f, 0.52711f, -0.060959f, }, { -0.063337f, 0.58872f, 0.536f, -0.061388f, }, { -0.063089f, 0.58002f, 0.54486f, -0.061789f, }, { -0.06281f, 0.57127f, 0.5537f, -0.062159f, }, { -0.0625f, 0.5625f, 0.5625f, -0.0625f, }, { -0.062159f, 0.5537f, 0.57127f, -0.06281f, }, { -0.061789f, 0.54486f, 0.58002f, -0.063089f, }, { -0.061388f, 0.536f, 0.58872f, -0.063337f, }, { -0.060959f, 0.52711f, 0.5974f, -0.063553f, }, { -0.060501f, 0.5182f, 0.60603f, -0.063736f, }, { -0.060015f, 0.50927f, 0.61463f, -0.063887f, }, { -0.059501f, 0.50031f, 0.62319f, -0.064004f, }, { -0.05896f, 0.49133f, 0.63171f, -0.064087f, }, { -0.058392f, 0.48234f, 0.64019f, -0.064136f, }, { -0.057798f, 0.47332f, 0.64863f, -0.06415f, }, { -0.057179f, 0.46429f, 0.65702f, -0.064129f, }, { -0.056534f, 0.45525f, 0.66536f, -0.064072f, }, { -0.055864f, 0.44619f, 0.67366f, -0.063978f, }, { -0.05517f, 0.43712f, 0.6819f, -0.063848f, }, { -0.054452f, 0.42804f, 0.6901f, -0.063681f, }, { -0.053711f, 0.41895f, 0.69824f, -0.063477f, }, { -0.052947f, 0.40985f, 0.70633f, -0.063234f, }, { -0.05216f, 0.40074f, 0.71437f, -0.062952f, }, { -0.051352f, 0.39163f, 0.72235f, -0.062631f, }, { -0.050522f, 0.38252f, 0.73027f, -0.062271f, }, { -0.049671f, 0.37341f, 0.73813f, -0.061871f, }, { -0.0488f, 0.36429f, 0.74594f, -0.06143f, }, { -0.047908f, 0.35518f, 0.75368f, -0.060948f, }, { -0.046997f, 0.34607f, 0.76135f, -0.060425f, }, { -0.046067f, 0.33696f, 0.76896f, -0.05986f, }, { -0.045118f, 0.32786f, 0.77651f, -0.059252f, }, { -0.044152f, 0.31876f, 0.78399f, -0.058601f, }, { -0.043167f, 0.30968f, 0.7914f, -0.057907f, }, { -0.042166f, 0.3006f, 0.79874f, -0.057169f, }, { -0.041147f, 0.29153f, 0.806f, -0.056387f, }, { -0.040113f, 0.28248f, 0.81319f, -0.05556f, }, { -0.039063f, 0.27344f, 0.82031f, -0.054687f, }, { -0.037997f, 0.26441f, 0.82735f, -0.053769f, }, { -0.036917f, 0.2554f, 0.83432f, -0.052805f, }, { -0.035822f, 0.24641f, 0.8412f, -0.051794f, }, { -0.034714f, 0.23744f, 0.84801f, -0.050735f, }, { -0.033592f, 0.22849f, 0.85473f, -0.049629f, }, { -0.032457f, 0.21956f, 0.86137f, -0.048475f, }, { -0.03131f, 0.21066f, 0.86792f, -0.047272f, }, { -0.030151f, 0.20178f, 0.87439f, -0.046021f, }, { -0.028981f, 0.19293f, 0.88077f, -0.044719f, }, { -0.0278f, 0.18411f, 0.88706f, -0.043367f, }, { -0.026608f, 0.17531f, 0.89326f, -0.041965f, }, { -0.025406f, 0.16655f, 0.89937f, -0.040512f, }, { -0.024194f, 0.15782f, 0.90538f, -0.039007f, }, { -0.022974f, 0.14912f, 0.9113f, -0.037451f, }, { -0.021745f, 0.14046f, 0.91713f, -0.035842f, }, { -0.020508f, 0.13184f, 0.92285f, -0.03418f, }, { -0.019263f, 0.12325f, 0.92848f, -0.032464f, }, { -0.018011f, 0.1147f, 0.934f, -0.030695f, }, { -0.016752f, 0.1062f, 0.93943f, -0.028871f, }, { -0.015488f, 0.097733f, 0.94475f, -0.026993f, }, { -0.014217f, 0.089313f, 0.94996f, -0.025059f, }, { -0.012941f, 0.080938f, 0.95507f, -0.023069f, }, { -0.011661f, 0.072611f, 0.96007f, -0.021024f, }, { -0.010376f, 0.064331f, 0.96497f, -0.018921f, }, { -0.0090873f, 0.056101f, 0.96975f, -0.016761f, }, { -0.0077953f, 0.047922f, 0.97442f, -0.014544f, }, { -0.0065005f, 0.039796f, 0.97897f, -0.012268f, }, { -0.0052032f, 0.031723f, 0.98341f, -0.0099335f, }, { -0.0039041f, 0.023706f, 0.98774f, -0.00754f, }, { -0.0026035f, 0.015745f, 0.99195f, -0.0050869f, }, { -0.001302f, 0.0078428f, 0.99603f, -0.0025737f, }, { 0.0f, 0.0f, 1.0f, 0.0f, } }; // idx is the 7-bit-quantized fraction of your sample delay time , whereas fraction yields the fraction between two consecutive idx-values //TODO: write this text more understandable #if JUCE_USE_SSE_INTRINSICS __m128 inline getInterpolatedLagrangeWeights (int idx, float fraction) { __m128 lowPart = _mm_set1_ps (1.0f - fraction); __m128 highPart = _mm_set1_ps (fraction); __m128 interp = _mm_add_ps (_mm_mul_ps (lowPart, _mm_loadu_ps (lagrange_weights[idx])), _mm_mul_ps (highPart, _mm_loadu_ps (lagrange_weights[idx + 1]))); return interp; } #endif /* JUCE_USE_SSE_INTRINSICS */ inline void getInterpolatedLagrangeWeights (int idx, float fraction, float out[4]) { float fraction_ = 1.0f - fraction; const float* A = lagrange_weights[idx]; const float* B = lagrange_weights[idx + 1]; for (int i = 0; i < 4; i++) out[i] = A[i] * fraction_ + B[i] * fraction; } #endif /* interpLagrangeWeights_h */ IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/Delay.h0000664002537200253720000001123515257173642026052 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Authors: Daniel Rudrich Copyright (c) 2018 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once #include "../JuceLibraryCode/JuceHeader.h" using namespace juce::dsp; class Delay : private ProcessorBase { public: Delay() {} ~Delay() override = default; void setDelayTime (float delayTimeInSeconds) { if (delayTimeInSeconds <= 0.0f) { delay = 0.0f; bypassed = true; } else { delay = delayTimeInSeconds; bypassed = false; } prepare (spec); } const int getDelayInSamples() { return bypassed ? 0 : delayInSamples; } void prepare (const juce::dsp::ProcessSpec& specs) override { spec = specs; delayInSamples = delay * specs.sampleRate; buffer.setSize (specs.numChannels, specs.maximumBlockSize + delayInSamples); buffer.clear(); writePosition = 0; } void process (const juce::dsp::ProcessContextReplacing& context) override { juce::ScopedNoDenormals noDenormals; if (! bypassed) { auto abIn = context.getInputBlock(); auto abOut = context.getOutputBlock(); auto L = abIn.getNumSamples(); auto nCh = juce::jmin ((int) spec.numChannels, (int) abIn.getNumChannels()); int startIndex, blockSize1, blockSize2; // write in delay line getReadWritePositions (false, (int) L, startIndex, blockSize1, blockSize2); for (int ch = 0; ch < nCh; ch++) buffer.copyFrom (ch, startIndex, abIn.getChannelPointer (ch), blockSize1); if (blockSize2 > 0) for (int ch = 0; ch < nCh; ch++) buffer.copyFrom (ch, 0, abIn.getChannelPointer (ch) + blockSize1, blockSize2); // read from delay line getReadWritePositions (true, (int) L, startIndex, blockSize1, blockSize2); for (int ch = 0; ch < nCh; ch++) juce::FloatVectorOperations::copy (abOut.getChannelPointer (ch), buffer.getReadPointer (ch) + startIndex, blockSize1); if (blockSize2 > 0) for (int ch = 0; ch < nCh; ch++) juce::FloatVectorOperations::copy (abOut.getChannelPointer (ch) + blockSize1, buffer.getReadPointer (ch), blockSize2); writePosition += L; writePosition = writePosition % buffer.getNumSamples(); } } void reset() override {} void getReadWritePositions (bool read, int numSamples, int& startIndex, int& blockSize1, int& blockSize2) { const int L = buffer.getNumSamples(); int pos = writePosition; if (read) { pos = writePosition - delayInSamples; } if (pos < 0) pos = pos + L; pos = pos % L; jassert (pos >= 0 && pos < L); if (numSamples <= 0) { startIndex = 0; blockSize1 = 0; blockSize2 = 0; } else { startIndex = pos; blockSize1 = juce::jmin (L - pos, numSamples); numSamples -= blockSize1; blockSize2 = numSamples <= 0 ? 0 : numSamples; } } private: //============================================================================== juce::dsp::ProcessSpec spec = { -1, 0, 0 }; float delay; int delayInSamples = 0; bool bypassed = false; int writePosition = 0; juce::AudioBuffer buffer; }; IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/MultiChannelDelay.h0000664002537200253720000001361515257173642030362 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Authors: Daniel Rudrich Copyright (c) 2018 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once #include "../JuceLibraryCode/JuceHeader.h" using namespace juce::dsp; template class MultiChannelDelay : private ProcessorBase { public: MultiChannelDelay() {} ~MultiChannelDelay() {} void setDelayTime (const int channel, const float delayTimeInSeconds) { jassert (delayTimeInSeconds <= maxDelay); if (channel < numChannels) { if (delayTimeInSeconds <= 0.0f) { delayInSeconds.setUnchecked (channel, 0.0f); } else { delayInSeconds.setUnchecked (channel, delayTimeInSeconds); } delayInSamples.setUnchecked (channel, delayInSeconds.getUnchecked (channel) * spec.sampleRate); } } const int getDelayInSamples (const int channel) { jassert (channel < numChannels); if (channel < numChannels) return delayInSamples[channel]; else return 0; } void setMaxDelayTime (const int maxDelayTimeInSeconds) { maxDelay = maxDelayTimeInSeconds; } void prepare (const juce::dsp::ProcessSpec& specs) override { spec = specs; const int maxDelayInSamples = specs.sampleRate * maxDelay; buffer.setSize (specs.numChannels, specs.maximumBlockSize + maxDelayInSamples); buffer.clear(); writePosition = 0; numChannels = specs.numChannels; delayInSeconds.resize (numChannels); delayInSamples.resize (numChannels); } void process (const juce::dsp::ProcessContextReplacing& context) override { juce::ScopedNoDenormals noDenormals; auto abIn = context.getInputBlock(); auto abOut = context.getOutputBlock(); auto L = abIn.getNumSamples(); auto nCh = abIn.getNumChannels(); // write in delay line int startIndex, blockSize1, blockSize2; getWritePositions ((int) L, startIndex, blockSize1, blockSize2); for (int ch = 0; ch < nCh; ch++) buffer.copyFrom (ch, startIndex, abIn.getChannelPointer (ch), blockSize1); if (blockSize2 > 0) for (int ch = 0; ch < nCh; ch++) buffer.copyFrom (ch, 0, abIn.getChannelPointer (ch) + blockSize1, blockSize2); // read from delay line for (int ch = 0; ch < nCh; ch++) { int startIndex, blockSize1, blockSize2; getReadPositions (ch, (int) L, startIndex, blockSize1, blockSize2); juce::FloatVectorOperations::copy (abOut.getChannelPointer (ch), buffer.getReadPointer (ch) + startIndex, blockSize1); if (blockSize2 > 0) juce::FloatVectorOperations::copy (abOut.getChannelPointer (ch) + blockSize1, buffer.getReadPointer (ch), blockSize2); } writePosition += L; writePosition = writePosition % buffer.getNumSamples(); } void reset() override {} void getWritePositions (int numSamples, int& startIndex, int& blockSize1, int& blockSize2) { const int L = buffer.getNumSamples(); int pos = writePosition; if (pos < 0) pos = pos + L; pos = pos % L; jassert (pos >= 0 && pos < L); if (numSamples <= 0) { startIndex = 0; blockSize1 = 0; blockSize2 = 0; } else { startIndex = pos; blockSize1 = juce::jmin (L - pos, numSamples); numSamples -= blockSize1; blockSize2 = numSamples <= 0 ? 0 : numSamples; } } void getReadPositions (const int channel, int numSamples, int& startIndex, int& blockSize1, int& blockSize2) { jassert (channel < delayInSamples.size()); const int L = buffer.getNumSamples(); int pos = writePosition - delayInSamples.getUnchecked (channel); if (pos < 0) pos = pos + L; pos = pos % L; jassert (pos >= 0 && pos < L); if (numSamples <= 0) { startIndex = 0; blockSize1 = 0; blockSize2 = 0; } else { startIndex = pos; blockSize1 = juce::jmin (L - pos, numSamples); numSamples -= blockSize1; blockSize2 = numSamples <= 0 ? 0 : numSamples; } } private: //============================================================================== juce::dsp::ProcessSpec spec = { -1, 0, 0 }; juce::Array delayInSeconds; juce::Array delayInSamples; float maxDelay = 1.0f; int numChannels = 0; int writePosition = 0; juce::AudioBuffer buffer; }; IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/efficientSHvanilla.cpp0000664002537200253720000004616015257173642031112 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ /* The following functions were generated with the Code-Generator by Peter-Pike Sloan. More information about the algorithm can be found here: http://jcgt.org/published/0002/02/06/ */ // order 0 void SHEval0 (const float, const float, const float, float* pSH) { pSH[0] = 0.2820947917738781f; } // order 1 void SHEval1 (const float fX, const float fY, const float fZ, float* pSH) { float fC0, fS0, fTmpC; pSH[0] = 0.2820947917738781f; pSH[2] = 0.4886025119029199f * fZ; fC0 = fX; fS0 = fY; fTmpC = 0.48860251190292f; pSH[3] = fTmpC * fC0; pSH[1] = fTmpC * fS0; } // order 2 void SHEval2 (const float fX, const float fY, const float fZ, float* pSH) { float fC0, fC1, fS0, fS1, fTmpA, fTmpB, fTmpC; float fZ2 = fZ * fZ; pSH[0] = 0.2820947917738781f; pSH[2] = 0.4886025119029199f * fZ; pSH[6] = 0.9461746957575601f * fZ2 + -0.31539156525252f; fC0 = fX; fS0 = fY; fTmpA = 0.48860251190292f; pSH[3] = fTmpA * fC0; pSH[1] = fTmpA * fS0; fTmpB = 1.092548430592079f * fZ; pSH[7] = fTmpB * fC0; pSH[5] = fTmpB * fS0; fC1 = fX * fC0 - fY * fS0; fS1 = fX * fS0 + fY * fC0; fTmpC = 0.5462742152960395f; pSH[8] = fTmpC * fC1; pSH[4] = fTmpC * fS1; } // order 3 void SHEval3 (const float fX, const float fY, const float fZ, float* pSH) { float fC0, fC1, fS0, fS1, fTmpA, fTmpB, fTmpC; float fZ2 = fZ * fZ; pSH[0] = 0.2820947917738781f; pSH[2] = 0.4886025119029199f * fZ; pSH[6] = 0.9461746957575601f * fZ2 + -0.31539156525252f; pSH[12] = fZ * (1.865881662950577f * fZ2 + -1.119528997770346f); fC0 = fX; fS0 = fY; fTmpA = 0.48860251190292f; pSH[3] = fTmpA * fC0; pSH[1] = fTmpA * fS0; fTmpB = 1.092548430592079f * fZ; pSH[7] = fTmpB * fC0; pSH[5] = fTmpB * fS0; fTmpC = 2.285228997322329f * fZ2 + -0.4570457994644658f; pSH[13] = fTmpC * fC0; pSH[11] = fTmpC * fS0; fC1 = fX * fC0 - fY * fS0; fS1 = fX * fS0 + fY * fC0; fTmpA = 0.5462742152960395f; pSH[8] = fTmpA * fC1; pSH[4] = fTmpA * fS1; fTmpB = 1.445305721320277f * fZ; pSH[14] = fTmpB * fC1; pSH[10] = fTmpB * fS1; fC0 = fX * fC1 - fY * fS1; fS0 = fX * fS1 + fY * fC1; fTmpC = 0.5900435899266435f; pSH[15] = fTmpC * fC0; pSH[9] = fTmpC * fS0; } // order 4 void SHEval4 (const float fX, const float fY, const float fZ, float* pSH) { float fC0, fC1, fS0, fS1, fTmpA, fTmpB, fTmpC; float fZ2 = fZ * fZ; pSH[0] = 0.2820947917738781f; pSH[2] = 0.4886025119029199f * fZ; pSH[6] = 0.9461746957575601f * fZ2 + -0.31539156525252f; pSH[12] = fZ * (1.865881662950577f * fZ2 + -1.119528997770346f); pSH[20] = 1.984313483298443f * fZ * pSH[12] + -1.006230589874905f * pSH[6]; fC0 = fX; fS0 = fY; fTmpA = 0.48860251190292f; pSH[3] = fTmpA * fC0; pSH[1] = fTmpA * fS0; fTmpB = 1.092548430592079f * fZ; pSH[7] = fTmpB * fC0; pSH[5] = fTmpB * fS0; fTmpC = 2.285228997322329f * fZ2 + -0.4570457994644658f; pSH[13] = fTmpC * fC0; pSH[11] = fTmpC * fS0; fTmpA = fZ * (4.683325804901025f * fZ2 + -2.007139630671868f); pSH[21] = fTmpA * fC0; pSH[19] = fTmpA * fS0; fC1 = fX * fC0 - fY * fS0; fS1 = fX * fS0 + fY * fC0; fTmpA = 0.5462742152960395f; pSH[8] = fTmpA * fC1; pSH[4] = fTmpA * fS1; fTmpB = 1.445305721320277f * fZ; pSH[14] = fTmpB * fC1; pSH[10] = fTmpB * fS1; fTmpC = 3.31161143515146f * fZ2 + -0.47308734787878f; pSH[22] = fTmpC * fC1; pSH[18] = fTmpC * fS1; fC0 = fX * fC1 - fY * fS1; fS0 = fX * fS1 + fY * fC1; fTmpA = 0.5900435899266435f; pSH[15] = fTmpA * fC0; pSH[9] = fTmpA * fS0; fTmpB = 1.770130769779931f * fZ; pSH[23] = fTmpB * fC0; pSH[17] = fTmpB * fS0; fC1 = fX * fC0 - fY * fS0; fS1 = fX * fS0 + fY * fC0; fTmpC = 0.6258357354491763f; pSH[24] = fTmpC * fC1; pSH[16] = fTmpC * fS1; } // order 5 void SHEval5 (const float fX, const float fY, const float fZ, float* pSH) { float fC0, fC1, fS0, fS1, fTmpA, fTmpB, fTmpC; float fZ2 = fZ * fZ; pSH[0] = 0.2820947917738781f; pSH[2] = 0.4886025119029199f * fZ; pSH[6] = 0.9461746957575601f * fZ2 + -0.31539156525252f; pSH[12] = fZ * (1.865881662950577f * fZ2 + -1.119528997770346f); pSH[20] = 1.984313483298443f * fZ * pSH[12] + -1.006230589874905f * pSH[6]; pSH[30] = 1.98997487421324f * fZ * pSH[20] + -1.002853072844814f * pSH[12]; fC0 = fX; fS0 = fY; fTmpA = 0.48860251190292f; pSH[3] = fTmpA * fC0; pSH[1] = fTmpA * fS0; fTmpB = 1.092548430592079f * fZ; pSH[7] = fTmpB * fC0; pSH[5] = fTmpB * fS0; fTmpC = 2.285228997322329f * fZ2 + -0.4570457994644658f; pSH[13] = fTmpC * fC0; pSH[11] = fTmpC * fS0; fTmpA = fZ * (4.683325804901025f * fZ2 + -2.007139630671868f); pSH[21] = fTmpA * fC0; pSH[19] = fTmpA * fS0; fTmpB = 2.03100960115899f * fZ * fTmpA + -0.991031208965115f * fTmpC; pSH[31] = fTmpB * fC0; pSH[29] = fTmpB * fS0; fC1 = fX * fC0 - fY * fS0; fS1 = fX * fS0 + fY * fC0; fTmpA = 0.5462742152960395f; pSH[8] = fTmpA * fC1; pSH[4] = fTmpA * fS1; fTmpB = 1.445305721320277f * fZ; pSH[14] = fTmpB * fC1; pSH[10] = fTmpB * fS1; fTmpC = 3.31161143515146f * fZ2 + -0.47308734787878f; pSH[22] = fTmpC * fC1; pSH[18] = fTmpC * fS1; fTmpA = fZ * (7.190305177459987f * fZ2 + -2.396768392486662f); pSH[32] = fTmpA * fC1; pSH[28] = fTmpA * fS1; fC0 = fX * fC1 - fY * fS1; fS0 = fX * fS1 + fY * fC1; fTmpA = 0.5900435899266435f; pSH[15] = fTmpA * fC0; pSH[9] = fTmpA * fS0; fTmpB = 1.770130769779931f * fZ; pSH[23] = fTmpB * fC0; pSH[17] = fTmpB * fS0; fTmpC = 4.403144694917254f * fZ2 + -0.4892382994352505f; pSH[33] = fTmpC * fC0; pSH[27] = fTmpC * fS0; fC1 = fX * fC0 - fY * fS0; fS1 = fX * fS0 + fY * fC0; fTmpA = 0.6258357354491763f; pSH[24] = fTmpA * fC1; pSH[16] = fTmpA * fS1; fTmpB = 2.075662314881041f * fZ; pSH[34] = fTmpB * fC1; pSH[26] = fTmpB * fS1; fC0 = fX * fC1 - fY * fS1; fS0 = fX * fS1 + fY * fC1; fTmpC = 0.6563820568401703f; pSH[35] = fTmpC * fC0; pSH[25] = fTmpC * fS0; } // order 6 void SHEval6 (const float fX, const float fY, const float fZ, float* pSH) { float fC0, fC1, fS0, fS1, fTmpA, fTmpB, fTmpC; float fZ2 = fZ * fZ; pSH[0] = 0.2820947917738781f; pSH[2] = 0.4886025119029199f * fZ; pSH[6] = 0.9461746957575601f * fZ2 + -0.31539156525252f; pSH[12] = fZ * (1.865881662950577f * fZ2 + -1.119528997770346f); pSH[20] = 1.984313483298443f * fZ * pSH[12] + -1.006230589874905f * pSH[6]; pSH[30] = 1.98997487421324f * fZ * pSH[20] + -1.002853072844814f * pSH[12]; pSH[42] = 1.993043457183566f * fZ * pSH[30] + -1.001542020962219f * pSH[20]; fC0 = fX; fS0 = fY; fTmpA = 0.48860251190292f; pSH[3] = fTmpA * fC0; pSH[1] = fTmpA * fS0; fTmpB = 1.092548430592079f * fZ; pSH[7] = fTmpB * fC0; pSH[5] = fTmpB * fS0; fTmpC = 2.285228997322329f * fZ2 + -0.4570457994644658f; pSH[13] = fTmpC * fC0; pSH[11] = fTmpC * fS0; fTmpA = fZ * (4.683325804901025f * fZ2 + -2.007139630671868f); pSH[21] = fTmpA * fC0; pSH[19] = fTmpA * fS0; fTmpB = 2.03100960115899f * fZ * fTmpA + -0.991031208965115f * fTmpC; pSH[31] = fTmpB * fC0; pSH[29] = fTmpB * fS0; fTmpC = 2.021314989237028f * fZ * fTmpB + -0.9952267030562385f * fTmpA; pSH[43] = fTmpC * fC0; pSH[41] = fTmpC * fS0; fC1 = fX * fC0 - fY * fS0; fS1 = fX * fS0 + fY * fC0; fTmpA = 0.5462742152960395f; pSH[8] = fTmpA * fC1; pSH[4] = fTmpA * fS1; fTmpB = 1.445305721320277f * fZ; pSH[14] = fTmpB * fC1; pSH[10] = fTmpB * fS1; fTmpC = 3.31161143515146f * fZ2 + -0.47308734787878f; pSH[22] = fTmpC * fC1; pSH[18] = fTmpC * fS1; fTmpA = fZ * (7.190305177459987f * fZ2 + -2.396768392486662f); pSH[32] = fTmpA * fC1; pSH[28] = fTmpA * fS1; fTmpB = 2.11394181566097f * fZ * fTmpA + -0.9736101204623268f * fTmpC; pSH[44] = fTmpB * fC1; pSH[40] = fTmpB * fS1; fC0 = fX * fC1 - fY * fS1; fS0 = fX * fS1 + fY * fC1; fTmpA = 0.5900435899266435f; pSH[15] = fTmpA * fC0; pSH[9] = fTmpA * fS0; fTmpB = 1.770130769779931f * fZ; pSH[23] = fTmpB * fC0; pSH[17] = fTmpB * fS0; fTmpC = 4.403144694917254f * fZ2 + -0.4892382994352505f; pSH[33] = fTmpC * fC0; pSH[27] = fTmpC * fS0; fTmpA = fZ * (10.13325785466416f * fZ2 + -2.763615778544771f); pSH[45] = fTmpA * fC0; pSH[39] = fTmpA * fS0; fC1 = fX * fC0 - fY * fS0; fS1 = fX * fS0 + fY * fC0; fTmpA = 0.6258357354491763f; pSH[24] = fTmpA * fC1; pSH[16] = fTmpA * fS1; fTmpB = 2.075662314881041f * fZ; pSH[34] = fTmpB * fC1; pSH[26] = fTmpB * fS1; fTmpC = 5.550213908015966f * fZ2 + -0.5045649007287241f; pSH[46] = fTmpC * fC1; pSH[38] = fTmpC * fS1; fC0 = fX * fC1 - fY * fS1; fS0 = fX * fS1 + fY * fC1; fTmpA = 0.6563820568401703f; pSH[35] = fTmpA * fC0; pSH[25] = fTmpA * fS0; fTmpB = 2.366619162231753f * fZ; pSH[47] = fTmpB * fC0; pSH[37] = fTmpB * fS0; fC1 = fX * fC0 - fY * fS0; fS1 = fX * fS0 + fY * fC0; fTmpC = 0.6831841051919144f; pSH[48] = fTmpC * fC1; pSH[36] = fTmpC * fS1; } // order 7 void SHEval7 (const float fX, const float fY, const float fZ, float* pSH) { float fC0, fC1, fS0, fS1, fTmpA, fTmpB, fTmpC; float fZ2 = fZ * fZ; pSH[0] = 0.2820947917738781f; pSH[2] = 0.4886025119029199f * fZ; pSH[6] = 0.9461746957575601f * fZ2 + -0.31539156525252f; pSH[12] = fZ * (1.865881662950577f * fZ2 + -1.119528997770346f); pSH[20] = 1.984313483298443f * fZ * pSH[12] + -1.006230589874905f * pSH[6]; pSH[30] = 1.98997487421324f * fZ * pSH[20] + -1.002853072844814f * pSH[12]; pSH[42] = 1.993043457183566f * fZ * pSH[30] + -1.001542020962219f * pSH[20]; pSH[56] = 1.994891434824135f * fZ * pSH[42] + -1.000927213921958f * pSH[30]; fC0 = fX; fS0 = fY; fTmpA = 0.48860251190292f; pSH[3] = fTmpA * fC0; pSH[1] = fTmpA * fS0; fTmpB = 1.092548430592079f * fZ; pSH[7] = fTmpB * fC0; pSH[5] = fTmpB * fS0; fTmpC = 2.285228997322329f * fZ2 + -0.4570457994644658f; pSH[13] = fTmpC * fC0; pSH[11] = fTmpC * fS0; fTmpA = fZ * (4.683325804901025f * fZ2 + -2.007139630671868f); pSH[21] = fTmpA * fC0; pSH[19] = fTmpA * fS0; fTmpB = 2.03100960115899f * fZ * fTmpA + -0.991031208965115f * fTmpC; pSH[31] = fTmpB * fC0; pSH[29] = fTmpB * fS0; fTmpC = 2.021314989237028f * fZ * fTmpB + -0.9952267030562385f * fTmpA; pSH[43] = fTmpC * fC0; pSH[41] = fTmpC * fS0; fTmpA = 2.015564437074638f * fZ * fTmpC + -0.9971550440218319f * fTmpB; pSH[57] = fTmpA * fC0; pSH[55] = fTmpA * fS0; fC1 = fX * fC0 - fY * fS0; fS1 = fX * fS0 + fY * fC0; fTmpA = 0.5462742152960395f; pSH[8] = fTmpA * fC1; pSH[4] = fTmpA * fS1; fTmpB = 1.445305721320277f * fZ; pSH[14] = fTmpB * fC1; pSH[10] = fTmpB * fS1; fTmpC = 3.31161143515146f * fZ2 + -0.47308734787878f; pSH[22] = fTmpC * fC1; pSH[18] = fTmpC * fS1; fTmpA = fZ * (7.190305177459987f * fZ2 + -2.396768392486662f); pSH[32] = fTmpA * fC1; pSH[28] = fTmpA * fS1; fTmpB = 2.11394181566097f * fZ * fTmpA + -0.9736101204623268f * fTmpC; pSH[44] = fTmpB * fC1; pSH[40] = fTmpB * fS1; fTmpC = 2.081665999466133f * fZ * fTmpB + -0.9847319278346618f * fTmpA; pSH[58] = fTmpC * fC1; pSH[54] = fTmpC * fS1; fC0 = fX * fC1 - fY * fS1; fS0 = fX * fS1 + fY * fC1; fTmpA = 0.5900435899266435f; pSH[15] = fTmpA * fC0; pSH[9] = fTmpA * fS0; fTmpB = 1.770130769779931f * fZ; pSH[23] = fTmpB * fC0; pSH[17] = fTmpB * fS0; fTmpC = 4.403144694917254f * fZ2 + -0.4892382994352505f; pSH[33] = fTmpC * fC0; pSH[27] = fTmpC * fS0; fTmpA = fZ * (10.13325785466416f * fZ2 + -2.763615778544771f); pSH[45] = fTmpA * fC0; pSH[39] = fTmpA * fS0; fTmpB = 2.207940216581961f * fZ * fTmpA + -0.959403223600247f * fTmpC; pSH[59] = fTmpB * fC0; pSH[53] = fTmpB * fS0; fC1 = fX * fC0 - fY * fS0; fS1 = fX * fS0 + fY * fC0; fTmpA = 0.6258357354491763f; pSH[24] = fTmpA * fC1; pSH[16] = fTmpA * fS1; fTmpB = 2.075662314881041f * fZ; pSH[34] = fTmpB * fC1; pSH[26] = fTmpB * fS1; fTmpC = 5.550213908015966f * fZ2 + -0.5045649007287241f; pSH[46] = fTmpC * fC1; pSH[38] = fTmpC * fS1; fTmpA = fZ * (13.49180504672677f * fZ2 + -3.113493472321562f); pSH[60] = fTmpA * fC1; pSH[52] = fTmpA * fS1; fC0 = fX * fC1 - fY * fS1; fS0 = fX * fS1 + fY * fC1; fTmpA = 0.6563820568401703f; pSH[35] = fTmpA * fC0; pSH[25] = fTmpA * fS0; fTmpB = 2.366619162231753f * fZ; pSH[47] = fTmpB * fC0; pSH[37] = fTmpB * fS0; fTmpC = 6.745902523363385f * fZ2 + -0.5189155787202604f; pSH[61] = fTmpC * fC0; pSH[51] = fTmpC * fS0; fC1 = fX * fC0 - fY * fS0; fS1 = fX * fS0 + fY * fC0; fTmpA = 0.6831841051919144f; pSH[48] = fTmpA * fC1; pSH[36] = fTmpA * fS1; fTmpB = 2.6459606618019f * fZ; pSH[62] = fTmpB * fC1; pSH[50] = fTmpB * fS1; fC0 = fX * fC1 - fY * fS1; fS0 = fX * fS1 + fY * fC1; fTmpC = 0.7071627325245963f; pSH[63] = fTmpC * fC0; pSH[49] = fTmpC * fS0; } // order 8 void SHEval8 (const float fX, const float fY, const float fZ, float* pSH) { float fC0, fC1, fS0, fS1, fTmpA, fTmpB, fTmpC; float fZ2 = fZ * fZ; pSH[0] = 0.2820947917738781f; pSH[2] = 0.4886025119029199f * fZ; pSH[6] = 0.9461746957575601f * fZ2 + -0.31539156525252f; pSH[12] = fZ * (1.865881662950577f * fZ2 + -1.119528997770346f); pSH[20] = 1.984313483298443f * fZ * pSH[12] + -1.006230589874905f * pSH[6]; pSH[30] = 1.98997487421324f * fZ * pSH[20] + -1.002853072844814f * pSH[12]; pSH[42] = 1.993043457183566f * fZ * pSH[30] + -1.001542020962219f * pSH[20]; pSH[56] = 1.994891434824135f * fZ * pSH[42] + -1.000927213921958f * pSH[30]; pSH[72] = 1.996089927833914f * fZ * pSH[56] + -1.000600781069515f * pSH[42]; fC0 = fX; fS0 = fY; fTmpA = 0.48860251190292f; pSH[3] = fTmpA * fC0; pSH[1] = fTmpA * fS0; fTmpB = 1.092548430592079f * fZ; pSH[7] = fTmpB * fC0; pSH[5] = fTmpB * fS0; fTmpC = 2.285228997322329f * fZ2 + -0.4570457994644658f; pSH[13] = fTmpC * fC0; pSH[11] = fTmpC * fS0; fTmpA = fZ * (4.683325804901025f * fZ2 + -2.007139630671868f); pSH[21] = fTmpA * fC0; pSH[19] = fTmpA * fS0; fTmpB = 2.03100960115899f * fZ * fTmpA + -0.991031208965115f * fTmpC; pSH[31] = fTmpB * fC0; pSH[29] = fTmpB * fS0; fTmpC = 2.021314989237028f * fZ * fTmpB + -0.9952267030562385f * fTmpA; pSH[43] = fTmpC * fC0; pSH[41] = fTmpC * fS0; fTmpA = 2.015564437074638f * fZ * fTmpC + -0.9971550440218319f * fTmpB; pSH[57] = fTmpA * fC0; pSH[55] = fTmpA * fS0; fTmpB = 2.011869540407391f * fZ * fTmpA + -0.9981668178901745f * fTmpC; pSH[73] = fTmpB * fC0; pSH[71] = fTmpB * fS0; fC1 = fX * fC0 - fY * fS0; fS1 = fX * fS0 + fY * fC0; fTmpA = 0.5462742152960395f; pSH[8] = fTmpA * fC1; pSH[4] = fTmpA * fS1; fTmpB = 1.445305721320277f * fZ; pSH[14] = fTmpB * fC1; pSH[10] = fTmpB * fS1; fTmpC = 3.31161143515146f * fZ2 + -0.47308734787878f; pSH[22] = fTmpC * fC1; pSH[18] = fTmpC * fS1; fTmpA = fZ * (7.190305177459987f * fZ2 + -2.396768392486662f); pSH[32] = fTmpA * fC1; pSH[28] = fTmpA * fS1; fTmpB = 2.11394181566097f * fZ * fTmpA + -0.9736101204623268f * fTmpC; pSH[44] = fTmpB * fC1; pSH[40] = fTmpB * fS1; fTmpC = 2.081665999466133f * fZ * fTmpB + -0.9847319278346618f * fTmpA; pSH[58] = fTmpC * fC1; pSH[54] = fTmpC * fS1; fTmpA = 2.06155281280883f * fZ * fTmpC + -0.9903379376602873f * fTmpB; pSH[74] = fTmpA * fC1; pSH[70] = fTmpA * fS1; fC0 = fX * fC1 - fY * fS1; fS0 = fX * fS1 + fY * fC1; fTmpA = 0.5900435899266435f; pSH[15] = fTmpA * fC0; pSH[9] = fTmpA * fS0; fTmpB = 1.770130769779931f * fZ; pSH[23] = fTmpB * fC0; pSH[17] = fTmpB * fS0; fTmpC = 4.403144694917254f * fZ2 + -0.4892382994352505f; pSH[33] = fTmpC * fC0; pSH[27] = fTmpC * fS0; fTmpA = fZ * (10.13325785466416f * fZ2 + -2.763615778544771f); pSH[45] = fTmpA * fC0; pSH[39] = fTmpA * fS0; fTmpB = 2.207940216581961f * fZ * fTmpA + -0.959403223600247f * fTmpC; pSH[59] = fTmpB * fC0; pSH[53] = fTmpB * fS0; fTmpC = 2.15322168769582f * fZ * fTmpB + -0.9752173865600178f * fTmpA; pSH[75] = fTmpC * fC0; pSH[69] = fTmpC * fS0; fC1 = fX * fC0 - fY * fS0; fS1 = fX * fS0 + fY * fC0; fTmpA = 0.6258357354491763f; pSH[24] = fTmpA * fC1; pSH[16] = fTmpA * fS1; fTmpB = 2.075662314881041f * fZ; pSH[34] = fTmpB * fC1; pSH[26] = fTmpB * fS1; fTmpC = 5.550213908015966f * fZ2 + -0.5045649007287241f; pSH[46] = fTmpC * fC1; pSH[38] = fTmpC * fS1; fTmpA = fZ * (13.49180504672677f * fZ2 + -3.113493472321562f); pSH[60] = fTmpA * fC1; pSH[52] = fTmpA * fS1; fTmpB = 2.304886114323221f * fZ * fTmpA + -0.9481763873554654f * fTmpC; pSH[76] = fTmpB * fC1; pSH[68] = fTmpB * fS1; fC0 = fX * fC1 - fY * fS1; fS0 = fX * fS1 + fY * fC1; fTmpA = 0.6563820568401703f; pSH[35] = fTmpA * fC0; pSH[25] = fTmpA * fS0; fTmpB = 2.366619162231753f * fZ; pSH[47] = fTmpB * fC0; pSH[37] = fTmpB * fS0; fTmpC = 6.745902523363385f * fZ2 + -0.5189155787202604f; pSH[61] = fTmpC * fC0; pSH[51] = fTmpC * fS0; fTmpA = fZ * (17.24955311049054f * fZ2 + -3.449910622098108f); pSH[77] = fTmpA * fC0; pSH[67] = fTmpA * fS0; fC1 = fX * fC0 - fY * fS0; fS1 = fX * fS0 + fY * fC0; fTmpA = 0.6831841051919144f; pSH[48] = fTmpA * fC1; pSH[36] = fTmpA * fS1; fTmpB = 2.6459606618019f * fZ; pSH[62] = fTmpB * fC1; pSH[50] = fTmpB * fS1; fTmpC = 7.984991490893139f * fZ2 + -0.5323327660595426f; pSH[78] = fTmpC * fC1; pSH[66] = fTmpC * fS1; fC0 = fX * fC1 - fY * fS1; fS0 = fX * fS1 + fY * fC1; fTmpA = 0.7071627325245963f; pSH[63] = fTmpA * fC0; pSH[49] = fTmpA * fS0; fTmpB = 2.91570664069932f * fZ; pSH[79] = fTmpB * fC0; pSH[65] = fTmpB * fS0; fC1 = fX * fC0 - fY * fS0; fS1 = fX * fS0 + fY * fC0; fTmpC = 0.72892666017483f; pSH[80] = fTmpC * fC1; pSH[64] = fTmpC * fS1; } IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/HammerAitov.h0000664002537200253720000000541715257173642027235 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once #include class HammerAitov { public: /** Calculates the HammerAitov-projection for azimuth and elevation. The x output represents the horizontal axis, with 0 being in the middle. Negative azimuth values result in positive x values (to the right) and vice versa. The y output represents the vertical axis, with 0 being in the middle. Positive elevation values result in positive y values (up) and vice versa. */ static void sphericalToXY (float azimuthInRadians, float elevationInRadians, float& x, float& y) { while (azimuthInRadians > juce::MathConstants::pi + FLT_EPSILON) azimuthInRadians -= 2.0f * juce::MathConstants::pi; while (azimuthInRadians < -juce::MathConstants::pi - FLT_EPSILON) azimuthInRadians += 2.0f * juce::MathConstants::pi; const float cosEle = std::cos (elevationInRadians); const float factor = 1.0f / std::sqrt (1.0f + cosEle * std::cos (0.5f * azimuthInRadians)); x = factor * -cosEle * std::sin (0.5f * azimuthInRadians); y = factor * std::sin (elevationInRadians); } static juce::Point sphericalToXY (float azimuthInRadians, float elevationInRadians) { juce::Point ret; sphericalToXY (azimuthInRadians, elevationInRadians, ret.x, ret.y); return ret; } static void XYToSpherical (float x, float y, float& azimuthInRadians, float& elevationInRadians) { constexpr float sqrt2Half = 0.5f * 1.41421356237309504880168872420969808; const float z = std::sqrt (1.0f - juce::square (x * sqrt2Half) - juce::square (y * sqrt2Half)); azimuthInRadians = 2.0f * std::atan (sqrt2Half * -x * z / (juce::square (z) - 0.5f)); elevationInRadians = std::asin (std::sqrt (2) * y * z); } }; IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/FeedbackDelayNetwork.h0000664002537200253720000005462515257173642031043 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Authors: Sebastian Grill, Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once #include "../JuceLibraryCode/JuceHeader.h" #include "FilterVisualizerHelper.h" #include "WalshHadamard/fwht.h" using namespace juce::dsp; class FeedbackDelayNetwork : private ProcessorBase { static constexpr int maxDelayLength = 30; public: enum FdnSize { uninitialized = 0, ato = 1, femto = 2, pico = 4, nano = 8, tiny = 16, small = 32, big = 64, huge = 128, giant = 256 }; struct FilterParameter { float frequency = 1000.0f; float linearGain = 1.0f; float q = 0.7071f; }; struct HPFilterParameter { int mode = 0; float frequency = 20.0f; float q = 0.7071f; }; FeedbackDelayNetwork (FdnSize size = big) { updateFdnSize (size); setDelayLength (20); dryWet = 0.5f; primeNumbers = primeNumGen (5000); overallGain = 0.1f; } ~FeedbackDelayNetwork() {} void setDryWet (float newDryWet) { if (newDryWet < 0.f) params.newDryWet = 0.f; else if (newDryWet > 1.f) params.newDryWet = 1.f; else params.newDryWet = newDryWet; params.dryWetChanged = true; } void prepare (const juce::dsp::ProcessSpec& newSpec) override { spec = newSpec; isInitialized = true; indices = indexGen (fdnSize, delayLength); updateParameterSettings(); updateGuiCoefficients(); for (int ch = 0; ch < fdnSize; ++ch) { delayBufferVector[ch]->clear(); lowShelfFilters[ch]->reset(); highShelfFilters[ch]->reset(); hpFilters[ch]->reset (0.0f); additionalHpFilters[ch]->reset (0.0f); } } void process (const juce::dsp::ProcessContextReplacing& context) override { juce::ScopedNoDenormals noDenormals; // parameter change thread safety if (params.dryWetChanged) { dryWet = params.newDryWet; params.dryWetChanged = false; } if (params.filterParametersChanged) { lowShelfParameters = params.newLowShelfParams; highShelfParameters = params.newHighShelfParams; hpFilterParameters = params.newHPFilterParams; params.needParameterUpdate = true; params.filterParametersChanged = false; } if (params.networkSizeChanged) { params.needParameterUpdate = true; params.networkSizeChanged = false; updateFdnSize (params.newNetworkSize); } if (params.delayLengthChanged) { delayLength = params.newDelayLength; indices = indexGen (fdnSize, delayLength); params.needParameterUpdate = true; params.delayLengthChanged = false; } if (params.overallGainChanged) { overallGain = params.newOverallGain; params.overallGainChanged = false; params.needParameterUpdate = true; } if (params.needParameterUpdate) updateParameterSettings(); params.needParameterUpdate = false; juce::dsp::AudioBlock& buffer = context.getOutputBlock(); const int nChannels = static_cast (buffer.getNumChannels()); const int numSamples = static_cast (buffer.getNumSamples()); //TODO andere belegung? // if more channels than network order, mix pairs of high order channels // until order == number of channels // if (nChannels > fdnSize) // { // int diff = nChannels - fdnSize; // int start_index = nChannels - diff * 2; // // for (int num = 0; num < diff; ++num) // { // int idx = start_index + num; // // float* writeIn = buffer.getChannelPointer (idx); // const float* writeOut1 = buffer.getChannelPointer (idx + num); // const float* writeOut2 = buffer.getChannelPointer (idx + num + 1); // // for (int i = 0; i < numSamples; ++i) // { // writeIn[i] = (writeOut1[i] + writeOut2[i]) / sqrt(2.f); // } // } // } float dryGain = 1.0f - dryWet; for (int i = 0; i < numSamples; ++i) { // apply delay to each channel for one time sample for (int channel = 0; channel < fdnSize; ++channel) { const int idx = std::min (channel, nChannels - 1); float* const channelData = buffer.getChannelPointer (idx); float* const delayData = delayBufferVector[channel]->getWritePointer (0); int delayPos = delayPositionVector[channel]; const float inSample = channelData[i]; if (! freeze) { // data exchange between IO buffer and delay buffer if (channel < nChannels) delayData[delayPos] += inSample; } if (! freeze) { // Apply highpass filter if (hpFilterParameters.mode != 0) delayData[delayPos] = hpFilters[channel]->processSample (delayData[delayPos]); if (hpFilterParameters.mode == 3) delayData[delayPos] = additionalHpFilters[channel]->processSample (delayData[delayPos]); // apply shelving filters delayData[delayPos] = highShelfFilters[channel]->processSingleSampleRaw (delayData[delayPos]); delayData[delayPos] = lowShelfFilters[channel]->processSingleSampleRaw (delayData[delayPos]); } if (channel < nChannels) { channelData[i] = delayData[delayPos] * dryWet; channelData[i] += inSample * dryGain; } if (! freeze) transferVector.set (channel, delayData[delayPos] * feedbackGainVector[channel]); else transferVector.set (channel, delayData[delayPos]); } // perform fast walsh hadamard transform fwht (transferVector.getRawDataPointer(), transferVector.size()); // write back into delay buffer // increment the delay buffer pointer for (int channel = 0; channel < fdnSize; ++channel) { float* const delayData = delayBufferVector[channel]->getWritePointer (0); // the buffer is single channel int delayPos = delayPositionVector[channel]; delayData[delayPos] = transferVector[channel]; if (++delayPos >= delayBufferVector[channel]->getNumSamples()) delayPos = 0; delayPositionVector.set (channel, delayPos); } } // if more channels than network order, mix pairs of high order channels // until order == number of channels // if (nChannels > fdnSize) // { // int diff = nChannels - fdnSize; // int start_index = nChannels - diff * 2; // // for (int num = diff - 1; num < 0; --num) // { // int idx = start_index + num; // float *const writeOut = buffer.getChannelPointer (idx); // float *const writeIn1 = buffer.getChannelPointer (idx + num); // float *const writeIn2 = buffer.getChannelPointer (idx + num + 1); // // for (int i = 0; i < numSamples; ++i) // { // writeIn1[i] = writeOut[i] / sqrt(2.f); // writeIn2[i] = writeIn1[i]; // } // } // } } void setDelayLength (int newDelayLength) { params.newDelayLength = juce::jmin (newDelayLength, maxDelayLength); params.delayLengthChanged = true; } void reset() override {} void setFilterParameter (FilterParameter lowShelf, FilterParameter highShelf, HPFilterParameter hp) { params.newLowShelfParams = lowShelf; params.newHighShelfParams = highShelf; params.newHPFilterParams = hp; params.filterParametersChanged = true; } void setT60InSeconds (float reverbTime) { double temp; double t = double (reverbTime); temp = -60.0 / (20.0 * t); params.newOverallGain = pow (10.0, temp); params.overallGainChanged = true; } void setOverallGainPerSecond (float gainPerSecond) { params.newOverallGain = gainPerSecond; params.overallGainChanged = true; } juce::dsp::IIR::Coefficients::Ptr getCoefficientsForGui (const int filterIndex) const { return guiCoefficients[filterIndex]; } void updateGuiCoefficients() { // Highpass coefficients switch (hpFilterParameters.mode) { case 0: guiCoefficients[0] = IIR::Coefficients::makeAllPass (spec.sampleRate, 20.0f); break; case 1: guiCoefficients[0] = IIR::Coefficients::makeFirstOrderHighPass ( spec.sampleRate, juce::jmin (0.5 * spec.sampleRate, static_cast (hpFilterParameters.frequency))); break; case 2: guiCoefficients[0] = IIR::Coefficients::makeHighPass ( spec.sampleRate, juce::jmin (0.5 * spec.sampleRate, static_cast (hpFilterParameters.frequency)), hpFilterParameters.q); break; case 3: { auto coeffs = IIR::Coefficients::makeHighPass ( spec.sampleRate, juce::jmin (0.5 * spec.sampleRate, static_cast (hpFilterParameters.frequency))); coeffs->coefficients = FilterVisualizerHelper::cascadeSecondOrderCoefficients ( coeffs->coefficients, coeffs->coefficients); guiCoefficients[0] = coeffs; break; } default: guiCoefficients[0] = IIR::Coefficients::makeAllPass (spec.sampleRate, 20.0f); break; } // Lowshelf guiCoefficients[1] = IIR::Coefficients::makeLowShelf ( spec.sampleRate, juce::jmin (0.5 * spec.sampleRate, static_cast (lowShelfParameters.frequency)), lowShelfParameters.q, lowShelfParameters.linearGain); // Highshelf guiCoefficients[2] = IIR::Coefficients::makeHighShelf ( spec.sampleRate, juce::jmin (0.5 * spec.sampleRate, static_cast (highShelfParameters.frequency)), highShelfParameters.q, highShelfParameters.linearGain); repaintFV = true; } void getT60ForFrequencyArray (double* frequencies, double* t60Data, size_t numSamples) { std::vector temp; temp.resize (numSamples); juce::dsp::IIR::Coefficients coefficients; updateGuiCoefficients(); for (int i = 0; i < 3; ++i) { coefficients = *getCoefficientsForGui (i); coefficients.getMagnitudeForFrequencyArray (frequencies, &temp[0], numSamples, spec.sampleRate); } juce::FloatVectorOperations::multiply (&temp[0], t60Data, static_cast (numSamples)); juce::FloatVectorOperations::multiply (&temp[0], overallGain, static_cast (numSamples)); for (int i = 0; i < numSamples; ++i) { t60Data[i] = -3.0 / log10 (temp[i]); } } void setFreeze (bool shouldFreeze) { freeze = shouldFreeze; if (freeze) DBG ("freeze is true"); } void setFdnSize (FdnSize size) { if (fdnSize != size) { params.newNetworkSize = size; params.networkSizeChanged = true; } } const FdnSize getFdnSize() { return params.newNetworkSize; } std::atomic repaintFV = true; private: //============================================================================== juce::dsp::ProcessSpec spec = { 48000.0, 0, 0 }; juce::OwnedArray> delayBufferVector; juce::OwnedArray highShelfFilters; juce::OwnedArray lowShelfFilters; juce::dsp::IIR::Coefficients::Ptr hpCoefficients = juce::dsp::IIR::Coefficients::makeAllPass (48000.0, 20.0f); juce::dsp::IIR::Coefficients::Ptr additionalHpCoefficients = juce::dsp::IIR::Coefficients::makeAllPass (48000.0, 20.0f); juce::OwnedArray> hpFilters; juce::OwnedArray> additionalHpFilters; juce::dsp::IIR::Coefficients::Ptr guiCoefficients[3]; juce::Array delayPositionVector; juce::Array feedbackGainVector; juce::Array transferVector; std::vector primeNumbers; std::vector indices; FilterParameter lowShelfParameters, highShelfParameters; HPFilterParameter hpFilterParameters; float dryWet; float delayLength = 20; float overallGain; bool freeze = false; bool isInitialized = false; FdnSize fdnSize = uninitialized; struct UpdateStruct { bool dryWetChanged = false; float newDryWet = 0; bool filterParametersChanged = false; FilterParameter newLowShelfParams; FilterParameter newHighShelfParams; HPFilterParameter newHPFilterParams; bool delayLengthChanged = false; int newDelayLength = 20; bool networkSizeChanged = false; FdnSize newNetworkSize = FdnSize::big; bool overallGainChanged = false; float newOverallGain = 0.5; bool needParameterUpdate = false; }; UpdateStruct params; inline int delayLengthConversion (int channel) { // we divide by 10 to get better range for room size setting float delayLenMillisec = primeNumbers[indices[channel]] / 10.f; return int (delayLenMillisec / 1000.f * spec.sampleRate); //convert to samples } inline float channelGainConversion (int channel, float gain) { int delayLenSamples = delayLengthConversion (channel); double length = double (delayLenSamples) / double (spec.sampleRate); return pow (gain, length); } std::vector indexGen (FdnSize nChannels, int delayLength) { const int firstIncrement = delayLength / 10; const int finalIncrement = delayLength; std::vector indices; if (firstIncrement < 1) indices.push_back (1.f); else indices.push_back (firstIncrement); float increment; int index; for (int i = 1; i < nChannels; i++) { increment = firstIncrement + abs (finalIncrement - firstIncrement) / float (nChannels) * i; if (increment < 1) increment = 1.f; index = int (round (indices[i - 1] + increment)); indices.push_back (index); } return indices; } std::vector primeNumGen (int count) { std::vector series; int range = 3; while (series.size() < count) { bool is_prime = true; for (int i = 2; i < range; i++) { if (range % i == 0) { is_prime = false; break; } } if (is_prime) series.push_back (range); range += 2; } return series; } //------------------------------------------------------------------------------ inline void updateParameterSettings() { indices = indexGen (fdnSize, delayLength); for (int channel = 0; channel < fdnSize; ++channel) { // update multichannel delay parameters int delayLenSamples = delayLengthConversion (channel); delayBufferVector[channel]->setSize (1, delayLenSamples, true, true, true); if (delayPositionVector[channel] >= delayBufferVector[channel]->getNumSamples()) delayPositionVector.set (channel, 0); } updateFeedBackGainVector(); updateFilterCoefficients(); } void updateFeedBackGainVector() { for (int channel = 0; channel < fdnSize; ++channel) { feedbackGainVector.set (channel, channelGainConversion (channel, overallGain)); } } void updateFilterCoefficients() { if (isInitialized) { // update shelving filter parameters for (int channel = 0; channel < fdnSize; ++channel) { lowShelfFilters[channel]->setCoefficients (juce::IIRCoefficients::makeLowShelf ( spec.sampleRate, juce::jmin (0.5 * spec.sampleRate, static_cast (lowShelfParameters.frequency)), lowShelfParameters.q, channelGainConversion (channel, lowShelfParameters.linearGain))); highShelfFilters[channel]->setCoefficients (juce::IIRCoefficients::makeHighShelf ( spec.sampleRate, juce::jmin (0.5 * spec.sampleRate, static_cast (highShelfParameters.frequency)), highShelfParameters.q, channelGainConversion (channel, highShelfParameters.linearGain))); } juce::dsp::IIR::Coefficients::Ptr tmpCoeffs; switch (hpFilterParameters.mode) { case 1: tmpCoeffs = juce::dsp::IIR::Coefficients::makeFirstOrderHighPass ( spec.sampleRate, juce::jmin (0.5 * spec.sampleRate, static_cast (hpFilterParameters.frequency))); *hpCoefficients = *tmpCoeffs; break; case 2: tmpCoeffs = juce::dsp::IIR::Coefficients::makeHighPass ( spec.sampleRate, juce::jmin (0.5 * spec.sampleRate, static_cast (hpFilterParameters.frequency)), hpFilterParameters.q); *hpCoefficients = *tmpCoeffs; break; case 3: tmpCoeffs = juce::dsp::IIR::Coefficients::makeHighPass ( spec.sampleRate, juce::jmin (0.5 * spec.sampleRate, static_cast (hpFilterParameters.frequency))); *hpCoefficients = *tmpCoeffs; break; default: tmpCoeffs = juce::dsp::IIR::Coefficients::makeAllPass ( spec.sampleRate, juce::jmin (0.5 * spec.sampleRate, static_cast (hpFilterParameters.frequency))); *hpCoefficients = *tmpCoeffs; } updateGuiCoefficients(); } } void updateFdnSize (FdnSize newSize) { if (fdnSize != newSize) { const int diff = newSize - delayBufferVector.size(); if (fdnSize < newSize) { for (int i = 0; i < diff; i++) { delayBufferVector.add (new juce::AudioBuffer()); highShelfFilters.add (new juce::IIRFilter()); lowShelfFilters.add (new juce::IIRFilter()); hpFilters.add (new juce::dsp::IIR::Filter (hpCoefficients)); additionalHpFilters.add (new juce::dsp::IIR::Filter (hpCoefficients)); } } else { //TODO: what happens if newSize == 0?; delayBufferVector.removeLast (diff); highShelfFilters.removeLast (diff); lowShelfFilters.removeLast (diff); hpFilters.removeLast (diff); additionalHpFilters.removeLast (diff); } } delayPositionVector.resize (newSize); feedbackGainVector.resize (newSize); transferVector.resize (newSize); fdnSize = newSize; } }; IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/ht-api-juce/0000775002537200253720000000000015257173642026747 5ustar zmoelnigzmoelnigIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/AudioProcessorBase.h0000664002537200253720000001247415257173642030556 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2019 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once #include #include "IOHelper.h" #include "OSC/OSCInputStream.h" #include "OSC/OSCParameterInterface.h" typedef std::vector> ParameterList; template class AudioProcessorBase : public juce::AudioProcessor, public OSCMessageInterceptor, public juce::VST2ClientExtensions, public IOHelper, public juce::AudioProcessorValueTreeState::Listener { public: AudioProcessorBase() : AudioProcessor(), oscParameterInterface (*this, parameters), parameters (*this, nullptr, juce::String (JucePlugin_Name), {}) { } AudioProcessorBase (ParameterList parameterLayout) : AudioProcessor(), parameters (*this, nullptr, juce::String (JucePlugin_Name), { parameterLayout.begin(), parameterLayout.end() }), oscParameterInterface (*this, parameters) { } AudioProcessorBase (const BusesProperties& ioLayouts, ParameterList parameterLayout) : AudioProcessor (ioLayouts), parameters (*this, nullptr, juce::String (JucePlugin_Name), { parameterLayout.begin(), parameterLayout.end() }), oscParameterInterface (*this, parameters) { } ~AudioProcessorBase() override {} VST2ClientExtensions* getVST2ClientExtensions() override { return this; } //======== AudioProcessor stuff ======================================================= #ifndef JucePlugin_PreferredChannelConfigurations bool isBusesLayoutSupported (const BusesLayout& layouts) const override { ignoreUnused (layouts); return true; } #endif const juce::String getName() const override { return JucePlugin_Name; } bool acceptsMidi() const override { #if JucePlugin_WantsMidiInput return true; #else return false; #endif } bool producesMidi() const override { #if JucePlugin_ProducesMidiOutput return true; #else return false; #endif } double getTailLengthSeconds() const override { return 0.0; } //======== VSTCallbackHandler ======================================================= juce::pointer_sized_int handleVstManufacturerSpecific (juce::int32 index, juce::pointer_sized_int value, void* ptr, float opt) override { juce::ignoreUnused (opt); //0x69656D is hex code for `iem` in ASCII if (index == 0x0069656D) // prefix 00 chooses OSC message { try { size_t size = static_cast (value); // let's make this the data size MyOSCInputStream inputStream (ptr, size); auto inMessage = inputStream.readMessage(); oscParameterInterface.oscMessageReceived (inMessage); return 1; } catch (const juce::OSCFormatError&) { return -1; } } return 0; } juce::pointer_sized_int handleVstPluginCanDo (juce::int32 index, juce::pointer_sized_int value, void* ptr, float opt) override { juce::ignoreUnused (index, value, opt); auto text = (const char*) ptr; auto matches = [=] (const char* s) { return strcmp (text, s) == 0; }; if (matches ("wantsChannelCountNotifications")) return 1; if (matches ("hasIEMExtensions")) return 1; return 0; } //============================================================================== OSCParameterInterface& getOSCParameterInterface() { return oscParameterInterface; } //============================================================================== juce::AudioProcessorValueTreeState parameters; OSCParameterInterface oscParameterInterface; private: bool shouldOpenNewPort = false; int newPortNumber = -1; }; IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/Standalone/0000775002537200253720000000000015257173642026731 5ustar zmoelnigzmoelnigIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/Standalone/IEM_JackAudio.h0000664002537200253720000006522115257173642031434 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ /* The following code taken from JUCE and modified. */ /* ============================================================================== This file is part of the JUCE library. Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. The code included in this file is provided under the terms of the ISC license http://www.isc.org/downloads/software-support-policy/isc-license. Permission To use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted provided that the above copyright notice and this permission notice appear in all copies. JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE DISCLAIMED. ============================================================================== */ #include #include #if JUCE_JACK #define IEM_JACK_DEVICENAME "JACK(iem)" #else #define IEM_JACK_DEVICENAME "JACK" #endif namespace iem { static void* juce_libjackHandle = nullptr; static void* juce_loadJackFunction (const char* const name) { if (juce_libjackHandle == nullptr) return nullptr; return dlsym (juce_libjackHandle, name); } #if JUCE_MAC #define JACK_LIB_NAMES "libjack.0.dylib", "libjack.dylib" #elif JUCE_LINUX #define JACK_LIB_NAMES "libjack.so.0", "libjack.so" #endif #define JUCE_DECL_JACK_FUNCTION(return_type, fn_name, argument_types, arguments) \ return_type fn_name argument_types \ { \ using ReturnType = return_type; \ typedef return_type (*fn_type) argument_types; \ static fn_type fn = (fn_type) juce_loadJackFunction (#fn_name); \ jassert (fn != nullptr); \ return (fn != nullptr) ? ((*fn) arguments) : ReturnType(); \ } #define JUCE_DECL_VOID_JACK_FUNCTION(fn_name, argument_types, arguments) \ void fn_name argument_types \ { \ typedef void (*fn_type) argument_types; \ static fn_type fn = (fn_type) juce_loadJackFunction (#fn_name); \ jassert (fn != nullptr); \ if (fn != nullptr) \ (*fn) arguments; \ } //============================================================================== JUCE_DECL_JACK_FUNCTION ( jack_client_t*, jack_client_open, (const char* client_name, jack_options_t options, jack_status_t* status, ...), (client_name, options, status)) JUCE_DECL_JACK_FUNCTION (int, jack_client_close, (jack_client_t * client), (client)) JUCE_DECL_JACK_FUNCTION (int, jack_activate, (jack_client_t * client), (client)) JUCE_DECL_JACK_FUNCTION (int, jack_deactivate, (jack_client_t * client), (client)) JUCE_DECL_JACK_FUNCTION (char*, jack_get_client_name, (jack_client_t * client), (client)); JUCE_DECL_JACK_FUNCTION (jack_nframes_t, jack_get_buffer_size, (jack_client_t * client), (client)) JUCE_DECL_JACK_FUNCTION (jack_nframes_t, jack_get_sample_rate, (jack_client_t * client), (client)) JUCE_DECL_VOID_JACK_FUNCTION (jack_on_shutdown, (jack_client_t * client, void (*function) (void* arg), void* arg), (client, function, arg)) JUCE_DECL_VOID_JACK_FUNCTION (jack_on_info_shutdown, (jack_client_t * client, JackInfoShutdownCallback function, void* arg), (client, function, arg)) JUCE_DECL_JACK_FUNCTION (void*, jack_port_get_buffer, (jack_port_t * port, jack_nframes_t nframes), (port, nframes)) JUCE_DECL_JACK_FUNCTION (jack_nframes_t, jack_port_get_total_latency, (jack_client_t * client, jack_port_t* port), (client, port)) JUCE_DECL_JACK_FUNCTION (jack_port_t*, jack_port_register, (jack_client_t * client, const char* port_name, const char* port_type, unsigned long flags, unsigned long buffer_size), (client, port_name, port_type, flags, buffer_size)) JUCE_DECL_VOID_JACK_FUNCTION (jack_set_error_function, (void (*func) (const char*)), (func)) JUCE_DECL_JACK_FUNCTION (int, jack_set_process_callback, (jack_client_t * client, JackProcessCallback process_callback, void* arg), (client, process_callback, arg)) JUCE_DECL_JACK_FUNCTION (const char**, jack_get_ports, (jack_client_t * client, const char* port_name_pattern, const char* type_name_pattern, unsigned long flags), (client, port_name_pattern, type_name_pattern, flags)) JUCE_DECL_JACK_FUNCTION (int, jack_connect, (jack_client_t * client, const char* source_port, const char* destination_port), (client, source_port, destination_port)) JUCE_DECL_JACK_FUNCTION (const char*, jack_port_name, (const jack_port_t* port), (port)) JUCE_DECL_JACK_FUNCTION (void*, jack_set_port_connect_callback, (jack_client_t * client, JackPortConnectCallback connect_callback, void* arg), (client, connect_callback, arg)) JUCE_DECL_JACK_FUNCTION (jack_port_t*, jack_port_by_id, (jack_client_t * client, jack_port_id_t port_id), (client, port_id)) JUCE_DECL_JACK_FUNCTION (int, jack_port_connected, (const jack_port_t* port), (port)) JUCE_DECL_JACK_FUNCTION (int, jack_port_connected_to, (const jack_port_t* port, const char* port_name), (port, port_name)) JUCE_DECL_JACK_FUNCTION (int, jack_set_xrun_callback, (jack_client_t * client, JackXRunCallback xrun_callback, void* arg), (client, xrun_callback, arg)) JUCE_DECL_JACK_FUNCTION (int, jack_port_flags, (const jack_port_t* port), (port)) JUCE_DECL_JACK_FUNCTION (jack_port_t*, jack_port_by_name, (jack_client_t * client, const char* name), (client, name)) JUCE_DECL_VOID_JACK_FUNCTION (jack_free, (void* ptr), (ptr)) #if JUCE_DEBUG #define JACK_LOGGING_ENABLED 1 #endif #if JACK_LOGGING_ENABLED namespace { void jack_Log (const juce::String& s) { std::cerr << s << std::endl; } const char* getJackErrorMessage (const jack_status_t status) { if (status & JackServerFailed || status & JackServerError) return "Unable to connect to JACK server"; if (status & JackVersionError) return "Client's protocol version does not match"; if (status & JackInvalidOption) return "The operation contained an invalid or unsupported option"; if (status & JackNameNotUnique) return "The desired client name was not unique"; if (status & JackNoSuchClient) return "Requested client does not exist"; if (status & JackInitFailure) return "Unable to initialize client"; return nullptr; } } // namespace #define JUCE_JACK_LOG_STATUS(x) \ { \ if (const char* m = getJackErrorMessage (x)) \ jack_Log (m); \ } #define JUCE_JACK_LOG(x) jack_Log (x) #else #define JUCE_JACK_LOG_STATUS(x) \ { \ } #define JUCE_JACK_LOG(x) \ { \ } #endif //============================================================================== #ifndef JUCE_JACK_CLIENT_NAME #ifdef JucePlugin_Name #define JUCE_JACK_CLIENT_NAME JucePlugin_Name #else #define JUCE_JACK_CLIENT_NAME "JUCEJack" #endif #endif struct JackPortIterator { JackPortIterator (jack_client_t* const client, const bool forInput) { if (client != nullptr) ports.reset (iem::jack_get_ports (client, nullptr, nullptr, forInput ? JackPortIsInput : JackPortIsOutput)); } bool next() { if (ports == nullptr || ports.get()[index + 1] == nullptr) return false; name = juce::CharPointer_UTF8 (ports.get()[++index]); return true; } juce::String getClientName() const { return name.upToFirstOccurrenceOf (":", false, false); } juce::String getChannelName() const { return name.fromFirstOccurrenceOf (":", false, false); } struct Free { void operator() (const char** ptr) const noexcept { iem::jack_free (ptr); } }; std::unique_ptr ports; int index = -1; juce::String name; }; //============================================================================== class JackAudioIODevice : public juce::AudioIODevice { public: JackAudioIODevice (const juce::String& inName, const juce::String& outName, std::function notifyIn) : AudioIODevice (outName.isEmpty() ? inName : outName, IEM_JACK_DEVICENAME), inputName (inName), outputName (outName), notifyChannelsChanged (std::move (notifyIn)) { jassert (outName.isNotEmpty() || inName.isNotEmpty()); jack_status_t status = {}; client = iem::jack_client_open (JUCE_JACK_CLIENT_NAME, JackNoStartServer, &status); if (client == nullptr) { JUCE_JACK_LOG_STATUS (status); } else { iem::jack_set_error_function (errorCallback); name = iem::jack_get_client_name (client); // open input ports const juce::StringArray inputChannels (getInputChannelNames()); for (int i = 0; i < ProcessorClass::numberOfInputChannels; ++i) { juce::String inputChannelName; inputChannelName << "in_" << ++totalNumberOfInputChannels; inputPorts.add (iem::jack_port_register (client, inputChannelName.toUTF8(), JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput, 0)); } // open output ports const juce::StringArray outputChannels (getOutputChannelNames()); for (int i = 0; i < ProcessorClass::numberOfOutputChannels; ++i) { juce::String outputChannelName; outputChannelName << "out_" << ++totalNumberOfOutputChannels; outputPorts.add (iem::jack_port_register (client, outputChannelName.toUTF8(), JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0)); } inChans.calloc (totalNumberOfInputChannels + 2); outChans.calloc (totalNumberOfOutputChannels + 2); } } ~JackAudioIODevice() override { close(); if (client != nullptr) { iem::jack_client_close (client); client = nullptr; } } juce::StringArray getChannelNames (const juce::String& clientName, bool forInput) const { juce::StringArray names; for (JackPortIterator i (client, forInput); i.next();) if (i.getClientName() == clientName) names.add (i.getChannelName()); return names; } juce::StringArray getOutputChannelNames() override { return getChannelNames (outputName, true); } juce::StringArray getInputChannelNames() override { return getChannelNames (inputName, false); } juce::Array getAvailableSampleRates() override { juce::Array rates; if (client != nullptr) rates.add (iem::jack_get_sample_rate (client)); return rates; } juce::Array getAvailableBufferSizes() override { juce::Array sizes; if (client != nullptr) sizes.add (static_cast (iem::jack_get_buffer_size (client))); return sizes; } int getDefaultBufferSize() override { return getCurrentBufferSizeSamples(); } int getCurrentBufferSizeSamples() override { return client != nullptr ? static_cast (iem::jack_get_buffer_size (client)) : 0; } double getCurrentSampleRate() override { return client != nullptr ? static_cast (iem::jack_get_sample_rate (client)) : 0; } template void forEachClientChannel (const juce::String& clientName, bool isInput, Fn&& fn) { auto index = 0; for (JackPortIterator i (client, isInput); i.next();) { if (i.getClientName() != clientName) continue; fn (i.ports.get()[i.index], index); index += 1; } } juce::String open (const juce::BigInteger& /*inputChannels*/, const juce::BigInteger& /*outputChannels*/, double /* sampleRate */, int /* bufferSizeSamples */) override { if (client == nullptr) { lastError = "No JACK client running"; return lastError; } lastError.clear(); close(); xruns.store (0, std::memory_order_relaxed); iem::jack_set_process_callback (client, processCallback, this); iem::jack_set_port_connect_callback (client, portConnectCallback, this); iem::jack_on_shutdown (client, shutdownCallback, this); iem::jack_on_info_shutdown (client, infoShutdownCallback, this); iem::jack_set_xrun_callback (client, xrunCallback, this); iem::jack_activate (client); deviceIsOpen = true; updateActivePorts(); return lastError; } void close() override { stop(); if (client != nullptr) { const auto result = iem::jack_deactivate (client); jassertquiet (result == 0); iem::jack_set_xrun_callback (client, xrunCallback, nullptr); iem::jack_set_process_callback (client, processCallback, nullptr); iem::jack_set_port_connect_callback (client, portConnectCallback, nullptr); iem::jack_on_shutdown (client, shutdownCallback, nullptr); iem::jack_on_info_shutdown (client, infoShutdownCallback, nullptr); } deviceIsOpen = false; } void start (juce::AudioIODeviceCallback* newCallback) override { if (deviceIsOpen && newCallback != callback) { if (newCallback != nullptr) newCallback->audioDeviceAboutToStart (this); juce::AudioIODeviceCallback* const oldCallback = callback; { const juce::ScopedLock sl (callbackLock); callback = newCallback; } if (oldCallback != nullptr) oldCallback->audioDeviceStopped(); } } void stop() override { start (nullptr); } bool isOpen() override { return deviceIsOpen; } bool isPlaying() override { return callback != nullptr; } int getCurrentBitDepth() override { return 32; } juce::String getLastError() override { return lastError; } int getXRunCount() const noexcept override { return xruns.load (std::memory_order_relaxed); } juce::BigInteger getActiveOutputChannels() const override { return activeOutputChannels; } juce::BigInteger getActiveInputChannels() const override { return activeInputChannels; } int getOutputLatencyInSamples() override { int latency = 0; for (int i = 0; i < outputPorts.size(); i++) latency = juce::jmax (latency, (int) iem::jack_port_get_total_latency (client, outputPorts[i])); return latency; } int getInputLatencyInSamples() override { int latency = 0; for (int i = 0; i < inputPorts.size(); i++) latency = juce::jmax (latency, (int) iem::jack_port_get_total_latency (client, inputPorts[i])); return latency; } juce::String inputName, outputName; private: //============================================================================== class MainThreadDispatcher : private juce::AsyncUpdater { public: explicit MainThreadDispatcher (JackAudioIODevice& device) : ref (device) {} ~MainThreadDispatcher() override { cancelPendingUpdate(); } void updateActivePorts() { if (juce::MessageManager::getInstance()->isThisTheMessageThread()) handleAsyncUpdate(); else triggerAsyncUpdate(); } private: void handleAsyncUpdate() override { ref.updateActivePorts(); } JackAudioIODevice& ref; }; //============================================================================== void process (const int numSamples) { int numActiveInChans = 0, numActiveOutChans = 0; for (int i = 0; i < totalNumberOfInputChannels; ++i) { if (activeInputChannels[i]) if (auto* in = (jack_default_audio_sample_t*) iem::jack_port_get_buffer ( inputPorts.getUnchecked (i), static_cast (numSamples))) inChans[numActiveInChans++] = (float*) in; } for (int i = 0; i < totalNumberOfOutputChannels; ++i) { if (activeOutputChannels[i]) if (auto* out = (jack_default_audio_sample_t*) iem::jack_port_get_buffer ( outputPorts.getUnchecked (i), static_cast (numSamples))) outChans[numActiveOutChans++] = (float*) out; } const juce::ScopedLock sl (callbackLock); if (callback != nullptr) { if ((numActiveInChans + numActiveOutChans) > 0) callback->audioDeviceIOCallbackWithContext (inChans.getData(), numActiveInChans, outChans, numActiveOutChans, numSamples, {}); } else { for (int i = 0; i < numActiveOutChans; ++i) juce::zeromem (outChans[i], static_cast (numSamples) * sizeof (float)); } } static int processCallback (jack_nframes_t nframes, void* callbackArgument) { if (callbackArgument != nullptr) ((JackAudioIODevice*) callbackArgument)->process (static_cast (nframes)); return 0; } static int xrunCallback (void* callbackArgument) { if (callbackArgument != nullptr) ((JackAudioIODevice*) callbackArgument)->xruns++; return 0; } void updateActivePorts() { juce::BigInteger newOutputChannels, newInputChannels; for (int i = 0; i < outputPorts.size(); ++i) newOutputChannels.setBit (i); for (int i = 0; i < inputPorts.size(); ++i) newInputChannels.setBit (i); activeOutputChannels = newOutputChannels; activeInputChannels = newInputChannels; } static void portConnectCallback (jack_port_id_t, jack_port_id_t, int, void* arg) { if (JackAudioIODevice* device = static_cast (arg)) device->mainThreadDispatcher.updateActivePorts(); } static void threadInitCallback (void* /* callbackArgument */) { JUCE_JACK_LOG ("JackAudioIODevice::initialise"); } static void shutdownCallback (void* callbackArgument) { JUCE_JACK_LOG ("JackAudioIODevice::shutdown"); if (JackAudioIODevice* device = (JackAudioIODevice*) callbackArgument) { device->client = nullptr; device->close(); } } static void infoShutdownCallback (jack_status_t code, const char* reason, void* arg) { jassertquiet (code == 0); JUCE_JACK_LOG ("Shutting down with message:"); JUCE_JACK_LOG (reason); juce::ignoreUnused (reason); shutdownCallback (arg); } static void errorCallback (const char* msg) { JUCE_JACK_LOG ("JackAudioIODevice::errorCallback " + juce::String (msg)); juce::ignoreUnused (msg); } bool deviceIsOpen = false; jack_client_t* client = nullptr; juce::String lastError; juce::AudioIODeviceCallback* callback = nullptr; juce::CriticalSection callbackLock; juce::HeapBlock inChans, outChans; int totalNumberOfInputChannels = 0; int totalNumberOfOutputChannels = 0; juce::Array inputPorts, outputPorts; juce::BigInteger activeInputChannels, activeOutputChannels; std::atomic xruns { 0 }; std::function notifyChannelsChanged; MainThreadDispatcher mainThreadDispatcher { *this }; }; //============================================================================== class JackAudioIODeviceType; #ifndef JACK_LIB_NAMES #define JACK_LIB_NAMES #endif class JackAudioIODeviceType : public juce::AudioIODeviceType { public: JackAudioIODeviceType() : AudioIODeviceType (IEM_JACK_DEVICENAME) {} void scanForDevices() { const char* libnames[] = { JACK_LIB_NAMES }; hasScanned = true; inputNames.clear(); outputNames.clear(); for (unsigned int i = 0; ! juce_libjackHandle && i < sizeof (libnames) / sizeof (*libnames); i++) { juce_libjackHandle = dlopen (libnames[i], RTLD_LAZY); } if (juce_libjackHandle == nullptr) return; jack_status_t status = {}; // open a dummy client if (auto* const client = iem::jack_client_open ("JuceJackDummy", JackNoStartServer, &status)) { // scan for output devices for (JackPortIterator i (client, false); i.next();) if (i.getClientName() != (currentDeviceName) && ! inputNames.contains (i.getClientName())) inputNames.add (i.getClientName()); // scan for input devices for (JackPortIterator i (client, true); i.next();) if (i.getClientName() != (currentDeviceName) && ! outputNames.contains (i.getClientName())) outputNames.add (i.getClientName()); iem::jack_client_close (client); } else { JUCE_JACK_LOG_STATUS (status); } } juce::StringArray getDeviceNames (bool wantInputNames) const { jassert (hasScanned); // need to call scanForDevices() before doing this return wantInputNames ? inputNames : outputNames; } int getDefaultDeviceIndex (bool /* forInput */) const { jassert (hasScanned); // need to call scanForDevices() before doing this return 0; } bool hasSeparateInputsAndOutputs() const { return true; } int getIndexOfDevice (juce::AudioIODevice* device, bool asInput) const { jassert (hasScanned); // need to call scanForDevices() before doing this if (JackAudioIODevice* d = dynamic_cast (device)) return asInput ? inputNames.indexOf (d->inputName) : outputNames.indexOf (d->outputName); return -1; } juce::AudioIODevice* createDevice (const juce::String& outputDeviceName, const juce::String& inputDeviceName) { jassert (hasScanned); // need to call scanForDevices() before doing this const int inputIndex = inputNames.indexOf (inputDeviceName); const int outputIndex = outputNames.indexOf (outputDeviceName); if (inputIndex >= 0 || outputIndex >= 0) { auto device = new JackAudioIODevice (inputDeviceName, outputDeviceName, [this] { callDeviceChangeListeners(); }); currentDeviceName = device->getName(); return device; } return nullptr; } private: juce::StringArray inputNames, outputNames, inputIds, outoutIds; bool hasScanned = false; juce::String currentDeviceName = ""; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (JackAudioIODeviceType) }; } // namespace iem ././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/Standalone/StandaloneApp.cppIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/Standalone/StandaloneApp.c0000664002537200253720000001405115257173642031627 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich, Felix Holzmueller Copyright (c) 2022 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ /* The following code taken from JUCE and modified. */ /* ============================================================================== This file is part of the JUCE library. Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. By using JUCE, you agree to the terms of both the JUCE 7 End-User License Agreement and JUCE Privacy Policy. End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see www.gnu.org/licenses). JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE DISCLAIMED. ============================================================================== */ #include #include #include "MyStandaloneFilterWindow.h" namespace juce { //============================================================================== class StandaloneApp : public JUCEApplication { public: StandaloneApp() { PluginHostType::jucePlugInClientCurrentWrapperType = AudioProcessor::wrapperType_Standalone; juce::PropertiesFile::Options options; options.applicationName = getApplicationName(); options.filenameSuffix = ".settings"; options.osxLibrarySubFolder = "Application Support/IEMAudioPlugins"; #if JUCE_LINUX || JUCE_BSD options.folderName = File::getSpecialLocation (File::userApplicationDataDirectory).getFullPathName() + File::getSeparatorString() + "IEMAudioPlugins"; #else options.folderName = "IEMAudioPlugins"; #endif appProperties.setStorageParameters (options); } const juce::String getApplicationName() override { return CharPointer_UTF8 (JucePlugin_Name); } const juce::String getApplicationVersion() override { return JucePlugin_VersionString; } bool moreThanOneInstanceAllowed() override { return true; } void anotherInstanceStarted (const juce::String&) override {} virtual MyStandaloneFilterWindow* createWindow() { #ifdef JucePlugin_PreferredChannelConfigurations StandalonePluginHolder::PluginInOuts channels[] = { JucePlugin_PreferredChannelConfigurations }; #endif return new MyStandaloneFilterWindow ( getApplicationName(), LookAndFeel::getDefaultLookAndFeel().findColour ( juce::ResizableWindow::backgroundColourId), appProperties.getUserSettings(), false, {}, nullptr #ifdef JucePlugin_PreferredChannelConfigurations , juce::Array (channels, juce::numElementsInArray (channels)) #else , {} #endif #if JUCE_DONT_AUTO_OPEN_MIDI_DEVICES_ON_MOBILE , false #endif ); } //============================================================================== void initialise (const juce::String&) override { mainWindow.reset (createWindow()); #if JUCE_STANDALONE_FILTER_WINDOW_USE_KIOSK_MODE Desktop::getInstance().setKioskModeComponent (mainWindow.get(), false); #endif mainWindow->setVisible (true); } void shutdown() override { mainWindow = nullptr; appProperties.saveIfNeeded(); } //============================================================================== void systemRequestedQuit() override { if (mainWindow.get() != nullptr) mainWindow->pluginHolder->savePluginState(); if (ModalComponentManager::getInstance()->cancelAllModalComponents()) { juce::Timer::callAfterDelay (100, []() { if (auto app = JUCEApplicationBase::getInstance()) app->systemRequestedQuit(); }); } else { quit(); } } protected: ApplicationProperties appProperties; std::unique_ptr mainWindow; }; } // namespace juce #if JucePlugin_Build_Standalone && JUCE_IOS JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wmissing-prototypes") using namespace juce; bool JUCE_CALLTYPE juce_isInterAppAudioConnected() { if (auto holder = StandalonePluginHolder::getInstance()) return holder->isInterAppAudioConnected(); return false; } void JUCE_CALLTYPE juce_switchToHostApplication() { if (auto holder = StandalonePluginHolder::getInstance()) holder->switchToHostApplication(); } Image JUCE_CALLTYPE juce_getIAAHostIcon (int size) { if (auto holder = StandalonePluginHolder::getInstance()) return holder->getIAAHostIcon (size); return Image(); } JUCE_END_IGNORE_WARNINGS_GCC_LIKE #endif START_JUCE_APPLICATION (juce::StandaloneApp) ././@LongLink0000644000000000000000000000016000000000000011600 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/Standalone/MyStandaloneFilterWindow.hIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/Standalone/MyStandaloneFil0000664002537200253720000013770615257173642031723 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich, Felix Holzmueller Copyright (c) 2022 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ /* The following code taken from JUCE and modified. */ /* ============================================================================== This file is part of the JUCE library. Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. By using JUCE, you agree to the terms of both the JUCE 7 End-User License Agreement and JUCE Privacy Policy. End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see www.gnu.org/licenses). JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE DISCLAIMED. ============================================================================== */ #pragma once #include "../customComponents/SimpleLabel.h" #include "../lookAndFeel/IEM_LaF.h" #include "IEM_AudioDeviceSelectorComponent.h" #include #if JUCE_MAC || JUCE_LINUX #if DONT_BUILD_WITH_JACK_SUPPORT #define BUILD_WITH_JACK_SUPPORT 0 #else #define BUILD_WITH_JACK_SUPPORT 1 #endif #else #define BUILD_WITH_JACK_SUPPORT 0 #endif #ifndef DOXYGEN #include #endif #if BUILD_WITH_JACK_SUPPORT #include "IEM_JackAudio.h" #endif #include //============================================================================== /** An object that creates and plays a standalone instance of an AudioProcessor. The object will create your processor using the same createPluginFilter() function that the other plugin wrappers use, and will run it through the computer's audio/MIDI devices using AudioDeviceManager and AudioProcessorPlayer. @tags{Audio} */ class MyStandalonePluginHolder : private juce::AudioIODeviceCallback, private juce::Timer, private juce::Value::Listener { public: //============================================================================== /** Structure used for the number of inputs and outputs. */ struct PluginInOuts { short numIns, numOuts; }; //============================================================================== /** Creates an instance of the default plugin. The settings object can be a PropertySet that the class should use to store its settings - the takeOwnershipOfSettings indicates whether this object will delete the settings automatically when no longer needed. The settings can also be nullptr. A default device name can be passed in. Preferably a complete setup options object can be used, which takes precedence over the preferredDefaultDeviceName and allows you to select the input & output device names, sample rate, buffer size etc. In all instances, the settingsToUse will take precedence over the "preferred" options if not null. */ MyStandalonePluginHolder ( juce::PropertySet* settingsToUse, bool takeOwnershipOfSettings = true, const juce::String& preferredDefaultDeviceName = juce::String(), const juce::AudioDeviceManager::AudioDeviceSetup* preferredSetupOptions = nullptr, const juce::Array& channels = juce::Array(), #if JUCE_ANDROID || JUCE_IOS bool shouldAutoOpenMidiDevices = true #else bool shouldAutoOpenMidiDevices = false #endif ) : settings (settingsToUse, takeOwnershipOfSettings), channelConfiguration (channels), autoOpenMidiDevices (shouldAutoOpenMidiDevices) { shouldMuteInput.addListener (this); shouldMuteInput = ! isInterAppAudioConnected(); createPlugin(); juce::OwnedArray types; deviceManager.createAudioDeviceTypes (types); for (auto* t : types) deviceManager.addAudioDeviceType (std::unique_ptr (t)); types.clearQuick (false); #if BUILD_WITH_JACK_SUPPORT deviceManager.addAudioDeviceType (std::make_unique()); #endif auto inChannels = (channelConfiguration.size() > 0 ? channelConfiguration[0].numIns : processor->getMainBusNumInputChannels()); if (preferredSetupOptions != nullptr) options.reset (new juce::AudioDeviceManager::AudioDeviceSetup (*preferredSetupOptions)); auto audioInputRequired = (inChannels > 0); if (audioInputRequired && juce::RuntimePermissions::isRequired (juce::RuntimePermissions::recordAudio) && ! juce::RuntimePermissions::isGranted (juce::RuntimePermissions::recordAudio)) juce::RuntimePermissions::request (juce::RuntimePermissions::recordAudio, [this, preferredDefaultDeviceName] (bool granted) { init (granted, preferredDefaultDeviceName); }); else init (audioInputRequired, preferredDefaultDeviceName); } void init (bool enableAudioInput, const juce::String& preferredDefaultDeviceName) { setupAudioDevices (enableAudioInput, preferredDefaultDeviceName, options.get()); reloadPluginState(); startPlaying(); if (autoOpenMidiDevices) startTimer (500); } ~MyStandalonePluginHolder() override { stopTimer(); deletePlugin(); shutDownAudioDevices(); } //============================================================================== virtual void createPlugin() { processor = createPluginFilterOfType (juce::AudioProcessor::wrapperType_Standalone); processor->disableNonMainBuses(); processor->setRateAndBufferSizeDetails (44100, 512); processorHasPotentialFeedbackLoop = (getNumInputChannels() > 0 && getNumOutputChannels() > 0); } virtual void deletePlugin() { stopPlaying(); processor = nullptr; } int getNumInputChannels() const { if (processor == nullptr) return 0; return (channelConfiguration.size() > 0 ? channelConfiguration[0].numIns : processor->getMainBusNumInputChannels()); } int getNumOutputChannels() const { if (processor == nullptr) return 0; return (channelConfiguration.size() > 0 ? channelConfiguration[0].numOuts : processor->getMainBusNumOutputChannels()); } static juce::String getFilePatterns (const juce::String& fileSuffix) { if (fileSuffix.isEmpty()) return {}; return (fileSuffix.startsWithChar ('.') ? "*" : "*.") + fileSuffix; } //============================================================================== juce::Value& getMuteInputValue() { return shouldMuteInput; } bool getProcessorHasPotentialFeedbackLoop() const { return processorHasPotentialFeedbackLoop; } void valueChanged (juce::Value& value) override { muteInput = (bool) value.getValue(); } //============================================================================== juce::File getLastFile() const { juce::File f; if (settings != nullptr) f = juce::File (settings->getValue ("lastStateFile")); if (f == juce::File()) f = juce::File::getSpecialLocation (juce::File::userDocumentsDirectory); return f; } void setLastFile (const juce::FileChooser& fc) { if (settings != nullptr) settings->setValue ("lastStateFile", fc.getResult().getFullPathName()); } /** Pops up a dialog letting the user save the processor's state to a file. */ void askUserToSaveState (const juce::String& fileSuffix = juce::String()) { stateFileChooser = std::make_unique (TRANS ("Save current state"), getLastFile(), getFilePatterns (fileSuffix)); auto flags = juce::FileBrowserComponent::saveMode | juce::FileBrowserComponent::canSelectFiles | juce::FileBrowserComponent::warnAboutOverwriting; stateFileChooser->launchAsync ( flags, [this] (const juce::FileChooser& fc) { if (fc.getResult() == juce::File {}) return; setLastFile (fc); juce::MemoryBlock data; processor->getStateInformation (data); if (! fc.getResult().replaceWithData (data.getData(), data.getSize())) juce::AlertWindow::showMessageBoxAsync ( juce::AlertWindow::WarningIcon, TRANS ("Error whilst saving"), TRANS ("Couldn't write to the specified file!")); }); } /** Pops up a dialog letting the user re-load the processor's state from a file. */ void askUserToLoadState (const juce::String& fileSuffix = juce::String()) { stateFileChooser = std::make_unique (TRANS ("Load a saved state"), getLastFile(), getFilePatterns (fileSuffix)); auto flags = juce::FileBrowserComponent::openMode | juce::FileBrowserComponent::canSelectFiles; stateFileChooser->launchAsync ( flags, [this] (const juce::FileChooser& fc) { if (fc.getResult() == juce::File {}) return; setLastFile (fc); juce::MemoryBlock data; if (fc.getResult().loadFileAsData (data)) processor->setStateInformation (data.getData(), (int) data.getSize()); else juce::AlertWindow::showMessageBoxAsync ( juce::AlertWindow::WarningIcon, TRANS ("Error whilst loading"), TRANS ("Couldn't read from the specified file!")); }); } //============================================================================== void startPlaying() { player.setProcessor (processor.get()); #if JucePlugin_Enable_IAA && JUCE_IOS if (auto device = dynamic_cast (deviceManager.getCurrentAudioDevice())) { processor->setPlayHead (device->getAudioPlayHead()); device->setMidiMessageCollector (&player.getMidiMessageCollector()); } #endif } void stopPlaying() { player.setProcessor (nullptr); } //============================================================================== /** Shows an audio properties dialog box modally. */ void showAudioSettingsDialog() { juce::DialogWindow::LaunchOptions o; int maxNumInputs = 0, maxNumOutputs = 0; if (channelConfiguration.size() > 0) { auto& defaultConfig = channelConfiguration.getReference (0); maxNumInputs = juce::jmax (0, (int) defaultConfig.numIns); maxNumOutputs = juce::jmax (0, (int) defaultConfig.numOuts); } if (auto* bus = processor->getBus (true, 0)) maxNumInputs = juce::jmax (0, bus->getDefaultLayout().size()); if (auto* bus = processor->getBus (false, 0)) maxNumOutputs = juce::jmax (0, bus->getDefaultLayout().size()); auto content = std::make_unique (*this, deviceManager, maxNumInputs, maxNumOutputs); content->setSize (500, 550); content->setToRecommendedSize(); o.content.setOwned (content.release()); o.dialogTitle = TRANS ("Audio/MIDI Settings"); o.dialogBackgroundColour = o.content->getLookAndFeel().findColour (juce::ResizableWindow::backgroundColourId); o.escapeKeyTriggersCloseButton = true; o.useNativeTitleBar = true; o.resizable = false; o.launchAsync(); } void saveAudioDeviceState() { if (settings != nullptr) { auto xml = deviceManager.createStateXml(); settings->setValue ("audioSetup", xml.get()); #if ! (JUCE_IOS || JUCE_ANDROID) settings->setValue ("shouldMuteInput", (bool) shouldMuteInput.getValue()); #endif } } void reloadAudioDeviceState ( bool enableAudioInput, const juce::String& preferredDefaultDeviceName, const juce::AudioDeviceManager::AudioDeviceSetup* preferredSetupOptions) { std::unique_ptr savedState; if (settings != nullptr) { savedState = settings->getXmlValue ("audioSetup"); #if ! (JUCE_IOS || JUCE_ANDROID) shouldMuteInput.setValue (settings->getBoolValue ("shouldMuteInput", true)); #endif } auto inputChannels = getNumInputChannels(); auto outputChannels = getNumOutputChannels(); if (inputChannels == 0 && outputChannels == 0 && processor->isMidiEffect()) { // add a dummy output channel for MIDI effect plug-ins so they can receive audio callbacks outputChannels = 1; } deviceManager.initialise (enableAudioInput ? inputChannels : 0, outputChannels, savedState.get(), true, preferredDefaultDeviceName, preferredSetupOptions); } //============================================================================== void savePluginState() { if (settings != nullptr && processor != nullptr) { juce::MemoryBlock data; processor->getStateInformation (data); settings->setValue ("filterState", data.toBase64Encoding()); } } void reloadPluginState() { if (settings != nullptr) { juce::MemoryBlock data; if (data.fromBase64Encoding (settings->getValue ("filterState")) && data.getSize() > 0) processor->setStateInformation (data.getData(), (int) data.getSize()); } } //============================================================================== void switchToHostApplication() { #if JUCE_IOS if (auto device = dynamic_cast (deviceManager.getCurrentAudioDevice())) device->switchApplication(); #endif } bool isInterAppAudioConnected() { #if JUCE_IOS if (auto device = dynamic_cast (deviceManager.getCurrentAudioDevice())) return device->isInterAppAudioConnected(); #endif return false; } juce::Image getIAAHostIcon (int size) { #if JUCE_IOS && JucePlugin_Enable_IAA if (auto device = dynamic_cast (deviceManager.getCurrentAudioDevice())) return device->getIcon (size); #else juce::ignoreUnused (size); #endif return {}; } static MyStandalonePluginHolder* getInstance(); //============================================================================== juce::OptionalScopedPointer settings; std::unique_ptr processor; juce::AudioDeviceManager deviceManager; juce::AudioProcessorPlayer player; juce::Array channelConfiguration; // avoid feedback loop by default bool processorHasPotentialFeedbackLoop = true; std::atomic muteInput { true }; juce::Value shouldMuteInput; juce::AudioBuffer emptyBuffer; bool autoOpenMidiDevices; std::unique_ptr options; juce::Array lastMidiDevices; std::unique_ptr stateFileChooser; juce::String jackClientName = ""; private: /* This class can be used to ensure that audio callbacks use buffers with a predictable maximum size. On some platforms (such as iOS 10), the expected buffer size reported in audioDeviceAboutToStart may be smaller than the blocks passed to audioDeviceIOCallbackWithContext. This can lead to out-of-bounds reads if the render callback depends on additional buffers which were initialised using the smaller size. As a workaround, this class will ensure that the render callback will only ever be called with a block with a length less than or equal to the expected block size. */ class CallbackMaxSizeEnforcer : public AudioIODeviceCallback { public: explicit CallbackMaxSizeEnforcer (AudioIODeviceCallback& callbackIn) : inner (callbackIn) {} void audioDeviceAboutToStart (juce::AudioIODevice* device) override { maximumSize = device->getCurrentBufferSizeSamples(); storedInputChannels.resize ( (size_t) device->getActiveInputChannels().countNumberOfSetBits()); storedOutputChannels.resize ( (size_t) device->getActiveOutputChannels().countNumberOfSetBits()); inner.audioDeviceAboutToStart (device); } void audioDeviceIOCallbackWithContext ( const float* const* inputChannelData, int numInputChannels, float* const* outputChannelData, int numOutputChannels, int numSamples, const juce::AudioIODeviceCallbackContext& context) override { jassertquiet ((int) storedInputChannels.size() == numInputChannels); jassertquiet ((int) storedOutputChannels.size() == numOutputChannels); int position = 0; while (position < numSamples) { const auto blockLength = juce::jmin (maximumSize, numSamples - position); initChannelPointers (inputChannelData, storedInputChannels, position); initChannelPointers (outputChannelData, storedOutputChannels, position); inner.audioDeviceIOCallbackWithContext (storedInputChannels.data(), (int) storedInputChannels.size(), storedOutputChannels.data(), (int) storedOutputChannels.size(), blockLength, context); position += blockLength; } } void audioDeviceStopped() override { inner.audioDeviceStopped(); } private: struct GetChannelWithOffset { int offset; template auto operator() (Ptr ptr) const noexcept -> Ptr { return ptr + offset; } }; template void initChannelPointers (Ptr&& source, Vector&& target, int offset) { std::transform (source, source + target.size(), target.begin(), GetChannelWithOffset { offset }); } AudioIODeviceCallback& inner; int maximumSize = 0; std::vector storedInputChannels; std::vector storedOutputChannels; }; CallbackMaxSizeEnforcer maxSizeEnforcer { *this }; //============================================================================== class SettingsComponent : public juce::Component { public: SettingsComponent (MyStandalonePluginHolder& pluginHolder, juce::AudioDeviceManager& deviceManagerToUse, int maxAudioInputChannels, int maxAudioOutputChannels) : owner (pluginHolder), deviceSelector ( deviceManagerToUse, 0, maxAudioInputChannels, 0, maxAudioOutputChannels, true, (pluginHolder.processor.get() != nullptr && pluginHolder.processor->producesMidi()), true, false), shouldMuteLabel ("Feedback Loop:", "Feedback Loop:"), shouldMuteButton ("Mute audio input") { setOpaque (true); shouldMuteButton.setClickingTogglesState (true); shouldMuteButton.getToggleStateValue().referTo (owner.shouldMuteInput); addAndMakeVisible (deviceSelector); if (owner.getProcessorHasPotentialFeedbackLoop()) { addAndMakeVisible (shouldMuteButton); addAndMakeVisible (shouldMuteLabel); shouldMuteLabel.attachToComponent (&shouldMuteButton, true); } } void paint (juce::Graphics& g) override { g.fillAll (getLookAndFeel().findColour (juce::ResizableWindow::backgroundColourId)); } void resized() override { const juce::ScopedValueSetter scope (isResizing, true); auto r = getLocalBounds(); if (owner.getProcessorHasPotentialFeedbackLoop()) { auto itemHeight = deviceSelector.getItemHeight(); auto extra = r.removeFromTop (itemHeight); auto seperatorHeight = (itemHeight >> 1); shouldMuteButton.setBounds (juce::Rectangle (extra.proportionOfWidth (0.35f), seperatorHeight, extra.proportionOfWidth (0.60f), deviceSelector.getItemHeight())); r.removeFromTop (seperatorHeight); } deviceSelector.setBounds (r); } void childBoundsChanged (Component* childComp) override { if (! isResizing && childComp == &deviceSelector) setToRecommendedSize(); } void setToRecommendedSize() { const auto extraHeight = [&] { if (! owner.getProcessorHasPotentialFeedbackLoop()) return 0; const auto itemHeight = deviceSelector.getItemHeight(); const auto separatorHeight = (itemHeight >> 1); return itemHeight + separatorHeight; }(); setSize (getWidth(), deviceSelector.getHeight() + extraHeight); } private: //============================================================================== MyStandalonePluginHolder& owner; iem::IEMAudioDeviceSelectorComponent deviceSelector; juce::Label shouldMuteLabel; juce::ToggleButton shouldMuteButton; bool isResizing = false; //============================================================================== JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (SettingsComponent) }; //============================================================================== void audioDeviceIOCallbackWithContext ( const float* const* inputChannelData, int numInputChannels, float* const* outputChannelData, int numOutputChannels, int numSamples, const juce::AudioIODeviceCallbackContext& context) override { if (muteInput) { emptyBuffer.clear(); inputChannelData = emptyBuffer.getArrayOfReadPointers(); } player.audioDeviceIOCallbackWithContext (inputChannelData, numInputChannels, outputChannelData, numOutputChannels, numSamples, context); } void audioDeviceAboutToStart (juce::AudioIODevice* device) override { emptyBuffer.setSize (device->getActiveInputChannels().countNumberOfSetBits(), device->getCurrentBufferSizeSamples()); emptyBuffer.clear(); player.audioDeviceAboutToStart (device); player.setMidiOutput (deviceManager.getDefaultMidiOutput()); if (device->getTypeName() == IEM_JACK_DEVICENAME) jackClientName = device->getName(); else jackClientName = ""; } void audioDeviceStopped() override { player.setMidiOutput (nullptr); player.audioDeviceStopped(); emptyBuffer.setSize (0, 0); } //============================================================================== void setupAudioDevices (bool enableAudioInput, const juce::String& preferredDefaultDeviceName, const juce::AudioDeviceManager::AudioDeviceSetup* preferredSetupOptions) { deviceManager.addAudioCallback (&maxSizeEnforcer); deviceManager.addMidiInputDeviceCallback ({}, &player); reloadAudioDeviceState (enableAudioInput, preferredDefaultDeviceName, preferredSetupOptions); } void shutDownAudioDevices() { saveAudioDeviceState(); deviceManager.removeMidiInputDeviceCallback ({}, &player); deviceManager.removeAudioCallback (&maxSizeEnforcer); } void timerCallback() override { auto newMidiDevices = juce::MidiInput::getAvailableDevices(); if (newMidiDevices != lastMidiDevices) { for (auto& oldDevice : lastMidiDevices) if (! newMidiDevices.contains (oldDevice)) deviceManager.setMidiInputDeviceEnabled (oldDevice.identifier, false); for (auto& newDevice : newMidiDevices) if (! lastMidiDevices.contains (newDevice)) deviceManager.setMidiInputDeviceEnabled (newDevice.identifier, true); lastMidiDevices = newMidiDevices; } } JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MyStandalonePluginHolder) }; //============================================================================== /** A class that can be used to run a simple standalone application containing your filter. Just create one of these objects in your JUCEApplicationBase::initialise() method, and let it do its work. It will create your filter object using the same createPluginFilter() function that the other plugin wrappers use. @tags{Audio} */ class MyStandaloneFilterWindow : public juce::DocumentWindow, private juce::Button::Listener { public: //============================================================================== typedef MyStandalonePluginHolder::PluginInOuts PluginInOuts; //============================================================================== /** Creates a window with a given title and colour. The settings object can be a PropertySet that the class should use to store its settings (it can also be null). If takeOwnershipOfSettings is true, then the settings object will be owned and deleted by this object. */ MyStandaloneFilterWindow ( const juce::String& title, juce::Colour backgroundColour, juce::PropertySet* settingsToUse, bool takeOwnershipOfSettings, const juce::String& preferredDefaultDeviceName = juce::String(), const juce::AudioDeviceManager::AudioDeviceSetup* preferredSetupOptions = nullptr, const juce::Array& constrainToConfiguration = {}, #if JUCE_ANDROID || JUCE_IOS bool autoOpenMidiDevices = true #else bool autoOpenMidiDevices = false #endif ) : juce::DocumentWindow (title, backgroundColour, juce::DocumentWindow::minimiseButton | juce::DocumentWindow::closeButton) { setConstrainer (&decoratorConstrainer); setLookAndFeel (&laf); #if JUCE_IOS || JUCE_ANDROID setTitleBarHeight (0); #endif setUsingNativeTitleBar (true); pluginHolder.reset (new MyStandalonePluginHolder (settingsToUse, takeOwnershipOfSettings, preferredDefaultDeviceName, preferredSetupOptions, constrainToConfiguration, autoOpenMidiDevices)); #if JUCE_IOS || JUCE_ANDROID setFullScreen (true); updateContent(); #else updateContent(); const auto windowScreenBounds = [this]() -> juce::Rectangle { const auto width = getWidth(); const auto height = getHeight(); const auto& displays = juce::Desktop::getInstance().getDisplays(); if (auto* props = pluginHolder->settings.get()) { constexpr int defaultValue = -100; const auto x = props->getIntValue ("windowX", defaultValue); const auto y = props->getIntValue ("windowY", defaultValue); if (x != defaultValue && y != defaultValue) { const auto screenLimits = displays.getDisplayForRect ({ x, y, width, height })->userBounds; return { juce::jlimit ( static_cast (screenLimits.getX()), juce::jmax (static_cast (screenLimits.getX()), static_cast (screenLimits.getRight()) - width), x), juce::jlimit ( static_cast (screenLimits.getY()), juce::jmax (static_cast (screenLimits.getY()), static_cast (screenLimits.getBottom()) - height), y), width, height }; } } const auto displayArea = displays.getPrimaryDisplay()->userBounds; return { static_cast (displayArea.getCentreX()) - width / 2, static_cast (displayArea.getCentreY()) - height / 2, width, height }; }(); setBoundsConstrained (windowScreenBounds); if (auto* processor = getAudioProcessor()) if (auto* editor = processor->getActiveEditor()) setResizable (editor->isResizable(), false); // Setting icon for standalone application in order to display it on Linux. // This has to be done after `setUsingNativeTitleBar()` and `setResizable()`. // Loading image from binary data auto img = juce::ImageFileFormat::loadFrom (IEMLogo::IEMPluginSuiteSmall_png, IEMLogo::IEMPluginSuiteSmall_pngSize); // Workaround to avoid distorted icon on Linux // Create empty quadratic, transparent image juce::Image imgQuadratic (juce::Image::ARGB, img.getWidth(), img.getWidth(), true); int yStartDraw = juce::roundToInt ((img.getWidth() - img.getHeight()) / 2); // Draw loaded image onto the quadratic image juce::Graphics g (imgQuadratic); g.drawImageAt (img, 0, yStartDraw); // Finally set icons DocumentWindow::setIcon (imgQuadratic); // Only set if a peer exists if (auto peer = getPeer()) peer->setIcon (imgQuadratic); else jassertfalse; #endif } ~MyStandaloneFilterWindow() override { setLookAndFeel (nullptr); #if (! JUCE_IOS) && (! JUCE_ANDROID) if (auto* props = pluginHolder->settings.get()) { props->setValue ("windowX", getX()); props->setValue ("windowY", getY()); } #endif pluginHolder->stopPlaying(); clearContentComponent(); pluginHolder = nullptr; } //============================================================================== juce::AudioProcessor* getAudioProcessor() const noexcept { return pluginHolder->processor.get(); } juce::AudioDeviceManager& getDeviceManager() const noexcept { return pluginHolder->deviceManager; } /** Deletes and re-creates the plugin, resetting it to its default state. */ void resetToDefaultState() { pluginHolder->stopPlaying(); clearContentComponent(); pluginHolder->deletePlugin(); if (auto* props = pluginHolder->settings.get()) props->removeValue ("filterState"); pluginHolder->createPlugin(); updateContent(); pluginHolder->startPlaying(); } //============================================================================== void closeButtonPressed() override { pluginHolder->savePluginState(); juce::JUCEApplicationBase::quit(); } void handleMenuResult (int result) { switch (result) { case 1: pluginHolder->showAudioSettingsDialog(); break; case 2: pluginHolder->askUserToSaveState(); break; case 3: pluginHolder->askUserToLoadState(); break; case 4: resetToDefaultState(); break; default: break; } } static void menuCallback (int result, MyStandaloneFilterWindow* button) { if (button != nullptr && result != 0) button->handleMenuResult (result); } void resized() override { DocumentWindow::resized(); } virtual MyStandalonePluginHolder* getPluginHolder() { return pluginHolder.get(); } std::unique_ptr pluginHolder; private: void updateContent() { auto* content = new MainContentComponent (*this); decoratorConstrainer.setMainContentComponent (content); #if JUCE_IOS || JUCE_ANDROID constexpr auto resizeAutomatically = false; #else constexpr auto resizeAutomatically = true; #endif setContentOwned (content, resizeAutomatically); } void buttonClicked (juce::Button*) override { juce::PopupMenu m; m.addItem (1, TRANS ("Audio/MIDI Settings...")); m.addSeparator(); m.addItem (2, TRANS ("Save current state...")); m.addItem (3, TRANS ("Load a saved state...")); m.addSeparator(); m.addItem (4, TRANS ("Reset to default state")); m.setLookAndFeel (&laf); m.showMenuAsync (juce::PopupMenu::Options(), juce::ModalCallbackFunction::forComponent (menuCallback, this)); } //============================================================================== class MainContentComponent : public juce::Component, private juce::Value::Listener, private juce::ComponentListener, private juce::Timer { public: MainContentComponent (MyStandaloneFilterWindow& filterWindow) : owner (filterWindow), header (&filterWindow), editor (owner.getAudioProcessor()->hasEditor() ? owner.getAudioProcessor()->createEditorAndMakeActive() : new juce::GenericAudioProcessorEditor (*owner.getAudioProcessor())) { inputMutedValue.referTo (owner.pluginHolder->getMuteInputValue()); if (editor != nullptr) { editor->addComponentListener (this); componentMovedOrResized (*editor, false, true); addAndMakeVisible (editor.get()); } addAndMakeVisible (header); if (owner.pluginHolder->getProcessorHasPotentialFeedbackLoop()) { inputMutedValue.addListener (this); shouldShowNotification = inputMutedValue.getValue(); } inputMutedChanged (shouldShowNotification); startTimer (500); } ~MainContentComponent() override { if (editor != nullptr) { editor->removeComponentListener (this); owner.pluginHolder->processor->editorBeingDeleted (editor.get()); editor = nullptr; } } void resized() override { auto r = getLocalBounds(); header.setBounds (r.removeFromTop (Header::height)); if (editor != nullptr) { const auto newPos = r.getTopLeft().toFloat().transformedBy (editor->getTransform().inverted()); if (preventResizingEditor) editor->setTopLeftPosition (newPos.roundToInt()); else editor->setBoundsConstrained (editor->getLocalArea (this, r.toFloat()) .withPosition (newPos) .toNearestInt()); } } juce::ComponentBoundsConstrainer* getEditorConstrainer() const { if (auto* e = editor.get()) return e->getConstrainer(); return nullptr; } juce::BorderSize computeBorder() const { const auto nativeFrame = [&]() -> juce::BorderSize { if (auto* peer = owner.getPeer()) if (const auto frameSize = peer->getFrameSizeIfPresent()) return *frameSize; return {}; }(); return nativeFrame.addedTo (owner.getContentComponentBorder()) .addedTo ( juce::BorderSize { shouldShowNotification ? Header::height : 0, 0, 0, 0 }); } private: //============================================================================== class Header : public juce::Component { public: enum { height = 18 }; Header (juce::Button::Listener* settingsButtonListener) : #if JUCE_IOS || JUCE_ANDROID settingsButton ("Unmute Input") #else settingsButton ("Settings") #endif { setLookAndFeel (&laf); setOpaque (true); settingsButton.addListener (settingsButtonListener); addAndMakeVisible (lbMuted); lbMuted.setText ("INPUT MUTED", false); lbMuted.setTextColour (juce::Colours::red); addAndMakeVisible (settingsButton); settingsButton.setColour (juce::TextButton::buttonColourId, juce::Colours::cornflowerblue); } ~Header() override { setLookAndFeel (nullptr); } void paint (juce::Graphics& g) override { auto r = getLocalBounds(); g.setColour (laf.ClBackground); g.fillRect (r); } void resized() override { auto r = getLocalBounds(); r.removeFromTop (2); r.removeFromLeft (2); r.removeFromRight (2); settingsButton.setBounds (r.removeFromRight (70)); if (muted) lbMuted.setBounds (r.removeFromLeft (80)); if (jackDeviceName) jackDeviceName->setBounds (r.removeFromLeft (200)); } void setMuteStatus (bool muteStatus) { muted = muteStatus; lbMuted.setVisible (muted); resized(); repaint(); } void setJackClientName (juce::String jackClientName) { if (jackClientName.isEmpty()) jackDeviceName.reset(); else { jackDeviceName.reset (new SimpleLabel ("JACK Client: " + jackClientName)); addAndMakeVisible (jackDeviceName.get()); } resized(); } private: bool muted = false; SimpleLabel lbMuted; std::unique_ptr jackDeviceName; juce::TextButton settingsButton; LaF laf; }; void timerCallback() override { auto* holder = owner.getPluginHolder(); juce::String jackClientName = ""; if (holder) jackClientName = holder->jackClientName; header.setJackClientName (jackClientName); } //============================================================================== void inputMutedChanged (bool newInputMutedValue) { header.setMuteStatus (newInputMutedValue); #if JUCE_IOS || JUCE_ANDROID resized(); #else if (editor != nullptr) { const auto rect = getSizeToContainEditor(); setSize (rect.getWidth(), rect.getHeight() + Header::height); } #endif } void valueChanged (juce::Value& value) override { inputMutedChanged (value.getValue()); } //============================================================================== void componentMovedOrResized (juce::Component&, bool, bool) override { const juce::ScopedValueSetter scope (preventResizingEditor, true); if (editor != nullptr) { auto rect = getSizeToContainEditor(); setSize (rect.getWidth(), rect.getHeight() + Header::height); } } juce::Rectangle getSizeToContainEditor() const { if (editor != nullptr) return getLocalArea (editor.get(), editor->getLocalBounds()); return {}; } //============================================================================== MyStandaloneFilterWindow& owner; Header header; std::unique_ptr editor; juce::Value inputMutedValue; bool shouldShowNotification = false; bool preventResizingEditor = false; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MainContentComponent) }; /* This custom constrainer checks with the AudioProcessorEditor (which might itself be constrained) to ensure that any size we choose for the standalone window will be suitable for the editor too. Without this constrainer, attempting to resize the standalone window may set bounds on the peer that are unsupported by the inner editor. In this scenario, the peer will be set to a 'bad' size, then the inner editor will be resized. The editor will check the new bounds with its own constrainer, and may set itself to a more suitable size. After that, the resizable window will see that its content component has changed size, and set the bounds of the peer accordingly. The end result is that the peer is resized twice in a row to different sizes, which can appear glitchy/flickery to the user. */ struct DecoratorConstrainer : public juce::ComponentBoundsConstrainer { void checkBounds (juce::Rectangle& bounds, const juce::Rectangle& previousBounds, const juce::Rectangle& limits, bool isStretchingTop, bool isStretchingLeft, bool isStretchingBottom, bool isStretchingRight) override { auto* decorated = contentComponent != nullptr ? contentComponent->getEditorConstrainer() : nullptr; if (decorated != nullptr) { const auto border = contentComponent->computeBorder(); const auto requestedBounds = bounds; border.subtractFrom (bounds); decorated->checkBounds (bounds, border.subtractedFrom (previousBounds), limits, isStretchingTop, isStretchingLeft, isStretchingBottom, isStretchingRight); border.addTo (bounds); bounds = bounds.withPosition (requestedBounds.getPosition()); if (isStretchingTop && ! isStretchingBottom) bounds = bounds.withBottomY (previousBounds.getBottom()); if (! isStretchingTop && isStretchingBottom) bounds = bounds.withY (previousBounds.getY()); if (isStretchingLeft && ! isStretchingRight) bounds = bounds.withRightX (previousBounds.getRight()); if (! isStretchingLeft && isStretchingRight) bounds = bounds.withX (previousBounds.getX()); } else { ComponentBoundsConstrainer::checkBounds (bounds, previousBounds, limits, isStretchingTop, isStretchingLeft, isStretchingBottom, isStretchingRight); } } void setMainContentComponent (MainContentComponent* in) { contentComponent = in; } private: MainContentComponent* contentComponent = nullptr; }; //============================================================================== DecoratorConstrainer decoratorConstrainer; LaF laf; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MyStandaloneFilterWindow) }; inline MyStandalonePluginHolder* MyStandalonePluginHolder::getInstance() { #if JucePlugin_Enable_IAA || JucePlugin_Build_Standalone if (juce::PluginHostType::getPluginLoadedAs() == juce::AudioProcessor::wrapperType_Standalone) { auto& desktop = juce::Desktop::getInstance(); const int numTopLevelWindows = desktop.getNumComponents(); for (int i = 0; i < numTopLevelWindows; ++i) if (auto window = dynamic_cast (desktop.getComponent (i))) return window->getPluginHolder(); } #endif return nullptr; } ././@LongLink0000644000000000000000000000017200000000000011603 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/Standalone/IEM_AudioDeviceSelectorComponent.cppIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/Standalone/IEM_AudioDevice0000664002537200253720000013142515257173642031535 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich, Felix Holzmueller Copyright (c) 2022 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ /* The following code taken from JUCE and modified. */ /* ============================================================================== This file is part of the JUCE library. Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. By using JUCE, you agree to the terms of both the JUCE 7 End-User License Agreement and JUCE Privacy Policy. End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see www.gnu.org/licenses). JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE DISCLAIMED. ============================================================================== */ #include "IEM_AudioDeviceSelectorComponent.h" namespace iem { struct SimpleDeviceManagerInputLevelMeter : public juce::Component, public juce::Timer { SimpleDeviceManagerInputLevelMeter (juce::AudioDeviceManager& m) : manager (m) { startTimerHz (20); inputLevelGetter = manager.getInputLevelGetter(); } void timerCallback() override { if (isShowing()) { auto newLevel = (float) inputLevelGetter->getCurrentLevel(); if (std::abs (level - newLevel) > 0.005f) { level = newLevel; repaint(); } } else { level = 0; } } void paint (juce::Graphics& g) override { // (add a bit of a skew to make the level more obvious) getLookAndFeel().drawLevelMeter (g, getWidth(), getHeight(), (float) std::exp (std::log (level) / 3.0)); } juce::AudioDeviceManager& manager; juce::AudioDeviceManager::LevelMeter::Ptr inputLevelGetter; float level = 0; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (SimpleDeviceManagerInputLevelMeter) }; static void drawTextLayout (juce::Graphics& g, juce::Component& owner, juce::StringRef text, const juce::Rectangle& textBounds, bool enabled) { const auto textColour = owner.findColour (juce::ListBox::textColourId, true) .withMultipliedAlpha (enabled ? 1.0f : 0.6f); juce::AttributedString attributedString { text }; attributedString.setColour (textColour); attributedString.setFont ( juce::FontOptions (static_cast (textBounds.getHeight()) * 0.6f)); attributedString.setJustification (juce::Justification::centredLeft); attributedString.setWordWrap (juce::AttributedString::WordWrap::none); juce::TextLayout textLayout; textLayout.createLayout (attributedString, (float) textBounds.getWidth(), (float) textBounds.getHeight()); textLayout.draw (g, textBounds.toFloat()); } //============================================================================== class IEMAudioDeviceSelectorComponent::MidiInputSelectorComponentListBox : public juce::ListBox, private juce::ListBoxModel { public: MidiInputSelectorComponentListBox (juce::AudioDeviceManager& dm, const juce::String& noItems) : ListBox ({}, nullptr), deviceManager (dm), noItemsMessage (noItems) { updateDevices(); setModel (this); setOutlineThickness (1); } void updateDevices() { items = juce::MidiInput::getAvailableDevices(); } int getNumRows() override { return items.size(); } void paintListBoxItem (int row, juce::Graphics& g, int width, int height, bool rowIsSelected) override { if (juce::isPositiveAndBelow (row, items.size())) { if (rowIsSelected) g.fillAll ( findColour (juce::TextEditor::highlightColourId).withMultipliedAlpha (0.3f)); auto item = items[row]; bool enabled = deviceManager.isMidiInputDeviceEnabled (item.identifier); auto x = getTickX(); auto tickW = (float) height * 0.75f; getLookAndFeel().drawTickBox (g, *this, (float) x - tickW, ((float) height - tickW) * 0.5f, tickW, tickW, enabled, true, true, false); drawTextLayout (g, *this, item.name, { x + 5, 0, width - x - 5, height }, enabled); } } void listBoxItemClicked (int row, const juce::MouseEvent& e) override { selectRow (row); if (e.x < getTickX()) flipEnablement (row); } void listBoxItemDoubleClicked (int row, const juce::MouseEvent&) override { flipEnablement (row); } void returnKeyPressed (int row) override { flipEnablement (row); } void paint (juce::Graphics& g) override { juce::ListBox::paint (g); if (items.isEmpty()) { g.setColour (juce::Colours::grey); g.setFont (0.5f * (float) getRowHeight()); g.drawText (noItemsMessage, 0, 0, getWidth(), getHeight() / 2, juce::Justification::centred, true); } } int getBestHeight (int preferredHeight) { auto extra = getOutlineThickness() * 2; return juce::jmax (getRowHeight() * 2 + extra, juce::jmin (getRowHeight() * getNumRows() + extra, preferredHeight)); } private: //============================================================================== juce::AudioDeviceManager& deviceManager; const juce::String noItemsMessage; juce::Array items; void flipEnablement (const int row) { if (juce::isPositiveAndBelow (row, items.size())) { auto identifier = items[row].identifier; deviceManager.setMidiInputDeviceEnabled ( identifier, ! deviceManager.isMidiInputDeviceEnabled (identifier)); } } int getTickX() const { return getRowHeight(); } JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MidiInputSelectorComponentListBox) }; //============================================================================== struct AudioDeviceSetupDetails { juce::AudioDeviceManager* manager; int minNumInputChannels, maxNumInputChannels; int minNumOutputChannels, maxNumOutputChannels; bool useStereoPairs; }; static juce::String getNoDeviceString() { return "<< " + TRANS ("none") + " >>"; } //============================================================================== class AudioDeviceSettingsPanel : public juce::Component, private juce::ChangeListener { public: AudioDeviceSettingsPanel (juce::AudioIODeviceType& t, AudioDeviceSetupDetails& setupDetails, const bool hideAdvancedOptionsWithButton) : type (t), setup (setupDetails) { if (hideAdvancedOptionsWithButton) { showAdvancedSettingsButton.reset ( new juce::TextButton (TRANS ("Show advanced settings..."))); addAndMakeVisible (showAdvancedSettingsButton.get()); showAdvancedSettingsButton->setClickingTogglesState (true); showAdvancedSettingsButton->onClick = [this] { toggleAdvancedSettings(); }; } type.scanForDevices(); setup.manager->addChangeListener (this); } ~AudioDeviceSettingsPanel() override { setup.manager->removeChangeListener (this); } void resized() override { if (auto* parent = findParentComponentOfClass()) { juce::Rectangle r (proportionOfWidth (0.35f), 0, proportionOfWidth (0.6f), 3000); const int maxListBoxHeight = 100; const int h = parent->getItemHeight(); const int space = h / 4; if (outputDeviceDropDown != nullptr) { auto row = r.removeFromTop (h); if (testButton != nullptr) { testButton->changeWidthToFitText (h); testButton->setBounds (row.removeFromRight (testButton->getWidth())); row.removeFromRight (space); } outputDeviceDropDown->setBounds (row); r.removeFromTop (space); } if (inputDeviceDropDown != nullptr) { auto row = r.removeFromTop (h); inputLevelMeter->setBounds (row.removeFromRight ( testButton != nullptr ? testButton->getWidth() : row.getWidth() / 6)); row.removeFromRight (space); inputDeviceDropDown->setBounds (row); r.removeFromTop (space); } if (outputChanList != nullptr) { outputChanList->setRowHeight (juce::jmin (22, h)); outputChanList->setBounds ( r.removeFromTop (outputChanList->getBestHeight (maxListBoxHeight))); outputChanLabel->setBounds (0, outputChanList->getBounds().getCentreY() - h / 2, r.getX(), h); r.removeFromTop (space); } if (inputChanList != nullptr) { inputChanList->setRowHeight (juce::jmin (22, h)); inputChanList->setBounds ( r.removeFromTop (inputChanList->getBestHeight (maxListBoxHeight))); inputChanLabel->setBounds (0, inputChanList->getBounds().getCentreY() - h / 2, r.getX(), h); r.removeFromTop (space); } r.removeFromTop (space * 2); if (showAdvancedSettingsButton != nullptr && sampleRateDropDown != nullptr && bufferSizeDropDown != nullptr) { showAdvancedSettingsButton->setBounds (r.removeFromTop (h)); r.removeFromTop (space); showAdvancedSettingsButton->changeWidthToFitText(); } auto advancedSettingsVisible = showAdvancedSettingsButton == nullptr || showAdvancedSettingsButton->getToggleState(); if (sampleRateDropDown != nullptr) { sampleRateDropDown->setVisible (advancedSettingsVisible); if (advancedSettingsVisible) { sampleRateDropDown->setBounds (r.removeFromTop (h)); r.removeFromTop (space); } } if (bufferSizeDropDown != nullptr) { bufferSizeDropDown->setVisible (advancedSettingsVisible); if (advancedSettingsVisible) { sampleRateDropDown->setBounds (r.removeFromTop (h)); r.removeFromTop (space); } } r.removeFromTop (space); if (showUIButton != nullptr || resetDeviceButton != nullptr) { auto buttons = r.removeFromTop (h); if (showUIButton != nullptr) { showUIButton->setVisible (advancedSettingsVisible); showUIButton->changeWidthToFitText (h); showUIButton->setBounds (buttons.removeFromLeft (showUIButton->getWidth())); buttons.removeFromLeft (space); } if (resetDeviceButton != nullptr) { resetDeviceButton->setVisible (advancedSettingsVisible); resetDeviceButton->changeWidthToFitText (h); resetDeviceButton->setBounds ( buttons.removeFromLeft (resetDeviceButton->getWidth())); } r.removeFromTop (space); } setSize (getWidth(), r.getY()); } else { jassertfalse; } } void updateConfig (bool updateOutputDevice, bool updateInputDevice, bool updateSampleRate, bool updateBufferSize) { auto config = setup.manager->getAudioDeviceSetup(); juce::String error; if (updateOutputDevice || updateInputDevice) { if (outputDeviceDropDown != nullptr) config.outputDeviceName = outputDeviceDropDown->getSelectedId() < 0 ? juce::String() : outputDeviceDropDown->getText(); if (inputDeviceDropDown != nullptr) config.inputDeviceName = inputDeviceDropDown->getSelectedId() < 0 ? juce::String() : inputDeviceDropDown->getText(); if (! type.hasSeparateInputsAndOutputs()) config.inputDeviceName = config.outputDeviceName; if (updateInputDevice) config.useDefaultInputChannels = true; else config.useDefaultOutputChannels = true; error = setup.manager->setAudioDeviceSetup (config, true); showCorrectDeviceName (inputDeviceDropDown.get(), true); showCorrectDeviceName (outputDeviceDropDown.get(), false); updateControlPanelButton(); resized(); } else if (updateSampleRate) { if (sampleRateDropDown->getSelectedId() > 0) { config.sampleRate = sampleRateDropDown->getSelectedId(); error = setup.manager->setAudioDeviceSetup (config, true); } } else if (updateBufferSize) { if (bufferSizeDropDown->getSelectedId() > 0) { config.bufferSize = bufferSizeDropDown->getSelectedId(); error = setup.manager->setAudioDeviceSetup (config, true); } } if (error.isNotEmpty()) juce::AlertWindow::showMessageBoxAsync ( juce::MessageBoxIconType::WarningIcon, TRANS ("Error when trying to open audio device!"), error); } bool showDeviceControlPanel() { if (auto* device = setup.manager->getCurrentAudioDevice()) { juce::Component modalWindow; modalWindow.setOpaque (true); modalWindow.addToDesktop (0); modalWindow.enterModalState(); return device->showControlPanel(); } return false; } void toggleAdvancedSettings() { showAdvancedSettingsButton->setButtonText ( (showAdvancedSettingsButton->getToggleState() ? "Hide " : "Show ") + juce::String ("advanced settings...")); resized(); } void showDeviceUIPanel() { if (showDeviceControlPanel()) { setup.manager->closeAudioDevice(); setup.manager->restartLastAudioDevice(); getTopLevelComponent()->toFront (true); } } void playTestSound() { setup.manager->playTestSound(); } void updateAllControls() { updateOutputsComboBox(); updateInputsComboBox(); updateControlPanelButton(); updateResetButton(); if (auto* currentDevice = setup.manager->getCurrentAudioDevice()) { if (setup.maxNumOutputChannels > 0) { if (outputChanList == nullptr) { outputChanList.reset ( new ChannelSelectorListBox (setup, ChannelSelectorListBox::audioOutputType, TRANS ("(no audio output channels found)"))); addAndMakeVisible (outputChanList.get()); outputChanLabel.reset (new juce::Label ({}, TRANS ("Active output channels:"))); outputChanLabel->setJustificationType (juce::Justification::centredRight); outputChanLabel->attachToComponent (outputChanList.get(), true); } outputChanList->refresh(); } else { outputChanLabel.reset(); outputChanList.reset(); } if (setup.maxNumInputChannels > 0) { if (inputChanList == nullptr) { inputChanList.reset ( new ChannelSelectorListBox (setup, ChannelSelectorListBox::audioInputType, TRANS ("(no audio input channels found)"))); addAndMakeVisible (inputChanList.get()); inputChanLabel.reset (new juce::Label ({}, TRANS ("Active input channels:"))); inputChanLabel->setJustificationType (juce::Justification::centredRight); inputChanLabel->attachToComponent (inputChanList.get(), true); } inputChanList->refresh(); } else { inputChanLabel.reset(); inputChanList.reset(); } updateSampleRateComboBox (currentDevice); updateBufferSizeComboBox (currentDevice); } else { jassert (setup.manager->getCurrentAudioDevice() == nullptr); // not the correct device type! inputChanLabel.reset(); outputChanLabel.reset(); sampleRateLabel.reset(); bufferSizeLabel.reset(); inputChanList.reset(); outputChanList.reset(); sampleRateDropDown.reset(); bufferSizeDropDown.reset(); if (outputDeviceDropDown != nullptr) outputDeviceDropDown->setSelectedId (-1, juce::dontSendNotification); if (inputDeviceDropDown != nullptr) inputDeviceDropDown->setSelectedId (-1, juce::dontSendNotification); } sendLookAndFeelChange(); resized(); setSize (getWidth(), getLowestY() + 4); } void changeListenerCallback (juce::ChangeBroadcaster*) override { updateAllControls(); } void resetDevice() { setup.manager->closeAudioDevice(); setup.manager->restartLastAudioDevice(); } private: juce::AudioIODeviceType& type; const AudioDeviceSetupDetails setup; std::unique_ptr outputDeviceDropDown, inputDeviceDropDown, sampleRateDropDown, bufferSizeDropDown; std::unique_ptr outputDeviceLabel, inputDeviceLabel, sampleRateLabel, bufferSizeLabel, inputChanLabel, outputChanLabel; std::unique_ptr testButton; std::unique_ptr inputLevelMeter; std::unique_ptr showUIButton, showAdvancedSettingsButton, resetDeviceButton; void showCorrectDeviceName (juce::ComboBox* box, bool isInput) { if (box != nullptr) { auto* currentDevice = setup.manager->getCurrentAudioDevice(); auto index = type.getIndexOfDevice (currentDevice, isInput); box->setSelectedId (index < 0 ? index : index + 1, juce::dontSendNotification); if (testButton != nullptr && ! isInput) testButton->setEnabled (index >= 0); } } void addNamesToDeviceBox (juce::ComboBox& combo, bool isInputs) { const juce::StringArray devs (type.getDeviceNames (isInputs)); combo.clear (juce::dontSendNotification); for (int i = 0; i < devs.size(); ++i) combo.addItem (devs[i], i + 1); combo.addItem (getNoDeviceString(), -1); combo.setSelectedId (-1, juce::dontSendNotification); } int getLowestY() const { int y = 0; for (auto* c : getChildren()) y = juce::jmax (y, c->getBottom()); return y; } void updateControlPanelButton() { auto* currentDevice = setup.manager->getCurrentAudioDevice(); showUIButton.reset(); if (currentDevice != nullptr && currentDevice->hasControlPanel()) { showUIButton.reset ( new juce::TextButton (TRANS ("Control Panel"), TRANS ("Opens the device's own control panel"))); addAndMakeVisible (showUIButton.get()); showUIButton->onClick = [this] { showDeviceUIPanel(); }; } resized(); } void updateResetButton() { if (auto* currentDevice = setup.manager->getCurrentAudioDevice()) { if (currentDevice->hasControlPanel()) { if (resetDeviceButton == nullptr) { resetDeviceButton.reset (new juce::TextButton ( TRANS ("Reset Device"), TRANS ( "Resets the audio interface - sometimes needed after changing a device's properties in its custom control panel"))); addAndMakeVisible (resetDeviceButton.get()); resetDeviceButton->onClick = [this] { resetDevice(); }; resized(); } return; } } resetDeviceButton.reset(); } void updateOutputsComboBox() { if (setup.maxNumOutputChannels > 0 || ! type.hasSeparateInputsAndOutputs()) { if (outputDeviceDropDown == nullptr) { outputDeviceDropDown.reset (new juce::ComboBox()); outputDeviceDropDown->onChange = [this] { updateConfig (true, false, false, false); }; addAndMakeVisible (outputDeviceDropDown.get()); outputDeviceLabel.reset (new juce::Label ( {}, type.hasSeparateInputsAndOutputs() ? TRANS ("Output:") : TRANS ("Device:"))); outputDeviceLabel->attachToComponent (outputDeviceDropDown.get(), true); if (setup.maxNumOutputChannels > 0) { testButton.reset ( new juce::TextButton (TRANS ("Test"), TRANS ("Plays a test tone"))); addAndMakeVisible (testButton.get()); testButton->onClick = [this] { playTestSound(); }; } } addNamesToDeviceBox (*outputDeviceDropDown, false); } showCorrectDeviceName (outputDeviceDropDown.get(), false); } void updateInputsComboBox() { if (setup.maxNumInputChannels > 0 && type.hasSeparateInputsAndOutputs()) { if (inputDeviceDropDown == nullptr) { inputDeviceDropDown.reset (new juce::ComboBox()); inputDeviceDropDown->onChange = [this] { updateConfig (false, true, false, false); }; addAndMakeVisible (inputDeviceDropDown.get()); inputDeviceLabel.reset (new juce::Label ({}, TRANS ("Input:"))); inputDeviceLabel->attachToComponent (inputDeviceDropDown.get(), true); inputLevelMeter.reset (new SimpleDeviceManagerInputLevelMeter (*setup.manager)); addAndMakeVisible (inputLevelMeter.get()); } addNamesToDeviceBox (*inputDeviceDropDown, true); } showCorrectDeviceName (inputDeviceDropDown.get(), true); } void updateSampleRateComboBox (juce::AudioIODevice* currentDevice) { if (sampleRateDropDown == nullptr) { sampleRateDropDown.reset (new juce::ComboBox()); addAndMakeVisible (sampleRateDropDown.get()); sampleRateLabel.reset (new juce::Label ({}, TRANS ("Sample rate:"))); sampleRateLabel->attachToComponent (sampleRateDropDown.get(), true); } else { sampleRateDropDown->clear(); sampleRateDropDown->onChange = nullptr; } const auto getFrequencyString = [] (int rate) { return juce::String (rate) + " Hz"; }; for (auto rate : currentDevice->getAvailableSampleRates()) { const auto intRate = juce::roundToInt (rate); sampleRateDropDown->addItem (getFrequencyString (intRate) + " Hz", intRate); } const auto intRate = juce::roundToInt (currentDevice->getCurrentSampleRate()); sampleRateDropDown->setText (getFrequencyString (intRate), juce::dontSendNotification); sampleRateDropDown->onChange = [this] { updateConfig (false, false, true, false); }; } void updateBufferSizeComboBox (juce::AudioIODevice* currentDevice) { if (bufferSizeDropDown == nullptr) { bufferSizeDropDown.reset (new juce::ComboBox()); addAndMakeVisible (bufferSizeDropDown.get()); bufferSizeLabel.reset (new juce::Label ({}, TRANS ("Audio buffer size:"))); bufferSizeLabel->attachToComponent (bufferSizeDropDown.get(), true); } else { bufferSizeDropDown->clear(); bufferSizeDropDown->onChange = nullptr; } auto currentRate = currentDevice->getCurrentSampleRate(); if (currentRate == 0) currentRate = 48000.0; for (auto bs : currentDevice->getAvailableBufferSizes()) bufferSizeDropDown->addItem (juce::String (bs) + " samples (" + juce::String (bs * 1000.0 / currentRate, 1) + " ms)", bs); bufferSizeDropDown->setSelectedId (currentDevice->getCurrentBufferSizeSamples(), juce::dontSendNotification); bufferSizeDropDown->onChange = [this] { updateConfig (false, false, false, true); }; } public: //============================================================================== class ChannelSelectorListBox : public juce::ListBox, private juce::ListBoxModel { public: enum BoxType { audioInputType, audioOutputType }; //============================================================================== ChannelSelectorListBox (const AudioDeviceSetupDetails& setupDetails, BoxType boxType, const juce::String& noItemsText) : ListBox ({}, nullptr), setup (setupDetails), type (boxType), noItemsMessage (noItemsText) { refresh(); setModel (this); setOutlineThickness (1); } void refresh() { items.clear(); if (auto* currentDevice = setup.manager->getCurrentAudioDevice()) { if (type == audioInputType) items = currentDevice->getInputChannelNames(); else if (type == audioOutputType) items = currentDevice->getOutputChannelNames(); if (setup.useStereoPairs) { juce::StringArray pairs; for (int i = 0; i < items.size(); i += 2) { auto& name = items[i]; if (i + 1 >= items.size()) pairs.add (name.trim()); else pairs.add (getNameForChannelPair (name, items[i + 1])); } items = pairs; } } updateContent(); repaint(); } int getNumRows() override { return items.size(); } void paintListBoxItem (int row, juce::Graphics& g, int width, int height, bool) override { if (juce::isPositiveAndBelow (row, items.size())) { g.fillAll (findColour (ListBox::backgroundColourId)); auto item = items[row]; bool enabled = false; auto config = setup.manager->getAudioDeviceSetup(); if (setup.useStereoPairs) { if (type == audioInputType) enabled = config.inputChannels[row * 2] || config.inputChannels[row * 2 + 1]; else if (type == audioOutputType) enabled = config.outputChannels[row * 2] || config.outputChannels[row * 2 + 1]; } else { if (type == audioInputType) enabled = config.inputChannels[row]; else if (type == audioOutputType) enabled = config.outputChannels[row]; } auto x = getTickX(); auto tickW = (float) height * 0.75f; getLookAndFeel().drawTickBox (g, *this, (float) x - tickW, (float) (height - tickW) * 0.5f, tickW, tickW, enabled, true, true, false); drawTextLayout (g, *this, item, { x + 5, 0, width - x - 5, height }, enabled); } } void listBoxItemClicked (int row, const juce::MouseEvent& e) override { selectRow (row); if (e.x < getTickX()) flipEnablement (row); } void listBoxItemDoubleClicked (int row, const juce::MouseEvent&) override { flipEnablement (row); } void returnKeyPressed (int row) override { flipEnablement (row); } void paint (juce::Graphics& g) override { ListBox::paint (g); if (items.isEmpty()) { g.setColour (juce::Colours::grey); g.setFont (0.5f * (float) getRowHeight()); g.drawText (noItemsMessage, 0, 0, getWidth(), getHeight() / 2, juce::Justification::centred, true); } } int getBestHeight (int maxHeight) { return getRowHeight() * juce::jlimit (2, juce::jmax (2, maxHeight / getRowHeight()), getNumRows()) + getOutlineThickness() * 2; } private: //============================================================================== const AudioDeviceSetupDetails setup; const BoxType type; const juce::String noItemsMessage; juce::StringArray items; static juce::String getNameForChannelPair (const juce::String& name1, const juce::String& name2) { juce::String commonBit; for (int j = 0; j < name1.length(); ++j) if (name1.substring (0, j).equalsIgnoreCase (name2.substring (0, j))) commonBit = name1.substring (0, j); // Make sure we only split the name at a space, because otherwise, things // like "input 11" + "input 12" would become "input 11 + 2" while (commonBit.isNotEmpty() && ! juce::CharacterFunctions::isWhitespace (commonBit.getLastCharacter())) commonBit = commonBit.dropLastCharacters (1); return name1.trim() + " + " + name2.substring (commonBit.length()).trim(); } void flipEnablement (int row) { jassert (type == audioInputType || type == audioOutputType); if (juce::isPositiveAndBelow (row, items.size())) { auto config = setup.manager->getAudioDeviceSetup(); if (setup.useStereoPairs) { juce::BigInteger bits; auto& original = (type == audioInputType ? config.inputChannels : config.outputChannels); for (int i = 0; i < 256; i += 2) bits.setBit (i / 2, original[i] || original[i + 1]); if (type == audioInputType) { config.useDefaultInputChannels = false; flipBit (bits, row, setup.maxNumInputChannels / 2); } else { config.useDefaultOutputChannels = false; flipBit (bits, row, setup.maxNumOutputChannels / 2); } for (int i = 0; i < 256; ++i) original.setBit (i, bits[i / 2]); } else { if (type == audioInputType) { config.useDefaultInputChannels = false; flipBit (config.inputChannels, row, setup.maxNumInputChannels); } else { config.useDefaultOutputChannels = false; flipBit (config.outputChannels, row, setup.maxNumOutputChannels); } } setup.manager->setAudioDeviceSetup (config, true); } } static void flipBit (juce::BigInteger& chans, int index, int maxNumber) { auto numActive = chans.countNumberOfSetBits(); if (chans[index]) chans.setBit (index, false); else { if (numActive >= maxNumber) { auto firstActiveChan = chans.findNextSetBit (0); chans.clearBit (index > firstActiveChan ? firstActiveChan : chans.getHighestBit()); } chans.setBit (index, true); } } int getTickX() const { return getRowHeight(); } JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ChannelSelectorListBox) }; private: std::unique_ptr inputChanList, outputChanList; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AudioDeviceSettingsPanel) }; //============================================================================== IEMAudioDeviceSelectorComponent::IEMAudioDeviceSelectorComponent ( juce::AudioDeviceManager& dm, int minInputChannelsToUse, int maxInputChannelsToUse, int minOutputChannelsToUse, int maxOutputChannelsToUse, bool showMidiInputOptions, bool showMidiOutputSelector, bool showChannelsAsStereoPairsToUse, bool hideAdvancedOptionsWithButtonToUse) : deviceManager (dm), itemHeight (24), minOutputChannels (minOutputChannelsToUse), maxOutputChannels (maxOutputChannelsToUse), minInputChannels (minInputChannelsToUse), maxInputChannels (maxInputChannelsToUse), showChannelsAsStereoPairs (showChannelsAsStereoPairsToUse), hideAdvancedOptionsWithButton (hideAdvancedOptionsWithButtonToUse) { jassert (minOutputChannels >= 0 && minOutputChannels <= maxOutputChannels); jassert (minInputChannels >= 0 && minInputChannels <= maxInputChannels); const juce::OwnedArray& types = deviceManager.getAvailableDeviceTypes(); auto* device = deviceManager.getCurrentAudioDevice(); if (device != nullptr) jackActive = device->getTypeName() == IEM_JACK_DEVICENAME; if (types.size() > 1) { deviceTypeDropDown.reset (new juce::ComboBox()); for (int i = 0; i < types.size(); ++i) deviceTypeDropDown->addItem (types.getUnchecked (i)->getTypeName(), i + 1); addAndMakeVisible (deviceTypeDropDown.get()); deviceTypeDropDown->onChange = [this] { updateDeviceType(); }; deviceTypeDropDownLabel.reset (new juce::Label ({}, TRANS ("Audio device type:"))); deviceTypeDropDownLabel->setJustificationType (juce::Justification::centredRight); deviceTypeDropDownLabel->attachToComponent (deviceTypeDropDown.get(), true); } if (showMidiInputOptions) { midiInputsList.reset ( new MidiInputSelectorComponentListBox (deviceManager, "(" + TRANS ("No MIDI inputs available") + ")")); addAndMakeVisible (midiInputsList.get()); midiInputsLabel.reset (new juce::Label ({}, TRANS ("Active MIDI inputs:"))); midiInputsLabel->setJustificationType (juce::Justification::topRight); midiInputsLabel->attachToComponent (midiInputsList.get(), true); if (juce::BluetoothMidiDevicePairingDialogue::isAvailable()) { bluetoothButton.reset ( new juce::TextButton (TRANS ("Bluetooth MIDI"), TRANS ("Scan for bluetooth MIDI devices"))); addAndMakeVisible (bluetoothButton.get()); bluetoothButton->onClick = [this] { handleBluetoothButton(); }; } } else { midiInputsList.reset(); midiInputsLabel.reset(); bluetoothButton.reset(); } if (showMidiOutputSelector) { midiOutputSelector.reset (new juce::ComboBox()); addAndMakeVisible (midiOutputSelector.get()); midiOutputSelector->onChange = [this] { updateMidiOutput(); }; midiOutputLabel.reset (new juce::Label ("lm", TRANS ("MIDI Output:"))); midiOutputLabel->attachToComponent (midiOutputSelector.get(), true); } else { midiOutputSelector.reset(); midiOutputLabel.reset(); } deviceManager.addChangeListener (this); updateAllControls(); } IEMAudioDeviceSelectorComponent::~IEMAudioDeviceSelectorComponent() { deviceManager.removeChangeListener (this); } void IEMAudioDeviceSelectorComponent::setItemHeight (int newItemHeight) { itemHeight = newItemHeight; resized(); } void IEMAudioDeviceSelectorComponent::resized() { juce::Rectangle r (proportionOfWidth (0.35f), 15, proportionOfWidth (0.6f), 3000); auto space = itemHeight / 4; if (deviceTypeDropDown != nullptr) { deviceTypeDropDown->setBounds (r.removeFromTop (itemHeight)); r.removeFromTop (space * 3); } if (audioDeviceSettingsComp != nullptr) { audioDeviceSettingsComp->resized(); audioDeviceSettingsComp->setBounds (r.removeFromTop (audioDeviceSettingsComp->getHeight()) .withX (0) .withWidth (getWidth())); r.removeFromTop (space); } if (midiInputsList != nullptr) { midiInputsList->setRowHeight (juce::jmin (22, itemHeight)); midiInputsList->setBounds (r.removeFromTop (midiInputsList->getBestHeight ( juce::jmin (itemHeight * 8, getHeight() - r.getY() - space - itemHeight)))); r.removeFromTop (space); } if (bluetoothButton != nullptr) { bluetoothButton->setBounds (r.removeFromTop (24)); r.removeFromTop (space); } if (midiOutputSelector != nullptr) midiOutputSelector->setBounds (r.removeFromTop (itemHeight)); r.removeFromTop (itemHeight); setSize (getWidth(), r.getY()); } void IEMAudioDeviceSelectorComponent::updateDeviceType() { if (auto* type = deviceManager.getAvailableDeviceTypes()[deviceTypeDropDown->getSelectedId() - 1]) { audioDeviceSettingsComp.reset(); deviceManager.setCurrentAudioDeviceType (type->getTypeName(), true); jackActive = type->getTypeName() == IEM_JACK_DEVICENAME; updateAllControls(); // needed in case the type hasn't actually changed } } void IEMAudioDeviceSelectorComponent::updateMidiOutput() { auto selectedId = midiOutputSelector->getSelectedId(); if (selectedId == -1) deviceManager.setDefaultMidiOutputDevice ({}); else deviceManager.setDefaultMidiOutputDevice (currentMidiOutputs[selectedId - 1].identifier); } void IEMAudioDeviceSelectorComponent::changeListenerCallback (juce::ChangeBroadcaster*) { updateAllControls(); } void IEMAudioDeviceSelectorComponent::updateAllControls() { if (deviceTypeDropDown != nullptr) deviceTypeDropDown->setText (deviceManager.getCurrentAudioDeviceType(), juce::dontSendNotification); if (jackActive) { audioDeviceSettingsComp.reset(); } else if (audioDeviceSettingsComp == nullptr || audioDeviceSettingsCompType != deviceManager.getCurrentAudioDeviceType()) { audioDeviceSettingsCompType = deviceManager.getCurrentAudioDeviceType(); audioDeviceSettingsComp.reset(); if (auto* type = deviceManager.getAvailableDeviceTypes() [deviceTypeDropDown == nullptr ? 0 : deviceTypeDropDown->getSelectedId() - 1]) { AudioDeviceSetupDetails details; details.manager = &deviceManager; details.minNumInputChannels = minInputChannels; details.maxNumInputChannels = maxInputChannels; details.minNumOutputChannels = minOutputChannels; details.maxNumOutputChannels = maxOutputChannels; details.useStereoPairs = showChannelsAsStereoPairs; auto* sp = new AudioDeviceSettingsPanel (*type, details, hideAdvancedOptionsWithButton); audioDeviceSettingsComp.reset (sp); addAndMakeVisible (sp); sp->updateAllControls(); } } if (midiInputsList != nullptr) { midiInputsList->updateDevices(); midiInputsList->updateContent(); midiInputsList->repaint(); } if (midiOutputSelector != nullptr) { midiOutputSelector->clear(); currentMidiOutputs = juce::MidiOutput::getAvailableDevices(); midiOutputSelector->addItem (getNoDeviceString(), -1); midiOutputSelector->addSeparator(); auto defaultOutputIdentifier = deviceManager.getDefaultMidiOutputIdentifier(); int i = 0; for (auto& out : currentMidiOutputs) { midiOutputSelector->addItem (out.name, i + 1); if (defaultOutputIdentifier.isNotEmpty() && out.identifier == defaultOutputIdentifier) midiOutputSelector->setSelectedId (i + 1); ++i; } } resized(); } void IEMAudioDeviceSelectorComponent::handleBluetoothButton() { if (! juce::RuntimePermissions::isGranted (juce::RuntimePermissions::bluetoothMidi)) juce::RuntimePermissions::request (juce::RuntimePermissions::bluetoothMidi, nullptr); if (juce::RuntimePermissions::isGranted (juce::RuntimePermissions::bluetoothMidi)) juce::BluetoothMidiDevicePairingDialogue::open(); } juce::ListBox* IEMAudioDeviceSelectorComponent::getMidiInputSelectorListBox() const noexcept { return midiInputsList.get(); } } // namespace iem ././@LongLink0000644000000000000000000000017000000000000011601 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/Standalone/IEM_AudioDeviceSelectorComponent.hIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/Standalone/IEM_AudioDevice0000664002537200253720000001465115257173642031536 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich, Felix Holzmueller Copyright (c) 2022 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ /* The following code taken from JUCE and modified. */ /* ============================================================================== This file is part of the JUCE library. Copyright (c) 2022 - Raw Material Software Limited JUCE is an open source library subject to commercial or open-source licensing. By using JUCE, you agree to the terms of both the JUCE 7 End-User License Agreement and JUCE Privacy Policy. End User License Agreement: www.juce.com/juce-7-licence Privacy Policy: www.juce.com/juce-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see www.gnu.org/licenses). JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE DISCLAIMED. ============================================================================== */ #include "../JuceLibraryCode/JuceHeader.h" #if JUCE_JACK #define IEM_JACK_DEVICENAME "JACK(iem)" #else #define IEM_JACK_DEVICENAME "JACK" #endif namespace iem { //============================================================================== /** A component containing controls to let the user change the audio settings of an AudioDeviceManager object. Very easy to use - just create one of these and show it to the user. @see AudioDeviceManager @tags{Audio} */ class IEMAudioDeviceSelectorComponent : public juce::Component, private juce::ChangeListener { public: //============================================================================== /** Creates the component. If your app needs only output channels, you might ask for a maximum of 0 input channels, and the component won't display any options for choosing the input channels. And likewise if you're doing an input-only app. @param deviceManager the device manager that this component should control @param minAudioInputChannels the minimum number of audio input channels that the application needs @param maxAudioInputChannels the maximum number of audio input channels that the application needs @param minAudioOutputChannels the minimum number of audio output channels that the application needs @param maxAudioOutputChannels the maximum number of audio output channels that the application needs @param showMidiInputOptions if true, the component will allow the user to select which midi inputs are enabled @param showMidiOutputSelector if true, the component will let the user choose a default midi output device @param showChannelsAsStereoPairs if true, channels will be treated as pairs; if false, channels will be treated as a set of separate mono channels. @param hideAdvancedOptionsWithButton if true, only the minimum amount of UI components are shown, with an "advanced" button that shows the rest of them */ IEMAudioDeviceSelectorComponent (juce::AudioDeviceManager& deviceManager, int minAudioInputChannels, int maxAudioInputChannels, int minAudioOutputChannels, int maxAudioOutputChannels, bool showMidiInputOptions, bool showMidiOutputSelector, bool showChannelsAsStereoPairs, bool hideAdvancedOptionsWithButton); /** Destructor */ ~IEMAudioDeviceSelectorComponent() override; /** The device manager that this component is controlling */ juce::AudioDeviceManager& deviceManager; /** Sets the standard height used for items in the panel. */ void setItemHeight (int itemHeight); /** Returns the standard height used for items in the panel. */ int getItemHeight() const noexcept { return itemHeight; } /** Returns the ListBox that's being used to show the midi inputs, or nullptr if there isn't one. */ juce::ListBox* getMidiInputSelectorListBox() const noexcept; //============================================================================== /** @internal */ void resized() override; private: //============================================================================== void handleBluetoothButton(); void updateDeviceType(); void updateMidiOutput(); void changeListenerCallback (juce::ChangeBroadcaster*) override; void updateAllControls(); std::unique_ptr deviceTypeDropDown; std::unique_ptr deviceTypeDropDownLabel; std::unique_ptr audioDeviceSettingsComp; juce::String audioDeviceSettingsCompType; int itemHeight = 0; const int minOutputChannels, maxOutputChannels, minInputChannels, maxInputChannels; const bool showChannelsAsStereoPairs; const bool hideAdvancedOptionsWithButton; class MidiInputSelectorComponentListBox; juce::Array currentMidiOutputs; std::unique_ptr midiInputsList; std::unique_ptr midiOutputSelector; std::unique_ptr midiInputsLabel, midiOutputLabel; std::unique_ptr bluetoothButton; bool jackActive = false; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (IEMAudioDeviceSelectorComponent) }; } // namespace iem ././@LongLink0000644000000000000000000000015500000000000011604 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/Standalone/IEMPluginSuiteSmall.pngIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/Standalone/IEMPluginSuiteS0000664002537200253720000012235215257173642031607 0ustar zmoelnigzmoelnig‰PNG  IHDRžðxg_²sRGB®Îé@IDATxì�œÔÄÇßÑ{±!ÒûQAz—Þ‘Þ» H‘Þ¥(½#H”* Í Xh"½KþH/÷Ïì±{I6É&“ìn.ùÍç›)oæÍ÷ͽ�dg&¤2¥‘íê¬3{G(ˆ£”ˆ4~ÊÏNQ@±ð'(?;EIUÄŸ üì%T "€ò³S”PE,ü‰ÊÏNQ@±ð'(?;EIUÄŸ üì%T "€ò³S”PE,ü‰ÊÏNQ@±ð'(?;EÉx‘‘‘ª?ÄÝVA"# Æ #Ôâñ j1‹«ÃP‹ X\�%#´Oû-tz×`‹U‹�ÕY´SÓï=½T"Ó@vÝ;‡R�´6 täçU|ªýð[fßµ[/âYÑñL%‡[Q�#ê0=BAÁÂN¨…0YU\òâosöç.�ëÕQ.(®§Þ?7� $‰yŠ2ÝöoE)’>ðÅ[;†Ò¤¼û,>ŒNíBÏÖ"g)=”ž>57Æ"Ôžš°o'ªïiXüßÖE“)K†k¾$ö¨J¼6Úˆ?ôU¨q¡§n£uÊ›ÓÓ“I~…\Ô7lŽòM»I*ÊlÑ’¼#�â%T">©&É=­¢$>y~)I|ÛÏÙ%qžˆáÊÓˆeÔF(—•ÿ™ÉG–¸¬Þrbñµyq™¬e†Ð“'qÅUÐIÁgƉˆ~¦ž§Òº{/¡$ÿÈÖá”0ÁcOZáÚ½éÚõä’ü@Ãòò ×Ï�"OÒw\—€¬�ùۇɤ„[Ãg0YƟߎòË÷Âd{W�óË”`hÕÖ]µ¡˜¯5’d‰zäuk%“’F»�¨'M�Å>š*õ¹²lÅ(|¨"–À‰¶ô¡â?[6âŒÆ•º-®£`õéß›I$ÅÄù¥½Oç.¦Qͯݱí;üª$?PÄôŸü· > Ô†b¾¸c¬€Ù¸R#“x­°séD­lZ=}–f¾R¦i •Z¼§ToÀ4¹4Wjðí=•’}iÕÛuô]+]´êÓT)Y3 >T�z¦-}¨ººü9b×ñNëÎô׉%•‰ó›М¾ß›U5¿×èÚ´jcAI~ ˆé?ù�ó?Ô†b¾¸cŠ,HÜ0wªf- ?Y¨™?¾ßjÍ|¥LÓ@«´ìªToÀ4¹Ï (ÀQ W…�šR…jöñ˯K*ÛDúܯ°B|¨=I–úPñŸ«žù£š‚Fë‘—WªW\¦Ë�´a{^I1qþðÉUhÞÊ·Tó§-~›ÆÎ0v·døO~Û—Ò¹ÛÚÙÓ$ -™ÕhÜÛΓ§1�»åu°2÷Ä<`Ë&<�’‡7û’òVà»Ö{ª—”¬œš5¹3ø§ŽÇ�}$›D“S@å_Fò¸–nåšt—dËw5g)5\’ŒÈ£Ç†ÿ@ª¡ºùNªôÏCjmˆ3m"ñŸy j¤¬ROôÈ*c6_I/qš©?yqEìZ¬¬<ï�u£åI†â ?]`¨|¸ [ Tk„¬ÖÏT›÷laJ>TÂð¡¤mëCÅ.‚�n£q%ò:äeÌæËë“Ç-ý“++oˆ.òç§ìôqqX3s†8J_Nš'‰Û5b)P-š¿Šô„™bõzI˜ÈO¯Õ¾ƒ$¿qwíÓj%…Ã�å€o[ÊÑ—€"b·£ôc6?�–þÉ‹••7¼ÃGò$GÆ-ª4"¼Ôò¿Óß{éèOøPóZêCÅÖzæŽZú­K^^©î@eÌæ+µ)N3õ'/VŽU(.nxç² â(m˜'}cÃòÏgKòç�[(‰Û5b ¨ÜgŠ‹!”jØC¥wZÅüzÊ2tm+ÉoÙ»¹$n×|(‡e´|¨©Ê¡‹ãEÔb(€ZLÀâêTSJú`½ÅM¹£:üÉ[lgP‹ X\�êéŒZíàäF-:ÈS# uª¥š \¨¤Û‚¨-Ì%Ô`€ª‘Aº-`€Ú PB�¨¤Û‚¨-Ì%Ô`€ª‘Aº-`€Ú PB�¨¤Û‚¨-Ì%Ô`€ª‘Aº-`€Ú PB�¨¤Û‚¨-Ì%Ô`€ª‘Aº-`€Ú PB�¨¤Û‚¨-Ì%Ô`€ª‘Aº-¨¾ŒJK;¼¨J‹òÔh½ÄKMT� ÒmAÔf€j0@ÕÈ Ý0@ma(¡FT� ÒmAÔf€jT�SFºü´VoòCG½éøt�°{Ð/&ÌW¥­6pU�á8a Íz´T…š¥ôPÕ™S––Nš¯(ãfbz½º¹wèŠ+Öz’Áj°óź˜½ÖzåŒZÝA÷ �ªÿªÖ6•,|’žKuG5ÿ…´ÿ©æ™ÉxWC§Rož "o%o§p¾sÔ»ÝVy²/ž:å=ß5.̺õª(ÿK¯Þ®#:ú²';^Ü't|;ûÚ‰ 6¢Í»rÇ$áJ®Sµ¶éÏcÑ:±æäùu:·¥?eðhWÐù„LçnÃëÑÚ­ù,×T®ÇÉóÏQù&Ý}íÈóÏ_JE%öTÍ¿üOrz«noÕüÇOâP¶2C}ùV]ðxÐ� Ð@�”C–ϳÉ+å£N¥vÔÒ¬jÿûåŸRúÿõ5Y¥?ýw'‘/èbóÂÏ„9æ?¾b…kõ¡kÿK拺X=cÈõ·¯XɆïÓùKi|q½±r€¾"€ÿA0€R8w)5Éß›¨TNžöFäYZ9eŽ<Ùß½ï5jÔ­�bžU‰É“Þ§•_J|ë¿DdäýºòA.ÖQÏq¸åÅúò аߪÌs^ÜÉõ«/Ý�ÄõFÞÈ«^gÞ—ôVÃ].oŽ‹ª²)’ÝWÍC†?Û~Åç¯Ú�nÝN쯱�¹÷ÈQ~=|ß@ æŠÊÛ/R»7ýs=¹áJåõ¬ØX�úŒ®­»¹ü–sPû~M¸å÷ì�¾gü[ˆÇƒý.^7YA³ƒSV�'*œrÃÉ¿2ÍæËuàœ¬Ž(á_ÌSK¢/¿.$¯Z3ÎnzâÅ}ê+³hMßµž‹ãIž/þ¦°1Kʄ݃æÏu�Ö̘©Ø£ó5o%•J¦é#—z£’OvMœè¡¸’ëñc~Å‘dˆ$M¢^gâ„�(qbõ|öËQ¡ŒZHÀò5äã ¿–%I¬./ödjm =†@Ø=¨Wù_ºïà•Uû Tg¨óyB”ëÙeHÚ°=¯Z·ýÒåò?­F‹ |ÍËå?�[–>›_Ú¯�@ <Ô¶sPöðþñ“¸�úl0_:› ôGì|ƒÊûŠgLÝwÍs‘ùUsò™ÒÇünÏÓ¾™°{ÐrÅŽÐì1_*êÌû‹FaáÄHa…R°ú·r¥6¬L“{/qÝ�þ€XÙpË‹õåñ aŸƒž½¨þ‹Ä�“ˆû§ûúüÅÔªe/\VÏSBFØ„݃z{.ÿK×ã¼²jŸÁ¨S­­`¦úv$%ݘ½Ý 'ý}9•î&_;šÄ‹X*µèBÇNë_þóªqôâó·}íÕÖ$üþlM‚/QÇ� ÙT>XŠÕû€.]M©Ú­ /ÿ�Ή¼«\¾Bó®tâL:Uy–h�Ëë|KÐé²H'y¾ü7hy~¹¦ïÑ©sÏût’ç¿Óº3ýuâE_¾Þ ñàd2ãûEïvk­W\28™Ð§WQµ6�uË‹§W¾t£ºåÍ ºmÝà'Ôu“¢Žì–¥ßØš4¦Ï׊ù,ñ½¡õ鳡+Tó B%Áv�~ þ�7+eÑÓ¨ôI5Õk­b>Kì>¢M´R5¿]¿Æ4k´ò¼š ÑY>ÈÅ�ê©'Üòb}yXoEÛ¨€ ˆÂI4œôÑv@ ¡@8 `€†“>ÚH@¼+`ao�Œ…‡Çü<âMÄ'hˆˆ¸qfÏ õµ• ²ðž P�dœö°´P €Á©Iö €Ái;@ œ P�dœö°´P €Á©Iö €Ái;@ œ P�dœö°´P €Á©Iö €Ái;@ œ P�dœö°´P €Á©Iö €Ái;@ œ P�dœö°´P €Á©Iö €Ái;@ œ P�dœö°´P €Á©Iö €Ái;@ œ P�dœö°´P €Á©Iö €Ái;@ œ P�dœö°´P €Á©Iö €Ái;@ œ P�dœö°´P €Á©Iö €Ái;@ œ P�dœö°´P €Á©Iö €Ái;@ ñ"## ¿ðê¶BEH-QSkðœZD‘VœaÅ�Ƶ`pjÑA^X `p†?×"€Á©Eya%€ÁVüh\‹§ä…•gXñ£q-œZt�VœaÅ�Ƶ`pjÑA^X `p†?×"O+3”y§w ö5—¥ôPzú7> .½°ÅLf‡“;†R¹bG\jtÛK ìƒS>0½ŠÍó¥÷Ÿ.%öÁéRîè¶œ: ¡Hx„}p>|7<=G«¶'öÁ™£ìEH™JWLG¢{ØâQ’w Ö­ò­ÚX@ á  §ªl18½Ú­ÚXÐ{‰O °­Ã  FƒS� ÒÃNƒ3ì&€j08ÕÈ =ìBrC”2Å]Ú·nŒ¯³=FÖ¥5›óûâ9³\¢�ó¦ùâ³–£�¦VöŃq‘*å]úcmŒNï :}-Ò)y²{t`Ãh_Ó½G×¢•_÷ų¼v•¶~ñ¹/¾à«"4tb5_ÜÊ ñO¼'Φ¥ ͺIªçŸù; •y÷}Õü —SR‰¨æ?z‡²—*ÉW$Âè!LÑÛ‰êëÖ÷•oÐË'ø•ÿvW.ê8ð]ªXê0ͱÔ/ÿìÅÔTºQ¿t+Ò¿tƒ¾_æ¯ÓÆ�¹©ó FôÂó·è—UãýšÚ±;µêÝŒJ9N Çá—éj *V¯—_º™ñÀ×ã}üì|q›f®#è%»¿ÆPAÿZW˜LÃJ%ÿò(ª40YÆk/ßðäã?¥�ÉÚ©"ü¡° 40Yzé7�³Å�ÉÒ_Jw‹}XÔž·�@ù'w*ÿÀ¡WÞ[.\ŸAœáê˜ÓÛ­WåwÍ.¶¬÷3ʼnP?£­Kó�šòS‡û›i !ƒ3PCQåÆ�y4›Yû]¤fþšÍù4ó?û¢¤f~(2ƒ>8O�N³OŸjf%“Ý4h…#§ÒieÓã'¡ùy5oåªzܹ›�r”¤šýF2ÊZFýkýïË©©pmõùñ_Ç_V­;TAœåšt§§QþÆôNè³”®ØWo¾b¦ÉDv7«¥S•–]éÉSu�³•¦¨�Õ:³8siq¿¶¼í<|Ÿ&Î+­šÿäI\3½‚jþµë)è·C¯ªæûe„8!èwë!îš³)ž»õ�<ç Ä«P¾³´âó9¾b›„ÇL�„ÇLfBÙbGiΘž*–o(H}ÇÔöŃ}‘+Û%Ú0'æÙí®½Y¨Å-¸šß•?~‡²•j¨±<»EÊlp9¢Xž5ìõ܆”à(ô¯õ@:½)˜¬|eá1Ó�+ýŸ3ªË›_¹ÔŸ’�ÉÒ¼óm˜7Å[$¨ŸÙ2]• LÖXÉÂ'é�u1õõ* ñâ>%yšV]ò²l²"O3"ÏÊ‘ת;P^ØçÊ)1S¬ìË&žN±L\•ï:W–+¾ë`^l^óË‘¸�T)¯Í³òZÏI#"‚'öÁÐB( H qÍ=Šéz{´þ.`Q­ç¤£û|PÞl N³Ã$¿tm!S-Ï^æÿÀH…SCð4ìƒsí¶¼F˜è*«ôxD— E…æ¯zÓ’š2•T~dÅ*×s"ŠÖ�Ëí;‰ê¨%î¢ö³â€•ë(öÁÙmhºp9•ŸªZ`ü ËêunGÿ»™D–º»Ìa“ªÒ±ÓÏ[Ð~5ëÙÜT=5Û·7%_®‰t«ÌŒmü”ÑHÀsN 8ȲŽ@¬}Îù~ëmÔ½å‰ëÿ&¡B5>ôÅy.†÷\GÍjÅÜ4È×1ö)Ú5úÉWõ•kÉ©h�Þ¾xÏ6ßÑ{-vúâ×n$¥Â5ûúâ�›í¤Þíbn*þ½•˜ VëçËoÝà'Ôu“/~ëNBÊ_EýçH_AÙE‚�èèÖ’T#ž+Nœ§ž³§Ä‘grò»~£òâ¶�\‡ýk�ÝuŠ&Sþ¹TwéØö¡Fú!)Û«ÝVÉÀd™é_¼I6Žò”ëØt—d`²ÄÒÞ¦Ã[¢Aó:¿H&ËO›úÝ=d[˜Å“å³ÇD'vDÿ–]©äaÉÀdù)’> S¢“ôXšž ˜LF>X´êa‡¢Éƒy¥²Jiò6¬ˆ‡}pŽú`�b?â ›yC—f»E“ „…¾í·*æ'NøÈ“>ìý Šù â=ñ¤�ï·Z1?nöû Ñô‘ÊËÍØp#Áì Ж�ÖUK-ùD j‰Z’öÁiI/\X óîfB/Ñ”„§ž´)؃3Ø„ƒTÿÂ¯ŠšªyÂÜ2¦äG|^Å”¼á°ΉóÌARêäÒu¯+%Ó#aÑ sW¼¥˜ï]&7y~)Å|ïáèió½‰?µf£›Ù-y¶œ.PÐ’¿u;q qÓùaœ“„Áùõéªmvòœ˜@½î7¶±U@âp÷~|Êþl5ψϪЖsˆ³éÁÃx”µtô Ï„¹åHþãÓÉ»šgæ’·i…ìè¶ZÈ«óâ5Eè áŸ8°�ïͧº.T³�_#õ(-X6"Ÿ£Ü`Síû HÀsN°P”Ÿ@¬}ÎùÕ´™T0ÏIÏ�üuKŸE¶.šLY2\óe±¯d¯çó%Æ‚‹¬¯Ò–…ÒUNFؼü¿ôãŠO%=5"Ÿ:åú}íÇÜòAƒ‘°­ë±Îo`²>h=ÆÔÇ™£K&+Ï㘩3P›ÁÊ—LÖŽ‘~ȦQyùÀ4*ÏÊó†°Îæµc~Åáí„\®Bñ£ò¤XׄÞÛ3õ®iÉ'|öLW]Zû�àùçnk‰Z’öÁiI/\XISÑO³<Ýï*üüj&ôVù!ÃL�rY N9‘X_´ÆÜ²¼Of—7ÕÓþck˜’×#öÁÙ~À»Šz²…¼aÈÄwEÙYF±)¹qQêW0åëxNª¤“‘´°Î-ßç"vêœ8>ñ× oìדáŸUöF=Ÿ{ö¿fù![’‚QZpldÐ)•UJSS_©¬Ršš¼™t<ç4C²º Øö9矛GP’DÑ+~¼½ÿõ±¥lÞCJù¿¯M©SJw.Šå½2F>Ùò8ï*$¯œ¸Îƒ›FR²$Ò•7âü}ë?¢”Éï{E=Ÿâü½_ìYf'. Χk]7®±—FõZ+)b¤¶MZ¾Õˆ|Ñ‚§hɤùÜíK F‚þµ¾zÆ ¿�Étô>æX0�ÊëÑQ­LÐg�\«µíI/öúiÍüŠoÑÌçÉŒÌqQS¬h�3šùåŠÓ̯^î�f¾ÞÌcÛ†«e+ä­Aœ6Í�Ä5ÿre½PÞl� N³ B^™@�Jû•3t¦6©¹WgIåbML>gU®UšŠÁ)åkbf÷­³Õ`�‚Ö{IŽwÀsΪm:)2øýÙÑ{åš¾§˜øø‹žô·(Ÿ 2À¹ŸŠ•>K¬Þ®£bö¯3xÒ+4滛èØKžô’ ¥/ðf/`¡hÝ^Þ$Éç¹K©%ñ@#7.Ju™•W{/©R[ÁH ºç<|ü%’ï}fgJÖö–³pêÜóT¢¡tN[T‚ª¶éìÉg‡œ«÷�çÚûßœåoQyáÜOÞpèèË$ÿ£`‹žëwië©òÄ™tTª‘tNN¸¨Þ6úíü¥4T¼~OIó³—ó½åâÊ?)¨Hí˜�œ¬à‚¯Þ¤R²~J*P‰ÈÛå)OSõ$ËËÞ¹—À”¼Ùµ¶ZºÊóðœSNñ àyÎtÏ”ž¢RWÀàt…™cg'18c§Ý\¡5§+Ì;;‰Á;íæ ­18]aæØÙI ÎØi7Wh�Áé 3ÇÎNÆãQ;ùýú ÀMΓAÜLÎÓÍÖGßA¸ Àyr£ƒ €€› ÀyºÙúè;€78Ontp38O7[}à&ç©�."â©F.²@ÜL ž›;/î{ܸOèÄöaâ$Åë^£kÓª�ó� à¡8º‰á¼“°*=µé‘tß/ÿ„Ò¿xÓ�Õ3•n¨< ƒ„†@=¢d÷×½1×ß¶wn¶Ó°ãdV9½kpÐ�ƒ@ìKÀõγì[Çìkh `[®wž�»·â2Î÷¿fá’ƒ€€3¸Þy>|�rWhÈšK×½NÍ{¶0$ƒÂ Î"€_Û{Þ»Ÿ€Ø@liÒ÷Ë'Ð+/(ÿxT·s[úýPg�ô@€‹œ§[TTz»þ¢\‚€€2×ß¶+cA*€h€óÔæƒ\P$穈‰   MÎS›rA@@‘€c0ªVö åÍq‘Î]LMë·ç¥›·’(PNŒ¢¡ïo ¹ÎÓ©óiiܬrtéJj墱<µZ9�Sv^NDUË¢ÈÓùK©iÃöóìeÓ£ÇÑoù\Òý l6l´Õáég¶2Cèñ“¸žŠyäsVDÄç–ÏW¥?ݾ“H»caÊ­^þM¼ÒPëû„Ùdí<2z¿ˆÄ ;ý¶gxù†)U3¼lŽsªwMµï$a³,ÍÚòU“c!oöKN2w_b½ó¬×¹Wç'Í/í‘{½ú‡\òßýd쇮F,ªÓ©=Wmæ–ñÈ5ëÑ’K~æÒâ¹UûqÉÿôG&.¹Pݺ“�«™-?äòÈýó¿¤\òk6ç÷ȱ[pž°xM�XT�4ÑàO«ó :LÊÏ<™MŒ<�«Ð¼+�8“NbJ#ò�º·¤Ýd–ÈÇ–ˆ‘~–kú�:÷¼¤kFäßiÓ‰þ:þ·|«¾Mh‡Á_›%�… 2¨Ûj]ï]-]½žŒÞ¬ÝGRöƒ¶[©kó]’4µÈ�›‰éõêÒ/¡ŽM¾§¾¶¨‰HÒo Î>_•’´53¦Sþ\%ij‘§‚³ÍRj¸Z¶mÒCõÌÓ1ÎÓk¹FÕ¥Ñ ÏçvìÎF­z7óSýœ6j U.ñ—_¾ÒÀ÷+‹רK£z­õÓxÛÏÙ©Mߦ~éò„ºUþ ñýVË“i×Þ,Ôâƒ~éò„ÉC—Sua™“<\»‘” ×ì+O¶}G«¿ÍO›væñ+çÔ„ž¿E´ýγNõò?)„¾ç¦åëßkw»4ß)¬óyAYK XÎl6ã;¹c¨®jj3ȃÂÂu«ƒÞG)Í?hNßïÍjuóº™uQ�¾Ù’ÏòöåÂyʉ1®wð‰Ux»Aúû2ß{q=F®yô´ó:I#}geyúÏn™Ëž»mW­üû­· w(;Ô²Óÿž{‘=÷T,¨#QíÑ‹–¨•›<Ê?B³F©Õœ_^(¾ÔBå<ãøõÎe èÿÜN‚„C“C~º€«9;¯“4Ò¡>íõý("¯sýœiò$ËâF'køùçþ£|9/X¢ƒÒ3ë@'Iôˆ*¼íÿL?�œR¾QÇÉêˆ'Š×Ü£T]¬Ks½óL•â^¬0Zªä±CÏ`ÁL•Ò9ëDS¥ ¯-S†y,¥sÿ­£®wžú7æb9jj%.9^¡í:r‰vÚ€KÎnBýÇÕäRiú—osÉé:ó7ß!&»„•V„Ýû^ãªfåÆ×¹ääBk·ñý?ea)yU±2J¼V8²u¸°õ,ðá ¬þü‚ï[·ó6eJîäÎ!'‚- r”LìwN û7|Dzw…­Û‹®¿Â3è=h…éð˾Œôn·Ö–ªcdû‘Sé¨JË®–¶Ï¶šnš?EW�_I’×Ü„ê™'œ§Ìì/¥»I‹'ΣLéc¶#>�Š QS*ÑÜåÅd¥ÃÍœáúBxúrº[>% kú}Z�–®-äKsêÅsÂR˜ÅçSŽLW%]dÇNý"<3›=×RÓZ{%ú°u¯­û4¥'ÏW‘dZØu#µið³¤V6;mÞ«9=|}8‹$ÓâH¯v[©K³]’ZÙA(M…ÝiwîòíÆ’T¦3*çéúÛv¹=. GvÍ[ñ]ÿ7úüOæ�Ö}—WX?hÍ­Ž¼=Þ8Ûù3eQú÷Vô ˜-¦þJXç¹úÙÖ==õ¶ªÿý.ŒÂ~Å>¶}(�ï¿Ê³>Q�,+ÃÖôýúÍ�<;–�-£J*œC©7°ö~ý±GþÄŽ!ôÙÐe”\8‡RO¸~#™ÇNÞ-ŽìWÜM»rÑ⯠ëJ™y‚=~;ôª¯n¶}’Ù(Ž“5ÊÚÿY´�•Íôæ¯*ÇÉÚ_ðÕ›Âù¥YÉ{_tùŸäžöCé8™¡ ˜y>#ýÕô™T0·¾_AÙkŠÃ¶/™Hu†¢¤ç¦ŸûÍÖÔú¢$¿fæ ÊŸóo5Iº’üÒÉsèÍg%åÔ"JòóÇ-¤RÂ"p=AI^�œ‘2lüë×cu‰ î ¼ûÊu è(Ävýùí(%I8ظM˜[NWY½…ØÎ(ïÉ[�d–®{�ú�­¨˜éüPÍ<á<Sñ¬|WØßþKˆ÷·óè)ÞŸÎ#_­mGúóØËžÍ#ßà½Ö´wFnùVÂ-ïŽ_²sË¿7´¾g‡˜§‹ÿc3åjeÿ4T+»CÈQvˆ!µÂƒÞÛH­ëKoÓÕÊzÓÙ¬0³E_þz7,xÛö~ûK-TÎÓõ·í¼ç\.™4ß;BòÉfl<á»EŸyÄæŽý‚GœÖÍžî‘c{ÑyÂòÏæzÄF÷YÃ#NóÆ.òÈ1GÁ>º‚GL—ŒQÇÉ*e'ÆÎFWý� uœ¬¾á{uŠAÏN/¥vØã"'×;Ï8q½OhìmÎxñ¿æA«q„ÅÉf‚ž×LhÕoVžmƒtJлZ"Xý�«ã•!Áj›Õ7–üÍbàzçÙ�sdÇ��±µ4Ÿ÷ÜÒZÚ{ôh)üâÊ¿ßÒ#Öy_Û÷×#ß{tžæ©ÇȺ¹a“ªrÉø¤—œ¡ïÍ¢§˜¤ û Û½/“$�7²jS~.Q«ö—O[T‚«ýÙÏÎxå¶‘žy>3ÆŽ¥üŽS³S¦’Ä,vúðÛÚ1”Fçn¥gKìu/¤½­Kq%ùï—*»ö¯NyN[M¦,®é’Ï\j(EEI¿ß×Ï™J¹³]Ö%/~ÿ’.ŽB™_½&E7Y—$s6cgVÐUVo¡çŸ»M{V�ÓUœ9Û^EéÐQ(YÒûtPç«RØ/ñ-{ó}‰ëPÅW$TÏ<á<}Èc.äâyÙ3’ #ú+v;¼ç:jRãW_ã{ö¿F=GÕ,IåKS»ˆˆxêy½róÚ{|E~–Ù°™Þ¹‹i|iêQ4¸ÛFj%:x¿pbPÏu=¯kV—‹ÉéßyµkóüëÏã/RO¡ýc§_ˆ)¤qÕ·ãfêØø_ öfÔ>ªãw³¯@�/Ø Ý>î»F8Žíާ%¶Ìí#a}ð¼•o¹åèêÙ+�Ç g¬z×þ²YîØhúb¾¢Q¥ßˆ<+,w[-Y 2q^š$ü e•ótÖö ,”(áCÊ$Ì&ÄáUá|ό¢y;9ÏdIPfÙÁ·Ó_f…7t9O6£2¡šçŸ¸¯ú¯#høäw<ÿôËHK~4µ2±¼áãé‰ý³K`ã&µè®€=çÍ”Az8q0ueí³ƒG¼�ÝÉDz7/Ÿ™„ñ÷bÚ[’ª3¥¿Fì‹Z~!)K#˜y>3[,®÷À‚pn{ÔûŽnÖ­p>^ˆ¥†Õ.”ï,­ø\ßJˆo¶FR÷áõ ·¡%ÀÄÞ²ðs­"¾¼ËìÙíãK°à‚Hý˪ñºj:,ÜYTmÓYWY3…B5ó„ó¬Ä³~±ïÇ5C~j9�ž-z5£]{²™‹�U!ðͬé™ã¢J®z²Ò³dõÒê9³Æ,¦ò££ÁªöÙë¨ ¯½1¬j_­ÝP9OéÓx5mœ>uÄR®Þ}Ü÷k.9^¡Õ3fp‰.Ï·¾“«1— ñ8N†ˆ=›´"ð8NÖn�Êû¬hžËq²†ÙKëœ\ï<ïÞ‹+ìx÷^‚X¡'” Làîƒð޹;wÃ;–bËß\ KºÞyò.Ýx§uðŸÝˆ�×äýVâ¨îë7ëôÒ]�øâÙûÏ�H±wKýq(ƒÕ²ãg—SÍSË`oÓüvWnµlCé}ÆÔ2TÞ[xáWE½—±úÏ<Ÿ™�ݾW)uX—1ƒýÌFK‰åŸÏ¦ÂùÎiñä±e2ÙÊ XÌ`«3þÚ2RW%m>lBÛ~Ê¡«¬ÞBq…ƒ9Nlgëi‡Þ£k‘U!‹[Óû,~¬ð&Íi‹JŠEƒrªgžpž æ+Qøuoµ�ò ?\ÖL®û.’&Î-«P2¼Iì]4�š~ïÑóÌùçè+á8ºé!œáíµ}[g¯Þc^=ÌÞ´_8Ër¨°3êŒðZèPöîøÁÝ7P©"Ç)EòèW�ü¬ =¥oݬY™#Ðå[*Wü(=—ê<ú2�žZ1à;ãͶ+—‡ó”Ñ/ZðÍ·ÈïTøù«Þ$=[üØBß/>]H‰>’´ÈΉøIuIšR$R8®mɤy”4ñCIö2á<Ð?æ»Í‘TdQ¤˜ð£Å\áÐ�„ñŸHjœ+œ 9BX¿(°%:_|²€%”ž¾¿hMaá@æÀœòçº@_ œ˜“½Ç–åÊv‰–6‡’%‘r^¹±ñnëÁs½hÂ|Ï;ÛŲìË—�LuóVqrP®ç|¼ˆÊ¾uLR÷Uám�Õ…W¸\½ÜõY£S†/¥wJKïÞnÜLLµ:tйñB¢:wÎÓ :½·¬Ú"µ{Ó?דKZ0òz ¥×³Ã€õ~Q®I7Ý»p$JZ1©°À隌Ó)áàd¶øZO(^¿']¼"ÝíÄ=foPÔÊ œNŸO+)ztÛ0ÏÉD’D•Hå–]‚>ëjÛèGÐù[ ¤É'Φ¥ ͺIMÆjT8@“­ÔU ;œø­º½u•Õ[ˆ­X4a�®â·„ç½ù« ÐUÖL!8OôŒ8oµ ·³–F¿ŒG^|°,�ü\á´úÂ-U(�ž#…í…s–÷¨É#?anáÞ2Üò3…C$F?{ÙOû‹¿)DÇ× æ=«ÇJvôèmĪgæëçN¡ÜY¯èmÖWΪö�Lík\¸°ª}q�âëP9ÏXÿk;ï9—ý;oöðf·:<¡[Ë�±ÉC–óˆ>Ä–«‘Њ)³E1ý—…gX,°?žÐ£õv�ØçÖñˆS{afÇÛ³ÍÄ{ÿyäµdÄ[!µÊÉóØx+�ãdí6âXØ®¤¯Þýå²ì÷'„Xï<¯Ên+�å²ÉgAWLÊÕ—·<»e3®˜älVþòÕà?³3ÃLjìå ¿Ñ3�.W®™ �ê”îþÒOo~¬wžÝ†ñ½—ͧsÊù^,¦TN-­DÃjY¦Ó‡L üÚ¼‘SªˆÃÇ_’'sÅ; 2nSöbÃí?[³\ªn綆õ¾ÿ -[÷†a9; 8f©’Þ÷ì×Ç7k÷ñ³Eã{iT¯µ~éò„ÿÝLBoôŒ™«CÊ?B%…·‹¦^áÌÎW�»¼X(›§’ÂӲŎQ¶ÎS8wö²b!?ŽÎ3¤&Gc N!*çëŸy:Åàè€@ì"ç»ìmAlBÎÓ&†€ ±‹œgì²´° 8O›j€Ä.pž±Ë^Ð@À&༥/Tº 0K3O³! àJpž®4;:  `–œ§Y‚�p%8OWš�0KÎÓ,Aȃ¸’œ§+ÍŽNƒ˜%çi– äA\IÎÓ•fG§Ä0[�^ùŒ…‡Gé-‹r  ÀKàÌÞÁ!ñk˜yòZr ®&çéjó£ó ¼àý²z%IôȯŽ­IËֽᗎwÀÌó™Ý‡õXG6~¤è8Y‘1}¾¦#ß sç(A¯AüÀy HúwÞDÍkïñƒ#OHÿ �Ü9DžŒ8€€ ¸Þy&ˆÿ˜Ú5úI·éãDDѤÁ+t—GAgp½óܲè3Ö­Qþ a€8‹€ë�g†—npY´`Þs\rp×;O^3¾Uð4¯(ä@@Γӈ‰ú/g⬠b ±�œ'§ÑöNÏ) 1'p½ó¼s/—¿û)'—„@œAÀõγJËΆ-yò\ZÃ2p×;Ïó—ÒÐá/²jù¦Ý •Gaçp½ód&­Úº ]¸œJ—uóWí§« �8›œç3û–hГzŽª£jíß½J™J§[·«–A€€{DDFFF…¢»·ÕE3–´‘ Á#*Zà ¥Jy�üõ �¹ðœ%õ¢�àH~?4Û§q$�‚->ŒO»ödSÈA€DÀm;F€p€ó䀀óÄpžÐ  pž  ÀAΓD@@Îc@8Àyr@ƒ€Àyb €€Gî0Êšñ*•,r‚R&¶Wy…Œž½Y¥Ô!ªSe%Kò�~ù##MšW–­ýE²ebœŽSФ÷¹8e~õ•*zŒR§ˆæ¼õGcgœV,q˜ê½ó‡§ý_öe¤‰sËÙZ kT8@y³]¤SçÓÒÚï"éÎÝ„$¤ÙÕË òÙ/ÑÙ i<ò·ï$’«Vö åÍq‘Î]LMë·ç¥›·’�gGÑÐ÷7P�\ç=ú�›UŽ.]I-.€kGímØu#µið³¨{1—.§$vøQDL¢ìjóÂÉ”-ã5YjtôÑã8”³ü`zú4öOÖ½·‘Z×Wã”JàÔCè´:§¾7SÇÆ?(rºt5¯ß“¢¢Ô9­Ÿ;…rg½¢(ÿø ã<ˆž<‰«˜oÇÄtioÑO+?¡¸q”�‰hׯ1i}±<—ú?úå«ñ/îSÅîuÒ€6ŽP-¤Lq—ö¬G â=Q,Òcd]Z³9¿bKÌ™åm˜7MÕâ³–£�¦VV•·[F¨ö¶;Æyþµe8%Jø8 ߪ÷]¾šÒ¯Ü©]ƒU�¸p¥�éØéÅI±êúÈÖá”0A`NEëö¢+ÿ¤ðëÛ¡oGRÒÄýÒå %ö  —üg-z9×hמµÿ«N×ÜC£>X'ï¾_|Ïþרá{müÒkWÚGŸøÊ/]ž°_¸ƒªÕ¾ƒ<™ª”þ“¦_æ—.Oøëä ôN«.òd×Õ«¼ß/]žp÷~|ÊSq�<Ù–ñP9Oõé�-±(+õÛÚ1º'“þY˜!Ig§vêsœLþÛS)NåË·sø}íh]Ž“õá—Uã…ÿ¥œv¯«Ëq2ùï—M ˆ)'½Ž“É3k¦0SžI±|;„\Ù.érœL×"ùÏÒˆžk%j³Çz'ÊŸóoúdÀ*‰ü+/ÞÐå8™P®,WhúÈ%ùJ¥þÔå8™P’D�hÇÒ y·Gb½ó|³ÀiJ“ò®!;î\6ÑWþÃNß 侨®‹Ã›Gè*g§Bo½~ŠR Gì ;–Æp*�û<¥{î?#âž[Y¯À{-¶ëšÙ{˳ÏÃ[ìÍyÜibu^7­µWRæ»Å“%ñ@‘:•öK¾¸XnÌ™U*ùÅ�s×1}Dà«X§×^¾!LRßuˆeœ|ë�ç—“æ¶O†—nød:¼û£ïZïEÂöž)õcñÄùJÉšiì�ÅVL™ã½Ôýùâó·}e{¶Ùî»Ö{?žtæªW.åre½ÌÕ̸~ѷ课ô?.ù)ÏnÑÓ¦1öEæmlöÇ‹=—åŠÿåM2ô¹cÉ$Cå�\8Ö;Ï8Ò[K½Æb¿2› «ÿjF<ä²'×>ýŠ¢YIè@IDAT¿qÒs­öc†¯ ÊE…|¤ÞêÚ5RþaÊ›®Ï]6q5]OXÅÁÂÀ®|ò•…Ù# ý„;&žP²p´=Ç~¸†Gœ^Hó…ÈU�ƒ„b½óäµEd΋’[£õ”*|¨H¬,™ëoSz³guòg§F*,þÆ)#ÅCV6ÒÓ/þæò™”ÏoÒ.Fáð÷Ô¹’®užÿÞJL�ó/s½öoRçŽ QÏnÞ4²NP$øìò_Ï;Ÿxç½D×ÿ5×¾¿F֤ܯ�™pÃÐúKÿ–Øø5ž<å·‰™v�$ëZç¹ã—l¦ì¸dí¦äc‹ðÎ=YM©jšóºB¦Ú–ðŽÝÙ¹ª~ø8zýêÎÝ|ãïiT´ÓÛÁ)ïUú¨°t Á�Xï<Ï)¬%ÔƒäïËÑk£ø™Ò_Ç_ÖÓŒmÊè}µ²\á‹WRy’ŽžN'ÏÒ?q&Zî)ço?¿îϨ«�P1™oÑø°‰ïxT;£<—Êc¦UðÈ}¾ 4—ü¤ùÑrïvoÅ%ÿÝO|_\�Ù\(Ö;ϲ�»FmQIúX‡eûÓó+pZ°ª( ›\%`þù_RÅ­|�ºµ¡ËPžý˜‘¹dìàœ¹ÔЀýaÊ6馸Ý5SÉa²}\ÊÕUjÑ…Î_Jã—™Iàä}ê—)J¨Þ®#y¡ˆ’){ÙÁâ¨êu‡��hÏ�m§Z�3³·�Ù†m›ÜüÅg”åÕëS=œ^½Nm…“ƒÒKÒå‘$‰Ðþ £ýh`³ .ƒÐÆê‡3Èë²s<®°íqóÂÏ)³§:ÛÓ¡£ÚÏsÙ¶ËMó§PöLÿHºÉ¾\¼×šþ8”A’.�$v©Üø‘°TLzßÈ8÷Q—¾Þ’_.bûxÛF?Ò€Îþk/×oÏC]‡4 ¨ó:¿Ð0áD#yØüCNêп±<Ù/ÞHXw<º÷7~éÛ…F[÷ |§4mÔª¬°&÷ÊõdT´v¿z휪½íŽržv6(t �P9Oþ…Ž¡á–VZÕÿ‰Ê¼u\8§ò.8ú },<¸åY¯uTíØt•(t’’ çŽîžÛ2=ïÞK¨ZÞiMjí¡ Å�ÐóÂVÅÂlyü¬òtýF²°u3Gæ+ÂQ}ßSá<ÎÓÂ�9+7¤-ßç ™>Ó_§®ÍwP$;ÏS¸ÅÿzK>Z'œ)ªðò ÿR�ÖÛ<牲Uvä¡U †ªù�·ƒ™§ùú9S)w6õ=ËÅ„ãì.)g'ª"$—Û—L¤Œ¯(ï�fÏ¿^¯Þ×à!¸!QÛ²FVL™M…"Ï©ÖÇž/ž#U¨Tò°pbÑRÕæSˆޝ¡šo6£˜°…vñ„ªÕ|³5’º¯¯šo6#_Î ôõÌ™ªÕlû9»ð#kè~¥ÕÌÎó™ÉO çyê í¼ÒÙ„T§(:½kˆ4I%V¯Kúíàk*¹±7Y¯�úŒ©E+6¼ô޲cÞØiE�ÂÍÛ‰¨@Õþ�ŠÎùÁZjRSzZ“R%÷ħÜ)e™JëÖr»0Ûܰö<<[™¡ËYQ TÎÓ¿¶›~l»~£Î¬³“»Ãô:N¦ÛJá¤ñ‡CÍ µù§�£ÙÁì62˜�d¬Çq2R&¿OkfΰT�Âù z'k4qÂGÄîX¬ y²_Ôå8Y›ì`™=k>¶²ù°×åzçÉÞ9_åõjÖa¯<uèØä{ÃMî^z= +©S€�îÄä5~Xñ©‘â†Ëê=ÈØ[1;$%q¢‡Þ¨éÏ…Ÿ,4T{Ô“ö9ëNEZ7{º¡öŸOs‡²¼&]¡a¨›v½óœ4h¥a“¨½+ÆpEúvØb ttÑT‹ٜæ�ÿÂpW" ¶,+�Íúx´êÏF�Ô—=Ó#Å}eŒ3æp}‚²‹4©îÈRôE—Lš«¯`,(åzçÉk£Z÷óІTŽ�´ï„`ôîÀÛç–õ~ñ^ZúÙ­å®úJ½Éçtå�uoø9£\†ÅÕ^¼§TV+­kó�ZÙªylöé”çÉiI¶$6vn©›C¤ð\.!Üöw{ûÁ°©Ñ:á<�{VþÂ¥Tœ’¡;/¼¿ÛÍá³ӳ¬fÀ{J•UzœçÛªlEX·-t‹ï­Ð7uXC2š…¨N¶€—'üs=9�· {ï6OxøÈ›ÈVpîT9zŠ�[ Ö“æ• TD1¿×è:ŠéF—®å;$zȧՌ6¥X~ÛO9Ó%Nää¨Þpä»Þyòì|0¾zÈmõN«.†ÛlÝ·‰a» ô]Û°jŸ>;»Ò° N�?�¿¨³dL1^§SCÌÏiòK8�nL«1WËÖß„Àû¥Óª}®\ï<™)j¶o¯Û"§/¤!ï�¶º…,*ØæCýÎð�?ÓÓöŸùf©ky5å„m—zÃUá4 Ïæ—Ö[œ«\µ6�u'ç­<[™!ÞKK>[õnFFnÃóT`I»ÞJ>ü¸ݹ—À øY¨fì:�)P‡à<B쨺Ê-Ïì~ø-3•mü~ ¦AËg³–†:f{™ëtÒÿ…4…-®ø”°_]~ °RNOo†è5vî(Ûz(°s3Ù�ÔV‡ì–Ç+×?BÊ[y@P�É[i é9Ñþ�}Ãzh‹ÕÜY}ØÛ.£Ú·ãfádœ$©¿ %7íÑ‚î?Ðÿ-+© ‘¡ï¯§uvKjþQpî-{5 Ê©¤!Dz´þŽºµ”®5<(œ¬ÔD°{ÅD¨[´¾`üBzñù˜]Ú[4¶ï*)ì¸aœÙ+RFO¯DßgPê i…3¶\%'ö%»Þyòš¬n¾?ÞöxåJ9Î+ê‘«Rú°)ùZ˜’oTí7SòÍjï1%¯&ÜŠóœÐ</TkK)½U}ã3qVOºçþSªÎpï9©löë”çÉiÉœY.sJ†V,WVszæ2ÙÏÜfÛ7+oR5kå4©—Z½zÓÍÚEo;jår‰«Z{vL‡óä´ÊñÓé8%C+v̤ž±^þLpNU:~*¼ö?~&¼í sû¡ý+Rn ÎS™KÀÔ¯¾Í°Œ ˜=dÃŽ<¦º±z³¾Eïj�¬à8¹G\×’µoˆ£–]³w±ó=ûÀõÔ»xMa=ÅüÊèÙ‡ï'¤�ðå×|ýg¯ vJpNO8-²à«7¹$C½Ï}ó9¹ôô ñ:±§O£‡Èâ¯ùþX>ŒïQaÆéšS¯^�>oßIä)Â{¼Üµ �»úå×E©®˜ßyP#Åt£‰zw’Éëí:¤�<‰+ÎÓá Ž­É#fK×;O¶}ÎhhÔ­•QÓå;ôol¸ñn=GÖ3,_µM'Ÿ Ûæg4ÔëÒÆ'2fZ%ßµÞ‹‘kÞÀs¼\çÁ ½âAùd§W Æ#+gfŒ„§QôïÊ;ÇŒÔã-;rŠq›®â<ÔÚÛ¦�>]ï<™1 VÿP·M6íÊE»÷eÒ]ÞÊ‚%êßâ7Õ›ÂQai%Í¿Y§—$®a'·>þ’¤ÈëÕûJâZ‘õÛóÐo_“ÉW¥¿$®ÙþK6Úµ;›¤H® %q­È/ÂöÔ�&9hÕÏòº¯O·þ‹ž*Ëòs–¬§˜î2l;@oÈRJßî.½õÍYVœŽŸy^oqÊRz¨î²±¡ ¶g>³’ž­‡M­H³–¾V»êÙ¢ÙsTZý­òÉ’Þ§ƒ?Òì;)_íÀçD  ;UFjÊ�ø¼2Í]®<+Jÿ1ýn¸¦üøÙåhÊÂRŠeØúÚcÂÏè5¨ŠEhÊ%iü¬òÊ™AH ´Eñö�„”¯Ê€ ´]åŒQ_RÅê‹ÏÙŒ×jÇ-îL ½ýì9gôAÐZV×hî:TÛ3áÁXr�Ûög†J+œ@´wõ8M³)“¦)„ÌŒé¯Óö/'iÖÎÛWMÅš¹céÉãy7Ù#«¬·±~ÎTÊ`Û'û±Æ»ìL,kÅu g¾¬�å‘wÙšmjÕª™'œ§`vôÚ.Ñ BZ†ù]xŸQÝÎí´Š-��ˆóÍ̺êßü}Nê0Àøò&]•£��ÀÑmÃ4Ðö.‚qžå��£(yÒâfT¯³ oï|bñKèö¬+}øŸj›â ¶Z"ë£Cå<±TI°®^ÇÉÂëyÏSåRŠÇDÈ®õ:N¦ûõµ@îó!ÓÍ� -š0_·ãd|Nîb)¦O¬Òí8YÃ'tD­WÉ>6ëvœ¬Î@«4ô¶k—r®wž­0l‹i#––1+°tòÃU¬ž>˰ ô`ïo2Ø»– ç?cDD³l�Jû5ó•2«–=¤”֩̕ɆåZÕÿɰŒ]\ï<Ù‰ãf›…¼�1Ó+häúg�»”šnÜLêŸÁ™ÂNÏ2ØvM+ iÖ³¹‘æéîýøôÇ¡ †dì\ØõΓ'SÉaºmÄfª¼ßººQ)˜£Ü`•ÿdvðÏNa÷ÏEŠf|Y‚öyEWUÇ¥RÎcÕS);vpçî¬zŠ»[*TCÿ¹µz*e+³sô†<é-+ÊÁyzÌáÙ:wí†ö¬ z»ŽÄ3Sµj$<|Ï£';R+”~·{ÐÖjßMyµÚw @3ÐËL9ÊZ»»È˸eïæÔo\ oTñsß_¯mo}¯�êR§AÚ'ö³“ƒ±5U±³!LÄÞvlv.ãàî©LÑc”*Å]:xô%¼n Ü¿nÊÔ$vxóðëèíB')Y’‡Äþ@†O~‡NžÕ²·¼NÄͨXò0ulüåÍq‘NŸ{ŽV §ñ‡òðlvÆk·;)�Ðþù‹©éë­ùèó¥ÍuÊ€4[8ß³Í6ŠÚ¿(œaºAx›; 7Ô¿„jo;œ§�Á�¢ ö'*ç鸟cç|¼ˆä»j®^OFì–ûêµ-¯ôJv;_«Cúûrà_§ _Jï”>,içÆÍÄùs­Y&"©œ32wìÂìú¸DúʵäNÿèxãäÌÑ‹%g7²Šþù_RªÙ¾#]Òqr:;{²J))§ÿÝLBµÚ·§ó—sšÙà]2i¾$M9+ÜJ•nú_êÅz¼SæM­Õ la}õ¶1oΗ-[ì(ͳXœäw}ìôóT©Å{~é,¡Ø'iñ„ŠyÞD¶±Ì»ï{£’Ï7"ÏÒÊ)Ú‡¤\¸œ’J4ø@"ÌȱíC)~ܧšM°— þ+|9#Þ2"à¶Ëbõ>Ðõ¥Æ£ßëF �¸îiŠVhÞ•NœI§YƪÌPÍ<á<Ù! “­ÔÅž½m𭺽%eË?B³F)IS‹°ÙѲ·mêqÞúØ"áüA|˜·¥ÏZ÷Ó„�«”²üÒØ)èÅêIß¶Éžé͹ԯ¬R›­®)}Ûf‰Â'há' •Šû¥±SÈó¿Ó_’ÎÞ{´âsmÇé¸s/å­¤ÿm›^9£Ÿ§wé_)¼=ÔêFÚ/R»7鹫0Âà¸ðÅ/À‡·>ö*lù]½yV~†Êy:â×v½Ž“ˆÌÐJx……8èuœL&MʻԵűxÀ™”¸p áàÚ¾7‹“Bt¥Ûq2…Ø‹áš×ùE¢›^ÇɄҦ¾C›î’ÈëuœL(E²ûÔ»ý‰¼^ÇÉ„’&~HCº¯—È[ÙµìSCUzk©¡Ê„«gÌ0$²'À› U&f�nô:NV÷w‹'mÂÖåc½ó\?wŠaÀƒ»môÉ,ÿ|¶ïZïÅÂ/ŠÞ0oÜÞKÝŸìÙP‡M ŒsöþŸš«¦Îò]ë½èÛ~«¯è‚O´oÕ}E�›~ï‹M¹Äw­÷¢eÝÝz‹.ñTxÁ¿†åj ³«B�\®Š÷(=¥†Äï+RÊWJØ5æoO)?6¥Åzç™;ë.ÞiÓD¿: p¾s\ò^þŸG®ô›Ç¹äse»Ä%Ç+”#ÓU.Ñ4©îxäØ ú<á•£_-,~1™‘zrd޶oå’ó•-˜—Ͼ¾ T.>ì$�«óKþ¨×7~i< ­ð*ܯ³5w=ÕÊñ�ƒÛ¦�ô®�§ïv‘‰õΓ${Îi&Täücö¶Yñmsí{ë ö§iN&ûY¡ŸÓôr 犜zÉ�öêiô³¢ðë>O`§2XxÛ·¢m»ÔáZçùBÚÛ¦l�.�Iy“í›RÞ€p:“z>/¼•ÔLxÁ¤|:“òjº«^µöäéfí"¯Ïh<Üý7ªo0Ê»Öy8bî<ÄÂÎ#3á ÉöÍ´mDö€Î½Ûju2yî¤Ùö5ggµ~™ÕK­^½é‡‚Ô/½í³�wn®užÛÎá±}ôñrƇÁºï"=BìÀž°tm!±�ËìÚ�ÍÓfg˶çõH>zÂ7ÔVlxÝ#ÏNäá óWå (3nfù€e” lØ‘[)ÙpÚÇ3*–a¿ÌÀ%'š8¯Œ0~¾¡ø@×FÝZy«ÒýŽs6» i [?oA¶cÈZõnê½ÔýÉÖjzCãîÆ9Ý{ã0ëwië­J÷gô›UOù¤ÍþÎy´Z·aõ¥qÆþ¾œšKÒªó4ïÜMÈÕ~ý®ÆíÈÕP„b½óÜ´3uFE…ÅÂÞÀŽÕ tJ‘·¬÷³ˆèœLv>!Û~i$’-7"Ë[–Í�rz«nÌ"ù�»³[xn$®Ãùׯѿ· rªÑÇ×Üaáµ'bgîËи(\3F^£wVÓ- Énù1=yÂw§¢ÔPÕ6�”’UÓ~?ô*ñ:=¥JK›µ1yù´7Ÿ}N¸’jU< Nò]³[ÈBÕû ³Ü˜[Y_fˆ/f�YDåŠSl•qz]ÐSîøÄ…Ù‚uµu—ìVû AþÞ}õYêÄA+¨fåu‚Ì98kq×ï+ªWeŸX%ß5ûc3Λ·bÍø2ƒt‘'ûEZ7{ºjí#…# ç,ÓçdU+ÑÈÈüê5ÍÝ;畦IóÊjÔ`.ë¥t7éÇ•Ÿ�ÚôcÎò·häçUÌ5b@:TÛ3å<½|ÙÚÄ’ož ”ÉîyNúž»¼˜7K×giá,Ï2ÂûÎS çy²_Õg/eòjCÿJ¶‡»\ñ£Ä˜³_Õg/+FQQö›ä³“€J9áÙ ÉND7Ê©Ì[G©´p2ãÄäçý4©d‘ãTVpâ¼œŠ ‡Œ”Ö‘¦Mý±_õg ³ÀprN–ô>µ®ÿ3åÉ~‰N ·¨«6Ùal²3^Û6ü‰"g~îÙyž¡<‡6~¼ÇÔ¶‘оpž';Yk½pž'ï³aÿ¿*ý)pžúY¡$€ø„ÊyÚo:äC€ °/8OûÚš�ؘœ§��Õ@ìKÎÓ¾¶�f 6&çicã@5û€ó´¯m €€� ÀyÚØ8P @À¾à<íkh `cpž66T°/8OûÚš�ؘœ§��Õ@ìKÎÓ¾¶�f 6&çicã@5û€ó´¯m €€� ÀyÚØ8P @À¾à<íkh `cpž66T°/�x¡R-T§;‡ª?h@ÀÝ0ót·ýÑ{Npžœà  ànpžî¶?z ÀIΓÄ@ÜMÎÓÝöGïA8 Àyr‚ƒ€€» ÀyºÛþè=€'8ONpp78OwÛ½à$çÉ b î&çénû£÷ œà<9ÁA @ÀÝà<Ýmô@€“œ''8ˆ�¸›œ§»í�Þƒp€óä1w€ót·ýÑ{Nœr¶ËTxøÙ(¢ ¶UŠ�€€€€^7Îì”Foq»—Ã]»Ý-ý@@@@À!0ñtˆ!Ñ °;L<ín!è   !€‰§C ‰n€€€€€Ý `âiw A?pL<bHt@@@ìNO»[ú�€€€€C`âéC¢    `w˜xÚÝBÐ@@@BO‡Ý»ÀÄÓî‚~    à˜x:Ä�耀€Ø�&žv·ô‡ÀÄÓ!†D7@@@@Àî0ñ´»… €€€8„&ž1$º   v'€‰§Ý-ý@@@@À!0ñtˆ!Ñ °;L<ín!è   !€‰§C ‰n€€€€€Ý `âiw A?pL<bHt@@@ìNO»[ú�€€€€C`âéC¢    `w˜xÚÝBÐ@@@BO‡Ý»ÀÄÓî‚~    à˜x:Ä�耀€Ø�&žv·ô‡ÀÄÓ!†D7@@@@Àî0ñ´»… €€€8„&ž1$º   v'€‰§Ý-ý@@@@À!0ñtˆ!Ñ °;L<ín!è   !€‰§C ‰n€€€€€Ý `âiw A?pL<bHt@@@ìNO»[ú�€€€€C`âéC¢    `w˜xÚÝBÐ@@@BO‡Ý»ÀÄÓî‚~    à˜x:Ä�耀€Ø�&žv·ô‡ÀÄÓ!†D7@@@@Àî0ñ´»… €€€8„&ž1$º   v'€‰§Ý-ý@@@@À!0ñtˆ!Ñ °;L<ín!è   !€‰§C ‰n€€€€€Ý `âiw A?pL<bHt@@@ìNO»[ú�€€€€C`âéC¢    `w˜xÚÝBÐ@@@BO‡Ý»ÀÄÓî‚~    à˜x:Ä�耀€Ø�&žv·ô‡ÀÄÓ!†D7@@@@Àî0ñ´»… €€€8„&ž1$º   v'€‰§Ý-ý@@@@À!0ñtˆ!Ñ °;L<ín!è   !€‰§C ‰n€€€€€Ý `âiw A?pL<bHt@@@ìNO»[ú�€€€€C`âéC¢    `w˜xÚÝBÐ@@@BO‡Ý»ÀÄÓî‚~    à˜x:Ä�耀€Ø�&žv·ô‡ÀÄÓ!†D7@@@@Àî0ñ´»… €€€8„&ž1$º   v'/222ÊîJÑïNÔ]ŠŠHbDeA@@@À–"¢¦vÒ\ O&À˜`LÀžžöLÔ‘K ­o0:�ÿg[q¡:Y`L€ 0&` lx£t+Å®CùaÕfq†àðŸšA@`ÝêËŠ™`L€ 0ý°á©{Ãhò}K˜·²‚æåé9¢¬ÚTRs=¬€ 0&À˜0&6<�Ù.ÂK5vJC¨Òz0„†º*’Ã3&À˜`æ À†§9ÚQÕZ<{‘Úèf‘éž8Õ<õª^„ªå®�W’àu=~š ¶(›v†}ÇòƘ‡2&À˜` ›€‹��O¸™z4‚0/3U‰ë˜`L€ $P. ÉÞ­1Míy�§iš’+˜`L€ 0c`ÃÓØíÃ¥cL€ 0&À˜€i°áiš¦äŠ0&À˜`LÀØØð4vûpé˜`L€ 0&`lxš¦)¹"L€ 0&À˜066<�Ý>\:&À˜`L€ ˜†ž¦iJ®`L€ 0&ÀŒM€ Oc·—Ž 0&À˜`¦!À†§iš’+˜`L€ 0c`ÃÓØíÃ¥cL€ 0&À˜€ip¬vƒ7e–ŒÏ¡óGG .ÆJÏ™å™ÃÒ††¹ÀÑ39`ýŽ¢°bC) V§i«U¸_ôÜùsùƒ›«ãèªtæÅ+Oؾ¿Œüµ1¼ïî°¬|B?Y3ajqêV»92?wX��ÐDÿõ§"–þ¢Nʘáe„þ<Ùž:ÔOýùøÙì°qWXº¾4ö§ÄóÊ9Q©ô Þg ÌCý9Ìá¥ÔŸ_$�‡òÃ×?7†7o“8ÌË'Ô%�7ç#èÔâÔ®| 2gxåPxPˆ+<ž Öþ[ Öl-aaêÌ£äÌú:}„÷H•K�5ã ‡úƒñ9|*'¬ÿ×Vm*!¡®óÊ9Ác¾Zœ× p¬v¶ZÑà÷ïAÆôŠJ·uoAø|\KüÑô�%§s˃0jÀ&Hä"ë2»ÌwýRAãn½ð<©Ý9> Ž€OÁûØŸƒw:eýióžB0ûÓÛwò* äö‡9ãÅú#.…Æ®Ãù`Àè�! PžضÉQønÈzìÏŽœ¤è÷{’ûsoxú<¹”ìœG�J¥¯Ãôo—Cªoe\eŸu>t�ü¥1È}P*ísfŽ[ éRÚ •qdív:¾9É{PÒ{Ìÿôã0²ßfóe´µÈ¬f‹ÕΆ§ÈÞ‡®r%nÁ‰ó!q,31qˆˆñôÅëÞвO�8 †!=¶CßN{b”¡ä`à[w¨Ør0¼öR"†¯•I |‰›ð×Ī÷§ W3BËϺû8fµ‹º˦Î÷™%�=ûõ;é E¯žq }:î�a8[¯vzäUZ}Ï^°ª”mýêçá·±Ë@á3®]1žÌ�w†Ð8f!«•¿ ó~\®‰”=”D/ÀÉ Y¡mÿ®q¾yâ1?:9þ6Ð Ÿ2ùØ}8¿ÍQþ¨6�åÓæ@¥Ò7Õk'¯¡ïyxàŸ.\Íå½uª\ŽrL‹/up ÞK\‡yêB6ñáp~Ë8HædsL›�¥ŠÜƒÌÞ/`û¾BÚ(0±Ô‹'C�\�5¯a«§àÌ¥Ìpë^º(ºÖÍ™Ô~Z§fµÏÍÐ_¹éE•þcþXóC£”I‹/ð-^ŠdoaÏ‘|ZˆO02] ÜC.™¦¾ê¬Æ6 ñiÛäÐÍ)*�¼’'�œ šóã"pO¬ýd­ß§­Cº´ÊÖZeñ{í›…²ÅîØŸÐèȸ!ë ©×ûéÍêžÖ|¦5B~Ù3¤I¹.ï·±KÁ3‰öQÖ2´nx²dt¼éÏš�ÿGðéNÈ•U³_F¬š·¦®­h>ÓjÕEÿüb ¸»G¾MÒ{ÌŸû�ù‘rÎfœ=‹k>E'Û:Û~Uë¸@®õtós‹ª*ëqlxêÜHSæ×Zr­´Íf3ÄĹ5…ê|›æ-¯$TgBR&º?�G×J¶»vEë¿u?MO ?̬#´¹ß¡k¥Éˆ½‡…VPeSæûj Õ±È݇ó⣬&/«ÿB8x"Òð}�Ø�ùóÄöWó#ºø�ïj×¹+<}ž žêù ¢[¬Ÿm�,Þ/%䎚%4Ì–cœö~«eéEÔ\±«U錰 rÄcÙQX¸ ¬ÙZ #YÕÇ nIcWäà,�ù£á=š=~cþzŒ"6vjýÆüû8æã1ßAó*:̆§"|Ú_ì¬!3ã"“;Û¨Sõ"þpûƒwúÈ€NØi6ÓÿI ðÿ#§sà&�üÝ3.Qñ8޾?/B‡fG .É“½·¸­ u�×o<,;‰ilö’JðèIü ƒxŠ/Q@ 7º´¢u˜rÅÜŸãlÍNêO�Ihq|iάO1ºÑE(”×¼Ó}èÏA¸QÇ [Š®uôLNøõÇ´4ıTégjU¾�Z†Ü¸4†ÖôÄWód¼â®ßç/=áÀ±Ü0kiexèŸZºPΩ*�BùBíÊ—!/öÕ ØGÒã˜÷Çê#ñäÀñ\-�w-R~¼7jãLlþœ�,cnú4¯QWbKÿ¤%C´œdê­Ñ=B÷(EçÒoÌ¿›ºWcó÷à˜ÿ;�ùZt=;™lxÚ!1Ö³žÆ¢Ì¥aL€ 0&ÀD0›áé&ëpVá– *½ÚíƒByüã¬DHh"Ø<7LFw)'Ïe�3BË@kÛ5=]>>()dà{œÜq0?LœW®ÞÌ�Ðp™²¾4ËûY§=P7òŵ��^ß=�¦¢ûŸ„âû6±[túè|Òò0{m.½õÙ¶¿ LB·p7î:ÿF/ZóÚªÁI莑~òåŒÛézîÖß{$�eŒ8ÿŸ?[g¿qhÉEïöûÀ§Àƒ8«Bo)èí ¹è:|*Wœù9ƒ1ðOc´ƒ¡JÑ_©‹k�⻾ÓZreB›¶»ìÄ¿]qVnŽþÓºÙn¸iáúm^7눑�7Æ0¢†ÿ I<”Å�§`ýG·–´QЈ•É]+ í¹útØç(‹äã×n§ƒî_v€Û÷ÓJ¾Æ»cáá}¶¢ZQÿôðQ è1¢=8›úQýS@›¬<‡Æ¿òxå‹WžÐgd\é7U‘@ƒ\l¶O6< Ò±ŒPŒöM�ÂwCÖ©^Ú Ýê³îpáj&ÕeYàÿºo‡~�÷¨^ħ觳YÏÞpýer2.�úÕÏÃoc—)~àˆ^Cz³ÐipgSü¸Žì¿ ºâµ­nÚ³®9O¡¶hUåõÄ·Idpª�è!¥E¯žp㎱R›×= ¿^¥võ�¼_´ØN˜ä͛٠Oöã©z—wF�á°nÎLUÝ8ÙR �ÄšƒäIßÁž#q»u²½Ö?“[ª½Ë&B­JW4)¾Æ#§k }wò|6Mt°Peü²úvÜ«ºÑI¥J”(_Çž‚œYžânÿÂÊ ªÓÕ3üÀª_ rimœ¸'ó ²xåxü4œ½œE§Z:VëŠËn¶-œ MkiãGÔÃ=>Á% .8ƒzè¤1_A/Ÿ6Ç1õ\­ÙÒvs ·¸‘óN÷ 7)´=å”ŸÍæÇ“ O§ì†êzÃÜP$¿ŸºBc�VªÈ=ÓŸôÚðÐê_p§öë¨{¨z¹kl|ª‹TidtV+{]Y± )ˆë®�Ñø¤µÎGþù R§x[õT9GF4>w.™,i�·RJÜBá†[ÿ¸lê\(WüŽÒêÅy½O�‡8;¿ñi6Ã3Qœ-ÇLMàÓV¡p>í�N+Än­Bt eÖôeŸm�#‚ˆJä÷0UÊ7¢Ô±ž84®uVˆÑi-FsŒNU©´öF®UŸÿ¿¸ R$}¯†(I2Fázõ¤^âôÅU¨¾�wÇËWh\r�„ë˳dŒ{£–£ëÕ>þqÃhtÞV[¬Cy�¥dQí�\‡àvØð´C’°ø–×>¦wt¢¾´y]�ß}Ë‹­›+¾v­ZöšUe�1ÝþT=îáª.ù�hFîn¡P©”6¯ô%WÚ&£íå[Aü8oSå(õÿ}1€'ã`ÃÓ8m¡KIR¥ÔþuWôŠ¥L.^gô2hõ=•€×‡ÑËž:ÏxFg¢×÷Ô:ÜO©�lÆ;¥÷ˆ÷¥£>¨G{©þz”%u*óþæ8êgF>Ά§‘[G@ÙÎ\¿ðÞˆ‹ýÕB}F‡� z´¡Z¼Ì&G�¶8}Qü=¬¤ÝÎê0æèÑ.Ž�¹”ÙÑ)ÍŽŸÕA§£ÊèÑÎv�8bg–ãlxš¥%ãY�ŸfÕ†`tÏ"*�<Ÿ6í*"J�p=ßa¬f‘iã®ÂpêïlÉ<6]Óþ¬/’Ä–EÕsw¦†…kÊ«*SkaßM{�¬ÜT.ßðÖºZ’å?£n÷—öËc(o"çÕ€7zTTºr3=¬ÚTR”:Ö#�€8‹CBa8‹xg¸eŸBBÚ]ÚáóOÅWR Æ[÷ÒBÏ¯Ú Ñx£õÕZˆ.V"�@h¨+4íÑ[ÈÃÜë7îðQïÒ f \¯e„�c[ )Ñiœ]úC !º¤*y‚±æÛüTjvEùî>L݆uP$C틃‚£â^@Q‡´Nôتow­Õ°|™Øð” ÌŒÙéÕW…�†9]Ö*íÃPšZ�·ïܵRa¹Ûö‚:�ûZ¥Õ[ŠCýOúAx8ßÂZ1ޝÜ;Ò@é&_`Gí¢çœ½œÊ4ûž>OßbêzÝÚmÅ Q·>@Á%´J‹Ö–�æhà€&ÞT••š"ëTmó9<é©LP,WoÝWª¡ŽàãEƾv+”m6 îiãØÙ쯵c ~> Ž\ œ„xªf¥Ë0eÔ Hê¤JõoÞK]†vrºvªT…�ë�…Ä®aªˆ¤ øä™sª@p"!e‹ß‚Yã–€Z›Žü'‡®_v„‹&ŠÖ±ùa�.�ÈCƒ‰ ŽîÃÛÃËW^jˆÓ\F£šçà—«ÁÃ]YHUkAéM&Üpº$ŒIDAT�¹¥´2ôr6#|¥HöN•rÞóK ]†u2n̹͒ˆ O³ôL•ë‘<Ù[ø #¯tiuHö€ø_©OšW–m(aa<#GM“.m|Þu'FÓ8.û–b´O˜]6ì(ªr+³8Q<“A÷¶ gÛ}@Quä$Š?=í¯jðçªò†œ½’S—ØòfÌðþ×í_ø¨þiÙ1˯ãìòO³êÀV'�äD\R§ „þŸì†Í�¹€’“îû§„‰8æ®Âõ¬Fœá•RòµÚ Cˆvks(:›œDa„§.ð…EkÊB.w1[bÃÓà-èÑÂ\œãI×à(튗'Çct6O‘  Cšütµ¼ž÷ÃxÈ—gáì�Åz€XæÏõÈY#}š×ðæ­;øãú/¿G)àèÙð*€_Å ÐÉOfËô Šºéñ¡„î©0\óöÛßï§S²:ÍŒ•vÍ>@^wˆOºÔ¯!—¯Xî‘Ç)áèé¹KÜF.íêéX2Û(€ª¼Ó¾‚ i_û÷n–>Bcî±3ÙñU}RÇ›àLάO¡h�X÷÷HhH"KûÓ²°.ørH‰ Oƒ·2žÚ7…¼K�ƒ žOŸ{ñ:C…È݇Xx¾y›Hè¡IûE÷¶ENìöAÿû 7lOú!ÓGP0éߟ"ú3zwxú,©ðþLq»é~ %ýÈŸßØöΟÝ݃�ÎßzÀ Ë=bŸÇÌGô¾GõfK÷h:¼GBtºGõ®¿Ù Oã­:Ö»…Y�¬™žÃÐÛ¡Ií³’Mr“1gi%˜½´ ÎNxDÈâ` úEï­PCFzÍ:}á‡×¬d˜)I¹³=�a½¶A½j%‹ ô€™‹«ÀÜå•à½Â� Ù3?ƒ!=·Cc\Ó&Õ´¥þ4{Ieø}ieœVÖŸ2{¿Àå;d½Ê¥¦?VV€ØJg×hf“ô·ntBòr‹ |¸ûku9|Õ^=A\ô`8†�­RZz¤!3½fÍõß=Z_æ=:k Þ£Ë*⌨v% 2fÂåƒe.· fºG[Xx#‘ø/å5ža;ƒ*/Ï÷0qä*¨[å’ââÒVZw4u¾¯bYÎ* -¾œ9n)”ñ¹£¸ äoõ›_ÃÒue$ËJ�Q¢¦�Y&ë‡Ü‘prB~JÿXYÑQ»ã´nkò7+ V%å¡D©?ýü{-ø �0©)‰GLþ7»ç¥^k¾é¸Ö’Ê uV˜f³¿²Z58«\©'ç­¨ßM¯gªYÑ é^Áìï—@ñ‚÷¥bp˜ï}°+ ÿ©ü½…Ö::G¢õôÓÇ,‡ªe®+.0Ý£?̨‹FheŲD ðð† _þ Mj�SEå 4@'à=j&�f›ñdÃS•®n!¿^ ÍëžÑ¤2_â�Á²õ¥5‘mD¡ôúôÏ_þÄÑ7U/^X¸ tû¢ì:”ß¡l—0˜ýè�^ ÔNd’ÿÐ�;cßì4eôrh‚³›Z¤!è›1.§Ð? [mŸÐB=ŒžÜ¬ª«ì‘ý7A×�Æš'¾'é‡UŽ_=Z^G¯�—LùJ½«ºz%Ûipg ·EÆMá0 n5òcªcÿÑÃú>1�2Ì1òøÑ¾É1MÊ3f*>$¯¨¤‰lÑBÙðM\¦>^ã)f§Y©ÝK'BÚTÚÆüÞu8ŸÅ͇ü:×ôºhçâɲ½È­å’u¥aÄ„fv—¥IhiO¹»§íÅq`Ý¿EaÀ·öì“'}gѯ– !GÅø÷@~t-ÕÑî4Í ìZ< 2¦°;§æ�C§rB»]íDÒz´í‹¦@ŽÌÏíΩy€B/’#n©³¯jêV*+G–§°máTÕÜŒ9*Í��ÚÀÑiÝŽÓöÝK'Aò¤ï5-ÃúE ÿè6šêˆ�pZ³Kcdæ ¯âs¹äkŽà´6ý»IÎoÔŒf3<]½½½Gv|Êì–Â]´sJŸ2ûšpØ»l".ÜÔ¼˜9³>ƒ\YŸÀæ=æ ™Ins®úEs£“˧ÀCH‚FÖ~ ‰gMdôXý3þ ÉsÙc½^Îÿ¹AÚÔ�°ó`äÌ+Í´î]þ+×ö!†Ê™;ÛS u£[÷ŽRìÑèËšñe”cZ|ÉšñÎûÐnViÝÜ�/Ç-TF‘I;½Ë»ãT¯•©´ücÿŠ_57:IWÉ"÷ð•+ÀáS¹è«!½ ¡1"E2m�Nªlþ\�-^v(`ˆº[ ±í¯©�=Ó ëWÍþgÁq€vůÛ^L3"»@¸‡(_þ&¢¬Rt$’’‰ó˜—À ô-I?`¢R³:g¡| õ_?‹*\z¾ý|ƒ£ÓZŽÞí÷YŒ/ë÷}·@ �gQ¬ºè§æG n±¦ÿuß!ä!ƪï£z§Ñøºmý ½;ìÕ|¦1B~¨[õøVˆ\¿Ú©Åa4Fým³hú™6á�rgJãþ·ÜT ¨ ¥Þä?—Ö‘% ï³U5géRêÔ¡é1‹ñ%%¯ˆ<=ÑWg.œ„•h¹Fádlx§-t)Iù·„ë-W"ÒP®\c…emŒ �UEˆ/‡Ñq¬Éö³õ˜ÖÿËÛèOˆõ/gÓæzð׃¹’>eËK‰9×ê¡ÓQùÊ?þ•-vËQq„/«Cýõ¸/…ƒu"…lx:QciQÔD.´UDlrM¤NøH±¥–¦MäL޵D®®‘mè*p&ɪ?‘M¨C½ëo[kù´þïêÙŸmÛBk½Vùz0·êŽÏ]ú¨Í=Ÿ2«y�㟑úˆeQ+«šý !ËbÃ3!·>Ö�¢?ˆNzèUÇãgõåyâ|vQU�ÐcÛžÇÏéPæ'uè϶u¶eHãzèTR%=Ê{B‡~鈑õ?Ž‘åŒ’lïQeÒƒ¹¨º9£6<�±ÕT,3ù$$'å¢ÒÖ}aîn7k5¹�/=QéÏ¿ËÁÕ›"Ô��RßV/â€ÆVblèS6ÆÅË~…NçE¥Í{ Áþã‘›«&ÿá‹!“‰R{qc—m|ð9èèþÖý4Âô“Aµz³óø¬$0#Ñmä½ö¨(½‡©µW$Qøéõá­Â` UY²ý½µ˜%¤±œk´Ì;mAuð{œ\KQd8‘ 6í2ï†Ö(•u’/lx:ICiUÌÐPW¨Ó¹?†¢Ó>âÅ©‹Y ×ˆöZUÅr_¾ò‚]ú 1>Éè5±q”zSäjOŠx£u"£kèEQ‚ý©vÇB~XÉèêóu»(úɵPÝOúÁ«×ÚÇð¾xÝ>ù_§húuíO,¡GíN©z€ Ü6ý»ª*S„0Š¯Ý´Go!Æ']?ά+¢Z’uP°:�ú9»×:‘Ñ5x\+­ÕÈ”ïõ>í/´¿G/ãCyÇÏ?‘Y>ή56<µ&ìòŸTó¾_j¼G¾‚“²ª^o«Àï« u±~5ÔÿWžP²ñ—°Ãƛڜ»¼"ÔLJИîQµu±˜8‹cýl™>Ü£äsS�´pMYKd-©÷¨:•ÈH—†Â /Q-‚Õ†�E`È÷-œ>n½-S³9�gÃÓ¶uùsäoóKô9W¢Ðý(ÇcûBÿzŒh3avm¸ûPÜZ·ØÊd”suª\„a½¶A^ÎÅ)ô…�„?¦Op&QIªVþ*|Ù{+Ê#ÝÏ$…ç\…k�[ü¥T¢*”¼äðXÁ’åPZ»Íc/ך%R’J½cÑ_ÆçŽ,1›v¶ôç›wÓɺ.zfŒENõ¯XòfôS±~§M?Ϊe-o¬8ñɾçahÏm²ü<ã=²�­© |áÙ‹¤N\{€ªe¯YîQ9jt�®Æü_çÖ‚‡ ïQ½á•¤{Ǩ²AN¢eGp}ù …÷¨�"ó²á)’v×úã"q4ˆ‚‚Ë�ÂY­R¦xÒ¾† ià ®ý¢õo�ž$“<£g•ßÿÉ“½µ´elÓw¨ßÿIr Wå¢f¨©?eÀ¾DúƒpÍ›?Õ7‰êOÉH?θ�ƒñаDØŸSXú3­Ã‘¼<ßGðÇõ©–û Û€Öêrú@€f�éþH�íøÎï�ä–?g]f ·]õ¾Gå–WíüÒÙǽîQµëyf3<¥½¯Š)¾ÆtèG2'†)´ ÿ ^"ÒË3®ÞJaøÃÍI:úAÉ•õ©Åð¢Õ·ø£ê…!0=0Žñ�;4»¦ýîø€×ž@×ni·56"�I€þ®ßN[6ÍνFÝô§×L ­½y—þ”ͦjHgÁô`–ïsÒ£ñˆ¼’☓Ä=یևj�艀Œ(4¬õጓz~s¯ÝJ'yÉ�žuP¢;‰Gä²üæ¼²< Ñ úÍIê„oÒ;íg%LÌp-žfhE ê��¼Üð$|Þu‡å†—£âÌ¥ÌðÃŒºpèdn9—™:¯{âø¤å!èÛi¤LþNV]÷Ï ãqg.mÈàÄÌJ€ŒŒ®­…�M.3ìëîÃy-Ë.^Ëè´xÜ0†{ûfGaÀ§» mª7²êA¾1iÌ=~6‡¬ëŒ”ÙÅ% ZÔ;ƒ»ý+{½/y˜ 1ÒÌ®úŒÔVJËÂk<•4ÙõEò?°l.Ê”A�ØÆ´³¹÷Èvð⥗ÉHI«N¥Ò×á·1Ëd›Ž¤ÓZ¦ÏǶäW±Žñq§#P£âe˜2j$ÃY,5ÒÚí>0t|saË5”–™ÖÏún ¤K¨T”åúÝGòBÿQ­-oT¨±�|¹ÁÜñ ![¦ªh"·}=ÐmŸÒ5ñªF%!f{ÕΆ§JÃÙÅÐ:šÕ3fƒZ;+£ó GãÑ}>FÏc¦ï´víì™�1}€&Õšög5øeNmMd³P& ‚@–Œ/à¼GäÎîI-Û ŽñÛ_Õ¥fž�–ü3{–j/¢W€Ò9úaÝ¿“ ©õsg@"òÛ ]ºp5#4êÖËø"·}»OÆõì!ÚU%?x”j´è4³ßŽ`˜Íðtõööí¨²Îx<Ø-?„»ˆÙ‘êŒ|¢—Ù7²ìY6ë‡F?¥ú÷Ô)ÞBiŸ»°z‹s…ø“Â;ý+ز`º�a>KÆ—�5ãsض¯�œ"r^& +�YžâLßl!eÈ™å¤ÅWØ;5tT.·"´©pç’Éà–H[£“Ê•=f&#w‡�Übj–ßײîY:Iµ¥±”Ö W-{]Ò•‰-›áϹ@¸‡\2|9¥�·!K%eÒ|_ôÞ†»ƒ…Õ®ré@þ,ÍšF Ø(Äè´òkÕàк\NLÀY|;hƒÐ¢vj~rgWÇ9»ÿºßfÍß.Ù–³nÕKº¶Çôü<7O¥ÂIQ‰üP7«{Z”:Ö#�ž ™9K tj-:—á�^tÙ”ê+QèžR²¯/®ƒNÙ…ä ˜Àô¸ÿK?Î9jp]ê_Dü¸ä¨þ%t(Kq~çÕŸ�°á™À{9-�Þ¼¯STß /NщürbÎB@�ûÿÍ[ãŒ9oÞŠ¿_ß¼¯ÓQÔ£,oMü›ãˆ³‘�³áiäÖP6ò):ÐA§¨:êÂó„ø6Å“õ˜�€èû?4Ì�Êe�¢ëOß<�qêB|[è1.¸ †§Ed‘f.¬´Û\TZ¼® œº�M”:ázÆM­�þó<„éýu^MK˜Ga YPH`ä¯�Ñ­¸Ø%äXÝH~„F7OVTú}i%Ý"ƒÅTÇ?WW€ó¸Û^T"¿® dx‹ª·‘õ°áiäÖT¶z�ûÁ�‡©5×¶zKqøjBSÍõè© 8Ä ª´ /’h^ŒéUƒ©ó}5×à ˜€š(=Ý#�^9ÿ<§Ì]VYÍ⫠˪·$Äø$_žßÿV_…2«+¢I÷ÞpC^j�¶`À��c>ÖZ Ë—I€Ý)ÉfÆìc}þÊŠ@aË»£zéUW—a�à÷%UT—mD�ïƒÃÌÅU!{ægP(¯¿êE¤Ù¢æ½{Â?ÛŠ«.›2h]òo «bÀŠG�/§ú;Î_ãšÆÆÝûÀæÝEDTG¶Ž�PW˜ƒqê”o€v]«�‚1¦y»�]`Ñšrj‹VIž ,\S‚‚]�<�¨�ÈQUŸ¯ÛÂä?jª-Zyfs§Ä‘‹téFÆUJ1Ú‡÷Ù ÝÛP\H2�†Žoëÿ5Ž9Å•’)€ü¤þ8ìh^÷ŒÌ+í³Ó,jßoÚj½–})ù�G€b´ÿòÕjhè{AÞ…1ä~ú úŒl GOçŒá¬1QŒöу6BŒÓ®4‘ÁýùØV°}A¥¢^ŸwÝ�1êw+ÖâŠoÕšÀÊM¥Ë2’³9�gÃÓH½Ë`eñò|=Ú­B tÄ+%Ñ+ûIójÀš­Å <œWrØ2K�2ú}²Ú59ž.NJºxÝ~Á5aÿp¦)5ã:,ÙÁúõ;éà×¹5aã΢NV[ûâRÍ®„möãl°4_Ÿ÷üRÂÔ¾hl–z{gÆÄ†§Á[•Cf¼�¸xL€ 0&À˜€df3<Åm-”Œ˜3ÆD€f)ôWÁ<~à�.2¤ À�¡‰ÁÿirË®fŠÛ}êBV¼T›˜¼ô$Z­ì5(œÏðXÊŒësüŸ þ')àè™ìpâ\6Íf9é•5­*Zà!x£þ é^aÌ÷DÝTÒ}ôLÓ>ñÆÔ'”£þT­Ü5(�Û?ÆþtøTN8}1‹fý‰^¯V-wÝÎ/Ãý9(ˆúS Üt‘S>ŸUÓþT¥ ö'Œú”à FïOÇÏe‡cاµšAIìKß„bèØúC€p\ m¹Ÿmús(®L¨‰BKúV¸ y1ê�wúH�³¡´!éòyð(%îTÎ —®‹Û-ºâºGµóE×7º¾¸Æ|­ïÑèåáïê`ÃS=–ªJÊ›ó|Õw ø–¿*[î[4Hç-¯Óþ¬†ÆiüS<åŸm ·&7½GƒôÏUåa ¾þx¿ÝÝY2¾€/zo…Æ5ÏÉ6¥iaýâÊZ^?½ ð”[|SæÏ‡›8¾ê»ª£±)7Qšƒ.Yh3H|ûS®lO`8ö§:•/ËUïƒÜ`>ö'z�ø&~®ª²`L{Z»Ü¨ÆyÙúiÝØ¢5ea".! x¿þ”1ÃKÖs›e­¯ÜGÃìÏË6”²,¹xþ2©ìò;Ë�‹ÂI–ñ‘¿ÁñÕë$0cQUK?¥�;ΘôóõfFcþ—½·@£šçã5æ¸Gk�ùz·dÜúy�gÜŒ„æè�ë{†õÚ&ûÆsTÈÇϒ§C;Ã…«™e‰r¼S‹Ã–…î‰\h_ òôâ•'tý²œÄ$)©eƒ“07㸹†IÉgò©Ùë«vp0�:YïÓq í¹]½þ„þ?Áþtñ𴙦O[„‘ý7ƒZýéùKìO_t”ì ¶u£ãðÝ�uªõ§WØŸzo‡%:$oRû ü<âopw �³¯JÉ@Q>ÙvÎ/%»SäÙ“e]ŸZ…¥uæ}wŠóO¬¤ìz�ùJʮƵ­œ€†­Uí5ã˜o¶Wílxªqç¨ £h�°rúÉ êåª<…¯M[÷íäg2¦DOÛkf͆¤žA1�V|ìÒ� ТWO‡3fÙ2=ƒusfBÊäïëŠI9ÉoÖ£7:w�ß lL2�|¬XÁ{°|ú\ðH¬ŽÁ½®'ñ5xë~ÝÀÑìRþ\þð7ö'¯$Ò6QE—×÷ è€ú£ÏzÀ{!_iÆ~íï³ E2múÓõ»i-ýÉÑ l&œá\7g¤Mõ&®ªÄëü=¿Tè.¨7¼|å¯ë�pQµrWá� U{(‰^§óC7|H1jÒ{Ì×› ¹›[û»¶c~SóãûÖMo>¶úÙð´¥aÀÏθ¹¨a�s0ýÛåšÓ|öÒËâ¸8ú�X _ç/˜ð—æúÉÕGõ¶ŸÃ³Q_–)vVL›«¹~zeëÛ~ øáú03§ÆµÎÂÔQ+4¯"¹®¡öŒn|Õ¬tæŽ_¤¹~š}$ýÑ£Ò”+q –M™§¹~ræÛ~�]ä(2(èUî+u¹¦%%µ; €;œcf϶~]p&ü››liòùÖý4P§c‡Hš(• Tï1_B5ÍÂc¾<¼f3<Íé{@^›êš›fúD�TÉ4è¬8º�IîKþøi¡ɼ‚`ñä?¢èJ†îCMšå˜V_<ÜCÐÀ�£•xCÈ¥™>F'U–fóþø)ê m<›#Àè$ýäâkÑĨý‰6¤,œ8ŸNkž’x„ÀòhL´ �ŽimtRåãrzK Î²Í�ý§ ´Ïm!F'©Ë™åL­ýC˜vz�ùrʪE^ñc¾ö“Zp2³L6'º?Q¤«êå¯D0ÒC½õ¤BcùP#CÑì‘5 êºÓb�Y¿ký?{¦çð1úœ´¦~�vKöÑj½FÉÿô¸#¿K«CJD¿v(ö‘©Aõ P½%‰¾G£�ùzsÔe§à1ÿ´5ñ˜¯w{ÆG?žñ¡¦â5>ňÅlt’;ÑÉÇæGÀ§€xýEmê/ºîZëÓ¥?ŠìÃ>øšYt²ÕYLý¶÷�üéÕ¾3%=éÑ/µ‰.õ7ИG.ÌD'=˜‹®£3écÃSçÖò{œBx Èï¥5é¢ý4Zùm�È Y“ÿcñuó{Ù†z°�ÚŸÅן|oZ“mY¬Ç´þ¯‡N%uÒ£¼~ºçus TòÓ+:é1.Š®£3écÃSçÖÚºWl(İpض/Rç–=……°Õ¹u_!ô‹×)ª’[öŠ­[(:=ß¾¿@DõlÛ6â Æ¶ÚÔYŸþyé]�Q«"^4#r:¿ÿXUÊ®†½Ç|5ê DÆ–½‘÷‹9r®µ#ä\Çyµ!À†§6\%KýcE%8�®aD¥fÔ…§Ï“E¨[±±ú$Ìñ]ë“þð…{ègÏš6ì( äöDT𳬒©£�Ì]V(¾»¨ôÝôz`ëÔ|ɺ2p£H‰J¿`Œêþ©"Ô­Û^ }\æ�ø®õ‡YK*ÃÕ›"Ôì8P6î÷úÛŸº ŽwDE|øiVmŒN9)%éÒášBPpÌnä$ P9“Þc¾ÊÕ‘-ŽÆü�‡òɾ.¾üŽÁ/Ìá*¾\ô¼ÎÕÛÛ{´žP[w°[~wI¬¶XMå-^[#Ê\…L^iªgÔ¤†@ƒ^ô´rS)(�ÑBrd~ý”ªßš]£)ùÚÉ\‹ÆB! š7Ç»sj È;ãgÖSS¤!e-ú§†¼1Ì –iä¯�àÏÕíT,ßPÊ£K£l™^Ø�SóÀø™u`ÆÂêv"×l+nÙL’'ûS»sj˜º :L˜]ÇNäÆ�Eq7õS oëowNÍóVT„Ñ“©)R�,˜¿²4«{Riä·×Z‘Þ_·j£%½Ç|½yüƒ÷¨¨1ÿGŒù.î!—ôn6Õô³yÕP*ÔÃCN½\¹ hà¼f={Óg±Ï2Ðn÷9㫾ËýÉ󤨿W”™©hE´|-_â&ºÂY Z «Ž—I y¯^pë^Zë¡ñŸ¼Lùf¥êu½ïŸÒÒž¶3ç1)©]ùÌú~‰êýé1Ζ5ÅöŒËk¥Ò×aÁϩޟ(õç¸üg–,z– û0µ�ø“?Ü�úôŒ2Óg8¦•?ÏË8 ݲO;³Fc¢÷˜¯7� %oÀ_¿þ©ú=j¶1ßl~<ÙðÔû΋A�*aâÈUŠ£�¹”z~ÕÞÎÁu *£ªZöLC‡öJ£¾ÐàßÃeÚ¾Z�¢ÈÁ—²ÅoÁŒ±KG}¹�Ñez þwÓ9Д0×­v&~½Jq¡Ó—²@Ïíà‘Ì a `*>P‘ßM%‰–ôÞîcÔ9‰h¨?¥NùVÎevy)ZQwŒ„#÷¦D‘»0{Ü ×GJÒ݇©,÷Ó•›â–R()¯œkÉ%Õ8 mªÔµÚ¾ã¹¡ï7mœ.^·Þc¾œ¶Ò"/} {”|M+IfóÙðTÒ+\댑‹bÃBFX÷Ö j¹ëqú¤™Mz­4kI•8g7cÓi{®x¡{гÝ>ôÕx-NC˜v«nÆÍJ3W‰s6ÊVGlŸ å{½Q�ŠW y† Å¥§Í%3ð•ú}¿Èu¤±ÉOhçh€ï†ý©>\�ôØÍlnÜYÄÒŸâšÝŒMŽí92Âz¶Ý�ýéjœ†°îÐß´»ˆ¥?É5vmuÚ~&޽°?ùV¸*©?ÑF˜™‹©?É3vmuÚ~¦P¢›»V¥+q>ØQd(Ú8sQU¸}?áÌÖÓ›—OZ†Š¥nÆiˆR(ÜuÛ}`ÎòJðÚÓµÓ~Ö{Ì×\aóÛï•|�nÅÍJ3U1õ˜Ï†§Þ½2ýf3<ã¨.ŸfL€ 0&ÀLLÀl†'ïj7qgåª1&À˜`LÀHØð4RkpY˜`L€ 0&`blxš¸q¹jL€ 0&À˜06<�Ô\&À˜`L€ ˜˜ž&n\®`L€ 0&ÀŒD€ O#µ—… 0&À˜`&&À†§‰—«Æ˜`L€ 0#`ÃÓH­ÁeaL€ 0&À˜€‰ °áiâÆåª1&À˜`LÀHØð4RkpY˜`L€ 0&`blxš¸q¹jL€ 0&À˜06<�Ô\&À˜`L€ ˜˜ž&n\®`L€ 0&ÀŒD€ O#µ—… 0&À˜`&&À†§‰—«Æ˜`L€ 0#`ÃÓH­ÁeaL€ 0&À˜€‰ °áiâÆåª1&À˜`LÀHÜŒT5ÊârŘ®Zj aL€ 0&À˜€ÓsºÇV`ÓYhn¡÷b«/ŸcL€ 0&À˜Љ¿j× <«eL€ 0&À˜@B#À†gBkq®/`L€ 0&Àt"À†§NàY-`L€ 0&À6<Z‹s}™`L€ 0& 6. ============================================================================== */ #ifndef tDesign #define tDesign #define tDesignN 240 #define tDesignN4 60 const float tDesignX[240] = { 8.9265353576272299e-01, 4.1253405342503202e-01, -8.9265353580640705e-01, -1.8161861061384901e-01, -4.1253405347743499e-01, -1.8161861045138400e-01, -4.1253405331708998e-01, 1.8161861040013599e-01, 4.1253405332799598e-01, 1.8161861058078901e-01, 8.9265353586764395e-01, -8.9265353585506402e-01, -2.9209374259343301e-01, -2.9576702802688698e-01, 2.9209374244786401e-01, 9.0950707014761201e-01, 2.9576702814539602e-01, 9.0950707018885402e-01, 2.9576702790731102e-01, -9.0950707010122100e-01, -2.9576702783533299e-01, -9.0950707021859101e-01, -2.9209374254089598e-01, 2.9209374286193801e-01, -5.7522571803819200e-01, 2.4120572786144000e-02, 5.7522571811647805e-01, 8.1763902255600296e-01, -2.4120573041502998e-02, 8.1763902245837905e-01, -2.4120572818239001e-02, -8.1763902254357801e-01, 2.4120572712950001e-02, -8.1763902260049504e-01, -5.7522571792546895e-01, 5.7522571790822996e-01, -1.2883316172480000e-01, 5.2247640694409000e-02, 1.2883316184032501e-01, 9.9028894794971700e-01, -5.2247640388510000e-02, 9.9028894797773004e-01, -5.2247640390409002e-02, -9.9028894796062605e-01, 5.2247640527807997e-02, -9.9028894797086797e-01, -1.2883316179047799e-01, 1.2883316185741600e-01, 7.1800638603474998e-01, 6.5744687628673704e-01, -7.1800638610944201e-01, -2.2853978773721900e-01, -6.5744687624102105e-01, -2.2853978767899699e-01, -6.5744687636118504e-01, 2.2853978770306499e-01, 6.5744687630445398e-01, 2.2853978778496700e-01, 7.1800638588076005e-01, -7.1800638589101795e-01, 8.6317647311780299e-01, 4.6818181643848600e-01, -8.6317647319444601e-01, 1.8902952912552701e-01, -4.6818181639267098e-01, 1.8902952879217400e-01, -4.6818181641121298e-01, -1.8902952889785199e-01, 4.6818181650886698e-01, -1.8902952900182299e-01, 8.6317647313522905e-01, -8.6317647312333401e-01, 7.7263285684713301e-01, -5.1705945056713198e-01, -7.7263285680608096e-01, 3.6835851164800099e-01, 5.1705945049400703e-01, 3.6835851172049600e-01, 5.1705945058344505e-01, -3.6835851156733002e-01, -5.1705945050236901e-01, -3.6835851146980297e-01, 7.7263285693474903e-01, -7.7263285692748496e-01, -8.4781923191464803e-01, -6.6325775913630994e-02, 8.4781923188301800e-01, -5.2612112834876201e-01, 6.6325775846119997e-02, -5.2612112845923997e-01, 6.6325775945784995e-02, 5.2612112844953196e-01, -6.6325775877211002e-02, 5.2612112850466897e-01, -8.4781923182172503e-01, 8.4781923185026398e-01, 9.8057432292300000e-03, 9.4298381580892299e-01, -9.8057433796900004e-03, 3.3269410922655401e-01, -9.4298381577404000e-01, 3.3269410939799599e-01, -9.4298381577611401e-01, -3.3269410931902699e-01, 9.4298381577508195e-01, -3.3269410945576500e-01, 9.8057433011400005e-03, -9.8057432877129997e-03, 7.8559924837115203e-01, -4.0515694493212501e-01, -7.8559924820178995e-01, -4.6763412061124199e-01, 4.0515694513642297e-01, -4.6763412081180400e-01, 4.0515694484198500e-01, 4.6763412078672600e-01, -4.0515694499964300e-01, 4.6763412089371298e-01, 7.8559924831334105e-01, -7.8559924828109995e-01, -7.3733199913149206e-01, 6.2085150094918595e-01, 7.3733199906006097e-01, -2.6624225194863099e-01, -6.2085150107922105e-01, -2.6624225201162399e-01, -6.2085150107212395e-01, 2.6624225211386399e-01, 6.2085150118738697e-01, 2.6624225193224998e-01, -7.3733199894794299e-01, 7.3733199883500700e-01, 7.2687146916565903e-01, -2.7488282182755001e-02, -7.2687146917293100e-01, -6.8622318644971203e-01, 2.7488282351607000e-02, -6.8622318654562198e-01, 2.7488282266836001e-02, 6.8622318666118298e-01, -2.7488282251028999e-02, 6.8622318660911197e-01, 7.2687146907010702e-01, -7.2687146908018296e-01, 6.6536338572051501e-01, 5.8086026757708697e-01, -6.6536338567737996e-01, 4.6892740834078300e-01, -5.8086026752845299e-01, 4.6892740837261399e-01, -5.8086026764087695e-01, -4.6892740846833603e-01, 5.8086026738675200e-01, -4.6892740837569902e-01, 6.6536338565181896e-01, -6.6536338575173404e-01, -5.8012536730530395e-01, -7.7909959805351803e-01, 5.8012536718680796e-01, 2.3760971069593201e-01, 7.7909959806473195e-01, 2.3760971081928500e-01, 7.7909959817022401e-01, -2.3760971081180199e-01, -7.7909959807496099e-01, -2.3760971060925301e-01, -5.8012536709009399e-01, 5.8012536721841101e-01, 9.5866802536020002e-01, 1.0111360588989300e-01, -9.5866802532641004e-01, -2.6595423663417900e-01, -1.0111360600317100e-01, -2.6595423671545498e-01, -1.0111360582543800e-01, 2.6595423628673898e-01, 1.0111360580244400e-01, 2.6595423651585398e-01, 9.5866802544950003e-01, -9.5866802547859997e-01, -7.8443181441708498e-01, 2.8431902482284799e-01, 7.8443181444342203e-01, 5.5120723943467698e-01, -2.8431902464016101e-01, 5.5120723940835703e-01, -2.8431902471494003e-01, -5.5120723941764904e-01, 2.8431902447710600e-01, -5.5120723922716397e-01, -7.8443181465489997e-01, 7.8443181454213895e-01, 1.6666387853511799e-01, 9.7946877889236195e-01, -1.6666387832233501e-01, 1.1341985185260300e-01, -9.7946877890805095e-01, 1.1341985202353200e-01, -9.7946877889141803e-01, -1.1341985194229900e-01, 9.7946877888779205e-01, -1.1341985188733300e-01, 1.6666387851331199e-01, -1.6666387852599199e-01, 9.0354263539086999e-01, 9.9002690511180005e-02, -9.0354263538353297e-01, 4.1690427395825003e-01, -9.9002690414932995e-02, 4.1690427384396400e-01, -9.9002690464191995e-02, -4.1690427420603599e-01, 9.9002690128043996e-02, -4.1690427411374398e-01, 9.0354263527927503e-01, -9.0354263523439904e-01, 2.7876240453609202e-01, 3.4931218558605598e-01, -2.7876240454052498e-01, -8.9457952073414404e-01, -3.4931218546670101e-01, -8.9457952078886405e-01, -3.4931218555104099e-01, 8.9457952078521896e-01, 3.4931218554962301e-01, 8.9457952078180503e-01, 2.7876240443794997e-01, -2.7876240444325900e-01, 5.5589623017941503e-01, -6.7683321168156696e-01, -5.5589623031489199e-01, 4.8257246591028302e-01, 6.7683321145769204e-01, 4.8257246590298097e-01, 6.7683321163559196e-01, -4.8257246615058602e-01, -6.7683321143828601e-01, -4.8257246597237302e-01, 5.5589623019269097e-01, -5.5589623019433798e-01 }; const float tDesignY[240] = { 4.1253405365736101e-01, -1.8161861064178200e-01, -4.1253405362785300e-01, 8.9265353574047501e-01, -1.8161861042265401e-01, -8.9265353576281203e-01, 1.8161861061182699e-01, -8.9265353581230000e-01, 1.8161861042040001e-01, 8.9265353581090401e-01, -4.1253405347255800e-01, 4.1253405353515998e-01, -2.9576702799317001e-01, 9.0950707008926002e-01, 2.9576702803971300e-01, -2.9209374292672102e-01, 9.0950707008444098e-01, 2.9209374268920701e-01, -9.0950707014841903e-01, 2.9209374315927200e-01, -9.0950707004729303e-01, -2.9209374272177602e-01, 2.9576702779314701e-01, -2.9576702774761399e-01, 2.4120572825077999e-02, 8.1763902251123799e-01, -2.4120572979212999e-02, -5.7522571810348000e-01, 8.1763902244075704e-01, 5.7522571822911805e-01, -8.1763902258125998e-01, 5.7522571812388201e-01, -8.1763902252729603e-01, -5.7522571803517397e-01, -2.4120572711051998e-02, 2.4120572594154999e-02, 5.2247640720239998e-02, 9.9028894795889499e-01, -5.2247640320038001e-02, -1.2883316192479599e-01, 9.9028894796758105e-01, 1.2883316187800101e-01, -9.9028894796219002e-01, 1.2883316189664901e-01, -9.9028894795325095e-01, -1.2883316193620500e-01, -5.2247640337643002e-02, 5.2247640551545002e-02, 6.5744687625599296e-01, -2.2853978783192200e-01, -6.5744687617143405e-01, 7.1800638594742205e-01, -2.2853978771380001e-01, -7.1800638603135902e-01, 2.2853978786054899e-01, -7.1800638585738497e-01, 2.2853978787401699e-01, 7.1800638581385301e-01, -6.5744687636348498e-01, 6.5744687637155796e-01, 4.6818181665313802e-01, 1.8902952919749200e-01, -4.6818181657642000e-01, 8.6317647306438905e-01, 1.8902952889744301e-01, -8.6317647314368795e-01, -1.8902952912813800e-01, -8.6317647308972001e-01, -1.8902952893055500e-01, 8.6317647310665901e-01, -4.6818181664864200e-01, 4.6818181669876202e-01, -5.1705945069559001e-01, 3.6835851158551502e-01, 5.1705945064739101e-01, 7.7263285680605398e-01, 3.6835851181658802e-01, -7.7263285680247595e-01, -3.6835851148711701e-01, -7.7263285685946703e-01, -3.6835851166595601e-01, 7.7263285685565097e-01, 5.1705945069191905e-01, -5.1705945063377801e-01, -6.6325775900167000e-02, -5.2612112825768598e-01, 6.6325775819851995e-02, -8.4781923176695695e-01, -5.2612112840709802e-01, 8.4781923170908002e-01, 5.2612112834437996e-01, 8.4781923170069196e-01, 5.2612112830638802e-01, -8.4781923166521300e-01, 6.6325775941005000e-02, -6.6325775996654998e-02, 9.4298381584259305e-01, 3.3269410953974798e-01, -9.4298381578729096e-01, 9.8057432042720008e-03, 3.3269410963564700e-01, -9.8057432989099996e-03, -3.3269410963009799e-01, -9.8057431885070004e-03, -3.3269410963519902e-01, 9.8057433897619992e-03, -9.4298381575252399e-01, 9.4298381579137902e-01, -4.0515694531226898e-01, -4.6763412064985899e-01, 4.0515694543405101e-01, 7.8559924833462302e-01, -4.6763412086820100e-01, -7.8559924814560900e-01, 4.6763412086133199e-01, -7.8559924824985705e-01, 4.6763412087109801e-01, 7.8559924823423999e-01, 4.0515694511710398e-01, -4.0515694519737000e-01, 6.2085150101376396e-01, -2.6624225215489500e-01, -6.2085150108873699e-01, -7.3733199910325498e-01, -2.6624225223379999e-01, 7.3733199899622204e-01, 2.6624225222255998e-01, 7.3733199883297396e-01, 2.6624225232837401e-01, -7.3733199893899004e-01, -6.2085150118329702e-01, 6.2085150130578604e-01, -2.7488282350427998e-02, -6.8622318644832503e-01, 2.7488282371885001e-02, 7.2687146918540602e-01, -6.8622318649112002e-01, -7.2687146908979405e-01, 6.8622318647033498e-01, -7.2687146898342203e-01, 6.8622318652309200e-01, 7.2687146903349797e-01, 2.7488282335550000e-02, -2.7488282309715999e-02, 5.8086026773927102e-01, 4.6892740848863801e-01, -5.8086026771957500e-01, 6.6536338582186305e-01, 4.6892740867883198e-01, -6.6536338569880304e-01, -4.6892740855276199e-01, -6.6536338584794696e-01, -4.6892740865451898e-01, 6.6536338565135600e-01, -5.8086026779121203e-01, 5.8086026754801701e-01, -7.7909959792443395e-01, 2.3760971090993399e-01, 7.7909959797773198e-01, -5.8012536727610997e-01, 2.3760971114731999e-01, 5.8012536704742601e-01, -2.3760971084964200e-01, 5.8012536715725604e-01, -2.3760971104512801e-01, -5.8012536702235895e-01, 7.7909959815196606e-01, -7.7909959796671602e-01, 1.0111360590053900e-01, -2.6595423647719901e-01, -1.0111360609543200e-01, 9.5866802529455497e-01, -2.6595423665631701e-01, -9.5866802524616201e-01, 2.6595423641466398e-01, -9.5866802539358298e-01, 2.6595423626066400e-01, 9.5866802532257700e-01, -1.0111360590910100e-01, 1.0111360578949700e-01, 2.8431902500722900e-01, 5.5120723932070903e-01, -2.8431902488813099e-01, -7.8443181429188802e-01, 5.5120723934750404e-01, 7.8443181440099796e-01, -5.5120723916013703e-01, 7.8443181442674303e-01, -5.5120723939406702e-01, -7.8443181451083199e-01, -2.8431902475772902e-01, 2.8431902468988401e-01, 9.7946877886664996e-01, 1.1341985201124800e-01, -9.7946877887722195e-01, 1.6666387846509201e-01, 1.1341985223322899e-01, -1.6666387821316500e-01, -1.1341985208875500e-01, -1.6666387838378499e-01, -1.1341985225265100e-01, 1.6666387842006100e-01, -9.7946877885883998e-01, 9.7946877885240302e-01, 9.9002690679599006e-02, 4.1690427375369199e-01, -9.9002690647922997e-02, 9.0354263519376798e-01, 4.1690427369973199e-01, -9.0354263523751699e-01, -4.1690427393725399e-01, -9.0354263511014699e-01, -4.1690427406438002e-01, 9.0354263513138600e-01, -9.9002690467102000e-02, 9.9002690245829000e-02, 3.4931218553706300e-01, -8.9457952060851498e-01, -3.4931218550347298e-01, 2.7876240472791702e-01, -8.9457952067772295e-01, -2.7876240465867702e-01, 8.9457952068279800e-01, -2.7876240468046898e-01, 8.9457952067922997e-01, 2.7876240455590801e-01, -3.4931218550650001e-01, 3.4931218542878700e-01, -6.7683321173667099e-01, 4.8257246604011600e-01, 6.7683321152298703e-01, 5.5589623016467204e-01, 4.8257246609289500e-01, -5.5589623036790903e-01, -4.8257246607198101e-01, -5.5589623023008405e-01, -4.8257246632773698e-01, 5.5589623026777002e-01, 6.7683321158945298e-01, -6.7683321145553699e-01 }; const float tDesignZ[240] = { -1.8161861045425301e-01, 8.9265353583193796e-01, -1.8161861030657500e-01, 4.1253405363523998e-01, -8.9265353585230400e-01, -4.1253405365843199e-01, 8.9265353588791796e-01, 4.1253405357391099e-01, -8.9265353592182495e-01, -4.1253405349739902e-01, 1.8161861035833901e-01, 1.8161861027797099e-01, 9.0950707017034704e-01, -2.9209374281177602e-01, 9.0950707020196198e-01, -2.9576702773393398e-01, 2.9209374270678301e-01, 2.9576702784167502e-01, -2.9209374274865102e-01, -2.9576702764692703e-01, 2.9209374313641401e-01, 2.9576702771806901e-01, -9.0950707025226596e-01, -9.0950707016396903e-01, 8.1763902259740295e-01, -5.7522571816230095e-01, 8.1763902253778098e-01, 2.4120572671468998e-02, 5.7522571825177704e-01, -2.4120572984525999e-02, -5.7522571806142397e-01, 2.4120572606111002e-02, 5.7522571814254597e-01, -2.4120572792227998e-02, -8.1763902268007005e-01, -8.1763902269564603e-01, 9.9028894797385303e-01, -1.2883316185025101e-01, 9.9028894797993805e-01, 5.2247640684557999e-02, 1.2883316190753799e-01, -5.2247640268992000e-02, -1.2883316194820901e-01, 5.2247640547187002e-02, 1.2883316196120001e-01, -5.2247640255526001e-02, -9.9028894798549405e-01, -9.9028894796550004e-01, -2.2853978759628599e-01, 7.1800638593159605e-01, -2.2853978760487700e-01, 6.5744687630237397e-01, -7.1800638601105404e-01, -6.5744687623094500e-01, 7.1800638585431498e-01, 6.5744687641257704e-01, -7.1800638590197496e-01, -6.5744687643164801e-01, 2.2853978777085099e-01, 2.2853978771540101e-01, 1.8902952894000100e-01, 8.6317647317783996e-01, 1.8902952878003301e-01, 4.6818181667670800e-01, -8.6317647326839797e-01, -4.6818181666510000e-01, 8.6317647320782098e-01, 4.6818181672193099e-01, -8.6317647319812296e-01, -4.6818181664872199e-01, -1.8902952887156099e-01, -1.8902952880174401e-01, 3.6835851146215198e-01, 7.7263285687428596e-01, 3.6835851161591499e-01, -5.1705945062457304e-01, -7.7263285681305605e-01, 5.1705945057827296e-01, 7.7263285691028005e-01, -5.1705945060222902e-01, -7.7263285687927497e-01, 5.1705945067741199e-01, -3.6835851128353098e-01, -3.6835851138037801e-01, -5.2612112811300205e-01, -8.4781923182380903e-01, -5.2612112817409695e-01, -6.6325775917910001e-02, 8.4781923173637197e-01, 6.6325775781366003e-02, -8.4781923176749596e-01, -6.6325775965612996e-02, 8.4781923179643603e-01, 6.6325775981759996e-02, 5.2612112825759405e-01, 5.2612112820459001e-01, 3.3269410944389199e-01, 9.8057432149499992e-03, 3.3269410959620699e-01, 9.4298381591953195e-01, -9.8057433158039997e-03, -9.4298381585806201e-01, 9.8057433046670004e-03, 9.4298381588707003e-01, -9.8057432307629994e-03, -9.4298381583673496e-01, -3.3269410969706498e-01, -3.3269410958733098e-01, -4.6763412046589597e-01, 7.8559924845769802e-01, -4.6763412064490401e-01, -4.0515694521533901e-01, -7.8559924822236604e-01, 4.0515694535034702e-01, 7.8559924837830497e-01, -4.0515694517715600e-01, -7.8559924829118200e-01, 4.0515694508395300e-01, 4.6763412073210597e-01, 4.6763412071672700e-01, -2.6624225199189000e-01, -7.3733199912700997e-01, -2.6624225201488300e-01, 6.2085150106584996e-01, 7.3733199898902502e-01, -6.2085150116595100e-01, -7.3733199899905999e-01, 6.2085150131598299e-01, 7.3733199886379697e-01, -6.2085150126795896e-01, 2.6624225210487901e-01, 2.6624225213201003e-01, -6.8622318646806102e-01, 7.2687146919063295e-01, -6.8622318645949898e-01, -2.7488282286340999e-02, -7.2687146914384504e-01, 2.7488282420281000e-02, 7.2687146916667400e-01, -2.7488282348185001e-02, -7.2687146911746503e-01, 2.7488282323948000e-02, 6.8622318656986903e-01, 6.8622318656023196e-01, 4.6892740835271601e-01, 6.6536338576630805e-01, 4.6892740843831798e-01, 5.8086026763281295e-01, -6.6536338567472297e-01, -5.8086026774807797e-01, 6.6536338566542697e-01, 5.8086026749996100e-01, -6.6536338581556298e-01, -5.8086026779993805e-01, -4.6892740838585001e-01, -4.6892740854532600e-01, 2.3760971091870700e-01, -5.8012536713553897e-01, 2.3760971103325801e-01, -7.7909959801411399e-01, 5.8012536702325002e-01, 7.7909959814677399e-01, -5.8012536700349904e-01, -7.7909959806727602e-01, 5.8012536705136897e-01, 7.7909959822949504e-01, -2.3760971069808601e-01, -2.3760971099221501e-01, -2.6595423638995602e-01, 9.5866802533712003e-01, -2.6595423643765997e-01, 1.0111360588055800e-01, -9.5866802527548201e-01, -1.0111360612560200e-01, 9.5866802536126705e-01, 1.0111360585552200e-01, -9.5866802540641505e-01, -1.0111360592610601e-01, 2.6595423606480800e-01, 2.6595423600538598e-01, 5.5120723920251602e-01, -7.8443181440086196e-01, 5.5120723922646697e-01, 2.8431902490255601e-01, 7.8443181444824905e-01, -2.8431902465254599e-01, -7.8443181455280397e-01, 2.8431902456350300e-01, 7.8443181447462895e-01, -2.8431902470079701e-01, -5.5120723899277202e-01, -5.5120723918823999e-01, 1.1341985195328499e-01, 1.6666387834456400e-01, 1.1341985217465900e-01, 9.7946877889022399e-01, -1.6666387810129701e-01, -9.7946877891329798e-01, 1.6666387829736801e-01, 9.7946877889367301e-01, -1.6666387820714201e-01, -9.7946877889386497e-01, -1.1341985205277499e-01, -1.1341985208972701e-01, 4.1690427350786502e-01, 9.0354263529589696e-01, 4.1690427353128801e-01, 9.9002690581850003e-02, -9.0354263533134105e-01, -9.9002690663844997e-02, 9.0354263521634803e-01, 9.9002690301575005e-02, -9.0354263519452305e-01, -9.9002690496392001e-02, -4.1690427380018302e-01, -4.1690427394998802e-01, -8.9457952069817503e-01, 2.7876240476243103e-01, -8.9457952070990998e-01, 3.4931218529186597e-01, -2.7876240468989599e-01, -3.4931218520698398e-01, 2.7876240456792301e-01, 3.4931218519892898e-01, -2.7876240458114898e-01, -3.4931218530707497e-01, 8.9457952074069202e-01, 8.9457952076938196e-01, 4.8257246581475999e-01, 5.5589623005087596e-01, 4.8257246595840098e-01, -6.7683321168067301e-01, -5.5589623027763901e-01, 6.7683321151895703e-01, 5.5589623007919098e-01, -6.7683321145561604e-01, -5.5589623009739997e-01, 6.7683321155172704e-01, -4.8257246600594900e-01, -4.8257246619187499e-01 }; #endif IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/AmbisonicDecoder.h0000664002537200253720000001673515257173642030220 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Authors: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once #include "../JuceLibraryCode/JuceHeader.h" #include "MatrixMultiplication.h" #include "MaxRE.h" #include "ReferenceCountedDecoder.h" #include "ambisonicTools.h" #include "inPhase.h" class AmbisonicDecoder { public: AmbisonicDecoder() {} void prepare (const juce::dsp::ProcessSpec& newSpec) { spec = newSpec; matMult.prepare (newSpec, false); // we let do this class do the buffering buffer.setSize (buffer.getNumChannels(), spec.maximumBlockSize); buffer.clear(); checkIfNewDecoderAvailable(); } void setInputNormalization (ReferenceCountedDecoder::Normalization newNormalization) { inputNormalization = newNormalization; } /** Decodes the Ambisonic input signals to loudspeaker signals using the current decoder. This method takes care of buffering the input data, so inputBlock and outputBlock are allowed to be the same or overlap. */ void process (juce::dsp::AudioBlock inputBlock, juce::dsp::AudioBlock outputBlock) { checkIfNewDecoderAvailable(); ReferenceCountedDecoder::Ptr retainedDecoder = currentDecoder; if (retainedDecoder == nullptr) { outputBlock.clear(); return; } auto& T = retainedDecoder->getMatrix(); const int nInputChannels = juce::jmin (static_cast (inputBlock.getNumChannels()), static_cast (T.getNumColumns())); const int nSamples = static_cast (inputBlock.getNumSamples()); // copy input data to buffer for (int ch = 0; ch < nInputChannels; ++ch) buffer.copyFrom (ch, 0, inputBlock.getChannelPointer (ch), nSamples); juce::dsp::AudioBlock ab (buffer.getArrayOfWritePointers(), nInputChannels, 0, nSamples); processInternal (ab, outputBlock); } const bool checkIfNewDecoderAvailable() { if (newDecoderAvailable) { newDecoderAvailable = false; currentDecoder = newDecoder; newDecoder = nullptr; if (currentDecoder != nullptr) { currentDecoder->removeAppliedWeights(); const int cols = (int) currentDecoder->getMatrix().getNumColumns(); buffer.setSize (cols, buffer.getNumSamples()); } matMult.setMatrix (currentDecoder, true); return true; } return false; }; /** Giving the AmbisonicDecoder a new decoder for the audio processing. Note: The AmbisonicDecoder will call the removeAppliedWeights() of the ReferenceCountedDecoder before it processes audio! The matrix elements may change due to this method. */ void setDecoder (ReferenceCountedDecoder::Ptr newDecoderToUse) { newDecoder = newDecoderToUse; newDecoderAvailable = true; } ReferenceCountedDecoder::Ptr getCurrentDecoder() { return currentDecoder; } /** Checks if a new decoder waiting to be used. */ const bool isNewDecoderWaiting() { return newDecoderAvailable; } private: /** Decodes the Ambisonic input signals to loudspeaker signals using the current decoder. Keep in mind that the input data will be changed! */ void processInternal (juce::dsp::AudioBlock inputBlock, juce::dsp::AudioBlock outputBlock) { // you should call the processReplacing instead, it will buffer the input data // this is a weak check, as e.g. if number channels differ, it won't trigger jassert (inputBlock != outputBlock); juce::ScopedNoDenormals noDenormals; ReferenceCountedDecoder::Ptr retainedDecoder = currentDecoder; if (retainedDecoder != nullptr) // if decoder is available, do the pre-processing { const int order = isqrt (static_cast (inputBlock.getNumChannels())) - 1; const int chAmbi = juce::square (order + 1); const int numSamples = static_cast (inputBlock.getNumSamples()); float weights[64]; const float correction = std::sqrt (std::sqrt ((static_cast (retainedDecoder->getOrder()) + 1) / (static_cast (order) + 1))); juce::FloatVectorOperations::fill (weights, correction, chAmbi); if (retainedDecoder->getSettings().weights == ReferenceCountedDecoder::Weights::maxrE) { multiplyMaxRE (order, weights); juce::FloatVectorOperations::multiply (weights, maxRECorrectionEnergy[order], chAmbi); } else if (retainedDecoder->getSettings().weights == ReferenceCountedDecoder::Weights::inPhase) { multiplyInPhase (order, weights); juce::FloatVectorOperations::multiply (weights, inPhaseCorrectionEnergy[order], chAmbi); } if (retainedDecoder->getSettings().expectedNormalization != inputNormalization) { const float* conversionPtr ( inputNormalization == ReferenceCountedDecoder::Normalization::sn3d ? sn3d2n3d : n3d2sn3d); juce::FloatVectorOperations::multiply (weights, conversionPtr, chAmbi); } for (int ch = 0; ch < chAmbi; ++ch) juce::FloatVectorOperations::multiply (inputBlock.getChannelPointer (ch), weights[ch], numSamples); } matMult.processNonReplacing (inputBlock, outputBlock); } private: //============================================================================== juce::dsp::ProcessSpec spec = { -1, 0, 0 }; ReferenceCountedDecoder::Ptr currentDecoder { nullptr }; ReferenceCountedDecoder::Ptr newDecoder { nullptr }; bool newDecoderAvailable { false }; juce::AudioBuffer buffer; ReferenceCountedDecoder::Normalization inputNormalization { ReferenceCountedDecoder::Normalization::sn3d }; MatrixMultiplication matMult; }; IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/IOHelper.h0000664002537200253720000001501215257173642026460 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once #include "ambisonicTools.h" /* Helper class to check the available input and output channels e.g. for auto settings of Ambisonic order Use this in your editor's timer callback: // === update titleBar widgets according to available input/output channel counts title.setMaxSize (audioProcessor.getMaxSize()); // ========================================== */ namespace IOTypes { class Nothing { public: Nothing() {} bool check (juce::AudioProcessor* p, int setting, bool isInput) { ignoreUnused (p, setting, isInput); return false; } int getSize() { return 0; } int getMaxSize() { return 0; } }; template class AudioChannels { public: AudioChannels() { nChannels = 0; _nChannels = 0; } ~AudioChannels() {} bool check (juce::AudioProcessor* p, int setting, bool isInput) { int previous = nChannels; int maxNumInputs = juce::jmin (isInput ? p->getTotalNumInputChannels() : p->getTotalNumOutputChannels(), maxNumberOfInputChannels); if (setting == 0 || setting > maxNumberOfInputChannels) nChannels = maxNumInputs; // Auto setting or requested order exceeds highest possible order else nChannels = setting; maxSize = maxNumInputs; return previous != nChannels; } int getMaxSize() { return maxSize; } int getSize() { return nChannels; } int getPreviousSize() { return _nChannels; } private: int nChannels; int _nChannels; int maxSize = maxNumberOfInputChannels; }; template class Ambisonics { public: Ambisonics() { order = -1; nChannels = 0; _order = -1; _nChannels = 0; } ~Ambisonics() {} bool check (juce::AudioProcessor* p, int setting, bool isInput) { int previousOrder = order; --setting; int maxPossibleOrder = juce::jmin ( isqrt (isInput ? p->getTotalNumInputChannels() : p->getTotalNumOutputChannels()) - 1, highestOrder); if (setting == -1 || setting > maxPossibleOrder) order = maxPossibleOrder; // Auto setting or requested order exceeds highest possible order else order = setting; nChannels = juce::square (order + 1); maxSize = maxPossibleOrder; return previousOrder != order; } int getSize() { return getOrder(); } int getPreviousSize() { return getPreviousOrder(); } int getOrder() { return order; } int getPreviousOrder() { return _order; } int getNumberOfChannels() { return nChannels; } int getPreviousNumberOfChannels() { return _nChannels; } int getMaxSize() { return maxSize; } private: int order, _order; int nChannels, _nChannels; int maxSize = highestOrder; }; } // namespace IOTypes template class IOHelper { public: IOHelper() {} virtual ~IOHelper() {} Input input; Output output; bool inputSizeHasChanged; bool outputSizeHasChanged; /** Call to check number available of input and output channels @inputSetting and @outputSetting should hold the user's setting: Audio: 0 equals auto mode, >=1 equals number of channels Ambisonics: 0 equals auto mode, >=1 equals Ambisonic order - 1 E.g.: Ambisonic: 5 -> user set 4th order. This function should be called in every call of prepareToPlay() and at the beginning of the processBlock() with a check if the user has changed the input/output settings. */ void checkInputAndOutput (juce::AudioProcessor* p, int inputSetting, int outputSetting, bool force = false) { if (force || userChangedIOSettings) { inputSizeHasChanged = false; outputSizeHasChanged = false; DBG ("IOHelper: processors I/O channel counts: " << p->getTotalNumInputChannels() << "/" << p->getTotalNumOutputChannels()); inputSizeHasChanged = input.check (p, inputSetting, true); outputSizeHasChanged = output.check (p, outputSetting, false); if (force || inputSizeHasChanged || outputSizeHasChanged) { DBG ("IOHelper: I/O sizes have changed. calling updateBuffers()"); updateBuffers(); } userChangedIOSettings = false; } } std::pair getMaxSize() { int maxInputSize = input.getMaxSize(); int maxOutputSize = output.getMaxSize(); if (combined) { maxInputSize = juce::jmin (maxInputSize, maxOutputSize); maxOutputSize = maxInputSize; } return { maxInputSize, maxOutputSize }; } bool userChangedIOSettings = true; private: /** Update buffers @inputSetting and @outputSetting should hold the user's setting: Audio: 0 equals auto mode, >=1 equals number of channels Ambisonics: 0 equals auto mode, >=1 equals Ambisonic order - 1 E.g.: Ambisonic: 5 -> user set 4th order. This function should be called in every call of prepareToPlay() and at the beginning of the processBlock() with a check if the user has changed the input/output settings. */ virtual void updateBuffers() { DBG ("IOHelper: input size: " << input.getSize()); DBG ("IOHelper: output size: " << output.getSize()); } }; IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/MultiChannelGain.h0000664002537200253720000001061215257173642030174 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2018 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ /* This processor is based on JUCE's juce::dsp::Gain processor. */ template class MultiChannelGain { public: MultiChannelGain() {} //============================================================================== /** Applies a new gain as a linear value. */ void setGainLinear (const int channel, FloatType newGain) noexcept { if (channel < gains.size()) gains.getUnchecked (channel)->setTargetValue (newGain); } /** Applies a new gain as a decibel value. */ void setGainDecibels (const int channel, FloatType newGainDecibels) { setGainLinear (channel, juce::Decibels::decibelsToGain (newGainDecibels)); } /** Sets the length of the ramp used for smoothing gain changes. */ void setRampDurationSeconds (double newDurationSeconds) noexcept { if (rampDurationSeconds != newDurationSeconds) { rampDurationSeconds = newDurationSeconds; reset(); } } /** Returns the ramp duration in seconds. */ double getRampDurationSeconds() const noexcept { return rampDurationSeconds; } /** Returns true if the current value is currently being interpolated. */ bool isSmoothing (const int channel) { jassert (channel < gains.size()); return gains.getUnchecked (channel).isSmoothing(); } //============================================================================== /** Called before processing starts. */ void prepare (const juce::dsp::ProcessSpec& spec) noexcept { sampleRate = spec.sampleRate; gains.clear(); for (int ch = 0; ch < spec.numChannels; ++ch) gains.add (new juce::LinearSmoothedValue()); reset(); } /** Resets the internal state of the gain */ void reset() noexcept { if (sampleRate > 0) for (int i = 0; i < gains.size(); ++i) gains.getUnchecked (i)->reset (sampleRate, rampDurationSeconds); } /** Processes the input and output buffers supplied in the processing context. */ template void process (const ProcessContext& context) noexcept { auto&& inBlock = context.getInputBlock(); auto&& outBlock = context.getOutputBlock(); jassert (inBlock.getNumChannels() == outBlock.getNumChannels()); jassert (inBlock.getNumChannels() <= gains.size()); jassert (inBlock.getNumSamples() == outBlock.getNumSamples()); auto len = inBlock.getNumSamples(); auto numChannels = inBlock.getNumChannels(); if (context.isBypassed) { for (int i = 0; i < gains.size(); ++i) gains.getUnchecked (i)->skip (static_cast (len)); if (context.usesSeparateInputAndOutputBlocks()) outBlock.copyFrom (inBlock); return; } for (int ch = 0; ch < numChannels; ++ch) { auto* src = inBlock.getChannelPointer (ch); auto* dst = outBlock.getChannelPointer (ch); for (size_t i = 0; i < len; ++i) dst[i] = src[i] * gains.getUnchecked (ch)->getNextValue(); } for (int ch = (int) numChannels; ch < gains.size(); ++ch) { gains.getUnchecked (ch)->skip (static_cast (len)); } } private: juce::OwnedArray> gains; double sampleRate = 0, rampDurationSeconds = 0; }; IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/LabelAttachment.h0000664002537200253720000001233515257173642030046 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2018 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once #include "../JuceLibraryCode/JuceHeader.h" // This class is copied from juce::AudioProcessorValueTreeState.cpp to make it accessible. struct AttachedControlBase : public juce::AudioProcessorValueTreeState::Listener, public juce::AsyncUpdater { AttachedControlBase (juce::AudioProcessorValueTreeState& s, const juce::String& p) : state (s), paramID (p), lastValue (0) { state.addParameterListener (paramID, this); } void removeListener() { state.removeParameterListener (paramID, this); } void setNewUnnormalisedValue (float newUnnormalisedValue) { if (juce::AudioProcessorParameter* p = state.getParameter (paramID)) { const float newValue = state.getParameterRange (paramID).convertTo0to1 (newUnnormalisedValue); if (p->getValue() != newValue) p->setValueNotifyingHost (newValue); } } void setNewNormalisedValue (float newNormalisedValue) { if (juce::AudioProcessorParameter* p = state.getParameter (paramID)) { if (p->getValue() != newNormalisedValue) p->setValueNotifyingHost (newNormalisedValue); } } void sendInitialUpdate() { if (std::atomic* v = state.getRawParameterValue (paramID)) parameterChanged (paramID, *v); } void parameterChanged (const juce::String&, float newValue) override { lastValue = newValue; if (juce::MessageManager::getInstance()->isThisTheMessageThread()) { cancelPendingUpdate(); setValue (newValue); } else { triggerAsyncUpdate(); } } void beginParameterChange() { if (juce::AudioProcessorParameter* p = state.getParameter (paramID)) { if (state.undoManager != nullptr) state.undoManager->beginNewTransaction(); p->beginChangeGesture(); } } void endParameterChange() { if (juce::AudioProcessorParameter* p = state.getParameter (paramID)) p->endChangeGesture(); } void handleAsyncUpdate() override { setValue (lastValue); } virtual void setValue (float) = 0; juce::AudioProcessorValueTreeState& state; juce::String paramID; float lastValue; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (AttachedControlBase) }; // This one I wrote myself ;-) class LabelAttachment : private AttachedControlBase, private juce::Label::Listener { public: LabelAttachment (juce::AudioProcessorValueTreeState& stateToControl, const juce::String& parameterID, juce::Label& labelToControl) : AttachedControlBase (stateToControl, parameterID), label (labelToControl), ignoreCallbacks (false) { parameter = state.getParameter (paramID); sendInitialUpdate(); label.addListener (this); } ~LabelAttachment() { label.removeListener (this); removeListener(); } void labelTextChanged (juce::Label* labelThatHasChanged) override { auto newValue = getNormalizedValueFromText (label.getText()); const juce::ScopedLock selfCallbackLock (selfCallbackMutex); if (! ignoreCallbacks) { beginParameterChange(); setNewUnnormalisedValue (newValue); endParameterChange(); } updateText(); } float getNormalizedValueFromText (const juce::String& text) { float value = text.getFloatValue(); return value; } void setValue (float newValue) override { const juce::ScopedLock selfCallbackLock (selfCallbackMutex); { juce::ScopedValueSetter svs (ignoreCallbacks, true); updateText(); } } void updateText() { juce::String text = parameter->getText (parameter->getValue(), 2) + " " + parameter->label; label.setText (text, juce::NotificationType::dontSendNotification); } private: juce::Label& label; bool ignoreCallbacks; juce::CriticalSection selfCallbackMutex; const juce::AudioProcessorParameterWithID* parameter { nullptr }; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (LabelAttachment) }; IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/AmbisonicWarp.h0000664002537200253720000002313215257173642027551 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Authors: Felix Holzmüller Copyright (c) 2024 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ /* This class is based on the Ambix warp plugin by Matthias Kronlachner: https://github.com/kronihias/ambix/ */ #include #include "Conversions.h" #include "ambisonicTools.h" #include "efficientSHvanilla.h" #include "tDesignN10.h" template class AmbisonicWarp : public juce::Thread, juce::Timer { public: enum AzimuthWarpType { OnePoint, // Warp from/towards front or back TwoPoint // Warp from/towards front/back or sides }; enum ElevationWarpType { Pole, // Warp from/towards pole Equator // Warp from/towards equator }; AmbisonicWarp (AzimuthWarpType azWarpType = AzimuthWarpType::TwoPoint, ElevationWarpType elWarpType = ElevationWarpType::Pole, float azWarpFactor = 0.0f, float elWarpFactor = 0.0f, int workingOrder = 7) : Thread ("AmbisonicWarpUpdate") { _azWarpType = azWarpType; _elWarpType = elWarpType; _azWarpFactor = azWarpFactor; _elWarpFactor = elWarpFactor; _workingOrder = workingOrder; _usedChannels = squares[_workingOrder + 1]; // Calculate decoder matrix float tmp_SH[maxChannels]; for (int p = 0; p < tDesignN; ++p) { SHEval (maxOrder, tDesignX[p], tDesignY[p], tDesignZ[p], tmp_SH, false); for (int r = 0; r < maxChannels; ++r) _Y (r, p) = tmp_SH[r]; } _Y *= 1.0f / decodeCorrection (maxOrder); calculateWarpingMatrix(); _T = _Tnew; copyBuffer.setSize (1, 128); } void setWorkingOrder (int order) { _workingOrder = order; _usedChannels = squares[_workingOrder + 1]; } int getWorkingOrder() const { return _workingOrder; } void process (juce::AudioBuffer* bufferToWarp) { const int samples = bufferToWarp->getNumSamples(); const int bufferChannels = bufferToWarp->getNumChannels(); int workingOrder = juce::jmin (isqrt (bufferChannels) - 1, _workingOrder); int nCh = squares[workingOrder + 1]; // Resize copyBuffer if necessary if (copyBuffer.getNumSamples() != samples) copyBuffer.setSize (1, samples); // make copy of input for (int ch = 0; ch < nCh; ++ch) { copyBuffer.clear(); if (updateReady) { for (int ch2 = 0; ch2 < nCh; ++ch2) { copyBuffer.addFromWithRamp (0, 0, bufferToWarp->getReadPointer (ch2), samples, _T (ch, ch2), _Tnew (ch, ch2)); } } else { for (int ch2 = 0; ch2 < nCh; ++ch2) { copyBuffer.addFrom (0, 0, bufferToWarp->getReadPointer (ch2), samples, _T (ch, ch2)); } } bufferToWarp->copyFrom (ch, 0, copyBuffer.getReadPointer (0), samples); } if (updateReady) { _T = _Tnew; updateReady = false; } } void updateParams (AzimuthWarpType azWarpType, ElevationWarpType elWarpType, float azWarpFactor, float elWarpFactor) { _azWarpType = azWarpType; _elWarpType = elWarpType; _azWarpFactor = azWarpFactor; _elWarpFactor = elWarpFactor; startTimer (100); } private: void timerCallback() override { DBG ("-------- time to update warping matrix -------------"); stopTimer(); stopThread (20); startThread(); } void run() override { // ScopedLock lock (processor.getCallbackLock()); updateReady = false; double timeSec; DBG ("******** Running warping matrix update *****************"); { juce::ScopedTimeMeasurement m (timeSec); calculateWarpingMatrix(); } DBG ("******** FINISHED warping matrix update in " << juce::String (timeSec, 4) << " seconds *****************"); updateReady = true; } void calculateWarpingMatrix() { juce::dsp::Matrix YH = juce::dsp::Matrix (tDesignN, maxChannels); for (int p = 0; p < tDesignN; ++p) { float az_orig, el_orig; Conversions::cartesianToSpherical (tDesignX[p], tDesignY[p], tDesignZ[p], az_orig, el_orig); float el_warped = el_orig; float az_warped = az_orig; if (std::abs (_elWarpFactor) > 0.01f) { // Get warped angle and de-emphasis gain auto [el_warped_tmp, el_g_tmp] = (_elWarpType == ElevationWarpType::Pole) ? warpToPole (el_orig, _elWarpFactor) : warpToEquator (el_orig, _elWarpFactor); el_warped = el_warped_tmp; } // Use same warp functions for azimuth, just modify in/output if (std::abs (_azWarpFactor) > 0.01f) { if (_azWarpType == AzimuthWarpType::OnePoint) { auto [az_tmp, az_g_tmp] = warpToEquator (az_orig * 0.5f, -_azWarpFactor); az_warped = az_tmp * 2.0f; } else { float in_sign = (az_orig < 0.0f) ? -1.0f : 1.0f; float az_in_tf = (az_orig - 0.5f * juce::MathConstants::pi) * in_sign; auto [az_tmp, az_g_tmp] = warpToEquator (az_in_tf, _azWarpFactor); az_warped = az_tmp + 0.5f * juce::MathConstants::pi * in_sign; } } // Get cartesian coordinates of warped direction juce::Vector3D warped_cart = Conversions::sphericalToCartesian (az_warped, el_warped); // Calculate SH coefficients for warped direction SHEval (maxOrder, warped_cart, YH.getRawDataPointer() + p * 64, false); } _Tnew = _Y * YH; } std::tuple warpToPole (const float angleInRad, const float alpha) { float mu = std::sin (angleInRad); float warpedAngle = std::asin ((mu - alpha) / (1.0f - alpha * mu)); float gain = (1.0f + alpha * mu) / std::sqrt (1.0f - alpha * alpha); return { warpedAngle, gain }; } std::tuple warpToEquator (const float angleInRad, const float alpha) { float mu = std::sin (angleInRad); float g = 1.0f; float warpedAngle; if (std::abs (alpha) < 0.01f) warpedAngle = angleInRad; else { float absalpha = std::abs (alpha); g = ((1.0f + absalpha * mu * mu) / std::sqrt ((1.0f - absalpha) * (1.0f + absalpha * mu * mu))); if (alpha < 0.0f) { warpedAngle = std::asin (((absalpha - 1.0f) + std::sqrt ((absalpha - 1.0f) * (absalpha - 1.0f) + 4.0f * absalpha * mu * mu)) / (2.0f * absalpha * mu)); } else { warpedAngle = std::asin ((1.0f - absalpha) * mu / (1.0f - absalpha * mu * mu)); g = 1.0f / g; } } return { warpedAngle, g }; } static constexpr int maxChannels = (maxOrder + 1) * (maxOrder + 1); int _workingOrder, _usedChannels; AzimuthWarpType _azWarpType; ElevationWarpType _elWarpType; float _azWarpFactor, _elWarpFactor; juce::dsp::Matrix _Y = juce::dsp::Matrix (maxChannels, tDesignN); juce::dsp::Matrix _T = juce::dsp::Matrix (maxChannels, maxChannels); juce::dsp::Matrix _Tnew = juce::dsp::Matrix (maxChannels, maxChannels); juce::AudioBuffer copyBuffer; std::atomic updateReady = false; }; IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/OSC/0000775002537200253720000000000015257173642025265 5ustar zmoelnigzmoelnigIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/OSC/OSCStatus.h0000664002537200253720000000603615257173642027273 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2018 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once #include "../customComponents/SimpleLabel.h" #include "OSCParameterInterface.h" class OSCDialogWindow : public juce::Component, private juce::Timer, private juce::Label::Listener { static constexpr int minPortNumber = 1024; static constexpr int maxPortNumber = 65535; public: OSCDialogWindow (OSCParameterInterface& oscInterface, OSCReceiverPlus& oscReceiver, OSCSenderPlus& oscSender); void timerCallback() override; void updateOSCAddress(); void labelTextChanged (juce::Label* labelThatHasChanged) override; void checkPortAndConnectSender(); void checkPortAndConnectReceiver(); void resized() override; private: OSCParameterInterface& interface; OSCReceiverPlus& receiver; OSCSenderPlus& sender; bool isReceiverConnected = false; bool isSenderConnected = false; juce::GroupComponent receiverGroup, senderGroup; SimpleLabel slRecPort, slSendIP, slSendPort, slSendName, slInterval; juce::Label lbRPort, lbSPort, lbSHostname, lbSOSCAddress; juce::Slider intervalSlider; juce::TextButton tbReceiverOpen, tbSenderOpen, tbFlush; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (OSCDialogWindow) }; //============================================================================== /* */ class OSCStatus : public juce::Component, private juce::Timer { public: OSCStatus (OSCParameterInterface& oscInterface); void timerCallback() override; void mouseMove (const juce::MouseEvent& event) override; void mouseExit (const juce::MouseEvent& event) override; void mouseUp (const juce::MouseEvent& event) override; void paint (juce::Graphics& g) override; private: OSCParameterInterface& oscParameterInterface; OSCReceiverPlus& oscReceiver; OSCSenderPlus& oscSender; juce::Rectangle bounds; bool mouseOver = false; bool isReceiverOpen = false; int lastReceiverPort = -1; bool isSenderOpen = false; int lastSenderPort = -1; juce::String lastSenderHostName; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (OSCStatus) }; IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/OSC/OSCInputStream.h0000664002537200253720000002513115257173642030260 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the JUCE library. Copyright (c) 2017 - ROLI Ltd. JUCE is an open source library subject to commercial or open-source licensing. By using JUCE, you agree to the terms of both the JUCE 5 End-User License Agreement and JUCE 5 Privacy Policy (both updated and effective as of the 27th April 2017). End User License Agreement: www.juce.com/juce-5-licence Privacy Policy: www.juce.com/juce-5-privacy-policy Or: You may also use this code under the terms of the GPL v3 (see www.gnu.org/licenses). JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE DISCLAIMED. ============================================================================== */ #include #if defined(_MSC_VER) #include typedef SSIZE_T ssize_t; #endif class MyOSCInputStream { public: /** Creates an MyOSCInputStream. @param sourceData the block of data to use as the stream's source @param sourceDataSize the number of bytes in the source data block */ MyOSCInputStream (const void* sourceData, size_t sourceDataSize) : input (sourceData, sourceDataSize, false) { } //============================================================================== /** Returns a pointer to the source data block from which this stream is reading. */ const void* getData() const noexcept { return input.getData(); } /** Returns the number of bytes of source data in the block from which this stream is reading. */ size_t getDataSize() const noexcept { return input.getDataSize(); } /** Returns the current position of the stream. */ juce::uint64 getPosition() { return (juce::uint64) input.getPosition(); } /** Attempts to set the current position of the stream. Returns true if this was successful. */ bool setPosition (juce::int64 pos) { return input.setPosition (pos); } /** Returns the total amount of data in bytes accessible by this stream. */ juce::int64 getTotalLength() { return input.getTotalLength(); } /** Returns true if the stream has no more data to read. */ bool isExhausted() { return input.isExhausted(); } //============================================================================== juce::int32 readInt32() { checkBytesAvailable (4, "OSC input stream exhausted while reading int32"); return input.readIntBigEndian(); } juce::uint64 readUint64() { checkBytesAvailable (8, "OSC input stream exhausted while reading uint64"); return (juce::uint64) input.readInt64BigEndian(); } float readFloat32() { checkBytesAvailable (4, "OSC input stream exhausted while reading float"); return input.readFloatBigEndian(); } juce::String readString() { checkBytesAvailable (4, "OSC input stream exhausted while reading string"); auto posBegin = (size_t) getPosition(); auto s = input.readString(); auto posEnd = (size_t) getPosition(); if (static_cast (getData())[posEnd - 1] != '\0') throw juce::OSCFormatError ( "OSC input stream exhausted before finding null terminator of string"); size_t bytesRead = posEnd - posBegin; readPaddingZeros (bytesRead); return s; } juce::MemoryBlock readBlob() { checkBytesAvailable (4, "OSC input stream exhausted while reading blob"); auto blobDataSize = input.readIntBigEndian(); checkBytesAvailable ((blobDataSize + 3) % 4, "OSC input stream exhausted before reaching end of blob"); juce::MemoryBlock blob; auto bytesRead = input.readIntoMemoryBlock (blob, (ssize_t) blobDataSize); readPaddingZeros (bytesRead); return blob; } juce::OSCColour readColour() { checkBytesAvailable (4, "OSC input stream exhausted while reading colour"); return juce::OSCColour::fromInt32 ((juce::uint32) input.readIntBigEndian()); } juce::OSCTimeTag readTimeTag() { checkBytesAvailable (8, "OSC input stream exhausted while reading time tag"); return juce::OSCTimeTag (juce::uint64 (input.readInt64BigEndian())); } juce::OSCAddress readAddress() { return juce::OSCAddress (readString()); } juce::OSCAddressPattern readAddressPattern() { return juce::OSCAddressPattern (readString()); } //============================================================================== juce::OSCTypeList readTypeTagString() { juce::OSCTypeList typeList; checkBytesAvailable (4, "OSC input stream exhausted while reading type tag string"); if (input.readByte() != ',') throw juce::OSCFormatError ("OSC input stream format error: expected type tag string"); for (;;) { if (isExhausted()) throw juce::OSCFormatError ( "OSC input stream exhausted while reading type tag string"); const juce::OSCType type = input.readByte(); if (type == 0) break; // encountered null terminator. list is complete. if (! juce::OSCTypes::isSupportedType (type)) throw juce::OSCFormatError ( "OSC input stream format error: encountered unsupported type tag"); typeList.add (type); } auto bytesRead = (size_t) typeList.size() + 2; readPaddingZeros (bytesRead); return typeList; } //============================================================================== juce::OSCArgument readArgument (juce::OSCType type) { switch (type) { case 'i': return juce::OSCArgument (readInt32()); case 'f': return juce::OSCArgument (readFloat32()); case 's': return juce::OSCArgument (readString()); case 'b': return juce::OSCArgument (readBlob()); case 'r': return juce::OSCArgument (readColour()); default: // You supplied an invalid OSCType when calling readArgument! This should never happen. jassertfalse; throw juce::OSCInternalError ( "OSC input stream: internal error while reading message argument"); } } //============================================================================== juce::OSCMessage readMessage() { auto ap = readAddressPattern(); auto types = readTypeTagString(); juce::OSCMessage msg (ap); for (auto& type : types) msg.addArgument (readArgument (type)); return msg; } //============================================================================== juce::OSCBundle readBundle (size_t maxBytesToRead = std::numeric_limits::max()) { // maxBytesToRead is only passed in here in case this bundle is a nested // bundle, so we know when to consider the next element *not* part of this // bundle anymore (but part of the outer bundle) and return. checkBytesAvailable (16, "OSC input stream exhausted while reading bundle"); if (readString() != "#bundle") throw juce::OSCFormatError ( "OSC input stream format error: bundle does not start with string '#bundle'"); juce::OSCBundle bundle (readTimeTag()); size_t bytesRead = 16; // already read "#bundle" and timeTag auto pos = getPosition(); while (! isExhausted() && bytesRead < maxBytesToRead) { bundle.addElement (readElement()); auto newPos = getPosition(); bytesRead += (size_t) (newPos - pos); pos = newPos; } return bundle; } //============================================================================== juce::OSCBundle::Element readElement() { checkBytesAvailable (4, "OSC input stream exhausted while reading bundle element size"); auto elementSize = (size_t) readInt32(); if (elementSize < 4) throw juce::OSCFormatError ( "OSC input stream format error: invalid bundle element size"); return readElementWithKnownSize (elementSize); } //============================================================================== juce::OSCBundle::Element readElementWithKnownSize (size_t elementSize) { checkBytesAvailable ((juce::int64) elementSize, "OSC input stream exhausted while reading bundle element content"); auto firstContentChar = static_cast (getData())[getPosition()]; if (firstContentChar == '/') return juce::OSCBundle::Element (readMessageWithCheckedSize (elementSize)); if (firstContentChar == '#') return juce::OSCBundle::Element (readBundleWithCheckedSize (elementSize)); throw juce::OSCFormatError ("OSC input stream: invalid bundle element content"); } private: juce::MemoryInputStream input; //============================================================================== void readPaddingZeros (size_t bytesRead) { size_t numZeros = ~(bytesRead - 1) & 0x03; while (numZeros > 0) { if (isExhausted() || input.readByte() != 0) throw juce::OSCFormatError ("OSC input stream format error: missing padding zeros"); --numZeros; } } juce::OSCBundle readBundleWithCheckedSize (size_t size) { auto begin = (size_t) getPosition(); auto maxBytesToRead = size - 4; // we've already read 4 bytes (the bundle size) juce::OSCBundle bundle (readBundle (maxBytesToRead)); if (getPosition() - begin != size) throw juce::OSCFormatError ( "OSC input stream format error: wrong element content size encountered while reading"); return bundle; } juce::OSCMessage readMessageWithCheckedSize (size_t size) { auto begin = (size_t) getPosition(); auto message = readMessage(); if (getPosition() - begin != size) throw juce::OSCFormatError ( "OSC input stream format error: wrong element content size encountered while reading"); return message; } void checkBytesAvailable (juce::int64 requiredBytes, const char* message) { if (input.getNumBytesRemaining() < requiredBytes) throw juce::OSCFormatError (message); } }; ././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/OSC/OSCParameterInterface.hIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/OSC/OSCParameterInterface.0000664002537200253720000000743715257173642031407 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2018 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once #include "../JuceLibraryCode/JuceHeader.h" #include "OSCUtilities.h" #include #if defined(_MSC_VER) #include typedef SSIZE_T ssize_t; #endif //#define DEBUG_PARAMETERS_FOR_DOCUMENTATION /** This class can be used to add parameters to a AudioProcessorValueTree and make them controllable via OSC. The used parameterID will be saved in a juce::StringArray. If the OSCPattern of the forwarded OSCMessages matches one of the parameterIDs, that Parameter will be controlled. */ class OSCParameterInterface : public juce::OSCReceiver::Listener, private juce::Timer { public: OSCParameterInterface (OSCMessageInterceptor& interceptor, juce::AudioProcessorValueTreeState& valueTreeState); static std::unique_ptr createParameterTheOldWay ( const juce::String& parameterID, const juce::String& parameterName, const juce::String& labelText, juce::NormalisableRange valueRange, float defaultValue, std::function valueToTextFunction = nullptr, std::function textToValueFunction = nullptr, bool isMetaParameter = false, bool isAutomatableParameter = true, bool isDiscrete = false, juce::AudioProcessorParameter::Category category = juce::AudioProcessorParameter::genericParameter, bool isBoolean = false); /** Checks whether the OSCAdressPattern of the OSCMessage matches one of the ParameterID's and changes the parameter on success. Returns true, if there is a match. Make sure the plugin-name-prefix was trimmed. */ const bool processOSCMessage (juce::OSCMessage oscMessage); /** Sets the value of an audio-parameter with the specified parameter ID. The provided value will be mapped to a 0-to-1 range. */ void setValue (juce::String paramID, float value); OSCReceiverPlus& getOSCReceiver() { return oscReceiver; } OSCSenderPlus& getOSCSender() { return oscSender; } void oscMessageReceived (const juce::OSCMessage& message) override; void oscBundleReceived (const juce::OSCBundle& bundle) override; void timerCallback() override; void sendParameterChanges (bool forceSend = false); void setOSCAddress (juce::String newAddress); juce::String getOSCAddress() const { return address; } void setInterval (int interValInMilliseconds); int getInterval() const { return getTimerInterval(); } juce::ValueTree getConfig() const; void setConfig (juce::ValueTree config); private: OSCMessageInterceptor& interceptor; juce::AudioProcessorValueTreeState& parameters; OSCReceiverPlus oscReceiver; OSCSenderPlus oscSender; juce::String address; juce::Array lastSentValues; }; IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/OSC/OSCUtilities.h0000664002537200253720000000763115257173642027765 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2018 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once /** An extension to JUCE's OSCReceiver class with some useful methods. */ class OSCReceiverPlus : public juce::OSCReceiver { public: OSCReceiverPlus() { connected = false; } bool connect (int portNumber) { port = portNumber; if (portNumber == -1) { disconnect(); connected = false; return true; } if (OSCReceiver::connect (port)) { connected = true; return true; } else return false; } bool disconnect() { if (OSCReceiver::disconnect()) { connected = false; return true; } else return false; } int getPortNumber() const { return port; } bool isConnected() const { return connected.get(); } private: int port = -1; juce::Atomic connected; }; class OSCSenderPlus : public juce::OSCSender { public: OSCSenderPlus() { connected = false; } bool connect (const juce::String& targetHostName, int portNumber) { hostName = targetHostName; port = portNumber; if (portNumber == -1 || targetHostName.isEmpty()) { disconnect(); connected = false; return true; } if (juce::OSCSender::connect (targetHostName, port)) { connected = true; return true; } else return false; } bool disconnect() { if (OSCSender::disconnect()) { connected = false; return true; } else return false; } int getPortNumber() const { return port; } juce::String getHostName() const { return hostName; } bool isConnected() const { return connected.get(); } private: juce::String hostName; int port = -1; juce::Atomic connected; }; class OSCMessageInterceptor { public: virtual ~OSCMessageInterceptor() = default; /** This method is expected to return true, if the juce::OSCMessage is considered to have been consumed, and should not be passed on. */ virtual inline const bool interceptOSCMessage (juce::OSCMessage& message) { ignoreUnused (message); return false; // not consumed } /** This method will be called if the OSC message wasn't consumed by both 'interceptOscMessage(...)' and the oscParameterInterface.processOSCmessage(...)' method. The method is expected to return true, if the SOCMessage is considered to have been consumed, and should not be passed on. */ virtual inline const bool processNotYetConsumedOSCMessage (const juce::OSCMessage& message) { ignoreUnused (message); return false; } /** Use this method to send additional juce::OSCMessages during the OSCSender's send routine. */ virtual void sendAdditionalOSCMessages (juce::OSCSender&, const juce::OSCAddressPattern&) {} }; ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/OSC/OSCParameterInterface.cppIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/OSC/OSCParameterInterface.0000664002537200253720000002430615257173642031401 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2018 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #include "OSCParameterInterface.h" #include "AudioProcessorBase.h" OSCParameterInterface::OSCParameterInterface (OSCMessageInterceptor& i, juce::AudioProcessorValueTreeState& valueTreeState) : interceptor (i), parameters (valueTreeState) { #ifdef DEBUG_PARAMETERS_FOR_DOCUMENTATION auto& params = parameters.processor.getParameters(); for (auto& item : params) { if (auto* ptr = dynamic_cast ( item)) // that's maybe not the best solution, but it does the job for now { auto parameterID = ptr->paramID; auto parameterName = ptr->name; auto range = parameters.getParameterRange (parameterID); DBG ("| " << parameterID << " | " << range.getRange().getStart() << " : " << range.getRange().getEnd() << " | " << parameterName << " | |"); } } #endif lastSentValues.resize (parameters.processor.getParameters().size()); lastSentValues.fill (-1); setOSCAddress (juce::String (JucePlugin_Name)); oscReceiver.addListener (this); startTimer (100); } std::unique_ptr OSCParameterInterface::createParameterTheOldWay ( const juce::String& parameterID, const juce::String& parameterName, const juce::String& labelText, juce::NormalisableRange valueRange, float defaultValue, std::function valueToTextFunction, std::function textToValueFunction, bool isMetaParameter, bool isAutomatableParameter, bool isDiscrete, juce::AudioProcessorParameter::Category category, bool isBoolean) { auto attributes = juce::AudioProcessorValueTreeStateParameterAttributes() .withLabel (labelText) .withValueFromStringFunction (std::move (textToValueFunction)) .withMeta (isMetaParameter) .withAutomatable (isAutomatableParameter) .withDiscrete (isDiscrete) .withCategory (category) .withBoolean (isBoolean); if (valueToTextFunction != nullptr) attributes = attributes.withStringFromValueFunction ( [fn = std::move (valueToTextFunction)] (float value, int) { return fn (value); }); return std::make_unique (parameterID, parameterName, valueRange, defaultValue, std::move (attributes)); } const bool OSCParameterInterface::processOSCMessage (juce::OSCMessage oscMessage) { auto pattern = oscMessage.getAddressPattern(); if (pattern.containsWildcards()) { auto& params = parameters.processor.getParameters(); for (auto& item : params) { if (auto* ptr = dynamic_cast ( item)) // that's maybe not the best solution, but it does the job for now { auto paramAddress = ptr->paramID; if (pattern.matches (juce::OSCAddress ("/" + paramAddress))) { if (oscMessage.size() > 0) { auto arg = oscMessage[0]; float value = 0.0f; if (arg.isInt32()) value = arg.getInt32(); else if (arg.isFloat32()) value = arg.getFloat32(); else return true; setValue (paramAddress, value); } } } } } juce::String paramAddress = oscMessage.getAddressPattern().toString().substring (1); // trimming forward slash if (auto parameter = parameters.getParameter (paramAddress)) { if (oscMessage.size() > 0) { auto arg = oscMessage[0]; float value = 0.0f; if (arg.isInt32()) value = arg.getInt32(); else if (arg.isFloat32()) value = arg.getFloat32(); else return true; setValue (paramAddress, value); } return true; } else return false; } void OSCParameterInterface::setValue (juce::String paramID, float value) { auto range (parameters.getParameterRange (paramID)); parameters.getParameter (paramID)->setValueNotifyingHost (range.convertTo0to1 (value)); } void OSCParameterInterface::oscMessageReceived (const juce::OSCMessage& message) { juce::OSCMessage messageCopy (message); if (! interceptor.interceptOSCMessage (messageCopy)) { juce::String prefix ("/" + juce::String (JucePlugin_Name)); if (message.getAddressPattern().toString().startsWith (prefix)) { juce::OSCMessage msg (message); msg.setAddressPattern (message.getAddressPattern().toString().substring ( juce::String (JucePlugin_Name).length() + 1)); if (processOSCMessage (msg)) return; } if (interceptor.processNotYetConsumedOSCMessage (message)) return; // open/change osc port if (message.getAddressPattern().toString().equalsIgnoreCase ("/openOSCPort") && message.size() == 1) { int newPort = -1; if (message[0].isInt32()) newPort = message[0].getInt32(); else if (message[0].isFloat32()) newPort = static_cast (message[0].getFloat32()); if (newPort > 0) juce::MessageManager::callAsync ([this, newPort]() { oscReceiver.connect (newPort); }); } if (message.getAddressPattern().toString().equalsIgnoreCase ("/flushParams")) juce::MessageManager::callAsync ([this]() { sendParameterChanges (true); }); } } void OSCParameterInterface::oscBundleReceived (const juce::OSCBundle& bundle) { for (int i = 0; i < bundle.size(); ++i) { auto elem = bundle[i]; if (elem.isMessage()) oscMessageReceived (elem.getMessage()); else if (elem.isBundle()) oscBundleReceived (elem.getBundle()); } } void OSCParameterInterface::timerCallback() { sendParameterChanges(); } void OSCParameterInterface::sendParameterChanges (const bool forceSend) { if (! oscSender.isConnected()) return; auto& params = parameters.processor.getParameters(); const int nParams = params.size(); for (int i = 0; i < nParams; ++i) { auto item = params[i]; if (auto* ptr = dynamic_cast ( item)) // that's maybe not the best solution, but it does the job for now { const auto normValue = ptr->getValue(); if (forceSend || lastSentValues[i] != normValue) { lastSentValues.set (i, normValue); const auto paramID = ptr->paramID; auto range (parameters.getParameterRange (paramID)); try { juce::OSCMessage message (address + paramID, range.convertFrom0to1 (normValue)); oscSender.send (message); } catch (...) { }; } } } interceptor.sendAdditionalOSCMessages (oscSender, address); } void OSCParameterInterface::setInterval (const int interValInMilliseconds) { startTimer (juce::jlimit (1, 1000, interValInMilliseconds)); } void OSCParameterInterface::setOSCAddress (juce::String newAddress) { if (newAddress.isEmpty()) address = "/"; else { newAddress = newAddress.trimCharactersAtStart ("/"); newAddress = newAddress.trimCharactersAtEnd ("/"); newAddress = newAddress.removeCharacters (" öäü#*,?[]{}"); if (newAddress.isEmpty()) address = "/"; else address = "/" + newAddress + "/"; } } juce::ValueTree OSCParameterInterface::getConfig() const { juce::ValueTree config ("OSCConfig"); config.setProperty ("ReceiverPort", oscReceiver.getPortNumber(), nullptr); config.setProperty ("SenderIP", oscSender.getHostName(), nullptr); config.setProperty ("SenderPort", oscSender.getPortNumber(), nullptr); config.setProperty ("SenderOSCAddress", getOSCAddress(), nullptr); config.setProperty ("SenderInterval", getInterval(), nullptr); return config; } void OSCParameterInterface::setConfig (juce::ValueTree config) { jassert (config.hasType ("OSCConfig")); oscReceiver.connect (config.getProperty ("ReceiverPort", -1)); setOSCAddress (config.getProperty ("SenderOSCAddress", juce::String (JucePlugin_Name))); setInterval (config.getProperty ("SenderInterval", 100)); oscSender.connect (config.getProperty ("SenderIP", ""), config.getProperty ("SenderPort", -1)); } IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/OSC/OSCStatus.cpp0000664002537200253720000003732515257173642027633 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2018 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #include "OSCStatus.h" OSCDialogWindow::OSCDialogWindow (OSCParameterInterface& oscInterface, OSCReceiverPlus& oscReceiver, OSCSenderPlus& oscSender) : interface (oscInterface), receiver (oscReceiver), sender (oscSender) { //==== Receiver ===================================== isReceiverConnected = receiver.isConnected(); addAndMakeVisible (receiverGroup); receiverGroup.setText ("OSC Receiver"); addAndMakeVisible (slRecPort); slRecPort.setText ("Listen to port", false, juce::Justification::centred); addAndMakeVisible (lbRPort); const int receiverPort = receiver.getPortNumber(); lbRPort.setText (receiverPort == -1 ? "none" : juce::String (receiverPort), juce::NotificationType::dontSendNotification); lbRPort.setEditable (true); lbRPort.setJustificationType (juce::Justification::centred); lbRPort.addListener (this); addAndMakeVisible (tbReceiverOpen); tbReceiverOpen.setButtonText (isReceiverConnected ? "CLOSE" : "OPEN"); tbReceiverOpen.setColour (juce::TextButton::buttonColourId, isReceiverConnected ? juce::Colours::orangered : juce::Colours::limegreen); tbReceiverOpen.onClick = [this]() { checkPortAndConnectReceiver(); }; //==== Receiver ===================================== isSenderConnected = sender.isConnected(); addAndMakeVisible (senderGroup); senderGroup.setText ("OSC Sender"); addAndMakeVisible (lbSPort); const int senderPort = sender.getPortNumber(); lbSPort.setText (senderPort == -1 ? "none" : juce::String (senderPort), juce::NotificationType::dontSendNotification); lbSPort.setEditable (true); lbSPort.setJustificationType (juce::Justification::centred); lbSPort.addListener (this); addAndMakeVisible (lbSHostname); const auto senderHostName = sender.getHostName(); lbSHostname.setText (senderHostName, juce::NotificationType::dontSendNotification); lbSHostname.setEditable (true); lbSHostname.setJustificationType (juce::Justification::centred); lbSHostname.addListener (this); addAndMakeVisible (lbSOSCAddress); const auto senderOSCAddress = interface.getOSCAddress(); lbSOSCAddress.setText (senderOSCAddress, juce::NotificationType::dontSendNotification); lbSOSCAddress.setEditable (true); lbSOSCAddress.setJustificationType (juce::Justification::centred); lbSOSCAddress.onTextChange = [this]() { updateOSCAddress(); }; addAndMakeVisible (tbSenderOpen); tbSenderOpen.setButtonText (isSenderConnected ? "DISCONNECT" : "CONNECT"); tbSenderOpen.setColour (juce::TextButton::buttonColourId, isSenderConnected ? juce::Colours::orangered : juce::Colours::limegreen); tbSenderOpen.onClick = [this]() { checkPortAndConnectSender(); }; addAndMakeVisible (slSendIP); slSendIP.setText ("IP", false, juce::Justification::centred); addAndMakeVisible (slSendPort); slSendPort.setText ("Port", false, juce::Justification::centred); addAndMakeVisible (slSendName); slSendName.setText ("OSC Addr.", false, juce::Justification::centred); addAndMakeVisible (tbFlush); tbFlush.setButtonText ("Flush Params"); tbFlush.setColour (juce::TextButton::buttonColourId, juce::Colours::cornflowerblue); tbFlush.onClick = [this]() { interface.sendParameterChanges (true); }; addAndMakeVisible (intervalSlider); intervalSlider.setRange (1, 1000, 1); intervalSlider.setValue (interface.getInterval()); intervalSlider.setSliderStyle (juce::Slider::RotaryVerticalDrag); intervalSlider.setColour (juce::Slider::rotarySliderOutlineColourId, juce::Colours::cornflowerblue); intervalSlider.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 60, 14); intervalSlider.setTextValueSuffix (" ms"); intervalSlider.onValueChange = [&]() { interface.setInterval (intervalSlider.getValue()); }; addAndMakeVisible (slInterval); slInterval.setText ("Interval"); startTimer (500); } void OSCDialogWindow::timerCallback() { bool shouldReceiverBeConnected = receiver.isConnected(); if (isReceiverConnected != shouldReceiverBeConnected) { isReceiverConnected = shouldReceiverBeConnected; tbReceiverOpen.setButtonText (isReceiverConnected ? "CLOSE" : "OPEN"); tbReceiverOpen.setColour (juce::TextButton::buttonColourId, isReceiverConnected ? juce::Colours::orangered : juce::Colours::limegreen); repaint(); } bool shouldSenderBeConnected = sender.isConnected(); if (isSenderConnected != shouldSenderBeConnected) { isSenderConnected = shouldSenderBeConnected; tbSenderOpen.setButtonText (isSenderConnected ? "DISCONNECT" : "CONNECT"); tbSenderOpen.setColour (juce::TextButton::buttonColourId, isSenderConnected ? juce::Colours::orangered : juce::Colours::limegreen); repaint(); } } void OSCDialogWindow::updateOSCAddress() { interface.setOSCAddress (lbSOSCAddress.getText()); lbSOSCAddress.setText (interface.getOSCAddress(), juce::NotificationType::dontSendNotification); } void OSCDialogWindow::labelTextChanged (juce::Label* labelThatHasChanged) { if (labelThatHasChanged == &lbRPort) { DBG ("Receiver label changed"); auto val = lbRPort.getTextValue(); const int v = val.getValue(); if (receiver.isConnected()) { if (v == -1 || (v >= minPortNumber && v <= maxPortNumber)) { receiver.disconnect(); checkPortAndConnectReceiver(); } } } else if (labelThatHasChanged == &lbSPort || labelThatHasChanged == &lbSHostname) { DBG ("Sender label changed"); if (sender.isConnected()) { sender.disconnect(); checkPortAndConnectSender(); } } } void OSCDialogWindow::checkPortAndConnectSender() { if (sender.isConnected()) { sender.disconnect(); } else { if (lbSPort.getText() == "none" || lbSPort.getText() == "off") { sender.connect ("", -1); lbSPort.setText ("none", juce::NotificationType::dontSendNotification); } auto val = lbSPort.getTextValue(); const int v = val.getValue(); const auto ip = lbSHostname.getText(); if (v == -1 || (v >= minPortNumber && v <= maxPortNumber)) { if (! sender.connect (ip, v)) { juce::AlertWindow alert ( "Connection could not be established!", "Make sure the desired port is available and not already occupied by other clients. Also make sure the IP has a correct format!", juce::AlertWindow::NoIcon, this); alert.setLookAndFeel (&getLookAndFeel()); alert.addButton ("OK", 1, juce::KeyPress (juce::KeyPress::returnKey, 0, 0)); alert.runModalLoop(); } } } } void OSCDialogWindow::checkPortAndConnectReceiver() { if (receiver.isConnected()) { receiver.disconnect(); } else { if (lbRPort.getText() == "none" || lbRPort.getText() == "off") { receiver.connect (-1); lbRPort.setText ("none", juce::NotificationType::dontSendNotification); } auto val = lbRPort.getTextValue(); int v = val.getValue(); if (v == -1 || (v >= minPortNumber && v <= maxPortNumber)) { if (! receiver.connect (v)) { juce::AlertWindow alert ( "Connection could not be established!", "Make sure the desired port is available and not already occupied by other clients.", juce::AlertWindow::NoIcon, this); alert.setLookAndFeel (&getLookAndFeel()); alert.addButton ("OK", 1, juce::KeyPress (juce::KeyPress::returnKey, 0, 0)); alert.runModalLoop(); } } } } void OSCDialogWindow::resized() { auto bounds = getLocalBounds(); //==== Receiver ================= receiverGroup.setBounds (bounds.removeFromTop (25)); auto row = bounds.removeFromTop (20); slRecPort.setBounds (row.removeFromLeft (80)); row.removeFromLeft (3); lbRPort.setBounds (row.removeFromLeft (50)); row.removeFromLeft (8); tbReceiverOpen.setBounds (row); bounds.removeFromTop (10); //==== Sender ================= senderGroup.setBounds (bounds.removeFromTop (25)); row = bounds.removeFromTop (20); slSendIP.setBounds (row.removeFromLeft (40)); row.removeFromLeft (3); lbSHostname.setBounds (row); bounds.removeFromTop (5); row = bounds.removeFromTop (20); slSendPort.setBounds (row.removeFromLeft (40)); row.removeFromLeft (3); lbSPort.setBounds (row.removeFromLeft (50)); row.removeFromLeft (8); tbSenderOpen.setBounds (row); bounds.removeFromTop (5); row = bounds.removeFromTop (20); slSendName.setBounds (row.removeFromLeft (60)); row.removeFromLeft (1); lbSOSCAddress.setBounds (row); bounds.removeFromTop (5); row = bounds.removeFromTop (50); slInterval.setBounds (row.removeFromLeft (40)); row.removeFromLeft (3); intervalSlider.setBounds (row.removeFromLeft (60)); row.reduce (0, 15); tbFlush.setBounds (row.removeFromRight (80)); } //============================================================================== /* */ OSCStatus::OSCStatus (OSCParameterInterface& oscInterface) : oscParameterInterface (oscInterface), oscReceiver (oscInterface.getOSCReceiver()), oscSender (oscInterface.getOSCSender()) { isReceiverOpen = oscReceiver.isConnected(); startTimer (500); } void OSCStatus::timerCallback() { const int receiverPort = oscReceiver.getPortNumber(); const int senderPort = oscSender.getPortNumber(); const juce::String senderHostName = oscSender.getHostName(); bool shouldReceiverBeConnected = oscReceiver.isConnected(); bool shouldSenderBeConnected = oscSender.isConnected(); if (isReceiverOpen != shouldReceiverBeConnected || lastReceiverPort != receiverPort) { lastReceiverPort = receiverPort; isReceiverOpen = shouldReceiverBeConnected; repaint(); } if (isSenderOpen != shouldSenderBeConnected || lastSenderPort != senderPort || lastSenderHostName != senderHostName) { lastSenderPort = senderPort; lastSenderHostName = senderHostName; isSenderOpen = shouldSenderBeConnected; repaint(); } } void OSCStatus::mouseMove (const juce::MouseEvent& event) { if (! mouseOver && bounds.contains (event.getPosition())) { setMouseCursor (juce::MouseCursor::PointingHandCursor); mouseOver = true; repaint(); } else if (mouseOver && ! bounds.contains (event.getPosition())) { setMouseCursor (juce::MouseCursor::NormalCursor); mouseOver = false; repaint(); } } void OSCStatus::mouseExit (const juce::MouseEvent& event) { ignoreUnused (event); mouseOver = false; repaint(); } void OSCStatus::mouseUp (const juce::MouseEvent& event) { if (bounds.contains (event.getPosition())) { auto dialogWindow = std::make_unique (oscParameterInterface, oscReceiver, oscSender); dialogWindow->setSize (211, 210); juce::CallOutBox& myBox = juce::CallOutBox::launchAsynchronously ( std::move (dialogWindow), getScreenBounds().removeFromLeft (bounds.getWidth()), nullptr); myBox.setLookAndFeel (&getLookAndFeel()); } } void OSCStatus::paint (juce::Graphics& g) { juce::Colour receiveStatusColor = oscReceiver.getPortNumber() == -1 ? juce::Colours::white.withAlpha (0.1f) : oscReceiver.isConnected() ? juce::Colours::limegreen : juce::Colours::red.withAlpha (0.5f); juce::Colour sendStatusColor = oscSender.getPortNumber() == -1 ? juce::Colours::white.withAlpha (0.1f) : oscSender.isConnected() ? juce::Colours::limegreen : juce::Colours::red.withAlpha (0.5f); const float alpha = mouseOver ? 1.0f : 0.5f; auto area = getLocalBounds(); area = area.removeFromBottom (12); auto circleArea = area.removeFromLeft (12).toFloat().reduced (2.0f); circleArea.setY (circleArea.getY() - 1.0f); g.setColour (receiveStatusColor.withAlpha (alpha)); g.drawRoundedRectangle (circleArea, 6, 1.0f); g.setColour (receiveStatusColor); g.fillRoundedRectangle (circleArea.removeFromLeft (14).reduced (2.0f), 6); area.removeFromLeft (2); circleArea = area.removeFromLeft (12).toFloat().reduced (2.0f); circleArea.setY (circleArea.getY() - 1.0f); g.setColour (sendStatusColor.withAlpha (alpha)); g.drawRoundedRectangle (circleArea, 6, 1.0f); g.setColour (sendStatusColor); g.fillRoundedRectangle (circleArea.removeFromLeft (14).reduced (2.0f), 6); area.removeFromLeft (2); g.setColour (juce::Colours::white.withAlpha (mouseOver ? 1.0f : 0.5f)); auto currentFont = juce::FontOptions (getLookAndFeel().getTypefaceForFont (juce::FontOptions (14.0f, 0))) .withHeight (14.0f); g.setFont (currentFont); juce::AttributedString text; text.setText ("OSC"); if (oscReceiver.isConnected() || oscSender.isConnected()) { text.append (" ("); if (oscReceiver.isConnected()) text.append ("IN: " + juce::String (oscReceiver.getPortNumber())); if (oscReceiver.isConnected() && oscSender.isConnected()) text.append (" - "); if (oscSender.isConnected()) text.append ("OUT: " + oscSender.getHostName() + ":" + juce::String (oscSender.getPortNumber())); text.append (")"); } text.setFont (currentFont); text.setColour (juce::Colours::white.withAlpha (mouseOver ? 1.0f : 0.5f)); text.setJustification (juce::Justification::bottomLeft); auto maxWidth = area.getWidth(); juce::TextLayout layout; layout.createLayout (text, maxWidth); auto textWidth = static_cast (std::ceil (layout.getWidth())); const int targetSize = 12 + 2 + textWidth + 2 + 12; bounds = getLocalBounds().removeFromLeft (targetSize); juce::Rectangle areaFl = area.toFloat(); layout.draw (g, area.toFloat().withWidth (textWidth)); } IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/lookAndFeel/0000775002537200253720000000000015257173642027024 5ustar zmoelnigzmoelnig././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/lookAndFeel/Roboto-Medium.ttfIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/lookAndFeel/Roboto-Medium.0000664002537200253720000041413415257173642031516 0ustar zmoelnigzmoelnigGPOScÕ�ÃèOGSUB@ˆ&ùVLTSH"ÔŽ$OS/2º+@˜`cmap$ó;¡4Ìcvt ßñì0fpgm/æN«¼gaspÃÜ glyfÇ»­�'4tLhead÷¶(§6hhea  ET$hmtxŽD£ø,loca÷*T8maxp8Þx nameÏÎG›€¤post®s5 $#¶prep@Ÿi¼.Ù/¨_<õÄð.ÎÌ-üýÕ ry býÕ 2üÿ2   —_æ¡ôš3š3ÑfàïP [ Goog ÿýbýÕb+ ŸO:° þþþ%š˜Bâ<Œeàd>ZB·€¼uDÎ6 G<™GŒhŒ³ŒRŒPŒ8Œ‚ŒtŒEŒaŒR%™ i?Ž‘*€ä,!J( ŸjBŸ£Ÿ¤Ÿgn°ŸM­|;(ŸTŸŸ°Ÿvg+Ÿ†gLŸ[¡t†(2ö ÀX1„W1 k5œ”PZRˆ€3QˆS<YÏ*ˆTˆ}�ÿ°0��õ€ˆ~ˆSˆ€ˆSÅ€)RȈ{ ú%!U¯8®¯Quþ�}[µQ�]àüˆø\¤DW‘tâbm GDWÛ‡ K_alcb±x»’>B m5W§wâj °f°Ùr`((((((…ÿöj£Ÿ£Ÿ£ŸMÿÓM­MÿÙMÿ¾`$°ŸvgvgvgvgvgDM{gt†t†t†t†ö Ê”çˆZRZRZRZRZRZRÁ43Q<Y<Y<Y<Yÿ¶�ÿ¼ÿ¡º<ˆ~ˆSˆSˆSˆSˆS‘C‰Sˆ{ˆ{ˆ{ˆ{—Š(ZR(ZR(ZRj3Qj3Qj3Qj3QBŸS`$¦S£Ÿ<Y£Ÿ<Y£Ÿ<Y£Ÿ<Y£Ÿ<YgnˆTgnˆTgnˆTgnˆT°Ÿˆ}¢¦ÿýMÿÀÿ£MÿÀÿ£MÿçÿÊM+M£�É­,�|;&ÿµ(Ÿ0�˜ŽTŸ�TŸlTŸ©�TŸï�$?°Ÿˆ~°Ÿˆ~°Ÿˆ~ˆÿâ’“ˆ~vgˆSvgˆSvgˆS´e;SLŸÅ€LŸÅjLŸÅD[)R[)R[)R[)R¡È¡ð¡Èÿôt†ˆ{t†ˆ{t†ˆ{t†ˆ{t†ˆ{t†ˆ{(ú%ö ö ÀXUÀXUÀXU ‹Ðÿ݉bŸS¥†£{&ÿµ(ZR…ÿöÁ4{g‰S[)R&ÿµ�Eæ›°y|vOš²‚MJØ€/vœ«üÛý6ü†ý>üý"]×<�(B ÿ°ÿݱÿäŠZÿbo¦ÿ±( ŸuŸ½£ŸÀX°Ÿ{gM­(Ÿ9#Ÿ°Ÿ‘pvg±Ÿ+Ÿ‘G¡ö ¿H2§H[lMÿ¾ö „V``ˆ~¦©ˆ€„VÆ– ˆS``aˆ~¢n¦©˜Žo$»’ ,dˆS÷Oˆ€7Q�R2Cˆ€ÐDb>ÉOÖ_¦ÿň€ˆSˆ€Ö_.uuÿîq3£Ÿ£ŸuŸ>{[M­Mÿ¾|;Š.‘Ÿ(Ÿªš ?«™(Ž ŸuŸ£ŸWhªšªš(Ÿ©.Ÿ°Ÿvg±Ÿ+Ÿj¡2&§ˆ�ù¥<‰T­ZRˆˆT~<Yˆ~ˆ~[ŽuŽˆ~ˆSˆ~ˆ€3Q"<!Ð~stƒ~ÿ~z¢gŽ<Rƒ�ˆA<Y<Y‰ÿìT~=[)R�ÿ¡ÿ°ñ0ï~‰[Žˆ~ˆ~ÿ× ` BÀ6°í„æ‚ 2­ù�!)ð3§HÉO ÿé „g–S{g‰SjJ\ÿm�F·‡Å°Ô9ÔKªšˆ~ÿ×jŽ¢~uÿ÷Tÿâ(Ÿ[Ž*”ƒŽ<ÿÝDÿ̰Ÿˆ~ÑŸ«~¡"<ö  ö  2!62‘&ˆ�stu�st‡ms{° ÄÿÎM­©.u°Ÿˆ~°Ÿˆ~ˆ�stŸŽM­(ZR(ZR…ÿöÁ4£Ÿ<Y¶W>i¶W>išvWhO¦^¦^ªšˆ~ªšˆ~vgˆS<‰<Rˆ�stuŸT~ù¥z¢ÇFSG2!2!TˆSëfÝ^S;(/{I?u¾C�?þ˜žwb,Uª"DW‡``©.u(ZRŸõ€(ú%(ú%(ú%(ZR(ZR(ZR(ÿÝZÿo(ZR(ZR(ZR(ZR(ZR(ZR(ZR(ZR£Ÿ<Y£Ÿ<Y£Ÿ<Y£Ÿ<Y£ÿ²<ÿq£Ÿ<Y£Ÿ<Y£Ÿ<YM­�MŸ‚vgˆSvgˆSvgˆSvˆÿŒvgˆSvgˆSvgˆS‰bŸS‰bŸS‰bŸS‰bŸS‰bŸSt†ˆ{t†ˆ{¥†£{¥†£{¥†£{¥†£{¥†£{ö ö ö ö vÿ1))¹ \0¢Ñ‡§�¬�¬��B�E�B¨êBòEÛB]@™\ˈú™¦™¨KZB˜BrliTJšœ-©?\i¤µO¸™¦SMKåqâEÈ– d–Écaf‘hï^»C–¦Ù@ƒž²;Ed!ÿ²ŽeL‘F–K’$ñQ¨â*w*±*0Y5\ÿ Jlƒhf`=me9"OÿSzG†mMJUŒ,4±~2<pQ¨ŽÝhÐ~Êf!޹—޽ŽwŽ/ŽŽÛh*ŽGޝޔhŒŽ�¡vÈ j ÿ3 c d¡v¡v¡v³\Mÿ°'ÿž5ŠU§^ŸAŸŒŸ�ùËmŸ\ŒŽ2Ovpvj‹MfbUl²–3WŸp*?CR¯<R|v¯ÿë¯ÿë2<ÈÈÈÈÈÈÈ”hGŽGŽGŽGŽÿ³Žÿ¹ÿž!ŽÊfÊfÊfÊfÊf~~~~UÈÈÈ”h”h”h”h¯ŽGŽGŽGŽGŽGŽÛhÛhÛhÛhŽÿ ~ÿÇ<…/w޽^½Ž½Ž½Ž!Ž!Ž!ŽÊfÊfÊf¨Ž¨Ž¨ŽpQpQpQpQ2<2<~~~~àQMJMJMJUU4~ÿ$_5&š ?`Ošžúž”û-}[ö(vOÓTC�Opgÿà)¢†{i‰R>�DtC�PpgÿàŸ‡€·Ÿ ~švÓhO–4¤>GŸõ~%iÿaj3Q& ÄÿΚv”xŽ{i‰R{i‰R ? ? ?£Ÿ   $#%'"' & "*#"#&''''''""""######"'#'#'#&&"'    &&&    """"""'# )/2''$'  #/&$$ "&' ' $ '0#.$ .*)  + $'.0$0'#'#""(/&&  0$%' $'#'#'#'#'#'#'#'#'#'#'#'#'#"" $$*&/%$ (1 %&/-1/)2+/'///////1111%///1111-////%%(/'&'(/( (ÜÀ°€0 ~ÈÉ’¡°ðÿ7¼ÇÉÝó #ŠŒ¡ÎÒÖ"7CJ_eq†Œ«½Äçò?…ùM   " & 0 3 : < D t  ¤ § ¬!!!!"!&!.!^"""""""+"H"`"e%ÊöÃûþÿÿýÿÿ  ÉÊ’ ¯ðú7¼ÆÉØó #„ŒŽ£ÑÖ#8DK`fr€ˆ�¬¾Åèó>€ M   % 0 2 9 < D t  £ § «!!!!"!&!.!["""""""+"H"`"d%ÊöÃûþÿÿüÿÿÿõÿãÿÂAÿÁÿ¯ÿ¢ÿ•ÿVÿMÿ5ÿþ”þ‹ý¨þ{þfþZþYþTþOþ<ýÜýÛýÚýÙý×ýÔý§ýœýšý•ý�ýŒý{ýuýnä‚äFäãìã™âçâàâßâÞâÜâÓâÒâÍâÌâÅâ–âŒâiâgâdâ áÿáýáòà\áçá»áßhá á ááàõàÙàÂà¿Ý[ c&,0x¢ÈÒÚð*4«¬Î­®¯°±²³´Ïµ¶·¸¹º»¼Ð½ÑÒÓÊËÌÔÕÖÍ×ÎÏØÐÙÑÒÚÓÛÜÝàáâãäÞßàúáâãäåæç    èéêëìíîïðñòóô !"õö#$%&÷øùúûüýþ9ÿ]^_` ð ó  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`a†‡‰ ’—�¢¡£¥¤¦¨ª©«¬®­¯°²´³µ·¶»º¼½þrdeix pkvj"ˆ™s#$gw™ l|‚§¹�cnA!nm}b‚…–óôûü÷ø¸%À9 '(ÿyùý„‹ƒŒŠŽ���”•“›œšòQWqSTUzXVR°,K° PX±ŽY¸ÿ…°„± _^-°, EiD°`-°,°*!-°, F°%FRX#Y Š ŠIdŠ F had°%F hadRX#eŠY/ °SXi °TX!°@Yi °TX!°@eYY:-°, F°%FRX#ŠY F jad°%F jadRX#ŠY/ý-°,K °&PXQX°€D°@DY!! E°ÀPX°ÀD!YY-°, EiD°` E}iD°`-°,°*-°,K °&SX°@°YŠŠ °&SX#!°€ŠŠŠ#Y °&SX#!°ÀŠŠŠ#Y °&SX#!¸ŠŠŠ#Y °&SX#!¸@ŠŠŠ#Y °&SX°%E¸€PX#!¸€#!°%E#!#!Y!YD-° ,KSXED!!Y-° ,°E-° ,°E-° ,±'ˆ ŠSX¹@c¸ˆTX¹èpY°#SX° ˆ¸TX¹èpYYY-° ,°@ˆ¸ ZX±D¹èDY-° +°+²+·:0%+·N@2$+·K5%+·TE6$+·mYE2+·QB3$+·C7++²+° E}iD²0 s²p s²€ s²Ð s² t²? s²_ s² s²/ t²O t²o t²� t²¯ t²ÿ t² u²? u²_ u² u²s²s²ïs²t²_t²�t²Ït²ÿt²?u²ou²¿s²/t²Ÿt²¿t²u²/u²/s²_s²ÿs²Ït²/s²?s²s*Ã’˜‡hŒªþ`:°�! ,ZÔJÚŽªÔþ.Th€š².„J°PÈ0@P€®Þ:î 8 ¦ ü > †  ( ‚ ž Ô  B ¦ ô F Œ èL²ÞRºD~¤¼àXâ@�îR Z†Ê.šà2�ì,°D~â<’Ì(l²²ÚDªpš>`ôŽš´¼f|È h!!@!�!º!Ð""<"†"’"¬"Æ"à#8#J#\#n#€#–#¬$"$.$@$R$h$z$Œ$ž$´%"%4%F%X%j%|%’%Ä&B&T&f&x&Ž& &î'T'f'x'Š'œ'°'Æ(Ž(š(¬(¾(Ð(ä(ö)))0)Ê)Ü)î***$*8*p*ê*ü++ +4+F+¤+¸+Ê+Ü+î,, ,,*,<,N,`,r,„,–,¨,º,Ð->-¸-Ê-Ü-î...$.0.<.N.`.r.„.–.¨.º.Ì.Ø.ê.ü//t/Ö/è/ú0 0000B0N0Z0l0ˆ0”0 0²0Ä0Ð0Ü1.1@1R1^1j1€1–1¦1¶22D2V2h2t2€2’2¤2º33t3†3˜3ª3¼3Ò3è4r555*565B5T5f5x5Š5œ5®5º5Æ5Ø5ä5ð5ü66$6h6Ð6â6ô777*7<7R7h7~7”7 7¬7¾7Ð7â7ô8 88.8@8R8d8v8¨99|9Þ:2:Œ:ž:¶:Î:à:ò;;;";.;`;r;˜;¾;î<$>0>8>D>P>\>h>t>€>˜> >¨>Ð?????’?š?¢?Ð?Ø?à@"@*@Z@b@®@¶@¾A0A8A�AøBB$B6BHBZBlB„BúChCœDD€DÜE"E¢EÔEÜFxPxbxtxŠx x¬x¸xÊxÜxòy y y4yJy^ytyˆyžy´yÊyÞyôzzz2zHz\zrzˆz”z z²zÄzÖzèzþ{{({<{R{f{|{�{¦{¼{Î{à{ì{ø|||"|4|J|^|t|ˆ|ž|²|È|Ü|ò}}},}>}P}b}t}†}˜}¤}°}¼}È}Ú}ì}þ~~"~4~F~X~j~|~ˆ~”~¦~¸~Ä~Ð~â~ô$$$$$$$$$$$$$.8Bbz”¨´Ì䀀D€¦€Â€Î€Þ�ž�¦�®�Æ�Þ�ê�þ‚<‚†‚ÖƒVƒÞƒî„p… …v…�…æ†D†^†x†’†¬‡‡,‡x‡�‡ÄˆFˆŽ‰&‰n‰˜‰Â‰úŠŠvŠ‚ŠŽŠžŠžŒ<ŒšŒ¦ŒÒ�R�¸ŽŽ`Žà�2�\�¨�â��^�¶�ê‘&‘R‘Ð’6’Ž’Þ“*“r“Š“â””\”’”®••f•°•ô–4–†———b—¬—ì˜*˜€˜æ™(™ˆ™öššBšnš˜šÄ››˜›àœFœ°œæ�^�Æž žržÚŸ@Ÿ„   ^ ¶ Ü¡$¡ˆ¢¢4¢f¢n¢z¢†¢’¢¤¢¶¢È¢Ú¢î£££(£:£L£^£r£„£–£¨£¾£Ð£â£ô¤¤¤,¤>¤P¤b¤v¤ˆ¤š¤¬¤¸¤Ê¤Ü¤î¥¥¥$¥6¥H¥T¥f¥x¥Š¥œ¥¨¥º¥Ì¥â¥ô¦¦¦$¦0¦B¦N¦d¦t¦†¦’¦¤¦¶¦È¦Þ¦ð¦ü§§ §2§>§P§\§n§€§’§¤§º§Æ§Ø§ê§ü¨¨"¨4¨@¨¤¨ö©H©¦©öª\ª˜ªÞ«0«v«Ê¬B¬�¬þ­€®®^®²¯¯d¯æ°†±±ˆ±Ô±à²œ³X³Ì´@´œ´îµ^µ²µþ¶ ¶¶"¶.¶€¶Ö·4·‚¸¸œ¸¨¸´¸À¸Ì¸Þ¸ð¹J¹œ¹¤¹¬¹Â¹Ö¹è¹þºº&š�°1°EX°/±>Y°EX°/±>Y°° +XØÜY²9°/01#3#53�óóóóëÅúPêBV -°EX°/±>Y°EX°/±>Y°°° +XØÜY°Ð01#3#3fpÖ>fpÖù þíù <˜°†°EX° /± >Y°EX°/±>Y² 9° /´? O ]² 9°/±° +X!ØôY°а ±° +X!ØôY° °а °а°а°аа°аа°а°Ð01###5!#5!3333#3##3#«áL§Lç:óN§NàN¨NÐî:ÝûL§wá:ášþfšž9Ÿ þ` þ`ŸþÇžþf89eÿ-&›,i°EX° /± >Y°EX°"/±">Y²" 9°±° +X!ØôY° ° а °а ±° +X!ØôY°"°а"°'а"±*° +X!ØôY014&'&&546753#4&#"#5&&7733263o‚ÓÓÊ­ «Áòpbffk‹ÓÎÒ¶Ÿ³çì‹hoz|Up.H˯¦ÖÚÜñÇ}’m\Vl1LÈ®­ÎÃÂÝ׎zldÿë‰Å )7;v°8/°:/°EX°/±>Y°EX°&/±&>Y°° ° +XØÜY±° +X!ØôY°±° +X!ØôY°&°° +XØÜY°&±-° +X!ØôY°±4° +X!ØôY014632#"&53326554&#"4632#"&53326554&#"'d¥��¥¥Ž�¦©IDBGIBCH¦Ž�¥¥Ž�¦©KBFDICCHþ}Ç}˜€­¬�M€««€@YXAMAZZAüÍ­¬€N�«¬€@ZWCN@ZZ@øHrH>ÿëóÅ!,9²°/°EX° /± >Y°EX°/±>Y°EX°/±>Y²0 9°0°&д\&l&]¶+&;&K&]²0&9²&09²9´\l]¶+;K]°°д5E]²T]²c]²9°±"° +X!ØôY²%9° ±7° +X!ØôY01467&&546326653!'#"$26776654&#">ˆˆIHίŸÇg^d1(-ÅIJÄþîQR»hÙþþâ>z7þ¸H0~10r9'UEJO‰x±Z_šP«Å¿‡b™EHþ–?–T‰æZè_9;æ$$#ƒ8h0d€«0f>L%Q16UbB°EX°/±>Y°° +XØÜY01#3fpÖþå€þ8¢X °/° /017#&€9¶-†¿¾‡-·þÈPŠ)U†fþ>þ©þ©þ>m€V(Šþ8;X °/° /01#'65'73;þÁ·.…ÀÅ€.¶@@þ{ýÒU€fÈXTÉh�TýÐþ|Ob°° /°EX°/±>Y° ° Ð01%73%'EþÖ5( ®#5þÑÃ�±®�ÌY©uWþ¢s«XþöiþéfD’*¶ ° /°Ð° ±° +X!ØôY°Ð01!!#!5!3®|þ„ìþ‚~ì!ÞþO±Þ•6þçkî°/01%#53k›šFïþÈAÆG TͰ/±° +X!ØôY01!5!Týó  Ä™‹é°EX°/±>Y°° +XØÜY01!#53‹òòéÿƒ°°/°EX°/±>Y01#3áß=ß}-hÿë#Å ;°EX° /± >Y°EX°/±>Y° ±° +X!ØôY°±° +X!ØôY01#"32'4&#"3265#ÿÜÝþþÝÜóxsswyssv1þäþÖ*M,þÔþå%³¬¬³þk´­¬µ³Î°6°EX°/±>Y°EX°/±>Y°°° +XØÜY±° +X!ØôY01!#!5%ÎóþØɳ4R4ÅR°EX°/±>Y°EX°/±>Y±° +X!ØôY²9²9°± ° +X!ØôY°° а°Ð01!!56654&#"#'&32!4ü9ÚtXra€|ëæÒô�”þ¼�§£Nb„�~ è»}ä£þªPÿëÅ*~°/°EX°/±>Y°EX°/±>Y²?q²Ïq²ÿq²_q²ï]²Ÿ]°±° +X!ØôY°° а±*° +X!ØôY²*9°°а±#° +X!ØôY0132654&#"#'&$32#"$77332654&##†©vhpmc}êÊÕþri|uþíÖÊþíê‚lq‚w}©Fukisq\§ãØÇ]®0,´sÈå×¾axzp{u8Y° L°/°EX° /± >Y°EX°/±>Y´�]°±° +X!ØôY°а° в 9° °Ð013##!'3!'¡¸¸òý�oúý‡‡Äþ½C•ØüWO+‚ÿë&°e°EX°/±>Y°EX°/±>Y°±° +X!ØôY²9°/°°а±° +X!ØôY°±° +X!ØôY°°вv]01!!6676#"$?32654&#"œTýÉ,+qGÍèôçÀþ÷ã|cqwzqda‹%Òþ“ )þøåÖþðÓÂjvŸƒ„¥A=tÿëFÅ'Q°EX°/±>Y°EX°/±>Y°±° +X!ØôY²9°/±° +X!ØôY°±"° +X!ØôY012&&#"6632#""32654&¨N�9.8jF’±<Ÿ_ÃãþüÓÞþãA¯\€"•tjz€Å!¼á¿7<þïÓßþâ8XýJA8h¹È¶…ƒ¤E3° /°EX° /± >Y°EX°/±>Y° ± ° +X!ØôY°Ð01#77!5!3û°(ó'êÊüýîíþÙþ&þ®ššJðÃaÿë*Å#/_°EX°/±>Y°EX° /± >Y²- 9°-/±° +X!ØôY²-9²-9° ±!° +X!ØôY°±'° +X!ØôY01#"$5467&&546324&#"3264&#"326xgw�þô×Úþô‹yhvõÉÇù͉jl…„ok†&r[^mo^\o0nª-.¸xË××Ëx¸/,©oÂÓÓü§k†…ln~û`{wdcwwRÿëÅ'N°EX° /± >Y°EX°/±>Y±° +X!ØôY² 9°/±° +X!ØôY° ±"° +X!ØôY01%2655#"5432#"&'726754&#"‚ 1�TÐñÇâþ×ëK C =€x[€ ‚xb„y­Á¹CCEåÚþ×þéþ«þìþϺòH9‚­³¯…ˆ§ÿÿ™‹U&l°/01ÿÿiþçžU'l3°/01?V„ÿ /°/²¿]²]´�]²_]±° +X!ØôY²9015BBü»E/ÚótÁtò‘nïà4²+´@P]°±° +X!ØôY´@P]°±° +X!ØôY01!5!!5!ïü¢^ü¢^ÊýŽÉ€Vàÿ /°/²¿]²]´�]²_]±° +X!ØôY²90155%77'€`ü ]ïþŒÁþŒïâ, ÅT°EX°/±>Y°EX°/±>Y°° +XØÜY²9°/²9°± ° +X!ØôY°° в9016676654&#"#'&632#53T@nN\iaStêõÂÒë“p9øøœ�{]L‹Tak[Y²ÇÖ¾ÙZ2ZWþdéJþ;Ó�3C€°1/°/°+/°EX° /± >Y°EX°/±>Y² 9° ±7° +X!ØôY²¿7]°а1±° +X!ØôY²°]°+±$° +X!ØôY²¿$]°±A° +X!ØôY²°A]01#"&'#"&73233267! !267# ! 3267467&&#"à æåKm/Š\…�é¦n‡P34+w�þÈþ¸þÎþ‘K6W´@&CÏcþ}þZÔ{˜ûþ Y°EX°/±>Y°EX°/±>Y²9°/²_]± ° +X!ØôY°° д[ k ]²; ]01!#3#!#´ýÆtöæ÷ý™¯ÓTþ¬°úPnŸ¼° r°/°EX°/±>Y°EX°/±>Y²_q²ÿq²or²Ïq²ï]²Ÿ]°±° +X!ØôY²9°±° +X!ØôY°±° +X!ØôY013!2#!2654&#%!2654&##Ÿäòre‚ŒþôìþÎ2~ˆryþ³ qƒŠ…ñ°ÇÆcœ&ÀÍÕ–þ,smt€µkblijÿëÌÅD°EX° /± >Y°EX°/±>Y°Ð° °а ±° +X!ØôY°±° +X!ØôY01#"3 #4&#"3265ÅþÙüÿþÁ;ü)럛•¯³˜—œãÝþëW  Yþñ哤ì²þé´ì¢”Ÿç° ;°EX°/±>Y°EX°/±>Y°± ° +X!ØôY°± ° +X!ØôY013! !326554&#ŸØ[þ¥þëåÞµÏϵ°þ¦þðÝþïþ¨íûÕì»ß¹ìŸu° \° /°EX°/±>Y°EX°/±>Y²Ï q²_ q²Ÿ ]° ±° +X!ØôY°±° +X!ØôY°±° +X!ØôY01!!!!!!ýƒãü*Ïý$}�þ3°ÃþeŸv° J|° /°EX°/±>Y°EX°/±>Y²_ q²@ ]° ±° +X!ØôY°±° +X!ØôY01!#!!!ý‚ó×ý~mý“°ÃþCnÿëÜÅ ]°/°EX° /± >Y°EX°/±>Y° °а ±° +X!ØôY°±° +X!ØôY²?]²]°±° +X!ØôY01%# 3 #&&#"3267!5!Ü:þ÷Ðþùþ¬Aþ曓—¹É rŽ þßÅS‡M0MýËx“â®þΰã5$(¶Ÿ° …°EX°/±>Y°EX° /± >Y°EX°/±>Y°EX°/±>Y²9°/²Ÿ]²?q´�Ÿq²ÿq²r´Ïßq´_oq²Ï]²/]²r±° +X!ØôY01!#!#3!3òýtóóŒòmý“°ý€€­ °°EX°/±>Y°EX°/±>Y01!#3 óó°;ÿëæ°/°EX°/±>Y°EX°/±>Y° а± ° +X!ØôY013#"$7733265óóþüÌÛÿë{n`}°ûõÌîÚÒ|t†rŸ/° Y°EX°/±>Y°EX°/±>Y°EX°/±>Y°EX° /± >Y²9°/²Ÿ]±° +X!ØôY² 901##33!!:¨óó‹É ýî;þ×výаý—iýIýŸ/°)°EX°/±>Y°EX°/±>Y±° +X!ØôY01%!!3’�üpó°Ÿb°y°EX°/±>Y°EX°/±>Y°EX°/±>Y°EX° /± >Y°EX°/±>Y° °д4D]²#]´Sc]°° вo ]´N ^ ]´, < ]°Ð013!#'##Ú£¤;óþP£þRó°û `úPðwû˜eýŒþ°Ÿ° j°EX°/±>Y°EX° /± >Y°EX°/±>Y°EX°/±>Y°°жM]m]¶+;]°°д$]´Sc]´2B]01!##373òýzóó†ò'ûÛ°ûÚ$gÿëÅ ;°EX° /± >Y°EX°/±>Y° ±° +X!ØôY°±° +X!ØôY01! ! '4&#"3265þ±þõþúþ¹G Pòæ ºº¡§ÁUþõþ¡_  `þ þö¶êê¶þø¸ë깟ڰ B°EX°/±>Y°EX°/±>Y²9°/± ° +X!ØôY°±° +X!ØôY01#!2#%!2654&#!’ó9ñþïñþºF‡ˆˆ‡þº(ýذùËÍ÷Ã�oo”gÿPÅ!?°EX°/±>Y°EX° /± >Y±° +X!ØôY² 9°±° +X!ØôY01# ! '4&#"3265\Tò¢þô6x@þúþ¹G Pòæ ºº¡§ÁU‡èTë‘_  `þ þö¶êê¶þø¸ë깟ÿ°#V°EX°/±>Y°EX°/±>Y°EX°/±>Y²9°/±° +X!ØôY² 9°±"° +X!ØôY01#!2#&&554&#%!2654&#!’óô up{l &ú(€pþ¼’†„‡þÙ\ý¤°ÜÌq£1'±�y@z !ŽDup„Ãpsn}[ÿë§Å'Q°EX° /± >Y°EX°/±>Y² 9°±° +X!ØôY° ±° +X!ØôY°±%° +X!ØôY014&'&$54$32#4&#"#"$773326´‡«ôþù#æð#é˜�…�›³ëôþÝíäþ¨긓‡–v[t.@Ó«°äþþµp‹t\Sn1?Þ¬¶×ñÒ…ƒm‚°/°EX°/±>Y°EX°/±>Y°±° +X!ØôY°Ð01!#!5!‚þHóþHcíûíÆÿëñ°6°EX°/±>Y°EX°/±>Y°EX°/±>Y± ° +X!ØôY01#"533265ñþÄÿúþÊ󬑖²°ü0òþýñÐü0™šš™Ð° >°EX°/±>Y°EX°/±>Y°EX°/±>Y°Ð@ 4DTd]²]0137!#!m\ýøçýù}ec5úP°(ã°„°EX°/±>Y°EX°/±>Y°EX°/±>Y°EX° /± >Y°EX°/±>Y° °в]@ #3CS]²a]°Ð°° в< ]²O ]²m ]²[ ]´ + ]017373###3#Â&æïþ¦ÝþÝþÜÞþ§ï„)ûÔ )úPûë°2î° U°EX°/±>Y°EX° /± >Y°EX°/±>Y°EX°/±>Y²9°°а°вj]°° Ð01!!!!Š3 þ@ÑþÜþÄþÄþàÊþ@–ý.ý"#ýÝÞÒ é°K°EX°/±>Y°EX°/±>Y°EX°/±>Y²9°°Ð´4D]´Sc]°°Ð01!#!z`þòþìÄüOþ ¤Xq° F°EX°/±>Y°EX°/±>Y±° +X!ØôY²9°±° +X!ØôY² 901%!!5!5!yøûçÛý+ú˜UÃ’„þ¼Ž$°/°/±° +X!ØôY°±° +X!ØôY01#3!!¥¥þh˜Ðù©½Òÿƒa°°/°EX°/±>Y013#ì`ì°ùÓ þ¼¦Ž$°/°/±° +X!ØôY°±° +X!ØôY01!!53# šþf§§Žø.½W5Ù5° °EX°/±>Y°Ð01#3#'#Î+«*Í¥  Ù×ý)�66ÿA˜°EX°/±>Y±° +X!ØôY01!5!˜ük•¿¿P¼ÆR°/²_]²¯]´/q²oq²/r²ßq²Oq²ÿ]²]²?]²]°° +XØÜY¶/]01#7!Äþý ¼RÿëN +•°EX°/± >Y°EX°/±>Y°EX°/±>Y² 9° /´¿ Ï ]²ï q@  � Ÿ ¯ r´O _ q´ � ]´ï ÿ r°±° +X!ØôY²9°±!° +X!ØôY° ±%° +X!ØôY01!&&'#"&5463354&#"#'&632%2675#" 2£e©µøá½d]Sbêóýèýà\“ÁjxQ)N'Lg®˜�¯_U`P?€ÆÀ´þC{;®\; iG>I€ÿë6U°EX° /± >Y°EX°/± >Y°EX°/±>Y°EX°/±>Y°±° +X!ØôY°±° +X!ØôY01#"&'#36632#4&#"32656ÝÉe•2Ìó2Œ]ËÝót~Qm nS~rùíþßROŒý§EJþÄþü©ÐH@þ:AG±—QÿëõND°EX°/± >Y°EX°/±>Y±° +X!ØôY°°а°а±° +X!ØôY01%2653#"55432#4&#"?YzÜþÿµïÿÿïÃóÝu^‰rr­iO˜Ü4ì#ë5ã¯Y|Ç–#™ÅSÿëU°EX°/±>Y°EX°/± >Y°EX°/±>Y°EX° /± >Y°±° +X!ØôY°±° +X!ØôY01323#'#"533267&&#"SÞÉX‹3óÌ4’aÇÞós}Mk""lJ|v=GBSùè†LO"ì–²B=ØY°EX°/±>Y²9°/²�r´�]± ° +X!ØôY°±° +X!ØôY°±° +X!ØôY01"5542!3267"!54&PæþïÌÛéý]‹{bŒAN=Ê¡Zt­i-ì(ì7þ÷ß��¤0-Ÿ6J �ng‚*Ú-T°/°EX°/± >Y°EX°/± >Y°EX°/±>Y°±° +X!ØôY°±° +X!ØôY°°аÐ013#5354632&&#"3#Ï¥¥Ã°#H-1OOÜ܆´~³Â ¼ZT~´üzTþKN+d°EX°/± >Y°EX°/± >Y°EX° /± >Y°EX°/±>Y° ±° +X!ØôY°±!° +X!ØôY°±(° +X!ØôY013273#"&'732655#"533267&&#"TâÉa“3ÊþþíO·J4<‘M„z3‹ZÇâów}Nk!"kK}y>SN�ûÆÑä-%¿#quoAC"앳A=Ú;CÒ§} F°EX°/±>Y°EX°/± >Y°EX°/±>Y°EX°/±>Y°± ° +X!ØôY016632#4&#"#3p6›^¬ÁóffGq%óó®LTÙâým•€r;4üè�ƒ4°EX°/± >Y°EX°/±>Y°°° +XØÜY°° +XØÜY01!#3#53ƒóóóó: Õÿ°þKŽ@°EX°/± >Y°EX°/± >Y± ° +X!ØôY°°° +XØÜY°° +XØÜY01#"&'73265#53Žº¦$: 2>Gíóó:û‡³Ã ÂUZy Õ�< T°EX°/±>Y°EX°/± >Y°EX°/±>Y°EX° /± >Y²9°/±° +X!ØôY² 901##33!!àmòòeþ›šþæÙþ'ü„žþý²�ƒ°EX°/±>Y°EX°/±>Y01!#3ƒóó€uN%c°EX°/± >Y°EX° /± >Y°EX°/± >Y°EX°/±>Y°EX°/±>Y°EX°#/±#>Y° ±° +X!ØôY°Ð0166326632#4&#"#4&#"#^ 5 ij˜&2¤n£½ó__Nlóa^Jgó:�MT``Zfßãýt�ŠpTG ýC�…u94üæ:~ NF°EX°/± >Y°EX°/± >Y°EX°/±>Y°EX°/±>Y°± ° +X!ØôY016632#4&#"#\5¡e©½óegGp$ó:œS]ÍÙýX¦zg?7üï:Sÿë4N#8°EX°/± >Y°EX° /± >Y±° +X!ØôY°±° +X!ØôY0147632#"'&533276554'&#"S„†åé„……„çè…„ó>=ƒ?@@?�?>'ñ›››šòôš™ššóždccdž›deeeš€þ`4NU°EX°/± >Y°EX° /± >Y°EX°/± >Y°EX°/±>Y°±° +X!ØôY°±° +X!ØôY01#"&'#36632#4&#"32654ÞÆ\Ž3óÍ4“aÈßò}|Lj jN|{ùìþÞB@ýóÚˆLPþÃþý¦ÓA:þ9=·•Sþ`üNR°EX°/± >Y°EX°/± >Y°EX° /± >Y°EX°/±>Y±° +X!ØôY°±° +X!ØôY013273##"533267&&#"SÞÉ^�3Åó2ˆWÇÞós}Jg""hG|v=NIƒú&=>"ì–¶;8ø6=Õ¨€¸NE°EX°/± >Y°EX° /± >Y°EX°/±>Y° °° +XØÜY´_o]²  901'"#36632›hG_óÞ)�T&_<7ý:�S^RÿëÏN'�°EX° /± >Y°EX°/±>Y² 9´Yi]´v†]° °д¦¶]´ ]²V]²q° ±° +X!ØôY°±° +X!ØôY°°"вY"]´""]°±%° +X!ØôY014&'&&54632#4&#"#"&773326à`ƒÂÇæ¼ÆééfYX\W…ÌÅñÅÓôâ€\^f&8J)—‚ˆÀÃ�C`O99C*™„’¶ØŒ^VHÿë}AQ°EX°/± >Y°EX°/± >Y°EX°/±>Y°±° +X!ØôY°±° +X!ØôY°°аÐ013#3267#"&5#53®ÂÂ:0&V.†˜¥¥Aþù´ýªC9²�¨V´{ÿë :F°EX°/± >Y°EX°/± >Y°EX°/±>Y°EX°/±>Y°± ° +X!ØôY01%#"&5332673#"3œf®Äò\]Xw"óÔžV]Þê‡ýwŽr?<ûÆ õ: B°EX°/± >Y°EX°/± >Y°EX°/±>Y°д$]¶3CS]²`]01373#3ø×ûþ€Óþ~ûnXXÌûÆ:%Ð:�°EX°/± >Y°EX° /± >Y°EX°/± >Y°EX°/±>Y°EX° /± >Y°°в]@ #3CSc]°°вL]´]m]´,]²;]°°Ð0173#'#338©éþØÇæäÇþØé­á±8ûÆã ý:ý ÷!í: r°EX°/± >Y°EX° /± >Y°EX°/±>Y°EX°/±>Y²  9° °Ð²%]²f]²]²T]° °а °в+]¶JZj]01!!!!Èþ¬^þìÑÑþê^þ¬ÇsýéýÝ|þ„#þKü:Z°EX°/± >Y°EX°/± >Y°EX°/±>Y°EX°/± >Y°°ж4DT]²b]°± ° +X!ØôY013!#"&'732677!çí þ@+œ�E  0 BO(þw ²lôû"q  ¼Z;b-UÄ: F°EX°/± >Y°EX°/±>Y±° +X!ØôY²9°±° +X!ØôY² 901%!!5!5!‚Bü‘"ýéJŸ×Äš8þ˜‘=)°/°/°/²O]²Ÿ]±° +X!ØôY²901&&554�aÃ¥_bb_¥Ã0bQVWWVQbþ˜7ð«Ëht²tjË«ï7Œ!¨|Ëh¡-/¡fË|¨!®þòU°°/°EX°/±>Y01#3U§§þò¾þ˜u=)°/°/°/²O]²Ÿ]±° +X!ØôY²9016655467&&554&'73"aSY]]YSa0¦^dd^¦ÂÛ!¨|Ëi ,+¡kË|¨!Œ7ï«Ëjt²thË«ð7uƒÜ/7°/°° +XØÜY±° +X!ØôY°± ° +X!ØôY°° а°Ð01#"&'&&#"'46323265ܰ…W‘S7X.Y²9°/°°° +XØÜY01#3#53‚óóóóþŠÄë[ÿ ÿ&#j°EX°/± >Y°EX° /± >Y±° +X!ØôY° °а °а ° ° +XØÜY°°° +XØÜY°°а°а±° +X!ØôY01%2653#5&554753#4&#"IYzÞ¿‘ÈÁËËÁÈš¶Þu^‰rr­iO�Ìëè'Ò#Ð( àá×–Y|Ç–#™ÅQjÅ"a°EX°/±>Y°EX°/±>Y±° +X!ØôY°в!9°!/±"° +X!ØôY°а!°в!9°±° +X!ØôY01!!53665'#53'4632#4&#"!ç-*Õü& //¢› èÃÏäëmUVb …XrR˜: ±^zÃîÏíÙ²ieƒvîÃ]ÿåOñ#/.°/°EX°/±>Y±'° +X!ØôY°±-° +X!ØôY01%#"&''7&&5467'7663273254#"=M¹de¸K��‡1385��ŽJ°a`²K‘Ž”383/‹Žüx﫪ï磌ïk=BA=„�‰L³be¹O“�‘7<=8”‘—N·da±K�‘{¹þþ¹¸ÿ¾°p°EX°/±>Y°EX°/±>Y°EX° /± >Y²+² 9²]²]°°а±° +X!ØôY°а°а±° +X!ØôY° Ð01!!!!!#5!5!5!5!!lCþsþ�cþ�óþ›eþ›þq0€ý6ÃsÃííÃsÃʈþòm°.°/°EX°/±>Y²9°/²9°/´]013#3ˆåååþòüåÈö\þ$ŒÅ3Ew° /°EX°#/±#>Y² #9°±=° +X!ØôY²=9° °а ±° +X!ØôY²0# 9°0±7° +X!ØôY²709°#°'а#±+° +X!ØôY01#"$?32654&'&&5467&&54$32#4&#"%&&'6654&ŒYRCDþïçâþÎéªzzŒ†»òåWRCBæî êŒ}‚„zÄôåýÍ*N%75|Â5F 7<ˆÇ]Š*2Ša¯ÆÊÚzncMMZ8@º®ZŒ,2‹a©ÎßÉe†eMVV4B¹, U:Y[7 U9Pa¤äy°°/°а°° +XØÜY²q°Ð01#53#53yòòþññäÌÌÌWÿëâÄ)5u°EX°-/±->Y°EX°3/±3>Y±!° +X!ØôY°-±'° +X!ØôY²!'9°/² '!9° /² 9±° +X!ØôY°±° +X!ØôY² 901#"&554632#4&#"3265%32#"! ! V°� ½½ �±”ZZ^ee^ZYýWõôWþ©ôöþªzž('žþaþÚþØþbT—�Ô¯w­ÖŸ•^UŠqxs‰S`…þøþ—igþ™þù;°þPþÅþÄþN²t´Å +¯°/°EX°/±>Y²]²¯]² ]°°Ð°±° +X!ØôY² 9° /²ß q´ / r´? O q@ Ì Ü ì ü ]´  ]² 9°±!° +X!ØôY° °&° +XØÜY@ À&Ð&à&ð&]´&&q¶Ð&à&ð&q¶&& &r01&&'#"&5463354&#"''&632%2675#"` !oNw‚©¢‰;9BH¥ªŒ†� þ‡3kˆJS:Â//=zjox3>A4/ b‚ކþÆ3X*‚:#i@.+-ÿÿbuw”&öÞDÿÞvÂ%°/±° +X!ØôY01#!5!ÂÈý…Cv«ÿÿG TÍWÿëâÄ 2;�°EX°/±>Y°EX° /± >Y±° +X!ØôY°±° +X!ØôY²9°/´Ðàq²9°/²ßq²39°3/±° +X!ØôY²"39°°+а+/°±:° +X!ØôY01! ! 32#"#!2#&&554&#'32654&##Wž('žþaþÚþØþbzWõôWþ©ôöþª¼——®=;>7 › CLž�D^Na‚Ù;°þPþÅþÄþN²<þøþ—igþ™þ­þ¯R…;ZlK8)AQ*6GD†=7H:‡^°°/°° +XØÜY01!5!^ý)מ°‹Å K°EX°/±>Y° ° +XØÜY²Ï q´¿ Ï r²ß ]² ]±° +X!ØôY°±° +X!ØôY014632#"&732654&#"›mk™™km›‹I43GG34I¸nŸŸnnššn5GF66JJ_ÿéó D° /°EX° /± >Y° °Ð° ±° +X!ØôY°в 9°/° ±° +X!ØôY01!!#!5!3!5!œWþ©×þšf×%ü½CŠÇþu‹Ç€úßÄl›ÕÇd°EX°/±>Y°° +XØÜY²¯]²r²Oq²or² ]±° +X!ØôY°в9°± ° +X!ØôY°° а°Ð01!56654&#"#'&632!Õý¡1@(36=@µ¬‘‹›ax�^›‘6F),8<0g‘‚uQvinb�ëÆ*À°EX°/±>Y±° +X!ØôY°° а°° +XØÜY²ßr²¯]²Ÿq²r²or²�r²?r²ïq²Oq²ÿr²¯r² ]±"° +X!ØôY²*"9°*/²ß*r¶/*?*O*q²ÿ*q´**r´ß*ï*]²¿*q±)° +X!ØôY²)*9°°Ð012654&#"#'&632#"&77332654&##5¡A=A>5?µ¬‚•¬G=FK´•‡¹µE=@LGE{s50'5,"bxwn7[_Dp|yp+34-87ƒx¼FÆR°/²?]²]²ÿ]²Oq²/r²oq´/q²¯]²_]²]²ßq°° +XØÜY¶/]01!#7 þï½Æþü’þ`:S°EX°/± >Y°EX°/± >Y°EX°/± >Y°EX°/±>Y°EX° /± >Y°±° +X!ØôY0132673#'#"&'#„daWoóß-wK=c&ò:ý”§x=<ûÆV56þ>Ú>p° $°EX°/±>Y°EX°/±>Y²901!#"543!}SéþýéFÑÏúP R’B°/°° +XØÜY01#53’òòRðmþAÉ0°/°° +XØÜY²p]±° +X!ØôY°±° +X!ØôY01%#'2654&'7> @Vª�>KER 6 RPfy‰,-,$‹W™–ÅJ°EX°/±>Y°° +XØÜY²¯]²r²Oq²or² ]°°° +XØÜY°° +XØÜY01##5%–À?™–w´,Å @° /°EX°/±>Y² ]²¯ ]² ]° ±° +X!ØôY°±° +X!ØôY014632#"&53326554&#"w¼žž½¼�Ÿ½¯XURXYSTWv”»»”t•¹¹•UggUtShhSÿÿj—‹¶&pÿÿ°ßÄ'qY˜' mº°EX°/±>Y01ÿÿ°Ä' %'qY˜o+°EX° /± >Y01ÿÿrœÇ' Ï'mwn›°EX°#/±#>Y01`þvÓ:J°/°EX°/± >Y°° +XØÜY²9°/²9°± ° +X!ØôY°° в90132673#"&54676653#¬?nPZhcQtêõÀÓë’q8øø��z\O‰Sak\Y²ÇÖ¼ÙZ1[W�éÿÿ"&$C \ ³ +01ÿÿ!&$vÁ[ ³+01ÿÿG&$Q©Y ³+01ÿÿc&$W¬l ³+01ÿÿ &$j†]³+°° Ð01ÿÿ�&$U@³³+°°Ð01ÿöW°–°EX°/±>Y°EX°/±>Y°EX°/±>Y²9°/²_]°±° +X!ØôY² 9° /² q± ° +X!ØôY°±° +X!ØôY°±° +X!ØôY°°вm]²<]²\]01!!!!!!!!!!'Wü~þ ¸þÞCàýz$ýä—úíyTþ¬°ÅþhÅþ6g}ÿÿjþ=ÌÅ&&z½ÿüÿÿŸu"&(CÄ\ ³ +01ÿÿŸuG&(QY ³+01ÿÿŸu &(j[]³+°° Ð01ÿÿÿÓ "&,Cÿƒ\ ³+01ÿÿ­~!&,v8[ ³+01ÿÿÿÙzG&,Qÿ>Y ³+01ÿÿÿ¾“ &,jÿ]³+°°Ð01$° |°EX°/±>Y°EX°/±>Y²9°/²ß]´Ïßq²?q²Ÿ]²ÿq´r±° +X!ØôY°а±° +X!ØôY°±° +X!ØôY°°Ð013#53! !!326554&##!½™™Ø[þ¥þëþýÞµÏϵÞ‘ªuþ¦þðÝþïþ¨‘þ1ì»ß¹ìþNÿÿŸc&1Wîl ³+01ÿÿgÿë7&2Cq ³ +01ÿÿgÿë6&2vÍp ³ +01ÿÿgÿë\&2QÑn ³ +01ÿÿgÿëx&2WÓ� ³ +01ÿÿgÿë"&2j­r³  +° °Ð01MÖì† °/´]°а°а° Ð017M<þÄ”;<”þÄ<”þÄþÅlBB–þ¾B–þ¾þ¾–Aþ¿gÿ¡î%1T°EX°/±>Y°EX°/±>Y±.° +X!ØôY°±"° +X!ØôY²."9²".9²)".9²+."901!"&'#7&&5!273&&#"!4&''3265þ±þõR“?V”‚]dGa«IR”ƒNUüK#!ø/tE ºÃþ'^5§ÁUþõþ¡$$’ÝTô� `3/‹ÞTá€þúO‡/Z(,ê¶=m*ü¶ê¹ÿÿ†ÿëñ"&8C\ ³ +01ÿÿ†ÿëñ!&8vÎ[ ³ +01ÿÿ†ÿëñG&8QÒY ³ +01ÿÿ†ÿëñ &8j®]³ +°°Ð01ÿÿ é!&<v�[ ³ +01”~° O°EX°/±>Y°EX° /± >Y² 9°/² 9° /°± ° +X!ØôY° ±° +X!ØôY0132###32654&#‡öòþñòöóóö‡‡‡‡°þèóÃÄòþÔ°þ%þ‹fh�ˆÿë›'V°EX°/±>Y°EX°/±>Y°EX°/±>Y² 9°±° +X!ØôY² 9°±$° +X!ØôY01!#4632#"&'73265454654&#"zòöʪÛvDÚÅR©&1){>]^þ»~_?[oEàú·­qÏ>Dþ䊴´"Å(SGL‘UÒKPa”…ÿÿRÿëà&DC� ³,+01ÿÿRÿëß&Dv8 ³/+01ÿÿRÿë&DQ< ³.+01ÿÿRÿë!&DW>* ³/+01ÿÿRÿëË&Dj³0+°0°-Ð01ÿÿRÿëM&DUÑq³5+°5°;Ð014ÿë„N.9B˰EX°/± >Y°EX°/± >Y°EX°/±>Y°EX°/±>Y²9²?9°?/´?�?]²ï?q´O?_?q´?�?r´ï?ÿ?r° а±° +X!ØôY²9²9°?±#° +X!ØôY°±(° +X!ØôY°±/° +X!ØôY°#°3а±:° +X!ØôY01"&'#"&5463354&#"''&6326632!3267%2675#""!54&æ„ÌC;Ö•´ÅñçÎ]V]kéòÉk«8?¨dÖìýXŒ‹b~QI9ÊüqC’)Ìmz[@ht ¶gYSJb³šž¬G[gZA�¹B@?Cþúä�ƒ¡..¥-L¹I1½bEAOç�ui‚ÿÿQþ=õN&Fz>ÿüÿÿYÿëøá&HCƒ ³ +01ÿÿYÿëøà&Hv: ³#+01ÿÿYÿëø&HQ> ³"+01ÿÿYÿëøÌ&Hj³$+°$°!Ð01ÿÿÿ¶‚Ë&òCÿf ³+01ÿÿ�aÊ&òv ³+01ÿÿÿ¼]ð&òQÿ! ³+01ÿÿÿ¡v¶&òjþý³+°°Ð01<ÿëNí!.›°/°EX°/±>Y²]² 9° /²Ÿ ]² ]² 9°/@/?O_o�Ÿ¯¿ ]² 9° /² 9² 9²9° ±)° +X!ØôY² )9²9°±"° +X!ØôY01#"54327&&''75&&'772655&&#"�bkþÔáãþÞÞU—4 R@þôNÛ!M'KT˜BÏNþ}™#‘g~“— iþì£ÏøþÆÐâ?4^�<–m{ ÄC.tmû=Р„0@´‰y®ÿÿ~ !&QWY* ³+01ÿÿSÿë4à&RCž ³$+01ÿÿSÿë4ß&RvU ³'+01ÿÿSÿë4&RQY ³&+01ÿÿSÿë4!&RW[* ³'+01ÿÿSÿë4Ë&Rj5³(+°(°%Ð01Cª7¶ =°/±° +X!ØôY°°а/°° +XØÜY°° а /²p ]°° +XØÜY01!5!%#53#537ü ôþ�óóóóFÔ¿ÝûôÝSÿv4¼%1T°EX°/± >Y°EX°/±>Y±.° +X!ØôY°±"° +X!ØôY²."9²".9²)."9²+."90143273#"&'#7&&53&&#"!4&''3265S æ5c-H�h[bþ÷ç0Z*H�fchó&5}üþß.'ò5’ÓJé�ôþÍ’ÏGð–N€(X É›Dv)ý²Çžÿÿ{ÿë Ë&XC� ³+01ÿÿ{ÿë Ê&XvT ³+01ÿÿ{ÿë ð&XQX ³+01ÿÿ{ÿë ¶&Xj4³+°°Ð01ÿÿþKüÊ&\v ³+01Šþ`>U°EX° /± >Y°EX°/± >Y°EX°/± >Y°EX°/±>Y°±° +X!ØôY°±° +X!ØôY01#"&'#36632#4&#"3265>ÞÆ\Ž3óó2�[Èßò}|Lj jN|{ùìþÞB@ýó¸ý­BGþÃþý¦ÓA:þ9=·•ÿÿþKü¶&\jú³+°°Ð01ÿÿö&$q¢F ³ +01ÿÿRÿë´&Dq7 ³,+01ÿÿ\&$Sݬ ³+01ÿÿRÿë&DSoj ³0+01ÿÿþRH°&$V]ÿÿRþR+N&DV@ÿÿjÿëÌ6&&vµp ³! +01ÿÿQÿëõß&Fv( ³!+01ÿÿjÿëÌ\&&Q¹n ³" +01ÿÿQÿëõ&FQ, ³ +01ÿÿjÿëÌ6&&T†€ ³ +01ÿÿQÿëõß&FTù) ³+01ÿÿjÿëÌc&&RÐr ³" +01ÿÿQÿëõ &FRC ³"+01ÿÿŸçN&'R�] ³+01ÿÿSÿë:&G&ý°EX°$/±$>Y01$° |°EX°/±>Y°EX°/±>Y²9°/²ß]´Ïßq²?q²Ÿ]²ÿq´r±° +X!ØôY°а±° +X!ØôY°±° +X!ØôY°°Ð013#53! !!326554&##!½™™Ø[þ¥þëþýÞµÏϵÞ‘ªuþ¦þðÝþïþ¨‘þ1ì»ß¹ìþNSÿë¯'y°EX°/±>Y°EX°/± >Y°EX°/±>Y°EX°/±>Y²9°/²]±° +X!ØôY°а°а±° +X!ØôY°±$° +X!ØôY01##'#"5532#535333267&&#"¯¬Ì4’aÇÞÞÉX‹3ððó¬ü—s}Mk""lJ|vÉû7†LO"ì=GBª¥¥ü†–²B=ØY°EX°/±>Y°EX°/±>Y°EX°/±>Y²9°/²9°/°Ð°±° +X!ØôY°а±° +X!ØôY°° а° Ð013##!##533!3!5!ˆˆòýtó……óŒòü‚Œýt¤¢ûþmý“¢ þô ý€Òÿý*m°EX°/±>Y°EX°/± >Y°EX° /± >Y°EX°/±>Y²9°/²]±° +X!ØôY°±° +X!ØôY°°а°Ð01#6632#4&#"##53533Œþ6›^¬ÁóffGq%óžžóþÇþçLTÙâým•€r;4üèǪ§§ÿÿÿÀ‘c&,Wÿ@l ³+01ÿÿÿ£t &òWÿ# ³+01ÿÿÿÀ—ö&,qÿ9F ³+01ÿÿÿ£z¡&òqÿÿñ ³+01ÿÿÿçj\&,Sÿq¬ ³+01ÿÿÿÊM&òSÿTU ³+01ÿÿ+þR̰&,VáÿÿþR¯&LVÄÿÿ£¦!&,T k ³+01�‚:°EX°/± >Y°EX°/±>Y01!#3‚óó:ÿÿ­ÿë3°&,-Mÿÿ�þK¡&LMÿÿ;ÿë²?&-QvQ ³+01ÿÿÿµþKeä&OQÿ)ÿö ³+01ÿÿŸþ/°&.&’þšÿÿ�þ<&N&7þœŽk: h°EX°/± >Y°EX°/± >Y°EX° /± >Y°EX°/±>Y°EX° /± >Y²9°/´�]±° +X!ØôY² 901##33!!ïoòòUP%þ`¾þˬþT:þP°ýÿýÌÿÿŸ/ø&/v*2 ³ +01ÿÿ�aI&Ovƒ²+01ÿÿŸþ/°&/&}þœÿÿlþƒ&O&þœÿÿŸ/²&/&¬°EX° /± >Y01ÿÿ�Ë&O&ްEX°/±>Y01ÿÿŸ/°&/T»ýÕ°/01ÿÿ�÷&OTZý°°/01° c°EX° /± >Y°EX°/±>Y² 9° /²? q´ � ]° ааа ± ° +X!ØôY°ааа±° +X!ØôY01%!!573�þü�üpssó`O¸OþÂ_#¸#™( O°EX° /± >Y°EX°/±>Y² 9°/´�]° ааа±° +X!ØôY°ааÐ017#573—‘‘ó‰‰ó{4¸4ý=m1¸1óÿÿŸ!&1vè[ ³+01ÿÿ~ ß&QvS ³+01ÿÿŸþ°&1&èþœÿÿ~þ N&Q&SþœÿÿŸN&1R] ³+01ÿÿ~  &QRn ³+01ÿÿÿâ &Q&ÿ‘°EX°/±>Y01“þK°f°EX°/±>Y°EX°/±>Y°EX°/± >Y°EX°/±>Y°EX°/±>Y°± ° +X!ØôY°°д;K]°°Ð01#"&'732655#37»¦$; =;Aý{óó…°ú³Ã ¿_T?ûé°ûç~þKNU°EX°/± >Y°EX°/± >Y°EX° /± >Y°EX°/±>Y° ±° +X!ØôY°±° +X!ØôY016632#"&'732654&#"#\ 6Ÿb©½»¦$; <;AbdKn#ó:–QYÐÝý ³Ã ÆWTÞ~j61üà:ÿÿgÿë &2qÌ[ ³ +01ÿÿSÿë4´&RqT ³%+01ÿÿgÿëq&2SÁ ³  +01ÿÿSÿë4&RSŒj ³(+01ÿÿgÿë`&2X6r³% +°%°Ð01ÿÿSÿëV &RX¾³.+°.°(Ð01eÿëJÅ%”°/°EX° /± >Y°EX°/±>Y°EX°/±>Y°EX°/±>Y°±° +X!ØôY²_q²Ÿ]²Ïq°±° +X!ØôY°±° +X!ØôY°±° +X!ØôY° ±° +X!ØôY01!!# !2!!!!!267&&#"Jü�\�Cþüþ¾AEŽOxý$}ýƒãûa3e15e1Ÿ³´ K 0 L ÃþeÃþ38ÍÃþÎÄÎSÿëN"09x°EX° /± >Y°EX°/± >Y°EX°/±>Y°EX°/±>Y²69°6/´6�6]±° +X!ØôY°±° +X!ØôY°&а ±-° +X!ØôY°1Ð01"&'#"554326632!3267326554&#""!54&Z�ÌAAÇ€èþ÷ æ�ÉA@ÀqÛéý]‹{bŒAN=Êûg|‚�}øZt­icZ[b4óò5e[[eþ÷ß��¤0-Ÿ6J'ŸÆÇž›ÉÉ›d�ng‚ÿÿŸÿ!&5vƒ[ ³(+01ÿÿ€ôß&Uv® ³ +01ÿÿŸþÿ°&5&ƒþœÿÿjþ¸N&U&þœÿÿŸÿN&5Rž] ³)+01ÿÿDø &URË ³ +01ÿÿ[ÿë§6&6vˆp ³, +01ÿÿRÿëÏß&Vv" ³, +01ÿÿ[ÿë§\&6QŒn ³* +01ÿÿRÿëÏ&VQ& ³* +01ÿÿ[þ9§Å&6z�ÿøÿÿRþ9ÏN&Vz/ÿøÿÿ[ÿë§c&6R£r ³, +01ÿÿRÿëÏ &VR=ÿÿþ‚°&7&eþœÿÿþ}A&W&Ïþ’ÿÿ‚N&7R€] ³ +01ÿÿÿë6&W&â0°EX°/±>Y01‚°N°EX° /± >Y°EX°/±>Y² 9°/±° +X!ØôY°а ± ° +X!ØôY° а°Ð01###53!5!!3™ÏóÍÍþHcþHÏüîª1ÃÃþÏÿôÿëƒAs°EX°/± >Y°EX°/± >Y°EX°/±>Y°±° +X!ØôY²9°/±° +X!ØôY°± ° +X!ØôY°°а°а°аÐ013#3#3267#"&5#535#53®ÂÂÕÕ:0&V.†˜ÈÈ¥¥Aþù´¥ªþùC9²�¨ª¥´ÿÿ†ÿëñc&8WÔl ³+01ÿÿ{ÿë  &XWZ ³+01ÿÿ†ÿëñö&8qÍF ³ +01ÿÿ{ÿë ¡&XqSñ ³+01ÿÿ†ÿëñ\&8S¬ ³+01ÿÿ{ÿë &XS‹U ³+01ÿÿ†ÿëñ�&8Ug³³+°°!Ð01ÿÿ{ÿë 8&XUí\³+°°#Ð01ÿÿ†ÿëñK&8X7]³+°°Ð01ÿÿ{ÿëUô&XX½³+°°Ð01ÿÿ†þRñ°&8VŸÿÿ{þR3:&XVHÿÿ(ãG&:Q›Y ³+01ÿÿ%Ðð&ZQ ³ +01ÿÿ éG&<Q”Y ³+01ÿÿþKüð&\Q ³+01ÿÿ é &<jp]³+°° Ð01ÿÿXq"&=vo\ ³+01ÿÿUÄÊ&]v ³+01ÿÿXq"&=T@l ³ +01ÿÿUÄÊ&]Tï ³ +01ÿÿXqO&=RŠ^ ³+01ÿÿUÄ÷&]R9 ³+01‹•-,°EX°/±>Y°EX°/±>Y°± ° +X!ØôY0134632&&#"‹Ã¯$H,+OT¸³Â ¹^TûHÿÝþKÓ-#m°EX°/±>Y°EX°/± >Y°EX°"/±" >Y°EX°/± >Y°"±° +X!ØôY°± ° +X!ØôY°°аа±° +X!ØôY01##"&'73265#5354632&&#"3„ɺ¦$: ::A¥¥Ã°#H-1OOɆü;³Ã ¿_TÅ´~³Â ¼ZT~bÿë c%Q°EX° /± >Y°EX°/±>Y² 9° /±° +X!ØôY° ±° +X!ØôY°±"° +X!ØôY01! !26653'4&#"3265 þ±þõþúþ¹GØQquЦ› òæ ºº¡§ÁUþõþ¡_  `WN¦‰Àû-A’M¶êê¶þø¸ëê¹SÿëëË%Q°EX°/± >Y°EX°/±>Y²9°/± ° +X!ØôY°±° +X!ØôY°±"° +X!ØôY014326653#"53326554&#"S æm±ACDÃ~x!þ÷çèþ÷ó|‚�}'ò5IBˆe’Å)@“QôþÍ4óŸÆÇž›ÉÉ›†ÿël>O°EX°/±>Y°EX°/±>Y°EX° /± >Y² 9°/± ° +X!ØôY° ±° +X!ØôY016653#"533265ñSRÐÀ»þÄÿúþÊ󬑖²°´§„Öÿ ý—òþýñÐü0™šš™Ð{ÿëqºU°EX°/± >Y°EX° /± >Y°EX°/±>Y°°в 9°/±° +X!ØôY° ±° +X!ØôY01#'#"&5332673665l­ºÔ3œf®Äò\]Xw"ó\Mº²ÄüÒžV]Þê‡ýwŽr?<x zvÿÿÿµþKmë&ORÿ@ÿú ³+01ÿÿB&$pK¥³+°°а°!Ð01ÿÿRÿë&DpÖc³;+°;°/а;°AÐ01ÿÿÿöW!&ˆv¸[ ³+01ÿÿ4ÿë„à&§vn ³G+01ÿÿgÿ¡_&™vÓ™ ³5+01ÿÿSÿv4Ü&¹v. ³5+01ÿÿ[þ§Å&6&�þˆÿÿRþÏN&V&"þˆÿµþK“:)°EX°/± >Y°EX°/± >Y± ° +X!ØôY01#"&'73265“º¦$: ::B:û‡³Ã ¿_TyÿÿEø^ø°EX°/±>Y01›ä<î"°/°а°° +XØÜY¶/]°Ð01#'#5%3<Ã�ŽÁ�ü‹‹ðyä-ñ"°/°Ð°°° +XØÜY¶/]°Ð0173#%53Ò„×þô�þõÕiˆüúv•ù°'°/° ° +XØÜY²� q²¿ ]° ° +XØÜY°Ð01#"&7733265ò®“”®´AECB°{šš{:JJ:š×�¶°/°° +XØÜY01!5!�þý×ß‚T&Ü 1° /°° +XØÜY´?O]° °° +XØÜY°°° +XØÜY014632#"&732654&'‚{YWyyWY{n;+*88*+;TrrTUmmU+:8--;;JþRë<,°/°EX° /± >Y±° +X!ØôY°°° +XØÜY01!3267#"&5467Œ>A'4)#$X=eƒmr3U3". ŽqeOŽ7€ÖQ÷6°/°° +XØÜY°° а° ° +XØÜY°°° +XØÜY° °Ð01#"&#"'46323265QxZG¥3'6ƒwZ8³4&8Ð_†YA-#^‹Y@.vä˜î ° /°а° +XØÜY¶/]°Ð013#'3#˜þþÛÉtóðÃîþüþû«þ~úÿ¸ ?°/°° +XØÜY° ° +XØÜY@ 0 @ P ` p ]°° +XØÜY°°° +XØÜY014632#"&732654&'«bHE`_FHbe'&&'çD[[DDWXC''((üÛ³þ*ý°/°° +XØÜY²]01#3þ*™¶Ð³Jý6¶þ†°/°° +XØÜY²]013#ý¸Î¾’þµÿÿü†ÖÿW÷Wüý>æþ™+°/°° +XØÜY°° +XØÜY°° +XØÜY²901'6654HýQK?PF¥¯V@æ’"&"{gYDHEüäÿ4î "°/°а° ° +XØÜY¶  / ]°Ð01#73#73þÉþÛþ"Ãðóéþöý"þ¥þ0ÿ„°/°° +XØÜY°° +XØÜY01!5!þ0þòþ¥ß×ö f°/°° +XØÜY013#òÀvfþ��äŽÒ 0°/°а°° +XØÜY°а° ° +XØÜY°° +XØÜY01#53#533#Žááýðáá~ù–’äÌÌÌ"þïÿÿf&$`Üÿÿ R’Byÿÿÿ°Ùh&(d`þÙÿÿÿÝtf&+d`ÿÿÿÿäh&,d`ÿ ÿÿÿë"f&2`ÿGÿÿÿbMf&Y°EX°/±>Y°±° +X!ØôY01!#!7ý[ó˜íû°˜°?°EX°/±>Y°EX°/±>Y±° +X!ØôY°°д^n]¶+;K]013!%!#sç>ú‚Hòþ“°úPÂÆÿÿŸu°(ÿÿXq°=ÿÿŸ°+gÿëÅs°EX°/±>Y°EX°/±>Y²9°/²?q´Ïßq´_oq²Ÿ]²ÿq²r±° +X!ØôY°±° +X!ØôY°±° +X!ØôY01!5!! ! '4&#"3265£þ@Àkþ±þõþúþ¹G Pòæ ºº¡§ÁyÃçþõþ¡_  `þ þö¶êê¶þø¸ëê¹ÿÿ­ °,ÿÿŸ/°.#°0°EX°/±>Y°EX°/±>Y°EX°/±>Y°°Ð01##3#œþˆûçüpû�°úPÿÿŸb°0ÿÿŸ°1p-° N°EX°/±>Y°EX°/±>Y±° +X!ØôY²9°/±° +X!ØôY°± ° +X!ØôY017!!!!!!p½üC`÷ý VšüfÂÂL¿#ÃÿÿgÿëÅ2Ÿ°9°EX°/±>Y°EX°/±>Y°EX°/±>Y°±° +X!ØôY01!#!#!òýsóríû°ÿÿŸÚ°3GL° \°EX°/±>Y°EX°/±>Y²9°°Ð°±° +X!ØôY²9°± ° +X!ØôY² 9°° Ð01!!55!!þmÉûûÎþ2ßý^’ÏýôØA?˜Ãýöÿÿ‚°7ÿÿ é°<H°#d°EX°/±>Y°EX°/±>Y²9°/°Ð°/² 9° /°а/° ±° +X!ØôY°±° +X!ØôY°а°!Ð01#5&547537'4&'66^î3þÍîóñþÎ3ðóýÙ ŽŽ Y ŒŒ Ü þàààþã ÌË àá! Ôý Ž¢j¨��¦ý–¤ÿÿ2î°;HQ°V°EX°/±>Y°EX°/±>Y°EX°/±>Y°EX° /± >Y² 9° /±° +X!ØôY°а ° Ð016653#&5373B‚”óþáðòîþæò’~òæýáýþÐþµJ1ÿýá£Ã•lÚÅ#]°EX°/±>Y°EX°"/±">Y°EX°/±>Y°"±!° +X!ØôY°Ð°±° +X!ØôY°±° +X!ØôY°Ð01%6554&#"!53&55323!ßv„¥’’£‡yþ ër†:üü<‡pñþ ÈóiÒÜÜÒiôþîÈÄ^&¡g_þ¡þêg þÚ_Äÿÿÿ¾“ &,jÿ]³+°°Ð01ÿÿ é &<jp]³+°° Ð01ÿÿVÿë‡S&Š`Dÿí ³/+01ÿÿ`ÿì R&Ž` ÿì ³. +01ÿÿ~þaS&�`ÿí ³+01ÿÿ©ÿë~=&’`× ³+01ÿÿ€ÿë0�&ža<½³+°°а°!Ð01Vÿë‡N+d°EX°/± >Y°EX°/± >Y°EX° /± >Y°EX°/±>Y° ±° +X!ØôY°± ° +X!ØôY°±(° +X!ØôY013267#"&'#"5532732675&&#"÷&# !>'Sr4‘_ÇßßÉ^‘41ý÷s}Fd!"cD|v9üöB4µ FJGI"ì=LHýÀ–¶:5ì5;Õ¨–þwjÅ*[°/°EX°/±>Y°EX° /± >Y²* 9°*/±)° +X!ØôY²)*9°±° +X!ØôY° ±"° +X!ØôY012#"&'#4$2654&#"32654&##5iÌõcXw„öÍN•<ò¾lfmaa€)~Ns‡yjyÅ×´^�0,¾€Ñé)*þ9¨³óý˜oeU|€cüá(+Šml”¹ þ_õ: 1°EX°/± >Y°EX°/± >Y°EX°/± >Y² 9013#337úûþ�òþŽûÝ:ûðþ5Î ý4YYSÿë4°$X°EX°/±>Y°EX° /± >Y°±° +X!ØôY² 9°/²9±° +X!ØôY° ±° +X!ØôY01!#"554?%5"326554&½þT5l„þ÷çèþ÷Õ±þÜ…}|‚°ÁâQö™ôþÍ,íÏ ë˜ýÛÉ›ŸÆÇž›É`ÿì M*~°EX° /± >Y°EX°(/±(>Y²( 9°/´¿Ï]´O_q´�]²ïq±° +X!ØôY²9° ° а ±° +X!ØôY°(± ° +X!ØôY°(°#Ð01467&&54632#4&#"33#"32653#"$`hcWaøÒ¼ÿèzYfjdeÇÇlpyjf~èþð¼Òþõ2Z€!$yH–¥²ŽY°EX°/± >Y°EX°/±>Y²9±° +X!ØôY°±° +X!ØôY01332'6654&##"&547'!5Êþ£whde)›°§YAWJQ2¹ÀˆŽæý˰ŠþT‹Ðˆlk‰„wº-¥M=-2Ù¦Š.¨ Ã~þaNF°EX°/± >Y°EX°/± >Y°EX°/± >Y°EX°/±>Y°± ° +X!ØôY016632#4&#"#\ 6Ÿb«»óccKn#ó:–QYÊãûÀ>~n82üß:nÿë)Å �°EX° /± >Y°EX°/±>Y² 9°/²Ï]´_oq²ÿq²r´�r²/r´Ïßq²?q²Ÿ]¶¯¿Ïr±° +X!ØôY°±° +X!ØôY° ±° +X!ØôY01#"32!3265!54&#")ÿÜÝþþÝÜóþ+yssvþ+Õxssw1þäþÖ*M,þÔþåþül´­¬µ*k³¬¬³©ÿë~9)°EX°/± >Y°EX° /± >Y±° +X!ØôY013267#"&5œ1-*&.X6‰�9üïB4 ±�§ ÿÿŽk:ù$ÿðjî!K° /°EX°/±>Y°EX°/±>Y² 9° ±° +X!ØôY°±° +X!ØôY°°Ð01!!'&&#"'663227'&&'#-þ÷6T8 *  >�›,iB* 3y“1­}DV¶  pühY°EX°/± >Y°EX° /± >Y°±° +X!ØôY² 9° /± ° +X!ØôY° ±° +X!ØôY²& 9°°-Ð01!33#"332'6654&##"$5467&&5467#5¶þÓnn‡’�¬³Ž}Z�±¢„Q?YCFEãþ왓fpA@Õ°ÇiQS^Ç�ˆg‚††€´1™O@06æÍо.%�TIn$ÇÿÿSÿë4NROÿë×:Q°EX°/± >Y°EX° /± >Y°EX°/±>Y°±° +X!ØôY° ±° +X!ØôY°°аÐ01#3267#"&5!##5!�š1-*&.X6‰�þÉòŠ@}ý«B4 ±�§Nüƒ}½€þ`1NH°EX° /± >Y°EX°/± >Y°EX°/±>Y° ±° +X!ØôY°±° +X!ØôY01#"&'#432#4&#"32651ÜÅ[�3óÐåöós{no jN|wùíþß=;ýýßñþÄþü©ÔÍ‹þð9=¶–QþNæN"N°EX°/± >Y°EX°/± >Y°EX°/±>Y°°а±° +X!ØôY°±° +X!ØôY012#4&#"'6654&'&5548ÁíÜic}w“œ¹«§~YBVRXúùNÙ¹\yÌ‘#Š«v‚w¹-¤L=,/ % Ú#è8Rÿë}:W°EX°/± >Y°EX°/± >Y°EX°/±>Y°±° +X!ØôY°±° +X!ØôY°±° +X!ØôY01!#"5547!326554&##}þöVdþ÷àéþ÷ç<üÈ}‚{{{}€|vDÄp×þÙ4óè*ýØŸÆÇž’½½‘Cð:/°EX°/± >Y°EX°/±>Y°±° +X!ØôY°Ð01!#!5!ðþ¡óþ¥­yü‡yÁ€ÿë0:6°EX°/± >Y°EX° /± >Y°EX°/±>Y±° +X!ØôY013265&'3#"&5rxezt;3ñ3@áöáø:ýœœ�æ£}‡jþþ˜þúþ»óúbDþ"…:!]°/°EX°/± >Y°EX°/± >Y°EX° /± >Y°а ±° +X!ØôY°±° +X!ØôY° ±° +X!ØôY012#$546737&&66Xô9þóþàóþåþúC7î6=Žš-¢� ”:þ¹àÛþÓþ1ÐHì”ûg…øy•ÖyýÙ•ÌýP½>þMDJ%c°EX°/± >Y°EX°/± >Y°EX°/± >Y°EX°/± >Y²9°± ° +X!ØôY²9°±° +X!ØôY01233227'&&/#&&#"'66ÁŒ™*MÖõþ¤Â<*6q‹3^óø{¦Z; )CJ p··ý3þ6=DÆ ‡Úþ  ƒCSº Oþ"~:[°/°EX°/± >Y°EX°/± >Y°EX°/± >Y°EX°/±>Y±° +X!ØôY°°а±° +X!ØôY01665&&'3#&37Rž–>4î6Cþõþßóýþíó–�:ü†וyúƒfü”ðþ¸þ2Ð,éþ¶Äx_ÿëv:(S°EX°/± >Y°EX°/± >Y°EX°/±>Y°EX°"/±">Y±° +X!ØôY² 9° /°°Ð01326533265&'3#"&'#"47êEPak_qûp_kbPEòEUÐäz¯//¯yåÏTF:…þÿ~­Ü“ Eþ» “Û®~„hþý™þùþ¼uppuD™hÿÿÿÅÿëšµ&’jÿ!³+°°Ð01ÿÿ€ÿë0¶&žjI³+°°Ð01ÿÿSÿë4S&R`ÿí ³'+01ÿÿ€ÿë0>&ž`-ÿØ ³+01ÿÿ_ÿëv>&¢`@ÿØ ³,(+01uÿëáÅ%^°EX°/±>Y°EX° /± >Y² 9°/° ±° +X!ØôY² 9°/°±° +X!ØôY°±$° +X!ØôY0154632#"73267&$4&#"7Ê¡¤¾þÇÿûþÇú©‘’©ÎþúÔ987@yiçT³×Ò¸þþóþ¹S¥ýY®Ûʳ òTTUSec…ÿî…Â#O°EX°/±>Y°EX°/±>Y°EX°/±>Y°± ° +X!ØôY°±° +X!ØôY²!9016632&&#"#&&#"'663237ò8ˆh 3 "8þÛòþÜ7!3!h‡8¥Ä‹s À+'ýmýóŽ'+À p‹þwNN3ÿëT:,g°EX°/± >Y°EX°/±>Y°EX° /± >Y°±° +X!ØôY°аа ±!° +X!ØôY²&9°&/°±*° +X!ØôY01##"&'#"467#5!&&'!326553326T€ºÌu¨-.¨t̹o!þÅ!üÆ!KSXkúiYRLƒL¦[þúþ»sppsE[§K·ýüQ§UV¦Q¬Ý“ ââ “ÛÿÿŸu"&(CÄ\ ³ +01ÿÿŸu &(j[]³+°° Ð01ÿÿŸ7!&mv}[ ³ +01{ÿìÝÆ!°EX° /± >Y°EX°/±>Y°Ð° °а ±° +X!ØôY² 9°/²ÿq²r²Ÿ]²?q´Ïßq²r²Ÿr±° +X!ØôY°±° +X!ØôY01#"3 #4&#"!!3265ÖþÙüÿþÁ;ü)럛•¯÷þ ³˜—œäÝþëW  Yþñ哤ì²&Ã.´ì¢”[ÿë§Å'Q°EX° /± >Y°EX°/±>Y² 9°±° +X!ØôY° ±° +X!ØôY°±%° +X!ØôY014&'&$54$32#4&#"#"$773326´‡«ôþù#æð#é˜�…�›³ëôþÝíäþ¨긓‡–v[t.@Ó«°äþþµp‹t\Sn1?Þ¬¶×ñÒ…ƒmÿÿ­ °,ÿÿÿ¾“ &,jÿ]³+°°Ð01ÿÿ;ÿëæ°-.C°p°EX°/±>Y°EX° /± >Y°EX°/±>Y² 9°/°± ° +X!ØôY°±° +X!ØôY°±° +X!ØôY° ±° +X!ØôY01!2#!!!#532!2654&# 4ðþëðýÙþ@òþù0(•z¥4‡ŒŒ‡°ýëþÿÍÍÿíþ þeþŽÂ A£ý(ýêœqn›ŸJ°‚°EX°/±>Y°EX°/±>Y°EX°/±>Y°EX° /± >Y²9°/²Ÿ]²?q² 9°/°±° +X!ØôY°±° +X!ØôY° ±° +X!ØôY01!3!2#!!#3!2654&#’Œó4òþìñýÙýtóó4ˆ‹‹ˆDlýÉôÅÈø�ý°ýþ�khŒÿÿŸ/!&.vs[ ³+01ÿÿš "&¿C/\ ³  +01ÿÿ?ÿëÙ\&ÒSÒ¬ ³+01™þ˜ ° I°/°EX°/±>Y°EX°/±>Y°EX°/±>Y°EX° /± >Y±° +X!ØôY°Ð013!3!#!™óŒóþJóþ7°ûîúPþ˜hÿÿ°$ŽÁ° Q°EX° /± >Y°EX° /± >Y° ±° +X!ØôY² 9°/± ° +X!ØôY° ±° +X!ØôY01!!2#!!!2654&#&ýa4òþëñýÓ˜ýa4‡ŒŒ‡íþ§ûÌÍÿ°ý!ýñœqm•ÿÿŸ¼°%ÿÿŸ7°mÿÿŸu°(hÿëáÅ*n°EX°/±>Y°EX°/±>Y°±° +X!ØôY°° в*9°*/²Ÿ*]²?*q±)° +X!ØôY²)*9°°а±"° +X!ØôY012654&#"#'&$3 !"$77332654&##5¥�–¤Ÿ~©ê6ã/„tƒŒþºþúãþ¶걋 ¹¦£½Gvh_~y\³ßØÈd¦/+­|ÉäÖÍb…ƒgzuÁš ° _°EX°/±>Y°EX°/±>Y°EX°/±>Y°EX°/±>Y°°Ð@ +;K[k]°° Ð@ $ 4 D T d ]013#'#3óóý{óó°úPûì°ûïÿÿš \&¿S¬ ³+01ÿÿŸ/°.. °H°EX°/±>Y°EX°/±>Y°EX°/±>Y°±° +X!ØôY°± ° +X!ØôY01#!##532 óþ(åü0(Šm°úPíþ þeþŽÂC£ÿÿŸb°0ÿÿŸ°+ÿÿgÿëÅ2ÿÿŸ°zÿÿŸÚ°3ÿÿjÿëÌÅ&ÿÿ‚°7ÿÿ2î°;§þ™Þ° 5° /°EX°/±>Y°EX° /± >Y±° +X!ØôY°а°Ð013!33#!§ò�óÅóû¼°ûíûýÔg�é°@°EX°/±>Y°EX° /± >Y°EX°/±>Y² 9°/±° +X!ØôY01##"$533267éóN¯_ýþòó„”T¶R°úPAßðËþ5˜sª¥_° \°EX° /± >Y°EX° /± >Y°EX°/±>Y°EX° /± >Y² 9°/±° +X!ØôY°±° +X!ØôY01!2#!3#3!2654&#˜4òþëñýÙóÇóóû94‡ŒŒ‡”ûÌÍÿ°úP°ý!ýñœqm•‰ÿìׯ!]°EX°/±>Y°EX° /± >Y°°Ð° °а ±° +X!ØôY² 9°/±° +X!ØôY°±° +X!ØôY01'&32#"77332655!5!54&#"�#úú7þÉúýþàê––“ªýþª“•–ÔÛþ¨þõþëþôþªå“šê´<Ĵ윓­ÿëîÅ#›°EX°/±>Y°EX° /± >Y°EX°/±>Y°EX° /± >Y² 9° /²Ÿ ]´ï ÿ ]´_ o q´� Ÿ q²? q²Ï ]²/ ]´Ï ß q±° +X!ØôY°±° +X!ØôY°± ° +X!ØôY01! 5##335! '4&#"3265îþ±þõþúþ¹§óó§G Pòæ ºº¡§ÁUþõþ¡_ ý™°ý{0 `þ þö¶êê¶þø¸ëê¹ÿÿRÿëNDˆ3: €°EX°/± >Y°EX°/±>Y²9°/´¿Ï]²ïq¶�Ÿr´O_q´�]²Ïr±° +X!ØôY²9°±° +X!ØôY°±° +X!ØôY013!2#!2654&#%36654&##ˆ·×ï`XowáÎþö ^^\`þöÓcbjiÅ:—•Lw‡X˜�ÍþóEA@G®>;CA~F:,°EX°/± >Y°EX°/±>Y°±° +X!ØôY01!#!Fþ+óÈvüŠ:ÿÿYÿëøOH~ : f°EX°/± >Y°EX°/± >Y°EX°/±>Y°EX°/±>Y°°вM]´\l]´+;]°° д$ 4 ]¶C S c ]013#'#3òòþ^òò:ûÆÎý0:ý3ÿÿ~ &ÔS�U ³+01Žd: [°EX°/± >Y°EX°/± >Y°EX°/±>Y°EX° /± >Y²9°/´�]±° +X!ØôY² 901##33!!ü|òòl*-þx©þĬþT:þP°ýúýÌ :H°EX°/± >Y°EX°/±>Y°EX°/±>Y°±° +X!ØôY°± ° +X!ØôY01#!##73265 òþŶÝ4$gH:ûÆvþ÷þÀþÓ͸èÍŽn:t°EX°/± >Y°EX°/± >Y°EX°/±>Y°EX°/±>Y°EX° /± >Y°°Ð@ $4DTd]°°д]m]´<L]²+]° Ð013!#'##!û=0óþÛ¥þÛò22ûÆÀý?Äý=:~ : w°EX°/± >Y°EX° /± >Y°EX°/±>Y°EX°/±>Y²9°/´¿Ï]²ïq´/r´O_q´�]¶�Ÿr±° +X!ØôY01!#!#3!3 óþ[óó¥óµþK:þ=ÃÿÿSÿë4NR~ :9°EX°/± >Y°EX°/±>Y°EX°/±>Y°±° +X!ØôY01!#!#! óþZóŒvüŠ:ÿÿ€þ`4NSQÿëõND°EX°/± >Y°EX°/±>Y±° +X!ØôY°°а°а±° +X!ØôY01%2653#"55432#4&#"?YzÜþÿµïÿÿïÃóÝu^‰rr­iO˜Ü4ì#ë5ã¯Y|Ç–#™Å<é:/°EX°/± >Y°EX°/±>Y°±° +X!ØôY°Ð01!#!5!éþ óþ¦­yü‡yÁÿÿþKü:\ÿÿ!í:[~þœ›: <°/°EX°/± >Y°EX°/± >Y°EX° /± >Y±° +X!ØôY°Ð013!33#!~ó¦ó‘óüÖ:üˆxüˆýÚdtõ;@°EX° /± >Y°EX°/± >Y°EX°/±>Y² 9°/±° +X!ØôY01!##"&5332673õó0e2Øïògn5a1ói ÎÎLþ´td  ~û: I°EX°/± >Y°EX°/± >Y°EX°/± >Y°EX° /± >Y±° +X!ØôY°аÐ01!3!3!qRóSòúƒ:üˆxüˆxûÆ:~þ™Ã:O° /°EX°/± >Y°EX°/± >Y°EX°/± >Y°EX° /± >Y±° +X!ØôY°а° Ð01!3!33#!qRóSòÈòú­:üˆxüˆxü�ýÏg:¢¼: \°EX° /± >Y°EX° /± >Y°EX°/±>Y°EX° /± >Y² 9°/±° +X!ØôY°±° +X!ØôY0132#!3#332654&#•íÌçèËþ ó'óóûÙíb^_aÁœ�Æ:ûÆ:ýÄþÄYDA^Ž!: B°EX° /± >Y°EX°/±>Y² 9°/± ° +X!ØôY°± ° +X!ØôY0132#!332654&#�íÌçèËþ óíb^_aÁœ�Æ:ýÄþÄYDA^RÿëèN!“°EX°/± >Y°EX°/±>Y°±° +X!ØôY²9²9°±° +X!ØôY²9°/²ïq´O_q´�]´¿Ï]²/]´�Ÿq´/r´Ïßr±° +X!ØôY01"#'&632#"&7733267'!5!7&&UvÜÿ°äþýã¿ñÝrZnvþ³L u‹iO—ÞþÉé#éþÉâ¯Z{¤z¨u™�ÿë.N!r°EX°/± >Y°EX°/± >Y°EX° /± >Y°EX°/±>Y² 9°/´�]±° +X!ØôY° ±° +X!ØôY°±° +X!ØôY0136$32#"'##3326554&#"‚ÑÎé þ÷çÕþüÏóó¾|‚�}ˆËûþËòôþÍÕþ<:ýØŸÆÇž›ÉÉ›Aù: V°EX°/± >Y°EX°/±>Y°EX°/±>Y²9°/±° +X!ØôY²9°±° +X!ØôY01###&&546333#"ùòãçüÿdkëËÃ]Yíà`c:ûÆ�þsµ)�e˜Âþ ?Z8_ÿÿYÿëøá&HCƒ ³!+01ÿÿYÿëøÌ&Hj³$+°$°!Ð01ÿìþK 'аEX°$/±$>Y°EX°/± >Y°EX° /± >Y°EX°/±>Y²'$9°'/²']@ '�'Ÿ'¯'¿']±° +X!ØôY° ±° +X!ØôY°±° +X!ØôY°° а'°"Ð01!6632#"&'732654&#"##5353!{þõ6›^¬Áº¥$< <:AffGq%ó‘‘ó ·þ÷LTÙâý.³Ã ¿^UÔ€r;4üè·ª··ÿÿ~FÊ&Òv¸ ³ +01[ÿëÿN!£°EX°/± >Y°EX°/±>Y±° +X!ØôY²9²9°±° +X!ØôY²9°/´/r´�Ÿq´�]²ÿ]²q´O_q´¿Ï]²/]´Ïßq´_or´Ïßr±° +X!ØôY01%2653#"55432#4&#"!!IYzÜþÿµïÿÿïÃóÝu^zuLþµt­iO˜Ü4ì#ë5ã¯Y|¡z¨y˜ÿÿRÿëÏNVÿÿ�ƒLÿÿÿ¡v¶&òjþý³+°°Ð01ÿÿÿ°þKŽM0«:p°EX°/± >Y°EX° /± >Y°EX°/±>Y² 9°/°± ° +X!ØôY°±° +X!ØôY°±° +X!ØôY° ±° +X!ØôY0132#!!##7726532654&# íÌçèËþ þíÃÞ4$cZùíb^^b:þ‡Âœ�Ævþ÷þÃþÐÅÌÛÍýÅþÁ`EAY~©:x°EX°/± >Y°EX°/± >Y°EX° /± >Y°EX°/±>Y²9°/² 9°/°±° +X!ØôY°±° +X!ØôY° ±° +X!ØôY01!332#!!#332654&#q¥óíÌçèËþ þ[óó˜ía_^bŸ›þ‡Âœ�ÆÝþ#:ýÅþÁ`EAY {°EX°/±>Y°EX°/± >Y°EX° /± >Y°EX°/±>Y²9°/²]@ �Ÿ¯¿]±° +X!ØôY°±° +X!ØôY°°а°Ð01!6632#4&#"##5353!§þÉ6›^¬ÁóffGq%óeeó7ºþôLTÙâým•€r;4ü躪´´ÿÿŽdÉ&Öv; ³+01ÿÿ~ Ë&ÔCŸ ³ +01ÿÿþKü&\SOU ³+01~þš : I°/°EX°/± >Y°EX°/± >Y°EX°/±>Y°EX° /± >Y±° +X!ØôY°Ð01!3!#!q¦óþµóþ²:üˆxûÆþšf:ÿ×Á°d°EX°/±>Y°EX° /± >Y² 9°/²9°/±° +X!ØôY° а° а±° +X!ØôY° ±° +X!ØôY01#!2#!#53533!2654&#fß4òþëñýÙ½½óßß4‡ŒŒ‡G³ûÌÍÿGª¿¿ýàýñœqm• ° Y°EX°/±>Y°EX°/±>Y°EX°/±>Y°EX° /± >Y² 9°/°а± ° +X!ØôY°°Ð01####3#!#ŠŠÝ}‹ûçûýÒg¯šþfšþf°úPU  E: Y°EX°/± >Y°EX°/±>Y°EX°/±>Y°EX° /± >Y²9°/°а± ° +X!ØôY°°Ð01####3#3'#ä]Ã[h÷©ç«÷þ\ødþéþé:ûÆÄXXÀ°u°EX°/±>Y°EX°/±>Y°EX° /± >Y°EX° /± >Y°EX°/±>Y°°в9°/±° +X!ØôY°а° а°а°Ð01!3#####!#3!#³S2çû‰ŠÝ~Šû’þðóóCg¯VZúPšþfšþfšþf°ü¥ °:|°EX°/± >Y°EX°/± >Y°EX°/±>Y°EX° /± >Y°EX° /± >Y°EX°/±>Y² 9° /±° +X!ØôY°а °а °а°Ð0133#######33'#£×øç«÷j]Ã[h÷m“óóÆødÄvûÆþéþéþé:ýŠXX„i°Z°EX°/±>Y°EX°/±>Y²9°/°Ð°° аа±° +X!ØôY° а°а±° +X!ØôY01#4&###'#"#4$33!!tõó€�i ò€Ž~óû þ…Üý’òþ+×íþœd’pý«cp’þœdð×…ý†µ‚d:h°EX°/± >Y°EX°/±>Y°EX°/±>Y°EX° /± >Y²9°/°б° +X!ØôY°а°а±° +X!ØôY0135467!#54&####"!‚ÍÆþëôþê¾Èóis$ò-ug…•þÖ©ÙÐ Ûþ$ÐÕ©©�nþ_¤mŽ©i"­ °!$ˆ°EX°/±>Y°EX° /± >Y°EX°/±>Y°EX°/±>Y°EX° /± >Y°EX°/±>Y²9°/°Ð°±° +X!ØôY°а а°"а ±$° +X!ØôY01#4&###'#"#47!#3!!!«õó€�i ò€Ž~ó8þ­óó&þ…Üý’òþ+×íþœd’pý«cp’þœdžeý™°ý{…ý†µ�^: #‘°EX° /± >Y°EX°/± >Y°EX°/±>Y°EX° /± >Y°EX°/±>Y°EX°/±>Y² 9° /±° +X!ØôY° ° б° +X!ØôY°а °!а ±#° +X!ØôY01!547!#3!!#54&####"!|5þÑóó‹þíôþê¾Èóis$ò-ug…•þÖ©�bþX:þ(Øþ$ÐÕ©©�nþ_¤mŽ©i")þ@ªx,5„°/°EX°/±>Y°EX°/±>Y°±° +X!ØôY²,9°,/±+° +X!ØôY²+,9°±#° +X!ØôY°°2° +XØÜY°-а2°5° +XØÜY¶55/5]°.Ð012654&#!5!2##"&&'46332654&##573#%53�†€‚}þåá|p‚‹þóÜ5D>X@Q„£¸¥3vˆ™’�'„×þô�þõÕNqbZoÆË¹o¤,*®}Êã70@N™)µŠ‹~dx{Ç¢ˆüú3þGˆ ,5¥°/°EX°/± >Y°EX°/±>Y°±° +X!ØôY²,9°,/´,�,]´O,_,q´¿,Ï,]²ï,q´,/,r±+° +X!ØôY²+,9°±#° +X!ØôY°°2° +XØÜY°-а2°5° +XØÜY¶55/5]°.Ð012654&#!5!2##"&&'46332654&##573#%53—rlqmþåÒþaXiq÷É1GBT=Rx¡±ž0izƒ~—ß„×þô�þõÕoLC:I¹ ‘Oy#!yT˜­70@N’.±wƒƒP@IJ©)ˆüúÿÿHQ°�ÿÿOþ"~:¡ NH°EX°/± >Y°EX°/± >Y°EX°/±>Y°Ð@ 3CSc]°±° +X!ØôY01376632&&#"#3ãz-•g!2 "< þöÓþ’ûnRR¾‘‘ À7)üâ:ÿÿÿé2&^×D³+°°Ð01ÿÿgþK rÅ&2\vÿÿSþK„N&R\ˆgÿv./J°EX°/±>Y°EX°/±>Y°а°а±° +X!ØôY°а±(° +X!ØôY°+Ð01#5&'&76753'4'&'#5536765¨„ÁŎ££‡ÉÆÁ…¨òb?[ÆcA]]BdÅ\>aUþõ°Š}{‘°  °‘oqаþö¶uKjnRu¶þø¸vSniLu¹Sÿˆ4´/M°EX° /± >Y°EX°/±>Y° °а°а±° +X!ØôY°а ±+° +X!ØôY°(Ð01#5&'&5547675353676554'&'#5¦Å£g„„h¤Æ¡e……g¢þ >#:Å8$@@#6Æ:%>xkxšóòšymowšòôšwŸc9ii8dž›d7[^;d›jþжÅD°/°EX° /± >Y°EX°/±>Y° ° а ±° +X!ØôY°±° +X!ØôY01#&532#4&#"330òÕÿ5ûü ë–•”ªª”–þŠhKñ Xþúä’›ë³þéµë\þ‰ñND°/°EX° /± >Y°EX°/±>Y° ° а ±° +X!ØôY°±° +X!ØôY01#&55432#4&#"33Õó¹Íä¾ñÝrZ|wv~’þ‰j *Î#è8ä®Y|Ì‘#•Ém“>°/°EX°/±>Y01%#%7%73%[!Hþݵ¯áþßG%ÊþÞI#¹¬ä%LþàÁ¬€ªþÁŽ«€«h«‚«Fþk«ª�¢pý)°/°° +XØÜY°±° +X!ØôY°° +XØÜY01'7!'O²"± ~îlÜ·±1°/° ° +XØÜY±° +X!ØôY°°а±° +X!ØôY012$32#54&#"##5Ùq0Iq}ˆ:0+þʃ$�xlm%33x†Å¼`°/°° +XØÜY0153Ž;RÜ„–pDÔË`°/°° +XØÜY01'7'3%Q:¾Dp–„9þÄÒ¯/?O_o×°T/°d/°t/°D/°EX°/±>Y° ° +XØÜY°° +XØÜY° аT°\° +XØÜY°_° +XØÜY°YааT°а_°а\°аd°l° +XØÜY°o° +XØÜY°iа аd°$а °)аl°,аt°4аt°|° +XØÜY°° +XØÜY°xа?а9а|°<аD°L° +XØÜY°O° +XØÜY°IÐ01'&632#4&#"'&632#4&#"'&632#4&#"'&632#4&#"'&632#4&#"'&632#4&#"'&632#4&#"'&632#4&#"-pa`qh122/æq``ri032.Qq``qh032/þÒq``qh032/ýWpa`qh122/ýUqa`qh122/þæq``qh032/=q``ri032.óOggO+::+þëNhgO,9:+þ NhgO,9:+ýùNhgO,9:+þäPffP,99,OggO+::+þ NhgO,9:+ýùNhgO,9:+Kþc‹Æ #(/°/°"/°/°'/° /°/°EX°/±>Y°EX°/±>Y01#'37%%57%'%'7N z`F: z`F Mþ¦ût þ³ZœAD%þÿüóþÀE&+”AÆ`•BÅ<þ­a¢Rþ þ |bG; |bG®™D±üŽ™EÈäFEþÕüãþ»G+ÿÿšþÀß\&¿'S¬tÿÙ ³+01ÿÿ~þÀÞ&Ô'S�UsÿÙ ³+01ÿ×Á°d°EX°/±>Y°EX° /± >Y² 9°/²9°/±° +X!ØôY° а° а±° +X!ØôY° ±° +X!ØôY01#!2#!#53533!2654&#fß4òþëñýÙ½½óßß4‡ŒŒ‡G³ûÌÍÿGª¿¿ýàýñœqm•Ž4/°/°EX°/±>Y°EX°/±>Y°±° +X!ØôY01!#!34ýMó³óíû°`~\t/°/°EX°/± >Y°EX°/±>Y°±° +X!ØôY01!#!3\þóëóvüŠ::ÿ÷7° K°EX°/±>Y°EX°/±>Y² 9° /±° +X!ØôY°а °а± ° +X!ØôY01###53!!3†ô󨨘ý[ôŸýaŸªgÃþ\ÿâF: K°EX°/± >Y°EX°/±>Y² 9° /±° +X!ØôY°а °а± ° +X!ØôY01!##53!!!qÿóœœÈþ+Ñþ/Ѫ¿ÄûÿÿŸþšg°&.\ÿÿŽþš :&Ö\Q”,°b°EX°/±>Y°EX° /± >Y°EX°/±>Y°EX° /± >Y² 9°/²Ÿ]±° +X!ØôY²9°а°Ð01 !##5##33533þ{­þÎþÍC£ZóóZ£;!°ýYü÷têêýŒ°ý•þþkކ:d°EX°/± >Y°EX° /± >Y°EX°/±>Y°EX° /± >Y² 9°/´�]± ° +X!ØôY² 9°а°Ð01 !##5##33533lþÄVþËØ›CòòC›Ï:ýþýȬ²²þT:þPÇǰÿÝC°x°EX°/±>Y°EX°/±>Y°EX°/±>Y°EX°/±>Y²9°/²Ÿ]±° +X!ØôY² 9° /± ° +X!ØôY°а °в901###53533#3!!N¨óÖÖóÆÆ‹É ýî;þ×výŠzªŒŒªþÍiýIýÿÌPv°EX°/±>Y°EX°/± >Y°EX°/±>Y°EX°/±>Y²9°/±° +X!ØôY²9°/±° +X!ØôY°° а° в901###53533#3!!ômòÉÉòÔÔeþ›šþæÙþ'»ª³³ªýážþý²ÿÿŸþš³°&+\dÿÿ~þš¬:&Ù\]Ÿ„° —°EX°/±>Y°EX° /± >Y°EX°/±>Y°EX° /± >Y² 9°/²Ÿ]²?q´�Ÿq²ÿq²r´Ïßq´_oq²Ï]²/]²r°±° +X!ØôY°± ° +X!ØôY01!!!#!#3’ŒfýŒòýtóó0€Ãûmý“°~g: ‰°EX°/± >Y°EX° /± >Y°EX°/±>Y°EX° /± >Y² 9°/´¿Ï]²ïq´/r´O_q´�]¶�Ÿr°±° +X!ØôY°± ° +X!ØôY01!!!#!#3q¥Qþ¢óþ[óówÃÄüеþK:ÿÿþš‚°&7\ÿÿ<þšé:&Þ\Ýÿÿ é°<ÿÿ þ_õ:Œ é°\°EX°/±>Y°EX°/±>Y°EX°/±>Y²9@ 4DTd]²9°/±° +X!ØôY° а° Ð01!3###53!z`þhlÇòÐvþiìÄýª þ ªû þ_õ:\°EX°/± >Y°EX°/± >Y°EX°/± >Y°EX°/±>Y°EX°/±>Y±° +X!ØôY° а°аÐ01###5333733YÕòÈ›þ»ûÝ×ûþ¼¨þ` ª‘ý4XXÌüoÿÿ2þš°&;\¹ÿÿ!þš:&[\Î2þžÆ°M°/°EX°/±>Y°EX°/±>Y°±° +X!ØôY°Ð°± ° +X!ØôY°° а °Ð01!5!53!!!33#!~þ´Lòþ��óÖóû«ëÄÄûØíûýÒb&þœ8;Q° /°EX°/± >Y°EX°/± >Y°EX°/±>Y°±° +X!ØôY°а±° +X!ØôY° Ð01#5!#!33#!õÄܦó‘óüÖwÄÄýKxüˆýÚdÿÿ�þšŒ°&Ì\=ÿÿtþš˜;&â\I�é°I°EX°/±>Y°EX°/±>Y°EX°/±>Y²9°/± ° +X!ØôY°а°Ð01##5&'&5336767éóNX£òƒ‡óB>‰£ [R°úPA ñêlpðËþ5˜:6-þÛ ªtõ;I°EX°/± >Y°EX°/± >Y°EX°/±>Y²9°/± ° +X!ØôY°а°Ð01!##5&'&53367673õó03 ¤ž`wò32¤ 11ói Š‹SgÎLþ´t2  þï  mǰ@°EX°/±>Y°EX°/±>Y°EX° /± >Y²9°/±° +X!ØôY01336632#4&#"móN¯_üó…“U·P°ý¾àïþ5Ë—týVÿÿ{ü<âp<À°EX°/±>Y01 ÿéÄ&Z°EX°/±>Y°EX°/±>Y²#9°#/±° +X!ØôY°а#° а±° +X!ØôY°±° +X!ØôY01 &&773 !3267"!54&+þ²þŒ�¥«JLXï1üAåçn¦N14ÍðœÀÉ¥€@Ò¤ZuYþ—þÅ„×þö) ¼9é·±ÕÿÎÿëeN%a°EX° /± >Y°EX°/±>Y²" 9°"/´"�"]±° +X!ØôY°а"° а±° +X!ØôY° ±° +X!ØôY01"'&&536632!3267"!54&½ãþðz~ª,-!ÿ°Ûéý]‹{bŒAN=Ê¡Zt­i$ç!½�Ca¾ëþ÷ß��¤0-Ÿ6J �ng‚ÿÿ­ °,ÿÿ.þÀÞ°&ÂsÿÙÿÿþÀÞ:&×sÿÙŸþK°—°EX°/±>Y°EX°/±>Y°EX°/± >Y°EX°/±>Y²9°/²Ÿ]²?q´�Ÿq²ÿq²r´Ïßq´_oq²Ï]²/]²r°±° +X!ØôY°±° +X!ØôY01!3#"&'73265!#’Œò»¥$<<;Býtó°ý€€ú³Ã ¿_T¬ý“°~þK :‰°EX°/± >Y°EX°/± >Y°EX°/± >Y°EX°/±>Y²9°/´¿Ï]²ïq´/r´O_q´�]¶�Ÿr°±° +X!ØôY°±° +X!ØôY01!3#"&'73265!#q¥ó»¦$; <:Bþ[ó:þ=Ãû‡³Ã ¿_TôþK:ÿÿŸþÀä°&+yÿÙÿÿ~þÀÝ:&ÙrÿÙÿÿ�þšé°&Ì\ñÿÿtþšõ;&â\ýÿÿŸþÀ6°&0ËÿÙÿÿŽþÀB:&Ø×ÿÙÿÿ­ °,ÿÿ\&$Sݬ ³+01ÿÿRÿë&DSoj ³0+01ÿÿ &$j†]³+°° Ð01ÿÿRÿëË&Dj³0+°0°-Ð01ÿÿÿöW°ˆÿÿ4ÿë„N§ÿÿŸu\&(S²¬ ³+01ÿÿYÿëø&HSqk ³$+01Wÿê:ÅT°EX°/±>Y°EX°/±>Y² 9° /°±° +X!ØôY°±° +X!ØôY° ±° +X!ØôY01 % 5!7&#"'66267'!qSvþ›þûþÌþ»èåæo¤O15ËòšÁý·Åþoþ·*þÂþgg<„Ö ) ¼:úñ踲ÔÿÿiÿëOHa:À°EX°/±>Y°Ð01ÿÿWÿê:Ú&Mj~*³$+°$°!Ð01ÿÿiÿëË/Ha:Àj("°EX°/±>Y³$+°°а$°!Ð01ÿÿ‰ &ÑjÂ]³ +°°Ð01ÿÿ_¶&Ûj.³ +°°Ð01ÿÿhÿëá"&¾j–r³/+°/°,Ð01ÿÿOÿìÄÊ&Üjø³/(+°/°,Ð01^ÿëF°l°EX°/±>Y°EX°/±>Y°±° +X!ØôY²9²9°/´�]±° +X!ØôY²9°° а±° +X!ØôY01#"$77332654&##5'!5þÌßþãäÇþàêˆm}‘—–Žeý—°›þEèÃÉäÖÍb…ƒg’ˆ«ŒÃ^þuF:X° /°EX°/± >Y±° +X!ØôY²9² 9°/±° +X!ØôY²9° °а ±° +X!ØôY01'!5!#"$77332654&##5ïý¢ŒþˆÈÚþãäÇþàêˆm}‘—–�qÄ›þCçÁÇå×Ë`…„e’‡«ÿÿš ö&¿qåF ³ +01ÿÿ~ ¡&ÔqUñ ³ +01ÿÿš  &¿jÆ]³+°° Ð01ÿÿ~ ¶&Ôj6³+°° Ð01ÿÿgÿë"&2j­r³  +° °Ð01ÿÿSÿë4Ë&Rj5³(+°(°%Ð01ÿÿ‰ÿì×#&Îj�s³&+°&°#Ð01ÿÿRÿëèË&çj³&+°&°#Ð01ÿÿþKü¡&\qñ ³+01ÿÿþKü¶&\jú³+°°Ð01ÿÿþKô&\X�³ +° °Ð01ÿÿ�é &ÌjÂ]³ +°°Ð01ÿÿtõ¶&âj"³ +°°Ð01ÿÿŸþš7°&m\æÿÿ~þšF:&Ò\Ÿÿÿ¥_ &Íjn]³ +°°Ð01ÿÿ¢¼¶&æ'ò:j*³ +°°Ð01ÿÿFþKƒ°&mL&E¯?^ÿÿGþK¨:&Òb&E°‘^ö²]² ]²  ]01ÿÿ2þKX°&;^Êÿÿ!þKm:&[^ß2î°d°EX° /± >Y°EX°/±>Y°EX°/±>Y°EX°/±>Y²9°/±° +X!ØôY² 9°а° в 901#!!#53!!3Ú�£þÜþÄþÄþàœƒuþ|03 þ|�•ýk#ýÝ•ªqýæý�!í:d°EX° /± >Y°EX°/± >Y°EX°/±>Y°EX°/±>Y²9°/±° +X!ØôY² 9°а° в 901#!!#53!!3J‹.þìÑÑþê-“ˆþèÅÈþç€×þ)|þ„ת¹þ�sþGT€° E°EX°/±>Y°EX°/±>Y²9°/°± ° +X!ØôY°± ° +X!ØôY013!"54$3!"3ŽòýÙñþìò5þËˆŠŠˆ”úPÍÌûý.”nqœÿÿSÿëGf¥°!O°EX°/±>Y°EX°/±>Y²9°/°± ° +X!ØôY²9°а±° +X!ØôY01!"54$3!376676&'3#%!"3kñþìò5òLckì!$þü½þÂþËˆŠŠˆÍÌûûylL¦Nc–GÍÜ”nqœ^ÿé~"3b°EX°/±>Y°EX°/± >Y°EX°/±>Y°EX°/±>Y°± ° +X!ØôY²9°±&° +X!ØôY° °-Ð0132336676&'3#&'#"5&&#"3267&&5^ÞÉR„2óNCu�ì"#þæÏ~¬,4šhÇÞ¯#eB|vs}Hh"=>:BûORf¼¥aÌf¹[þöþäW^W\"ì&17Ѩ–²;7";ÿèà°,_°EX°/±>Y°EX°)/±)>Y²)9°/±° +X!ØôY°± ° +X!ØôY²9°)±° +X!ØôY²")9014&##532654&#!5!236676&'3#&'¦}iÔ››ˆƒŒþ `ù €zƒs?5htì""þñÇ£´xkƒÅpwgrÅÕËr¥1%«~DY°EX°/±>Y±° +X!ØôY² "9²"9°/±° +X!ØôY°"±!° +X!ØôY²)901%36676&'3#&'54&##'32654&#!'!2"+Xa ì"$ó± žSLé·e_`dþú ÒåYWeZë*.�€L¤Of’G×çr‚K;A½FAEQê™Pq$xWIþå°#[°/°EX°/±>Y°EX°/±>Y² 9° /± ° +X!ØôY°±° +X!ØôY² 9°±#° +X!ØôY01%##&&554&##'32654&#!'!23›š=R(pòÈ’‡„‡þà#ó uq{m–þÈ"ŒFtqƒÃqsm}ÃÜËq£2'°‚xuþÑñ:"[°/°EX°/± >Y°EX°/±>Y² 9° /± ° +X!ØôY°±° +X!ØôY² 9°±!° +X!ØôY01%##&&554&##532654&#!'!23ñ›šBfd]ùågfheþá#ÒïXV_U’ þÈ/b0SMV³JDEWÁ³œPv' …_"Cÿè~°!Z°/°EX° /± >Y°EX°/±>Y°EX°/±>Y° ±° +X!ØôY°±° +X!ØôY°±° +X!ØôY01!!#532!36676&'3#&' þTâþù5)‰z‘NCt�ì"#þçÏ´Æ ëþþrþŽÄ 1°û·Rf¼¥aÌf¹[þöþä¸Ç?ÿèY:!Z° /°EX°/± >Y°EX°/±>Y°EX°/±>Y°±° +X!ØôY°±° +X!ØôY°±° +X!ØôY0136676&'3#&'!##77265 RF[dì!$û·¸É þÿ¼Û@)bU:ý-Rf¥“\Á`x¯Vöþù¸Ç þúþÂþÐÓ¿Û̘ÿè…°—° /°EX°/±>Y°EX°/±>Y°EX°/±>Y°EX°/±>Y°±° +X!ØôY²9°/²/]²Ï]´_oq´Ïßq´�Ÿq²?q²Ÿ]²ÿq²r²r±° +X!ØôY0136676&'3#&'!#3!OBv€ ì"$þçÏ´Å ýwóó‰°û·Rf¼¥aËg|»\þöþä¸Çý“°ý€€wÿè[:‚°/°EX°/± >Y°EX°/± >Y°EX°/±>Y°EX°/±>Y²9°/´¿Ï]²ïq´O_q´�]¶�Ÿr±° +X!ØôY°± ° +X!ØôY01!#3!336676&'3#&'þPóó°óRF\eë""û¸·É ºþF:þC½ý-Rf¥“[Áa~ªUöþù¸Çbÿë¶Å!>°/°EX°/±>Y°EX°/±>Y°±° +X!ØôY°±° +X!ØôY01 !2&&#"36676&'3»þõþ²N q²D?C�U¤Â¤|ˆë%þß]  ^-,°!#ñ²þøµñˆxQ±`§oLÛêUÿëåN!;°/°EX°/± >Y°EX° /± >Y±° +X!ØôY°±° +X!ØôY01%6674&'3#"55432&&#"ZRC ë دðþë æ^Ž/./zD~‰¯EF6s5Ei0¦ª9ä*â:#½Ή*ŒÍ"ÿèX°A°/°EX°/±>Y°EX°/±>Y°±° +X!ØôY°а± ° +X!ØôY01!5!!36676&'3#&'çþ;€þ8OBu� ì"#þçÏ´Æ ëÅÅü|Rf¼¥aËg|»\þöþä¸ÇDÿèÌ:A°/°EX°/± >Y°EX°/±>Y°±° +X!ØôY°а± ° +X!ØôY01!5!!36676&'3#&'‰þ»‹þ­RF[eë"$ü··É wÃÃýðRf„uIžJaŒD×ç¸Ç‡ÿëþÅ*n°EX°/±>Y°EX°/±>Y²(9°(/²?(q²Ÿ(]±° +X!ØôY°±° +X!ØôY°° в(9°°а±"° +X!ØôY01"32653# $5467&&54$!2#4&#"33¤¤·¡‹±êþ·ãþùþ¼Š„uƒ/â6ê«}Ÿ£•�¾†uzgƒ…bÍÖäÉ}¬+/¦dÈØß³\y~_hvÁÿÿ`ÿì MŽÿÿ.þKý°&Â^oÿÿþKý:&×^oÿÿþ~°&$YNÿÿRþ…N&DY�ÿÿŸb!&0v’[ ³+01ÿÿ€uß&Pv¡ ³*+01ÿÿ(ã"&:Cà\ ³+01ÿÿ%ÐË&ZCV ³ +01ÿÿ(ã!&:v—[ ³+01ÿÿ%ÐÊ&Zv  ³ +01ÿÿ(ã &:jw]³+°°Ð01ÿÿ%ж&Zjí³ +°°Ð01ÿÿþ¥°&$_ëÿÿRþ¬N&D_DÿÿÇ&$]ôH ³ +01ÿÿRÿë…&D]~ ³;+01ÿÿLð&$U¢R³+°°Ð01ÿÿRÿëÜ®&DU2³2+°2°0а2°8Ð01ÿÿÿÝä&$VªF³+°°Ð01ÿÿÿoÿë¢&DV<³0+°0°5Ð01ÿÿ÷&$Wª,³+°°Ð01ÿÿRÿë�·&DW5ì³0+°0°5Ð01ÿÿ&$X¬$³+°°Ð01ÿÿRÿëÞ&DX6ä³0+°0°8Ð01ÿÿþ¥G&$'Q©Y_ë ³+01ÿÿRþ¬&D&Q<_D ³0+01ÿÿÝ&$YÚM³+°°Ð01ÿÿRÿë›&DYc ³0+°0°?Ð01ÿÿÝ&$SÚM³+°° Ð01ÿÿRÿë›&DSc ³5+°5°,Ð01ÿÿy&$ZßT³+°°,Ð01ÿÿRÿë7&DZf³0+°0°LÐ01ÿÿ2&$[ßV³+°°Ð01ÿÿRÿëð&D[j³0+°0°?Ð01ÿÿþ¥\&$'Sݬ_ë ³+01ÿÿRþ¬&D&Soj_D ³0+01ÿÿŸþ¯u°&(_À ÿÿYþ¥øO&H_•ÿÿŸuÇ&(]ÁH ³ +01ÿÿYÿëø†&H]€ ³/+01ÿÿŸuc&(W�l ³+01ÿÿYÿëø"&HW@+ ³#+01ÿÿŸð&(UuR³+°°Ð01ÿÿYÿëÞ¯&HU4³$+°$°,Ð01ÿÿÿ²uä&(VF³+°°Ð01ÿÿÿqÿëø£&HV>³"+°"°)Ð01ÿÿŸÓ÷&(Wx,³+°°Ð01ÿÿYÿë’¸&HW7í³"+°"°)Ð01ÿÿŸu&(Xy$³+°°Ð01ÿÿYÿëøß&HX8å³"+°"°,Ü01ÿÿŸþ¯uG&('QY_À ³+01ÿÿYþ¥ø&H&Q>_• ³"+01ÿÿ­Ç&,]~H ³+01ÿÿ�úr&ò]aÿó ³+01ÿÿŸþ¯­°&,_} ÿÿ‚þ¯�&L_` ÿÿgþ�Å&2_ÿøÿÿSþ�4N&R_šÿøÿÿgÿëÜ&2]] ³+ +01ÿÿSÿë4…&R]› ³3+01ÿÿgÿëq&2UÇg³  +° °(Ð01ÿÿSÿëù®&RUO³(+°(°0Ð01ÿÿÿëù&2VÑ[³  +° °%Ð01ÿÿÿŒÿë4¢&RVY³&+°&°-Ð01ÿÿgÿë% &2WÊA³  +° °%Ð01ÿÿSÿë­·&RWRì³(+°(°-Ð01ÿÿgÿë3&2XË9³  +° °(Ð01ÿÿSÿë4Þ&RXSä³&+°&°0Ð01ÿÿgþ�\&2'QÑn_ÿø ³ +01ÿÿSþ�4&R&QY_šÿø ³&+01ÿÿbÿë &BvÕM ³) +01ÿÿSÿëëß&CvV ³)+01ÿÿbÿë &BCN ³' +01ÿÿSÿëëà&CCŸ ³'+01ÿÿbÿë ¹&B]: ³5 +01ÿÿSÿëë…&C]œ ³5+01ÿÿbÿë U&BWÛ^ ³) +01ÿÿSÿëë!&CW[* ³)+01ÿÿbþ¥ c&B_ ÿÿSþ�ëË&C_›ÿøÿÿ†þ�ñ°&8_ÿøÿÿ{þ¥ :&X_Eÿÿ†ÿëñÇ&8]H ³ +01ÿÿ{ÿë r&X]šÿó ³+01ÿÿ†ÿël!&DvÔ[ ³+01ÿÿ{ÿëqÊ&EvT ³"+01ÿÿ†ÿël"&DC\ ³+01ÿÿ{ÿëqË&EC� ³+01ÿÿ†ÿëlÇ&D]H ³+01ÿÿ{ÿëqr&E]šÿó ³+01ÿÿ†ÿëlc&DWÚl ³+01ÿÿ{ÿëq &EWZ ³!+01ÿÿ†þ�l>&D_ÿøÿÿ{þ¥qº&E_Eÿÿ é"&<CÙ\ ³ +01ÿÿþKüË&\Ca ³+01ÿÿ þ¯é°&<_Õ ÿÿþü:&\_:ÿ[ÿÿ éÇ&<]ÖH ³ +01ÿÿþKür&\]^ÿó ³+01ÿÿ éc&<W–l ³ +01ÿÿþKü &\W ³+01ÿÿÿ1ÿëš&2/þÅÕÿÿ§må1FÚS3@ÿÿ­må1F°ff@ÿÿ­må1F°ff@ÿÿþC™'BÿB$@  0]´ 0q@ p€� °]01B÷[°EX°/±>Y013#B¢w<ݳeþš»Eø^°EX°/±>Y01#53^¢w<ÝVþ¢\ÄBþú[ °/01%#3[›~<Ýþæ  ÿÿø7Gø|À@ÿÿB÷¤&÷÷I°EX°/±>Y°Ð01ÿÿEø¯&øøQ°EX°/±>Y° Ð01Bÿ™" °/° Ð01%#53#53T¢p<ÖE¢p<ÖIþÎ'äÙþÎ/Ü@° L°EX°/±>Y°EX°/± >Y°EX° /± >Y°EX°/±>Y° ±° +X!ØôY°аÐ01!#!5!3!þˆóþ�sóxrüŽrÈvþŠ\þ`9°~°EX° /± >Y°EX° /± >Y°EX°/± >Y°EX°/± >Y°EX°/±>Y°EX°/±>Y±° +X!ØôY°±° +X!ØôY° ааа°аÐ01!!#!5!!5!3!!!9þˆóþŽrþŽróxþˆxþ` Â´ÄvþŠÄýLˆÿDø ² +014632#"&5ˆxefyxfey!^yx_M`uv_ÿÿ™Fé&»ÿÿ™êé&'»_Kÿë`Å'5CQU‹°R/°T/°EX°/±>Y°EX°/±>Y°° +XØÜY° а°а°$° +XØÜY°±+° +X!ØôY°±2° +X!ØôY°+°9а2°@а$±G° +X!ØôY°±N° +X!ØôY0146326632#"&'#"&54632#"&5326554&#"326554&#"326554&#"'0¨ŒIt&%tKŒ©¨‹Lu%&rIލý¤‰�¨¨‹Š¥ŽKBEDIBCHÇKBEDIBCHûMHEBHJBCHß}Ç}e­<34;­N€¬:44:¬€�®­€M¬¬üÌ@ZWCN@ZZ@N@ZWCN@ZZ@æAXXAMAZZAûÕHrHÿÿB ÿÿBVl—3¶°/01#53<÷§þà §&þq††T—¶°/01#û þà§÷÷¶þzþz��ÿÿš²°&%-mq' °/°/017'ª}Ç}mHrH?0VÅ ?°EX° /± >Y°° +XØÜY² 9°/± ° +X!ØôY°Ð°°а ° Ð013##5!'3'Ô‚‚Äþ3ÌÉÄôx˜°°puý³IþµiŒÿºN°EX°/±>Y°EX°/±>Y° в¯ ]² r²O q²o r² ]°± ° +X!ØôY° °Ð016632#4&#"# $oH|‡ÅC?3EŬy@G–�þÉeY/*ýÒ v°a°EX° /± >Y°EX°/±>Y² 9°/±° +X!ØôY²9°/±° +X!ØôY°а° а ±° +X!ØôY01!!!#5#53!!!ý‚þíó‰‰×ý~mÂÃèèÃÃþCOkÅ(„°EX°/±>Y°EX°/±>Y²'#+°±° +X!ØôY°а'±(° +X!ØôY° а'° в#]²#]°#±$° +X!ØôY°а#°а±° +X!ØôY²#901!!53667#53'#53'4632#4&#"!!!ë Áü& ..§¡ž˜èÃÏäëmUVbˆþ~¦2�1 ˜@ÃzÃcÏíÙ²ieƒvcÃzÙÿë#°#,‰°EX°/±>Y°EX°/± >Y°EX°/±>Y°EX°/±>Y°±° +X!ØôY°±° +X!ØôY°°в9°/°°"а±$° +X!ØôY°±,° +X!ØôY013#3267#"&5####!2332654&##TÂÂ:0&V.†˜Xeˆò~úxòˆlUý1~ƒ……ƒ~Aþù´ýªC9²�¨VŒ_ýä°d“ý§”li“ÿÿSþů&G'E‰BB›ÿ„KÿëàÅ+‚°EX°/±>Y°EX° /± >Y²+'+²/+]°+±° +X!ØôY° ±° +X!ØôY°°а+°в']²/']°'±(° +X!ØôY°а'°а±"° +X!ØôY01!3267#"55#535#535432&&#"!!!œþ4š…9p48{>íþÛ’’’’#íY°EX°(/±(>Y° °° +XØÜY° °а ±° +X!ØôY°±° +X!ØôY°°а(°!° +XØÜY°(±/° +X!ØôY°!±6° +X!ØôY01#"&554632#4&#"32654632#"&53326554&#"'©˜„‡››……™¡>9:=>;7>¦Ž�¥¥Ž�¦©KBFDICCHýø}Ç}%j•«€M€­—j0EZAM@YE.ý@­¬€N�«¬€@ZWCN@ZZ@øHrHEÿí�Å'Z°EX°/±>Y°EX°/±>Y² 9° /±° +X!ØôY°а±° +X!ØôY°± ° +X!ØôY° °%Ð01&55#52674632354&#"66Ûáç0d46c/³œˆ¬Ó¶`t0*!,-LR îÔ » ²ÃÝ´—*•þ»eE„„Š,Y°а аа°° +XØÜY²]°аа°а° а°а°° +XØÜY°Ð01'##333####5!ô�=†o‰�Žƒný÷Šuˆ‡ÑþÂJþ·þ‹uýä½þE»_–ÿì‘NN°EX° /± >Y°EX°/±>Y²  9° /°°° +XØÜY° °° +XØÜY° °° +XØÜY01%#"5432!667&!&&W¼_ÚþÎCÉÏ ý7�M_ºWþ�J�:6‹^7;IèâOþÊç/þ¸59<>)A9þë4=ÿÿcÿõY²'q †' 0K°EX°/±>Y01ÿÿfÿõðÀ'n”' ¿0â°EX°/±>Y01ÿÿhÿõ ¯'lÿþŽ' ÷0°EX°/±>Y01ÿÿ^ÿõy¯'v Ž' 60k°EX° /± >Y01CÿëNí!;°/°EX°/±>Y² 9° /°±° +X!ØôY° ±° +X!ØôY01#"54327&&'2655&&#"èSþÔáàþâüÞZ�2ꪨxž$™l}“í<þjþØÜõþÉÐå5/«Ô/û‘Μ4G°�x¯¦ÿô°(°/°EX°/±>Y°°а±° +X!ØôY01#!#!ô×ý_ÖNåÔú,•@þóÁ°T°/°EX° /± >Y² 9°/°Ð°±° +X!ØôY²9° ± ° +X!ØôY² 9°°Ð01!!55!!þ;ûRý®Güÿü%ý–×ÈƘÃý–žmá1°/±° +X!ØôY01!5!áü½CmÄ;‹° 2° /°EX°/±>Y°EX°/±>Y°а ± ° +X!ØôY01373##5!"[Òþ¾ØÑc|~~4úPAÅdÿëÙN'5^°EX°/± >Y°EX°/± >Y°EX°/±>Y°EX° /± >Y°±° +X!ØôY°±$° +X!ØôY°+а°2Ð01#"&'#"554326632#4&#"3265!3275&&#"ÙþöÝŸèMNèžÞþøÜŸéNMé Û ó|v…½¿ƒw}úq{x‚¿¿„v{ÿçþÓÓ“Ã-ç:æ/Á��ÁþÑæ—»ú_$`þÿ¸šš¸`$^ûº˜ÿ²þK¨-8°EX°/±>Y°EX°/± >Y± ° +X!ØôY°±° +X!ØôY01#"&'732654632&&#"�º¦$: ::Bï$H,+OT?³Ã ¿_T÷³Â ¹^Teù"3Œ²+¶0@P]²p]°±° +X!ØôY° ° +XØÜY°° а ±° +X!ØôY°вp]¶0@P]°°#° +XØÜY°°&а#±*° +X!ØôY°±0° +X!ØôY°*°3Ð0166363267#"&'&&"66363267#"&'&&"o/|AEN]OPB@|0 0|@BPO]NEA|//|AEN]OPB@|0 0|@BPO]NEA|/mDN.)MEÆEM).NDèDN.)MEÆEM).ND‘¦ïçI²+´@P]°±° +X!ØôY´@P]°±° +X!ØôY° а° а°а°Ð013!!!'7#5!7!5!Ðþ¿|½ýÔodKª|þk’dàÊßÉÈA‡ÉßÊAÿÿ–ÿìÝU'ÿüýGW¼@9š3°EX°/±>Y° д° À ]²¯ ]²/ q²0 q²p ]² ]01ÿÿ’ÿêòU'ÿüý}G!¼@9š3°EX°/±>Y°д°À]²¯]²/q²0q²p]²]01$ù°)°EX°/±>Y°EX°/±>Y°°а° Ð013#!'#37¤Òƒþ€Óþ~ÙÜ×ݰý'ý)×ß<<þ!þ";;Qÿ€=°/¶0@P]²°]01%#753=~n=¯nîøŽ-n°/°EX°/± >Y°EX°/± >Y°EX°/± >Y°EX°/±>Y°EX°/±>Y°±° +X!ØôY°±° +X!ØôY°°аÐ013#5354632&&#"3#!#3½¥¥æÏHŽ\%>xFmfÕÕgóó†´\ÃÔÉaa\´üz:ÿÿ*R-&IOÏÿÿ*æ-&I'Ïÿÿ*!-&I'IÏOžYþrì® *;AGMS]aeimqu~‚†ŠŽ’–ƒ°M/°ƒ/°/°‡/°A/|°v/°EX°J/±J>Y°EX° /± >Y°EX°/±>Y°EX°+/±+>Y° °° +XØÜY²ð]²°]°а ° ° +XØÜY°°'° +XØÜY°°0а5а'°Uа8а‡°>° +XØÜY°A°@° +XØÜY²O@r°A°rаnаjаBа@°sаoаkаCа>°EаJ°K° +XØÜY²/Kq°fаbа^аNаJ°gаcа_аOаM°Rд€v�vq² v]²_v]²@vq²vq²0vr°v°Tв Tr° °~аƒ°‚° +XØÜY°M°†° +XØÜY°°Š° +XØÜY°°ŒÐ°‚°�аƒ°�а†°‘а‡°”аŠ°•Ð01#"&55463232#4&#"32653#"&773326533!5353!#%5!#532654&'#5!!5!!5!5!!5!!5!32654&###535#53#53%#535#53#537€eh€€ff�C¼eo,(06i\þ„K@@JJB?Jº\jQ[iT62(7ùÄqÄ(Çoøm5Äì6oü\~253/Ðý[ý\ ý[ý\¼]:<9=]üñqqqqqq"ooooooÔbyybp`{{`þ¸%KK'> F-LOHDOODpENNEOþ†O\QM.-6,üÉ;ÊqqÊþÅt©©tþã©ü¶©+(&.Jttttttù8qqqqqqÄ((' þÓü~úüù~ü~úüù\ýÕ×b"&*-° /° /°° +XØÜY° °° +XØÜY° °!° +XØÜY01 4676654&#"36632#33#3#¿üAüD(H^©“ˆ§Â;+6;3*O;ÊÊÊKRü1ü1Ïñ5='ƒN€—‚‚34?52M7ZX[ªýL �ÿÿÿ w³&JqÿloÌÅ #°EX°/±>Y°а° ° +XØÜY°Ð013#%73#“fÓæSþÙœlQ·Œ9þÁ“À̉hÿõ,#/r°EX°/±>Y°EX° /± >Y²- 9°-/´ß-ï-]´--]²¿-q±° +X!ØôY²-9²-9° ±!° +X!ØôY°±'° +X!ØôY01#"&5467&&546324&#"3264&#"326öJ?JW½�•ÅYNCL¶‹†¯¦T;BYYC;SD18IK70DP:[d>p}}p?c[:issþ2/<Y°EX°/±>Y±° +X!ØôY² 9°/´]±° +X!ØôY° ±"° +X!ØôY01%2655#"&54632#"&'726754&#"•BZR-�£¶�Ž½Æ•4p3 +TJ4HR=Y°EX°/±>Y°±° +X!ØôY²9°/±° +X!ØôY°±"° +X!ØôY012&&#"6632#"$54$"32654&\I�B'7pGp�1‰T¹ÉùÈÁþÿ­Mn{\Zlb�ºŽrV05Æ®¯ÙüÆ)Êùý’3-n”pRYe9� E°EX° /± >Y°EX°/±>Y² 9°/±° +X!ØôY°°а° а ° Ð013##5!'3!q§§òýÅ CõýÉE›ÃØØŸýÀ Oÿï»�*„°EX°/±>Y°EX°/±>Y°±° +X!ØôY°° в*9°*/²Ï*q²¯*]´/*?*q²*]²ÿ*q²�*r±)° +X!ØôY²)*9°°а±"° +X!ØôY012654&#"#'&632#"&77332654&##5ZV^XMcéê°Çè`T`gúȯûèlV[maa¹«QI>YM=’³¬ P…&"Šc¡·­¦?Z^DXQ±S’�N°EX°/±>Y°EX°/±>Y±° +X!ØôY°в9°± ° +X!ØôY°° а°Ð01!!56654&#"#'&632!’üÑžTEMMXcêéĺц›ÍóÀƒOn7E`fL›Ò¼ªv°ŠÁGç�6°EX°/±>Y°EX°/±>Y°°° +XØÜY±° +X!ØôY01!##5%çò® ´È!mÿï� ;°EX° /± >Y°EX°/±>Y° ±° +X!ØôY°±° +X!ØôY01#"$54$32'4&#"3265þÿÑÒþþÒÑóyhgxyhgx›ÄèèÄWÃèèÃi€€iþ¨l€€lJë� F°EX°/±>Y°EX°/±>Y±° +X!ØôY²9°±° +X!ØôY² 901%!!5!5!~mü_YýÈpÀÀzRÁu<�1°EX°/±>Y°EX°/±>Y°EX°/±>Y²901!#!(  þbóþh oý þi¢ë,Q� S°EX°/±>Y°EX° /± >Y°EX°/±>Y°EX°/±>Y²9²9²9² 901!!!!<ñþŠþçùøþå€þ‰ø•ý¿ý´�þcLA4×�k°EX°/±>Y°EX° /± >Y°EX°/±>Y°EX°/±>Y°EX°/±>Y°°Ð´$4]²C]°°ж+;K]°° Ð013!###!337™þãçÌÊçþäšÉÒ`-ûsüù�üÐ0‹� 6°EX°/±>Y°EX°/±>Y°EX°/±>Y°ж$4D]0137!#!@%þC÷þE5A>[ûs�~ÿî{�6°EX°/±>Y°EX°/±>Y°EX°/±>Y± ° +X!ØôY01#"$533265{þçååþæò�}}��ý ÈááÈöý ozypö<é�/°EX°/±>Y°EX°/±>Y°±° +X!ØôY°Ð01!#!5!éþ óþ¦­Ìü4ÌÁQÿî�'‚°EX° /± >Y°EX°/±>Y² 9²©]²z]²*q²˜]´(]°±° +X!ØôY° °в¦]° ±° +X!ØôY°°"в©"]°±%° +X!ØôY014&'&&54632#4&#"#"$773326'o�áÍöÑÖñémjlig ×ÏþüÛØþïéŒlux;=O 3›œ“¹Á§P]M=@J#2Ÿ—›´º±]TNŽ<�#`°EX°/±>Y°EX°/±>Y°EX°/±>Y²9°/²o]²¿q±° +X!ØôY² 9°±"° +X!ØôY01#!2#&&554&#'32654&##€òÎÑïdam_ ú b^ðÜgfgfܽþC�º¢]…)�jc)_f3aUZÂVML^hÿ”�!B°EX°/±>Y°EX° /± >Y² 9°±° +X!ØôY° ±° +X!ØôY01'#"55432'4&#"3265f73˜¡Ÿ5x@âþããâó‘|}��}|�ÍZ�=˜‚ž ÕóÔ þöÓœœô�žž�~ÿëRÅ ;°EX° /± >Y°EX°/±>Y° ±° +X!ØôY°±° +X!ØôY01#"32'4&#"3265Rþùâãþøâãò€yy~€yz}1þäþÖ*M,þÔþå%³¬¬³þk´­¬µfÿîd� ;°EX° /± >Y°EX°/±>Y° ±° +X!ØôY°±° +X!ØôY01#"55432'4&#"3265dþäãâþãããó‘|}Ž�}|�ÍÕþö ÕóÔ þ÷Ôœœô�žž�Ž…� [°EX°/±>Y°EX° /± >Y°EX°/±>Y°EX°/±>Y°°Ð@ +;K]°°Ð@ $4D]01!##373…òýóòò òüè�üé—‡&1°/±° +X!ØôY01!5!&ýq�‡ªŽn�k°EX°/±>Y°EX°/±>Y°EX°/±>Y°EX°/±>Y°EX° /± >Y°°Ð@ $4D]°° Ð@  + ; K ]°Ð013!#'##!û=0óþÛ¥þÛò23Zûsöý úý�Žy�)°EX°/±>Y°EX°/±>Y±° +X!ØôY01%!!3€ùýòÀÀ�Ž]� q°EX°/±>Y°EX°/±>Y°EX°/±>Y°EX° /± >Y²9°/²¯]²Ïq´/?q²]´�Ÿr±° +X!ØôY² 901##33!!ëkòòUA-þd¶þËÕþ+�þ àýÕýž/ÿîŒ�/°EX°/±>Y°EX°/±>Y° а± ° +X!ØôY013#"&7733265šòí¹ËìêkZNf�üå±Ó»²YZkYŽ€�°EX°/±>Y°EX°/±>Y01!#3€òò�Žz� „°EX°/±>Y°EX° /± >Y°EX°/±>Y°EX°/±>Y²9°/²]´ßï]´oq²Ïq´Ÿ¯q´/?q²¯]´/]²r±° +X!ØôY01!#!#3!3zôýúòòôØþ(�þ óhÿï_� W°EX° /± >Y°EX°/±>Y° °а ±° +X!ØôY°±° +X!ØôY² 9°/±° +X!ØôY01%#"55432#4&#"32675#5!_8ó¼ëþÛ$ääüézv|š›ƒ`wïáŸFj ÕóÓ ȨZ[¡zô}¡Ô±ŽÚ� f°EX°/±>Y°EX°/±>Y²9°/²]´/?q´oq²¯]´/]²Ïq±° +X!ØôY°±° +X!ØôY01!#!!!ƒýýòLý¦Þþ"�ÁþÔŽÎ� V°EX°/±>Y°EX°/±>Y² 9° /² ]±° +X!ØôY°±° +X!ØôY°±° +X!ØôY01!!!!!!xþNüÀ@ý²øüþÄÀ�ÁþòŽB� ;°EX°/±>Y°EX°/±>Y°± ° +X!ØôY°± ° +X!ØôY013!2#326554&#Ž·Ù$þÜÙÅÅr˜™q�þóÑÒÒþõÌüô¢{Óy£hÿï0�D°EX° /± >Y°EX°/±>Y°Ð° °а ±° +X!ØôY°±° +X!ØôY01#"55432#4&#"3265(ÿÚ×þê×Þýêuup‹‹ptu‡ÄÎ ÓóÒ ÎÂmh¡zô|¢ioŽ.� �°EX°/±>Y°EX°/±>Y²9°/²]´/?q²Ïq´/?r²ÿq´oq²¯]´/]²Ïr±° +X!ØôY²9°±° +X!ØôY°±° +X!ØôY013!2#!2654&#%32654&##Ž­×ïd[rzáÍÿ`[\_ÿ»hkgl»�¡ S‚!‘a£§úþÆMKNT¨IGL@�i… °EX°/±>Y°° +XØÜY0173#�w~Ú ÿþ÷švÌþ�<° /² ]°° +XØÜY°° +XØÜY°° +XØÜY°° +XØÜY°а°Ð01#'73#"&7733265—ºÆo°“–¯µAFCBÏ»àa}|b/:;.¬� Y°EX°/±>Y°EX°/±>Y°EX°/±>Y²9°/´?O]±° +X!ØôY°° Ð@  + ; K ]01%!#3#!#WþVþÌøÌþþ W©éé�ûs«Åj䪞 E°/°° +XØÜY¶/]°°а°а° ° +XØÜY° ° +XØÜY¶  / ]013#'#'3#�Æ%å  åPðѯêÿ••´þõÿ3ärž B°/°а°° +XØÜY¶/]°а° ° +XØÜY° ° +XØÜY¶  / ]01#'#'3#3rå Ÿå%Åþe¯Ðïê••W cä[ËT°/°а°° +XØÜY¶/]°а° ° +XØÜY° ° +XØÜY°° +XØÜY°° +XØÜY² 901#'#'3'6654HrÓ³³Òßè@7F;Œ—K6ꨨ}} iXL:>;dçmún°/°° +XØÜY¶/]°а°а° ° +XØÜY°° +XØÜY° °а°° +XØÜY²/r²q° °° +XØÜY²q°°Ð01#'#'37#"&#"'46323265mг²Ð#í[A4&*_YB)‰&-í§§íFkE6!EnD8"vÌþ�<°/²]° ° +XØÜY°° +XØÜY° а°° +XØÜY°° +XØÜY°Ð01#"&7733265'3#ö°“–¯µAFCBW³¤„°a}|b/:;.à¼vÓô% T°/° ° +XØÜY² q° ° +XØÜY°а °° +XØÜY°° +XØÜY°° +XØÜY°° +XØÜY²901#"&7733265''66'56H쬒“­±AECAÑG=LD «T=°_xx_-99-6v_OD47;vÐõÜ#m°/° ° +XØÜY² q° ° +XØÜY°а °° +XØÜY°° +XØÜY°°а°° +XØÜY´r°° ° +XØÜY´  r°°#Ð01#"&7733265#"&#"'46323265í­’“­³?ECAž_G8‚)*h^H,�*,°`zz`.::.KkG3$JoG2$\þšOÈ °/°/01#3Oóóþš.þ_ÓB/°/°EX°/± >Y°°° +XØÜY°± ° +X!ØôY01%#"&'732654&'ca‹jB^&#1 9/;7B4�LeqŽ ."0N0ÿ°þKŽÍ°/°EX°/± >Y± ° +X!ØôY01%#"&'73265Žº¦$: 9;AÍþô³Ã ÆXS ÿžÿ×í…°/°/°±° +X!ØôY01!2'665&&#!b"ú3ºUrl©�þÞ…ÿäˆþë.¬&�i†“5E°6°EX°/±>Y°EX°/±>Y°°° +XØÜY±° +X!ØôY01!#!5%Eóþãɳ4U7ÅR°EX°/±>Y°EX°/±>Y±° +X!ØôY²9²9°± ° +X!ØôY°° а°Ð01!!56654&#"#'&32!7ü9ÚsYrb|ëåÒõ�”þ¼�§€£Mb„�~ è»}ä£þª^ÿë1Å*}°EX°/±>Y°EX°/±>Y²9°/²?q´Ïßq²Ÿ]²Ÿr°±° +X!ØôY°° а±*° +X!ØôY²*9°°а±#° +X!ØôY0132654&#"#'&$32#"$77332654&##”©}nwsc~éÊÛtl€wþåÜÉþíê‚lw‰~ƒ©Fukisq\§ãØÇ]®0,³tÈå×¾axzp{uAc° L°EX° /± >Y°EX°/±>Y² 9°/±° +X!ØôY°°в9°° а ° Ð013##!'3!'«¸¸òý�púý‡‡Äþ½C•ØüW[)Œÿë0°e°EX°/±>Y°EX°/±>Y°±° +X!ØôY²9°/°°а±° +X!ØôY°±° +X!ØôY°°вt]01!!6676#"$?32654&#"§TýÊ,*rGÍçôçÀþ÷ä{cqwzqda‹%Òþ“ )þøåÖþðÓÂjvŸƒ„¥A=�ÿëSÅ'Q°EX°/±>Y°EX°/±>Y°±° +X!ØôY²9°/±° +X!ØôY°±"° +X!ØôY012&&#"6632#""32654&µM�:/6kF’±; _ÃãþüÓÞþãA¯\€"•tjz€Å!¼á¿6<þïÓßþâ8XýJA8h¹È¶…ƒ¤Î° /°EX° /± >Y°EX°/±>Y° ± ° +X!ØôY°Ð01#77!5!Îå¢$ó$׸ý4·íþÙþ%þ¯ššJïÃmÿë]Å#/_°EX°/±>Y°EX° /± >Y²- 9°-/±° +X!ØôY²-9²-9° ±!° +X!ØôY°±'° +X!ØôY01#"$5467&&54$324&#"3264&#"3269~m|“þéàãþê�~m|ÒÑΔsu��wt‘%}efyzge{0o©-.¸xË××Ëx¸/,©oÂÓÓü§k†…ln~û`{wdcww\ÿë!Å'N°EX° /± >Y°EX°/±>Y±° +X!ØôY² 9°/±° +X!ØôY° ±"° +X!ØôY01%2655#"5432#"&'726754&#" ‚¡1ŽSÐñÇâþ×ìKŸC =€w[€!‚xb„x­Á¹DCFåÚþ×þéþ«þìþϺòG:‚­³¯…ˆ§Ž@� B°EX°/±>Y°EX°/±>Y²9°/± ° +X!ØôY°±° +X!ØôY01#!2#'32654&##€òãÔûûÔññjrrjñ†þz�Ù«¬×ÂoPQtOÿïÊ�j°EX°/±>Y°EX°/±>Y°±° +X!ØôY²9°/°°а±° +X!ØôY°±° +X!ØôY°°в%q²u]01!!6676#"&?32654&#"|GÉþ %l:¶ÎÜã¾þéq[gef[WZø•Æþó Ë·²Ò¤ ETl^[m/'pÿõ ,'X°EX°/±>Y°EX°/±>Y°±° +X!ØôY²9°/´]±° +X!ØôY°±"° +X!ØôY012&&#"6632#"&5546"32654&à6h. (Q1Od$e=…�¹”�½Ñ€5KS?AJE,�YL3#‰wy–­ŠÈŒ¬þK I]B69@jÿõ!g°EX°/±>Y°EX°/±>Y°±° +X!ØôY²9°/´]°°а±° +X!ØôY°±° +X!ØôY°°Ð01!!6676#"&?32654&#"‰4þ•M+…—¤©Ž¼µN@HFG<=AZÇ’ªŽ}}’pn -1?;=KM%! E°EX° /± >Y°EX°/±>Y² 9°/±° +X!ØôY°°а° а °Ð013##5!'33'³rr¿þc ¦ÀþdÚ "‘‘‘tþbÿõë,*–°EX°/±>Y°EX°/±>Y°±° +X!ØôY°° в*9°*/²ß*r´ß*ï*]¶/*?*O*q´**]²ÿ*q´**r²¿*q±)° +X!ØôY²)*9°°вF]°±"° +X!ØôY012654&#"#'&632#"&77332654&##5¡A=A>5?µ¬‚•¬G=FK´•‡¹µE=@LGE{Ù50'5,"bxwn7[_Dp|yp+34-87ƒlÕ,N°EX°/±>Y°EX°/±>Y±° +X!ØôY°в9°± ° +X!ØôY°° а°Ð01!!56654&#"#'&632!Õý¡1@(36=@µ¬‘‹›ax�^‘6F),8<0g‘‚uQvin–H™�M°EX°/± >Y²?]° ° +XØÜY°° +XØÜY°° +XØÜY°°° +XØÜY° °° +XØÜY013#'4632#"&732654&'´ãî”~mOMkkMPlc3 $&3�ÀçLffLLaaL%11%&44W–,-°EX°/±>Y°EX°/±>Y°°а° +XØÜY01!##5%–À?–pÿõ$, ;°EX° /± >Y°EX°/±>Y° ±° +X!ØôY°±° +X!ØôY01#"&554632'4&#"3265$¿›œ¾¾››À¿THHRRIHS'�¥¥�ÑŒ¨¨ŒJVVJÓMTTM?ÿïµ�'N°EX° /± >Y°EX°/±>Y±° +X!ØôY² 9°/±° +X!ØôY° ±"° +X!ØôY01%2655#"&54632#"&'726754&#"á`�,t@ÄßûżúþùÆG�E&=v`HgvXWlg¯�_Z)+Ѱ¦áýÆþ¶·ê¸”4*@k�|OYuRÿïç�#/d°EX°/±>Y°EX° /± >Y²- 9°-/²-]±° +X!ØôY²-9²-9° ±!° +X!ØôY°±'° +X!ØôY01#"$5467&&546324&#"3264&#"326ÄfWgyþÿÁÉþö|k\hô»³íÐzV^��_Vy#eHQlnPGe\V„&(�]¢··¢]�(&„V™¨¨ý`G^]HJ\\C?ON@@RR<f� /°EX° /± >Y°EX°/±>Y° ± ° +X!ØôY°Ð01#57!5!f´šóæ�ý°*ÌáþÔþú¹¹‘€ÁR¤! /°EX° /± >Y°EX°/±>Y° ± ° +X!ØôY°Ð01#547!5!¤„k¿œWþiR�œÃ±±O’ÿÿv•ù°SÿÿÿëB�&OEÿTÿxÿÿÿëB�&OEÿTÿxÿÿ<é�&>E-ßÿÿ¬ß&TCº ³ +01ÿÿ¬Þ&Tvq ³+01ÿÿ¬&TQy ³+01ÿÿ¬ &TW|) ³+01ÿÿ¬Ê&TjV³+°° Ð01ÿÿ¬L&TUp³+°°Ð01ÿÿ¬ÿ&Tpb³+°°а°!Ð01ÿÿhþ?0�&PzbÿþÿÿŽÎß&NC{ ³ +01ÿÿŽÎÞ&Nv2 ³+01ÿÿŽÎ&NQ6 ³+01ÿÿŽÎÊ&Nj³+°° Ð01ÿÿÿ³€ß&JCÿc ³+01ÿÿŽ^Þ&Jv ³+01ÿÿÿ¹Z&JQÿ ³+01ÿÿÿžsÊ&Jjþú³+°°Ð01ÿÿŽ… &DW�) ³+01ÿÿfÿîdð&CC±* ³ +01ÿÿfÿîdï&Cvh) ³ +01ÿÿfÿîd&CQl' ³  +01ÿÿfÿîd1&CWn: ³ +01ÿÿfÿîdÛ&CjH+³  +° °Ð01ÿÿ~ÿî{á&=CÊ ³+01ÿÿ~ÿî{à&=v� ³ +01ÿÿ~ÿî{&=Q… ³ +01ÿÿ~ÿî{Ì&=ja³ +°°Ð01ÿÿ<Þ&9v8 ³ +01ÿÿ¬³&Tqr ³ +01ÿÿ¬&TS­i ³+01ÿÿþRÓ�&TVèÿÿhÿï0î&PvZ( ³! +01ÿÿhÿï0&PQ^& ³  +01ÿÿhÿï0î&PT+8 ³ +01ÿÿhÿï0&PRu* ³" +01ÿÿŽB &OR% ³+01ÿÿŽÎ³&Nq1 ³ +01ÿÿŽÎ&NSii ³+01ÿÿŽÎÞ&NT( ³ +01ÿÿŽþRÎ�&NV ÿÿŽÎ &NRM ³+01ÿÿhÿï_&LQn& ³% +01ÿÿhÿï_)&LS¡y ³% +01ÿÿhÿï_î&LT;8 ³" +01ÿÿhþ_�&L&qþŽÿÿŽz&KQ‚ ³+01ÿÿÿ q &JWÿ ) ³+01ÿÿ~ÿî‚ &=Xê³+°°Ð01ÿÿÿÇJ&JSÿQi ³+01ÿÿ<þRÝ�&JVòÿÿ…ˆÞ&JTë( ³+01ÿÿ/ÿî^&IQ" ³+01ÿÿŽþ]�&H&#þ˜ÿÿ^y¿&Gvæù ³ +01ÿÿŽþy�&G&õþšÿÿŽy�&G&�‰°EX° /± >Y01ÿÿŽy�&GTJý3°/01ÿÿŽ…Þ&DvŠ ³+01ÿÿŽþ…�&D&ŠþšÿÿŽ… &DR¥ ³+01ÿÿfÿîdÄ&Cqg ³ +01ÿÿfÿîd*&CSŸz ³  +01ÿÿfÿîi&CXÑ+³% +°%°Ð01ÿÿŽ<Þ&@v! ³(+01ÿÿŽþ<�&@&!þšÿÿŽ< &@R< ³)+01ÿÿQÿîð&?v=* ³+ +01ÿÿQÿî&?QA( ³* +01ÿÿQþ<�&?zJÿûÿÿQÿî&?RX, ³- +01ÿÿ<þé�&>&þšÿÿ<é &>R9 ³ +01ÿÿ~ÿî{"&=W‡+ ³+01ÿÿ~ÿî{µ&=q€ ³+01ÿÿ~ÿî{&=S¸k ³+01ÿÿ~ÿî{N&=Ur³+°°!Ð01ÿÿQÿî‰�&??pÿÿJë &8RC ³+01ÿÿJëß&8Tù) ³ +01ÿÿJëß&8v( ³+01ÿÿ<Ê&9j³+°° Ð01ÿÿ<&9Q< ³+01ÿÿ4×&;Q ³ +01ÿÿ~þR{�&=Ve$ÿó»°g°EX°/±>Y°EX°/±>Y°EX° /± >Y°±° +X!ØôY²9°/° ± ° +X!ØôY°±° +X!ØôY°°Ð01!6632%''265&&#"#!5!‘þL‡7÷þýþþœ|’‹AˆAóþwmíþfîÚÐó³‹yzŠýmíÃ5˰Q°EX°/±>Y°EX°/±>Y°±° +X!ØôY²9°/°° а±° +X!ØôY°°Ð01!6632#4&#"#!5!˜þ A�Müò…“F“Eóþ…cíþ� ßðþ6Ê—týIíÃ&þ™Û°J°/°EX° /± >Y°EX°/±>Y°°а± ° +X!ØôY°аа ±° +X!ØôY01#!#36!3!!ÄÜü1ØwMz%�»ü† \J{þKþšfþ™)L5Tûšãþ·n+‰°a°EX° /± >Y°EX°/±>Y²  9° /±° +X!ØôY°а°в 9° ° а °а °а°а°Ð01###!!333!!ð¢ò©þ“þÒ×þJ$ažò˜^$þMÔþÒ{ý…{ý…©ýœdýœdýXüø?ÿëÙ°K°EX°/±>Y°EX°/±>Y²9°°Ð@ 4DTd]°°а±° +X!ØôY013!#"&'732677!h1. þ =šœB  =KFþ Ž ûRŠ�ÀGIE.OÿÄì'J° /°/² 9°/°в 9° /°а±° +X!ØôY° ±° +X!ØôY°!а°'Ð013 !##5# !353"33332654&#¯Vþªþûóþúþ¬Tóþú¬¾¾¬óª¿¿ª&þµþ÷þùþ¸¿¿F MÆþpÑ»¸ËüñηºÐžü° F°EX°/±>Y°EX°/±>Y°EX°/±>Y°EX° /± >Y±° +X!ØôY°Ð01!3!3!‘ÅòÁóù¢°ûîûîúP°žþ¡­°L° /°EX°/±>Y°EX°/±>Y°EX°/±>Y°EX°/±>Y±° +X!ØôY°а Ð01!3!33#!‘ÅòÁó±Ýùâ°ûîûîûýÞ_°Ó° T°EX°/±>Y°EX° /± >Y² 9°/°± ° +X!ØôY°± ° +X!ØôY° ±° +X!ØôY01!!2#!!!2654&#�4óþìòýÙþr�4ˆ‹Š‰°ýÍðÊÌ÷íýÍþ“pl‰”Á° B°EX° /± >Y°EX°/±>Y² 9°/± ° +X!ØôY°± ° +X!ØôY01!2#!3!2654&#‡4óþìòýÙó4ˆ‹Š‰}ðÊÌ÷°ý þ“pl‰-b° V°EX° /± >Y°EX°/±>Y°EX° /± >Y² 9°/± ° +X!ØôY² 9° ±° +X!ØôY01!!&&54$3!#!#"331þüH€„öäóþÞ"ñŒ�’‰ñl9Å‹ÔçúP%È…yy”[ÿë<*g°EX°/±>Y°EX°/±>Y²9°/²]²9°/±° +X!ØôY²9°±° +X!ØôY°±$° +X!ØôY012#"557665366"326554&lØøþ÷çèþ÷áqg¼´Ì{¤;¢8}|‚þþéÛèþÜ$è�T-:B»w"–‹9H샒¸¸’„«(þ¾Å:G° /°EX°/± >Y°EX° /± >Y±° +X!ØôY°аа ° а±° +X!ØôY017667!3#!#!!�ZP ï–ÞýJß H: þðÃdÍÅ�üˆýüBþ¾ö¨øW§_:„°EX°/± >Y°EX°/± >Y°EX° /± >Y°EX°/±>Y°EX°/±>Y°EX°/±>Y² 9° /´ � ]±° +X!ØôY°в 9° °а°Ð01###!!333!!4€ó€öþÌoþ«,òrósò-þªoþ˳þM³þMAùþW©þW©þý¿OÿìÄM*‡°EX°(/±( >Y°EX° /± >Y² (9°/´¿Ï]²ïq´O_q´�]´�r±° +X!ØôY²9² (9° ±° +X!ØôY°(± ° +X!ØôY²#( 901#"$77332654&##532654&#"#'&632°XN[_öÇ´þüér^^d\`®®YPU[Rléô´ÇâIy# €[˜®¬£@[V@MH¯F@;QO<�±¤Tþ`-;g°EX°/± >Y°EX°/±>Y°EX°/±>Y°EX°/± >Y°° а°а±8° +X!ØôY°#а±1° +X!ØôY°*Ð013236632#"&'##"5%4&#"3265!3267&&#"Tξ&EòK,¾Ïϼ,K!òF'¼Î8mq)*qküºdr&&rf< æþþÄþüîþàþW¥ !í¨Õý9¶–˜´ÊÓªê: T°EX° /± >Y°EX°/±>Y² 9°/° ± ° +X!ØôY°± ° +X!ØôY°±° +X!ØôY0132#!!5!32654&#JíÌçèËþ þÈ+íb^^bâË¥£ÏwÃýåþ£aJJh�ÿë²° B°EX°/±>Y°EX°/±>Y²9° а±° +X!ØôY°а°а Ð01#"&'#"&53326533265²úÊn­57³oÅóókZfy÷ra`q°ûõÕåTRRTåÕ ûõ{}}{ ûõ{}}{ pÿëí: H°EX°/± >Y°EX° /± >Y°в 9° ±° +X!ØôY°°а°а° Ð01#"&'#"&53326533265íá·`˜/3�a´ÙóQIVcôYRLY:ýQÉ×HFFHÖʯýQoooo¯ýQpnoo¯ÿà!^°EX°/±>Y°EX° /± >Y² 9°/°б ° +X!ØôY°в 9°/±° +X!ØôY° ±° +X!ØôY01!32#!#533!32654&#£þÞíÌçèËþ ®®ó"þÞíb^_a9þÊÔ«¬Ø9«4þÌý\þ‚kSOq¢ÿì°Æ)ƒ°EX°)/±)>Y°EX°/±>Y°EX°&/±&>Y°EX° /± >Y² 9°/°а° а± ° +X!ØôY°±° +X!ØôY° ±° +X!ØôY° °а°$Ð013532#&&#"!!32673#"5##3•½;üüë‘–•¯ëþ³˜“�êþè÷ÿþÁ½óóP YþöꙞì²Ä>´ìœšâþðW >ýt°†ÿë¼N'ðEX°'/±' >Y°EX°/± >Y°EX°$/±$>Y°EX°/±>Y²9°/´�]²ÿ]²q´�Ÿq´/r²ïq´O_q´¿Ï]²/]´_or°в 9°± ° +X!ØôY°±° +X!ØôY°±° +X!ØôY²9°°"Ð013632#4&#"!!32653#"'##3y¡ýÝÃóÝu^xuqþ�tyYzÜþÿµÞü¡óórÒ ã¯Y|�w«z›iO˜Ü Óþ9:iÿëÅ š°EX° /± >Y°EX°/±>Y² 9°/²Ÿ]´ïÿ]´_oq¶¿Ïßq²/r²ÿq²r´�Ÿq²?q²Ï]²/]²_r° ±° +X!ØôY°±° +X!ØôY°±° +X!ØôY01! ! !54&#"!3265þ±þõþúþ¹G PüKÃæ ºÃý=º¡§ÁUþõþ¡_  `þ þö13¶êê¶Þ*¸ëê¹Rÿë3N €°EX°/± >Y°EX° /± >Y±° +X!ØôY² 9°/²/]´¿Ï]´�Ÿq²or´O_q´�]²ïq´/r±° +X!ØôY°±° +X!ØôY01432#"5267'!"!7&&R æé þ÷çèþ÷ñp{ þ {poz å |'ò5þËòôþÍ4óþ›š}~™Þ™yy™ïÃO°EX°/±>Y°EX°/±>Y°EX°/±>Y°ж4DT]²c]²4]°± ° +X!ØôY0137663#"#!\é3•{..<þ’çþ ‹jhý¥˜Ð>Cû�°ÿÿïD&æ^;V�ÿë§D.@F¯°EX°/±>Y°EX°/±>Y°EX°/±>Y°в"9°"/² "9°±° +X!ØôY°±° +X!ØôY°'а±.° +X!ØôY²A9°A°E° +XØÜY°1а/° +XØÜY°1°4° +XØÜY°1°8а4°=° +XØÜY0176#"&'#"&546"3265332654&##"$#"#546323'7'3îÀóôÅn°68°mÅóñÁ[jj[fyìwgZllZj$�þÍ*18†zqG-pþ7Q:º¨òáýäâòQOOQòâáò»Šˆý䉉}{‹þu{}‰‰ˆŠ߆x33%mlxþK=p�}tÿëÑã.@Fµ°EX°/± >Y°EX°/± >Y°EX°/±>Y°в 9°±° +X!ØôY°±° +X!ØôY²"9°"/°°'а±.° +X!ØôY²A9°A/°E° +XØÜY°0а0/°4° +XØÜY°0°8а4°=° +XØÜY°0°@° +XØÜY0176#"&'#"&5546"326553326554&##"$#"#546323'7'3:±àÙ°_—01—]±ØÞ³LXPFO`ì_QDRYK½$‚þÌ)17‡zqG-pþ7Q:º?àÒõÒáIHHIàÓõÒà»yxõxyooÆÆooyxõxyç†x33%mlxþR=o‰w�ÿë²(l°EX°/±>Y°EX°/±>Y°°° +XØÜY°° +XØÜY°° +XØÜY°°а°а(а±° +X!ØôY°$в9°° Ð015!!#5#"&'#"&53326533265ëUþ¦µ€úÊn­57³oÅóókZfy÷ra`q—ppçûõÕåTRRTåÕ ûõ{}}{ ûõ{}}{ pÿëí±(l°EX°/± >Y°EX°/±>Y°°° +XØÜY°° +XØÜY°° +XØÜY°°а°а(а±° +X!ØôY°$в9°° Ð015!!#5#"&'#"&53326533265—8þ±µá·`˜/3�a´ÙóQIVcôYRLYAppþùýQÉ×HFFHÖʯýQoooo¯ýQpnoo¯ÿà!b]°/°EX° /± >Y² 9°/±° +X!ØôY² 9°/°° а°а±° +X!ØôY° ±° +X!ØôY01!32#!#5353!32654&#£þÞíÌçèËþ ®®ó"þÞíb^_aýþÔ«¬Ø«²²ü�þ‚kSOqŸÚ°B°EX°/±>Y°EX°/±>Y²9°/±° +X!ØôY°±° +X!ØôY01#!2'#%!27'7654&#!’ó9ñ~~nŒo™þºFC2un{&ˆ‡þº(ýذùËÅy‹dš1Âdˆ=So”€þ`4N'c°EX° /± >Y°EX°/± >Y°EX° /± >Y°EX°/±>Y² 9²9°±° +X!ØôY°± ° +X!ØôY01'#"&'#36632#4&#"327'7654kdodVt\Ž3óÙ3’_Èßò}|Lj jNF3oo^ ùè�tcs2B@ýóÚ‚HNþÃþý¦ÓA:þ9=�dnMkŸþÈ�°W° /°EX°/±>Y°EX°/±>Y°±° +X!ØôY²9°/° ± ° +X!ØôY°±° +X!ØôY01!3 /265&&###!7ý[±@ýú•v´²±ó˜íþVþÐþéÿþ˲ͨÀÄý‡°~þâÛ:L° /°EX°/± >Y°EX°/±>Y°±° +X!ØôY²9°/´�]±° +X!ØôY01!32'6654&###!Fþ*Sð(Á»TrkŸ†SòÈvåÿäˆþì0­(Ži†“þ9:ÿÿþšä°&Ñ\•ÿÿþš“:&Û\Dÿÿhþ;áÅ&¾\’ÿ¡ÿÿOþ<ÄM&Ü\9ÿ¢4¡°c°EX°/±>Y°EX° /± >Y°EX°/±>Y°EX°/±>Y²9°/±° +X!ØôY°±° +X!ØôY² 901##!5!3!!¬¨óþ#ЋÉ ýî;þ×výŠíÃý—iýIý>©:j°EX°/± >Y°EX° /± >Y°EX°/±>Y°EX°/±>Y²9°/´�]±° +X!ØôY°±° +X!ØôY² 901##!5!3!!A{óþkˆk+,þy¨þĬþTvÄþP°ýúýÌŸþÆï°d°/°EX°/±>Y°EX°/±>Y°EX°/±>Y²9°/°± ° +X!ØôY°±° +X!ØôY°±° +X!ØôY013 /265&&###!#!„@ýú•v´²„òýsórAþÐþéÿþ˲ͨÀÄý‰íû°~þå»:H°/°EX°/± >Y°EX°/±>Y°в9°/±° +X!ØôY°±° +X!ØôY0132'665&&###!#! „ú3ºUrl©�„óþZóŒ•ÿä‰þì0®'Žj†’þ6vüŠ:iÿèÌÃ*9k°EX° /± >Y°EX° /± >Y°EX°/±>Y°Ð² 9° ±° +X!ØôY°±° +X!ØôY°*в/ 9° ±6° +X!ØôY01"&'# 5"3267&554323366554&#"ÌpÊXJ£Yþßþ– Òk~Ù¸/ovéºÁðc\-f7ý�hbNWc[Va$$"#Š)¶ cÃì·¸×þïa ŸÔì9þÁüÔ”þÿ_ ˆØB?Ð嫵¹ aÿëÉN*:k°EX° /± >Y°EX° /± >Y°EX°/±>Y°Ð² 9° ±° +X!ØôY°±° +X!ØôY°*а ±/° +X!ØôY²7 901"&'#"5543267&&554632354&#&366É_§G<†HëþÚרAJ–� GH´–˜»C>&R-þé;028<9-3F÷KÍ Á•vM£ÏI½l¸íþþÃ~h¸G €€hˆzc„TŒ/*…ÿÿjþ?ÌÅ&&\Êÿ¥ÿÿQþ?õN&F\Kÿ¥ÿÿ þDÄ&7\íÿªÿÿÿÎþHeN&8\õÿ®ÿÿ‰\&ÑS¬ ³ +01ÿÿ_&ÛS¥U ³ +01”þÆç°X°/°EX°/±>Y°EX°/±>Y°EX°/±>Y²9°/±° +X!ØôY°° а±° +X!ØôY01##33!/265&&##˜óósÂ$þéýú•wµ²õxýˆ°ý¡_ý‹þÖùÿþ˲Ψ¿ÄŽþêC:P°/°EX°/± >Y°EX°/± >Y°EX°/±>Y²9°/´�]°Ð°±° +X!ØôY01'665&&'##33!ͪÁÁºUsk“„®òòUA-a(ß²…þõ.­%‡e{�þT:þP°ÿÿiÿëÅäÿÿRÿë3Nåÿÿiÿë&äjÆX³$ +°$°!Ð01ÿÿRÿë3ç&åj!7³$+°$°!Ð01ÿÿ?ÿëÙö&Òq—F ³+01ÿÿ?ÿëÙ &Òjx]³+°°Ð01ÿÿ?ÿëÙK&ÒX]³ +° °Ð01ÿÿŸu!&(v{[ ³+01n ,3 L b o � • Ÿ .²*à  >  H b 2p H ,¢ Î @è ( 4 &H \n TÊ    * HFont data copyright Google 2012Roboto MediumRegularGoogle:Roboto Medium:2013Version 1.100141; 2013Roboto-MediumRoboto is a trademark of Google.GoogleGoogle.comChristian RobertsonLicensed under the Apache License, Version 2.0http://www.apache.org/licenses/LICENSE-2.0Font data copyright Google 2012Roboto MediumRegularGoogle:Roboto Medium:2013Version 1.100141; 2013Roboto-MediumRoboto is a trademark of Google.GoogleGoogle.comChristian RobertsonLicensed under the Apache License, Version 2.0http://www.apache.org/licenses/LICENSE-2.0RobotoMediumÿjd   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`a¬£„…½–膎‹�©¤Šƒ“òó�—ˆÞñžªõôö¢­ÉÇ®bc�dËÈÊÏÌÍÎéfÓÐѯgð‘ÖÔÕhëí‰jikmln oqprsutvwêxzy{}|¸¡~€�ìîº   ýþ  ÿøù !"#$%&'()*+,-./0×123456789:;<=>?âã@ABCDEFGHIJKLMN°±OPQRSTUVWXûüäåYZ[\]^_`abcdefghijklmn»opqræçs¦tuvwxyz{|}~€�‚ØáÛÜÝàÙ߃„…†‡ˆ‰Š‹Œ�Ž��‘’“”•–—˜™š›œ�žŸ ¡¢£¤¥¦§¨©ª«Ÿ¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁ›ÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€�‚ƒ„…†‡ˆ‰Š‹Œ�Ž��‘’“”•–—˜™š›œ�žŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ     ²³¶·Ä´µÅ‚‡«Æ ¾¿!¼"#÷$%&'()*Œ+,-./˜š™ï¥’œ§�”•¹0À123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€�‚ƒ„…†‡ˆ‰Š‹Œ�Ž��‘’“”•–—˜™š›œ�žŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ     eNULLuni00ADmacronperiodcenteredAmacronamacronAbreveabreveAogonekaogonek Ccircumflex ccircumflexuni010Auni010BDcarondcaronDcroatdcroatEmacronemacronEbreveebreve Edotaccent edotaccentEogonekeogonekEcaronecaron Gcircumflex gcircumflexuni0120uni0121 Gcommaaccent gcommaaccent Hcircumflex hcircumflexHbarhbarItildeitildeImacronimacronIbreveibreveIogonekiogonek IdotaccentIJij Jcircumflex jcircumflex Kcommaaccent kcommaaccent kgreenlandicLacutelacute Lcommaaccent lcommaaccentLcaronlcaronLdotldotNacutenacute Ncommaaccent ncommaaccentNcaronncaron napostropheEngengOmacronomacronObreveobreve Ohungarumlaut ohungarumlautRacuteracute Rcommaaccent rcommaaccentRcaronrcaronSacutesacute Scircumflex scircumflex Tcommaaccent tcommaaccentTcarontcaronTbartbarUtildeutildeUmacronumacronUbreveubreveUringuring Uhungarumlaut uhungarumlautUogonekuogonek Wcircumflex wcircumflex Ycircumflex ycircumflexZacutezacute Zdotaccent zdotaccentlongsOhornohornUhornuhornuni01F0 Aringacute aringacuteAEacuteaeacute Oslashacute oslashacute Scommaaccent scommaaccentuni0237uni02BCuni02F3 gravecomb acutecomb tildecombhookuni030Fdotbelowtonos dieresistonos Alphatonos anoteleia EpsilontonosEtatonos Iotatonos Omicrontonos Upsilontonos OmegatonosiotadieresistonosAlphaBetaGammaDeltaEpsilonZetaEtaThetaIotaKappaLambdaMuNuXiOmicronPiRhoSigmaTauUpsilonPhiChiPsi IotadieresisUpsilondieresis alphatonos epsilontonosetatonos iotatonosupsilondieresistonosalphabetagammadeltaepsilonzetaetathetaiotakappalambdauni03BCnuxiomicronrhosigma1sigmatauupsilonphichipsiomega iotadieresisupsilondieresis omicrontonos upsilontonos omegatonosuni03D1uni03D2uni03D6uni0400uni0401uni0403uni0404uni0405uni0406uni0407uni0408uni0409uni040Auni040Cuni040Duni040Euni040Funi0410uni0411uni0412uni0413uni0415uni0417uni0418uni0419uni041Auni041Buni041Cuni041Duni041Euni041Funi0420uni0421uni0422uni0425uni0426uni0427uni042Buni042Duni042Euni0430uni0432uni0433uni0435uni0438uni0439uni043Auni043Buni043Cuni043Duni043Euni043Funi0440uni0441uni0442uni0443uni0445uni0446uni0447uni0448uni0449uni044Buni044Cuni044Duni044Euni044Funi0450uni0451uni0452uni0453uni0454uni0455uni0456uni0457uni0458uni0459uni045Auni045Buni045Cuni045Duni045Euni045Funi0462uni0466uni0467uni0468uni0469uni046Auni046Buni046Cuni046Duni046Euni046Funi0470uni0471uni0475uni0477uni0478uni0479uni047Auni047Buni0480uni0481uni0482uni0483uni0484uni0485uni0486uni0488uni0489uni048Auni048Buni048Cuni0490uni0491uni0492uni0493uni049Auni049Buni049Cuni049Duni049Euni049Funi04A2uni04A3uni04A4uni04A5uni04ACuni04ADuni04AEuni04AFuni04B0uni04B1uni04B2uni04B3uni04B4uni04B5uni04B6uni04B7uni04B8uni04B9uni04BAuni04BBuni04BCuni04BDuni04C0uni04C5uni04C6uni04C7uni04C8uni04C9uni04CAuni04CBuni04CCuni04CDuni04CEuni04CFuni04D0uni04D1uni04D2uni04D3uni04D4uni04D5uni04D6uni04D7uni04D8uni04D9uni04DAuni04DBuni04DCuni04DDuni04DEuni04DFuni04E0uni04E1uni04E2uni04E3uni04E4uni04E5uni04E6uni04E7uni04ECuni04EDuni04EFuni04F1uni04F3uni04F4uni04F5uni04F6uni04F7uni04F8uni04F9uni04FAuni04FBuni04FCuni04FDuni04FEuni04FFuni0500uni0501uni0502uni0503uni0504uni0505uni0506uni0507uni0508uni0509uni050Auni050Buni050Cuni050Duni050Euni050Funi0510uni0511uni0512uni0513uni1E00uni1E01uni1E3Euni1E3FWgravewgraveWacutewacute Wdieresis wdieresisuni1EA0uni1EA1uni1EA2uni1EA3uni1EA4uni1EA5uni1EA6uni1EA7uni1EA8uni1EA9uni1EAAuni1EABuni1EACuni1EADuni1EAEuni1EAFuni1EB0uni1EB1uni1EB2uni1EB3uni1EB4uni1EB5uni1EB6uni1EB7uni1EB8uni1EB9uni1EBAuni1EBBuni1EBCuni1EBDuni1EBEuni1EBFuni1EC0uni1EC1uni1EC2uni1EC3uni1EC4uni1EC5uni1EC6uni1EC7uni1EC8uni1EC9uni1ECAuni1ECBuni1ECCuni1ECDuni1ECEuni1ECFuni1ED0uni1ED1uni1ED2uni1ED3uni1ED4uni1ED5uni1ED6uni1ED7uni1ED8uni1ED9uni1EDAuni1EDBuni1EDCuni1EDDuni1EDEuni1EDFuni1EE0uni1EE1uni1EE2uni1EE3uni1EE4uni1EE5uni1EE6uni1EE7uni1EE8uni1EE9uni1EEAuni1EEBuni1EECuni1EEDuni1EEEuni1EEFuni1EF0uni1EF1Ygraveygraveuni1EF4uni1EF5uni1EF6uni1EF7uni1EF8uni1EF9uni1F4Duni2000uni2001uni2002uni2003uni2004uni2005uni2006uni2007uni2008uni2009uni200Auni200Buni2015 underscoredbl quotereverseduni2025minutesecond exclamdbluni2074 nsuperiorlirapesetauni20ABEurouni2105uni2113uni2116 estimated oneeighth threeeighths fiveeighths seveneighths commaaccentuniFB02uniFB03uniFB04uniFEFFuniFFFCuniFFFD Imacron.smcp dasiaoxia eight.supnine.supsix.smcp four.smcp three.smcptwo.smcpone.smcp zero.smcpZ.smcpY.smcpX.smcpW.smcpV.smcpU.smcpT.smcpS.smcpR.smcpQ.smcp zero.lnumO.smcpN.smcpcrossbarM.smcpL.smcpK.smcpJ.smcpI.smcpH.smcpG.smcpF.smcpE.smcpD.smcpC.smcpB.smcpcommaaccentrotatebrevegravecombA.smcpcircumflexacutecombcircumflexgravecombcircumflexhookcombcircumflextildecombbreveacutecomb brevehookcombbrevetildecomb cyrillicticcyrillichookleft cyrillichooklargerighthookone.lnumtwo.lnum three.lnum four.lnum five.lnumsix.lnum seven.lnum eight.lnum nine.lnumP.smcp five.smcpsix.supfive.supfour.sup three.suptwo.sup ringacuteone.supzero.sup nine.smcp eight.smcp seven.smcp seven.sup cyrillicbreve Dcroat.smcpEth.smcp Tbar.smcp Agrave.smcp Aacute.smcpAcircumflex.smcp Atilde.smcpAdieresis.smcp Aring.smcpAringacute.smcp Ccedilla.smcp Egrave.smcp Eacute.smcpEcircumflex.smcpEdieresis.smcp Igrave.smcp Iacute.smcpIcircumflex.smcpIdieresis.smcp Ntilde.smcp Ograve.smcp Oacute.smcpOcircumflex.smcp Otilde.smcpOdieresis.smcp Ugrave.smcp Uacute.smcpUcircumflex.smcpUdieresis.smcp Yacute.smcp Amacron.smcp Abreve.smcp Aogonek.smcp Cacute.smcpCcircumflex.smcp uni010A.smcp Ccaron.smcp Dcaron.smcp Emacron.smcp Ebreve.smcpEdotaccent.smcp Eogonek.smcp Ecaron.smcpGcircumflex.smcp Gbreve.smcp uni0120.smcpGcommaaccent.smcpHcircumflex.smcp Itilde.smcpUhungarumlaut.smcp Ibreve.smcp Iogonek.smcpIdotaccent.smcpJcircumflex.smcpKcommaaccent.smcp Lacute.smcpLcommaaccent.smcp Lcaron.smcp Ldot.smcp Nacute.smcpNcommaaccent.smcp Ncaron.smcp Omacron.smcp Obreve.smcpOhungarumlaut.smcp Racute.smcpRcommaaccent.smcp Rcaron.smcp Sacute.smcpScircumflex.smcp Scedilla.smcp Scaron.smcpTcommaaccent.smcp Tcaron.smcp Utilde.smcp Umacron.smcp Ubreve.smcp Uring.smcpgermandbls.smcp Zcaron.smcpZdotaccent.smcp Zacute.smcpYdieresis.smcpYcircumflex.smcpWcircumflex.smcp Uogonek.smcpuni0402uni040Buni0414uni0416uni0423uni0424uni0428uni0429uni042Auni042Cuni042Funi0431uni0434uni0436uni0437uni0444uni044Auni0460uni0461uni0463uni0464uni0465uni0472uni0473uni0474uni0476uni047Cuni047Duni047Euni047Funi048Duni048Euni048Funi0494uni0495uni0496uni0497uni0498uni0499uni04A0uni04A1uni04A6uni04A7uni04A8uni04A9uni04AAuni04ABuni04BEuni04BFuni04C1uni04C2uni04C3uni04C4uni04E8uni04E9uni04EAuni04EBuni04EEuni04F0uni04F2ÿÿ 0DDFLTlatnÿÿÿÿkernkern 3{'ü'üú&’ø2'Ú2öP'$1Æ 0'ÚÄ ~ ü$²'$1†&l2'* l b'1¬' ¤ Ú2†1¬ ^'¼ Ð2€'¼ î&’&’&’&’&’&’22ö2ö2ö'Ú'Ú'Ú'Ú'Ú'Ú'$'$'$'$'*''''''''''2†2†2†2†2†'¼1¬'¼&’'&’'&’'2222'Ú'Ú2ö'2ö'2ö'2ö'2ö''$1Æ 0 0 0 0'Ú2†'Ú2†'Ú2† ^ ^ ^$²$²$²'$'$'$'$'$'$&l'*'¼'* l l l&’''ü&’2ö'Ú'*&’ø%œ&’2ö l'Ú1Æ&’ Ž'ÚÄ x$²'*f2D'*æ'¼ìö¸’'¼|2†1¬’˜’ÈZŒ2†2ö2ö%œ'$/º/º1Æ2¨&’ ø%œ2öþ1Æ'ÚÄ2$²2ê¨'2&b'¸2†1¬ '¼2€"x"²1d1¬#Ü''&b$^1d1d'¼/º&’'¼'¼$ˆ%œ&b%œ1Æ1Æ1Æ$²'*'¼'*22€&’'&’'2ö'''22€'Ú2†1¬'¼'¼'¼%œ&b&b22€&’'&l&l&l&’'&’'&’'&’'&’'&’'&’'&’'&’'&’'&’'&’'2ö'2ö'2ö'2ö'2ö'2ö'2ö'2ö''Ú2†'Ú2†'Ú2†'Ú2†'Ú2†'Ú2†'Ú2†2†'$'$'*'¼'*'¼'*'¼'*'¼'Ú'ü'ü'ü'ü'ü'ü'ü(((>(P(Z(p(v(œ(®(À(Ö))))")H)N*¼+î22¨.(/º/º/à0:12€1:1¬1d1d2†1†1†1¬22€1Æ222€2†2¨2¨2¨2ö{ $%&'()-./2345789:;<=>DEHINRSUYZ[\^‚ƒ„…†‡‰Š‹Œ‘“”•–—š›œ�ž¡¢£¤¥¦©ª«¬³´µ¶·¾¿ÀÁÂÃÄÅÆÇÉËÍÏÑÓÔÕÖרÙÚÛÜõ÷úüþ #%')+-/135789:<>GHPbdghklmnoprtuxy{|}~€�„ŠŒ��’”–—˜šœ�Ÿ ¡¢¥«¬­²³´µ·¹º»¼½¾ÁÅÇÈÉÊÎÏÐÑÒÓÖÚÜÞßàáäæçèêëíîóôøúû!')*+-.EFGHKLNPQR[\^_`adeijk‚ƒ†ˆŠŒ�Ž��‘’“”•–—˜™š›œ�žŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³¸¹º»¼½¾¿ÀÁÂÃÄÅÍÐÒÞßàáâãäåæ÷øúûü89:;<=>@ACGHMOTiÎÏÐÑÒÕÖרÙÚÛÜÝÞáåæçîñòõûÿ  9: <ž5 79h~„)+† ˆ Š ÞàâäæçËþ×þ×þ×$ÿ•7DÿÎFÿÝGÿÝHÿÝJÿÝRÿÜTÿÝUÿäXÿéYÿæ\ÿæ‚ÿ•ƒÿ•„ÿ•…ÿ•†ÿ•‡ÿ•¡ÿ΢ÿΣÿΤÿÎ¥ÿΦÿΨÿÝ©ÿݪÿÝ«ÿݬÿݳÿÜ´ÿܵÿܶÿÜ·ÿܺÿé»ÿé¼ÿé½ÿé¾ÿæÀÿæÁÿ•ÂÿÎÃÿ•ÄÿÎÅÿ•ÆÿÎÈÿÝÊÿÝÌÿÝÎÿÝÐÿÝÔÿÝÖÿÝØÿÝÚÿÝÜÿÝÞÿÝàÿÝâÿÝäÿÝÿÜÿÜÿÜÿÝ#%*ÿé,ÿé.ÿé0ÿé2ÿé4ÿé8ÿæCÿÝEÿéGÿ•HÿÎbÿ•kÿ•nÿ•uÿ•…ÿ݉ÿéŠÿÝŒÿæ–ÿæ˜ÿÜ›ÿÝœÿÝžÿé¤ÿé¥ÿܦÿé¹ÿ•ÉÐÿÎÓÿÝÚÿÜÝÿÝßÿæêÿÝëÿÝîÿÝøÿæûÿ•ÿæÿæ ÿÝÿÝ'*ÿæ/Eÿ•FÿÎGÿ•HÿÎLÿÝNÿÝPÿÝ\ÿÜ_ÿæ`ÿæaÿæoÿÝpÿÝqÿÝ{ÿÝ‚ÿ•ƒÿÎŒÿ•�ÿÎŽÿ•�ÿÎ�ÿ•‘ÿÎ’ÿ•“ÿΔÿ••ÿΖÿ•—ÿΘÿ•™ÿΚÿ•›ÿΜÿ•�ÿΞÿ•ŸÿΠÿ•¡ÿ΢ÿ•£ÿÎ¥ÿݧÿÝ©ÿÝ«ÿÝ­ÿݯÿݱÿݳÿݹÿÜ»ÿܽÿÜ¿ÿÜÁÿÜÃÿÜÅÿÜÇÿÝÉÿÝËÿÝÍÿÜÏÿÝÑÿéÓÿéÕÿé×ÿéÙÿéÛÿéÝÿéßÿæáÿæãÿæåÿæùþ×ýþ×þ×þ×Tÿ¦ÎÏÝÿÝåÿÜéÿÝõúÿÝüÿÝÿÝÿÜ7ÿÝ9ÿâ:ÿë<ÿÍžÿÍ#ÿÝ%ÿÝ5ÿë7ÿÍ9ÿÍhÿÍ~ÿÍ„ÿÍÉÿÝ'ÿÝ)ÿÍ+ÿÍ/ÿ݆ÿëˆÿëŠÿëÞÿÍàÿÍâÿÍäÿÍTÎÿÝÏÿÝæÿâçÿâõÿÝ7ÿ×9ÿì<ÿÌžÿÌ#ÿ×%ÿ×7ÿÌ9ÿÌhÿÌ~ÿÌ„ÿÌÉÿ×'ÿ×)ÿÌ+ÿÌ/ÿ×ÞÿÌàÿÌâÿÌäÿÌÎÿ×Ïÿ׿ÿìçÿìõÿ×-ÿí8ÿíšÿí›ÿíœÿí�ÿíõÿí)ÿí+ÿí-ÿí/ÿí1ÿí3ÿí²ÿíÐÿíÒÿí   #@(`P÷øúûü=FÿëGÿëHÿëJÿëTÿë¨ÿë©ÿëªÿë«ÿë¬ÿëÈÿëÊÿëÌÿëÎÿëÐÿëÔÿëÖÿëØÿëÚÿëÜÿëÞÿëàÿëâÿëäÿëÿëCÿë…ÿëŠÿë›ÿëœÿëÓÿëÝÿëêÿëëÿëîÿë ÿëÿëLÿëNÿëPÿëoÿëpÿëqÿë{ÿë¥ÿë§ÿë©ÿë«ÿë­ÿë¯ÿë±ÿë³ÿëÇÿëÉÿëËÿëÏÿëÝÿëéÿëúÿëüÿëÿëÿ�ÿ�ÿ�ùÿ�ýÿ�ÿ�ÿ�-ÿë8ÿëšÿë›ÿëœÿë�ÿëõÿë)ÿë+ÿë-ÿë/ÿë1ÿë3ÿë²ÿëÐÿëÒÿë Zÿ´9ÿ±;ÿÔ<ÿ²=ÿí>ÿ¸AÿñCÿñLÿðPÿòTIWZZÿãÿÇ¡ÿâAÿëCÿëLÿêPÿìT:&ÿò*ÿò2ÿò4ÿò‰ÿò“ÿò”ÿò•ÿò–ÿò—ÿò™ÿòÇÿòÉÿòËÿòÍÿòÝÿòßÿòáÿòãÿò ÿòÿòÿòÿòBÿòKÿògÿòrÿòyÿò”®ÿòÅÿòÈÿò ÿò ÿò ÿò[ÿòzÿò¸ÿòºÿò¼ÿò¾ÿòÀÿòÂÿòÄÿòÆÿòÈÿòÊÿòÌÿòÎÿòæÿòßÿòäÿòèÿòêÿòùÿòûÿòÿòÿò;&ÿä*ÿä2ÿä4ÿä‰ÿä“ÿä”ÿä•ÿä–ÿä—ÿä™ÿäÇÿäÉÿäËÿäÍÿäÝÿäßÿäáÿäãÿä ÿäÿäÿäÿäBÿäKÿägÿärÿäyÿäÿ½”®ÿäÅÿäÈÿä ÿä ÿä ÿä[ÿäzÿä¸ÿäºÿä¼ÿä¾ÿäÀÿäÂÿäÄÿäÆÿäÈÿäÊÿäÌÿäÎÿäæÿäßÿääÿäèÿäêÿäùÿäûÿäÿäÿä7$ÿâ;ÿÏ<ÿЂÿâƒÿâ„ÿâ…ÿâ†ÿâ‡ÿâžÿÐÁÿâÃÿâÅÿâ7ÿÐ9ÿÐGÿâbÿâhÿÐkÿânÿâuÿâ~ÿЀÿÏ„ÿДÿà¹ÿâÊÿÏûÿâ)ÿÐ+ÿÐ-ÿÏEÿâGÿâQÿÏjÿÏ‚ÿâŒÿâŽÿâ�ÿâ’ÿâ”ÿâ–ÿâ˜ÿâšÿâœÿâžÿâ ÿâ¢ÿâÞÿÐàÿÐâÿÐäÿÐÑÿÏñÿÏÿÿÏ(ÿbÿbÿb$ÿÉ‚ÿɃÿÉ„ÿÉ…ÿɆÿɇÿÉÁÿÉÃÿÉÅÿÉGÿÉbÿÉkÿÉnÿÉuÿÉšÿñ¹ÿÉûÿÉEÿÉGÿÉ‚ÿÉŒÿÉŽÿÉ�ÿÉ’ÿÉ”ÿÉ–ÿɘÿÉšÿÉœÿÉžÿÉ ÿÉ¢ÿÉùÿbýÿbÿbÿb”�ÿì ÿë°FÿÙGÿÙHÿÙJÿÙPÿÒQÿÒRÿÓSÿÒTÿÙXÿÛYÿß\ÿߨÿÙ©ÿÙªÿÙ«ÿÙ¬ÿÙ²ÿÒ³ÿÓ´ÿÓµÿÓ¶ÿÓ·ÿÓºÿÛ»ÿÛ¼ÿÛ½ÿÛ¾ÿßÀÿßÈÿÙÊÿÙÌÿÙÎÿÙÐÿÙÔÿÙÖÿÙØÿÙÚÿÙÜÿÙÞÿÙàÿÙâÿÙäÿÙÿÒÿÒ ÿÒ ÿÒÿÓÿÓÿÓÿÙ*ÿÛ,ÿÛ.ÿÛ0ÿÛ2ÿÛ4ÿÛ8ÿßCÿÙEÿÛ…ÿÙ‡ÿÒ‰ÿÛŠÿÙŒÿß�ÿíŽÿä�ÿÒ‘ÿê’ÿè–ÿß—ÿï˜ÿÓ™ÿå›ÿÙœÿÙ�ÿážÿÛŸÿÊ¡ÿÑ¢ÿؤÿÛ¥ÿÓ¦ÿÛÒÿÒÓÿÙÔÿÒÕÿÒÖÿÒØÿÒÙÿÒÚÿÓÛÿÒÜÿÒÝÿÙßÿßáÿÒãÿÒäÿÒæÿÒèÿÒêÿÙëÿÙíÿÒîÿÙôÿÒöÿÒ÷ÿÒøÿßÿßÿß ÿÙÿÙÿÒÿÒ$ÿÒ&ÿÒ*ÿß=ÿÒ?ÿÒCÿÒLÿÙNÿÙPÿÙXÿÒZÿÒ\ÿÓ_ÿß`ÿßaÿßeÿÒgÿÒiÿÒoÿÙpÿÙqÿÙ{ÿÙ…ÿÒ¥ÿÙ§ÿÙ©ÿÙ«ÿÙ­ÿÙ¯ÿÙ±ÿÙ³ÿÙ¹ÿÓ»ÿÓ½ÿÓ¿ÿÓÁÿÓÃÿÓÅÿÓÇÿÙÉÿÙËÿÙÍÿÓÏÿÙÑÿÛÓÿÛÕÿÛ×ÿÛÙÿÛÛÿÛÝÿÛßÿßáÿßãÿßåÿßÝÿÙåÿÓéÿÙúÿÙüÿÙÿÙÿÓvÿ× ÿ×FÿïGÿïHÿïJÿïTÿïXÿîYÿÙ\ÿÙ¨ÿï©ÿïªÿï«ÿï¬ÿïºÿî»ÿî¼ÿî½ÿî¾ÿÙÀÿÙÈÿïÊÿïÌÿïÎÿïÐÿïÔÿïÖÿïØÿïÚÿïÜÿïÞÿïàÿïâÿïäÿïÿï*ÿî,ÿî.ÿî0ÿî2ÿî4ÿî8ÿÙCÿïEÿîPÿ×…ÿï‰ÿîŠÿïŒÿÙ‘ÿë”–ÿÙ™ÿé›ÿïœÿï�ÿÙžÿîŸÿå¤ÿî¦ÿîÓÿïÝÿïßÿÙêÿïëÿïîÿïøÿÙÿÙÿÙ ÿïÿï*ÿÙLÿïNÿïPÿï_ÿÙ`ÿÙaÿÙoÿïpÿïqÿï{ÿï¥ÿï§ÿï©ÿï«ÿï­ÿï¯ÿï±ÿï³ÿïÇÿïÉÿïËÿïÏÿïÑÿîÓÿîÕÿî×ÿîÙÿîÛÿîÝÿîßÿÙáÿÙãÿÙåÿÙ÷ÿ×øÿ×úÿ×ûÿ×üÿ×ÿ×ÿ×Ýÿïéÿïúÿïüÿïÿï:ÿ˜ ÿ˜IÿèXÿðYÿÁ\ÿÁºÿð»ÿð¼ÿð½ÿð¾ÿÁÀÿÁ*ÿð,ÿð.ÿð0ÿð2ÿð4ÿð8ÿÁEÿðPÿ˜‰ÿðŒÿÁ‘ÿí”–ÿÁ™ÿë�ÿ¹žÿð ÿפÿð¦ÿðßÿÁøÿÁÿÁÿÁ*ÿÁ_ÿÁ`ÿÁaÿÁÑÿðÓÿðÕÿð×ÿðÙÿðÛÿðÝÿðßÿÁáÿÁãÿÁåÿÁ÷ÿ˜øÿ˜úÿ˜ûÿ˜üÿ˜ÿ˜ÿ˜EFÿåGÿåHÿåJÿåTÿå¨ÿå©ÿåªÿå«ÿå¬ÿåÈÿåÊÿåÌÿåÎÿåÐÿåÔÿåÖÿåØÿåÚÿåÜÿåÞÿåàÿåâÿåäÿåÿåCÿå…ÿåŠÿå”›ÿåœÿåÓÿåÝÿåêÿåëÿåîÿå ÿåÿåLÿåNÿåPÿåoÿåpÿåqÿå{ÿå¥ÿå§ÿå©ÿå«ÿå­ÿå¯ÿå±ÿå³ÿåÇÿåÉÿåËÿåÏÿåùýÝÿåéÿåúÿåüÿåÿå� ~ FÿæGÿæHÿæI JÿæRÿéTÿæY \ ¨ÿæ©ÿæªÿæ«ÿæ¬ÿæ³ÿé´ÿéµÿé¶ÿé·ÿé¾ À ÈÿæÊÿæÌÿæÎÿæÐÿæÔÿæÖÿæØÿæÚÿæÜÿæÞÿæàÿæâÿæäÿæÿéÿéÿéÿæ8 CÿæP …ÿæŠÿæŒ �ÿì– ˜ÿé™ ›ÿæœÿæ� ¥ÿéÓÿæÚÿéÝÿæß êÿæëÿæîÿæø    ÿæÿæ* LÿæNÿæPÿæ\ÿé_ ` a oÿæpÿæqÿæ{ÿæ¥ÿæ§ÿæ©ÿæ«ÿæ­ÿæ¯ÿæ±ÿæ³ÿæ¹ÿé»ÿé½ÿé¿ÿéÁÿéÃÿéÅÿéÇÿæÉÿæËÿæÍÿéÏÿæß á ã å ÷ ø ú û ü   9<>?ÿõAÿëCÿìLÿëPÿíTÿºÝÿæåÿééÿæúÿæüÿæÿæÿé [ÿì]ÿì;ÿì=ÿì?ÿì ÿßàÿì.ÿìRÿìkÿìÛÿìòÿìÿìd FÿêGÿêHÿêI JÿêRÿèTÿê¨ÿê©ÿêªÿê«ÿê¬ÿê³ÿè´ÿèµÿè¶ÿè·ÿèÈÿêÊÿêÌÿêÎÿêÐÿêÔÿêÖÿêØÿêÚÿêÜÿêÞÿêàÿêâÿêäÿêÿèÿèÿèÿêCÿêP …ÿêŠÿê�ÿíŽÿñ˜ÿè›ÿêœÿêŸÿð ¢ÿî¥ÿèÓÿêÚÿèÝÿêêÿêëÿêîÿê ÿêÿêLÿêNÿêPÿê\ÿèoÿêpÿêqÿê{ÿê¥ÿê§ÿê©ÿê«ÿê­ÿê¯ÿê±ÿê³ÿê¹ÿè»ÿè½ÿè¿ÿèÁÿèÃÿèÅÿèÇÿêÉÿêËÿêÍÿèÏÿê÷ ø ú û ü   Ýÿêåÿèéÿêúÿêüÿêÿêÿè [ÿñ]ÿñ;ÿñ=ÿñ?ÿñàÿñ.ÿñRÿñkÿñÛÿñòÿñÿñYÿó[ÿñ\ÿó]ÿò¾ÿóÀÿó8ÿó;ÿò=ÿò?ÿòŒÿó–ÿóßÿóàÿñøÿóÿóÿó*ÿó.ÿñRÿñ_ÿó`ÿóaÿókÿñßÿóáÿóãÿóåÿóÛÿñòÿñÿñ;7ÿä9ÿå;ÿñ<ÿå[ÿðžÿå#ÿä%ÿä7ÿå9ÿåhÿå~ÿå€ÿñ„ÿå·ÿíÉÿäÊÿñÌÿæÞÿÌàÿð'ÿä)ÿå+ÿå-ÿñ.ÿð/ÿä1ÿæ3ÿæ@ÿæQÿñRÿðbÿæjÿñkÿðrÿåtÿì|ÿä}ÿÌÞÿåàÿåâÿåäÿåÎÿäÏÿäÑÿñÒÿí×ÿäÛÿðæÿåçÿåñÿñòÿðõÿäöÿÊÿÿñÿðÿíÿí ÿí|ÿä1ÿñ7ÿð9ÿó;ÿó<ÿïžÿï#ÿð%ÿð7ÿï9ÿïhÿï~ÿï€ÿó„ÿï³ÿõ·ÿòÂÿõÉÿðÊÿó'ÿð)ÿï+ÿï-ÿó/ÿð:ÿõQÿójÿórÿñtÿñvÿõ|ÿñ€ÿõÞÿïàÿïâÿïäÿïÎÿðÏÿðÑÿóÒÿò×ÿðæÿóçÿóñÿóõÿðÿÿóÿòÿò ÿò Wˆÿ�ÿá”ÿ®šÿ»nÿÔTÿqÐÿ*ÚÿN/7ÿá;ÿã<ÿâžÿâ#ÿá%ÿá7ÿâ9ÿâhÿâ~ÿâ€ÿã„ÿâ³ÿã·ÿèÂÿãÉÿáÊÿã×ÿéóÿé'ÿá)ÿâ+ÿâ-ÿã/ÿá:ÿã;ÿéQÿãjÿãvÿã|ÿâ€ÿã�ÿéÞÿâàÿââÿâäÿâÎÿáÏÿáÐÿàÑÿãÒÿèñÿãõÿáÿÿãÿèÿè ÿè"7ÿà;ÿâ#ÿà%ÿà€ÿâ³ÿâ·ÿèÂÿâÉÿàÊÿâ×ÿêóÿê'ÿà-ÿâ/ÿà:ÿâ;ÿêQÿâjÿâvÿâ€ÿâ�ÿêÎÿàÏÿàÐÿßÑÿâÒÿèÚÿâñÿâõÿàÿÿâÿèÿè ÿè!ÿñ ÿñYÿõ\ÿõ¾ÿõÀÿõ8ÿõPÿñŒÿõ–ÿõÞÿóßÿõøÿõÿõÿõ*ÿõ_ÿõ`ÿõaÿõ}ÿõßÿõáÿõãÿõåÿõ÷ÿñøÿñúÿñûÿñüÿñÿñÿñàÿõöÿõYFÿïGÿïHÿïJÿïRÿÒTÿï¨ÿï©ÿïªÿï«ÿï¬ÿï³ÿÒ´ÿÒµÿÒ¶ÿÒ·ÿÒÈÿïÊÿïÌÿïÎÿïÐÿïÔÿïÖÿïØÿïÚÿïÜÿïÞÿïàÿïâÿïäÿïÿÒÿÒÿÒÿïCÿï…ÿïŠÿï˜ÿÒ›ÿïœÿï¥ÿÒÓÿïÚÿÒÝÿïêÿïëÿïîÿï ÿï ÿêÿïLÿïNÿïPÿï\ÿÒoÿïpÿïqÿï{ÿï¥ÿï§ÿï©ÿï«ÿï­ÿï¯ÿï±ÿï³ÿï¹ÿÒ»ÿÒ½ÿÒ¿ÿÒÁÿÒÃÿÒÅÿÒÇÿïÉÿïËÿïÍÿÒÏÿïAÿêCÿêLÿèPÿêÝÿïåÿÒéÿïúÿïüÿïÿïÿÒ– DÿïFÿíGÿíHÿíIJÿíRÿéTÿíY \ ¡ÿï¢ÿï£ÿï¤ÿï¥ÿï¦ÿï¨ÿí©ÿíªÿí«ÿí¬ÿí³ÿé´ÿéµÿé¶ÿé·ÿé¾ À ÂÿïÄÿïÆÿïÈÿíÊÿíÌÿíÎÿíÐÿíÔÿíÖÿíØÿíÚÿíÜÿíÞÿíàÿíâÿíäÿíÿéÿéÿéÿí8 CÿíHÿïP…ÿíŠÿíŒ – ˜ÿé›ÿíœÿí¥ÿéÐÿïÓÿí×ÿÔÚÿéÝÿíß êÿíëÿíîÿíóÿÔø    ÿí ÿëÿí* ;ÿÔFÿïHÿïLÿíNÿíPÿí\ÿé_ ` a oÿípÿíqÿís u {ÿí�ÿÔƒÿï�ÿï�ÿï‘ÿï“ÿï•ÿï—ÿï™ÿï›ÿï�ÿïŸÿï¡ÿï£ÿï¥ÿí§ÿí©ÿí«ÿí­ÿí¯ÿí±ÿí³ÿí¹ÿé»ÿé½ÿé¿ÿéÁÿéÃÿéÅÿéÇÿíÉÿíËÿíÍÿéÏÿíß á ã å ÷øúûüÚÿÄÝÿíåÿééÿíë úÿíüÿíÿíÿé×Þÿïâÿïé ó2ÿï4ÿï;Aÿïcÿï}ÿï�ÚöÿïJFÿíGÿíHÿíJÿíTÿí¨ÿí©ÿíªÿí«ÿí¬ÿíÈÿíÊÿíÌÿíÎÿíÐÿíÔÿíÖÿíØÿíÚÿíÜÿíÞÿíàÿíâÿíäÿíÿíCÿí…ÿíŠÿí›ÿíœÿíÓÿí×ÝÿíÞÿáâÿáêÿíëÿíîÿíó ÿíÿí2ÿá4ÿá;AÿáLÿíNÿíPÿícÿáoÿípÿíqÿí{ÿí}ÿá�¥ÿí§ÿí©ÿí«ÿí­ÿí¯ÿí±ÿí³ÿíÇÿíÉÿíËÿíÏÿíÚÝÿíéÿíöÿºúÿíüÿíÿí Yÿó[ÿï\ÿó¾ÿóÀÿó8ÿóŒÿó–ÿó×ÿòßÿóàÿïóÿòøÿóÿóÿó*ÿó.ÿï;ÿòRÿï_ÿó`ÿóaÿókÿï�ÿòßÿóáÿóãÿóåÿóÚÿîÛÿïòÿïÿï ÿÓ ÿÓPÿÓ÷ÿÓøÿÓúÿÓûÿÓüÿÓÿÓÿÓ ÿÞ ÿÞPÿÞ÷ÿÞøÿÞúÿÞûÿÞüÿÞÿÞÿÞ:UÿºZÿÎmÿ`}ÿbˆÿ@§ÿ¥¹ÿ™ÿ²�ÿðŽÿs’ÿp™ÿ“šÿn�ÿ¬Ÿÿs ÿ­¡ÿr¢ÿqÑÿ˜Þÿ¬åÿrçÿuéÿnùÿr ÿoÿ� ÿr4ÿq6ÿq7ÿ’8ÿ`Mÿänÿ_sÿ‰uÿ§yÿp|}ÿˆ~ÿñ:ÿì;ÿð>ÿð?ÿ·Aÿ´Cÿ´Lÿ´Pÿ´Tÿ�Ðÿ©×ÙÿâÚÿhÜÿuàÿtëÿ×îÿwöÿ­øÿ˜1UÿuZÿ—mþÛ}þ߈þ¦§ÿR¹ÿ>ÿh�ÿÒŽþý’ÿ/™ÿ=šþô�ÿkŸþý ÿ_¡þû¢þùÑÿ;Þÿ]åþûçÿéþôùþû þòÿ- þû4þù6þù7ÿ18þÛMÿ½nþÙsÿ"uÿTyþ÷|}ÿ ~ÿÔÐÿX×Ùÿ¹ÚþêÜÿàþÿëÿ§îÿöÿ_øÿ; ÿíÚÿÅ @ Uÿê`AÿåCÿåLÿåPÿèTÿµ"ÿ±WÿîZÿÝDÿíÿã�ÿΔ�ÿÄÞÿ¹3ÿ]4ÿ„7ÿ…8ÿÛMÿñrÿ«tÿÆ|ÿ‚}ÿ§9ÿ¡;ÿÛ<ÿÉ=ÿð>ÿÃCÿõLÿõÐöÿ‡Þÿïsÿòuÿò}ÿðàÿðëÿòöÿâÞÿõTÿê$ ÿÖ  ÿ½@IÿâUÿÎWÿå`mÿ�}ÿɈÿާÿµ¹ÿ´ÿÉ‹ÿå�ÿíŽÿ°�‘ÿè’ÿÉ™ÿÕšÿ �ÿáŸÿàÿÉ¡ÿÔ¢ÿ¸ÿ·:ÿî;ÿò>ÿòAÿ¼Cÿ¼Lÿ¼Pÿ¿Tÿ�I�ÿñ™ šÿé�  ÿðÚÿ½ˆÿÒxÿò|ÿï”ÿé|ÿÞ:ÿõTÿìÐÿÒZ AÿïCÿïLÿïPÿïT 9;<>AÿêCÿêLÿêPÿìTÿ»AÿêCÿêLÿêPÿì>TÿÙAÿïCÿïLÿïPÿñTÿÃTÿî 9<>?ÿõAÿëCÿìLÿëPÿíTÿº9ÿí;ÿõ<ÿð>ÿñ9ÿã;ÿð<ÿê>ÿè9ÿé:ÿë<ÿð>ÿíTÿò 9ÿ®;ÿÒ<ÿ±=ÿë>ÿ¶AÿïCÿîLÿíPÿïTAÿêCÿêLÿèPÿêTÿÏ;ÿõ<ÿí 9ÿ³;ÿÕ<ÿ¼=ÿë>ÿ´AÿñCÿñLÿñPÿñTÿÒ[ÿÆ ÿÆ7ÿÏ9ÿÑ;ÿó<ÿÐYÿä[ÿî\ÿäžÿоÿäÀÿä#ÿÏ%ÿÏ7ÿÐ8ÿä9ÿÐPÿÆhÿÐ~ÿЀÿó„ÿÐŒÿä–ÿä·ÿìÉÿÏÊÿóÌÿßÞÿÅßÿäàÿîøÿäÿäÿä'ÿÏ)ÿÐ*ÿä+ÿÐ-ÿó.ÿî/ÿÏ1ÿß3ÿß@ÿßQÿóRÿî_ÿä`ÿäaÿäbÿßjÿókÿîrÿÑsÿõtÿå|ÿ‡}ÿÅÞÿÐßÿäàÿÐáÿäâÿÐãÿääÿÐåÿä÷ÿÆøÿÆúÿÆûÿÆüÿÆÿÆÿÆÎÿÏÏÿÏÑÿóÒÿì×ÿÑÛÿîàÿãæÿÑçÿÑëÿáñÿóòÿîõÿÏöÿ¿ÿÿóÿîÿìÿì ÿìL7ÿ¹PÿßQÿßSÿßYÿî\ÿî²ÿß¾ÿîÀÿîÿßÿß ÿß ÿß#ÿ¹%ÿ¹8ÿî‡ÿߌÿî�ÿß–ÿîÉÿ¹ÒÿßÔÿßÕÿßÖÿߨÿßÙÿßÛÿßÜÿßÞÿÝßÿîáÿßãÿßäÿßæÿßèÿßíÿßôÿßöÿß÷ÿßøÿîÿîÿîÿßÿß$ÿß&ÿß'ÿ¹*ÿî/ÿ¹7ÿè=ÿß?ÿßCÿßXÿßZÿß_ÿî`ÿîaÿîeÿßgÿßiÿßsÿõ}ÿÞ…ÿßßÿîáÿîãÿîåÿîÎÿ¹Ïÿ¹×ÿÅàÿìëÿêõÿ¹öÿÝŽ$&ÿæ*ÿæ2ÿæ4ÿæ7ÿÞ9ÿÞ<ÿÝ‚ƒ„…†‡‰ÿæ“ÿæ”ÿæ•ÿæ–ÿæ—ÿæ™ÿæžÿÝÁÃÅÇÿæÉÿæËÿæÍÿæÝÿæßÿæáÿæãÿæ ÿæÿæÿæÿæ#ÿÞ%ÿÞ7ÿÝ9ÿÝBÿæGKÿæbgÿæhÿÝknrÿæuyÿæ~ÿÝ„ÿÝ®ÿæ³¹ÂÅÿæÈÿæÉÿÞÌÿß×âÿÞóû ÿæ ÿæ ÿæ'ÿÞ)ÿÝ+ÿÝ/ÿÞ1ÿß2ÿÞ3ÿß4ÿÞ8ÿß:;@ÿßAÿÞEGMÿè[ÿæbÿßcÿÞrÿÝtÿÜvzÿæ|ÿÝ~ÿñ€�‚ŒŽ�’”–˜šœž ¢¸ÿæºÿæ¼ÿæ¾ÿæÀÿæÂÿæÄÿæÆÿæÈÿæÊÿæÌÿæÎÿæÞÿÝàÿÝâÿÝäÿÝæÿæÎÿÞÏÿÞÐ×ÿÞÚßÿæäÿææÿÞçÿÞèÿæêÿæõÿÞùÿæûÿæÿæÿæd$7ÿä9ÿä;<ÿ䂃„…†‡žÿäÁÃÅ#ÿä%ÿä7ÿä9ÿäGbhÿäknu~ÿ䀄ÿä³· ¹ÂÉÿäÊÌÿãÎÿó×Þÿåâÿæóû'ÿä)ÿä+ÿä-/ÿä1ÿã2ÿæ3ÿã4ÿæ:;@ÿãAÿæEGQbÿãcÿæjrÿätÿäv|ÿä}ÿå€�‚ŒŽ�’”–˜šœž ¢ÞÿäàÿäâÿääÿäÎÿäÏÿäÐÑÒ ×ÿäÚæÿäçÿäñõÿäöÿåÿ   ÞÿË3ÿå7ÿÝrÿÎtÿë|ÿ˜}ÿÎ×ÿ¾öÿÊ7ÿê<ÿòžÿò#ÿê%ÿê7ÿò9ÿòhÿò~ÿò„ÿòÉÿê'ÿê)ÿò+ÿò/ÿêÞÿòàÿòâÿòäÿòÎÿêÏÿêõÿê6PÿîQÿîSÿî[ÿï²ÿîÿîÿî ÿî ÿî‡ÿî�ÿîÒÿîÔÿîÕÿîÖÿîØÿîÙÿîÛÿîÜÿîÞÿíàÿïáÿîãÿîäÿîæÿîèÿîíÿîôÿîöÿî÷ÿîÿîÿî$ÿî&ÿî.ÿï=ÿî?ÿîCÿîRÿïXÿîZÿîeÿîgÿîiÿîkÿï}ÿî…ÿîÚÿíÛÿïàÿóëÿðòÿïöÿîÿï Þÿìâÿì2ÿì4ÿìAÿìcÿì}ÿìÚöÿì ÿñ ÿñPÿñ÷ÿñøÿñúÿñûÿñüÿñÿñÿñÞÿµ4ÿìsÿïuÿñ}ÿµàÿÖëÿØöÿ˜ @Uÿà`AÿÖCÿÖLÿÖPÿÖTÿ’�ÿé ÿæÞÿê}ÿëÚÿÜöÿëZÿ¼ÿÁ�ÿ®Þÿ´ ÿÏ4ÿ¨MÿÛsÿ¬uÿ¨}ÿ®~ÿîAÿåCÿåLÿäPÿæÙÿÔàÿ¬ëÿÄöÿƒ ÿä8ÿìÿÑ�ÿï‘ÿì”�ÿ¾ŸÿÛ¡ÿÜ¢ÿãÞÿÍ4ÿÂ7ÿÓ8ÿÁMÿårt }ÿ¾~ÿñAÿèCÿåLÿåPÿèÐÙÿèöÿ¸ ÿð�ÿé ÿéÞÿésÿõ}ÿëàÿïëÿðöÿãÑÿÞåÿÝéÿÏùÿÞ ÿÊÿà ÿÞ4ÿè6ÿÜ8ÿ×nÿ¸yÿÝ|Ðÿ¨×Úÿ§ÜÿÓîÿÛøÿÞZÿé9ÿï;ÿì<ÿï –ÿØÿoÿÀÿ¶ÿëÿ§ÿ§þãÿãÿæÿ¦ÿÝÿáÿêÿãÿéÿÒÿ–ÿéÿèÿØÿðÿìÿîÿäÿéÿäÿãÿèÿÕÿZÿÕÿ›þìÿ0ÿ.þïÿñÿ}ÿ×ÿæÿ˜ÿSÿõÿòÿòþwÿÁÿÛÿkÿ¤ÿ—ÿ§ÿ ÿªÿ«ÿ®ÿÿÇÿºÿ¨ÿÿâÿqÿsÿïÿ­ÿ¿ÿ—ÿÏÿÑÿÏÿ)ÿâÿõÿŠÿëÿÈÿÝÿßÿßÿeÿìÿ±ÿäÿæÿêÿØÿVÿâÿÃÿfÿ²ÿ¡ÿÇÿšÿ©ÿÿÈÿëÿrÿáÿ±ÿïÿäÿÝÿƒÿêÿêÿìÿãÿäÿàÿðÿÚÿõÿñÿðÿðÿçÿçÿòÿÞÿÙÿðÿïÿæÿïÿ`ÿðÿòÿðÿfÿÑÿëÿÞÿïÿïÿ:ÿTÿIÿZÿ[ÿ` þbÿ‹ÿuÿVþWÿ¹þùþýÿÏÿ_ÿ~ÿ»ÿ—ÿÄÿ§ÿêÿÅÿåÿžÿ©ÿ¸ÿ¹ÿ¸ÿÏþËÿÆÿKÿèÿèÿ¶ÿëÿëÿÕÿnÿÍÿìÿõ> %&'(-./23789:;<=DEFHKPQRSUY[\]‰Š‹Œ‘“”•–—š›œ�ž¡¢£¤¥¦¨©ª«¬²³´µ¶·¾¿ÀÂÄÆÇÈÉÊËÌÍÎÏÑÓÔÕÖרÙÚÛÜæõ÷úüþ   #%')+-/135789:;<=>?HPdghlmoprty{}~€„‡Œ�–˜š¥«¬­²³´µ·»¼½ÁÅÇÈÉÊÐÒÓÚÜÝßàæçêëíóôøú!')*+-.6FHKLNPQR[\^_`adeijkƒ…†ˆŠ��‘“•—™›�Ÿ¡£¤¥¦§¨©ª«¬­®¯°±²³¸¹º»¼½¾¿ÀÁÂÃÄÅÍÐÒÞßàáâãäåæ÷øùúûüýÑÒÖ×ÛÝÞáåæçîñòõûüÿ  %%&&''((--..//2233 77 8899 :: ;; <<==DDEEFFHHKKPQRRSSUUYY[[\\]]‰‰ŠŒ‘‘“—š�žž¡¦¨¨©¬²²³·¾¾¿¿ÀÀÂÂÄÄÆÆÇÇÈÈÉÉÊÊËËÌÌÍÍÎÎÏÏÑÑÓÓÔÔÕÕÖÖ×רØÙÙÚÚÛÛÜÜææõõ÷÷úúüüþþ    ## %% '' ))++--//113355 778899::;;<<==>>??HHddgghhllmmoopprrttyy{{ }} ~~€€ „„‡‡ŒŒ��––˜˜šš¥¥«¬­­²²³´µµ··»»¼¼½½ÁÁÅÅÇÇ ÈÈÉÉ ÊÊ ÐÐÒÒÓÓÚÚÜÜÝÝßßààææççêëííóôøøúú!!'' ))**++-- ..66FFHHKKLLNNPPQQ RR[[\\^^_addeeiijj kkƒƒ……†† ˆˆ ŠŠ ����‘‘““••——™™››��ŸŸ¡¡££¤¤¥¥¦¦§§¨¨©©ªª««¬¬­­®®¯¯°°±±²²³³¸¸¹¹ºº»»¼¼½½¾¾¿¿ÀÀÁÁÂÂÃÃÄÄÅÅÍÍÐÐÒÒÞÞßßààááââããääååææùùýýÑÑ ÒÒÖ×ÛÛÝÝÞÞááååæç îîññ òòõõûûüüÿÿ    õ     #$$%%&&')**+,--.12233445566778899 ::;; << ==>CDDEEFHIIJJKOPQRRSSTTUUVVWWXXYYZZ[[\\]]^noop�‚‡ˆˆ‰‰Š’“—˜˜™™š�žž Ÿ ¡¦§§¨¬­±²²³·¸¹º½¾¾¿¿ÀÀÁÁÂÂÃÃÄÄÅÅÆÆÇÇÈÈÉÉÊÊËËÌÌÍÍÎÎÏÏÐÐÑÓÔÔÕÕÖÖ×רØÙÙÚÚÛÛÜÜÝÝÞÞßßààááââããääåôõõö        !!""##$$%%&())**++,,--..//0011223344556677 8899 ::;;<<==>>??@ABBCCDDEEFFGGHHIJKKLLMMNNOOPPQabbcfgghh ijkklmnnooppqqrrstuuvxyyz}~~ €€ �ƒ„„ ……††‡‡ˆˆ‰‰ŠŠ‹‹ŒŒ����‘•––——˜˜™š›œ��žžŸ£¤¤¥¥¦¦§­®®¯±²²³³´¶·· ¸¸¹¹ºÁÂÂÃÄÅÅÆÇÈÈÉÉÊÊ ËËÌÌÍÏÐÐÑÑÒÒÓÓÔÖ×רÙÚÚÛÜÝÝÞÞßßààááââãäååææççèèééêëììííîîïïðòóóôôõõö÷øøùúûûü          #$$%%&&''(()) **++ ,,-- ..//00112239::;;<<==>>??@@AABBCCDDEEFFGGHHIKLLMMNNOOPPQQ RRSWXXYYZZ[[\\]^_abbccddeeffgghhiijj kklnoqruvvwyzz{{|€€��‚‚ƒƒ„„……††‡‡ˆˆ‰‰ŠŠ‹‹ŒŒ��ŽŽ����‘‘’’““””••––——˜˜™™šš››œœ��žžŸŸ  ¡¡¢¢££¤¤¥¥¦¦§§¨¨©©ªª««¬¬­­®®¯¯°°±±²²³³´·¸¸¹¹ºº»»¼¼½½¾¾¿¿ÀÀÁÁÂÂÃÃÄÄÅÅÆÆÇÇÈÈÉÉÊÊËËÌÌÍÍÎÎÏÏÐÐÑÑÒÒÓÓÔÔÕÕÖÖ×רØÙÙÚÚÛÛÜÜÝÝÞÞ ßßàà ááââ ããää ååææçòóõöö÷øùù úüýý þ ÍÎÏÐÐÑÑ ÒÒ ÓÚÛÛÜÜÝÝÞÞßßàãääååæç èèééêêëðññ òòóôõõöøùùúúûûüüýþÿÿ   6nDFLTlatn ÿÿÿÿaalt aalt liga&lnum,smcp2 `œ¼ÒæB`abcdefghTQPONMLKJIHGFDCiA@?>=<;:98TQPONMLKJIHGFDCiA@?>=<;:98{|}~€‚ƒ…†‡ˆ‰Šy‹Œ�Ž��‘’“”•Æ{|}~€‚ƒ„…†‡ˆ‰Šy‹Œ�Ž��‘’“”•Ê––——˜˜™™ššœœ��xxžžŸŸ  ¡¡¢¢££¤¤¦¦§§¨¨..ªª««¬­­®®¯¯°°±±²²³³´´µµ¶¶··¸¸¹¹ºº»»¼¼½½¾¾¿¿ÀÀÁÁzzÂÂÃÃÄÄÅÅ©©ÍÍÌÌËËÊÉÉÈÈÇÇ��„$= D]$‚‡>‰—DšžS ¦X¨·_º¾oÀÊtÍàãæ“éñ—õø ú¤ ¬ ²?¸GHã  å¾ÜTQPONMLKJIHGFDCiA@?>=<;:98TQPONMLKJIHGFDCiA@?>=<;:98{|}~€‚ƒ…†‡ˆ‰Šy‹Œ�Ž��‘’“”•Æ{|}~€‚ƒ„…†‡ˆ‰Šy‹Œ�Ž��‘’“”•Ê––——˜˜™™ššœœ��xxžžŸŸ  ¡¡¢¢££¤¤¦¦§§¨¨..ªª««¬­­®®¯¯°°±±²²³³´´µµ¶¶··¸¸¹¹ºº»»¼¼½½¾¾¿¿ÀÀÁÁzzÂÂÃÃÄÄÅÅ©©ÍÍÌÌËËÊÉÉÈÈÇÇ��„$=D]‚‡4‰—:šžI ¦N¨·Uº¾eÀÊjÍàuãæ‰éñ�õø–úš ¢ ¨?®GHÙ  Û'LI B`abcdefgh././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/lookAndFeel/Roboto-Light.ttfIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/lookAndFeel/Roboto-Light.t0000664002537200253720000042176415257173642031540 0ustar zmoelnigzmoelnigGPOSß±vþÉÔSêGSUBßätÀ4LTSHÎeû58OS/2¹s"˜`cmapy«z L@cvt ¾!|0fpgm/æN«Œ¼gaspÉÈ glyfíƒä)Ðwˆheadõj(Œ6hhea ¥éT$hmtxj|Aø@locac½Æ!¬"maxp=ôx name¡&ß²¡X™post�ùE–¥ô#ÒprepµTC3 H3^*�Í_<õÄð.ÎÌ)ú ýÕ ,b býÕ¦ú þ]4—_üƒ,š3š3ÑfàÿP [ Goog ÿýbýÕb+ ŸO:° òòòLöCotênì[\t€ŒŒe„KˆSJ1é§-ª‡o¼ojocoEo©o˜oModoY²š¶jM{•%|¢NNgÿ õ¿!„@¿œ¿�¿y’¨¿*ÙgM¿7¿ï¿®¿b|ó¿c|D¼Ï_½-^§ï *9è;Ü!È_ë£'0ëTMtI]Mgt�%ato\¡BuotžÑ­äÿ�îŸÑ­˜tžt[t�to¹žh¨&tšê,Aê2ê#êZ¤DIJ¤ z�Ä‘[z’CÉmÇ-¼Ÿ×g¿¢ekЇ¥{]|jfjj�>UCvTs@tt¢ÍR÷¦òbÿWš‡ ‚  °Œ¾lI0]c|¾·°—ÄM§cŒHu[¡„ȨW¢,š¶t�yld^ѧžÿÅ•‹z[s§¹šÔÿŒ\p Dˆa‹ç�¤«[|f†�¸ýý ü¯ýmü5ýiÀÕ£÷¦j»“-c|/Eyu©¿y?¸YŽ|=x�o½±ê,t[YküItž–†f¶t6cÄQtžGot[Mt›|qD@xyÞ„ë…Jÿ×J8ô6IŒ�4¢¼o7¤¼³ÊH Â\®¿ž)9ñMµ¶S­h¸‹¸2ÿö®»æ³H¡H×äagay©_£–5# d¤%£�*Ù©¤¤Þ0ÌoޤBnY¤kŸ #©H©Gp�©X]uÿåGnÖ$ä¤uÿ𤬖�Gÿã&Øó¦Í&8êÉ…ž§ž¦×k¨uà^c|†[íñ,c|u[¬c�¬—�„/oáˆü£üýtý§ú ú)Gÿ㻄�c³�Ÿž»ûŸèµR¢vQG3¼ËŸ(³ÑŸò|Àvò#;N­f˜N¨ )¸ÿøèµ8¢£¼tž™};ˆ›r›r�J•L?LßoQ3&.Dbq¼Bp3Ë¿œ–ñ‰u¨!CH’))¹ \0¢Ñ†°ƒ· ,l[l[a[mJd[i[Q[gC‚T–’¡¼!¼Î\alae–>¢M^{’C‹¹1Pâv¹[Ÿð`•¤~*lUmÅh cB®ž?�¥^@t{ÿ‹‚e•)¡(‘ 7ç�L0.X5\h<¡H‰õ ÿÿ Ñÿ�åE”ŽŸ‹}‹‚‹ys suÿ‘^bŸvÆ—™5a¨‚’¨+¨¨ºÚ¨Ȩ÷OH¨¡¨ܨ¨ÉØ“¨biHùœ§:Nž{Q-1Kj‹=KÉ_úcLH q‡r p"_X6vSsiTh�m‹ðXufqŸ�`}¤°~�Pž¼�§ó 7<¿‚�ha¨«oa‹òJ1^D^D’!½-¨ÿ ÿ ÿ ÿ ÿ ÿ ÿ !„œ¿œ¿œ¿œ¿*ÿ÷*Ê**ÿÚ®¿b|b|b|b|b|^§^§^§^§Ü!MgMgMgMgMgMgMg%a\\\\ÈÿÆÈ™ÈÿÒÈÿ©tžt[t[t[t[t[tštštštšê#ê#ÿ Mgÿ Mgÿ Mg!„%a!„%a!„%a!„%a@¿ oœ¿\œ¿\œ¿\œ¿\œ¿\y’uoy’uoy’uoy’uo¨¿tž*ÿ¾Èÿ�*ÿÆÈÿ•*ÿ÷ÈÿÆ*CÑ*ȑٵ­gMÔÿŒ¿îŸ7±ÑŸ7¿Ñ‚7¿g­7¿­­®¿tž®¿tž®¿tžtÿðb|t[b|t[b|t[D¼¹žD¼¹yD¼¹…Ï_hÏ_hÏ_hÏ_hÏ_h½-¨&½-¨&½-Ð&^§tš^§tš^§tš^§tš^§tš^§tš*9AÜ!ê#Ü!È_êZÈ_êZÈ_êZIÄMc|u[’ÿí’ÿíH™5™5™5™5™5™5™5‚+¨+¨+¨+¨ÈÿÅȘÈÿÑÈÿ¨¨ÉÉÉÉÉùœùœùœùœQ-™5™5™5‚‚‚‚’¨+¨+¨+¨+¨+¨ººººÚ¨ÈÿŒÈÿ”ÈÿÅÈȘ÷OH¨¡™¡¨¡¨¡¨¨¨¨ÉÉÉ“¨“¨“¨bibibibiHHùœùœùœùœùœùœNQ-Q-1K1K1KÄiÿ ÿô Ž!v;@ÿ•QXfÿ°ÿ õ¿œ¿È_¨¿*Ù¿ï¿®¿b|ó¿½-Ü!è;*ÿÚÜ!�oYktžf¶t›W¢t[t¢ê,fÿºt›t[t›Þ„œ¿j»Ï_*Ù*ÿÚgM¿¿9ÿ õ¿j»œ¿®¿ï¿¨¿b|©¿ó¿!„½-è;Mg\¤t[t�%aê#ê2\_£hÑ­Èÿ©äÿ�%£ê#*9A*9A*9AÜ!ê#\tLœžrBÔÿŒl[￘ÿ MgbÿQíBBœ¿®¿\¤Ž|xyíñ^[ L|Â\ d!„%aÜ!ê,*Ù #*Ùÿ Mgÿ MgIÄMœ¿\™};ˆ #Â\ d®¿¤®¿¤b|t[c|†[c|†[H¡Gp9ê#9ê#9ê#S­Bn®»©è;ê2tož)�*ÿ Mgÿ Mgÿ Mgÿ Mÿùÿ Mgÿ Mgÿ Mgÿ Mgÿ Mgÿ Mgÿ Mgÿ Mgœ¿\œ¿\œ¿\œ¿\œI œ¿\œ¿\œ¿\*ÈÈ—*ÆÑ™b|t[b|t[b|t[b|t b|t[b|t[b|t[•‹z[•‹z[•‹z[•‹z[•‹z[^§tš^§tšs§¹šs§¹šs§¹šs§¹šs§¹šÜ!ê#Ü!ê#Ü!ê#’o’o¿%£¨¿¤½-Þ0è;ê2S­BnS­Bnj»_£ # )¸ÿøtžæÿýæÿýj+_0ÿ÷ ®¿¤¨¿¤ï¿Ù©ž)�*Ü!ê,è;ê2Yk�ƒ·Ξ0/ #/////////- &'/--$-""-----.%**"'-2$ 0-'/"1 2--$-/----2(')(  % /,$$ 2#$02 (&(-1(+ +-% "'0'", -2% #&'' ''''----------   $$$$-"&"&"&&-------'-'-'-'-'-'-///$- """" --0 %$ /-$-0--$---  --"0* * 2    - -            "-------11111'-'-    -))  P4Þ€^ !~ ¬­¿ÆÏæïþ%'0S_g~’¡°ðÿ7Y¼ÇÉÝó #ŠŒ’¡°¹¿ÉÎÒÖ%/EOboy†Î×áõ?…ñóùM   " & 0 3 : < D t  ¤ § ¬!!!!"!&!.!^"""""""+"H"`"e%ÊöÃûþÿÿýÿÿ " ¡­®ÀÇÐçðÿ&(1T`h’ ¯ðú7Y¼ÆÉØó #„ŒŽ“£±ºÀÊÑÖ&0FPcpzˆÏØâö>€ òôM   % 0 2 9 < D t  £ § «!!!!"!&!.!["""""""+"H"`"d%ÊöÃûþÿÿüÿÿÿõÿâAÿÀ5ÿ¿(#ÿÿþôþçWþaþ@ŒýÔý¥ýÄý¯ý£ý¢ý�ý˜ý…ÿgÿfýýÿFüúü÷ü¶ü®ü£ü�þ”þ�üGåKå ä»äíäOäëäáXáOáNáLáCãá;ã á2áàùàÓàwàjàhà]ß�àRà&߃ާßwßvßoßlß`ßDß-ß*ÛÆ Δ˜ÜÔÞ"""dfp^f‚šœä .>ÈØìàÐЬèéêëìíäøùúûüý€�þÿ‚ƒ„…†‡ˆãå‰åŠLMNOPQ‹RSTUVWXYŒ�Z[\]^_`Ž�abcdef�‘uvwx{|æçî ”•–—styz©ªï«ðñò¬­ùúû®üý¯þÿ°±²³´µ    ¿À PÎÏÐÑÒQÓÔ Õ!Öר"Ù#$%&'()ÚÛ*+æçèé,êëì-íîïð.ñ/0ò1ó2R3þ4ÿ56789S:ûTUVWYX$%ú&'()*üý+,õöZ[çè-.þÿ/0éê123456\]ëì^_ íî78ïð9:;ù<=÷ø`ab>?@AñòBClmnopqDEóô†‡FGˆ‰  HŠ ‹Œde yæ{’FNOð ó  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ìíïñøý    nobcgpuƒmish��ŠpŽ�et…‡†Á‹jyµ„‡~al‰“Œ­kzráèëü�‘deklgh†��v{tu’Fovimsêòéóðõö÷ôúûùÿþŠš nœ�žw¡Ÿ›°,K° PX±ŽY¸ÿ…°„± _^-°, EiD°`-°,°*!-°, F°%FRX#Y Š ŠIdŠ F had°%F hadRX#eŠY/ °SXi °TX!°@Yi °TX!°@eYY:-°, F°%FRX#ŠY F jad°%F jadRX#ŠY/ý-°,K °&PXQX°€D°@DY!! E°ÀPX°ÀD!YY-°, EiD°` E}iD°`-°,°*-°,K °&SX°@°YŠŠ °&SX#!°€ŠŠŠ#Y °&SX#!°ÀŠŠŠ#Y °&SX#!¸ŠŠŠ#Y °&SX#!¸@ŠŠŠ#Y °&SX°%E¸€PX#!¸€#!°%E#!#!Y!YD-° ,KSXED!!Y-° ,°E-° ,°E-° ,±'ˆ ŠSX¹@c¸ˆTX¹èpY°#SX° ˆ¸TX¹èpYYY-° ,°@ˆ¸ ZX±D¹èDY-° +°+²+·o[G1+·‚jS;+·mYE2+·QB3$ +·C7+ +·/& +·9." +²+° E}iD²0 s²p s²€ s²Ð s² t²? s²_ s² s²/ t²O t²o t²� t²¯ t²ÿ t² u²? u²_ u² u²s²s²ïs²t²_t²�t²Ït²ÿt²?u²ou²¿s²/t²Ÿt²¿t²u²/u²_s²ÿs²Ït²Ot²/s²/s²?s²s*fWhŒªÖþ`:°�! ,ž*¸Zx¢Ì6Nf€˜æjà&Œô*¦ "8€²øV  F ª F Š Ò 8 ˆ ¤ Ú , P   Ü . r Ð2žÊ4ŒÔ<bzžÈäŠð@¤lî6f®ø†Ð‚æ&˜î4d¸J‚ÄÜ`ˆò`Â$Dð´2>\\š¬¾â 6 ` v ² Ä! !!0!J!d!¼":"h"æ#4#’$P$Ü%%Œ%ò&T&p&À' 'J'¤((ˆ) )f)æ*P*¶+ +p+¢,,6,h,Ž,¨,â--D-t-¸-Ð-è-ò.$.T.r.Š.¾.Ê.ò/"/ž/Ì00F0„0ð1H1¨2 2�2Ä3>3¶44X4Ò55l5ä626Ž6ì7H7t7¶8 8š8ü9j9Ð:.:¤;;|;ì<\<®<ð=@=–>>€>¼??H?²?î@0@l@¶AA`A¤B B˜BìCXC¸CàD4D¨EERE¨EìF6F„F´FàGxG´GöH.HxHÊI"IfIÊJ8JŽKKpKØL:L¢LæMFM¦NN�O OZOªPP†PôQ^QêRrSSÜTPT²TôU:U¨VVæW¬XpRpœqqŽrršs6s s¾ttttŽt¨tÂtÜu8u^u¢uºuîv|vØwxwÄwâxx:xRxÎxÎz8zŠzÔ{{T{„{¶{â||*|Ô}N}°~>~Ž~Îv’Ò€B€”€Ö��j�Ò‚‚0‚f‚¶‚Úƒ$ƒ`ƒ¬„„j„Ô……<…j…¾†8†h† †ê‡‡l‡êˆ2ˆš‰‰Z‰ÖŠ<ŠhŠÂ‹B‹ˆ‹îŒVŒˆ� �v�¾�âŽFŽx޾�$���Æ�~�ú‘d‘¨’’’’ ’†’ì“T“˜”””,”>”P”f”|””” ”²”Ĕ֔ì”þ••"•8•J•\•n•€•’•¨•º•̕ޕô–––*–<–N–b–x–�–œ–®–À–Ò–æ–ø— ——2—D—V—h—z—Œ— —²—Ä—Ö—ê—ü˜˜"˜4˜F˜X˜d˜p˜‚˜”˜¦˜¸˜Ê˜Ü˜î™™™(™:™L™^™p™‚™”™ ™¬™¾™Ð™â™ôššš*š<šHšZšlš€š’š¤š¶šÈšÚšìšø›››"›.›@›R›^›j›|›Ž›š›¦›¼›Ò›â›òœœœ"œ.œ@œRœhœzœŒœžœ°œÆœÜœî�� ��*�<�N�`�r�„���œ�¨�´�Æ�Ø�ä�ð�üžžž0žBžTžfžxžŠžœž²žÈžÞžôŸŸ ŸŸ0ŸBŸTŸjŸ|ŸŽŸ Ÿ²ŸÄŸÖŸèŸú    8 R h z Œ ž ° Ä Ú ò þ¡¡"¡4¡H¡Z¡l¡~¡”¡¦¡¸¡Ê¡Ü¡î¢¢¢&¢8¢N¢`¢r¢„¢�¢¢¢´¢Æ¢Ø¢ê¢ü££ £,£>£P£b£t£€£’£¤£¶£È£Ô£æ£ø¤¤¤"¤8¤H¤Z¤f¤x¤Š¤œ¤²¤Ä¤Ð¤â¤ô¥¥¥$¥0¥B¥T¥f¥x¥Ž¥¤¥°¥Â¥Ô¥è¥ú¦ ¦¦*¦6¦B¦N¦Z¦f¦r¦~¦–¦ž¦¦¦®¦¶¦¾¦Æ¦Î¦Ö¦Þ¦æ¦î¦ö¦þ§§§2§D§V§h§z§’§š§¢§ª§²§È§Ü§î¨¨¨(¨:¨¦¨®¨Ä¨Ì¨Ô¨æ¨ø©©©©©*©2©:©B©J©R©Z©b©j©r©z©Œ©”©œ©ì©ô©üªª"ª*ª2ªHªPªbªtª†ª˜ªªª¼ªÒªèªú« ««6«B«N«`«r«„«–«¢«®«À«Ì«Ü«î¬¬¬$¬,¬4¬J¬`¬l¬x¬„¬�¬œ¬¨¬°¬¸¬À¬Ò¬ä¬ì¬þ­­&­:­B­J­\­n­„­˜­®­Ä­Ú­î®®®(®<®R®f®n®v®Œ® ®¶®Ê®Ü®î¯¯¯.¯D¯Z¯n¯ˆ¯¢¯®¯º¯Â¯Î¯Ú¯æ¯ò°°°,°@°V°j°€°”°ª°¾°Ô°ê±±±*±>±T±h±~±’±¨±¾±Ê±Ö±è±ú² ²²4²J²`²t²Š²ž²´²È²Þ²ô³³³$³0³<³H³Z³l³‚³˜³®³Ä³Ú³ð´´´2´H´Z´l´~´�´¢´´´Æ´Ø´ä´ð´üµµµ,µ>µPµbµtµ†µ˜µªµ¼µÈµÔµàµìµþ¶¶"¶4¶¶¶Î¶Ú¶æ¶ò¶þ· ··"·.·:·F·R·^·j·v·‚·Ž·š·¦·®¸¸p¸°¸ð¹Z¹¼¹Ò¹è¹ôºº ºº$º0ºxºÈ» »x»€»Œ»–»Ä;× #°EX°/±>Y°° +XØÜY°а° Ð01#753#53è!Hfï!He@þûÿÞØþûÛCŸ°p°EX° /± >Y°EX°/±>Y² +°±° +X!ØôY°а ± ° +X!ØôY°а °а°а °аа°аа°а°Ð01!##5!!5!3!33#3!#!!ßþÇMdMÿSþé)OdO:OdOå÷SÿþïMdÛ:SþÆšþfš]¹` þ` þ``þG]þf÷¹tÿ0ý�-“°EX° /± >Y°EX° /± >Y°EX° /± >Y°EX°#/±#>Y²# 9° ° ° +XØÜY² #9° ±° +X!ØôY°±° +X!ØôY°#°"° +XØÜY²(# 9°#±+° +X!ØôY014&'&&546753#4&#"#5&&773326…�¶ÐÈȬf¯Àp �”™ˆÁÏÇаeµïpÊ�”­gnŒABº©¢ÌÊÊæÄ˜¾›vr‹@E·§¦Ç¾½ ÑÓ±œ›nÿë„Å )7;p°8/°:/°EX°/±>Y°EX°&/±&>Y² &9° /±° +X!ØôY°±° +X!ØôY²&9°/°&±-° +X!ØôY°±4° +X!ØôY014632#"&53326554&#"4632#"&53326554&#"'n�€�œ~�ž`c\YabZZc|�€ž�~�žab\YabZZbþ!JÇJ˜®®M~­­~X||XMX~~XüÌ~®®~N~­­~X||XN[z{Zë0r0[ÿë¹Å"0=„°EX°/±>Y°EX°/±>Y°EX°/±>Y²*9²49²*49² 4*9²9²9²9²9±#° +X!ØôY²&9°±;° +X!ØôY01&&546326653#'#"&5467267&&'76654&#"„QN²›�©ZUŸœ16nIE¹‰zUÊuÑô‘‰«\¯Fþb/tO«!?A±:1i^fod¥Wž¬¢{Z‚AzþG°d€×WØ�NTÖ²xÁdý@HCâ$^˜@|§-BŽP„-b8Oh‚tBâ°EX°/±>Y°° +XØÜY01#53â&HfUþí ÌŒþ1mY °/° /017#&Œ«‘ØØ‘­þìLk@bIgýòþµþµýòkFd4tþ1òY °/° /01#'65'73òþì¬�ÙÝŒª=þŒýÌdFfLIfFbýÀþ•}J°B°EX°/±>Y² 9° /² 9°/² 9² 9°в 9° ° Ð01%73%'iþ´ LhD!þ³ßUÖÌUèle{rþ‹esþÚ?1þÑ=K’1¶ ° /°Ð° ±° +X!ØôY°Ð01!!#!5!3v»þEyþN²yäpþâpÒSþþ¼°/°° +XØÜY01%#53jREwþì§1:Ÿ°/±° +X!ØôY01!5!þ!ß:e§0¤°EX°/±>Y°° +XØÜY01!#530‰‰¤ÿƒê°°/°EX°/±>Y01#3‹m`l}-‡ÿë#Å ;°EX° /± >Y°EX°/±>Y° ±° +X!ØôY°±° +X!ØôY01#"32'4&#"3265#ôÙØ÷ôÙÙöx°§§®±¦¦¯5þæþÐ1E2þÎþçàññàþ•Þõôß¼ÿù¦´=°EX°/±>Y°EX°/±>Y°°° +XØÜY±° +X!ØôY²901#5%¦xþŽê:+TXjÅO°EX°/±>Y°EX°/±>Y±° +X!ØôY°в9°± ° +X!ØôY°° в901!!56654&#"#'&632!üxÝ„m™Œ¦¬oöҼ◇þoî\•É\ˆ¤¸š¶üضx÷˜þ:cÿëôÅ*q°EX°/±>Y°EX°/±>Y²9°/²_]²/]°±° +X!ØôY°° а±*° +X!ØôY²*9°° а±#° +X!ØôY0132654&#"#'&632#"$77332654&##“‹Ÿ¤š˜Œ³pø¾Ãç€tˆ‡ûÅ¿þîpÁ™›®¶©‹Ÿ}ˆ¢¥‡ªâÖ¾gµ,'¹~ÂÞÙÁ‹°¡–™“EK° I°EX° /± >Y°EX°/±>Y² 9°/±° +X!ØôY°а° в 9° ° Ð013##!53!'gääwýUŸƒýl3Õeþ�pDüü%>m©ÿë°d°EX°/±>Y°EX°/±>Y°±° +X!ØôY²9°/°в9°°а±° +X!ØôY°±° +X!ØôY01!!6676#"&77332654&#"½QÃý£67„qºäÝÞ´ðk§‹¢¡¡‘Œ“!“oýù26ÿØÝþøÉÅ“œÄº£ÅYZ˜ÿëÅ'Q°EX°/±>Y°EX°/±>Y°±° +X!ØôY²9°/±° +X!ØôY°±"° +X!ØôY012&&#"6632#"4"32654&‡K’99pN¢Õ<ºqÄäõÄÉþû©yµ!À–’¯ªÅ" b üÍ�N^þòÙ×þè,oü>ýš~ckÑò奯ÖM° /°EX° /± >Y°EX°/±>Y° ± ° +X!ØôY°Ð01#7!5!ìú* x *ÚüÁ»Jþèý¿þ‰zzrWfdÿë Å#/i°EX°/±>Y°EX° /± >Y²- 9°-/²_-]²/-]±° +X!ØôY²-9²-9° ±!° +X!ØôY°±'° +X!ØôY01#"$5467&&546324&#"3264&#"326äŠs…¡þúÎÒþýž…s‡í½¼ñOÈ–˜Äœ˜Ä)±„‡¬­ˆ…®9v±()¿€ÄÓÒÅ�¿)(°v¼ÐÑü�Š­­Š�¢£G~§ …�››YÿëåÅ'N°EX° /± >Y°EX°/±>Y±° +X!ØôY² 9°/±° +X!ØôY° ±"° +X!ØôY01%2655#"5432#"&'726754&#"ÿ¦Ä5³nÇóÿ¼ÓþþôÚN�GD…g‚¯%µ›�·¬PÞÏ’\dÛÝ*þíþúþSýþéd ä…bšÏÛô­¨âÿÿš#8&óÿó”°EX°/± >Y01ÿÿjþþ':'ÿ÷–°EX°/± >Y01MzˆÐ ]³+²oq²/]²ß]²_]²_]²oq²ß]²/]² ]²9°°ад#3q°°а д, < q015"llfüÅ;Bþô~{az~•¦×«<²+´ ]²q°±° +X!ØôY²q²]°±° +X!ØôY01!5!!5!×ü¾Bü¾BAjýûj|zÉÐ ]³+²oq²_]²/]²ß]² ]°°ад,<q²_]²oq²/]²ß]°°ад#3q²9015575'|Mü³xllU{þ†aþ…|NHÅW°EX°/±>Y°EX°/±>Y²9°/²9°± ° +X!ØôY°° в9°°° +XØÜY016676654&#"#'&632#53y*]lcˆ~v�pÖ¦³Ë…z>‹‹”ƒgUp—t€Œ‰u¥¾Ê¬‡Ñr5\`þlšgþ;èŒ3Cu°/°1/°+/°EX° /± >Y°EX°/±>Y² 9±° +X!ØôY°1±° +X!ØôY°+±$° +X!ØôY° ±7° +X!ØôY°±A° +X!ØôY01#"&'#"&763233267! !267# ! 3267447&&#"× ÖÎNi5œfƒˆì¨^rE2 P7Ž¥ þ°þ–þ½þ\mQX´>@Î_þ„þ`Õw‡‰û¸T`V�4/ N0†°ØþÂf[`aðÅþ357ý„`ùÇ…¯þ)þ€þ…þ-,#K)0ó°¨þý÷›¸Vr î ß° F°EX°/±>Y°EX°/±>Y°EX°/±>Y²9°/±° +X!ØôY°° Ð01!#3#!#Íýe–|)q%|ü÷LþÞ–þj°úP¿‡° ]°EX°/±>Y°EX°/±>Y²9°/²/]±° +X!ØôY²9°±° +X!ØôY°±° +X!ØôY013!2#!2654&#%!2654&#!¿©ãým…¦ýÔþ€€¡¸§ŸþmOž­¸°þΰ¿Àp¦ Ê„ÃÒ¾ý§Ÿ�ƒ¨e‹‡Š‹„ÿë¬ÅG°EX° /± >Y°EX°/±>Y° °а ±° +X!ØôY°±° +X!ØôY°°Ð01#"532#&&#"3267ªþîæóþÖ*óèpɸ¿ç翸ÊÇÛû_íaößµÀþØçïêþÙ¼»¿Í° ;°EX°/±>Y°EX°/±>Y°± ° +X!ØôY°± ° +X!ØôY013! !!2554#¿§ \þ¤þõþÐ0Øþè×°þœþé»þèþžJû.ç¾ä.¿Y° V°EX°/±>Y°EX°/±>Y² 9° /²/ ]±° +X!ØôY°±° +X!ØôY°±° +X!ØôY01!!!!!!óýC#üf•üâ½Áý¤e°fýÝ¿`° d°EX°/±>Y°EX°/±>Y²9°/²_]´/q²Oq´�]²/]²q±° +X!ØôY°±° +X!ØôY01!#!!!úýY°EX°/±>Y° °а ±° +X!ØôY°±° +X!ØôY² 9°/´]±° +X!ØôY01%#"32#&&#"3267!5!Î1þýÅþþ»5öë o¼ÄïþÍ‘Ë%þ}û­G{Z Të¼’µþäÞþóäþÜQ0|f¿é° o°EX°/±>Y°EX° /± >Y°EX°/±>Y°EX°/±>Y²9°/²_]´¯¿]²ß]´�]²/]²Oq±° +X!ØôY01!#!#3!3éwüÄwwY°EX°/±>Y01!#3Qxx°Mÿë±°/°EX°/±>Y°EX°/±>Y° а± ° +X!ØôY013#"&77332659xí¼Íîp¨œ…¬°ûíÇëÔÌž£µ˜¿î°e°EX°/±>Y°EX°/±>Y°EX°/±>Y°EX°/±>Y²9°/²_]²/]´�]±° +X!ØôY² 901##333#þÈwwÇ=‡ý¦…Ž­ýS°ýbžý9ý!¿°)°EX°/±>Y°EX°/±>Y±° +X!ØôY01%!!37Ðü¸xee°¿0°S°EX°/±>Y°EX°/±>Y°EX°/±>Y°EX° /± >Y°EX°/±>Y° °а° а Ð0133#'##\žw ýãSýä w°úþúPƒ}úþüýˆý}°¿ï° C°EX°/±>Y°EX° /± >Y°EX°/±>Y°EX°/±>Y°°а°Ð01!##373ïwüÅxx;wäû°ûá|ÿëæÅ ;°EX° /± >Y°EX°/±>Y° ±° +X!ØôY°±° +X!ØôY01! 5! '4#"325æþËþüÿþÏ06wïÔÐèéÐÕíaþæþ¤\í^þ¢þçì þàìïîþàï¿”° B°EX°/±>Y°EX°/±>Y²9°/± ° +X!ØôY°±° +X!ØôY01#!2#%!2654&#!6wõåûûåþ‚~´µ´µþ‚]ý£°éÀÂèf·‹Œ¹|ÿ,Å!B°EX°/±>Y°EX° /± >Y² 9°±° +X!ØôY° ±° +X!ØôY01%# 5! '4#"325æmeúSþø;ƒHÿþÏ06wïÔÐèéÐÕía¤þùSìKù\í^þ¢þçì þàìïîþàï¼Ð¯#V°EX°/±>Y°EX°/±>Y°EX°/±>Y²9°/±° +X!ØôY² 9°±"° +X!ØôY01#!2#&&554&#%!2654&#!3wíêú†z‡w %z%­›þhgŶµ·þŠ’ýn¯ÍÅt·*"¯„‰Dl"$‚F…†›fŸ‡�›_ÿëxÅ']°EX° /± >Y°EX°/±>Y² 9° °а ±° +X!ØôY°±° +X!ØôY°°"а±%° +X!ØôY014&'&&54$32#4&#"#"$773326²ÝïöØánϱ¯Å¶ßëõþãÝÚþ»nþ¬­Õew—:<À£§Òú´’¼œtn“8<̧®ÎÛÒª¤˜-�°/°EX°/±>Y°EX°/±>Y°±° +X!ØôY°Ð01!#!5!�þ xþ bJú¶Jf§ÿë¹°6°EX°/±>Y°EX°/±>Y°EX°/±>Y± ° +X!ØôY01#"$533265¹þÝêçþâxܱ´â°ü%îüýíÛü%ºËÊ»Û Ï° -°EX°/±>Y°EX°/±>Y°EX°/±>Y°Ð01%373#3Xµ‚ýáqýá‚öaaºúP°9ê°S°EX°/±>Y°EX° /± >Y°EX°/±>Y°EX° /± >Y°EX°/±>Y° °аа°Ð0173773#'##3½,74q45/zþŠqþ¹&%þ¶rþŠ{œßàûìáàúP]™™û£°;°° P°EX°/±>Y°EX° /± >Y°EX°/±>Y°EX°/±>Y²  9° °Ð° °а °Ð013##3t›‘þô�þUþV‘ôþ‘Bný2ý‚ý~âÎ!º°1°EX°/±>Y°EX°/±>Y°EX°/±>Y²9013#3lËýíwýñ‹‡)üdýì•_k° F°EX°/±>Y°EX°/±>Y±° +X!ØôY²9°±° +X!ØôY² 9017!!5!5!î}ûôZüÁÑee\îfW£þÈí€'°/°/°±° +X!ØôY°±° +X!ØôY01#3!!íÒÒþ¶Jùf¸0ÿƒ°°/°EX°/±>Y013#0u`u°ùÓþÈK€$°/°/±° +X!ØôY°±° +X!ØôY01!!53#KþµÓÓ€øHfìMÙü° #°EX°/±>Y°° +XØÜY°а°Ð01#3#'#Át+Z*tÄÙ×ý)äjjÿ›r°EX°/±>Y±° +X!ØôY01!5!rü�qee]ºÃÄ(°/°/²]°° +XØÜY´Ÿ¯]¶/]01#73ÃuñšºgÿëÈN +�°EX°/± >Y°EX°/±>Y°EX°/±>Y²9² 9° /²/ ]´ 0 q°±° +X!ØôY² 9°±!° +X!ØôY°°$а ±%° +X!ØôY01!&&5#"&54$3354&#"''&632%2675#"K <È}ž¯Ü}¥né´³Ú ýú�Æ,ñ£Ãy7P)Up¨�–´†t„~[y¿¶ªýì9l5Uy^â‹gXo�ÿëc°EX° /± >Y°EX°/± >Y°EX°/±>Y°EX°/±>Y²9² 9°±° +X!ØôY°±° +X!ØôY01#"&'#36632#4#"3265ÜÁw¬5 gx6¨tÃÜy �}™%(Ÿv�žÿóþß_Y£ýx[cþÉþýÏ|aþ^oèÄaÿëÍND°EX°/± >Y°EX°/±>Y±° +X!ØôY°°а°а±° +X!ØôY01%2653#"55432#4&#"/w¶jú¤ÝñòÛ²ík¯®§¦Pˆy–Ê/î*ì0Ò«‚›ù½*ÀøoÿëÓ`°EX°/±>Y°EX°/± >Y°EX° /± >Y°EX°/±>Y²9² 9±° +X!ØôY°±° +X!ØôY01323#'#"533267&&#"oÛÄq¦7wj 6ªsÂÛx�žt›+)–yžŸ7`X‚ùè�V\!óÄèh\ü^uþýÏ\ÿëÐNT°EX°/± >Y°EX°/±>Y² 9° /°±° +X!ØôY°±° +X!ØôY° ±° +X!ØôY01"55432!3267"!54&4Ëþó ¾Çäýžpž83=»�…´z¦,æ7è2üÒf·ö>:R@KýË™�¾B³-ˆ°/°EX°/± >Y°EX°/± >Y°EX°/±>Y°±° +X!ØôY°в`]²ð]²pq²]´/?]²0q² ]´°Àq²r°±° +X!ØôY°°аÐ013#5354632&&#"!!õ³³£“!D#3"bhþþØbž£² c|pžbü(oþKÖN+~°EX°/± >Y°EX°/± >Y°EX° /± >Y°EX°/±>Y²9° ±° +X!ØôY²9°±!° +X!ØôY°°$а°%а±(° +X!ØôY013273#"&'732655#"533267&&#"oÝÅs¨7eçÎN°B@ŽQž¡7¨pÃÝx žt›*'—yž¢7e\­ûÔÑò&!e !¶¢ˆRY"òÃéj]ö^xþüΞÚM°EX°/±>Y°EX°/± >Y°EX°/±>Y°EX°/±>Y²9°± ° +X!ØôY016632#4&#"#36´x«·x‹z{¥'xx�alÔßýe�°™�ký­$<°EX°/±>Y°EX°/± >Y°EX°/±>Y°°° +XØÜY²�]01!#3#53$wwww:6¨ÿ�þK+H°EX°/±>Y°EX°/± >Y°EX°/± >Y± ° +X!ØôY°°° +XØÜY²�]01#"&'73265#53+ Ž5 8Ydqww:ûm§µ e {x“:¤ŸâT°EX°/±>Y°EX°/± >Y°EX°/±>Y°EX°/±>Y²9°/±° +X!ØôY² 901##333#¡Šxx~’ŒþOÞ‰ýñü^Äþý¸­$°EX°/±>Y°EX°/±>Y01!#3$ww˜N%q°EX°/± >Y°EX°/± >Y°EX° /± >Y°EX°/±>Y°EX°/±>Y°EX°#/±#>Y²9²9° ±° +X!ØôY°Ð0166326632#4&#"#4&#"# 4­x|§$1µ‚­¼x�~‹˜y�}•y:³_hx{r�æñý‰yÈ¥®ˆýwyÄ©�mý:žÙNM°EX°/± >Y°EX°/± >Y°EX°/±>Y°EX°/±>Y²9°± ° +X!ØôY016632#4&#"# 4±y°¸x‹€~Ÿ#x:½dm×äým’ºš…ný :[ÿëN 8°EX°/± >Y°EX° /± >Y±° +X!ØôY°±° +X!ØôY01432#"5332554#"[ØÙþûØÚþúx¾ª§¿À¨¨¾-ï2þÎï!ðþÏ1ð¼ÿ¼!¹þþ¹�þ`Nc°EX° /± >Y°EX°/± >Y°EX°/± >Y°EX°/±>Y²9² 9°±° +X!ØôY°±° +X!ØôY01#"&'#36632#4#"3265ÜÁr«6xe6«tÃÜx¤žy—&)›t�£ÿóþßVPýÏÚ¨ZbþÉþýÎs\ýøYfìÃoþ`ÎN`°EX°/± >Y°EX°/± >Y°EX° /± >Y°EX°/±>Y²9² 9±° +X!ØôY°±° +X!ØôY013273##"533267&&#"oÛÄo§6 hw7¦nÂÛx�žp™,)—sžŸ7]VŸú&.OT!óÄëeWYqþûÏž N@°EX°/± >Y°EX° /± >Y°EX°/±>Y° ±° +X!ØôY² 901'"#36632�Yq‘xi/žm+Óoý:´ dphÿë�N'l°EX° /± >Y°EX°/±>Y² 9° °в]² ]° ±° +X!ØôY°±° +X!ØôY°°"в"]°±%° +X!ØôY014&'&&54632#4&#"#"&773326&}£Â¹Ñ¬·Öo—€ƒƒq©ÁÀÛ´Åán±x‚–Lr$*Š~|«µˆY„qLKb%+•€‡§¼‚ujr&ÿëqO^°EX°/± >Y°EX°/± >Y°EX°/±>Y°°° +XØÜY°±° +X!ØôY°±° +X!ØôY°°аÐ013#3267#"&5#53ZîîM@7$V+r»»Oþëbý?jYY �œÁbšÿë×:J°EX°/± >Y°EX°/± >Y°EX°/±>Y°EX°/±>Y²9± ° +X!ØôY01%#"&5332673#c4°x«Âx‡|ˆ¢ xj±_gèôsý‹Æ¬zkûÆ,Ã: -°EX°/± >Y°EX°/± >Y°EX°/±>Y°Ð01373#3Ò#&&|þe`þd|+ûÆ:AÄ:S°EX°/± >Y°EX° /± >Y°EX°/± >Y°EX° /± >Y°EX°/±>Y° °аа°Ð01373373#'##3‡)3ægæ4-Å|þÅfð/0ìgþÆ|_ÁÁÛý%ÆÆÛûÆä»»ý:2´: S°EX°/± >Y°EX° /± >Y°EX°/±>Y°EX°/±>Y² 9² 9²9² 9013##3ò%Žþ‘~ŒþÌþÌŽþ‘�€ºýíýÙÍþ3'#þKÊ:=°EX°/± >Y°EX°/± >Y°EX°/± >Y²9±° +X!ØôY0133#"&'7326773Ñ&G†þ**†�< 5 N^!9þ^…%�–ûnš doW’,Z­: F°EX°/± >Y°EX°/±>Y±° +X!ØôY²9°±° +X!ØôY² 9017!!5!5!î¿ü­ŒýˆeeX{gYDþlš=&°/°/²9°/±° +X!ØôY²901&&554�}·›qvvq›·u[]][w€þl7íªâz‰h†{ä«ï7O)Ê�än¢%'£mâ�Å*²þò°°/°EX°/±>Y01#3eeþò¾ þl_=&°/°/²9°/±° +X!ØôY²9016655467&&554&'73" x^cc^u¶œpwwp›·þ¼*Å�âp¢$#¢qä�É)O7ï«äz‡h‰zâªí7�§é2² +°±° +X!ØôY° а /° ±° +X!ØôY°а/01#"&'&&#"'46323265é¢yX‘X@m8Oiaž{W“Y?k9Mlä�¼GO65ydƒ¶JL93€b‘þŠ:*°/°EX°/± >Y²9°/°°° +XØÜY01#3#53xx ŽŽþŠÒ&¸zÿ æ&#j°EX°/± >Y°EX° /± >Y±° +X!ØôY° °а °а ° ° +XØÜY°°а°° +XØÜY°°а±° +X!ØôY01%2653#5&554753#4&#"Hw¶kÔ•x¾ÍνxžËk¯®§¦Pˆy‰Âãä'Û*Ù'ÜÛÌ�‚›ù½*ÀøC0Å"q°EX°/±>Y°EX°/±>Y±° +X!ØôY°в!9°!/²/!]²_!]´!�!]±"° +X!ØôY° а!°а°а±° +X!ØôY01!!53665'#534632#4&#"!‰3.üS FFÏË Ô²»¼p‰x}‘ ‚°kÂ@eeæx°f(ÌéÏ®”‰°ŸþØfmÿå_ñ#/&²+°±'° +X!ØôY°±-° +X!ØôY01%#"&''7&&5467'7663273254#"kPÉnoÉO›UŸ<@E@¨U§NÂkjÂOªV«>D@:£VûøÈÆþåÆÈþå…JOOIžV¡QÄnpÌR«WªCIKC­X¯RÉolÄP¤W{×þÒ.×Õ-þÓ-’°r°EX°/±>Y°EX°/±>Y°EX° /± >Y²+² 9´]°°а±° +X!ØôY°в ]°°а±° +X!ØôY° Ð013!!!!#!5!5!5!3_¨‹þ9sþ[¥þ[wþ` þ`rþ9‹ÝÓýf¯fþºFf¯fïŸþò°°/°EX°/±>Y²+013#3ŸxxxþòüýÈögþ_Å3E‰° /°EX°#/±#>Y² #9¶&6F]°±=° +X!ØôY²=9° °а ±° +X!ØôY²1# 9¶)191I1]°1±4° +X!ØôY²419°#°(а#±+° +X!ØôY01#"$?32654&'&&5467&&54$32#4&#"%&&'6654&_zn^^ÿÖÕþÞp➣¹š×óêujZX×Þùp¼¥­²”á÷âýõ(Gpržô">s�ª¯b�!2�k¦¾ÍÜ­ž�ojx==±§bŽ"1�i¡ÄßÊ�¼Žnrv?A§…  vVtvD  uTl}¢%°7°/°/°/°а°° +XØÜY@ �Ÿ¯]@ O_oq°Ð01#53#53%­­þ+®®���kÿëöÄ)5u°EX°-/±->Y°EX°3/±3>Y±!° +X!ØôY°-±'° +X!ØôY²!'9°/² '!9° /² 9±° +X!ØôY°±° +X!ØôY² 901#"&554632#4&#"3265%! ! ! ! Y¥“—¶¶—“¦[njn|{oklüÂmoþ’þþþüþ“Už('žþaþÚþØþbT–žÕ®w¬×ž•qn§�x„¥lt…þéþ�þ�þë;°þPþÅþÄþN²‡´øÅ +x°EX°/±>Y²,9°/² ]°Ð°/²9² 9° /¶l | Œ ]²L q°±° +X!ØôY² 9°±!° +X!ØôY° ±&° +X!ØôY01&&'#"&5463354&#"''&632%2675#"‰ %{Sw‚ž–¶RO\ec¤‡{“ þœFƒµ`iOÂ75Ezjit=U]KG b‚�…þÆ0Y,QL/“M8BGÿÿ{¢@«&ttD|‚¨°/±° +X!ØôY°° +XØÜY01#!5!¨xýL,‚jfÿëòÄ 2;аEX°/±>Y°EX° /± >Y±° +X!ØôY°±° +X!ØôY² 9°/² 9°/´]²9°/² ]±3° +X!ØôY²"39°°+а±;° +X!ØôY01! ! ! ! #!2#&&554&#'32654&##fž('ŸþaþÙþØþbUnnþ’þþþýþ’Ïb“žIDD< f LY¼µOk\s Ù;°þPþÅþÄþN²<þéþ�þ�þ²þœR~zDcjK8(BQ*6TJ[QHUJjO°°/°° +XØÜY01!5!ýbžOa�ÔvÅ 5°EX°/±>Y°° +XØÜY± ° +X!ØôY°±° +X!ØôY014632#"&732654&#"��ec�Žde�ZYBAWWABYËf””fh��gDXXDD[\U0ó :°/° /°±° +X!ØôY° ±° +X!ØôY²9°°а° Ð01!!#!5!3!5!aˆþxnþbžn£ü½C=eþI·e¶û=fÿÿv›¯ÇË›°EX°/±>Y01ÿÿs�ÅÆÌš°EX°(/±(>Y01t¼ÙÆ(°/°/²]°° +XØÜY´Ÿ¯]¶/]013#C“ùlÆþü¢þ`Ó:^°EX°/± >Y°EX°/± >Y°EX°/± >Y°EX° /± >Y°EX°/±>Y±° +X!ØôY² 9²90132673#'#"&'#Žy‰–xg 0œmXŠ-w:ý‡Ï¢woûÆ›U[Y°EX°/±>Y²901!#"5433¨jéþýéâÑÏúP¦pA$°/°° +XØÜY01#53A››p´bþMš?°EX°/±>Y°° +XØÜY°° +XØÜY±° +X!ØôY°±° +X!ØôY013#'2654&'7ö Oaž“Z{Sh@ OS[mN=;9-ÿÿW™XÅÊÿÿ™°EX°/±>Y01‡´Å :°EX°/±>Y² 9° /² ]±° +X!ØôY°±° +X!ØôY014632#"&53326554&#"‡¯””°¯“•°lmlgophhov”»»”t•¹¹•k„…jth††hÿÿ‚¢M«&uuXÿÿ ºÄ'ÊH˜'vͯ°EX°/±>Y01ÿÿ ÉÄ'v'ÊH˜Ë°EX° /± >Y01ÿÿŒ‹Ç'v×'̛̀°EX°Y01lþve;M°/°EX°/± >Y²9°/²9°± ° +X!ØôY°° в9°°° +XØÜY0132673#"&54676653#<+\mb‡u�pÖ¥´Ê„{=‹‹¦ƒhTq—r€Œ‰u¥¾Ê¬…Ñs4]`•›°¦°EX°/±>Y°EX°/±>Y°EX°/±>Y²9°/²ïq¶/?q°±° +X!ØôY² 9° /²/ ]± ° +X!ØôY°±° +X!ØôY°±° +X!ØôY°°вq²=q´ËÛ]²+q01!!!#!!!!!!'üÏý«å’q`ýJMý·¾ú¬#…þ{°fýßfý¢‘G,]ïÆY ² +² 9² 9017]fþ©OVWOþ©fOþšþ›>m^Pþ¢^Pþ¢þ“Olþ”|ÿ¬æá%1T°EX°/±>Y°EX°/±>Y±.° +X!ØôY°±"° +X!ØôY²."9²".9²*".9²+."901!"&'#7&&55!273&&#"!4&'#325æþËþü\ŸA`hƒVZ0m¹I`hˆCHü;8s:›_Ðè{+'ý“3ƒMÕíaþæþ¤/-›ÔT÷–í^B>œÞTß‚ívÁ@ý9=þàìa§=ü()ï·H° O°EX°/±>Y°EX° /± >Y² 9°/² 9° /°± ° +X!ØôY° ±° +X!ØôY01!2#!#!2654&#/DÝøøÝþ¼xxD­°°­°þÐç·¹åþ¼°þkýޏ‚¹—ÿëHè'I°/°EX°/±>Y°EX°/±>Y² 9±° +X!ØôY²9°±$° +X!ØôY01!#4632#"&'73265454654&#"xÍ«Œ¸{pÜœVµ'")“F}‘þ�~xMy‘:ÌâŸ�mÕNVþä‘™£/!e1x_c‡]ÙR\s«žMÿëzN.9B¶°EX°/± >Y°EX°/± >Y°EX°/±>Y°EX°/±>Y²9² 9° /²/ ]´ 0 q²ð ]°±° +X!ØôY² 9²9²#9°#/°±(° +X!ØôY°/а ±3° +X!ØôY°°:а#±?° +X!ØôY01"&'#"&5463!54&#"''&6326632!3267%267!""!54&ñŠÎ<1ÝŸª¹âÕ~|‡�nߺ|±(=¿rÈßý³¶g�@/<±üJf¿$þü›¦‚ŒŠ¬ q›ofW~©‘žµX†’†e еlgcpøØd¿îA6W7Ndk> Žiaq™Ëœ’»cÿë-í 0y°/°EX°/±>Y² 9° /² 9´,<]²9²9²9²9² 9²9°°а ±'° +X!ØôY°±-° +X!ØôY01#"54327&&''%&&'7%4&5&&#"3265Y°EX°/±>Y±.° +X!ØôY°±"° +X!ØôY²."9²".9²)".9²+."90143273#"&'#7&&533&&#"!4&'#325[ØY°EX°/± >Y°EX°/± >Y°EX°/±>Y²9² 9°±° +X!ØôY°±° +X!ØôY01#"&'#36632#4#"3265 ÜÁr«6xx6©rÃÜx¤žy—&)›t�£ÿóþßVPýϸý€W_þÉþýÎs\ýøYfìÃh°q°EX°/±>Y°EX°/±>Y²9°/´]°Ð°±° +X!ØôY°а°в9°/±° +X!ØôY°° а° а°Ð013##!##533!3!5!Ò––wüÄw��wY°EX°/±>Y01!#3 xx:¢:`°EX°/± >Y°EX°/± >Y°EX°/±>Y°EX°/±>Y²9°/´_o]²/]±° +X!ØôY² 901##333#¤‰yy†»‹þ$�ðþ:þ àýøýÙû° ]°EX° /± >Y°EX°/±>Y² 9°/°Ð°±° +X!ØôY°а±° +X!ØôY°°а а° а Ð01%!!573+9þÇÐü¸œœx/dmdý£eœ1m1§ù K°EX° /± >Y°EX°/±>Y² 9°/°Ð°±° +X!ØôY°ааа° аÐ017#573G²²w¶¶w\FmFýÁGmGê¶þKç°\°EX°/±>Y°EX°/±>Y°EX°/±>Y°EX°/±>Y°EX°/± >Y± ° +X!ØôY°°а°Ð01#"&'732655#37ç¡�4>WbüÄxx<°ù÷§µ c ‚tYÝû$°û"Ý�þKÕNY°EX°/± >Y°EX°/± >Y°EX°/±>Y°EX° /± >Y²9±° +X!ØôY°±° +X!ØôY016632#"&'732654&#"# 5¯w°¸¡�": EX`‹€}œ$x:¸ak×äý§µ g }t뺚ygüú:lÿë Å%ްEX° /± >Y°EX°/±>Y°EX°/±>Y°EX°/±>Y°±° +X!ØôY²9°/²/]±° +X!ØôY°±° +X!ØôY°±° +X!ØôY° ±° +X!ØôY01!!#"32!!!!!267&&#" ü�a�IïþÕ)ïKšT^üâ½ýC#ûfBƒ;<‚DÀàã L 0M fýÝfý¤ðþøåþÎäþõ^ÿëN"09‚°EX°/± >Y°EX° /± >Y°EX°/±>Y°EX°/±>Y²9²  9° /°±° +X!ØôY²9°&а±-° +X!ØôY°1а ±6° +X!ØôY014326632!3267#"&'#"5332554#""!54&^Ø’Û;;ÖÇäýžp�84=»�‹Û;:Ú�Úþúx¾ª§¾¿¨¨¾ž…´y¥-ï2‘}“üÒf·ö>:R@K�~~�1ð¼ÿ¼!¹þþ¹»Ë™�¾§e-S°/°EX°/±>Y²ð]²pq²r´/?]²]´°Àq²0q² ]²`]°± ° +X!ØôY0134632&&#"§£“!D#0 blØ£² `pû(ÿÅþKª-#”°/°EX°/± >Y°EX°"/±" >Y°EX°/± >Y°"±° +X!ØôY°± ° +X!ØôY°°авpq²`]²ð]²]´/?]² ]²0q´°Àq²r°±° +X!ØôY01##"&'73265#5354632&&#"3Xô¡�2<Wa´´£“!D#2"bhôØûϧµ c �u1bž£² c|pž‹ÿëüZ%T°/°EX° /± >Y°EX°/±>Y²  9° /±° +X!ØôY° ±° +X!ØôY°±"° +X!ØôY01! 5!26653'4#"325õþËþüÿþÏ0‰ÝL‰Žx°¡$&wïÔÐèéÐÕíaþæþ¤\í^h^ ³Ÿ¾äH«^ì þàìïîþàï[ÿëÙØ%T° /°EX°/± >Y°EX°/±>Y²9°/± ° +X!ØôY°±° +X!ØôY°±"° +X!ØôY014326653#"5332554#"[Øg­?mppŽ…(*þûØÚþúx¾ª§¿À¨¨¾-ï2KD ‘}–¹D¤\!ðþÏ1ð¼ÿ¼!¹þþ¹§ÿë36R°/°EX°/±>Y°EX°/±>Y°EX°/±>Y²9°/± ° +X!ØôY°±° +X!ØôY016653#"$533265¹{ƒqĶþÝêçþâxܱ´â°Î±—Àäý]îüýíÛü%ºËʻۚÿëü»f°/°EX°/± >Y°EX°/± >Y°EX°/±>Y°EX° /± >Y² 9°/±° +X!ØôY² 9° ±° +X!ØôY01#'#"&5332673665÷”‘j 4°x«Âx‡|ˆ¢ x^\»˜¬üœ±_gèôsý‹Æ¬zk|‚uÿŒþK*:)°EX°/± >Y°EX°/± >Y± ° +X!ØôY01#"&'73265* Ž4 >W`:ûm§µ c ‚t“\ÿìÐN[°EX°/± >Y°EX°/±>Y² 9° /°±° +X!ØôY²9°±° +X!ØôY° ±° +X!ØôY012#"&55!54&#"'66267'!øË þô¼ÈäýÄ�q�73<º’ƒ´ý‡¥NþÔæ7éþÐúÓfµø?:S?LüÉš޽ äËÖ;°/°/°а°° +XØÜY´¿Ï]@ /?]²Oq°дFVq01#'#573Ëp§¦nãbö¨¨ÝˆäºÖ;°/°/°Ð´IYq°°° +XØÜY´¿Ï]@ /?]²Oq°Ð0173#'53¡¦séaèr-©áዮʰ°/± ° +X!ØôY01#"&7733265Äš……›^Za^]°pŒ�oM^`K�4°°/°° +XØÜY¶�Ÿ]01#534——¨«‰úÒ '° /°° +XØÜY°° +XØÜY° °° +XØÜY014632#"&732654&#"«cFDbaEGbN5&%33%&5,EaaEG\\G'43((56[þx¡%°/°° +XØÜY± ° +X!ØôY01!3267#"&5467[HL&3 1I1Lbf]<`86SYPGˆ5fïÿÝ#° /²+°° а° а°а °Ð01#"&#"'46323265ÿnRJš6/@PlSA¤5.BÉXtnF6VunH7†äî '² +°/°° +XØÜY¶/]°а° Ð013#'3#'ƒ‘þØq…õfîþüþü¸þœØÿ¤ =°/°° +XØÜY° ° +XØÜY@  0 @ P ` p € �   ]°а°Ð014632#"&732654&#"¸V<:TS;=UH+))+â9MM97KK7%$$$ý¾þü°/°° +XØÜY²]01#3þ_©~¾>ý ¿þ¤ý°/°° +XØÜY²]013#þ,x¬XýþÂÿÿü¯ïÿHÝ üIýmÒþšY*°/°° +XØÜY±° +X!ØôY²9²90156654Hý�ZMtUˆžbNÒ}*.1.M^OJK>ü5äþÅî '²+°/°а° ° +XØÜY¶  / ]°Ð01#73#73ýÐqþØ‘ýfõ…êþûýiþÅþÿm#°/°° +XØÜY°° +XØÜY¶p€�]01#53þ——þŨÀ§Q°/°° +XØÜY²]013#™ GQþ·£/› 6°/°а°° +XØÜY@ �Ÿ¯¿]°а° а /°а/01#53#5373#/ŸŸþ  �®zX˜˜˜ëÛÿÿ¦pA$v°/01»'°,°EX°/±>Y°EX°/±>Y°±° +X!ØôY01!#!'ý wlJú¶°-\°/°EX°/±>Y°EX°/±>Y±° +X!ØôY°°Ð01!!#VúÑhþ>ãþ°úP°úµ·|ÿëæÅ°EX°/±>Y°EX°/±>Y²9°/²_]´¯¿]²q²¯q²Oq´�]²/]´Ïßq±° +X!ØôY°±° +X!ØôY°±° +X!ØôY01!5!! 5! '4#"325ÆýÖ* þËþüÿþÏ06wïÔÐèéÐÕí¤e¨þæþ¤\í^þ¢þçì þàìïîþàïEã°0°EX°/±>Y°EX°/±>Y°EX°/±>Y°°Ð01##3#–þ2}r|úý°úPu ° _°EX°/±>Y°EX°/±>Y±° +X!ØôY²9°/²/]²_]´�]±° +X!ØôY°± ° +X!ØôY017!!!!!!u—üi`Îý2UrüŽeeff¿ê°9°EX°/±>Y°EX°/±>Y°EX°/±>Y°±° +X!ØôY01!#!#!êwüÃw+Jú¶°?.° >°EX°/±>Y°EX°/±>Y±° +X!ØôY°а± ° +X!ØôY°Ð01!!55!!¿þYüýü¸üìÞçýf]š\]fýÆY_°'[°EX°/±>Y°EX° /± >Y² 9°/°Ð² 9° /°а±° +X!ØôY°а ±%° +X!ØôY°Ð013 !##5# 54!35332654&##"33Eþ»þÿxþþþ½CxÕ÷øÔ}×÷öØôþÏçêþÏÁÁ/êè2¼þÞü˜óÃÀòóÁÄðh| °V°EX°/±>Y°EX°/±>Y°EX°/±>Y°EX° /± >Y² 9°/°Ð°± ° +X!ØôY° Ð016653#&5373ú³ÞxþÝìyéþäxدyË ìÂ0ýÐöþàþ¤] ô0ýÐÁë åx¼Å#J°EX°/±>Y°EX°/±>Y±° +X!ØôY°аа±° +X!ØôY°°!а°#Ð01%654#"!5!&5532!!í�»ã¿Àá¿“þ1+„¡(ðï+¡‚/þ1t1.wï"þÞïwþûþÒ0teZFÒu^þ¡þæuÑþ¹ZeoÿëzN*f°EX°/± >Y°EX°/± >Y°EX° /± >Y°EX°/±>Y° ±° +X!ØôY²9²9° а±'° +X!ØôY013267#"&'#"553273267&&#"Ò50 0P\ 5ªtÂÛÛÄr¨5ý|�žu˜+*˜tžŸ:üØhS] ]h_f!ó7kb¹ýÅÄë€q t“þûϱþqBÅ*b°/°EX°/±>Y°EX° /± >Y²* 9°*/±)° +X!ØôY²)*9² 9°±° +X!ØôY° ±"° +X!ØôY012#"&'#462654&#"32654&##5R¸ái^Š”øÊ`¹>xõ¨—�—‹~«-³n¡²¯œ�Åשe¥-'ÉŠÈáA@þ¶®ðýr�ƒp¥²†üÇIU¬”Œµf,þaÃ: 1°EX°/± >Y°EX°/± >Y°EX°/± >Y² 9013#337G|þqxþp|*#&:ûåþB¾üÕ[ÿë°*h°EX°/±>Y°EX°/± >Y°EX° /± >Y°±° +X!ØôY² 9² 9°а ±° +X!ØôY°±'° +X!ØôY01!#"554727&&'532554&'&&#"´ýî.KþûØÚþúùÏ -DÏt¾ª§¿‰SQ¨¾°d¬þmÛ!ðþÏ1ð!Ü' @’G]ü\¼ÿ¼!�Þ: þþ¹kÿîåK*w°EX° /± >Y°EX°(/±(>Y²( 9°/´oq´_o]²/]±° +X!ØôY²9° °а ±° +X!ØôY°(± ° +X!ØôY°(°#Ð01467&&54632#4&#"33#"32653#"&kroblãŵømµ„—˜‘š¹¹ŸŸª˜’¸nþ÷¶Åö)aƒ"N’Ÿ©†[urX\fdej`uƒaœ¦¨Iþp�°!B°/°EX°/±>Y°EX°/±>Y²9±° +X!ØôY°±° +X!ØôY01332'6654&##"&547'!5�þt}i��F‚‰”[->lLTP½ÅwŠSýD°Iþ›êzu‘ngb›#WhD8<Ï™t©¡fžþaÕNM°EX°/± >Y°EX°/± >Y°EX°/± >Y°EX°/±>Y²9°± ° +X!ØôY016632#4&#"# 4¯w±·x‹€|›%x:·`kÒéûÎ1ºœyfü÷:†ÿëÅ ‡°EX° /± >Y°EX°/±>Y² 9°/²_]´¯¿]²q´Ïßq²¯q²Oq´�]²/]²r° ±° +X!ØôY°±° +X!ØôY°±° +X!ØôY01#"32!54&#"!3265ïÕÔòðÔÕñüîš«£¢ªšýf¬¢¢ª5þæþÐ1E2þÎþçs‡àññàí~Þõôß¶ÿë<9)°EX°/± >Y°EX° /± >Y±° +X!ØôY013267#"&5.LE."G*{x9üÙjU Y�Ÿ"6ÿõLî!_° /°EX°/±>Y°EX°/±>Y² 9° ±° +X!ØôY°±° +X!ØôY² 9´ìü]@ ,<q013#'&&#"'66323267#"&'#»…�= UE *8w}&iM3  ,fw-ñ"¡_k_ šnü;Yie�z‡scþgâ°.k°EX°/±>Y°EX°/± >Y°EX° /± >Y°±° +X!ØôY² 9° /± ° +X!ØôY° ±° +X!ØôY²& 9°°-Ð01#"33#"332'6654&##"$5467&&5467#5�ë°°«¸ƒƒÉíá¾3Ž“”[->mRY7éþÒ¬œu�NJþ°fŽqnxg±°’¯tl_•!XaA>BãÆ™Î*%“]X‚)fQÿëË:N°EX°/± >Y°EX°/±>Y°EX° /± >Y°±° +X!ØôY°аа ±° +X!ØôY01#3267#"&5!##5!Z�LE."G*{xþx“ Óý?jU Y�Ÿ¼ü-Ógžþ`NO°EX°/± >Y°EX°/± >Y°EX°/±>Y²9°±° +X!ØôY°±° +X!ØôY01#"&'#3'432#4#"3265ÚÁpª8xõ½Ïäxž�žœ*šs�¡ÿóþßPKýÚ÷ êþËþûÏô þ¹XeëÄoþeÑN"N°EX°/± >Y°EX°/± >Y°EX°/±>Y°°а±° +X!ØôY°±° +X!ØôY012#4&#"'6654&'&554=°äk¢�¦°Ä½—�•[-?lYeíÿùN˲„™þ¸*²êfh_”"Wa@;; ã*é3[ÿëk:J°EX°/± >Y°EX°/±>Y°±° +X!ØôY°±° +X!ØôY°±° +X!ØôY01!#"5547!32554&##kþÇmyþùÖÚþúØ3üh¾ª§¿À¨¨½ÓEã�!âþÓ1ð!å'ýÒ¼ÿ¼!°öö¯MÉ:/°EX°/± >Y°EX°/±>Y°±° +X!ØôY°Ð01!#!5!Éþwxþ…|Ôü,Ôf›ÿëó:6°EX°/± >Y°EX° /± >Y°EX°/±>Y±° +X!ØôY01325&'3#"&¢‹¦–>5‚19ÑÝÊà:ý¤ÍÁ¿�ˆ}ÿ«øþÐõZqþ":!X°/°EX°/± >Y°EX°/± >Y°EX°/±>Y°EX° /± >Y±° +X!ØôY°а± ° +X!ØôY012#$546737665&ôæ4þïþ÷xþôÿKA‚FP¼ÑxÊÓå¶:þÄñÝþÎþ5Ë7ô£ôy‚þùˆ»þù Þü  þ«¹ @þU4E%q°EX°/± >Y°EX°/± >Y°EX°/± >Y°EX°/± >Y²9²9²9°± ° +X!ØôY²9°±° +X!ØôY012333267#"&'##&&#"'66šn{1‘-}þŒ×3;0  +\n>ªþ´•¾/HC - 7E�nþ±Bý5þiVgy�„ý�³eZcyþE :Y°EX°/± >Y°EX°/± >Y°EX°/± >Y°EX°/± >Y°EX°/±>Y±° +X!ØôY°а°Ð0165&&'3#&37ïÙÅJ@ƒ;Eþúþëwóþôxϲ9ü" Ç�û|sé›þýþ¼þX©,%éþó÷ Ý„ÿëY:(Z°EX°/± >Y°EX°/± >Y°EX°/±>Y°EX°"/±">Y±° +X!ØôY² "9° /°°в"90132653325&'3#"&'#"547˜HSŽ‘€˜y—���SH‚COËÅ�²()±€ÆÊND:ˆþï�ÁÿÁÍ$þÜÍÁÁ�‰}ÿ«ôþÌ�‚‚�4ô«{…ÿë�Å&Q°/°EX° /± >Y°EX°/±>Y±° +X!ØôY² 9°/±° +X!ØôY° ±#° +X!ØôY01%2655&$554632#"5774&#"y¾ÓÞþñ«‡Ž¤þäìáþíxÌÌĬ_\VdSòà$ûÀ>¬ÏʱýÛþöþÐ<þ¿ý?Ôþ·�¾‘‡‹Šˆÿ×y»#C°EX°/±>Y°EX°/±>Y°EX°/±>Y°± ° +X!ØôY°в!9016632&&#"#&&#"'663237 3zV6 "0O%þçxþä'N/ 5Uz4¾$$×|h ^ :Uý”ý©YjU: ^ h|þVpp8ÿë%:,b°EX°/± >Y°EX°/±>Y°EX° /± >Y°±° +X!ØôY°ав 9°±*° +X!ØôY°!в% 9°%/01##"&'#"5467#5!&&'!3265332%¦)/¸²y§'(¥x³·.*—íÅ5.üW/5|}wŒyŒy{}ÓaÙ†óþË~~5ó…Ùbgý×tßooàsÁÿÁÍ þóÍÁ6ÿ÷ž°d°EX°/±>Y°EX°/±>Y°EX° /± >Y°±° +X!ØôY°в9°/° ± ° +X!ØôY°±° +X!ØôY01!6632/265&&#"#!5!˜ýÉZ®Cè óä±µɱL«TxþMbJýä(çç¹÷Z¾“³±'ý;JfŒÿì´Æ!}°EX° /± >Y°EX°/±>Y° °а ±° +X!ØôY² 9°/²Oq²_]´�]²/]²q²¯q±° +X!ØôY°±° +X!ØôY°°!Ð01#"532#&&#"!!3267²þîæóþÖ*óèpɸ¿ç_ý¡ç¿¸ÊÈÛû_íaößµÀþØç=eMêþÙ¼»4/°p°EX°/±>Y°EX°/±>Y°EX° /± >Y² 9°/°± ° +X!ØôY°±° +X!ØôY°±° +X!ØôY° ±° +X!ØôY01!2#!!##532!2654&#âmåûüäþýÎÀ÷)%¯”m´µ¶³°ýžê½½êJýÓþKþ˜e(�“ý9ý|ºŠ…»¼4°€°EX°/±>Y°EX°/±>Y²9°/²_]´�]²/]²Oq°°а° в 9°/°±° +X!ØôY°±° +X!ØôY° ±° +X!ØôY01!3!2#!!#3!2654&#3=wmæúûåþüÃww´m´µµ´Ÿýˆâ¸¹å¬ýT°ý"ý˜°†�±7İR°EX°/±>Y°EX°/±>Y°EX° /± >Y°±° +X!ØôY°в9°/±° +X!ØôY01!6632#4&#"#!5!™ýÏ\µgïõx³¹a¹^xþGbJýÞÓìþc�¹ ý>Jf¼þŸç° S°EX°/±>Y°EX°/±>Y°EX°/±>Y°EX° /± >Y±° +X!ØôY°а ° ° +XØÜY013!3!#!¼w=wþ,xþ!°úµKúPþŸa³x° Q°EX° /± >Y°EX° /± >Y° ±° +X!ØôY² 9°/± ° +X!ØôY° ±° +X!ØôY01!!2#!!!2654&#ý lçúûæþlý lµ³³µJýìÞ»¼á°ý ý•±‰ƒ®HþŸˆ°Q°EX° /± >Y°EX°/±>Y°° +XØÜY°а±° +X!ØôY°а° а ±° +X!ØôY01#!#36!3!!oû¯j bS¢#œüŸ‡]@ýÈþŸaþŸÆVŒ] úµ?þãþSuåî°‡°EX° /± >Y°EX° /± >Y°EX°/±>Y°EX°/±>Y°EX°/±>Y°EX°/±>Y² 9°/²/]²_]±° +X!ØôY°в9°°а° Ð01####33333#d¤w©þ˜þ �˱w­Ë�þ˜·ýI·ýIðÀým“ým“ý@ý\ÿëcÅ*w°EX°(/±(>Y°EX° /± >Y² (9°/¶O_oq²_]²/]±° +X!ØôY²9° °а ±° +X!ØôY°(± ° +X!ØôY°(°#Ð01#"$77332654&##532654&#"#'&$32LŠ{Œ�þÜéÍþÓoÙ«¿ÖÊǯ¯Â¹Á¾›ÔoÌé 1m¯+'²†ÃÝØËŒ¸¨�›‘g”‡†¤¨„°ÜÒ¿ï° C°EX°/±>Y°EX°/±>Y°EX°/±>Y°EX°/±>Y°°а° Ð013#'#3xwwüÄww°úPÝû"°û$)â°H°EX°/±>Y°EX°/±>Y°EX°/±>Y°±° +X!ØôY°± ° +X!ØôY01#!##532âxýŽ«Ú)%•} °úPJýÓþLþ—e(�“9ÿë˰=°EX°/±>Y°EX°/±>Y°EX°/±>Y²9±° +X!ØôY0133#"&'7326773Z? ŒýÓ<’’< 5Vf/5ýÙ‰”“¯ûH|‘ae^k2MÿĪì'M° /°/² 9°/°а/² 9° /°а/° ±%° +X!ØôY°а±° +X!ØôY°Ð013 !##5# 54!3533254##"337Pþ°þøyþöþ³N yÝþÿݰßþÿàþ¹ùúþ·ÕÕGúùIÐþËüHÕÓþöÓÕþú¸¶þ¡n° B°EX°/±>Y°EX° /± >Y±° +X!ØôY°°а°а ° ° +XØÜY013!5333#!¶w;w� mû¾°úµIú·þ:_­—°@°EX° /± >Y°EX°/±>Y°EX°/±>Y² 9°/±° +X!ØôY01##"&533267—xe¾lðóx²¹fÅd°úP˜Òí“þmºŸ²¸°° F°EX°/±>Y°EX°/±>Y°EX°/±>Y°EX° /± >Y±° +X!ØôY°Ð01!3!3!0IxGxú°úµKúµKúP°¸þ¡=°V°EX°/±>Y°EX°/±>Y°EX°/±>Y°EX°/±>Y±° +X!ØôY°а а° ° +XØÜY01!3!33#!0IxGx� nùò°úµKúµKú¶þ;_°ÿö¤° T°EX°/±>Y°EX° /± >Y² 9°/°± ° +X!ØôY°± ° +X!ØôY° ±° +X!ØôY01!!2#!!!2654&# alçúûæþþalµ³³µ°ý†Þ»¼áJý†ý•±‰ƒ®»î° \°EX° /± >Y°EX°/±>Y°EX°/±>Y°EX°/±>Y² 9°/± ° +X!ØôY°± ° +X!ØôY01!2#!3!2654&##33lçúûæþxlµ³³µOxx6Þ»¼á°ý ý•±‰ƒ®ý0°³x° B°EX° /± >Y°EX°/±>Y² 9°/± ° +X!ØôY°± ° +X!ØôY01!2#!3!2654&#+lçúûæþxlµ³³µ6Þ»¼á°ý ý•±‰ƒ®¡ÿìÉÆ!_°EX°/±>Y°EX° /± >Y°а ±° +X!ØôY² 9°/²/]±° +X!ØôY°±° +X!ØôY°°!Ð01'&32#"$7733255!5!54#"¨ ëò+þÕòîþãpÖ¾¾èýœdè¾¾ÖéÕþŸþêíþéþ¡øÜ±Ä&éaf(é(Á¶×ÿëÈÅ#œ°EX° /± >Y°EX°/±>Y°EX° /± >Y°EX°/±>Y² 9° /²_ ]´¯ ¿ ]² q² q²O q²ß ]´ � ]²/ ]²¯ q±° +X!ØôY°±° +X!ØôY°± ° +X!ØôY01! 5!#3!5! '4#"325ÈþËþüÿþÏþñxx06wïÔÐèéÐÕíaþæþ¤\7ýh°ýMQ^þ¢þçì þàìïîþàïa?° V°EX°/±>Y°EX°/±>Y°EX° /± >Y² 9° /±° +X!ØôY² 9°±° +X!ØôY013#&&54$3!#!!"3!â�Z�–ç¼xþZ¦þ¼·¿´ fw/ÆŽÐæúPS÷±��²aÿë*N°EX°/±>Y°EX°/±>Y²9°/²]²9±° +X!ØôY°±$° +X!ØôY012#"557665366"326554&PÑýþúØÙþúá—}^¯±›Õ:Ãc¨½¾©¨¾¿òþðÔ!ãþá â�9~$LIˆqàÀO`eàŸ!¯îî¯!¡Þ© : U°EX°/± >Y°EX°/±>Y±° +X!ØôY²9°/±° +X!ØôY²9°±° +X!ØôY013!2#!2654&#%!6654&#!©�Êàe[j�×¹þ¥[†“•„þ¥/Š�›˜þê:‘�S~�]“™òþrhbZjda]a]£>:,°EX°/± >Y°EX°/±>Y°±° +X!ØôY01!#!>ýÝx›Óü-:5þÂK:Q°EX°/± >Y°EX° /± >Y±° +X!ØôY°Ð°°а ° ° +XØÜY° а±° +X!ØôY017667!3#!#!!ƒVf p nüÓi Œ `KVþkelíõ‡ü+þ]>þ£NÔþâ\eü:‰°EX° /± >Y°EX°/± >Y°EX°/± >Y°EX°/±>Y°EX°/±>Y°EX°/±>Y²9°/²/]´_o]±° +X!ØôY°в9°° а° Ð01####'33333#×�x�þp‘Àþn‘c‘x’c“þlÁ’ôþ ôþ , þ%Ûþ%ÛýöýÕdÿî¢K*a°EX°(/±( >Y°EX° /± >Y±° +X!ØôY²(9°/±° +X!ØôY²9° °а(± ° +X!ØôY°(°#Ð01#"&77332654&##532654&#"#'&632ŽbZgi㺨ùoª�Œ˜�“¥¥Ž†‹u¥nꦹÐO~"‚b”§§›`„takbhc]ZpvZ…ªž¤Û: C°EX°/± >Y°EX°/± >Y°EX°/±>Y°EX°/±>Y°°а° Ð013#'#3cxxý¾ww:ûÆsü‹:ü�£:n°EX°/± >Y°EX°/± >Y°EX°/±>Y°EX°/±>Y²9°/´_o]´oq²/]´�Ÿr±° +X!ØôY² 901##333#¦yy¤��þIè—ðþ:þ àýøýØ*Ü:H°EX°/± >Y°EX°/±>Y°EX°/±>Y°±° +X!ØôY°± ° +X!ØôY01#!##7726Üxþ6•°+%nc:ûÆÓþ‰þÂþâkÝÞ©5:S°EX°/± >Y°EX°/± >Y°EX°/±>Y°EX°/±>Y°EX° /± >Y°°Ð°°а Ð01%33#'##3ð«”xþfUþ^w�¨’ûÆjü•ü‚:¤Û: n°EX°/± >Y°EX° /± >Y°EX°/±>Y°EX°/±>Y²9°/´_o]´¯¿q´oq²/]´�Ÿr±° +X!ØôY01!#!#3!3Ûxý¹xxGxðþ:þå¤Û:9°EX°/± >Y°EX°/±>Y°EX°/±>Y°±° +X!ØôY01!#!#!Ûxý¹x7Óü-:0­:/°EX°/± >Y°EX°/±>Y°±° +X!ØôY°Ð01!#!5!­þvwþ„}Ôü,Ôfoþ`]-;x°EX°/±>Y°EX°/± >Y°EX° /± >Y°EX°/± >Y°EX°/±>Y°EX°/±>Y° ±#° +X!ØôY°±*° +X!ØôY°1а#°8Ð013236632#"&'##"5%4#"3265!3267&&#"o̺5Z#w#\9¹Î͸9]$w%Y6¸Ìw—“7NO5“•ü�“2NL4”‘6ùþþÊþüóþßþF¹!óÏü»ëÄÅêFþüФþ¿I: F°EX°/± >Y°EX°/± >Y°EX° /± >Y±° +X!ØôY°а ° ° +XØÜY013!33#!¤xGxn nüÒ:ü+Õü+þZAnž:@°EX°/± >Y°EX° /± >Y°EX°/±>Y² 9°/±° +X!ØôY01!##"&5336673žxE’DÑÌw‹›H”?xÇ»Üþ¤Ê: ;°EX°/± >Y°EX° /± >Y±° +X!ØôY°°а°а°Ð01!3!3!áxÝxúÚ:ü+Õü+ÕûÆ:Ÿþ¿G:V°EX°/± >Y°EX°/± >Y°EX°/± >Y°EX°/±>Y±° +X!ØôY°а а° ° +XØÜY01!3!33#!áxÝx‚ núÏ:ü+Õü+Õü,þYA:#µ: T°EX°/± >Y°EX° /± >Y² 9°/°± ° +X!ØôY°± ° +X!ØôY° ±° +X!ØôY01!!2#!!!2654&##Ð6»ÑÑ»þSþ§Ð6‹‰ŠŠ:þw¿˜™ÁÔþwþ‹hd�©Q: \°EX° /± >Y°EX°/± >Y°EX°/±>Y°EX°/±>Y² 9°/± ° +X!ØôY°± ° +X!ØôY01!2#!3!2654&##3 6»ÑÑ»þSw6‹‰ŠŠûxx±¿˜™Á:þþ‹hd�ýµ:©â: B°EX° /± >Y°EX°/±>Y² 9°/± ° +X!ØôY°± ° +X!ØôY01!2#!3!2654&# 6»ÑÑ»þSw6‹‰ŠŠ±¿˜™Á:þþ‹hd�pÿëÓN!]°EX°/± >Y°EX°/±>Y°±° +X!ØôY°°а°а±° +X!ØôY²9°/±° +X!ØôY01"#'&632#"&7733267'!5!7&&t®ló¢ÔúùÔ®èl§| ­þâ­èˆx•ËþÎê*ëþÎѬ„šì¯eªä©ÿëN!h°EX°/± >Y°EX°/± >Y°EX°/±>Y°EX° /± >Y±° +X!ØôY²9°/±° +X!ØôY°±° +X!ØôY01!632#"'!#332554#"!6 ÐÙþûØÑþü þÊxx­¾ª§¿À¨¨¾MâþÎï!ðþÏãþ:ýÒ¼ÿ¼!¹þþ¹]±: V°EX°/± >Y°EX°/±>Y°EX°/±>Y²9°/±° +X!ØôY²9°±° +X!ØôY01#!#&&54633!!"±xþ°þø„pzÍ·þôvvRþΆ†:ûÆ´þLäs޵þ»\º�ÿåþKÚ'ˆ°EX°$/±$>Y°EX°/± >Y°EX°/±>Y°EX° /± >Y²'$9°'/²']²O'q±° +X!ØôY²9° ±° +X!ØôY°±° +X!ØôY°° а'°"Ð01!6632#"&'732654&#"##5353!IþÍ6´x«· �!;EWa‹z{¥'x¹¹x3Óþ®alÔßý §µ b �uö°™�kýÓfßßnÿëÚN!Z°EX°/± >Y°EX°/±>Y±° +X!ØôY°°а°а±° +X!ØôY²9°/±° +X!ØôY01%2653#"55432#4&#"!!Y°EX°/±>Y°EX°/±>Y²9°/°± ° +X!ØôY°±° +X!ØôY°±° +X!ØôY°°Ð01!2#!!##7326!2654&#Ê6»ÑÒºþRþG˜²+&ng©6ŠŠŠŠ:þO´��¶Óþ‰þÃþágãÞýêþ@„`\€¤œ:e°EX°/± >Y°EX°/± >Y°EX°/±>Y°EX° /± >Y² 9°/°а±° +X!ØôY° а ±° +X!ØôY01!3!2#!!#3!2654&#Gx6ºÑѺþRý¹xx¿6Љ‰ŠŒ®þO´��¶'ýÙ:ýêþ@„`\€ÿðÚy°EX°/±>Y°EX°/± >Y°EX° /± >Y°EX°/±>Y²9°/²]²Oq±° +X!ØôY²9°±° +X!ØôY°°а°Ð01!6632#4&#"##5353!TþÂ6´x«·x‹z{¥'x®®x>ßþ¢alÔßýe�°™�kýßfÓÓ¤þŸÛ: S°EX°/± >Y°EX°/± >Y°EX°/±>Y°EX° /± >Y±° +X!ØôY°а °° +XØÜY01!3!#!Gxþ¤xþ�:ü+ÕûÆþŸa:¬ÿëi° Z°EX°/±>Y°EX°/±>Y°EX°/±>Y°EX°/±>Y°EX° /± >Y² 9±° +X!ØôY°Ð01#"&'#"&53326533265iÛ±v±,.µw¯Õx”xž{˜}{™°ûëÓÝkiikÝÓû러¬Ÿû러¬Ÿ�ÿëã: Z°EX°/± >Y°EX°/± >Y°EX°/± >Y°EX°/±>Y°EX° /± >Y² 9±° +X!ØôY°Ð01#"&'#"&53326533265ãˤj¢),¤k¢Åw„lrŽx‰on‰:ýDÅÎ_^^_ÎżýD‘��‘¼ýD‘��‘¼ÿãát°EX°/±>Y°EX° /± >Y°EX°/±>Y°EX° /± >Y°±° +X!ØôY² 9°/°° а±° +X!ØôY° ±° +X!ØôY01!!2#!#533!!2654&#eþ»5»ÑÑ»þSÅÅxEþ»5‹‰ŠŠ:þ‰Äœ�Æ:ezþ†ý¾þ�lh”ØÿìÆ)€°EX°)/±)>Y°EX°/±>Y°EX°&/±&>Y°EX° /± >Y±° +X!ØôY²9°/°а° а± ° +X!ØôY°±° +X!ØôY° °а°$Ð01!532#&&#"!!32673#"5!#3P*óèpɸ¿çýî翸ÊpþîæóþÖþùxx-"aößµÀþØç$feêþÙ¼»Ûû_eý9°¦ÿë„N'€°EX°&/±& >Y°EX°/± >Y°EX°$/±$>Y°EX°/±>Y±° +X!ØôY²9°/°Ð°° а± ° +X!ØôY°±° +X!ØôY°°а°"Ð013632#4&#"!!32653#"'##3û ðÒ²ík¯¥¦Ïþ0§«w¶jú¤ØñúxxYÝÒ«‚›àªe´ëˆy–Ê"çþ :&Á° Y°EX°/±>Y°EX°/±>Y°EX°/±>Y°EX° /± >Y²9°/°а± ° +X!ØôY°°Ð01####3#!#›òwä¬|q|ý/üÛþ%Ûþ%°úPEÀ : V°EX°/± >Y°EX°/±>Y°EX°/±>Y°EX° /± >Y²9°/°б ° +X!ØôY°°Ð01####3#!'#ü«x²’|ÄiÅ|ýÃ~˜$%[þ¥[þ¥:ûÆÁhxxêÒ°|°EX°/±>Y°EX°/±>Y°EX°/±>Y°EX°/±>Y°EX° /± >Y°EX°/±>Y²9°/±° +X!ØôY°Ð°° а°а°Ð01!3#####!#3!#bªBq|ªòwä¬|®þ}xx#üEkúPÛþ%Ûþ%Ûþ%°ü•ÀÉÊ:|°EX°/± >Y°EX°/± >Y°EX°/±>Y°EX° /± >Y°EX° /± >Y°EX°/±>Y² 9° /±° +X!ØôY°а °а °а°Ð01!3#####!#3!'#AR iÅ|“«x²’|‘þØxxÐ~˜$%ÁyûÆ[þ¥[þ¥[þ¥:ý‡hxxžæ°!k°EX°/±>Y°EX°/±>Y°EX° /± >Y°EX°/±>Y² 9° /°а ±° +X!ØôY°а °а± ° +X!ØôY0134633!32#4&###'#"3!žãÙeþPlþO`Ùãxšª¡ x¦ª™$cý(|Ò¾¤ý\½Óþ„|¥…ýj› †¤þ„ >ž: k°EX°/± >Y°EX°/±>Y°EX° /± >Y°EX°/±>Y²9°/°а±° +X!ØôY°а°а±° +X!ØôY01354633!#54&###'#"3!žÚÑþºœþºÏÚx’ C wJ¢�¶ùýúÃÒ½èþ½ÑÃä…þ$â …¤ÃR�×°%)‘°EX°/±>Y°EX°$/±$>Y°EX° /± >Y°EX°/±>Y°EX°/±>Y°EX°"/±">Y²9°/°Ð°°а±° +X!ØôY°а° а°&а±(° +X!ØôY01!33!32#4&###'##467!#33!OeþPlþO`Ùãxšª¡ x¶¡’y54þ(xx cý( ¤ý\½Óþ„|¥…ýj› † þ„|e”1ýZ°ý\>¨Ë:$(‘°EX°/± >Y°EX°#/±# >Y°EX°/±>Y°EX° /± >Y°EX°/±>Y°EX°/±>Y² #9°/± ° +X!ØôY°а °а°а°!а°%а#±'° +X!ØôY01#54&###'##5467!#3!33!3!"ÏÚx’ C wZ™‰y23þZxxØþºœþ(ùýúR½ÑÃä…þ$â … ÃÃe“1þ:þèþ�uþgÎ],5º°EX°,/±,>Y°EX°/± >Y°EX° /± >Y±° +X!ØôY²#,9°#/±"° +X!ØôY²"#9°,±+° +X!ØôY°,°2а2/@ €2�2 2°2À2Ð2]@02@2P2`2p2€2�2 2q²ð2q°-а2°.° +XØÜY´¿.Ï.]@ ../.?.]°5Ð012##"&&546332654&##532654&#!573#'53ÜØŒ}Ž’þâÚC[Ql?-\”’�@¯ÑËÅ„„Á¸³°þ¿ž¦séaèr°Êµn­*&³‡½ØA?AaW!•^lu£‰š”g’†|™f©áá^þgl,5è°EX°/± >Y°EX°/± >Y°EX°/±>Y°±° +X!ØôY°±#° +X!ØôY²,#9°,/±+° +X!ØôY²+,9°°2а2/@P2`2p2€2�2 2°2À2Ð2à2ð2 ]@!22 202@2P2`2p2€2�2 2°2À2Ð2à2ð2q@22 202@2P2`2p2€2 r°-а2°.° +XØÜY@ ../.?.]´¿.Ï.]°5Ð012654&#!5!2##"&&546332654&##573#'53˜§Ÿ™–þÜ$¿èocrvþÿÂ-[Pl?.[•“�)—´¯­ƒ«¦séaèrYg^Peg™‡O€#~\�©A?AaW!•^luq_f`g©áá|ÿëæÅ n°EX° /± >Y°EX°/±>Y±° +X!ØôY² 9°/²/]´�]²_]´¯¿]²Oq° ±° +X!ØôY°±° +X!ØôY01! 5! !54#"!325æþËþüÿþÏ06ü{ïÔÐè{ü…éÐÕíaþæþ¤\í^þ¢þçHJì þàì¯@îþàï[ÿëN N°EX°/± >Y°EX° /± >Y±° +X!ØôY²9°/±° +X!ØôY°±° +X!ØôY01432#"5267'!"!7&&[ØÙþûØÚþúàŸ¼ýB¼¡ »¾¼-ï2þÎï!ðþÏ1ðþDê­®é˜é¨¨éÏÄ<°EX°/±>Y°EX°/±>Y°EX°/±>Y°а± ° +X!ØôY01%37663#"#32,Šl A_$þxqþ‚ÿee¹‘{iJpû`°,"M<°EX°/± >Y°EX°/± >Y°EX°/±>Y°а±° +X!ØôY01376632&&#"#3²#&º*|W6 !1QþÛ`þ„|Q~o ] @Xü´:|ÿqæ:/J°EX°/±>Y°EX°/±>Y°а°а±° +X!ØôY°а±(° +X!ØôY°+Ð01#5&'&576753'4'&'#5536765曇×wÚˆ˜˜‡Ûwׇ›wxd¦wªdtte©w§dwaþ殘}|›®í¯œwx˜¯þçì�yxy|�ìïî�}{zy�ï[ÿ{¼/M°EX° /± >Y°EX°/±>Y° °а°а±° +X!ØôY°а ±+° +X!ØôY°(Ð01#5&'&5547675353676554'&'#5wx±pƒƒq°x®pƒƒp®þ\_M€x}M``N|xN_…sƒ™ð!qr‚™ï!𙂼€ixxh€¼!¹�hxyj�¹¬ÿëf4.@FÖ°EX°/±>Y°EX°/±>Y²41+°°а°в"9°"/² "9°±° +X!ØôY°±° +X!ØôY°'а°.в?1]²1]¶�1Ÿ1¯1]´11q²4]²?4]¶�4Ÿ4¯4]´44q°1°8а4±=° +X!ØôY°1±@° +X!ØôY°°AаA/°D° +XØÜY²D]0176#"&'#"&546"3265332654&##"$#"#546323'753â©ÕÖ®x´-/´v¯ÕÔªx””xžx�€w––wq€þó:HN[~oPnþ"8=Š¥æÚýÁÛçjhhjçÛ?Úæ\·¦ýÁ§¶¬ŸÙþ'Ÿ¬¶§?¦·JU�RAfy¡þŸ.yŒ…�ÿëÓí.@FưEX°/± >Y°EX°/±>Y²41+°°а°в"9°"/² "9°±° +X!ØôY°±° +X!ØôY°'а°.в?1]²1]²Ÿ1]²o1q²?4]²4]²Ÿ4]²o4q°1°8а4±=° +X!ØôY°1±@° +X!ØôY²A9°A/°D° +XØÜY0176#"&'#"&546"32655332654&##"$#"#546323'753lœÅÆ¡m¥++¤l¢ÅÄ�l„„lrŽwŽsk„„k–�þô:IM[~oOoþ!8=‹=×ÌþïÎ×____×ÎÌ×\§™þ�‘ôô‘�¦š™§jU�QAfz¢þ .yŒ…¬ÿëiò(£°EX°/±>Y°EX°/±>Y°EX°/±>Y°EX° /± >Y°EX°/±>Y²+²�q²]²]´/?]°±° +X!ØôY°°в]²�q´/?]²]²9°±° +X!ØôY°$Ð015!!#5#"&'#"&53326533265 óþ´o&Û±v±,.µw¯Õx”xž{˜}{™¡QQrrñûëÓÝkiikÝÓû러¬Ÿû러¬Ÿ�ÿëã°(¶°EX°/± >Y°EX°/± >Y°EX°(/±( >Y°EX°/±>Y²+²¿]²?]²/q²]²_]²ÿ]²¯q°±° +X!ØôY°°в_]²]²¯q²/q²?]²¿]²ÿ]°° в9°±° +X!ØôY°$Ð017!!#5#"&'#"&53326533265Éôþ³oßˤj¢),¤k¢Åw„lrŽx‰on‰_QQ‚‚þÛýDÅÎ_^^_ÎżýD‘��‘¼ýD‘��‘¼„þ’«ÅK°EX° /± >Y°EX°/±>Y°° +XØÜY° °а ±° +X!ØôY°±° +X!ØôY01#&532#4&#"33ïxâþï*óíp×½¿çç¿Nþ’[Z íaúÛ°ÅþØçïêþÙoþ’ÑNK°EX° /± >Y°EX°/±>Y°° +XØÜY° °а ±° +X!ØôY°±° +X!ØôY01#&55432#4&#"33‡wÂßùÕ­çk¨{¦°¯¨Iþ’\+Þ*é3Ò«‚›þ¸*¼üˆy>°/°EX°/±>Y01%#%7%73%A!6þݺ‡áþß5%ÜþÞ7#Ë„ñ%:þà°¬_ªþ±Ž«^«Š«`«hþZ«^ªü£Àÿö°/±° +X!ØôY01#5!53ýpþn;{Êl»üÿV,² +° ±° +X!ØôY°°а±° +X!ØôY012$32#54&#"##5ü›nPo~\MH:þó€s¢zfAQ�Uýt.þ<a²+0153ýtŠ>9Ü…Œy.ý§.þoa²+01'7'3ýà9>‹..yŒ…ú þÄ£¯/?O_o°T/°d/°t/°D/°EX°/±>Y± ° +X!ØôY°T°аT±\° +X!ØôY°аd°$аd±l° +X!ØôY°,аt°4аt±|° +X!ØôY°<аD±L° +X!ØôY01'&632#4&#"'&632#4&#"'&632#4&#"'&632#4&#"'&632#4&#"'&632#4&#"'&632#4&#"'&632#4&#"üÿp_`qh122.åq``ri032.Qq``qh032/þÒq``qh032/ýXp_`qh122.ýUq`aqh0310þæq_aqh/410=q_ari/41/óOggO+:9,þëNhgO,9:+þ NhgO,9:+ýùNhgO,9:+þäPffP,99,OggO+::+þ NhgO,9:+ýùNhgO,9:+ú)þchÆ #(/°/°"/°/°'/°/° /°EX°/±>Y°EX°/±>Y01#'37%%57%'%'7þ+ z_E9 y`F Mþ¦ûu þ³Z›AD%þÿüôþÀE&+”AÆ_•BÅ<þ­a¢Rþ þ |bG; |bG®™D±üŽ™EÈäFEþÕüãþ»G+ÿãácj°EX° /± >Y°EX°/±>Y°EX° /± >Y°±° +X!ØôY² 9°/°° а а±° +X!ØôY° ±° +X!ØôY01!!2#!#5353!!2654&#eþ»5»ÑÑ»þSÅÅxEþ»5‹‰ŠŠJýyÄœ�ÆJf³³ü­þ�lh”»�°B°EX°/±>Y°EX°/±>Y²9°/±° +X!ØôY°±° +X!ØôY01#!2'#%!27'77654&#!2wõåû~†K‘i•þ‚~iJrK}[´µþ‚]ý£°éÀÂt–D¤1f‚D�\‹Œ¹�þ`N)c°EX°/± >Y°EX°/± >Y°EX° /± >Y°EX° /± >Y² 9² 9°±° +X!ØôY° ±"° +X!ØôY01'#"&'#36632#4#"327'765njMiY|r«6xe6«tÃÜx¤žy—&)›tcEqMlPÿó‘ ƒC‚;VPýÏÚ¨ZbþÉþýÎs\ýøYf/�B†vÁ³!9°EX°/±>Y°EX°/±>Y°±° +X!ØôY°°° +XØÜY01%#!3!ý w÷wIú¶°bŸ=“9°EX°/± >Y°EX°/±>Y°±° +X!ØôY°°° +XØÜY01!#!3=ýÚx'wÓü-:Y»þçI°W° /°EX°/±>Y°EX°/±>Y°±° +X!ØôY²9°/° ± ° +X!ØôY°±° +X!ØôY01!3 /265&&###!'ý Ô 6êÙ¦¬ó×ÔwlJýñþáþäãþÊYû¿èéý/°Ÿþó«:W° /°EX°/± >Y°EX°/±>Y°±° +X!ØôY²9°/° ± ° +X!ØôY°±° +X!ØôY01!32'6676&###!:ýÝ�è¶Á ˜…ܳ�x›Óþžéã„þ÷%]"»x¯³ýù:µÐ°g°EX°/±>Y°EX° /± >Y°EX°/±>Y°EX° /± >Y² 9°/²/]²_]±° +X!ØôY²9°а°Ð01 #####3333”þMï—þF\f‘ww‘fc~°ý@ý³þâýM°ýhþ昢?:w°EX°/± >Y°EX° /± >Y°EX°/±>Y°EX° /± >Y² 9°/´_o]´oq²/]´�Ÿr±° +X!ØôY²9°а°Ð01 ###5##33533 þ¦Œžþ³KfˆyyˆfL!:ýöýÐðîîþ:þ ññàQj°t°EX°/±>Y°EX° /± >Y°EX°/±>Y°EX°/±>Y²9°/²_]²/]´�]±° +X!ØôY°±° +X!ØôY² 901##!5!33#zÈwþaÇ=‡ý¦…Ž­ýSJfýbžý9ý!30:o°EX°/± >Y°EX° /± >Y°EX°/±>Y°EX°/±>Y²9°/²/]´_o]±° +X!ØôY°±° +X!ØôY² 901##!5!33#â¦yþp ¤��þIè—ðþÔfþ àýøýؼÀ° �°EX°/±>Y°EX° /± >Y°EX°/±>Y°EX° /± >Y² 9°/²_]´¯¿]²ß]´�]²/]²Oq°±° +X!ØôY°± ° +X!ØôY01!!!#!#33<Qý&wüÄww¬fú¶žýb°Ÿ‚: €°EX°/± >Y°EX° /± >Y°EX°/±>Y°EX° /± >Y² 9°/´_o]´¯¿q´oq²/]´�Ÿr°±° +X!ØôY°± ° +X!ØôY01!!!#!#3G$þTxý¹xxUågü-ðþ:³þïʰd°/°EX°/±>Y°EX°/±>Y°EX°/±>Y²9°/°± ° +X!ØôY°±° +X!ØôY°±° +X!ØôY013 /265&&###!#!Þ© 6êÙ¦¬óשwüÃw+CþáþäãþÊYû¿èéý'Jú¶°Ÿþó‰:[°/°EX°/± >Y°EX°/±>Y°EX°/±>Y²9°/°°а±° +X!ØôY°±° +X!ØôY0132'6676&###!#!Ö¦ì!¶Á ˜…à·¦xý¹x7qéã„þ÷%]"»x¯³ýùÓü-:|ÿæ•Ã*8q°/°/°EX° /± >Y°EX° /± >Y°±° +X!ØôY²9° ±5° +X!ØôY°а±.° +X!ØôY².9²'.9°°*а*/01"&'# 54"3267&54323654&#"•i¾RFžVþçþ³ûظà3_+‘ŸØ²²Ýƒx:„JýR™“z„—�“## !‹/ÎþR`þåÌÐþþþ° ^%³ê.þÔìþõ°þã[TªþõKJ¥ ½ñõ¹vÿë€N*9y°EX° /± >Y°EX° /± >Y°EX°/±>Y°EX°/±>Y°±° +X!ØôY²9° ±/° +X!ØôY°а°6в69²'69°°*Ð01"&'#"554"3267&&554632354&#"366€S—B7€EÖþô¼”^€Ã§$Enw¥‰‡©UM-e7ŸfRW`oeFO  EöMÍ _Ó�OËþø Mé�jÁôþûÅhÙLÀk”ʸ’n‚Ç79Á#þ¡l°T°EX°/±>Y°EX° /± >Y°EX°/±>Y°±° +X!ØôY°а±° +X!ØôY° а°Ð01!5!!!5333#!´þoµþS;w� mû¾JeeûIú·þ:_þ¿î:[°EX°/± >Y°EX°/± >Y°EX°/±>Y°±° +X!ØôY°а±° +X!ØôY° а° ° +XØÜY01!5!!!33#!IþÔÄþàGxn nüÒÕeeü�Õü+þZA­—°I°EX°/±>Y°EX°/±>Y°EX°/±>Y²9°/± ° +X!ØôY°а°Ð01##5&'&5336767—xe_58fêxyxYW³f64cd°úP˜÷õhií“þmºPNXþ«²˜È:I°EX°/± >Y°EX°/± >Y°EX°/±>Y² 9° /°а ±° +X!ØôY°Ð01!##5&'&53367673ÈxEI g¿`fwE@‰g!"J?xÇ©¥X^ÜþîªC>%þ਒°@°EX°/±>Y°EX°/±>Y°EX° /± >Y²9°/±° +X!ØôY01336632#4&#"¨xd¾mïôx³¸fÅd°ýhÓìþm“¹ ýN)ÿé‘à )Z°EX°/±>Y°EX°/±>Y²9°/°а±"° +X!ØôY° а±° +X!ØôY°±&° +X!ØôY01 5&&7737532!3267!54#"±þæþÆ–ž_fc3æýüDíï{ÀK'DÌý‡EÖÎÀáK›±‘i~  [þªþÚj™ßþéB7Y9LQ*ÞþÛÚÿøÿëNN&Z°EX°/± >Y°EX°/±>Y²9°/°а±#° +X!ØôY° а±° +X!ØôY°±° +X!ØôY01"55&&536632!3267"!54&²ËþóosfAAÿªÇäýžpž83=»�…´z¦,æ2š|PiÆùüÒf·ö>:R@KýË™�¾µþ̨°i°EX°/±>Y°EX°/±>Y°EX°/±>Y°EX°/±>Y°EX°/±>Y°EX°/±>Y³+°±° +X!ØôY°Ð01/265&&#!#333l 3éÙ¦¬ó×þÆww±'‰ þáþæãþÊYû¿èéýJ°ýp�¢þóæ:I°/°EX°/± >Y°EX°/± >Y°EX°/± >Y°EX°/±>Y³ +°°Ð°/01'6676&###3330Éí¶À!˜†Þº¾yy†«�VÝË‚þþ$]"µt­¨þ:þ à¼þKç°L°EX°/±>Y°EX°/±>Y°EX°/±>Y°EX°/± >Y³+°±° +X!ØôY01!3#"&'73265!#3Y°EX°/± >Y°EX°/±>Y°EX°/± >Y²9°/´_o]´¯¿q´oq²/]´�Ÿr°±° +X!ØôY°±° +X!ØôY01!3#"&'73265!#Gx¡�4>Waý¹x:þåûm§µ c �uIþ:}ÿëÅA°EX°/±>Y°EX°/±>Y³ +°±° +X!ØôY°±° +X!ØôY01 # 5!54#"'6627'!­(Jþ¶÷þáþ¾+ýþ�ÊN'GÕÕÎöüUøÅþ—þÚ¨þØþ…T'u[õ4C6Y8Nú‹<í5àþçˆÿìüO[°EX°/± >Y°EX°/±>Y² 9° /°±° +X!ØôY² 9°±° +X!ØôY° ±° +X!ØôY012#"&55!54&#"'66267'!$Ë þõ¾Çäüžpž83=»�…´ý†¦OþÔæ7èþÎüÒf·ö>:R@KüË™�¾rÿë °A°EX°/±>Y°EX° /± >Y³+°±° +X!ØôY° ±° +X!ØôY01'!5!#"$77332654&##5hý+eþBãîþÿÍ»þðq¼—¡¶³±yEf]ýñãÔÂÞØËŒ¸¨�µ¨frþu :+°EX°/± >Y³ +³+°±° +X!ØôY01'!5!#"$77332654&##5^ý5eþIÚðþþ̺þïq¼—¡¶Á³jÎg]ýïäÌÀßÙÉЏ¨�´©gÿÿþKI°&¬"&Ô�D›�ÿÿþKf:&è(&Ô¢†›„L° E°EX°/±>Y°EX°/±>Y²9°/°± ° +X!ØôY°± ° +X!ØôY013!"&5463!"3™wþæúúæmþ“´´³µJfúPê½¼çý·„ŠºL°!O°EX°/±>Y°EX°/±>Y²9°/°±!° +X!ØôY° в9°±° +X!ØôY01!"&5463!376676&'3#'!"3,æúúæmw|z… s #Ù�óþ“´´³µê½¼çfú³Ÿ�Q²Ug¤MÂÏe·„ŠºoÿéM"3p°EX°/±>Y°EX°/± >Y°EX°/±>Y°EX°/±>Y²9°± ° +X!ØôY²9²9°±&° +X!ØôY° °-Ð0132336676&'7#&'#"5&&#"3267&&5oÛÄm£6xj^—¥"u"#õ¿p•!5±{ÂÛå)“tžŸ�žsš*7YSvûA€‰îÑ^Èl¹[þôþæbjai!ó#XlþýÏÄèhZ!3ÿèÆ°,\°EX°/±>Y°EX°)/±)>Y±° +X!ØôY²9°/±° +X!ØôY°± ° +X!ØôY²9²")9014&##532654&#!5!23676&'3#&'Ü“Š¿¨µ²¶¿þ™gïýŠsdhW�¦# v"$ôº�Ÿ}‡ f•–ƒ’fú¹)$®�Od|¿^Él‚¶[ûþÕ�«.ÿæÛ:,\°EX°"/±" >Y°EX°/±>Y±° +X!ØôY² "9²-"9°/±° +X!ØôY°"± ° +X!ØôY²)901%36676&'3#&'54&##'32654&#!'!2È>O€Š$${""Þ¤€€xÓ΀‰˜ˆþú ÁØb\_TÕDD³¡M¤Ni�G×ão�QW_djV]yc¦�R|"xXbþÛÆ¯%¸°EX°/±>Y°EX°/±>Y°° +XØÜY²9°/²/]´�]²ß]´?Oq²¯q²ÿq²r²�r²¿r²/r´Ïßq²q²q´¯¿]²_]²ïr± ° +X!ØôY°±° +X!ØôY² 9°°$° +XØÜY01#5#&&554&##532654&#!5!23ÆjRE%%¬›Ö¥Æµµ·þåéú†z‡wbþì %ƒE…†œeŸˆ�›eÍÄt·*"°„‰,%qþâ�:$s°EX°/± >Y°EX°/±>Y°EX°/±>Y°Ð°°° +XØÜY²%9°/± ° +X!ØôY°±° +X!ØôY² 9°°#° +XØÜY01#5#&&554&##'32654&#!7!23�jRE4 ƒxÿß–‡ˆ•þÌ2ÃÒ``eZV þìb3`]jefdeme •Y€!‚`b BÿèO°![°EX°/±>Y°EX°/±>Y°EX°/±>Y±° +X!ØôY² 9°±° +X!ØôY°±° +X!ØôY0136674&'7#&'!##532Îj^—¥"v"#ö¾•£ýÇÄâ5)¦”°û©€‰îÑ^Èl¹[þôþæ±Àñý¶þsþ�e8c°3ÿè:!^°EX° /± >Y°EX°/±>Y°EX°/±>Y° ±° +X!ØôY°±° +X!ØôY°±° +X!ØôY² 901!##7726!36676&'7#&'Iþe˜ª9,qf‰eX…‘" u"$à®�žÓþ›þÅþÍkõ Ìý€‰˲Y¿e|¬Vìø±À¿ÿè&°‚°EX°/±>Y°EX°/±>Y°EX°/±>Y°EX°/±>Y±° +X!ØôY² 9²9°/´¯¿]²_]´�]²/]²ß]²Oq±° +X!ØôY0136674&'7#&'!#3!¤k^—¥"u"$õ¾•¤ý xxö°û©€‰îÑ^Èl|»\þôþæ±ÀDýc°ýS­–ÿè:‰°EX°/± >Y°EX°/± >Y°EX°/±>Y°EX°/±>Y²9°/´_o]´oq´¯¿q´Ÿ¯]²/]²ïq±° +X!ØôY°± ° +X!ØôY²901!#3!336676&'7#&'Rý¼xxDweX…‘#u"$à®�žëþ:þëý€‰˲Y½g|¬Vìø±À‰ÿë‘Å!B°EX°/±>Y°EX°/±>Y°±° +X!ØôY°±° +X!ØôY²901"32&&#"36676&'3¶÷þÊ6÷j¦@(C�UÉììɨ¶wþñ]  ^'%^!#þÙÛþøÞþÙµ¢R³d€™PØæuÿëÃN!?°EX°/± >Y°EX° /± >Y±° +X!ØôY² 9°±° +X!ØôY01%6674&'3#"55432&&#"N†u t Ì¥ÜýóÑ\ˆ+".zE¤¨¶Ptg9{8Ds5ž¤:ã*â: _þú°*±þù!ÿè°E°EX°/±>Y°EX°/±>Y°±° +X!ØôY°а± ° +X!ØôY²901!5!!36674&'7#&'$ýý€ýük^—¥" v"#õ¾•¤Jffü€‰îÑ^Ék¹[þôþæ±ÀCÿè™:E°EX°/± >Y°EX°/±>Y°±° +X!ØôY°а± ° +X!ØôY²901!5!!36674&'7#&'Æþ}‹þqj^…‘"u#"á­”¤Õeeý„€‰½¦R³]uŸOßë±À’ÿëâÅ*a°EX° /± >Y°EX°(/±(>Y± ° +X!ØôY² 9°/±° +X!ØôY²9° °а ±° +X!ØôY°(°#Ð01467&&54$32#4&#"33#"32653#"$’𗇔#üÛ-oç«ÔÓÌ×··ÜÝêÓ»ëoþÁÜýþÈ‹†²'+¯mÂÒܰ„¨¤††•g‘›�¨¸ŒËØÝÿÿ°®îFˆÚS3@ÿÿ¸®ðFˆ°ff@ÿÿ,þ©�'A+ÿA+@  0]01[2°EX°/±>Y°° +XØÜY013#[oG?wà8þÈ®[2°EX°/±>Y°° +XØÜY01#53oG?weþÍ0¶[ÿ-°/°° +XØÜY01%#53dG4wAþì ÌÿÿJ2Gh[À@°EX°/±>Y01ÿÿ[2&gg÷°EX°/±>Y°Ð01ÿÿ[2 &hhü°EX°/±>Y° Ð01[ÿ6ö °/°° +XØÜY°а° Ð01%#53#53dG3xðdH4xcþÓ'µ¯þÓ+±C!° L°EX°/±>Y°EX°/± >Y°EX° /± >Y°EX°/±>Y° ±° +X!ØôY°аÐ01!#!5!3!!þPxþJ¶x°Ñü/ÑivþŠTþ`1°u°EX° /± >Y°EX° /± >Y°EX°/± >Y°EX°/± >Y°EX°/±>Y°EX°/±>Y±° +X!ØôY°±° +X!ØôY°а°Ð01!!#!5!!5!3!!!1þEyþW©þW©y»þE»þ` engvþŠgü’’Á ² +014632#"&5’eTUeeTUeNeeNAObbOÿÿ¼ߤ&¯ÿÿ¼g¤&'¯7\ÿëgÅ'5CQU–°R/°T/°EX°/±>Y°EX°/±>Y²9°/²9° а°в9²$9°$/°±+° +X!ØôY°±2° +X!ØôY°+°9а2°@а$±G° +X!ØôY°±N° +X!ØôY0146326632#"&'#"&54632#"&5326554&#"326554&#"326554&#"'O�Qz"#}Q€žž~R~#"yP��ý �€ž�€žSb\Ybb[ZbÚa\Yaa[[`û3b\YbcZYcJÇJd~®NCCN®~M­MCCM­�®®M~­­~üÌX}|YM[z{ZMY||YM[zz[çX||XMX~Wûá0r0l¢ü«°/01#53èiþÙ'i&þ|{{e¢õ«°/013#ei'þÙi«þ…þ…„>yO °/°/017'ˆJÇJy0r0M0MÅ S°/°EX° /± >Y²€]²ð]²@]²]² 9°/± ° +X!ØôY°Ð°°в 9° °Ð013##5!'3!'£ªªmþÛ{þ$oM[ÂÂL‡ýˆë0{‹íº‰°/°EX°/±>Y°EX°/±>Y² ]²¯]²q²¿q²r²or´ßïr²¯r²?r²ïq²�q²ï]²]² q²ð]²9°° а± ° +X!ØôY016632#4&#"#Ñ'~O„�od\Nlp­†EN–�þïwiSHýÌ"C0Å*š°EX°/±>Y°EX°/±>Y²+²]²o]²?]°±° +X!ØôY°Ð°±° +X!ØôY°в]²?]²o]°±° +X!ØôY°°а± ° +X!ØôY°°$а°'а°(Ð01!!53665'#53'#53'4632#4&#"!!!�3.üS FFÕÑÅÁÔ²»¼p‰x}‘¦þ^¡ïkÂ@eeæxf¤f±ÌéÏ®”‰°Ÿ±f¤f¹ÿë°#,–°EX°/±>Y°EX°/± >Y°EX°/±>Y°EX°/±>Y°°° +XØÜY°±° +X!ØôY°±° +X!ØôY°°в9°/°°"а±$° +X!ØôY°±,° +X!ØôY013#3267#"&5####!2332654&##þîîM@7$V+r¡ r}åÔxLä~i¤ü¬Ô³µ´´ÔOþëbý?jYY �œÁªlxý¶°yf—ý`ÀŒŽÁPÿëÌÅ+|°EX°/±>Y°EX° /± >Y²+'+°+±° +X!ØôY° ±° +X!ØôY°°а+°ж''/']°'±(° +X!ØôY°а'°а±"° +X!ØôY01!3267#"55#535#535432&&#"!!!“ýÝË«9p4 6u;Üþï©©©©Ü9o@ 6q8¬È#ýÝ#Æìh"õf¨f%ô#jèÇ'f¨vÿë„Å+9=…°:/°Y°EX°(/±(>Y° °° +XØÜY° °а ±° +X!ØôY°±° +X!ØôY°°а(°!° +XØÜY°(±/° +X!ØôY°!±6° +X!ØôY01#"&554632#4&#"32654632#"&53326554&#"'Š�tyž�xu�XWPRbcSNW�€ž�~�žab\YabZZbþJÇJ ^†®}M}°‡^=W€VMV~X;ý[~®®~N­­Y||YN[z{Zì0r0[ÿí8Å'Z°EX°/±>Y°EX°/±>Y² 9° /±° +X!ØôY°а±° +X!ØôY°± ° +X!ØôY° °%Ð01&55#52674632354&#"66¿±¸9{AD{6‡wgƒÄ¬s„>4CCv| ïÓ&q±Ê¬�*±þµ\XŸ½ ,hkŒ†þGHýÿÿ¸1Â"0ù#y#ÿýƒÿ°EX°/±>Y°$в *]01`—C°T°EX°/±>Y°EX°/±>Y°ав9°/°аа а° а°а±° +X!ØôY°Ð01'##333####5!ú 3¥H^«®XIýæ˜Jž€þ€�þrþY§ýçÔþ,ÔE•ÿì�NT°EX° /± >Y°EX°/±>Y² 9°/°±° +X!ØôY° ±° +X!ØôY°±° +X!ØôY01%#"5432!3267"!&&W¼_ÚþÎCÉÏ ý7�M_ºWþ�J�:6‹^7;IèâOþÊç/þ¸59<>*A9þë4=ÿÿ~ÿõ;²'Ê&†'vÑO°EX°/±>Y01ÿÿlÿõÀÀ'Ìÿù”'v±ÑÔ°EX°(/±(>Y01ÿÿmÿõì¯'ÎÿìŽ'väѰEX°/±>Y01ÿÿhÿõ[¯'ÐŽ'v:Ño°EX° /± >Y01cÿëí!B°/°EX°/±>Y² 9° /² 9°±° +X!ØôY° ±° +X!ØôY01#"54327&'2655&&#"í!þîÏÐþõó×uÃ5þÙ|žÇ&Ä�©©ÂíXþ†þØÜõþÉÊî^Rý#LúÍÿÆVc�㳕à®ÿ “°%°/°EX°/±>Y±° +X!ØôY°°Ð01#!#!“xý xåó=ùã?þó›° J°/°EX°/±>Y²9°°Ð°±° +X!ØôY°а± ° +X!ØôY°а° Ð01!!55!!ý·Éû¤Zý¦üyJBýf\]fý¥®è°/±° +X!ØôY01!5!èü½C®f@!° 2° /°EX°/±>Y°EX°/±>Y°а ± ° +X!ØôY01373##53Ö"#„|þ `ó™ï‚‚‘úP€f{ÿëêN'5z°EX°/± >Y°EX°/± >Y°EX°/±>Y°EX° /± >Y² 9² 9°±° +X!ØôY²!9°±$° +X!ØôY°+в.9°°2Ð01#"&'#"554326632#4&#"3265!3275&#"êú̶ôHHô´ÎùøÍµõHIõ¶Ëùw¯ž¶ÝßµŸ°ù€®¡³Ü"Ú´Ÿ®õÜþÒýªªý.ÜNÜ/ÿ¨©þþÑܯöþ¸n*mþµô±±ôFr*tBö¯ÿ‹þKp-_°/°EX°/± >Y± ° +X!ØôY² ]²0q´°Àq²]´/?]²pq²ð]²`]²r°±° +X!ØôY01#"&'732654632&&#") Ž5 >W`£“!D#0 blY§µ c ‚t1£² `peJì3ž²+´°À]²@]²�]²p]°±° +X!ØôY°°° +XØÜY± ° +X!ØôY°° а°в@]´°À]¶p€�]°°#° +XØÜY°°&а#±*° +X!ØôY°±0° +X!ØôY°*°3Ð0166363267#"&'&&"66363267#"&'&&"o/|AE@eZAA@y10|@BBVj>DAy0/|AE@e^=A?z10|@BBVn:D@z0VDN2.NFuEM,4OEþÞDN20OFuEM,6PE•™×ÄN² +´ ]²q°±° +X!ØôY°Ð°°в ]² q° °а ± ° +X!ØôY°Ð013!!!'7#5!!5!îéþܪÎý÷•;}æ!©þ6œ<«jþÏjþó+âj1j+ÿÿ¡äôgT†@9šˆÿüýT°EX° /± >Y²?]²P]01ÿÿ‘Þôg †@9šˆÿöýT°EX° /± >Y²?]²P]017ΰ)°EX°/±>Y°EX°/±>Y°° а° Ð013#!'#37Ò`œþf`þcþÖ$$þÚ)#%°ý'ý)× UUýàýáVV�ÿe'°°/°° +XØÜY01%#753'SG4f6ÑÓx0 -¤°/°EX°/± >Y°EX°/± >Y°EX°/± >Y°EX°/±>Y°EX°/±>Y°±° +X!ØôY°в`]´àð]²pq²]´/?]²0q² ]´°Àq²r°±° +X!ØôY°°аÐ013#5354632&&#"3#!#3ä´´¾©CŠG=rIz}ýýDxxØbЬ½g‚zŠbü(:Xþrë® *;AGMS]aeimqu~‚†ŠŽ’–°Y²‘R+²��+²•Œ+²E”+²?]°�°ƒÐ° а°а °а~а вð q°°0а8аUа'вÿ'q°°+аE°>а<°?° +XØÜY°<°rаnаjаBа?°sаoаkаCаJ°K° +XØÜY²OKr²/Kq°R°MаK°fаbа^аNаJ°gаcа_аOвðvq² v]²Ðv]°v°TвðTq¶TT Tr°Œ°а�°‚а‘°†Ð°”°‡Ð°•°ŠÐ01#"&55463232#4&#"32653#"&773326533!5353!#%5!#532654&'#5!!5!!5!5!!5!!5!32654&###535#53#53%#535#53#536€eh€€ff�C¼eo,(06i\þ„K@@JJB?Jº\jQ[iT62(7ùÄqÄ(Çoøm5Äì6oü\~253/Ðý[ý\ ý[ý\¼]:<9=]üñqqqqqq"ooooooÔbyybp`{{`þ¸%KK'> F-LOHDOODpENNEOþ†O\QM.-6,üÉ;ÊqqÊþÅt©©tþã©ü¶©+(&.Jttttttù8qqqqqqÄ((' þÓü~úüù~ü~úüù\ýÕ×b"&*² +²!+² +²+01 4676654&#"36632#33#3#¿üAüD(H^©“ˆ§Â;+6;3*O;ÊÊÊKRü1ü1Ïñ5='ƒN€—‚‚34?52M7ZX[ªýL �<'� S°EX°/±>Y°EX° /± >Y°EX°/±>Y°EX°/±>Y² 9² 9²9² 9013##31ZŽþ`®Žþ™þš�®þ_�­àýÁý²ïþN?HK� /°EX° /± >Y°EX°/±>Y° ± ° +X!ØôY°Ð01#57!5!KíxÉ«ýq(ëþ¤þع¹%…Åeÿë Å ;°EX° /± >Y°EX°/±>Y° ±° +X!ØôY°±° +X!ØôY01#"32'4&#"3265 ïÕÔòðÔÕñx«£¢ª¬¢¢ª5þæþÐ1E2þÎþçàññàþ•Þõôß ÿùø´=°EX°/±>Y°EX°/±>Y°°° +XØÜY±° +X!ØôY²901#5%øxþ ØE+[Fÿ þïÉC$°/°/± ° +X!ØôY°±° +X!ØôY013 /265&&##`æ 6êÙ¦¬ó׿CþáþäãþÊYû¿èéÿ�þK+‡°/°EX°/± >Y± ° +X!ØôY01%#"&'732655+ Ž5 >W`‡à§µ g }tàEþ�œ*)°/°° +XØÜY± ° +X!ØôY°°° +XØÜY017#"&'732654&'öMYgO6M4#7,C>*3ˆEPYS66\9Žþ�| °/°/01#3xxþ�ß‹ÛËÃ#ã°/°/°/²+°°° +XØÜY@ /?O_]° а° ° +XØÜY¶  / r²Àq´Ÿ¯]¶/]¶_o]²ÿ]²Ÿq²€q²Ð]²Àq²Ÿq¶/]¶_o]´Ÿ¯]²ÿ]²Ð]²€q°°а°° +XØÜY¶Ðàðq°° ° +XØÜY¶Ð à ð q°°#Ð01#"&7733265#"&#"'466765Û„†›\Zb^\c]D>ƒ-(6B[E7Š-'8°[tt[?OP>Jb]:.Hc_=0‹â¾ Œ°/°/°/°/°°° +XØÜY@ /?O_]¶�Ÿq²ÿ]° а° ° +XØÜY@   / ? r²q´O_]¶/]²Ÿq²ÿ]°°° +XØÜY°° +XØÜY01#"&7733265'566'56H¶—‚ƒ—YY_[[ØVInQ„—^K°XppX=LM<k"&&%=LA=>7‹ßÑwz°/°/°/°° +XØÜY@ /?O_]¶�Ÿq²ÿ]° а° ° +XØÜY@   / ? r°°а/´_oq°° +XØÜY@ /?O_]01#"&7733265'3#Éœ†‡�]\b^^nf¦O°YrrY>NO=ÇÉsäö¿»°/°/°/² +°°а°° +XØÜY@ /?]°дï ÿ ]¶_ o  ]²¯ ]¶  / ]²ï q² q´ïÿ]¶_o]²¯]¶/]²ïq²q° °а°° +XØÜY¶Ðàðq° °° +XØÜY¶Ðàðq°°Ð01#'#'%37#"&&'467765öwÉÈw iÏU<6s(".@U;0z'"/êµµìÚB[X>) AgW4)säбL°/° /°/°а°° +XØÜY@ /?]°а° ° +XØÜY°° +XØÜY°° +XØÜY01#'#'73'6654HöwÉÈwþ†ôM<]GtˆRC꺺ìtp&(%JQC@@4ÿ‘äöa J°/° /°/° /°°а°° +XØÜY@ /?]°а ° ° +XØÜY@   / ? ]01#'#'%3#'3ö…»»„tþ½eµ‡ê¬¬ì\çbäÉa F°/° /°/° /°°Ð@ /?]°°а°а ° ° +XØÜY@   / ? ]013#'#'3#jt„»»…Þ‰¶fÖ쬬wçvºÞ’†° /°/°/°/²¿q²ßq°°° +XØÜY@ /?]²Ðq²ðq° а° ° +XØÜY@ ° À Ð à ð q²_q²O]²ï]°°° +XØÜY@ /?O_]01#"&7733265'#'73×¥Ž�¦^clhgƒu¼”°j†‡iHXZF Ó—¶6°EX°/±>Y°° +XØÜY0173#—WH(w?ØÚ‡5[� F°EX°/±>Y°EX°/±>Y°EX°/±>Y²9°/±° +X!ØôY°° Ð01!#3#!#gýÃx}Ùv×|ýsíô0þÐ�ûs•f¨ñ�!v°EX°/±>Y°EX°/±>Y±° +X!ØôY°± ° +X!ØôY² 9°/´O_q²_]´/]´�Ÿq´�Ÿr±° +X!ØôY²9013!2#!2654&'#%32654&##¨tÊàf]l‚Ö¹þ¾B…’�} þ¾ü—œ˜›ü�š›[Š›e�¤þEslaw_mik`ÿï �G°EX° /± >Y°EX°/±>Y° °а ±° +X!ØôY°±° +X!ØôY°°Ð01#"55432#4&#"3265òËÍþÿÍÏïoªž™½¼šž©q¸Ä ÕóÔ Ä·Œ�Ò¥ô¨ÑŒ‘¨� ;°EX°/±>Y°EX°/±>Y°± ° +X!ØôY°± ° +X!ØôY013!2#!26554&#¨�ÈþêÈþë•ÑÑ•�þòÐÒÑþô(ü<עӡר¿� Z°EX°/±>Y°EX°/±>Y±° +X!ØôY°±° +X!ØôY² 9° /²_ ]´ / ]±° +X!ØôY01!!!!!!hý¸ŸüéýaH,þ8d�eþi¨¾� m°EX°/±>Y°EX°/±>Y²9°/²_]²q²�q´O_q´�Ÿ]´/]´¿Ïq±° +X!ØôY°±° +X!ØôY01!#!!!gý¹xýbGýé�eþUÿï.� h°EX° /± >Y°EX°/±>Y° °в]° ±° +X!ØôY°±° +X!ØôY² 9°/²]´?O]±° +X!ØôY01%#"55432&&#"3267!5!.+ç«ÞþìØÖão  £¥Ìά€¦ þ× œ@m ÕóÓ · }~Ô£ô¦Ó@*f¨8� T°EX°/±>Y°EX° /± >Y°EX°/±>Y°EX°/±>Y²9|°/²q±° +X!ØôY01!#!#3!38xý`xx x ý÷�ýá¨�°EX°/±>Y°EX°/±>Y01!#3ww�OÿïQ�/°EX°/±>Y°EX°/±>Y° а± ° +X!ØôY013#"&7733265ÙxÔ¤¶Ôo�†n’�ü̦Į¥}wŽw¨�`°EX°/±>Y°EX°/±>Y°EX°/±>Y°EX°/±>Y²9°/²_]´/]±° +X!ØôY² 901##333#©‰xx†¼Šþ ‘ýç�ýó ýÎý¯¨b�)°EX°/±>Y°EX°/±>Y±° +X!ØôY01%!!3 BýFxdd�¨4�S°EX°/±>Y°EX°/±>Y°EX°/±>Y°EX°/±>Y°EX° /± >Y°°Ð°°а Ð01%33#'##3ï«”xþfUþ_x�©äûs­üQÂü?�¨[� C°EX°/±>Y°EX° /± >Y°EX°/±>Y°EX°/±>Y°°а°Ð01!##373[wýBxx¾wÍü5�ü4Êÿï@� ;°EX° /± >Y°EX°/±>Y° ±° +X!ØôY°±° +X!ØôY01#"55432'4&#"3265@þ÷רþ÷×× w©¨¿À©©ÀÍÚþüÚóØþûØ´Ãôô¶Ã·ÿ‘˜�!B°EX°/±>Y°EX° /± >Y² 9°±° +X!ØôY° ±° +X!ØôY01'#"55432'4&#"3265@62ÀSÁ;”UØþ÷×× w©¨¿À©©ÀÍ` =µJ²**ÚóØþûØ´Ãôô¶Ã·¨�#]°EX°/±>Y°EX°/±>Y°EX°/±>Y²9°/´ ]±° +X!ØôY² 9°±"° +X!ØôY01#!2#&&554&#%!2654&#! x»ÃÒbbh[ } ‚xþ›C–‡‡–þ½ýþ�ªŸbŠ#Œiw2Pa4thtepooxiÿïõ�']°EX° /± >Y°EX°/±>Y² 9° °а ±° +X!ØôY°±° +X!ØôY°°"а±%° +X!ØôY014&'&&54632#4&#"#"$773326}�ÀØÆçÃÈáo¢‘—›ƒÉÖËöÑÀþûoÄ‹œ³#Vg39��Œ¨·¤pŒvXXe39“Š‘¤§´…wvHÅ�/°EX°/±>Y°EX°/±>Y°±° +X!ØôY°Ð01!#!5!Åþvxþ…}(ûØ(eœÿï]�6°EX°/±>Y°EX°/±>Y°EX°/±>Y± ° +X!ØôY01#"$533265]þôÔÕþôwËŸŸÊ�üýÁÚÚÁüý�§§�:]� -°EX°/±>Y°EX°/±>Y°EX°/±>Y°Ð01%373#33x€þ)uþ)�ÐKJ¾ûs�NÀ�S°EX°/±>Y°EX° /± >Y°EX°/±>Y°EX° /± >Y°EX°/±>Y° °аа°Ð01373373#'##3ªîuïÚþÆsú ýsþÇ~xyvü‰yzvûs”GGül�{ÿëÅ*v°EX°/±>Y°EX°/±>Y²9°/²Oq²_]²/]°±° +X!ØôY°° а±*° +X!ØôY²*9°° а±#° +X!ØôY0132654&#"#'&632#"$77332654&##«‹¤§Ÿ›�³pù¾Æì‚w‹ŠÿÉ¿þîo™Ÿ²º­‹ž~ˆ¢¥‡ªâÖ¾gµ,'¹~ÂÞÙÁ‹°¡–™“-�1°EX°/±>Y°EX°/±>Y°EX°/±>Y²9013#3#n‰þCwþGˆyýþ[«âKÙ� F°EX°/±>Y°EX°/±>Y±° +X!ØôY²9°±° +X!ØôY² 9017!!5!5!åôürÙýIRddPØeL‹ÿïÞ� ;°EX° /± >Y°EX°/±>Y° ±° +X!ØôY°±° +X!ØôY01#"&54632'4&#"3265Þé¿ÁêéÀ¿ëx¥��¤¦�Œ¤›ÈääÈWÆå寖¯°•þ¨•²±–K•�6°EX°/±>Y°EX°/±>Y°°б° +X!ØôY²901!#5%•wÓJ$g!__�S°EX°/±>Y°EX°/±>Y±° +X!ØôY²9²9°± ° +X!ØôY°° в901!!56654&#"#'&632!_ýµlPut�pÓ°¤½ƒ‡þ¾ad®l‹Gj~ŒkŽÈ¬£h¶ŠþÄcÿï~�*�°EX°(/±(>Y°EX° /± >Y² (9°/²_]²�q´O_q´/]²�r±° +X!ØôY²9° °а ±° +X!ØôY°(± ° +X!ØôY°(°#Ð01#"&77332654&##532654&#"#'&632leYfjÞ±¢êoš|ƒ”‹ˆ¡¡ƒ|‚�p”pÛ¡°ÍYV‹# Ži�²¬¡g‡iuodqeb|zbŒ¯¨Hö� L°EX° /± >Y°EX°/±>Y² 9°/±° +X!ØôY°°а° в 9° °Ð013##!'3!'ßßxý«O€ýÀÈheþýJ@üÛ‡5qÿï��i°EX°/±>Y°EX°/±>Y°±° +X!ØôY²9²9°/²9²9°±° +X!ØôY°±° +X!ØôY01!!6676#"&?32654&#"�Dˆýá+1{]¨ËÇΨßo•|’‹Š|z…�lþr%.ȱ²Ò¡�my’‹~“JE‡ÿï¶�'X°EX°/±>Y°EX°/±>Y°±° +X!ØôY²9°/² 9±° +X!ØôY°±"° +X!ØôY012&&#"6632#"&54$"32654&CH�;9qN‹º1¤k´Ãã´°èŸl¡¢~�žŠ�a¾• ALï¤ÍøÄ8ÁùýÐ[K•Ûr�ŒrÅV°EX°/±>Y°EX°/±>Y²9²9°± ° +X!ØôY°° в9°±° +X!ØôY01!!56654&#"#'&632!üxÝ„mš‹¦¬oöҼᗆþoî\–È\‡¥¸š¶üضx÷˜þ:pÿï°�#/k°EX°/±>Y°EX° /± >Y²- 9°-/²_-]´-/-]±° +X!ØôY²-9²-9° ±!° +X!ØôY°±'° +X!ØôY01#"&5467&&546324&#"3264&#"326�o\l‚鮹ð…pbqÛ©¡ÖUªx€¯¯ƒy¦#•jt™œti“d\‹"$•cž²²žd•$"Š\•¤¥ýGf„„fk€€�]wrb`vv_ÿï��'U°EX° /± >Y°EX°/±>Y±° +X!ØôY² 9°/² 9±° +X!ØôY° ±"° +X!ØôY01%2655#"&54632#"&'726754&#"â…­2¡]µÐã´²èõ¹B�C;uQp� ¢{~Ÿ‹T¯†¡@Dʦ¦áòÂþ¡µæa´\BC’½¯sv˜XY,9°EX°/±>Y°EX°/±>Y°°а/±° +X!ØôY²901!#5%Ym”¿]v¯,]°EX°/±>Y°EX°/±>Y±° +X!ØôY²9²9²)]°± ° +X!ØôY°° в9²)]01!!56654&#"#'&632!¯ýÇ;M6NOW^d�„|Ž^gÖ§ZGY/@NTBaŠyqKza¼sÿõÅ,*†°EX°(/±(>Y°EX° /± >Y² (9°/¶_o]¶�Ÿq´]¶Ïßïq±° +X!ØôY²9° °а ±° +X!ØôY°(± ° +X!ØôY°(°#Ð01#"&77332654&##532654&#"#'&632·G?HL§…y­efTZe]]zzXUZXKcc¡x„šK:^aGmzun?PLAKEYF@;KG:^xuT ! L°EX° /± >Y°EX°/±>Y² 9°/±° +X!ØôY°°а° в 9° °Ð013##5!'3!'r™™lþR­qþc1ZªªC4ýã’+�ÿõÖ!i°EX°/±>Y°EX°/±>Y°±° +X!ØôY²9°/²9²9²9°±° +X!ØôY°±° +X!ØôY01!!6676#"&?32654&#"˜2åþz!X?|–•›~§cfUd__USZ^Ã_ð�|z�mkCHXWP^.*‹ÿõì,'X°EX°/±>Y°EX°/±>Y°±° +X!ØôY²9°/´]±° +X!ØôY°±"° +X!ØôY012&&#"6632#"&5546"32654&Ø6i*)T5`‚$uK��ª†„­ÁyNooVYk],Wu^f,3‰xr�ª‡×„«þq<2 _x^IPWX�! /°EX° /± >Y°EX°/±>Y° ± ° +X!ØôY°Ð01#547!5!��yk‘mþ<7ÆŸãÅÆk[ÿõì,#/x°EX°/±>Y°EX° /± >Y²- 9°-/¶_-o--]´--]¶-�-Ÿ-q±° +X!ØôY²-9²-9° ±!° +X!ØôY°±'° +X!ØôY01#"&5467&&546324&#"3264&#"326ÔM@KZ®‚г[OCN¤x¡TtQYxxZSqcHPgiOGcS=^fAnzznBe^=grrþ%ARRABNN³:GE<Y°EX°/±>Y±° +X!ØôY² 9°/´]² 9±° +X!ØôY° ±"° +X!ØôY01%2655#"&54632#"&'726754&#"’[v#m?ˆ›ª‡ƒ®¸‰2i1*U?MjoSWj^OjUf*,Œur›¨†ï}�X&8*']vjHL^�ÿõ , ;°EX° /± >Y°EX°/±>Y° ±° +X!ØôY°±° +X!ØôY01#"&554632'4&#"3265 ®��¯®Ž�¯mqaanpa`p‰��‰ë‡ŸŸ‡^ll^ì`ll`}®á+°/²ß]²]²Oq²_]²/]±° +X!ØôY01!5!áýœd®f°kL›m°/°/@ Ïßïÿ]²q²q²r²Ÿr²ïq²_q´O_]²]°° +XØÜY°°° +XØÜY°° +XØÜY°°° +XØÜY013#4632#"&732654&#"È�Å_x[@?YY?@[D3$#22#$3›ÆÎAYYA@VV@$21%&44~o†Å 0°EX°/±>Y°EX°/±>Y°°° +XØÜY° а Ð013#'73#{f¥Ï<ý�\R‹Œ9þÁ�ÆÌ‰PV° L°EX° /± >Y°EX°/±>Y² 9°/±° +X!ØôY°°а° в 9° °Ð013##!53!'qååwýVŸ‚ým3Õeþ�pDüü%Di¼ÿë°d°EX°/±>Y°EX°/±>Y°±° +X!ØôY²9°/°в9°°а±° +X!ØôY°±° +X!ØôY01!!6676#"&77332654&#"ÐQÄý£77…pºåÞÞ´ðk§‹£¡¢‘‹”!“oýù17ÿØÝþøÉÅ“œÄº£ÅYZ§ÿë.Å'X°EX°/±>Y°EX°/±>Y°±° +X!ØôY²9°/² 9±° +X!ØôY°±"° +X!ØôY012&&#"6632#"4"32654&–K’99pN¢Õ<ºqÄäõÄÉþû©yµ!À–’¯ªÅ" b üÍ�N^þòÙ×þè,oü>ýš~ckÑò奯Ö ³° /°EX° /± >Y°EX°/±>Y° ± ° +X!ØôY°Ð01#7!5!³Úç' w (óÊüè“Jþèý¾þŠzzsWf<þJòN/?M”°EX°+/±+ >Y°EX°/± >Y°+°/а//±° +X!ØôY°+°C° +XØÜY´CC]±° +X!ØôY²9°/±0° +X!ØôY²09²$C9°±9° +X!ØôY°+±J° +X!ØôY01##"&'332#"&5467&&5467&&554632!"&'32654&#326554&#"ò«,0æ®'H! )F9¶µÑþäçÍås[ "8.V`ä±&H"Sý´  Qn ›²ÚƒŒþ„¢~|¡¡~~ ×.vBŽÅ ?)6+’Ž~Ò¢xa�*A->[%-—Y—Æ ü~NVp“WXc†^��^e’’e‚ÿë=Å#/i°EX°/±>Y°EX° /± >Y²- 9°-/²_-]²/-]±° +X!ØôY²-9²-9° ±!° +X!ØôY°±'° +X!ØôY01#"$5467&&546324&#"3264&#"326Œv‡¤þõÒÖþø¡ˆvŠòÁÀöOΙœÈÆ œÉ)·‡‹°±Œ‰³9v±()ÀÄÓÒÅ�¿)(°v¼ÐÑü�Š­­Š�¢£G~§ …�››hÿëôÅ'U°EX° /± >Y°EX°/±>Y±° +X!ØôY² 9°/² 9±° +X!ØôY° ±"° +X!ØôY01%2655#"5432#"&'726754&#"¦Ä5³nÆôÿ¼ÓþþôÚM�HC…h‚¯%µ›�·¬PÞ϶]d ÓÔþíþúþSýþée!†bvÏÛ襠Û¨ú� B°EX°/±>Y°EX°/±>Y²9°/± ° +X!ØôY°±° +X!ØôY01#!2#%!2654&#! xº¿ÙÙ¿þ¾BŽ’‘�þ¾´þL�Ì¡¢Êe—npšoÿë4N `°EX°/± >Y°EX° /± >Y°EX°/±>Y°EX°/±>Y² 9² 9±° +X!ØôY° ±° +X!ØôY01#"55323#32675&&#"�.Ã�ÂÛÛÄ�¿0-vahvý)�ž¥œ‰žŸ6™²!ó7²›9ýâýäÿÄëç·O¬ÿþûÏÿÿ‹®Ê°œÿÿ1:ŸDë° i°EX°/±>Y°EX°/±>Y²9°/²_]²/]²Oq±° +X!ØôY°а±° +X!ØôY°±° +X!ØôY°°Ð013#53! !!!2554#!!Ý™™§ \þ¤þõ$þ¬0Øþè×þÐT±f™þœþé»þèþž±ý´.ç¾ä.ýÍDë° i°EX°/±>Y°EX°/±>Y²9°/²_]²/]²Oq±° +X!ØôY°а±° +X!ØôY°±° +X!ØôY°°Ð013#53! !!!2554#!!Ý™™§ \þ¤þõ$þ¬0Øþè×þÐT±f™þœþé»þèþž±ý´.ç¾ä.ýÍ!øy°EX°/±>Y°EX°/± >Y°EX° /± >Y°EX°/±>Y²9°/²]²Oq±° +X!ØôY²9°±° +X!ØôY°°а°Ð01!6632#4&#"##5353!…þ¯6´x«·x‹z{¥'x››xQéþ˜alÔßýe�°™�kýéfÉÉ-�°N°EX° /± >Y°EX°/±>Y² 9°/±° +X!ØôY°а ± ° +X!ØôY° а°Ð01##!5!!5!!3…ëxþÿþ bþ ëBü¾Bf¢ffþ^ÿëxO€°EX°/± >Y°EX°/± >Y°EX°/±>Y°°° +XØÜY°±° +X!ØôY²9°/±° +X!ØôY°± ° +X!ØôY°°а°а°аÐ013#!!3267#"&5#53#53ZîîþâM@7$V+rÍÍ»»Oþëbþ÷fþ®jYY �œRf bÿÿ ß#&#B_ ³ +01ÿÿ ß&#sÓY ³+01ÿÿ ß3&#šÞ] ³+01ÿÿ ß2&# ÓU ³+01ÿÿ ß&#h³V³ +° °Ð01ÿÿ ßh&#ž<–³+°°Ð01ÿÿ ß#&#ÕHˆ³+°°а° Ð01ÿÿ„þE¬Å&%wâÿøÿÿ¿Y#&'Bò_ ³ +01ÿÿ¿Y&'s°Y ³+01ÿÿ¿Y3&'š»] ³+01ÿÿ¿Y&'h�V³+°° Ð01ÿÿÿ÷]#&+Bÿš_ ³+01ÿÿÊ/&+sVY ³+01ÿÿ.3&+šÿc] ³+01ÿÿÿÚ]&+hÿ8V³+°°Ð01ÿÿ¿ï2&0 U ³+01ÿÿ|ÿëæ8&1B1t ³ +01ÿÿ|ÿëæ4&1sïn ³  +01ÿÿ|ÿëæH&1šúr ³ +01ÿÿ|ÿëæG&1 ïj ³ +01ÿÿ|ÿëæ&1hÏk³  +° °Ð01ÿÿ§ÿë¹#&7B<_ ³+01ÿÿ§ÿë¹&7súY ³+01ÿÿ§ÿë¹3&7š] ³+01ÿÿ§ÿë¹&7hÚV³+°°Ð01ÿÿ!º&;s­R ³ +01ÿÿgÿëÈâ&CB¢ ³,+01ÿÿgÿëÈÞ&Cs` ³0+01ÿÿgÿëÈò&Cšk ³.+01ÿÿgÿëÈñ&C ` ³/+01ÿÿgÿëÈÅ&Ch@³0+°0°-Ð01ÿÿgÿëÈ'&CžÉU³5+°5°;Ð01ÿÿgÿëÈâ&CÕÕG³:+°:°/а:°@Ð01ÿÿaþEÍN&EwZÿøÿÿ\ÿëÐâ&GBµ ³ +01ÿÿ\ÿëÐÞ&Gss ³$+01ÿÿ\ÿëÐò&Gš~ ³"+01ÿÿ\ÿëÐÅ&GhS³$+°$°!Ð01ÿÿÿÆ,Ì&ŠBÿi ³+01ÿÿ™þÈ&Šs% ³+01ÿÿÿÒýÜ&Ššÿ2 ³+01ÿÿÿ©,°&Šhÿ³+°°Ð01ÿÿžÙð&P ƒ ³+01ÿÿ[ÿëá&QBÉ ³+01ÿÿ[ÿëÝ&Qs‡ ³ +01ÿÿ[ÿëñ&Qš’ ³+01ÿÿ[ÿëð&Q ‡ ³+01ÿÿ[ÿëÄ&Qhg³ +° °Ð01ÿÿšÿë×Ì&WBÇ ³+01ÿÿšÿë×È&Ws… ³+01ÿÿšÿë×Ü&Wš� ³+01ÿÿšÿë×°&Whe³+°°Ð01ÿÿ#þKÊÈ&[sC ³+01ÿÿ#þKʰ&[h#³+°°Ð01ÿÿ ßú&#n×J ³ +01ÿÿgÿëȹ&Cnd ³,+01ÿÿ ß>&#œçŽ ³+01ÿÿgÿëÈý&CœtM ³0+01ÿÿ þx°&#ŸtÿÿgþxþN&CŸ]ÿÿ„ÿë¬4&%sçn ³! +01ÿÿaÿëÍÝ&Es_ ³"+01ÿÿ„ÿë¬H&%šòr ³  +01ÿÿaÿëÍñ&Ešj ³ +01ÿÿ„ÿë¬"&%�¼r ³ +01ÿÿaÿëÍË&E�4 ³+01ÿÿ„ÿë¬J&%›t ³" +01ÿÿaÿëÍó&E›| ³"+01ÿÿ¿Í5&&›¹_ ³+01ÿÿoÿëì&F‘Åg°EX°$/±$>Y01ÿÿ¿Yú&'n´J ³ +01ÿÿ\ÿëй&Gnw ³!+01ÿÿ¿Y>&'œÄŽ ³+01ÿÿ\ÿëÐý&Gœ‡M ³$+01ÿÿ¿Y &'�…] ³ +01ÿÿ\ÿëÐÌ&G�H ³ +01ÿÿ¿þxY°&'ŸPÿÿ\þ´ÐN&GŸö<ÿÿ¿Y5&'›Í_ ³+01ÿÿ\ÿëÐô&G›� ³$+01ÿÿ’ÿëÎH&)šûr ³# +01ÿÿoþKÖñ&Iš� ³.+01ÿÿ’ÿëÎS&)œ£ ³% +01ÿÿoþKÖü&IœŠL ³0+01ÿÿ’ÿëÎ"&)�År ³! +01ÿÿoþKÖË&I�K ³,+01ÿÿ’þ-ÎÅ&)‘ÆþÈÿÿoþKÖQ&I¦_: ³0+01ÿÿ¿é3&*š] ³+01ÿÿžÚ2&Jš5\ ²+²?]01ÿÿÿ¾W2&+ ÿXU ³+01ÿÿÿ�&Ý&Š ÿ' ³+01ÿÿÿÆdú&+nÿ\J ³+01ÿÿÿ•3¥&Šnÿ+ÿõ ³+01ÿÿÿ÷6>&+œÿlŽ ³+01ÿÿÿÆç&Šœÿ;7 ³+01ÿÿCþx‰°&+Ÿèÿÿþx\&KŸ»ÿÿÈ_ &+�+] ³+01ÿÿÙÿëÛ°&+,*ÿÿ­þKü&KLÑÿÿMÿëˆ&,š½G ³+01ÿÿÿŒþKÊ&˜šÿ;ÿô ³+01ÿÿ¿þ9î°&-‘}þÔÿÿŸþ;â&M‘!þÖÿÿ±à&.s= ³ +01ÿÿŸ\&Ns+– ³+01ÿÿ¿þ;°&.‘{þÖÿÿ‚þ;$&N‘ÿõþÖÿÿ¿°&.‘¯°EX° /± >Y01ÿÿ­I&N‘"g°EX°/±>Y01ÿÿ¿°&.�Ãý¨°/01ÿÿ­M&N�ýµ°/01ÿÿ¿ï&0sY ³+01ÿÿžÙÝ&Psƒ ³+01ÿÿ¿þ;ï°&0‘àþÖÿÿžþ;ÙN&P‘KþÖÿÿ¿ï5&0›5_ ³+01ÿÿžÙó&P›  ³+01ÿÿÿðÙ&P‘ÿce°EX°/±>Y01ÿÿ|ÿëæ&1nó_ ³ +01ÿÿ[ÿë¸&Qn‹ ³+01ÿÿ|ÿëæS&1œ£ ³  +01ÿÿ[ÿëü&Qœ›L ³ +01ÿÿ|ÿëæ`&1¡^r³ +°°%Ð01ÿÿ[ÿë &Q¡ö³+°°%Ð01ÿÿ¼Ð&4s¥Y ³(+01ÿÿž·Ý&TsÞ ³ +01ÿÿ¼þ;Я&4‘mþÖÿÿyþ? N&T‘ÿìþÚÿÿ¼Ð5&4›Â_ ³)+01ÿÿ…·ó&T›ý ³ +01ÿÿ_ÿëx4&5s®n ³, +01ÿÿhÿë�Ý&UsI ³, +01ÿÿ_ÿëxH&5š¹r ³* +01ÿÿhÿë�ñ&UšT ³* +01ÿÿ_þExÅ&5w©ÿøÿÿhþH�N&UwDÿûÿÿ_þ'xÅ&5‘vþÂÿÿhþ*�N&U‘þÅÿÿ_ÿëxJ&5›Ët ³, +01ÿÿhÿë�ó&U›f ³, +01ÿÿ-þ5�°&6‘hþÐÿÿ&þ1qO&V‘ÔþÌÿÿ-þQ�°&6w›ÿÿ&þM¡O&Vwÿÿ-�0&6›¼Z ³ +01ÿÿ&ÿë‡&V‘`j°EX°/±>Y01ÿÿ§ÿë¹2&7 úU ³ +01ÿÿšÿë×Ý&W … ³+01ÿÿ§ÿë¹ú&7nþJ ³ +01ÿÿšÿë×¥&Wn‰ÿõ ³+01ÿÿ§ÿë¹>&7œŽ ³+01ÿÿšÿë×ç&Wœ™7 ³+01ÿÿ§ÿë¹h&7žc–³+°°!Ð01ÿÿšÿë×&Wžî?³+°°#Ð01ÿÿ§ÿë¹K&7¡i]³+°°Ð01ÿÿšÿë ô&W¡ô³+°°Ð01ÿÿ§þx¹°&7Ÿ±ÿÿšþx :&WŸkÿÿ9ê3&9šÝ] ³+01ÿÿAÄÜ&YšQ ³+01ÿÿ!º,&;š¸V ³ +01ÿÿ#þKÊÜ&[šN ³+01ÿÿ!ºÿ&;h�O³ +° ° Ð01ÿÿ_k&<s¢Y ³+01ÿÿZ­È&\sM ³+01ÿÿ_k &<�w] ³ +01ÿÿZ­¶&\�" ³ +01ÿÿ_k5&<›¿_ ³+01ÿÿZ­Þ&\›j ³+01ÿÿ&sûY ³+01ÿÿMÿëzÞ&„sœ ³G+01ÿÿ|ÿ¬æ]&�s— ³6+01ÿÿ[ÿtÜ&‡sL ³6+01ÿÿÿí�&ªÔÿpÿq²¿q²]²/q²ÿ]01ÿÿÿí�&ªÔÿpÿq²¿q²]²/q²ÿ]01ÿÿHÅ�&¹ÔKä² ]²P ]² ]01ÿÿ5[à&§BÇ ³ +01ÿÿ5[Ü&§s… ³+01ÿÿ5[ð&§š� ³+01ÿÿ5[ï&§ … ³+01ÿÿ5[Ã&§he³+°° Ð01ÿÿ5[%&§žîS³+°°Ð01ÿÿ5[à&§ÕúE²+°°а° Ð01ÿÿþH �&©wyÿûÿÿ¨¿à&«B  ³ +01ÿÿ¨¿Ü&«s^ ³+01ÿÿ¨¿ð&«ši ³+01ÿÿ¨¿Ã&«h>³+°° Ð01ÿÿÿÅ+à&¯Bÿh ³+01ÿÿ˜ýÜ&¯s$ ³+01ÿÿÿÑüð&¯šÿ1 ³+01ÿÿÿ¨+Ã&¯hÿ³+°°Ð01ÿÿ¨[ï&´ ­ ³+01ÿÿÿï@ð&µBÍ, ³ +01ÿÿÿï@ì&µs‹& ³  +01ÿÿÿï@&µš–* ³ +01ÿÿÿï@ÿ&µ ‹" ³ +01ÿÿÿï@Ó&µhk#³  +° °Ð01ÿÿœÿï]á&ºBú ³+01ÿÿœÿï]Ý&ºs¸ ³+01ÿÿœÿï]ñ&ºšÃ ³+01ÿÿœÿï]Ä&ºh˜³+°°Ð01ÿÿ-×&¾s] ³ +01ÿÿ5[·&§n‰ ³ +01ÿÿ5[û&§œ™K ³+01ÿÿ5þx��&§Ÿìÿÿÿï ì&©s~& ³! +01ÿÿÿï &©š‰* ³  +01ÿÿÿï Ú&©�S* ³ +01ÿÿÿï &©››, ³" +01ÿÿ¨ò&ª›E ³+01ÿÿ¨¿·&«nb ³ +01ÿÿ¨¿û&«œrK ³+01ÿÿ¨¿Ê&«�3 ³ +01ÿÿ¨þx¿�&«Ÿÿÿ¨¿ò&«›{ ³+01ÿÿÿï.&­š‚* ³# +01ÿÿÿï. &­œ‹[ ³% +01ÿÿÿï.Ú&­�L* ³! +01ÿÿþ..�&­‘\þÉÿÿ¨8ð&®šœ ³+01ÿÿÿŒ%ï&¯ ÿ& ³+01ÿÿÿ”2·&¯nÿ* ³+01ÿÿÿÅû&¯œÿ:K ³+01ÿÿþxW�&¯Ÿ¶ÿÿ˜/Ê&¯�û ³+01ÿÿOÿï$ß&°šY ³+01ÿÿ¨þ7�&±‘ þÒÿÿ™bÅ&²s%ÿ ³ +01ÿÿ¨þ9b�&²‘éþÔÿÿ¨b�&²‘$ݰEX° /± >Y01ÿÿ¨b�&²�5ý °/01ÿÿ¨[Ü&´s­ ³+01ÿÿ¨þ9[�&´‘uþÔÿÿ¨[ò&´›Ê ³+01ÿÿÿï@Ç&µn� ³ +01ÿÿÿï@ &µœŸ[ ³  +01ÿÿÿï@&µ¡ú*³% +°%°Ð01ÿÿ¨Ü&·s/ ³(+01ÿÿ¨þ9�&·‘÷þÔÿÿ¨ò&·›L ³)+01ÿÿiÿïõì&¸sm& ³, +01ÿÿiÿïõ&¸šx* ³* +01ÿÿiþHõ�&¸whÿûÿÿiÿïõ&¸›Š, ³, +01ÿÿHþ9Å�&¹‘ þÔÿÿHÅî&¹›` ³ +01ÿÿœÿï]ð&º ¸ ³ +01ÿÿœÿï]¸&ºn¼ ³ +01ÿÿœÿï]ü&ºœÌL ³ +01ÿÿœÿï]&&ºž!T³ +°°!Ð01ÿÿœÿï] &º¡'³+°°Ð01ÿÿœþx]�&ºŸ~ÿÿNÀð&¼šH ³+01ÿÿ-ë&¾šh ³ +01ÿÿ-¾&¾h=³ +° ° Ð01ÿÿKÙÜ&¿sB ³+01ÿÿKÙÊ&¿� ³ +01ÿÿKÙò&¿›_ ³+01ÿÿiÿïW�&¸¸bÿÿ ßQ&#©ÿÿÿô½S&'d©ÿ4ÿÿMS&*d©ÿQÿÿ!µQ&+d©ÿaÿÿ;ÿëúQ&1©ÿ{ÿÿÿ•Q&;d©þÕÿÿXÐQ&µ©˜ÿÿÿ°ÿë<S&¾ªÿ ÿ¸³+°°а°Ð01ÿÿ ß°#ÿÿ¿‡°$ÿÿ¿Y°'ÿÿ_k°<ÿÿ¿é°*ÿÿÙQ°+ÿÿ¿î°-ÿÿ¿0°/ÿÿ¿ï°0ÿÿ|ÿëæÅ1ÿÿ¿”°2ÿÿ-�°6ÿÿ!º°;ÿÿ;°°:ÿÿÿÚ]&+hÿ8V³+°°Ð01ÿÿ!ºÿ&;h�O³ +° ° Ð01ÿÿoÿëz+&¶©tÿÚ ³.+01ÿÿkÿîå*&º©*ÿÙ ³. +01ÿÿžþaÕ+&¼©EÿÚ ³+01ÿÿ¶ÿë<&¾©úÅ ³+01ÿÿ›ÿëóS&ƪP¸³+°°а°!Ð01ÿÿ¢:‹ÿÿ[ÿëNQÿÿ¢þ`Ó:tÿÿ,Ã:Xÿÿÿºÿë=°&¾hÿ³+°°Ð01ÿÿ›ÿëó°&Æh[³+°°Ð01ÿÿ[ÿë+&Q©IÿÚ ³+01ÿÿ›ÿëó&Æ©=ÿÅ ³+01ÿÿ„ÿëY&Ê©iÿÅ ³,(+01ÿÿ¿Y&'h�V³+°° Ð01ÿÿ»'&¬sªY ³ +01_ÿëxÅ']°EX° /± >Y°EX°/±>Y² 9° °а ±° +X!ØôY°±° +X!ØôY°°"а±%° +X!ØôY014&'&&54$32#4&#"#"$773326²ÝïöØánϱ¯Å¶ßëõþãÝÚþ»nþ¬­Õew—:<À£§Òú´’¼œtn“8<̧®ÎÛÒª¤˜ÿÿÙQ°+ÿÿÿÚ]&+hÿ8V³+°°Ð01ÿÿMÿë±°,ÿÿ¿î°-ÿÿ¿î&-s Y ³+01ÿÿ9ÿëË>&ڜێ ³+01ÿÿ ß°#ÿÿ¿‡°$ÿÿ»'°¬ÿÿ¿Y°'ÿÿ¿ï>&Øœ3Ž ³+01ÿÿ¿0°/ÿÿ¿é°*ÿÿ|ÿëæÅ1ÿÿ¿ê°±ÿÿ¿”°2ÿÿ„ÿë¬Å%ÿÿ-�°6ÿÿ;°°:ÿÿgÿëÈNCÿÿ\ÿëÐNGÿÿ¤Ûç&윑7 ³+01ÿÿ[ÿëNQÿÿ�þ`NRaÿëÍND°EX°/± >Y°EX°/±>Y±° +X!ØôY°°а°а±° +X!ØôY01%2653#"55432#4&#"/w¶jú¤ÝñòÛ²ík¯®§¦Pˆy–Ê/î*ì0Ò«‚›ù½*Àøÿÿ#þKÊ:[ÿÿ2´:Zÿÿ\ÿëÐÅ&GhS³$+°$°!Ð01ÿÿ£>È&èsë ³ +01ÿÿhÿë�NUÿÿ­$Kÿÿÿ©,°&Šhÿ³+°°Ð01ÿÿÿ�þK+Lÿÿ£Ç&ís\ ³+01ÿÿ#þKÊç&[œW7 ³+01ÿÿ9ê#&9B_ ³+01ÿÿAÄÌ&YBˆ ³+01ÿÿ9ê&9sÒY ³+01ÿÿAÄÈ&YsF ³+01ÿÿ9ê&9h²V³+°°Ð01ÿÿAİ&Yh&³+°°Ð01ÿÿ!º&;BïX ³ +01ÿÿ#þKÊÌ&[B… ³+01ÿÿtBâ °EX°/±>Y01ÿÿ;×°EX°/±>Y°EX° /± >Y01ÿÿžú°&ÎÿÿBÅ-&HN¡ÿÿÿŒþKÌ&˜›ÿMÿö ³+01ÿÿ[2h°EX°/±>Y01ÿÿ¿0&/s¿Y ³+01ÿÿ˜Ý&OsÕ ³*+01ÿÿ þŸß°&#¢KÿÿgþŸÈN&C¢«ÿÿÿQÿëæ|&1ÖþÓ· °$/°Ð01ÿÿBA-&H’¡ÿÿBf-&H'H¡NBÿÿ¿Y#&'Bò_ ³ +01ÿÿ¿ï#&ØBa_ ³ +01ÿÿ\ÿëÐâ&GBµ ³ +01ÿÿ¤ÛÌ&ìB¿ ³ +01ÿÿ| °´ÿÿyþE :ÉÿÿÏ=&§3O³+°°Ð01ÿÿ"&§Ð'³+°°Ð01ÿÿ[þK>N&Q[tÿÿ|þK ,Å&1[bÿÿ\þScÅ&×�Ÿÿ¶ÿÿdþT¢K&ë�5ÿ·ÿÿ„þS¬Å&%�Ýÿ¶ÿÿaþSÍN&E�Uÿ¶ÿÿ!º°;ÿÿ,þaÃ:¸ÿÿÙQ°+ÿÿî>&֜؎ ³ +01ÿÿüç&êœu7 ³+01ÿÿÙQ°+ÿÿ ß>&#œçŽ ³+01ÿÿgÿëÈý&CœtM ³0+01ÿÿ ß&#h³V³+°° Ð01ÿÿgÿëÈÅ&Ch@³0+°0°-Ð01ÿÿ°ÿÿMÿëzN„ÿÿ¿Y>&'œÄŽ ³+01ÿÿ\ÿëÐý&Gœ‡M ³$+01ÿÿ}ÿëØ&Bh¸(³$+°$°!Ð01ÿÿˆÿìüÄ&ChY³!+°!°$Ð01ÿÿî&Öh¤V³ +°°Ð01ÿÿü°&êhA³+°°Ð01ÿÿ\ÿëc&×h‰k³/(+°/°,Ð01ÿÿdÿî¢Ã&ëh³/(+°/°,Ð01ÿÿ¿ïú&Øn#J ³ +01ÿÿ¤ÛŸ&ìn�ÿï ³ +01ÿÿ¿ï&ØhÿV³+°° Ð01ÿÿ¤Û°&ìh]³+°° Ð01ÿÿ|ÿëæ&1hÏk³  +° °Ð01ÿÿ[ÿëÄ&Qhg³ +° °Ð01ÿÿ|ÿëæÅÿÿ[ÿëNÿÿ|ÿëæ&hëQ³$ +°$°!Ð01ÿÿ[ÿëà&hP0³$+°$°!Ð01ÿÿ¡ÿìÉ&ãhÕl³&+°&°#Ð01ÿÿpÿëÓÄ&ûhD³&+°&°#Ð01ÿÿ9ÿëËú&ÚnËJ ³+01ÿÿ#þKÊ¥&[nGõ ³+01ÿÿ9ÿëË&Úh§V³+°°Ð01ÿÿ#þKʰ&[h#³+°°Ð01ÿÿ9ÿëËK&Ú¡6]³+°°Ð01ÿÿ#þKÊô&[¡²³+°°Ð01ÿÿ­—&ÝhÑV³ +°°Ð01ÿÿnž°&õh³ +°°Ð01ÿÿ»î&â'+�h”V³ +°°Ð01ÿÿ©Q°&ú'Š1h=³ +°°Ð01ÿÿ;þKÖ°&:›«ÿÿ2þKñ:&Z›ÆÿÿoÿëÓFÿÿ)þKY°&Ù›.ÿÿ*þKS:&î›(ÿÿ þÅß°&#¨ãÿÿgþÅÈN&C¨Cÿÿ ß·&#¦Ø^ ³ +01ÿÿgÿëÈv&C¦e ³,+01ÿÿ ß®&#¤éM³+°°Ð01ÿÿgÿë?m&C¤v ³0+°0°8Ð01ÿÿ ߦ&#£ÛE³+°°Ð01ÿÿÿùÿëÈe&C£h³.+°.°5Ð01ÿÿ ßö&#¢ÛE³+°°Ð01ÿÿgÿë8µ&C¢h³.+°.°5Ð01ÿÿ ßõ&#¡Ú6³+°°Ð01ÿÿgÿëȶ&C¡g÷³.+°.°8Ð01ÿÿ þÅß3&#'šÞ]¨ã ³+01ÿÿgþÅÈò&C&šk¨C ³.+01ÿÿ ßË&# ÜT³+°°Ð01ÿÿgÿëÈŠ&C i³0+°0°?Ð01ÿÿ ß &#¥àz³+°°Ð01ÿÿgÿëÈË&C¥m9³0+°0°<Ð01ÿÿ ßO&#ŸàI³+°°Ð01ÿÿgÿëÈ&CŸm³0+°0°<Ð01ÿÿ ß&#žàQ³+°°Ð01ÿÿgÿëÈÓ&Cžm³0+°0°?Ð01ÿÿ þÅß>&#'œçŽ¨ã ³+01ÿÿgþÅÈý&C&œtM¨C ³0+01ÿÿ¿þÏY°&'¨· ÿÿ\þÇÐN&G¨�ÿÿ¿Y·&'¦µ^ ³ +01ÿÿ\ÿëÐv&G¦x ³ +01ÿÿ¿Y2&' °U ³+01ÿÿ\ÿëÐñ&G s ³#+01ÿÿ¿�®&'¤ÆM³+°°Ð01ÿÿ\ÿëRm&G¤‰ ³$+°$°,Ð01ÿÿIY¦&'£¸E³+°°Ð01ÿÿ ÿëÐe&G£{³"+°"°)Ð01ÿÿ¿ˆö&'¢¸E³+°°Ð01ÿÿ\ÿëKµ&G¢{³"+°"°)Ð01ÿÿ¿Yõ&'¡·6³+°°Ð01ÿÿ\ÿëж&G¡z÷³"+°"°,Ð01ÿÿ¿þÏY3&''š»]¨· ³+01ÿÿ\þÇÐò&G&š~¨� ³"+01ÿÿÈõ·&+¦[^ ³+01ÿÿ—Ä`&Ц* ³+01ÿÿÆþÉ]°&+¨]ÿÿ™þÏ0&K¨0 ÿÿ|þÂæÅ&1¨úÿýÿÿ[þ½N&Q¨Žÿøÿÿ|ÿëæÌ&1¦ôs ³ +01ÿÿ[ÿëu&Q¦Œ ³+01ÿÿ|ÿëæÃ&1¤b³  +° °(Ð01ÿÿ[ÿëfl&Q¤� ³ +° °(Ð01ÿÿ|ÿëæ»&1£÷Z³ +°°%Ð01ÿÿ ÿëd&Q£�³+°°%Ð01ÿÿ|ÿëæ &1¢÷Z³ +°°%Ð01ÿÿ[ÿë_´&Q¢�³+°°%Ð01ÿÿ|ÿëæ &1¡öK³ +°°(Ð01ÿÿ[ÿëµ&Q¡Žÿö³+°°(Ð01ÿÿ|þÂæH&1'šúr¨úÿý ³ +01ÿÿ[þ½ñ&Q'š’¨Žÿø ³+01ÿÿ‹ÿëü&”s V ³* +01ÿÿ[ÿëÙÝ&•s‡ ³*+01ÿÿ‹ÿëü &”BM\ ³& +01ÿÿ[ÿëÙá&•BÉ ³&+01ÿÿ‹ÿëü´&”¦[ ³& +01ÿÿ[ÿëÙu&•¦Œ ³&+01ÿÿ‹ÿëü/&”  R ³) +01ÿÿ[ÿëÙð&• ‡ ³)+01ÿÿ‹þÅüZ&”¨üÿÿ[þ½ÙØ&•¨Žÿøÿÿ§þù°&7¨ùÿþÿÿšþÅ×:&W¨Jÿÿ§ÿë¹·&7¦ÿ^ ³+01ÿÿšÿë×`&W¦Š ³+01ÿÿ§ÿë3&–sèY ³ +01ÿÿšÿëüÈ&—s… ³"+01ÿÿ§ÿë3#&–B*_ ³+01ÿÿšÿëüÌ&—BÇ ³+01ÿÿ§ÿë3·&–¦í^ ³+01ÿÿšÿëü`&—¦Š ³+01ÿÿ§ÿë32&– èU ³+01ÿÿšÿëüÝ&— … ³!+01ÿÿ§þÃ36&–¨èÿþÿÿšþÅü»&—¨Jÿÿ!þϺ°&;¨¶ ÿÿ#þ)Ê:&[¨ÿdÿÿ!º°&;¦²W ³ +01ÿÿ#þKÊ`&[¦H ³+01ÿÿ!º+&; ­N ³ +01ÿÿ#þKÊÝ&[ C ³+01oÿë„'‡°EX°/±>Y°EX°/± >Y°EX°/±>Y°EX°/±>Y²9°/²]±° +X!ØôY°в9²9°°а±° +X!ØôY°±$° +X!ØôY01##'#"5532!5!5333267&&#"„±j 6ªsÂÛÛÄq¦7þÄ:&è�eÿÿþ�°&Ö�ÿÿþ�:&ê� ÿÿ)þD‘Ã&<�Öÿ§ÿÿÿøþ\NN&=�òÿ¿ÿÿžÚJÿýx°d°EX°/±>Y°EX° /± >Y² 9°/²9°/±° +X!ØôY° а° а±° +X!ØôY° ±° +X!ØôY01!!2#!#5353!!2654&#aþÊlçúûæþ¶¶x6þÊlµ³³µgþÏÞ»¼ágfããþý•±‰ƒ®ÿýx°g°EX°/±>Y°EX° /± >Y² 9°/±° +X!ØôY² 9°/°° а° а±° +X!ØôY° ±° +X!ØôY01!!2#!#5353!!2654&#aþÊlçúûæþ¶¶x6þÊlµ³³µgþÏÞ»¼ágfããþý•±‰ƒ®+'° K°EX°/±>Y°EX°/±>Y² 9° /±° +X!ØôY°а °а± ° +X!ØôY01!##53!!!�þ£w��lý ]Ãý=Ãf‡fýß>: K°EX°/± >Y°EX°/±>Y² 9° /±° +X!ØôY°а °а± ° +X!ØôY01!##53!!!dþ·x££›ýÝIöþ öfÞgþ‰ÿ÷°„°EX° /± >Y°EX°/±>Y°EX°/±>Y°EX°/±>Y² 9°/²_]²/]´�]±° +X!ØôY² 9° /± ° +X!ØôY°а °в901###5353!!33#ÈwÜÜwþïÇ=‡ý¦…Ž­ýSœf®®fþvžý9ý! ös°EX°/± >Y°EX° /± >Y°EX°/±>Y°EX°/±>Y²9°/±° +X!ØôY² 9° /± ° +X!ØôY°а °в901###5353!!33#µŠx¨¨xDþ¼~’ŒþOÞ‰ýñØfÚÚfýžÄþý¸ÿÿ¿þàV>&Ø'œ3ŽGÿâ ³+01ÿÿ¤þàBç&ì'œ‘73ÿâ ³+01ÿÿ¿þàP°&*Aÿâÿÿ¤þàA:&ð2ÿâÿÿ¿þà—°&/ˆÿâÿÿ©þàœ:&ï�ÿâÿÿ)þàI°&Ù:ÿâÿÿ*þàC:&î4ÿâ!º°N°EX°/±>Y°EX°/±>Y°EX°/±>Y²Dq²9°/±° +X!ØôY° а° Ð0133##'#533lËþ-®èwýÂþ.‹‡)üÕf ýìf+,þaÃ:[°EX°/± >Y°EX°/± >Y°EX°/± >Y°EX°/±>Y°EX°/±>Y±° +X!ØôY²D q°аÐ01###5333733*öxöÜþŠ|*#&&|þŠÝþe›fØüÕ+ü(;°°`°EX° /± >Y°EX°/±>Y°EX°/±>Y°EX°/±>Y²9°/±° +X!ØôY²Jq°а° вA q01####53333¨ÐØ�þUþV‘×ÎÂþD‘™›‘þDĸýH‚ý~¸f’ý’nýn2´:`°EX° /± >Y°EX°/± >Y°EX°/±>Y°EX°/±>Y²9°/±° +X!ØôY²Mq°а° вA q01####53333$Î^ŒþÌþÌŽ^ÐËþ·�#%Žþ·ÈøþÍþ3øfÜþFºþ$ÿÿkÿîåKºÿÿ`°&(Ôÿ¢þtÿÿ¸®ðFˆ°ff@ž,°4°EX°/±>Y°EX°/±>Y²9°/°°° +XØÜY01#3#53 ww ŽŽÞÒúP§n +2 J ` l Œ ’ œ .¯*Ý  > E ] 0k E ,› Ç @ß  + &? \e TÁ    ! EFont data copyright Google 2012Roboto LightRegularGoogle:Roboto Light:2013Version 1.100141; 2013Roboto-LightRoboto is a trademark of Google.GoogleGoogle.comChristian RobertsonLicensed under the Apache License, Version 2.0http://www.apache.org/licenses/LICENSE-2.0Font data copyright Google 2012Roboto LightRegularGoogle:Roboto Light:2013Version 1.100141; 2013Roboto-LightRoboto is a trademark of Google.GoogleGoogle.comChristian RobertsonLicensed under the Apache License, Version 2.0http://www.apache.org/licenses/LICENSE-2.0RobotoLightÿjd  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`a£„…½–膎‹�©¤Šƒ“òó�—ˆÞñžªõôö¢�ð‘퉠긡î×âã°± ¦    ØáÛÜÝàÙß !"Ÿ#$%&'()*+,-›./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€�‚ƒ„…†‡ˆ‰Š‹Œ�Ž��‘’“”•–—˜™š›œ�žŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎϲ³ж·ÄÑ´µÅ‚‡ҫƾ¿¼ÓÔÕÖרÙÚŒÛÜÝÞߘš™ï¥’œ§�”•¹àÀáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-.¬/0é123­ÉÇ®bc4dËeÈÊÏÌÍÎfÓÐѯgÖÔÕhëjikmln5oqprsutvwxzy{}|~€�ìº6789:;ýþ<=>?ÿ@ABCDEFGHIJKLMøùNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€�ûü‚ƒäå„…†‡ˆ‰Š‹Œ�Ž��‘’“”•–—˜™»š›œ�æçžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€�‚ƒ„…†‡ˆ‰Š‹Œ�Ž��‘’“”•–—˜™š›œ�žŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ     ÷NULLmacronperiodcenteredHbar kgreenlandicEngenglongsOhornohornUhornuhornuni0237schwauni02F3 gravecomb acutecomb tildecombhookuni030Fdotbelowtonos dieresistonos anoteleiaGammaDeltaThetaLambdaXiPiSigmaPhiPsialphabetagammadeltaepsilonzetaetathetaiotalambdaxirhosigma1sigmatauupsilonphichipsiomegauni03D1uni03D2uni03D6uni0402uni0404uni0409uni040Auni040Buni040Funi0411uni0414uni0416uni0417uni0418uni041Buni0423uni0424uni0426uni0427uni0428uni0429uni042Auni042Buni042Cuni042Duni042Euni042Funi0431uni0432uni0433uni0434uni0436uni0437uni0438uni043Auni043Buni043Cuni043Duni043Funi0442uni0444uni0446uni0447uni0448uni0449uni044Auni044Buni044Cuni044Duni044Euni044Funi0452uni0454uni0459uni045Auni045Buni045Funi0460uni0461uni0463uni0464uni0465uni0466uni0467uni0468uni0469uni046Auni046Buni046Cuni046Duni046Euni046Funi0472uni0473uni0474uni0475uni047Auni047Buni047Cuni047Duni047Euni047Funi0480uni0481uni0482uni0483uni0484uni0485uni0486uni0488uni0489uni048Duni048Euni048Funi0490uni0491uni0494uni0495uni049Cuni049Duni04A0uni04A1uni04A4uni04A5uni04A6uni04A7uni04A8uni04A9uni04B4uni04B5uni04B8uni04B9uni04BAuni04BCuni04BDuni04C3uni04C4uni04C7uni04C8uni04D8uni04D9uni04E0uni04E1uni04FAuni04FBuni0500uni0502uni0503uni0504uni0505uni0506uni0507uni0508uni0509uni050Auni050Buni050Cuni050Duni050Euni050Funi0510uni2000uni2001uni2002uni2003uni2004uni2005uni2006uni2007uni2008uni2009uni200Auni200B underscoredbl quotereverseduni2025uni2074 nsuperiorlirapesetaEurouni2105uni2113uni2116 estimated oneeighth threeeighths fiveeighths seveneighths commaaccentuniFEFFuniFFFCuniFFFDX.smcp seven.smcp zero.lnumone.lnumlargerighthook cyrillichookcyrillichookleft cyrillicticbrevetildecomb brevehookcombbreveacutecombcircumflextildecombcircumflexhookcombcircumflexgravecombcircumflexacutecombbrevegravecombcommaaccentrotateA.smcpB.smcpC.smcpD.smcpE.smcpF.smcpG.smcpH.smcpI.smcpJ.smcpK.smcpL.smcpM.smcpN.smcpO.smcpQ.smcpR.smcpS.smcpT.smcpU.smcpV.smcpW.smcp three.lnumY.smcpZ.smcp zero.smcpone.smcptwo.smcp three.smcp four.smcp five.smcpsix.smcptwo.lnum eight.smcp nine.smcpone.suptwo.sup three.supfour.supfive.supsix.sup seven.sup eight.supnine.supzero.supcrossbar ringacute dasiaoxia four.lnum five.lnumsix.lnum seven.lnumg.alt eight.lnum nine.lnumP.smcp alpha.alt cyrillicbreveuni00ADDcroathbarTbartbar Aringacute aringacuteAmacronamacronAbreveabreveAogonekaogonek Ccircumflex ccircumflexuni010Auni010BDcarondcaronEmacronemacronEbreveebreve Edotaccent edotaccentEogonekeogonekEcaronecaron Gcircumflex gcircumflexuni0120uni0121 Gcommaaccent gcommaaccent Hcircumflex hcircumflexItildeitildeImacronimacronIbreveibreveIogonekiogonek IdotaccentIJij Jcircumflex jcircumflex Kcommaaccent kcommaaccentLacutelacute Lcommaaccent lcommaaccentLcaronlcaronLdotldotNacutenacute Ncommaaccent ncommaaccentNcaronncaron napostropheOmacronomacronObreveobreve Ohungarumlaut ohungarumlautRacuteracute Rcommaaccent rcommaaccentRcaronrcaronSacutesacute Scircumflex scircumflexuni0218uni0219uni0162uni0163uni021Auni021BTcarontcaronUtildeutildeUmacronumacronUbreveubreveUringuring Uhungarumlaut uhungarumlautUogonekuogonek Wcircumflex wcircumflex Ycircumflex ycircumflexZacutezacute Zdotaccent zdotaccentAEacuteaeacute Oslashacute oslashacute Dcroat.smcpEth.smcp Tbar.smcp Agrave.smcp Aacute.smcpAcircumflex.smcp Atilde.smcpAdieresis.smcp Aring.smcpAringacute.smcp Ccedilla.smcp Egrave.smcp Eacute.smcpEcircumflex.smcpEdieresis.smcp Igrave.smcp Iacute.smcpIcircumflex.smcpIdieresis.smcp Ntilde.smcp Ograve.smcp Oacute.smcpOcircumflex.smcp Otilde.smcpOdieresis.smcp Ugrave.smcp Uacute.smcpUcircumflex.smcpUdieresis.smcp Yacute.smcp Amacron.smcp Abreve.smcp Aogonek.smcp Cacute.smcpCcircumflex.smcp uni010A.smcp Ccaron.smcp Dcaron.smcp Emacron.smcp Ebreve.smcpEdotaccent.smcp Eogonek.smcp Ecaron.smcpGcircumflex.smcp Gbreve.smcp uni0120.smcpGcommaaccent.smcpHcircumflex.smcp Itilde.smcp Imacron.smcp Ibreve.smcp Iogonek.smcpIdotaccent.smcpJcircumflex.smcpKcommaaccent.smcp Lacute.smcpLcommaaccent.smcp Lcaron.smcp Ldot.smcp Nacute.smcpNcommaaccent.smcp Ncaron.smcp Omacron.smcp Obreve.smcpOhungarumlaut.smcp Racute.smcpRcommaaccent.smcp Rcaron.smcp Sacute.smcpScircumflex.smcp Scedilla.smcp Scaron.smcpTcommaaccent.smcp Tcaron.smcp Utilde.smcp Umacron.smcp Ubreve.smcp Uring.smcpUhungarumlaut.smcp Uogonek.smcpWcircumflex.smcpYcircumflex.smcpYdieresis.smcp Zacute.smcpZdotaccent.smcp Zcaron.smcpgermandbls.smcp Alphatonos EpsilontonosEtatonos Iotatonos Omicrontonos Upsilontonos OmegatonosiotadieresistonosAlphaBetaEpsilonZetaEtaIotaKappaMuNuOmicronRhoTauUpsilonChi IotadieresisUpsilondieresis alphatonos epsilontonosetatonos iotatonosupsilondieresistonoskappaomicronuni03BCnu iotadieresisupsilondieresis omicrontonos upsilontonos omegatonosuni0401uni0403uni0405uni0406uni0407uni0408uni041Auni040Cuni040Euni0410uni0412uni0413uni0415uni0419uni041Cuni041Duni041Euni041Funi0420uni0421uni0422uni0425uni0430uni0435uni0439uni043Euni0440uni0441uni0443uni0445uni0451uni0453uni0455uni0456uni0457uni0458uni045Cuni045EWgravewgraveWacutewacute Wdieresis wdieresisYgraveygraveminutesecond exclamdbluniFB02uni01F0uni02BCuni1E3Euni1E3Funi1E00uni1E01uni1F4DuniFB03uniFB04uni0400uni040Duni0450uni045Duni0470uni0471uni0476uni0477uni0479uni0478uni0498uni0499uni04AAuni04ABuni04AEuni04AFuni04C0uni04C1uni04C2uni04CFuni04D0uni04D1uni04D2uni04D3uni04D4uni04D5uni04D6uni04D7uni04DAuni04DBuni04DCuni04DDuni04DEuni04DFuni04E2uni04E3uni04E4uni04E5uni04E6uni04E7uni04E8uni04E9uni04EAuni04EBuni04ECuni04EDuni04EEuni04EFuni04F0uni04F1uni04F2uni04F3uni04F4uni04F5uni04F8uni04F9uni04FCuni04FDuni0501uni0512uni0513uni1EA0uni1EA1uni1EA2uni1EA3uni1EA4uni1EA5uni1EA6uni1EA7uni1EA8uni1EA9uni1EAAuni1EABuni1EACuni1EADuni1EAEuni1EAFuni1EB0uni1EB1uni1EB2uni1EB3uni1EB4uni1EB5uni1EB6uni1EB7uni1EB8uni1EB9uni1EBAuni1EBBuni1EBCuni1EBDuni1EBEuni1EBFuni1EC0uni1EC1uni1EC2uni1EC3uni1EC4uni1EC5uni1EC6uni1EC7uni1EC8uni1EC9uni1ECAuni1ECBuni1ECCuni1ECDuni1ECEuni1ECFuni1ED0uni1ED1uni1ED2uni1ED3uni1ED4uni1ED5uni1ED6uni1ED7uni1ED8uni1ED9uni1EDAuni1EDBuni1EDCuni1EDDuni1EDEuni1EDFuni1EE0uni1EE1uni1EE2uni1EE3uni1EE4uni1EE5uni1EE6uni1EE7uni1EE8uni1EE9uni1EEAuni1EEBuni1EECuni1EEDuni1EEEuni1EEFuni1EF0uni1EF1uni1EF4uni1EF5uni1EF6uni1EF7uni1EF8uni1EF9dcroatuni20ABuni049Auni049Buni04A2uni04A3uni04ACuni04ADuni04B2uni04B3uni04B6uni04B7uni04CBuni04CCuni04F6uni04F7uni0496uni0497uni04BEuni04BFuni04BBuni048Cuni0462uni0492uni0493uni049Euni049Funi048Auni048Buni04C9uni04CAuni04CDuni04CEuni04C5uni04C6uni04B0uni04B1uni04FEuni04FFuni0511uni2015ÿÿ 0DDFLTlatnÿÿÿÿkernkern 5à\©0Ö0Ö²1x0€12$25"5"2p4Ô0"5"5"2$0Š H Ê2”2p0Ü0°3„5D0^ 41ê12 v  2J10P –2v ô3æ2v1P41x2$1xÊ´¢€2v$.ðÊ´1®´®äv¨&3ì3ì85"Î À3„"þ5"5"1.5"5"#È3ì3ì%^& &®' 'æ3z(l3æ.¬(–)ü1,z,´.Š.Š1-Þ.`.Š.Š.Š1x2J0Ü2v.¬143z4Ô4Ô23z0Ö0Ö0Ö0Ö0Ö.Ö.è////0/Z/p/‚/”/º/À/Ö/à002$2$2”1x1x1x1x1x1x1x122225"5"5"5"5"2$2$2$2$2$2p2p2p2p5D1ê1ê1ê1ê1ê1ê1ê22222J2J2J2J2J2v2v1x1ê1x1ê1x1ê11112$22222222225"5"5"5"5"5"2p4Ô0"0"0"0"5"5"5"2$2J2$2J2$2J0P0P0P2”2”2”2p2p2p2p2p2p0°5D2v5D0^0^0^1x25"5"2$5D1x0€20^5"5"4Ô5"5"2$0Š2”5D3„5"5D2J2v2J245"5"2p4Ô4Ô1.1x0€425"5"2$0Š12”3„1ê22J12v3æ23z2v0°0°0°5D2v0Ö0Ö0Ö5"1x1ê2$220Ü2v15D2v5"3„3æ5"1x1ê1x1ê2223„3æ2$2J2J11.2v1.2v1.2v3„3æ1x1ê1x1ê1x1ê1x1ê1x1ê1x1ê1x1ê1x1ê1x1ê1x1ê1x1ê1x1ê22222222222222225"5"2$2J2$2J2$2J2$2J2$2J2$2J2$2J2J2p2p5D2v5D2v5D2v4Ô5"2”3„3æ43z3„3æ3ì44Ô5"5"5D© #$%&'(*+,-./012346789:;<=CDGHMQRTVXYZ[]ˆ™¬­®¯°²³´¶¸¹»¾¿ÀÂÄÅÇÈÉÊÎÐÑÒÓÔÕÖרÙÚÜÞßàâãäåæçèéêëíòóô÷øúûüÿ ()*-/CGghjkl–§ª¬±²µ¶·¹º»¼¾¿Þãäæèéêëìíîïðñòóôõö÷øùúûüýþÿ     !"#$%')+-/012345678ACEGIKNPRTVXZ\^abcdefhjlwy{}�ƒ…‡‰‹Œ�Ž�’ïðñòóô÷øùúûüýþÿ  !#$%'()*+,./1234:;=?ABCDHIKLMPRVW\^_`abcdefgjkmnovw{}~€�‚ƒˆ‰�Ž��‘’“”•–—˜™š›œ�žŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ·¹º»¼½¾¿ÀÁÂÃÄÅÆÎÑÓßàáâãäçéëíîóôõöûüþ89;‰‹�ô;=?AV^ßáãÿ Îÿÿ#ÿÅ,þø6CÿÞEÿëFÿëGÿëIÿëQÿëSÿëTÿæWÿêXÿè[ÿè‘ÿë•ÿë—ÿê­ÿůÿŶÿë¸ÿèÃÿëÄÿëÆÿêÎÒóÿëÿÿë ÿÅÿëÿèÿëÿë/6ÿë7CÿëIÿëJÿëTÿëiÿmÿqÿrÿ¨ÿÀèÿÅéÿÅêÿÅëÿÅìÿÅíÿÅîÿÅÿÞÿÞÿÞÿÞÿÞÿÞ ÿÞ ÿë ÿë ÿë ÿëÿëÿëÿëÿëÿëÿëÿêÿêÿêÿêÿèÿèÿÅ ÿÞ!ÿÅ"ÿÞ#ÿÅ$ÿÞ&ÿë(ÿë*ÿë,ÿë.ÿë0ÿë2ÿë4ÿë6ÿë8ÿë:ÿë<ÿë>ÿë@ÿëNþøbÿëdÿëfÿëwy{~ÿê€ÿê‚ÿê„ÿê†ÿêˆÿêŒÿèïÿÅ÷ÿÅÿë ÿê ÿëÿèÿêÿëÿêþøÿÅ)+ÿÞ,ÿë.ÿë0ÿë1ÿè3ÿë:ÿèBÿèKÿÅLÿÞRÿëWÿèXÿë]ÿë_ÿèdÿÅeÿÞfÿÅgÿÞkÿëmÿëwÿëyÿë{ÿëÿè�ÿèƒÿèŠÿë�ÿÅŽÿÞ�ÿÅ�ÿÞ‘ÿÅ’ÿÞ“ÿÅ”ÿÞ•ÿÅ–ÿÞ—ÿŘÿÞ™ÿÅšÿÞ›ÿÅœÿÞ�ÿÅžÿÞŸÿÅ ÿÞ¡ÿÅ¢ÿÞ£ÿŤÿÞ¦ÿë¨ÿëªÿë¬ÿë®ÿë°ÿë²ÿë´ÿëºÿë¼ÿë¾ÿëÀÿëÂÿëÄÿëÆÿëÈÿëÊÿëÌÿëÎÿëÐÿëÒÿêÔÿêÖÿêØÿêÚÿêÜÿêÞÿêàÿèâÿèäÿèë 6ÿÕ8ÿä9ÿì;ÿÝÎÿÕÒÿÕÿä/ÿÕ7ÿÕ¨ÿÝwÿÕyÿÕ{ÿÕ‰ÿì‹ÿÝ�ÿÝôÿÝÿÝÿÝ)ÿÕ;ÿì=ÿì?ÿìAÿÝVÿä^ÿÝßÿÝáÿÝãÿÝëÿÕÿÝ6ÿ°8ÿí;ÿÐÎÿ°Òÿ°ÿí/ÿ°7ÿ°ÿÐwÿ°yÿ°{ÿ°‹ÿÐ�ÿÐôÿÐÿÐÿÐ)ÿ°AÿÐVÿí^ÿÐßÿÐáÿÐãÿÐëÿ°ÿÐ,ÿî7ÿîþÿîÿÿîÿîÿîNÿî}ÿîÿî�ÿîƒÿî…ÿî‡ÿîÿîÑÿîÓÿîJ  ?EÿèFÿèGÿèIÿèSÿè_‘ÿè•ÿè¶ÿèÃÿèÄÿèóÿèÿÿèÿèÿè6ÿèCÿèIÿèJÿèTÿèghjkl ÿè ÿè ÿè ÿèÿè&ÿè(ÿè*ÿè,ÿè.ÿè0ÿè2ÿè4ÿè6ÿè8ÿè:ÿè<ÿè>ÿè@ÿèÿè,ÿè0ÿè3ÿèCDHRÿèXÿè]ÿèkÿèmÿèyÿèŠÿè¦ÿè¨ÿèªÿè¬ÿè®ÿè°ÿè²ÿè´ÿèÈÿèÊÿèÌÿèÐÿè=EÿìFÿìGÿìIÿìSÿì‘ÿì•ÿì¶ÿìÃÿìÄÿìóÿìÿÿìÿìÿì6ÿìCÿìIÿìJÿìTÿì ÿì ÿì ÿì ÿìÿì&ÿì(ÿì*ÿì,ÿì.ÿì0ÿì2ÿì4ÿì6ÿì8ÿì:ÿì<ÿì>ÿì@ÿìÿì,ÿì0ÿì3ÿìRÿìXÿì]ÿìkÿìmÿìyÿìŠÿì¦ÿì¨ÿìªÿì¬ÿì®ÿì°ÿì²ÿì´ÿìÈÿìÊÿìÌÿìÐÿìQÿìÿìÿìÿìÿìÿìÿìbÿìdÿìfÿì ÿìÿì.ÿìwÿì{ÿìºÿì¼ÿì¾ÿìÀÿìÂÿìÄÿìÆÿìÎÿìÿ„ÿ„iÿ„mÿ„qÿ„rÿ„,ÿì7ÿìþÿìÿÿìÿìÿìNÿì}ÿìÿì�ÿìƒÿì…ÿì‡ÿìÿìÑÿìÓÿìÿò ÿòXÿó[ÿó¸ÿóòÿõÿógÿòhÿòjÿòkÿòlÿòÿóÿóŒÿóÿó1ÿó:ÿóBÿóCÿòDÿòHÿòWÿó_ÿóÿó�ÿóƒÿóàÿóâÿóäÿó:%ÿó)ÿó1ÿó3ÿó�ÿó�ÿó”ÿó®ÿó¿ Ïÿóÿóÿóÿóÿóÿóÿó5ÿóSÿóïÿóùÿóúÿóûÿóüÿóýÿó%ÿó'ÿó)ÿó+ÿó9ÿó;ÿó=ÿó?ÿóaÿócÿóeÿó–ÿóóÿóÿó%ÿó(ÿóMÿóYÿó\ÿóvÿóxÿózÿó¹ÿó»ÿó½ÿó¿ÿóÁÿóÃÿóÅÿóÇÿóÉÿóËÿóÍÿóÏÿó;%ÿæ)ÿæ1ÿæ3ÿæ�ÿæ�ÿæ”ÿæ®ÿæ³ÿ¿Ïÿæÿæÿæÿæÿæÿæÿæ5ÿæSÿæïÿæùÿæúÿæûÿæüÿæýÿæ%ÿæ'ÿæ)ÿæ+ÿæ9ÿæ;ÿæ=ÿæ?ÿæaÿæcÿæeÿæ–ÿæóÿæÿæ%ÿæ(ÿæMÿæYÿæ\ÿævÿæxÿæzÿæ¹ÿæ»ÿæ½ÿæ¿ÿæÁÿæÃÿæÅÿæÇÿæÉÿæËÿæÍÿæÏÿæ7#ÿä:ÿÒ;ÿÓ­ÿä¯ÿä¿ÿâÖÿÒ ÿäèÿäéÿäêÿäëÿäìÿäíÿäîÿäÿÓÿä!ÿä#ÿä‹ÿÓ�ÿÓïÿäôÿÓ÷ÿäÿÓÿÒÿÓÿä*ÿÒAÿÓKÿä^ÿÓaÿÒdÿäfÿänÿÒˆÿÒ�ÿä�ÿä‘ÿä“ÿä•ÿä—ÿä™ÿä›ÿä�ÿäŸÿä¡ÿä£ÿäßÿÓáÿÓãÿÓíÿÒõÿÒÿÓ'ÿÿ#ÿÍ­ÿͯÿÍÂÿò ÿÍiÿmÿqÿrÿèÿÍéÿÍêÿÍëÿÍìÿÍíÿÍîÿÍÿÍ!ÿÍ#ÿÍïÿÍ÷ÿÍÿÍKÿÍdÿÍfÿÍ�ÿÍ�ÿÍ‘ÿÍ“ÿÍ•ÿÍ—ÿÍ™ÿÍ›ÿÍ�ÿÍŸÿÍ¡ÿÍ£ÿÍ¿ÅÿíÈÿì°EÿÜFÿÜGÿÜIÿÜOÿóPÿóQÿÖRÿóSÿÜWÿÝXÿá[ÿá‘ÿÜ•ÿÜ—ÿݶÿܸÿá¹ÿîºÿæ¼ÿó½ÿë¾ÿéÀÿðÁÿçÃÿÜÄÿÜÅÿãÆÿÝÇÿÎÉÿÔÊÿÛèÿóìÿóíÿóïÿóðÿóñÿóóÿÜôÿóöÿó÷ÿóúÿóüÿóÿÿÜÿóÿÖÿáÿÜÿÜ2ÿó6ÿÜAÿóCÿÜGÿóIÿÜJÿÜTÿÜ ÿÜ ÿÜ ÿÜ ÿÜÿÜÿóÿÖÿÖÿÖÿÖÿÖÿÝÿÝÿÝÿÝÿáÿá&ÿÜ(ÿÜ*ÿÜ,ÿÜ.ÿÜ0ÿÜ2ÿÜ4ÿÜ6ÿÜ8ÿÜ:ÿÜ<ÿÜ>ÿÜ@ÿÜ[ÿó]ÿó_ÿó`ÿóbÿÖdÿÖfÿÖ~ÿÝ€ÿÝ‚ÿÝ„ÿ݆ÿ݈ÿÝŒÿáÿÜ ÿó ÿÝ ÿÖÿáÿÝÿÖÿÝ,ÿÜ-ÿó.ÿÖ/ÿó0ÿÜ1ÿá3ÿÜ4ÿó9ÿó:ÿáBÿáJÿóRÿÜSÿóWÿáXÿÜ]ÿÜ_ÿákÿÜmÿÜsÿóuÿówÿÖyÿÜ{ÿÖÿá�ÿáƒÿá‡ÿóŠÿܦÿܨÿܪÿܬÿÜ®ÿܰÿܲÿÜ´ÿܺÿÖ¼ÿÖ¾ÿÖÀÿÖÂÿÖÄÿÖÆÿÖÈÿÜÊÿÜÌÿÜÎÿÖÐÿÜÒÿÝÔÿÝÖÿÝØÿÝÚÿÝÜÿÝÞÿÝàÿáâÿáäÿáèÿóêÿóôÿóÿóÿóÿóvÿÚ ÿÚEÿðFÿðGÿðIÿðSÿðWÿïXÿÜ[ÿÜ‘ÿð•ÿð—ÿï¶ÿð¸ÿܽÿì¿ÁÿêÃÿðÄÿðÅÿÜÆÿïÇÿçóÿðÿÿðÿÜÿðÿð6ÿðCÿðIÿðJÿðTÿðgÿÚhÿÚjÿÚkÿÚlÿÚ ÿð ÿð ÿð ÿðÿðÿïÿïÿïÿïÿÜÿÜ&ÿð(ÿð*ÿð,ÿð.ÿð0ÿð2ÿð4ÿð6ÿð8ÿð:ÿð<ÿð>ÿð@ÿð~ÿï€ÿï‚ÿï„ÿï†ÿïˆÿïŒÿÜÿð ÿïÿÜÿïÿï,ÿð0ÿð1ÿÜ3ÿð:ÿÜBÿÜCÿÚDÿÚHÿÚRÿðWÿÜXÿð]ÿð_ÿÜkÿðmÿðyÿðÿÜ�ÿ܃ÿÜŠÿð¦ÿð¨ÿðªÿð¬ÿð®ÿð°ÿð²ÿð´ÿðÈÿðÊÿðÌÿðÐÿðÒÿïÔÿïÖÿïØÿïÚÿïÜÿïÞÿïàÿÜâÿÜäÿÜ:ÿ  ÿ HÿéWÿñXÿÅ[ÿÅ—ÿñ¸ÿŽÿî¿ÁÿìÅÿ¾ÆÿñÈÿÚÿÅgÿ hÿ jÿ kÿ lÿ ÿñÿñÿñÿñÿÅÿÅ~ÿñ€ÿñ‚ÿñ„ÿñ†ÿñˆÿñŒÿÅ ÿñÿÅÿñÿñ1ÿÅ:ÿÅBÿÅCÿ Dÿ Hÿ WÿÅ_ÿÅÿÅ�ÿŃÿÅÒÿñÔÿñÖÿñØÿñÚÿñÜÿñÞÿñàÿÅâÿÅäÿÅ>EÿçFÿçGÿçIÿçSÿç‘ÿç•ÿç¶ÿç¿ÃÿçÄÿçóÿçÿÿçÿçÿç6ÿçCÿçIÿçJÿçTÿç ÿç ÿç ÿç ÿçÿç&ÿç(ÿç*ÿç,ÿç.ÿç0ÿç2ÿç4ÿç6ÿç8ÿç:ÿç<ÿç>ÿç@ÿçÿç,ÿç0ÿç3ÿçRÿçXÿç]ÿçkÿçmÿçyÿçŠÿç¦ÿç¨ÿçªÿç¬ÿç®ÿç°ÿç²ÿç´ÿçÈÿçÊÿçÌÿçÐÿçÅ ~ EÿèFÿèGÿèH IÿèQÿêSÿèX [ ‘ÿè•ÿè¶ÿè¸ ¹ÿíÁ ÃÿèÄÿèÅ óÿèÿÿèÿê ÿèÿè6ÿèCÿèIÿèJÿèTÿèg h j k l ¨ÿ¿ªÿî®ÿì¶ÿí·ÿì¹ÿõº¼ ¿  ÿè ÿè ÿè ÿèÿèÿêÿêÿêÿêÿê  &ÿè(ÿè*ÿè,ÿè.ÿè0ÿè2ÿè4ÿè6ÿè8ÿè:ÿè<ÿè>ÿè@ÿèbÿêdÿêfÿêŒ ÿè ÿê ÿê,ÿè.ÿê0ÿè1 3ÿè: B C D H RÿèW Xÿè]ÿè_ kÿèmÿèwÿêyÿè{ÿê � ƒ Šÿè¦ÿè¨ÿèªÿè¬ÿè®ÿè°ÿè²ÿè´ÿèºÿê¼ÿê¾ÿêÀÿêÂÿêÄÿêÆÿêÈÿèÊÿèÌÿèÎÿêÐÿèà â ä Zÿí\ÿíÈÿáêÿí�ÿí‘ÿí“ÿí2ÿíbÿíoÿí‰ÿíîÿíöÿíd EÿëFÿëGÿëH IÿëQÿéSÿë‘ÿë•ÿë¶ÿë¹ÿîºÿòÃÿëÄÿëÇÿñÈÊÿïóÿëÿÿëÿéÿëÿë6ÿëCÿëIÿëJÿëTÿëg h j k l  ÿë ÿë ÿë ÿëÿëÿéÿéÿéÿéÿé&ÿë(ÿë*ÿë,ÿë.ÿë0ÿë2ÿë4ÿë6ÿë8ÿë:ÿë<ÿë>ÿë@ÿëbÿédÿéfÿéÿë ÿéÿé,ÿë.ÿé0ÿë3ÿëC D H RÿëXÿë]ÿëkÿëmÿëwÿéyÿë{ÿéŠÿë¦ÿë¨ÿëªÿë¬ÿë®ÿë°ÿë²ÿë´ÿëºÿé¼ÿé¾ÿéÀÿéÂÿéÄÿéÆÿéÈÿëÊÿëÌÿëÎÿéÐÿë Zÿò\ÿòêÿò�ÿò‘ÿò“ÿò2ÿòbÿòoÿò‰ÿòîÿòöÿòXÿôZÿò[ÿô\ÿó¸ÿôêÿòÿôÿôÿôŒÿô�ÿó‘ÿó“ÿóÿô1ÿô2ÿò:ÿôBÿôWÿô_ÿôbÿòoÿòÿô�ÿôƒÿô‰ÿòàÿôâÿôäÿôîÿòöÿò„ÿÊ ÿÊ6ÿÒ8ÿÔ:ÿô;ÿÓOÿÑPÿÑRÿÑXÿæZÿï[ÿæ¸ÿæ¼ÿÑÎÿÒÒÿÒÖÿôÚÿíÝÿáâÿÔèÿÑêÿïìÿÑíÿÑïÿÑðÿÑñÿÑòÿÉôÿÑöÿÑ÷ÿÑúÿÑüÿÑÿÑÿåÿÔÿæÿã/ÿÒ0ÿÄ2ÿÑ7ÿÒ9ÿáAÿÑGÿÑKÿÔLÿõMÿçUÿÒVÿÉgÿÊhÿÊjÿÊkÿÊlÿÊÿÓÿÑÿæÿæ[ÿÑ]ÿÑ_ÿÑ`ÿÑwÿÒyÿÒ{ÿÒ‹ÿÓŒÿæ�ÿÓôÿÓÿÓÿôÿÓ ÿÑÿæÿí)ÿÒ*ÿô-ÿÑ/ÿÑ1ÿæ2ÿï4ÿÑ9ÿÑ:ÿæAÿÓBÿæCÿÊDÿÊHÿÊJÿÑSÿÑVÿÔWÿæ^ÿÓ_ÿæaÿôbÿïnÿôoÿïsÿÑuÿÑ~ÿíÿæ€ÿí�ÿæ‚ÿíƒÿæ„ÿá‡ÿшÿô‰ÿïßÿÓàÿæáÿÓâÿæãÿÓäÿæèÿÑêÿÑëÿÒíÿôîÿïïÿáñÿáôÿÑõÿôöÿïÿÑÿÑÿÑÿÓ%6ÿ¾Xÿï[ÿï¸ÿïÎÿ¾Òÿ¾âÿÉòÿßÿíÿïÿë/ÿ¾0ÿß7ÿ¾<ÿéLÿõVÿàÿïÿïwÿ¾yÿ¾{ÿ¾Œÿïÿï)ÿ¾1ÿï:ÿïBÿïWÿï_ÿïÿï�ÿïƒÿïàÿïâÿïäÿïëÿ¾<6ÿæ8ÿç:ÿò;ÿçZÿñÎÿæÒÿæÖÿòÚÿîÝÿèâÿæêÿñòÿÐÿç/ÿæ0ÿÎ7ÿæ9ÿèKÿçMÿíUÿæVÿÐÿçwÿæyÿæ{ÿæ‹ÿç�ÿçôÿçÿçÿòÿçÿî)ÿæ*ÿò2ÿñAÿçVÿç^ÿçaÿòbÿñnÿòoÿñ~ÿî€ÿî‚ÿî„ÿèˆÿò‰ÿñßÿçáÿçãÿçëÿæíÿòîÿñïÿèñÿèõÿòöÿñÿç�#%ÿè)ÿè1ÿè3ÿè6ÿà8ÿà;ÿß�ÿè�ÿè”ÿè­®ÿè¯ÎÿàÏÿèÐÒÿàÕÙÝÿáâÿàéîõÿàÿè ÿèÿàÿèÿèÿèÿè/ÿà5ÿè7ÿà9ÿá:ÿà=ÿáBÿéKÿßMÿÞOSÿèUÿßWÿòèéêëìíîïÿèùÿèúÿèûÿèüÿèýÿèÿß!#%ÿè'ÿè)ÿè+ÿè9ÿè;ÿè=ÿè?ÿèaÿècÿèeÿèwÿàyÿà{ÿà‹ÿß�ÿß–ÿèïóÿèôÿß÷ÿèÿßÿß%ÿè(ÿè)ÿàAÿßKMÿèVÿàYÿè\ÿè^ÿßdfvÿèxÿèzÿè„ÿá…ÿà‹Œ��‘“•—™›�Ÿ¡£¹ÿè»ÿè½ÿè¿ÿèÁÿèÃÿèÅÿèÇÿèÉÿèËÿèÍÿèÏÿèßÿßáÿßãÿßëÿàïÿáðÿàñÿáòÿàÿß2ÿò6ÿñ8ÿô:ÿô;ÿðÎÿñÐÿõÒÿñÖÿôÙÿõÚÿóâÿñÿô/ÿñ7ÿñKÿòMÿòOÿõUÿòÿðwÿñyÿñ{ÿñ‹ÿð�ÿðôÿðÿðÿôÿðÿó)ÿñ*ÿôAÿðVÿô^ÿðaÿônÿô~ÿó€ÿó‚ÿóˆÿô‹ÿõßÿðáÿðãÿðëÿñíÿôõÿôÿõÿðe#6ÿæ8ÿæ:;ÿæ­¯ÎÿæÐÒÿæÕÖÙÚ Ýÿåâÿæãÿôéîòÿçõÿè ÿæ/ÿæ0ÿç7ÿæ9ÿå:ÿèKÿæMÿæOUÿæVÿçèéêëìíîÿæ!#wÿæyÿæ{ÿæ‹ÿæ�ÿæïôÿæ÷ÿæÿæ )ÿæ*AÿæKVÿæ^ÿæadfn~ € ‚ „ÿå…ÿ舋Œ��‘“•—™›�Ÿ¡£ßÿæáÿæãÿæëÿæíïÿåðÿèñÿåòÿèõÿæ06ÿã:ÿå;ÿäÎÿãÐÿåÒÿãÕÿâÖÿåÙÿåÚÿéîÿêÿê/ÿã7ÿãOÿåUÿäÿäwÿãyÿã{ÿã‹ÿä�ÿäôÿäÿäÿåÿäÿé)ÿã*ÿåAÿä^ÿäaÿånÿå~ÿé€ÿé‚ÿéˆÿå‹ÿåŒÿêßÿäáÿäãÿäëÿãíÿåõÿåÿåÿêÿä#6ÿâ:ÿäÎÿâÐÿäÒÿâÕÿáÖÿäÙÿäÚÿééÿäîÿëÿë/ÿâ7ÿâOÿäwÿâyÿâ{ÿâÿäÿé)ÿâ*ÿäaÿänÿä~ÿé€ÿé‚ÿéˆÿä‹ÿäŒÿëëÿâíÿäõÿäÿäÿë6ÿë;ÿóÎÿëÒÿë/ÿë7ÿëÿówÿëyÿë{ÿë‹ÿó�ÿóôÿóÿóÿó)ÿëAÿó^ÿóßÿóáÿóãÿóëÿëÿó6OÿïPÿïRÿïZÿð¼ÿïèÿïéÿîêÿðìÿïíÿïïÿïðÿïñÿïòÿîôÿïöÿï÷ÿïúÿïüÿïÿïÿôÿñ0ÿï2ÿïAÿïGÿïVÿïÿï[ÿï]ÿï_ÿï`ÿï ÿï-ÿï/ÿï2ÿð4ÿï9ÿïJÿïSÿïbÿðoÿðsÿïuÿï‡ÿï‰ÿðèÿïêÿïîÿðôÿïöÿðÿïÿïÿï!ÿò ÿòXÿõ[ÿõ¸ÿõòÿôÿõÿõ0ÿõVÿõgÿòhÿòjÿòkÿòlÿòÿõÿõŒÿõÿõ1ÿõ:ÿõBÿõCÿòDÿòHÿòWÿõ_ÿõÿõ�ÿõƒÿõàÿõâÿõäÿõ éòÿíõÿíøÿâ0ÿí:ÿíVÿí…ÿíðÿíòÿíYEÿðFÿðGÿðIÿðQÿëSÿð‘ÿð•ÿð¶ÿðÃÿðÄÿðóÿðÿÿðÿëÿëÿðÿð6ÿðCÿðIÿðJÿðTÿðªÿë®ÿé¶ÿë·ÿë ÿð ÿð ÿð ÿðÿðÿëÿëÿëÿëÿë&ÿð(ÿð*ÿð,ÿð.ÿð0ÿð2ÿð4ÿð6ÿð8ÿð:ÿð<ÿð>ÿð@ÿðbÿëdÿëfÿëÿð ÿëÿë,ÿð.ÿë0ÿð3ÿðRÿðXÿð]ÿðkÿðmÿðwÿëyÿð{ÿëŠÿð¦ÿð¨ÿðªÿð¬ÿð®ÿð°ÿð²ÿð´ÿðºÿë¼ÿë¾ÿëÀÿëÂÿëÄÿëÆÿëÈÿðÊÿðÌÿðÎÿëÐÿðŸ CÿðEÿîFÿîGÿîH IÿîQÿÖSÿîX [ ‘ÿî•ÿî¶ÿî¸ ÃÿîÄÿîéÿªîÿ¯óÿîÿÿîÿ¯ÿÖ ÿâÿî ÿî6ÿîCÿîIÿîJÿîL N Tÿîg h j k l ¨ÿ¿ªÿî®ÿì¶ÿí·ÿì¹ÿõº¼ ¿ ÿðÿðÿðÿðÿðÿð ÿð ÿî ÿî ÿî ÿîÿîÿÖÿÖÿÖÿÖÿÖ   ÿð"ÿð$ÿð&ÿî(ÿî*ÿî,ÿî.ÿî0ÿî2ÿî4ÿî6ÿî8ÿî:ÿî<ÿî>ÿî@ÿîbÿÖdÿÖfÿÖŒ ÿî ÿÖ ÿÖ+ÿð,ÿî.ÿÖ0ÿî1 3ÿî: B C D H LÿðRÿîW Xÿî]ÿî_ eÿðgÿðkÿîmÿîwÿÖyÿî{ÿÖ � ƒ ŠÿîŒÿ¯Žÿð�ÿð’ÿð”ÿð–ÿð˜ÿðšÿðœÿðžÿð ÿð¢ÿð¤ÿð¦ÿî¨ÿîªÿî¬ÿî®ÿî°ÿî²ÿî´ÿîºÿÖ¼ÿÖ¾ÿÖÀÿÖÂÿÖÄÿÖÆÿÖÈÿîÊÿîÌÿîÎÿÖÐÿîà â ä ÿ¯éîòÿðõÿðý 0ÿð:ÿæVÿð…ÿðŒðÿðòÿðJE F G I S ‘ • ¶ Ã Ä é:îòÿãó õÿ÷ÿ   0ÿâ6 :ÿãC I J T Vÿã     & ( * , . 0 2 4 6 8 : < > @  , 0 3 R X ] k m y …ÿ÷Š Œ¦ ¨ ª ¬ ® ° ² ´ È Ê Ì Ð ðÿ÷òÿ÷ XÿôZÿð[ÿô¸ÿôéÿïêÿðîÿóÿóÿôÿôÿôŒÿôÿô1ÿô2ÿð:ÿôBÿôWÿô_ÿôbÿðoÿðÿô�ÿôƒÿô‰ÿðŒÿóàÿôâÿôäÿôîÿðöÿðÿó ÿÖ ÿÖgÿÖhÿÖjÿÖkÿÖlÿÖCÿÖDÿÖHÿÖòÿºÿÏÿÛ0ÿP:ÿ�LÿðNÿòVÿL ÿõ ÿõgÿõhÿõjÿõkÿõlÿõCÿõDÿõHÿõªÿí®ÿë¶ÿë·ÿë –ÿتÿò®ÿò¶ÿò·ÿòºÿÀ»ÿì¼ÿÇ¿ÿ¿–ÿõ¼ÿî¨ÿÒªÿë®ÿé¶ÿë·ÿë –ÿÕ¨ªÿð®ÿî¶ÿï·ÿðºÿ»»ÿì¼ÿ·¿ÿ´¨ÿóºÿî¼ÿñ¾ÿì¿ÿê–ÿñºÿé¼ÿë¿ÿå–ÿõºÿò¼ÿñ¿ÿî ¨ÿ¿ªÿî®ÿì¶ÿí·ÿì¹ÿõº¼ ¿ ¨ÿï¨ÿǪÿò®ÿð¶ÿð·ÿð¨ÿܺ – ¨ÿÀªÿí®ÿë¶ÿë·ÿ뺼¿¨ ªÿð®ÿð¶ÿð·ÿð¨ÿÕ Yÿ¤–ÿ‘¨ªÿó®ÿñ¶ÿò·ÿñºÿ;»ÿÚ¼ÿT¿ÿ?HV YYÿå³ÿËÉÿä¨ ªÿí®ÿë¶ÿì·ÿì Uÿæ VÿŸ¹ÿõ¿ÿÞÂÿåÕÿ¨éÿÊHÿã¨ÿÆ ? Tÿë_¨ÿ˪ÿé®ÿç¶ÿç·ÿçY ?Tÿâ_¨ÿ´ªÿÙ®ÿÙ¶ÿÙ·ÿÙ ÿæ?ÿô_ÿï=ÿíÅÿêÈÿèéÿîòÿë0ÿìVÿìÕÿ®âçÿàéÿ­ëÿÖùÿßýÿÒÿàÿÎ(ÿÝ*ÿâ.ÿà4ÿà:ÿé=ÿÚHÿ½RÿßU!ÿÃVÿïYÿß–ÿî³ÿå´ÿÑ¿ÅÿÈÕâÿÅòÿÊ0ÿŸ9ÿQ:ÿ{<ÿÊ=ÿÝBÿòKÿuMÿÊUÿOVÿŒ–ÿÝ®ÿõ¶ÿõºÿÇ»ÿñ¼ÿÍ¿ÿÄòÿðÿñÿó0ÿñLÿóNÿéVÿÓHÿîYÿê–ÿí¼ÿð¿ÿðòÿõ ÿß°ÿó²ÿð¿ÿêÕÿßâÿàUÿà¨ÿí¾ÿõ ÅÿêÈÿêéÿ¸òÿêÿðÿñ0ÿëLÿõVÿì¨ÿëH ¹ÿõÁ ÂÿêÅ éÿÈÿñ9TÿµYÿÇkþ¸zÿ(ÿM„ÿއÿ¡³ÿ®¹ÿɺÿ~¾ÿgÁÿ‡ÂÿeÅÿžÇÿjÈÿ©ÉÿsÊÿ^Õÿ¥âæÿäçÿ éÿtëÿ€òÿ²ùÿ}ûÿ€ýÿyÿ}ÿÿ˜ÿÚ(ÿ�*ÿ˜.ÿ}0ÿ³4ÿ :ÿ|<ÿš=ÿlBÿæHÿkLÿ’Nÿ­Rÿ{UVÿ‘Wÿò–ÿñ¨ÿ¯ªÿ¹®ÿ¹¶ÿ¹·ÿ¹¹ÿ¼ºÿñ¾ÿíéÿÉÿî³ÿÔ¹ÿð½ÿí¿ÅÿàÇÿçÉÿåÊÿîÕæÿéòÿ×0ÿ×:ÿÓ<ÿÖ=ÿÅBÿçK M VÿÖWÿòªÿé®ÿç¶ÿç·ÿéÿñ âÿÃòÿÏ0ÿÎ9ÿç<ÿßKÿÑMÿìUÿ VÿÑ0TÿmYÿŒký¿zþ}þ¼„ÿ+‡ÿK³ÿa¹ÿ�ºÿ¾þèÁÿÂþåÅÿFÇþíÈÿYÉþýÊþÙÕÿRâæÿ½çÿIéþþëÿòÿhùÿûÿýÿÿÿÿ<ÿ¬(ÿ*ÿ<.ÿ0ÿj4ÿI:ÿ <ÿ?=þñBÿÀHþïLÿ1Nÿ_Rÿ UVÿ0WÿÕYÿÁ³ÿÅÅÿ´æÿ×òÿ¹ÿ²ÿÒÿÈ0ÿ :ÿÅBÿäLÿÌNÿÌVÿËWÿïªÿè®ÿæ¶ÿç·ÿçÕé9ÿä:ÿå<ÿäKÿãMÿâUÿä$ÿâ  ÿÏ?HÿêTÿØVÿê_kÿ®zÿÍÿ „ÿÁ‡ÿÀ³ÿзÿê¹ÿîºÿÆ» ½ÿé¾ÿÖÁÿèÂÿºÅÿéÇÿËÈÿèÉÿÚÊÿÇpÿÓ–ÿó¨ÿ«ªÿÍ®ÿ˶ÿË·ÿ˺ÿó¾ÿïŠ X*!ÿ•ÿˆÿÎÿÅÿìÿÃÿ°ÿVÿˆÿôÿõÿÿïÿ©ÿ»ÿ¢ÿõÿÎ ÿÉÿ�ÿåÿèÿÉÿóÿãÿëÿåÿêÿÕÿáÿšÿêÿéÿíÿíÿïÿæÿãÿäÿäÿåÿêÿæÿéÿåÿáÿéÿØÿ£ÿÀÿvÿ¿þíÿÊÿQÿqÿÿÔÿ{ÿvÿõÿóÿóÿÉÿÙþ¼ÿáÿæÿ8ÿ±ÿ�ÿ�ÿ“ÿ�ÿŒÿäÿ¡ÿ¸ÿÄÿËÿ~ÿ|ÿ&ÿÿÿðÿ³ÿµÿÒÿÔÿÒÿóÿäÿõÿÿÛÿÕÿßÿáÿáÿíÿ…ÿÄÿæÿëÿçÿëÿáÿÑÿÒÿ¢ÿ·ÿ¿ÿØÿ¿ÿÆÿãÿ ÿÙÿìÿâÿ- ÿÌÿ ÿðÿé ÿëÿëÿæÿíÿåÿ½ÿñÿãÿõÿñÿòÿñÿõÿòÿóÿðÿìÿñÿðÿðÿëÿíÿìÿ…ÿñÿóÿñÿ×ÿ•ÿìÿìÿðÿðÿ>ÿ,ÿDÿ3ÿDÿ'ÿ½ÿKÿrÿ†ÿ’ÿÿ þzþbÿÑÿjÿÀþõÿÈÿ­ÿõÿçÿëÿðÿÉÿ¥ÿ‘ÿ½ÿšÿ½ÿÒÿéÿÊÿ»ÿéþmÿ‰ÿìÿìÿØÿyÿÝÿÙÿõw #'*2 6<CEGGJJORTT"XX#Z\$ˆˆ'¬¯(¸¸,¼¼-ÂÂ.ÐÑ/ÓÓ1ÖÖ2ØÚ3ÜÜ6ÞÞ7àà8ââ9èè:êê;óó<øø=úû>@B  CD(*G--J//KCCLGGMgmNqrUãäWææYèZ�-‡/8˜AC¢EE¥GG¦II§KK¨NN©PPªRR«TT¬VV­XX®Zf¯hh¼jj½ll¾ww¿yyÀ{{Á}}ÂÃ��ăƒÅ……Ƈ‡Ç‰‰È‹“ÉïôÒ÷Ø  è  éêëì!î#%ø',û.4:;== ?? AD HMPPRRVW\gjk&mo(vw+{{-}ƒ.ˆ‰5�µ7··`¹ÆaÎÎoÑÑpÓÓqßärççxééyëëzíî{óö}ùù�ûü‚þþ„…†‡M##$$%%&&''*+,,-- .. /01122 66 7788 99::;;<<CCDDEEGGJJOPQQRRTTXXZZ[[\\ˆˆ¬¬­­®®¯¯¸¸¼¼ÂÂÐÑÓÓÖÖØÙÚÚÜÜÞÞààââèèêêóóøø úú ûû     (())**-- // CCGGiimmqrãäææ èîïïðóôøùýþ      !!""##$$%%&&''(())**++,,--//001122334455667788AABBCCEEGGIIKKNNPP RR TT VV XX ZZ[[\\]]^^_`aabbccddeeffhhjjllww yy {{ }}��ƒƒ……‡‡‰‰‹‹ŒŒ��ŽŽ����‘‘’’““ïïððñòóóôô÷÷øøùùúúûüýý þÿ         !!#$%%'' (()) **++,,..//0011223344::;;==??AABBIIJJKKLLMMPPRRVV WW\\]]^^__``aabbccddeeffggjjkkmmnnoovvww{{}}~~€€��‚‚ƒƒˆˆ‰‰��ŽŽ����‘‘’’““””••––——˜˜™™šš››œœ��žžŸŸ  ¡¡¢¢££¤¤¥¥¦¦§§¨¨©©ªª««¬¬­­®®¯¯°°±±²²³³´´µµ··¹¹ºº»»¼¼½½¾¾¿¿ÀÀÁÁÂÂÃÃÄÄÅÅÆÆÎÎÑÑÓÓßßààááââããääçç ééëë ííîîóóôôõõööùùûûüüþþ î  "##$$%%&())*+,,-0112233445566 77 88 99 ::;; <<=BCCDDEGHHIIJNOPQQRRSSTTUUVVWWXXYYZZ[[\\]€��‚���‘‘’“””••––——˜¬­­®®¯¯°µ¶¶··¸¸¹»¼¼½ÂÃÄÅÅÆÆÇÍÎÎ ÏÏÐÐÑÑÒÒ ÓÕÖÖרÙÙÚÚÛÜÝÝÞçèèééêêëëìíîîïñòòóóôôõõö÷øùúúûûüüýþÿÿ    .// 012234556677 8@AABBCCDFGGHHIJKNOOPRSSTTUcdeffghiijlmmnpqrsáââãçèîïïðøùýþ      !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AMNNOZ[[\\]]^^_`aabbccddeeffglmmnnooppqqrrssttuuvvww xxyy zz{{ ||}} ~~ €€�� ‚‚ƒƒ „„…… ††‡‡ ˆˆ‰‰ ŠŠ‹‹ ŒŒ�� ŽŽ����‘‘’’““”•––—îïïðòóóôô õö÷÷øùúúûÿ            $%%&'(()) **++,,--..//0011223344556899::;; <<== >>?? @@AA BBCDEGHHIIJJKKLLMMNQRRSSTUVV WWXXYYZ[\\]]^^ __``aabbccddeeffgghjkkllmmnnooprssttuuvvwwxxyyzz{{|}~~€€��‚‚ƒƒ„„……††‡‡ˆˆ‰‰ŠŠ‹‹ŒŒ��ŽŽ����‘‘’’““””••––——˜˜™™šš››œœ��žžŸŸ  ¡¡¢¢££¤¤¥¥¦¦§§¨¨©©ªª««¬¬­­®®¯¯°°±±²²³³´´µ¸¹¹ºº»»¼¼½½¾¾¿¿ÀÀÁÁÂÂÃÃÄÄÅÅÆÆÇÇÈÈÉÉÊÊËËÌÌÍÍÎÎÏÏÐÐÑÑ ÒÒÓÓ ÔÔÕÕÖÖ×רØÙÙÚÚÛÛÜÜÝÝÞÞßß ààáá ââãã ääåçèèééêêëë ììííîîïïððññòòóóôôõõöö÷    HÊDFLTlatn&ÿÿ ÿÿ aaltVaaltVliga^liga^lnumdlnumdpnumjpnumjsmcppsmcppss01vss01vss02|ss02|vŒ¾Þ BVæðÀÁÂÃÄÅÆ—Èɧ¨©ª«¬­®¯°±²³´µÞ¶·¸¹º»¼–¾¿§¨©ª«¬®¯°±²³´µÞ¶·¸¹º»¼–¾¿î™ß˜™šš›œ�žŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ›œ�žŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µê¶¶··¸¸¹¹ºº¼¼½½¾¾¿¿ÀÀÁÁÂÂÃÃÄÄÆÆÇÇÈÈÉÉÊÊËËÌÍÍÎÎÏÏÐÐÑÑÒÒÓÓÔÔÕÕÖÖ×רØÙÙÚÚÛÛÜÜÝÝÞÞßßààááââããääååææççèèééêëëììíí˜#< CH$J\*ƒƒ=……>¶¶?——@ÀÆAÈÉHãäJæ(L+<�?K¡N_®arÀuxÒ{“ÖååïÒ­ÛÒæÀÁÂÃÄÅÆ—Èɧ¨©ª«¬­®¯°±²³´µÞ¶·¸¹º»¼–¾¿§¨©ª«¬­®¯°±²³´µÞ¶·¸¹º»¼–¾¿î™˜™šš›œ�žŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ›œ�žŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µê¶¶··¸¸¹¹ºº¼¼½½¾¾¿¿ÀÀÁÁÂÂÃÃÄÄÆÆÇÇÈÈÉÉÊÊËËÌÍÍÎÎÏÏÐÐÑÑÒÒÓÓÔÔÕÕÖÖ×רØÙÙÚÚÛÛÜÜÝÝÞÞßßààááââããääååææççèèééêëëììíí˜#< C\$ƒƒ>……?ãä@æ(B+<…?K—N_¤ar¶uxÈ{“Ìååå’KH ˜™Ç½×ØÙÚÜÝ ——ÀÆÈÉ’I)¶IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/lookAndFeel/IEM_LaF.h0000664002537200253720000013153015257173642030334 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once class LaF : public juce::LookAndFeel_V4 { public: const juce::Colour ClBackground = juce::Colour (0xFF2D2D2D); const juce::Colour ClFace = juce::Colour (0xFFD8D8D8); const juce::Colour ClFaceShadow = juce::Colour (0XFF272727); const juce::Colour ClFaceShadowOutline = juce::Colour (0xFF212121); const juce::Colour ClFaceShadowOutlineActive = juce::Colour (0xFF7C7C7C); const juce::Colour ClRotSliderArrow = juce::Colour (0xFF4A4A4A); const juce::Colour ClRotSliderArrowShadow = juce::Colour (0x445D5D5D); const juce::Colour ClSliderFace = juce::Colour (0xFF191919); const juce::Colour ClText = juce::Colour (0xFFFFFFFF); const juce::Colour ClTextTextboxbg = juce::Colour (0xFF000000); const juce::Colour ClSeperator = juce::Colour (0xFF979797); const juce::Colour ClWidgetColours[4] = { juce::Colour (0xFF00CAFF), juce::Colour (0xFF4FFF00), juce::Colour (0xFFFF9F00), juce::Colour (0xFFD0011B) }; juce::Typeface::Ptr robotoLight, robotoRegular, robotoMedium, robotoBold; //float sliderThumbDiameter = 14.0f; float sliderBarSize = 8.0f; LaF() { robotoLight = juce::Typeface::createSystemTypefaceFor ( BinaryData::RobotoLight_ttf, BinaryData::RobotoLight_ttfSize); //TODO: free this data robotoMedium = juce::Typeface::createSystemTypefaceFor (BinaryData::RobotoMedium_ttf, BinaryData::RobotoMedium_ttfSize); robotoBold = juce::Typeface::createSystemTypefaceFor (BinaryData::RobotoBold_ttf, BinaryData::RobotoBold_ttfSize); robotoRegular = juce::Typeface::createSystemTypefaceFor (BinaryData::RobotoRegular_ttf, BinaryData::RobotoRegular_ttfSize); // setColour (juce::Slider::rotarySliderFillColourId, juce::Colours::black); setColour (juce::Slider::thumbColourId, juce::Colour (0xCCFFFFFF)); setColour (juce::TextButton::buttonColourId, juce::Colours::black); setColour (juce::TextButton::textColourOnId, juce::Colours::white); setColour (juce::ResizableWindow::backgroundColourId, juce::Colour (0xFF2D2D2D)); setColour (juce::ScrollBar::thumbColourId, juce::Colours::steelblue); setColour (juce::ScrollBar::thumbColourId, juce::Colours::steelblue); setColour (juce::PopupMenu::backgroundColourId, juce::Colours::steelblue.withMultipliedAlpha (0.9f)); setColour (juce::ListBox::backgroundColourId, juce::Colours::steelblue.withMultipliedAlpha (0.1f)); setColour (juce::ListBox::outlineColourId, juce::Colours::steelblue.withMultipliedAlpha (0.3f)); setColour (juce::TooltipWindow::backgroundColourId, juce::Colours::steelblue.withMultipliedAlpha (0.9f)); setColour (juce::TableHeaderComponent::backgroundColourId, juce::Colours::lightgrey.withMultipliedAlpha (0.8f)); setColour (juce::TableHeaderComponent::highlightColourId, juce::Colours::steelblue.withMultipliedAlpha (0.3f)); } juce::Typeface::Ptr getTypefaceForFont (const juce::Font& f) override { switch (f.getStyleFlags()) { case 2: return robotoLight; case 1: return robotoBold; default: return robotoRegular; } } juce::Font getLabelFont (juce::Label& label) override { ignoreUnused (label); return juce::Font (juce::FontOptions (robotoMedium)); } juce::Font getPopupMenuFont() override { return withDefaultMetrics (juce::FontOptions (robotoRegular).withHeight (14.0f)); } juce::Font getTextButtonFont (juce::TextButton& button, int height) override { ignoreUnused (button, height); return withDefaultMetrics (juce::FontOptions (robotoMedium).withHeight (14.0f)); } juce::Font getAlertWindowMessageFont() override { return withDefaultMetrics (juce::FontOptions (robotoRegular).withHeight (14.0f)); } juce::Slider::SliderLayout getSliderLayout (juce::Slider& slider) override { // 1. compute the actually visible textBox size from the slider textBox size and some additional constraints int minXSpace = 0; int minYSpace = 0; juce::Slider::TextEntryBoxPosition textBoxPos = slider.getTextBoxPosition(); if (textBoxPos == juce::Slider::TextBoxLeft || textBoxPos == juce::Slider::TextBoxRight) minXSpace = 30; else minYSpace = 15; if (slider.getSliderStyle() == juce::Slider::IncDecButtons) minXSpace = 18; juce::Rectangle localBounds = slider.getLocalBounds(); const int textBoxWidth = juce::jmax (0, juce::jmin (slider.getTextBoxWidth(), localBounds.getWidth() - minXSpace)); const int textBoxHeight = juce::jmax ( 0, juce::jmin (slider.getTextBoxHeight(), localBounds.getHeight() - minYSpace)); juce::Slider::SliderLayout layout; // 2. set the textBox bounds if (textBoxPos != juce::Slider::NoTextBox) { if (slider.isBar()) { layout.textBoxBounds = localBounds; } else { layout.textBoxBounds.setWidth (textBoxWidth); layout.textBoxBounds.setHeight (textBoxHeight); if (textBoxPos == juce::Slider::TextBoxLeft) layout.textBoxBounds.setX (0); else if (textBoxPos == juce::Slider::TextBoxRight) layout.textBoxBounds.setX (localBounds.getWidth() - textBoxWidth); else /* above or below -> centre horizontally */ layout.textBoxBounds.setX ((localBounds.getWidth() - textBoxWidth) / 2); if (textBoxPos == juce::Slider::TextBoxAbove) layout.textBoxBounds.setY (0); else if (textBoxPos == juce::Slider::TextBoxBelow) layout.textBoxBounds.setY (localBounds.getHeight() - textBoxHeight); else /* left or right -> centre vertically */ layout.textBoxBounds.setY ((localBounds.getHeight() - textBoxHeight) / 2); } } // 3. set the slider bounds layout.sliderBounds = localBounds; if (slider.isBar()) { layout.sliderBounds.reduce (1, 1); // bar border } else { if (textBoxPos == juce::Slider::TextBoxLeft) layout.sliderBounds.removeFromLeft (textBoxWidth); else if (textBoxPos == juce::Slider::TextBoxRight) layout.sliderBounds.removeFromRight (textBoxWidth); else if (textBoxPos == juce::Slider::TextBoxAbove) layout.sliderBounds.removeFromTop (textBoxHeight); else if (textBoxPos == juce::Slider::TextBoxBelow) layout.sliderBounds.removeFromBottom (textBoxHeight); const int thumbIndent = getSliderThumbRadius (slider); if (slider.isHorizontal()) layout.sliderBounds.reduce (thumbIndent, 0); else if (slider.isVertical()) layout.sliderBounds.reduce (0, thumbIndent); } return layout; } void drawLabel (juce::Graphics& g, juce::Label& label) override { float alpha = label.isEnabled() ? 1.0f : 0.4f; g.fillAll (label.findColour (juce::Label::backgroundColourId)); juce::Rectangle bounds = label.getLocalBounds(); float x = (float) bounds.getX(); float y = (float) bounds.getY(); float w = (float) bounds.getWidth(); float h = (float) bounds.getHeight(); juce::Path p; p.addRoundedRectangle (x, y, w, h, h / 2.0f); g.setColour (ClTextTextboxbg.withMultipliedAlpha (alpha)); g.fillPath (p); if (! label.isBeingEdited()) { const float fontAlpha = label.isEnabled() ? 1.0f : 0.5f; const juce::FontOptions font (robotoLight); //g.setColour (ClText.withMultipliedAlpha (alpha)); g.setColour (ClText.withMultipliedAlpha (fontAlpha)); g.setFont (juce::FontOptions (robotoMedium)); g.setFont (13.f); juce::Rectangle textArea ( label.getBorderSize().subtractedFrom (label.getLocalBounds())); g.drawFittedText (label.getText(), textArea, label.getJustificationType(), juce::jmax (1, (int) (textArea.getHeight() / font.getHeight())), label.getMinimumHorizontalScale()); g.setColour ( label.findColour (juce::Label::outlineColourId).withMultipliedAlpha (fontAlpha)); } else if (label.isEnabled()) { g.setColour (label.findColour (juce::Label::outlineColourId)); } } void drawCornerResizer (juce::Graphics& g, int w, int h, bool /*isMouseOver*/, bool /*isMouseDragging*/) override { g.setColour (juce::Colours::white.withMultipliedAlpha (0.5f)); juce::Path triangle; triangle.startNewSubPath (w, h); triangle.lineTo (0.5f * w, h); triangle.lineTo (w, 0.5f * h); triangle.closeSubPath(); g.fillPath (triangle); } void fillTextEditorBackground (juce::Graphics& g, int width, int height, juce::TextEditor& textEditor) override { if (dynamic_cast (textEditor.getParentComponent()) != nullptr) { g.setColour (textEditor.findColour (juce::TextEditor::backgroundColourId)); g.fillRect (0, 0, width, height); g.setColour (textEditor.findColour (juce::TextEditor::outlineColourId)); g.drawHorizontalLine (height - 1, 0.0f, static_cast (width)); } else { juce::Path p; p.addRoundedRectangle (0, 0, width, height, 12.0f); //g.setColour (ClTextTextboxbg); g.setColour (textEditor.findColour (juce::TextEditor::backgroundColourId)); g.fillPath (p); } } void drawTextEditorOutline (juce::Graphics& g, int width, int height, juce::TextEditor& textEditor) override { if (dynamic_cast (textEditor.getParentComponent()) == nullptr) { if (textEditor.isEnabled()) { if (textEditor.hasKeyboardFocus (true) && ! textEditor.isReadOnly()) { g.setColour (juce::Colours::white.withMultipliedAlpha (0.8f)); g.drawRoundedRectangle (0.5, 0.5, width - 1, height - 1, (height - 1) / 2.0f, 0.8f); } else { g.setColour (juce::Colours::white.withMultipliedAlpha (0.8f)); g.drawRoundedRectangle (0, 0, width, height, height / 2.0f, 0); } } } } void drawTableHeaderBackground (juce::Graphics& g, juce::TableHeaderComponent& header) override { juce::Rectangle r (header.getLocalBounds()); auto outlineColour = header.findColour (juce::TableHeaderComponent::outlineColourId); g.setColour (outlineColour); g.fillRect (r.removeFromBottom (1)); g.setColour (header.findColour (juce::TableHeaderComponent::backgroundColourId)); g.fillRect (r); g.setColour (outlineColour); for (int i = header.getNumColumns (true); --i >= 0;) g.fillRect (header.getColumnPosition (i).removeFromRight (1)); } void drawTableHeaderColumn (juce::Graphics& g, juce::TableHeaderComponent& header, const juce::String& columnName, int /*columnId*/, int width, int height, bool isMouseOver, bool isMouseDown, int columnFlags) override { auto highlightColour = header.findColour (juce::TableHeaderComponent::highlightColourId); if (isMouseDown) g.fillAll (highlightColour); else if (isMouseOver) g.fillAll (highlightColour.withMultipliedAlpha (0.625f)); juce::Rectangle area (width, height); area.reduce (4, 0); if ((columnFlags & (juce::TableHeaderComponent::sortedForwards | juce::TableHeaderComponent::sortedBackwards)) != 0) { juce::Path sortArrow; sortArrow.addTriangle ( 0.0f, 0.0f, 0.5f, (columnFlags & juce::TableHeaderComponent::sortedForwards) != 0 ? -0.8f : 0.8f, 1.0f, 0.0f); g.setColour (juce::Colour (0x99000000)); g.fillPath (sortArrow, sortArrow.getTransformToScaleToFit ( area.removeFromRight (height / 2).reduced (2).toFloat(), true)); } g.setColour (header.findColour (juce::TableHeaderComponent::textColourId)); g.setFont (juce::FontOptions (robotoRegular)); g.setFont (height * 0.6f); g.drawFittedText (columnName, area, juce::Justification::centred, 1); } void drawLinearSlider (juce::Graphics& g, int x, int y, int width, int height, float sliderPos, float minSliderPos, float maxSliderPos, const juce::Slider::SliderStyle style, juce::Slider& slider) override { //g.fillAll (slider.findColour (juce::Slider::backgroundColourId)); //Label* l = createSliderTextBox(slider); //l->showEditor(); if (style == juce::Slider::LinearBar || style == juce::Slider::LinearBarVertical) { const float fx = (float) x, fy = (float) y, fw = (float) width, fh = (float) height; juce::Path p; if (style == juce::Slider::LinearBarVertical) p.addRectangle (fx, sliderPos, fw, 1.0f + fh - sliderPos); else p.addRectangle (fx, fy, sliderPos - fx, fh); juce::Colour baseColour ( slider.findColour (juce::Slider::rotarySliderFillColourId) .withMultipliedSaturation (slider.isEnabled() ? 1.0f : 0.5f) .withMultipliedAlpha (1.0f)); g.setColour (baseColour); g.fillPath (p); const float lineThickness = juce::jmin (15.0f, juce::jmin (width, height) * 0.45f) * 0.1f; g.drawRect (slider.getLocalBounds().toFloat(), lineThickness); } else { drawLinearSliderBackground (g, x, y, width, height, sliderPos, minSliderPos, maxSliderPos, style, slider); drawLinearSliderThumb (g, x, y, width, height, sliderPos, minSliderPos, maxSliderPos, style, slider); } } void drawLinearSliderBackground (juce::Graphics& g, int x, int y, int width, int height, float sliderPos, float minSliderPos, float maxSliderPos, const juce::Slider::SliderStyle style, juce::Slider& slider) override { const float sliderRadius = 8.f; //getSliderThumbRadius (slider) - 5.0f; juce::Path slbg; juce::Path clbar; juce::Colour statusColour = slider.findColour (juce::Slider::rotarySliderOutlineColourId) .withMultipliedAlpha (0.3f); const float min = static_cast (slider.getMinimum()); const float max = static_cast (slider.getMaximum()); const float zeroPos = -min / (max - min); bool isTwoValue = (style == juce::Slider::SliderStyle::TwoValueVertical || style == juce::Slider::SliderStyle::TwoValueHorizontal); if (slider.isHorizontal()) { const float iy = y + height * 0.5f - sliderRadius * 0.5f; juce::Rectangle r (x - sliderRadius * 0.5f, iy, width + sliderRadius, sliderRadius); slbg.addRoundedRectangle (r, sliderRadius / 2.0, sliderRadius / 2.0); if (isTwoValue) clbar.addRoundedRectangle ( juce::Rectangle (juce::Point (minSliderPos, iy), juce::Point (maxSliderPos, iy + sliderRadius)), sliderRadius / 2.0, sliderRadius / 2.0); else clbar.addRoundedRectangle ( juce::Rectangle (juce::Point (x + width * zeroPos, iy), juce::Point (sliderPos, iy + sliderRadius)), sliderRadius / 2.0, sliderRadius / 2.0); } else { const float ix = x + width * 0.5f - sliderRadius * 0.5f; juce::Rectangle r (ix, y - sliderRadius * 0.5f, sliderRadius, height + sliderRadius); slbg.addRoundedRectangle (r, sliderRadius / 2.0, sliderRadius / 2.0); clbar.addRoundedRectangle ( juce::Rectangle ( juce::Point (ix + 1.0f, y + height * (1.0f - zeroPos)), juce::Point (ix - 1.0f + sliderRadius, sliderPos)), sliderRadius / 2.0, sliderRadius / 2.0); } g.setColour (ClSliderFace); g.fillPath (slbg); g.setColour (statusColour); g.fillPath (clbar); g.setColour (ClFaceShadowOutline); g.strokePath (slbg, juce::PathStrokeType (1.0f)); } void drawRotarySlider (juce::Graphics& g, int x, int y, int width, int height, float sliderPos, float rotaryStartAngle, float rotaryEndAngle, juce::Slider& slider) override { drawRotarySliderDual (g, x, y, width, height, sliderPos, rotaryStartAngle, rotaryEndAngle, slider, false); } void drawRotarySliderDual (juce::Graphics& g, int x, int y, int width, int height, float sliderPos, float rotaryStartAngle, float rotaryEndAngle, juce::Slider& slider, bool isDual) { bool isEnabled = slider.isEnabled(); const float alpha = isEnabled ? 1.0f : 0.4f; const float radius = juce::jmin (width / 2, height / 2); const float centreX = x + width * 0.5f; const float centreY = y + height * 0.5f; const float rx = centreX - radius; const float ry = centreY - radius; const float rw = radius * 2.0f; const float min = static_cast (slider.getMinimum()); const float max = static_cast (slider.getMaximum()); const float zeroPos = -min / (max - min); const float zeroAngle = rotaryStartAngle + zeroPos * (rotaryEndAngle - rotaryStartAngle); const float angle = rotaryStartAngle + sliderPos * (rotaryEndAngle - rotaryStartAngle); const float negAngle = rotaryStartAngle + (2 * zeroPos - sliderPos) * (rotaryEndAngle - rotaryStartAngle); const float bedThickness = 2.0f; const float bedOutline = 1.4f; const float statusOutline = 1.6f; const float extraMargin = 1.0f; const float pointerThickness = 1.2f; const float pointerLength = (radius - extraMargin - statusOutline - bedOutline - bedThickness - 1.0f) * 0.8f; juce::Path p, q, a; juce::Rectangle r = juce::Rectangle (rx, ry, rw, rw); const bool isMouseOver = slider.isMouseOverOrDragging() && slider.isEnabled(); const juce::Colour statusColour = slider.findColour (juce::Slider::rotarySliderOutlineColourId); //status ring g.setColour (statusColour.withMultipliedAlpha (alpha)); a.addCentredArc (centreX, centreY, radius - extraMargin, radius - extraMargin, 0.0f, zeroAngle, angle, true); if (isDual) a.addCentredArc (centreX, centreY, radius - extraMargin, radius - extraMargin, 0.0f, negAngle, zeroAngle, true); g.strokePath (a, juce::PathStrokeType (statusOutline)); //bed ellipse g.setColour (ClFaceShadow); g.fillEllipse (r.reduced (extraMargin + statusOutline)); //(isMouseOver)?g.setColour(ClFaceShadowOutlineActive) : g.setColour (ClFaceShadowOutline); (isMouseOver) ? g.setColour (statusColour.withMultipliedAlpha (0.4f)) : g.setColour (ClFaceShadowOutline); g.drawEllipse (r.reduced (extraMargin + statusOutline), bedOutline); //knob g.setColour (ClFace.withMultipliedAlpha (alpha)); g.fillEllipse (r.reduced (extraMargin + statusOutline + bedOutline + bedThickness)); g.setColour (statusColour.withMultipliedAlpha (alpha)); g.drawEllipse (r.reduced (extraMargin + statusOutline + bedOutline + bedThickness), statusOutline); g.setColour (ClRotSliderArrowShadow.withMultipliedAlpha (alpha)); g.drawEllipse (r.reduced (extraMargin + statusOutline + bedOutline + bedThickness + 1.0f), 1.0f); q.addRectangle (pointerThickness * 0.3f, -radius + 6.0f, pointerThickness, pointerLength); q.applyTransform (juce::AffineTransform::rotation (angle).translated (centreX, centreY)); g.setColour (ClRotSliderArrowShadow.withMultipliedAlpha (alpha)); g.fillPath (q); p.addRectangle (-pointerThickness * 0.5f, -radius + 6.0f, pointerThickness, pointerLength); p.applyTransform (juce::AffineTransform::rotation (angle).translated (centreX, centreY)); g.setColour (ClRotSliderArrow.withMultipliedAlpha (alpha)); g.fillPath (p); } void drawLinearSliderThumb (juce::Graphics& g, int x, int y, int width, int height, float sliderPos, float minSliderPos, float maxSliderPos, const juce::Slider::SliderStyle style, juce::Slider& slider) override { const float sliderRadius = 7.0f; juce::Colour knobColour = slider.findColour (juce::Slider::rotarySliderOutlineColourId) .withMultipliedAlpha (slider.isEnabled() ? 1.0f : 0.7f); const float outlineThickness = slider.isEnabled() ? 1.9f : 0.3f; if (style == juce::Slider::LinearHorizontal || style == juce::Slider::LinearVertical) { float kx, ky; if (style == juce::Slider::LinearVertical) { kx = x + width * 0.5f; ky = sliderPos; } else { kx = sliderPos; ky = y + height * 0.5f; } drawRoundThumb (g, kx, ky, sliderRadius * 2.0f, knobColour, outlineThickness); } else if (style == juce::Slider::TwoValueVertical) { drawRoundThumb (g, juce::jmax (sliderRadius, x + width * 0.5f), minSliderPos, sliderRadius * 2.0f, knobColour, outlineThickness); drawRoundThumb (g, juce::jmax (sliderRadius, x + width * 0.5f), maxSliderPos, sliderRadius * 2.0f, knobColour, outlineThickness); } else if (style == juce::Slider::TwoValueHorizontal) { drawRoundThumb (g, minSliderPos, juce::jmax (sliderRadius, y + height * 0.5f), sliderRadius * 2.0f, knobColour, outlineThickness); drawRoundThumb (g, maxSliderPos, juce::jmax (sliderRadius, y + height * 0.5f), sliderRadius * 2.0f, knobColour, outlineThickness); } else { // Just call the base class for the demo LookAndFeel_V2::drawLinearSliderThumb (g, x, y, width, height, sliderPos, minSliderPos, maxSliderPos, style, slider); } } void drawRoundThumb (juce::Graphics& g, const float centreX, const float centreY, const float diameter, const juce::Colour& colour, float outlineThickness) { // const juce::Rectangle a (x, y, diameter, diameter); const float newDiameter = (diameter - outlineThickness); const float halfThickness = newDiameter * 0.5f; juce::Path p; p.addEllipse (centreX - halfThickness, centreY - halfThickness, newDiameter, newDiameter); g.setColour (ClFace); g.fillPath (p); g.setColour (colour); g.strokePath (p, juce::PathStrokeType (outlineThickness)); g.setColour (ClRotSliderArrowShadow); g.drawEllipse (centreX + 1.0f - halfThickness, centreY + 1.0f - halfThickness, diameter - outlineThickness - 1.0f, diameter - outlineThickness - 1.0f, 1.4f); } juce::Button* createSliderButton (juce::Slider&, const bool isIncrement) override { return new juce::TextButton (isIncrement ? "+" : "-", juce::String()); //return new ArrowButton (juce::String(),isIncrement ? 0.75 : 0.25f,juce::Colours::white); } void drawButtonBackground (juce::Graphics& g, juce::Button& button, const juce::Colour& backgroundColour, bool isMouseOverButton, bool isButtonDown) override { juce::Rectangle buttonArea (0.0f, 0.0f, button.getWidth(), button.getHeight()); buttonArea.reduce (1.0f, 1.0f); g.setColour (backgroundColour); if (isButtonDown) buttonArea.reduce (0.8f, 0.8f); else if (isMouseOverButton) buttonArea.reduce (0.4f, 0.4f); g.drawRoundedRectangle (buttonArea, 2.0f, 1.0f); buttonArea.reduce (1.5f, 1.5f); g.setColour (backgroundColour.withMultipliedAlpha (isButtonDown ? 1.0f : isMouseOverButton ? 0.5f : 0.2f)); g.fillRoundedRectangle (buttonArea, 2.0f); } void drawButtonText (juce::Graphics& g, juce::TextButton& button, bool /*isMouseOverButton*/, bool /*isButtonDown*/) override { juce::Font font (getTextButtonFont (button, button.getHeight())); g.setFont (font); g.setColour (button .findColour (button.getToggleState() ? juce::TextButton::textColourOnId : juce::TextButton::textColourOffId) .withMultipliedAlpha (button.isEnabled() ? 1.0f : 0.5f)); const int yIndent = juce::jmin (4, static_cast (std::ceil (button.getHeight() * 0.30f))); // const int yIndent = 8; const int cornerSize = juce::jmin (button.getHeight(), button.getWidth()) / 2; const int fontHeight = static_cast (std::ceil (font.getHeight() * 0.6f)); const int leftIndent = juce::jmin (fontHeight, 2 + cornerSize / (button.isConnectedOnLeft() ? 4 : 2)); const int rightIndent = juce::jmin (fontHeight, 2 + cornerSize / (button.isConnectedOnRight() ? 4 : 2)); const int textWidth = button.getWidth() - leftIndent - rightIndent; if (textWidth > 0) g.drawFittedText (button.getButtonText(), leftIndent, yIndent, textWidth, button.getHeight() - yIndent * 2, juce::Justification::centred, 2); } void drawToggleButton (juce::Graphics& g, juce::ToggleButton& button, bool isMouseOverButton, bool isButtonDown) override { if (button.getButtonText() == "ON/OFF") { juce::Colour baseColour ( juce::Colours::black .withMultipliedSaturation (button.hasKeyboardFocus (true) ? 1.3f : 0.9f) .withMultipliedAlpha (button.isEnabled() ? 1.0f : 0.5f)); const float width = button.getWidth(); const float height = button.getHeight(); bool isOn = button.getToggleState(); const float cornerSize = juce::jmin (15.0f, juce::jmin (width, height) * 0.45f); juce::Path outline; outline.addRoundedRectangle (0.5f, 0.5f, width - 1, height - 1, cornerSize, cornerSize); g.setColour (baseColour); g.fillPath (outline); if (isMouseOverButton) { g.setColour (button.findColour (juce::ToggleButton::tickColourId) .withMultipliedAlpha (isButtonDown ? 0.8f : 0.4f)); g.strokePath (outline, juce::PathStrokeType (isButtonDown ? 1.0f : 0.8f)); } g.setFont (juce::FontOptions (robotoMedium)); g.setFont (height - 1); g.setColour (isOn ? button.findColour (juce::ToggleButton::tickColourId) : juce::Colours::white); g.drawText (isOn ? "ON" : "OFF", 0, 0, static_cast (width), static_cast (height), juce::Justification::centred); } else { const auto fontSize = juce::jmin (15.0f, button.getHeight() * 0.75f); const auto tickWidth = fontSize * 1.1f; drawTickBox (g, button, 4.0f, (button.getHeight() - tickWidth) * 0.5f, tickWidth, tickWidth, button.getToggleState(), button.isEnabled(), isMouseOverButton, isButtonDown); g.setColour (button.findColour (juce::ToggleButton::textColourId)); g.setFont (fontSize); if (! button.isEnabled()) g.setOpacity (0.5f); g.setFont (juce::FontOptions (robotoMedium)); g.drawFittedText (button.getButtonText(), button.getLocalBounds() .withTrimmedLeft (juce::roundToInt (tickWidth) + 10) .withTrimmedRight (2), juce::Justification::centredLeft, 10); } } void drawTickBox (juce::Graphics& g, juce::Component& component, float x, float y, float w, float h, bool ticked, bool isEnabled, bool isMouseOverButton, bool isButtonDown) override { juce::ignoreUnused (isEnabled); const float boxSize = w * 0.8f; juce::Rectangle buttonArea (x + (w - boxSize) * 0.5f, y + (h - boxSize) * 0.5f, boxSize, boxSize); g.setColour (component.findColour (juce::ToggleButton::tickColourId) .withMultipliedAlpha (ticked ? 1.0f : isMouseOverButton ? 0.7f : 0.5f)); if (isButtonDown) buttonArea.reduce (0.8f, 0.8f); else if (isMouseOverButton) buttonArea.reduce (0.4f, 0.4f); g.drawRoundedRectangle (buttonArea, 2.0f, 1.0f); buttonArea.reduce (1.5f, 1.5f); g.setColour (component.findColour (juce::ToggleButton::tickColourId) .withMultipliedAlpha (ticked ? 1.0f : isMouseOverButton ? 0.5f : 0.2f)); g.fillRoundedRectangle (buttonArea, 2.0f); } juce::Path getTickShape (const float height) override { juce::Path p; juce::Path stroke; stroke.addRoundedRectangle (juce::Rectangle (-1.0f, -5.0f, 2.0f, 10.0f), 0.1f, 0.1f); p.addPath (stroke, juce::AffineTransform().rotation (0.25f * juce::MathConstants::pi)); p.addPath (stroke, juce::AffineTransform().rotation (-0.25f * juce::MathConstants::pi)); p.scaleToFit (0, 0, height * 2.0f, height, true); return p; } void drawGroupComponentOutline (juce::Graphics& g, int width, int height, const juce::String& text, const juce::Justification& position, juce::GroupComponent& group) override { ignoreUnused (height, group); juce::Rectangle r (6, 0, width - 6, 15); g.setColour (ClText); g.setFont (juce::FontOptions (robotoMedium)); g.setFont (18.0f); g.drawFittedText (text, r, position, 1, 0.f); g.setColour (ClSeperator); g.drawLine (0, 18, width, 18, .8f); } void positionComboBoxText (juce::ComboBox& box, juce::Label& label) override { label.setBounds (0, 0, box.getWidth() - box.getHeight(), box.getHeight()); label.setFont (getLabelFont (label)); } void drawComboBox (juce::Graphics& g, int width, int height, bool isButtonDown, int buttonX, int buttonY, int buttonW, int buttonH, juce::ComboBox& box) override { juce::ignoreUnused (width, height, isButtonDown); juce::Rectangle buttonArea (buttonX, buttonY, buttonW, buttonH); juce::Path path; path.startNewSubPath (buttonX + 3.0f, buttonArea.getCentreY() - 2.0f); path.lineTo (buttonArea.getCentreX(), buttonArea.getCentreY() + 3.0f); path.lineTo (buttonArea.getRight() - 3.0f, buttonArea.getCentreY() - 2.0f); g.setColour (juce::Colours::white.withAlpha ((box.isEnabled() ? 0.9f : 0.2f))); g.strokePath (path, juce::PathStrokeType (2.0f)); } void drawPopupMenuSectionHeader (juce::Graphics& g, const juce::Rectangle& area, const juce::String& sectionName) override { g.setFont (juce::FontOptions (robotoBold)); g.setFont (18.0f); g.setColour (findColour (juce::PopupMenu::headerTextColourId)); g.drawFittedText (sectionName, area.getX() + 12, area.getY(), area.getWidth() - 16, (int) (area.getHeight() * 0.8f), juce::Justification::bottomLeft, 1); } void drawPopupMenuItem (juce::Graphics& g, const juce::Rectangle& area, const bool isSeparator, const bool isActive, const bool isHighlighted, const bool isTicked, const bool hasSubMenu, const juce::String& text, const juce::String& shortcutKeyText, const juce::Drawable* icon, const juce::Colour* const textColourToUse) override { if (isSeparator) { juce::Rectangle r (area.reduced (5, 0)); r.removeFromTop (r.getHeight() / 2 - 1); g.setColour (juce::Colour (0x33000000)); g.fillRect (r.removeFromTop (1)); g.setColour (juce::Colour (0x66ffffff)); g.fillRect (r.removeFromTop (1)); } else { juce::Colour textColour (findColour (juce::PopupMenu::textColourId)); if (textColourToUse != nullptr) textColour = *textColourToUse; juce::Rectangle r (area.reduced (1)); if (isHighlighted) { g.setColour (findColour (juce::PopupMenu::highlightedBackgroundColourId)); g.fillRect (r); g.setColour (findColour (juce::PopupMenu::highlightedTextColourId)); } else { g.setColour (textColour); } if (! isActive) g.setOpacity (0.3f); juce::Font font (getPopupMenuFont()); const float maxFontHeight = area.getHeight() / 1.3f; if (font.getHeight() > maxFontHeight) font.setHeight (maxFontHeight); g.setFont (font); juce::Rectangle iconArea ( r.removeFromLeft ((r.getHeight() * 5) / 4).reduced (3).toFloat()); if (icon != nullptr) { icon->drawWithin (g, iconArea, juce::RectanglePlacement::centred | juce::RectanglePlacement::onlyReduceInSize, 1.0f); } else if (isTicked) { const juce::Path tick (getTickShape (1.0f)); g.fillPath (tick, tick.getTransformToScaleToFit (iconArea, true)); } if (hasSubMenu) { const float arrowH = 0.6f * getPopupMenuFont().getAscent(); const float x = (float) r.removeFromRight ((int) arrowH).getX(); const float halfH = (float) r.getCentreY(); juce::Path p; p.addTriangle (x, halfH - arrowH * 0.5f, x, halfH + arrowH * 0.5f, x + arrowH * 0.6f, halfH); g.fillPath (p); } r.removeFromRight (3); g.drawFittedText (text, r, juce::Justification::centredLeft, 1); if (shortcutKeyText.isNotEmpty()) { juce::Font f2 (font); f2.setHeight (f2.getHeight() * 0.75f); f2.setHorizontalScale (0.95f); g.setFont (f2); g.drawText (shortcutKeyText, r, juce::Justification::centredRight, true); } } } void drawCallOutBoxBackground (juce::CallOutBox& box, juce::Graphics& g, const juce::Path& path, juce::Image& cachedImage) override { if (cachedImage.isNull()) { cachedImage = { juce::Image::ARGB, box.getWidth(), box.getHeight(), true }; juce::Graphics g2 (cachedImage); juce::DropShadow (juce::Colours::black.withAlpha (0.7f), 8, { 0, 2 }) .drawForPath (g2, path); } g.setColour (juce::Colours::black); g.drawImageAt (cachedImage, 0, 0); g.setColour (ClBackground.withAlpha (0.8f)); g.fillPath (path); g.setColour (juce::Colours::white.withAlpha (0.8f)); g.strokePath (path, juce::PathStrokeType (1.0f)); } }; ././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/lookAndFeel/Roboto-Bold.ttfIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/lookAndFeel/Roboto-Bold.tt0000664002537200253720000041121415257173642031522 0ustar zmoelnigzmoelnigGPOSè„Õ—¾(OGSUB8‚ @JLTSHFG"× OS/2ºód˜`cmap$(3¾0¼cvt �µˆˆ˜ˆžˆYcªˆYš‘:+ˆTˆûˆªˆw\6ˆ™\JˆU‘x ¶M:w_: €,’¦ML7„p$>„C<MÜ„C„i#ÿžIp#ìp„k„C„p„CÍp :Ë „iãK¤0­¤"/iþDŽ�HÀ\‰På^BœFV�pbi~!qFV”~MZ\fXY×lð‹6=kŸ%a=N©vfÕ§§µi K      …]˜ˆ˜ˆ˜ˆ˜ˆYÿÆY˜YÿÀYÿ¯\ªˆw\w\w\w\w\@@‚\xxxx ß„‡L7L7L7L7L7L7Á.$><M<M<M<M2ÿ²2„2ÿ¬2ÿ›Â0„k„C„C„C„C„C�?„C„i„i„i„iŠy L7 L7 L7]$>]$>]$>]$>>ˆC\¢C˜ˆ<M˜ˆ<M˜ˆ<M˜ˆ<M˜ˆ<MYc„CYc„CYc„CYc„Cªˆ„i¥¢ÿúYÿ·2ÿ£YÿÂ2ÿ®YÿÔ2ÿÀY)#Y’2…êšB‘:Bÿ¦+ˆIpº�Tˆ#}Tˆ#nTˆ¹Tˆÿ Rªˆ„kªˆ„kªˆ„k„ÿ枃„kw\„Cw\„Cw\„CÀa8CJˆÍpJˆÍlJˆÍ!U :U :U :U :‘Ë ‘ó ‘Ëÿóx„ix„ix„ix„ix„ix„iã  ¶MK¶MK¶MKtäÿΛW§C´xŽiBÿ— L7…Á.‚\„CU :Bÿ¬•9ø‰ÅcŽju’ª�jSÚwl�˜žüéü÷ü}ýûõý·îe™ kŸüÿvÿŸ½ÿ¨‹ÿñpÿ>tÿæ©ÿ� "ˆuˆÖ˜ˆ¶Mªˆ‚\Yš+ˆ0ûˆªˆ‹bw\ªˆ6ˆ‹H‘ ã;Ë8`hYÿ¯ ‚It_„k©‰„q‚IÑŽ„Ct_ K„k¹e©‰º�N ð‹Ig„C1N„p>”A43„qù5IöDàP©ÿ¬„q„C„qàPtz²ÿ󠘈˜ˆuˆ nUYšYÿ¯‘:y*{ˆ+ˆœ~ $�{ w"ˆuˆ˜ˆAWœ~œ~+ˆ§*ûˆªˆw\ªˆ6ˆ]‘!–�‹ù•V�šL7„Wk<M„k„k|�}�„k„C„k„p$>.0ßk{g›k?k§•w�(?~…„3<M<M„ÿñWk(H :#2ÿ›ÿžëèk„|�„k„kÿæBz­f¦øqÝn Oš… Ë8öDÿÑ �\šC‚\„Cý\GVûk�\¸fÜ}ëk7ÐIœ~„kÿærw²kuÿôWÿÒ+ˆ|�G„ �?ÿÂ]ÿͪˆ„k㈦k‘.0  1+Œ.�‹{gr‹|g™N|_�ÿîÉÿ¼Yš§*}ªˆ„kªˆ„k�‹{gûˆ�Yš L7 L7…Á.˜ˆ<MâV9_âV9_ðÚAWF¢T¢Tœ~„kœ~„kw\„CV(?�‹{guˆWkù•§•ÏK`LL„C8rÔZOA$-³B}nºAÉ<ö…š\K=F¦ BAot_§*} L7ûˆìpããã L7 L7 L7ÿ¨Lÿ8 L7 L7 L7 L7 L7 L7 L7 L7˜ˆ<M˜ˆ<M˜ˆ<M˜ˆ<M˜ÿt<ÿ:˜ˆ<M˜ˆ<M˜ˆ<MYš2…Y‰#nw\„Cw\„Cw\„CwÿÓ„ÿYw\„Cw\„Cw\„C›W§C›W§C›W§C›W§C›W§Cx„ix„i´xŽi´xŽi´xŽi´xŽi´xŽi    wÿA))¹ \0¢Ñ…—†™†™‘•2•9–2­æ2î9Ü2N9¢bá‡.�ï�®YJ2�2lkPZ†‘¥6XVžÀXä�¢C\GàdôÃ`”ÔZl]œ_N×?‹¤9q’ƒ7``8ÿ¥�elˆU�W‰0Ô=áÿ½Û,W5\'ÿ©Fr‚_^WLaa*-BM™>•a\DFŽ(¦üq40oC¢�Õ_¿nÉ[&�Óœ�¼���'�*�ã_5�F�´�–_¢�}�j×ZÿVW�j�k�jÛZj!ÿžDÿœ/-—N¢FŸ=ŸnŸnð¾[ŸV¢�HBngna€@^YMfª�8N—g,6XL�0ëBŽj´ÿß´ÿß40×××××××–_F�F�F�F�'ÿ­''ÿ§'ÿ–&�É[É[É[É[É[üqüqüqüqF×××–_–_–_–_´�F�F�F�F�F�ã_ã_ã_ã_*�'ÿžüq'ÿ»'='z��¼P¼�¼�¼�&�&�&�É[É[É[¢�¢�¢�oCoCoCoC4040üqüqüqüqÞC\D\D\DFF(üqü3%ýð $‹I©….…+„Íÿï�T!ÚFÙDB"Š{”cwÿæ$� t‚a„A# # ˆ{yl‹{”cwÿ戂p}ˆ=kðÚìWFœ%º:]ˆíkea,T]$>ÿîÉÿ¼ðÚ0„’�‚a„A‚a„A $$$ (%  /  "  +.   +  //// (////  +  //    ///// +"             +/+./././2% 1 "$. /  "+/+-  / - "/+ 0 % + "$//$  "   "1 //   " /  %//2  $" +/+// ""/ 1/   ///$// )--//       22222 %%%%%+/+/+/+/ &11 )( #& %0 /(1%&/1(2 &((((((((////#  -"*  ̰¬€, ~’¡°ðÿ7¼ÇÉÝó #ŠŒ¡ÎÒÖ"7CJ_eq†Œ«½Äçò?…ùM   " & 0 3 : < D t  ¤ § ¬!!!!"!&!.!^"""""""+"H"`"e%ÊöÃûþÿÿýÿÿ  ’ ¯ðú7¼ÆÉØó #„ŒŽ£ÑÖ#8DK`fr€ˆ�¬¾Åèó>€ M   % 0 2 9 < D t  £ § «!!!!"!&!.!["""""""+"H"`"d%ÊöÃûþÿÿüÿÿÿõÿãÿÂÿ°ÿ£ÿ–ÿWÿNÿ6ÿþ•þŒý¨þ|þgþ[þZþUþPþ=ýÝýÜýÛýÚýØýÕý¨ý�ý›ý–ýŽý�ý|ývýoäƒäGäãíãšâèâáâàâßâÝâÔâÓâÎâÍâÆâ—â�âjâhâeâ âáþáóà]áèá¼áßiá á ááàöàÚàÃàÀÝ\ d'-1x¢ÈÒÚð*4¬­Ï®¯°±²³´µÐ¶·¸¹º»¼½Ñ¾ÒÓÔËÌÍÕÖ×ÎØÏÐÙÑÚÒÓÛÔÜÝÞáâãäåßàáûâãäåæçè     éêëìíîïðñòóôõ !"#ö÷$%&'øùúûüýþÿ:^_` a ð ó  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`a†‡‰‹“˜ž£¢¤¦¥§©«ª¬­¯®°±³µ´¶¸·¼»½¾ÿrdeix¡pkvj#ˆš s$%gwš!l|ƒ¨º�cnB"om}b‚…—ôõüýøù¹&Á: ()yúþ„Œƒ�Š��‘Ž•–”œ�›óRXqTUVzYWS°,K° PX±ŽY¸ÿ…°„± _^-°, EiD°`-°,°*!-°, F°%FRX#Y Š ŠIdŠ F had°%F hadRX#eŠY/ °SXi °TX!°@Yi °TX!°@eYY:-°, F°%FRX#ŠY F jad°%F jadRX#ŠY/ý-°,K °&PXQX°€D°@DY!! E°ÀPX°ÀD!YY-°, EiD°` E}iD°`-°,°*-°,K °&SX°@°YŠŠ °&SX#!°€ŠŠŠ#Y °&SX#!°ÀŠŠŠ#Y °&SX#!¸ŠŠŠ#Y °&SX#!¸@ŠŠŠ#Y °&SX°%E¸€PX#!¸€#!°%E#!#!Y!YD-° ,KSXED!!Y-° ,°E-° ,°E-° ,±'ˆ ŠSX¹@c¸ˆTX¹èpY°#SX° ˆ¸TX¹èpYYY-° ,°@ˆ¸ ZX±D¹èDY-° +°+² +·3*$+·?3$+·C7-+·F9-+·M?1#+·IzÎ`ŒÜ   F v Ä Ð ò!!6!Œ!ž!°!Â!Ô!ê""h"t"†"˜"ª"À"Ò"ä"ö# #j#|#Ž# #²#Ä#Ú$$x$Š$œ$®$Ä$Ö%%~%�%¢%´%Æ%Ú%ð&Â&Î&à&ò'''*'<'N'd'Î'à'ò(((((<(x(æ(ø) ))0)B)¤)¸)Ê)Ü)î** ****<*N*`*r*„*–*¨*º*Ð+.+®+À+Ò+ä+ö,,,&,2,D,V,h,z,Œ,ž,°,Â,Ø,ê,ü--~-æ-ø. ....@.R.^.j.|.˜.¤.°.Â.Ô.ê//L/^/p/†/œ/²/È/Ø/è000n0€0’0¨0¾0Ð0â0ø1T1²1Ä1Ö1è1ú22$2¬3N3`3r3ˆ3ž3°3Â3Ô3æ3ø4 44"444F4\4r4„4”4Ô565H5Z5l5~5�5¢5¸5Î5ä5ø666"646F6X6n6€6’6¤6¶6È6Ú7 7„7â888‚8Ö8è999*9<9N9`9r9„9¶9È9ô:":b:x:²:î;F;t;²;Ê;â;ì<$D>L>T>„>Œ>”>Ú>â???f?n?v?â?ê@D@¤@º@Ð@â@ôAAA.A¢BBPB¶C C~CÄD*D\DdDÄDÌDÔEHEPE EøFTF¨FÔGG€GôHRH¸HÎHâHôIII|IàJNJ`JvJˆJîK\KdKzK‚KîLZLlL~L�LÎLÖM&M.M6M>M®MìMþNNJNRNZNbNjNrNzN‚NŠNÄOO`OÂP8P@P¨PÐPØQQ(QrQ´RRJRRR‚RŠRÖSS SSNS’SÒTTvT¸U$U”UæUøV VŽV W WWW0W8W XXlX~X�X¢XâY@YŽYÖZ2ZŽZü[b[æ\d\ü]¤]¬]´]ü^^^*^š__T_ž_Ô_ü`0`H``aTaÄaÚaðbNbxb¨bðc.c:cFcœcðdTd´dÀdÌee„e�eœe¤e¬eôfwTwjwvw‚w”w¦w¸wÊwàwôx xx4xHx^xrxˆxžx°xÂxÎxÚxæxòyyy,y@yVyjy€y”yªy¾yÔyêyüzz z2zDzVzhzzz†z’zžzªz¼zÎzàzò{{{({:{L{^{j{v{ˆ{š{¦{¶{È{Ú{ì{þ|||||||||||||||(|2|^|v|�|¤|°|¼|È|è}(}Œ}¬}¸}È~Š~’~š~²~Ì~Ø~ì(~΀H€Ì€ì�r‚‚t‚„‚Ѓ.ƒTƒzƒ ƒÆ„„D„Œ„¢„Ö…X…œ††R†l†„†¾†Ð‡D‡P‡\‡l‡l‰‰^‰p‰˜ŠŠxŠÜ‹ ‹¦‹öŒ ŒlŒ¦ŒÞ� �l�œ�ØŽŽnŽâ�:�Š�Ö��.�z� �æ‘‘6‘†‘ä’,’p’°’þ“v“Ž“Ò””X”œ”ü•V•²– –œ–®–è——>—h—º˜*˜l˜Ì™4™j™æšLšŽšê›R›®›îœnœ¾��@�ˆ�êžhžšžÌžÔžøŸŸ0ŸBŸTŸfŸxŸŒŸ¢ŸºŸÆŸØŸêŸü  " 4 F \ n € ’ ¤ ¶ Ê Ü î¡¡¡&¡8¡J¡V¡h¡z¡Œ¡ž¡°¡Â¡Ô¡æ¡ò¢¢¢(¢:¢P¢b¢t¢Š¢œ¢¨¢º¢Ì¢â¢ô£ £ £0£B£X£j£|£Ž£¤£¶£Ì£Þ£ð¤¤¤ ¤6¤H¤Z¤l¤~¤”¤ ¤²¤Ä¤Ö¤ê¤ü¥¥¥€¥Ô¦&¦–¦è§V§Ž§Ì¨¨b¨¶©.©|©èªdªò«B«š«ö¬V¬Ü­z­æ®`®¬®Â¯v°.°¬±*±„±Ü²T²ª²ô³³ ³³$³v³È´(´|µµ µ¬µ¸µÄµÐµâµô¶N¶œ¶¤¶¬¶Â¶Ö¶è¶þ·†ª°1°EX°/±>Y°EX°/± >Y°° +XØÜY°° +XØÜY01!!!!ªþÜ$þÜ$öºúP2^ -°EX°/±>Y°EX°/±>Y°°° +XØÜY°Ð01#3#3f€æFf€æù þíù 0Œ°° /°/°EX° /± >Y°EX°/±>Y°EX°/± >Y°EX°/± >Y°±° +X!ØôY°а ± ° +X!ØôY° °аа °аа°аа°Ð01###5!#5!3333#3##3#ŠÀG¸Hã3èI·IÀJ·IÜú3áþH¸Z¿3Àšþfš©"« þ` þ`«þÞ©þfC"\ÿ*8˜-]°EX° /± >Y°EX°#/±# >Y²# 9°±° +X!ØôY° ° а ±° +X!ØôY°#° а#±+° +X!ØôY014&'&&546753!4&#"#5&&77!326]qÞ××¶Ÿ°ÉþãaTVTYwÝÕÖ¸Ÿ»ô{_[aQf,Qǵ¨××ÙòÁv€cRNa/WƲ®ÐÆÅã܆ta_ÿì‘Å )7;v°8/°:/°EX°/±>Y°EX°&/±& >Y°° ° +XØÜY±° +X!ØôY°±° +X!ØôY°&°° +XØÜY°&±-° +X!ØôY°±4° +X!ØôY014632#"&53326554&#"4632#"&53326554&#"'_§•—¦¦•–¨Â@<:?@;;?ö¨•–§¦•–©ÂE8A8@;Y°EX°/± >Y°EX°/± >Y² 9°°а±"° +X!ØôY²0 9°0°&а ±7° +X!ØôY01467&&546326653!'#"$26776654&#"=‚…DCصŸÇbU]$(ÚDFÐþ¼MU´gÚþþë5j1þÔ3%n ++V8'I;AFˆv«]\˜O­ÏÅŒb¢=Bþ¾<ŒNŠèZôY77å\ 0[.Ys�+[78$L-2NW2ð°EX°/±>Y01#3f€æ þå(|þ>§L °/° /0173#&|0À5ƒ²²ƒ5ÀþÐPˆ#Q’bþLþ®þ­þMe�Q"‰þ>ZL °/° /01#'65'73ZþÃÂ6�´¶6Â=:þ�ýÓP�b¶SP¹cŽPýÒþ‚Cn°° /°EX°/±>Y° ° Ð01%73%'IþÒ9)»#8þÎȘ®­™ÆY±{[þŸx´Yþ÷n"þçj8’¶ ° /°Ð° °° +XØÜY°Ð01!!!!5!!¶hþ˜þìþ–j,üþbžüŠ?þÒ¡ú°/01%#5!¡ŸÃF þÅDäqþ¥ß°/°° +XØÜY01!5!¥ýÌ4þá�´°EX°/± >Y°° +XØÜY01!!!´þÜ$ÿòÿƒ$°°/°EX°/±>Y01!!þä}-_ÿë8Å ;°EX° /± >Y°EX°/± >Y° ±° +X!ØôY°±° +X!ØôY01#"32%4&#"32658þ÷âäþö ãâ þÝhbcfgdbf7þßþÕ+!A -þÓþà­¡ ®þ…°  °«÷°3°EX°/±>Y°EX°/± >Y²9°/±° +X!ØôY01!!!5%÷þÜþØL®Î4GEÅH°EX°/±>Y°EX°/± >Y²9°± ° +X!ØôY°°а±° +X!ØôY01!!56654&#"!'&32!Eü×fVc[eiþä äá‘§þýd¿ùu¡E\u‰rÅêÄߵþåAÿë5Å*j°EX°/±>Y°EX°/±>Y°EX°/± >Y°±° +X!ØôY°° а±)° +X!ØôY²)9°° а±#° +X!ØôY0132654&#"!'&$32#"$77!32654&##Фhdd_RpþåËâ xiyþÝãËþÝx\eusp¤TmaXj`N«ÞØÈ_«0+²vÈå×ÄTmp`sk9`° A°/°EX° /± >Y°EX°/± >Y°±° +X!ØôY°°а° а °Ð013#!!'!!'»¥¥þÝý® \&ýŽOâþÄ<¯Åün )iÿë;°U°/°EX°/±>Y°EX°/± >Y°±° +X!ØôY²]°±° +X!ØôY°±° +X!ØôY°Ð01!!6676#"$77%32654&#"ˆT,ýÃ((rEÒçýîÉþânYfahfTY…+êþ°'þüèÒþêÛÀam‘u~˜>5cÿëVÅ'M°/°EX°/±>Y°EX°/± >Y°±° +X!ØôY°±° +X!ØôY°±"° +X!ØôY012&&#"6632#""32654&¬R‹F4BgD…¡1–^ÃÝþïÙçþÞJ¼Qr}hZmnÅÖǰ3:þë×Üþâ9Rý/4-a­º¥uy–<A° /°EX° /± >Y°EX°/± >Y° ± ° +X!ØôY°Ð01!77!5!Aê«%þÜ"àÃýÏþîþ&þ±””Aáá[ÿë<Å#/d°EX°-/±->Y°EX°/±>Y°EX° /± >Y°-±° +X!ØôY²-9°°а ±!° +X!ØôY°±'° +X!ØôY01#"$5467&&546324&#"3264&#"326set†þîÝßþí…ufrþÐÏþþr[\op][p!]OPZ[QO[.m¨/1¶uÊÙÙÊvµ2/§mÂÕÕü²bvvbdstâXkiZ[kkRÿë0Å'J°/°EX° /± >Y°EX°/± >Y±° +X!ØôY°±° +X!ØôY° ±"° +X!ØôY01%2655#"5432#"&'726754&#"s‘1‡NËéÕßþÉñL¡E"AHl!p`XoeË«ŸH>@ âÚ!þÍþêþ¨þ÷þÐÓê6-† ¦¤v|™ÿÿ�´l&l°/01ÿÿrþÒÔl'l3°/016E”°/±° +X!ØôY²9015SAü¢^&ËþðoãnþðˆLà&²+°±° +X!ØôY°±° +X!ØôY01!5!!5!ü€€ü€€ûåýlåwEß°/±° +X!ØôY²9015%Áý¶hü˜$Î þ’ãþ‘ÏÅS°EX°/±>Y°EX°/± >Y°° +XØÜY°° +XØÜY²9°± ° +X!ØôY°° а°Ð016676654&#"!'&$32!5!DQyGUaZJgþäÐàÿ•p=&þÚ&žŒ‚]:†S\hXUÀÌãÃØI/_Sþbú1þ;ÒŠ3Cn°/°1/°+/°EX° /± >Y°EX°/± >Y±° +X!ØôY°1±° +X!ØôY°+±$° +X!ØôY° ±7° +X!ØôY°±A° +X!ØôY01#"&'#"&763233267! !267# ! 3267447&&#" îíNr,ƒX�—í©t�T3*$s‹þÏþÁþÑþ–F2UµA&CÏcþtþSÛ„ƒœûþ 9@8[$,.otÚþÄXORRîÄþ246ýÃ_FÚ§aŒþVþšþ�þf(“*/ò±«þýûƒ4FðÁ ° B°/°EX°/±>Y°EX°/± >Y°EX°/± >Y°± ° +X!ØôY°° Ð01!!!!!#•þcþÙõ+óþÙýæo´:þưúP<ˆÊ° ^°EX°/±>Y°EX°/±>Y°EX°/± >Y°±° +X!ØôY²9°±° +X!ØôY°±° +X!ØôY013! #!2654&#%32654&##ˆì kfƒƒþìýþó tzhpþÝÒu~~ȰÈÇeŸ(¸yÑׄþ\eckqÊ`\e`]ÿëÛÅ;°EX° /± >Y°EX°/± >Y° ±° +X!ØôY°±° +X!ØôY01! ! !4&#"3265ÓþÙþúþùþ¸@0þ䊒ƒš¢Š‰ƒïëþíR ! Tþëï�™Õ¥þݧՓ‘ˆá° ;°EX°/±>Y°EX°/± >Y°± ° +X!ØôY°± ° +X!ØôY013! !326554&#ˆô Zþ¦þõÐÁ�²²�°þ«þõñþôþ­ÏüÔ«ó©Ôˆm° W°EX° /± >Y°EX°/±>Y°EX°/± >Y° ±° +X!ØôY°±° +X!ØôY°±° +X!ØôY01!!!!!!ý¥ÁüãýA[€þ`à°áþ’ˆt° H°EX° /± >Y°EX°/±>Y°EX°/± >Y° ±° +X!ØôY°±° +X!ØôY01!!!!!ýžþÜìý8b]ý£°áþocÿëæÅ W°EX° /± >Y°EX°/± >Y° °а ±° +X!ØôY°±° +X!ØôY² 9°/±° +X!ØôY01%# ! !&&#"3267!5!æAþíÒþõþ®E þ턆¤ª�f| þþ&ÇV†L 0MþýÓt‡Ï£þΦÏ*ʈ!° S°EX° /± >Y°EX°/±>Y°EX° /± >Y°EX°/± >Y°EX°/± >Y° ±° +X!ØôY01!!!!!!!!þÝý®þÜ$R#]ý£°ýŽrš¾°°EX°/±>Y°EX°/± >Y01!!!¾þÜ$°:ÿë °/°EX°/±>Y°EX°/± >Y° а± ° +X!ØôY01!#"$77!3265ê#þíÒäþön]Qq°üÓ÷ÞØsi}mˆ9° Z°EX°/±>Y°EX°/±>Y°EX°/±>Y°EX°/± >Y°EX° /± >Y°±° +X!ØôY² 901#!!3!!N¢þÜ$‚eþþœ`ý °ý­SýZüöˆ4°)°EX°/±>Y°EX°/± >Y±° +X!ØôY01%!!!¬ˆüT$àà°ˆr°V°EX°/±>Y°EX°/±>Y°EX°/± >Y°EX° /± >Y°EX°/± >Y° °а° а° Ð013!!'#!sv~þÜþzÄþ|þܰûÏ1úP²ƒûÊ2ý�þN°ˆ!° C°EX°/±>Y°EX° /± >Y°EX°/± >Y°EX°/± >Y°°а°Ð01!!!!7!!þÝý´þÜ$L#ãü°üá\ÿëÅ ;°EX° /± >Y°EX°/± >Y° ±° +X!ØôY°±° +X!ØôY01! ! %4&#"3265þ­þñþóþ°O Tþܪ••¤¦”–¨Uþôþ¢^  _þ¡þõªÚÙ«þø­ÚÚ­ˆç° >°/°EX°/±>Y°EX°/± >Y°± ° +X!ØôY°±° +X!ØôY01!!2#%!2654&#!¬þÜDû þàûþà z~}{þàýð°ÿÑÑþá…gi‰\ÿfÅ!B°/°EX°/±>Y°EX° /± >Y±° +X!ØôY² 9°±° +X!ØôY01%# ! %4&#"3265VPñ¿þú6t>þóþ°O Tþܪ••¤¦”–¨U„áSìœþ^  _þ¡þõªÚÙ«þø­ÚÚ­ˆ°#R°/°EX°/±>Y°EX°/± >Y°EX°/± >Y°±° +X!ØôY² 9°±"° +X!ØôY01!!2!&&554&#%32654&#!¬þÜ%ùvr�q!(þÓ(wlþêü{yyvþÿFýº°ãËq¢2&²ƒk=…  –CgmyáhfdvUÿë¾Å']°EX° /± >Y°EX°/± >Y² 9°±° +X!ØôY° ° а ±° +X!ØôY°°!а±%° +X!ØôY014&'$$54$32!4&#"#"$77!326šw•þüþö1íð.þå‡zu€‰¨ñøþÙòîþžŸŽw~|Tf-Kγ³ãÿ»e}hQJ_5Cܳ»ØõÝ‚ybv°/°EX°/±>Y°EX°/± >Y°±° +X!ØôY°Ð01!!!5!vþdþÜþfZÏû1Ïáxÿë°6°EX°/±>Y°EX°/±>Y°EX°/± >Y± ° +X!ØôY01! 5!3265þ¼þúþûþ¿%š‡‰œ°ü:õþö õÆü:��Ž‘Æ° -°EX°/±>Y°EX°/±>Y°EX°/± >Y°Ð0137!!!v=4þþÔþ4ƒOM/úP°û°V°EX°/±>Y°EX° /± >Y°EX°/±>Y°EX°/± >Y°EX°/± >Y°°Ð°°а° Ð013!!#!!3Ðþ¬þñþõþõþñþ«Ñ×ÊæúPÁü?°üæ° D°EX°/±>Y°EX° /± >Y°EX°/± >Y°EX°/± >Y² 9°°Ð01!!!!‰TþPÉþŸþçþçþ«»þPR¬ý.ý" ýóÞÒ° =°EX°/±>Y°EX°/±>Y°EX°/± >Y²9°°а°Ð013!!!ƒ>@þ þÝþ@ŸüPþ¡Mv° F°EX°/±>Y°EX°/± >Y±° +X!ØôY²9°±° +X!ØôY² 901%!!5!5!®Èû×´ýMàà˜7á’wþ°)›'°/°/°±° +X!ØôY°±° +X!ØôY01#3!!)��þN²ÃùÅØëÿƒƒ°°/°EX°/±>Y01!!!`þß°ùÓ þ°¿›$°/°/±° +X!ØôY°±° +X!ØôY01!!53# ²þNŽŽ›øØ;,ÙV° °EX°/±>Y°Ð01#3#'#ç+Ô+ç¥Ù×ý)�""ÿ%� ³+01!5!�ürŽÛÛM¼IÆ:°/°/²_]²¯]²q²]²?]²]°° +XØÜY¶/]01#7!Iíþñ5¼7ÿëN +ˆ° /°EX°/±>Y°EX°/± >Y°EX°/± >Y´ � ]²/ q´O _ q²ÿ ]²¿ ]²_ ]²/ ]°±° +X!ØôY² 9°±!° +X!ØôY° ±%° +X!ØôY01!&&'#"&5463354&#"%'&632%2675#"ë-“fª¸õë£RPGMþæüÍÂòýÑMx£]`H%R+Oh¯—Ÿ¯VNVE=‰ÇŶþAL†BÃL2™]B6Bpÿë@U°EX° /± >Y°EX°/±>Y°EX°/± >Y°EX°/± >Y°±° +X!ØôY°±° +X!ØôY01#"&'#!6632!4&#"3265@ØÌ^�1ú#/ƒUÎØþÝ]pD^_EqZÿòþÞOL†ý¯AFþÉþýž¹95þ614Ÿ’>ÿëòND°EX°/±>Y°EX°/± >Y±° +X!ØôY°°а°а±° +X!ØôY01%265!#"55432!4&#"6N^ ÿ½òþúòÈõþö\Qt__Ë[L¤Ý2ðï4äºTo´Ž‘±CÿëU°EX°/±>Y°EX°/±>Y°EX°/± >Y°EX° /± >Y°±° +X!ØôY°±° +X!ØôY0132!#'#"5!3267&&#"CÝÉQ‚1%û3‹ZÇÝ#`l?^]>kc:FAQùè„KN$ðŽ£31Í39¾™MÿëOo° /°EX°/±>Y°EX°/± >Y²ÿ ]²� q²Ÿ r² r²O q²¿ ]´_ o ]±° +X!ØôY°±° +X!ØôY° ±° +X!ØôY01"5542!3267"!54&Oêþè ßÛòýzma€LOBÖ�Q^ fW,ç(ñ8þøáŸkŠ'*´6G‚|e]oì-y°/°EX°/±>Y°EX°/±>Y°EX°/± >Y°±° +X!ØôY²ð]²Àq²]´/?]²0q² ]²r°±° +X!ØôY°°аÐ013#5354632&&#"3#¼¡¡Ò¾%M.-GI××mÍx¶Å ÙNIxÍü“CþKN+d°EX°/±>Y°EX°/±>Y°EX° /± >Y°EX°/± >Y° ±° +X!ØôY°±!° +X!ØôY°±(° +X!ØôY013273#"&'732655#"5!3267&&#"CßÉ[Š1üþë÷R¸N6C‹Rxq0‚TÇß$`lC]]Akc:RLŠûËÓç-'Ú !djb=@%1/Ö16¾™iF°EX°/±>Y°EX°/±>Y°EX°/± >Y°EX°/± >Y°± ° +X!ØôY016632!4&#"!!�3”Z©ÁþÜYX<\þÜ$±JSáëý~„~i+'üç£7°EX°/±>Y°EX°/±>Y°EX°/± >Y°°° +XØÜY01!!!!5!£þÜ$þÜ$:ÛÿžþK«H°EX°/±>Y°EX°/±>Y°EX°/± >Y± ° +X!ØôY°°° +XØÜY²P]01#"&'73265!5!«Ê´(B%.;@þÛ%:ûž¾Ï ßSVbÙp^ Z°EX°/±>Y°EX°/±>Y°EX°/±>Y°EX°/± >Y°EX° /± >Y°±° +X!ØôY² 901#!!3!!äPþÜ$HûRþ¦�þ±Åþ;ü‹—þý°£°EX°/±>Y°EX°/± >Y01!!!£þÜ$p|N%c°EX°/±>Y°EX° /± >Y°EX°%/±%>Y°EX°/± >Y°EX°/± >Y°EX°#/±# >Y° ±° +X!ØôY°Ð0166326632!4&#"!4&#"! 4�gh”&2 l ¹þÜPO>[þÝPP;YþÝ:�NU\]WbÝâýq�{`71ý9�xc-)üë:kNF°EX°/±>Y°EX°/±>Y°EX°/± >Y°EX°/± >Y°± ° +X!ØôY016632!4&#"!{ 6žb¤¸þÛXY:\þÜ:›S\ÎÜý\£m[/+üï:Cÿë@N 8°EX°/±>Y°EX° /± >Y±° +X!ØôY°±° +X!ØôY01432#"5!326554&#"Cïðþñïðþñ#htqijrqi'ò5þÌóôþÍ3ô”³´“�¶·�pþ`@NU°EX°/±>Y°EX° /± >Y°EX°/± >Y°EX°/± >Y°±° +X!ØôY°±° +X!ØôY01#"&'!!6632!4&#"3265@ÞÇU„/þÝ0‡ZÉÞþÜfiB]]DjcÿðþÜ?=ýùÚ€GMþÆÿ™¾62þ&.0¦ŽCþ`NR°EX°/±>Y°EX°/±>Y°EX° /± >Y°EX°/± >Y±° +X!ØôY°±° +X!ØôY013273!#"5!3267&&#"CÝÉZˆ1øþÜ0�SÇÝ#`l@\[?kc:OJ…ú&<>$ðަ0.à04À™pÈN7°EX°/±>Y°EX° /± >Y°EX°/± >Y° °° +XØÜY01'"!!6632©kATþÝ &yO%?61ý%: U_:ÿëÔN't°EX° /± >Y°EX°/± >Y² 9´y‰]°±° +X!ØôY² 9´ ]° ±° +X!ØôY²" 9´""]°±%° +X!ØôY014&'&&54632!4&#"#"&77!326¹]~ÀÃëÅÏõþæSPGQU‚ÈÂúÍØû lWQU*0F'™„ŒÃ”ARE42@(›ˆ’¹ÛŒWN@ ÿë’CQ°EX°/±>Y°EX°/±>Y°EX°/± >Y°±° +X!ØôY°±° +X!ØôY°°аÐ013#3267#"&5#53˶¶4,!,T1—£žžCþ÷ÍýÙ?6Ó¦´(Í iÿë:F°EX°/±>Y°EX°/±>Y°EX°/± >Y°EX°/± >Y°± ° +X!ØôY01%#"&5!3267!#2šd«Á#PNFd $ùœU\Ûç�ýqvg-,ûÆ: -°EX°/±>Y°EX°/±>Y°EX°/± >Y°Ð0137!!!÷²1þ�þéþ�1“dd§ûÆ:Â:V°EX°/±>Y°EX° /± >Y°EX°/±>Y°EX°/± >Y°EX°/± >Y°°Ð°°а° Ð013!###!33�þíôÉÉóþí�Ê÷ûÆ„ý|:ýKµ: D°EX°/±>Y°EX° /± >Y°EX°/± >Y°EX°/± >Y² 9°°Ð013!!!!¦JþºQþ·±±þ¶Qþ¹HâXýéýÝgþ™#þK:F°EX°/±>Y°EX°/±>Y°EX°/± >Y²9°°а±° +X!ØôY013!#"&'732677!ö Ï:þI.žž%?-"  HN"þ€:Æ<°û$tŸ ÕG5T9KÎ: F°EX°/±>Y°EX°/± >Y±° +X!ØôY²9°±° +X!ØôY² 901%!!5!5!¶ü}þ bàବâ§0þ˜�=°/°/°/±° +X!ØôY²901&&554�IÃ¥WZZW¥Ã8UFYZZYFUþ˜7ð«ËcnÉmeË«ï7�ŸvËh¡-/¡fËvŸ­þò]°°/°EX°/±>Y01#3]°°þò¾"þ˜t=°/°/°/±° +X!ØôY²9016655467&&554&'73""UF\^^\FU8¦V\\V¦ÂÊŸvËh --¡iËvŸ�7ï«ËemÉncË«ð7izÄ9*°/± ° +X!ØôY°б° +X!ØôY° а°Ð01#"&'&&#"'46323265ı‡U�N4K,4GÊ­‰S—L1K,2Jö¡Û?F,(fG¢×CB-'hIŽþв:'°/°EX°/±>Y°° +XØÜY°° +XØÜY01!!5!!²þÜ$þÜ$þйöHÿ þ&"D°EX°/±>Y°EX° /± >Y±° +X!ØôY° °а°а±° +X!ØôY01%265!#5&554753!4&#"@N^ ±�ÈÏÝÝÏÈ”®þî\Qt__Ë[L‡Ì!îå+ÛÚ+Ýå"מTo´Ž‘±\€Å"g° /°EX°/±>Y°EX°/± >Y² ]° ±° +X!ØôY°±° +X!ØôY°а а° аа °а±° +X!ØôY01!!53665'#53'4632!4&#"!'<8Éü //¤›ñÊ×íþä\GFP cLUN�9àà ¦XbáÖÒðß·`[ulÖáPÿåBñ#/.°/°EX°/± >Y±'° +X!ØôY°±-° +X!ØôY01%#"&''7&&5467'76632732654&#"0M¸de¹K��‡1385��ŽJ±a`²K�Ž”383/‹Žüyï窱îk>AA=„�‰L³beºN“�‘7<=8”‘—N·da±K�‘{¹þÿ¸·þþΰl°EX°/±>Y°EX°/±>Y°EX° /± >Y²+² 9²]°°° +XØÜY°а°в]°°а°° +XØÜY° Ð013!3!!!!5!5!5!5!!o@þ‚ôþ¼Dþ¼þÜþ­Sþ­ þ‚AP`ý6ÈnÈèèÈnÈÊþò…°%°/°/°/°EX°/±>Y²]´]01!!!þúþòüåÈö^þ3œÅ3Eo° /°EX°#/±#>Y² #9°±=° +X!ØôY°а °а ±° +X!ØôY²1# 9°1±4° +X!ØôY°а#°(а#±+° +X!ØôY01#"$77%32654&'&&5467&&54$32!4&#"%&&'6654&œTODEþèíèþÉ‘lkwz©ôêTOEDíóþåxlrro±÷éý»(D&%o±"E#'+|Û[ˆ+3Œb±ÈÇÚj\SCCQ2@»¬YŠ,2�b¬ÑÞÈXsWCKM0@»  J0PS4  J0GZœäš°°/°а°° +XØÜY°Ð01!5!!5!šþö þ þö äÌÌÌVÿëâÄ)5l°/° /°/°EX°-/±->Y°EX°3/±3 >Y´]² ]° °° +XØÜY°°° +XØÜY°°а3°!° +XØÜY°-°'° +XØÜY01#"&554632#4&#"3265%32#"! ! U°� ½½ �±”ZZ^dd^ZYýWõôWþ©ôöþªzž('Ÿþ`þÚþØþbT—�Ô¯w­ÖŸ•^UŠqxs‰S`…þøþ—igþ™þù;°þPþÅþÄþN²p´ Å +n°/° /°EX°/±>Y²]²?q²¯]² ]² r°°Ð²ÿ q°±° +X!ØôY² 9°±!° +X!ØôY° ±%° +X!ØôY01&&'#"&5463354&#"''&632%2675#"\ !oNw‚©¢‰;9BH¥ªŒ†� þ‡3lˆJS:Â//=zjox3>A4/ b‚ކþÆ3X*‚<#g@.+-ÿÿbuƒ”&öÞDÿÞ~vÁ%°/±° +X!ØôY01#!5!ÁÈý…Cv«ÿÿqþ¥ßVÿëâÄ 2;s°/°/°/°EX°/±>Y°EX° /± >Y°° +XØÜY°°° +XØÜY² ]²]²]°°3° +XØÜY²"39°°+а°;° +XØÜY01! ! 32#"#!2#&&554&#'32654&##Vž('Ÿþ`þÚþØþbzWõôWþ©ôöþª¼——®:8:5 › CLž‡GcNa‚Ù;°þPþÅþÄþN²<þøþ—igþ™þ­þ¯Rˆ~:WmJ8)AQ*6GD†<8H:” o±°/±° +X!ØôY01!5!oý%Û ¥~¤›Å T° /°EX°/±>Y²À ]² r² ]²p r²ð ]²@ ]² ]° ±° +X!ØôY°±° +X!ØôY014632#"&732654&#"~¡pnžžnq “J43FF34J³p¢¢pqžžq5GF66JJZÿÕî 7°/°/°±° +X!ØôY²9°а°а± ° +X!ØôY01!!!!5!!!5!§Gþ¹ÿþ³M ü¾B³èþ�èkú·äf›àÇO°/°EX°/±>Y²ð]² q²°]²€]²9± ° +X!ØôY°°а±° +X!ØôY01!5%6654&#"#'&632!àý’5<#/178ɱ”�žk}mZ››ü2C)'5Y±° +X!ØôY°° в¯r²_]²r²r²Or²ïq²ßr² q²ð]°°вÀ]°±"° +X!ØôY²*9°*/´*/*]²ÿ*q´**r²ß*]¶*/*?*q°)° +XØÜY¶°)À)Ð)]012654&#"#'&632#"&77332654&##5˜><9739Ȱ†˜±G=FK³˜’¼É?<8DFCos1.&3,e{wn7[_Dp|}q*/0,26…l¼jÆ5°/°/²?]²¯]²_]²]²]°° +XØÜY¶/]01!#35þëéÆþü‹þ`Q:S°EX°/±>Y°EX°/±>Y°EX°/± >Y°EX°/± >Y°EX° /± >Y°±° +X!ØôY013267!!'#"&'!®ZZKd$þð,qC3W#þÝ:ý”•k74ûÆC+-þIÚ= ° °EX°/±>Y°EX°/± >Y01!#"543!|SéþýéwÑÏúPŸ8Ã<°/°° +XØÜY01!!ÃþÜ$8aþ5æ#°/°/°°° +XØÜY°°° +XØÜY01%#'2654&'7[ @V·¨3<@N9 RPk€¡)*)!ŽN™ Å=°/°EX°/±>Y² q²€]²ð]²°]²9°/±° +X!ØôY01##5% ÓR™vŸv³+Å J° /°EX°/±>Y²¯ ]²Ï q²? q² ]² ]° ±° +X!ØôY°±° +X!ØôY014632#"&53326554&#"v¼žž½¼�Ÿ½¯XURXYSTWv”»»”u•¹¹•UggUuShhSÿÿf—”¶&pÿÿ§ÚÄ'rY˜' nº °EX°/±>Y°EX°/± >Y°Ð01ÿÿ§ Ä' %'rY˜p+°EX° /± >Y°EX° /± >Y01ÿÿi—Ç' Ï'nwo› °EX°"/±">Y°EX° /± >Y°Ð01Kþvü:C°/°EX°/±>Y°° +XØÜY°° +XØÜY²9°± ° +X!ØôY°°Ð013267!#"&5467665!!ÖQwHUa[IfþýÎâþ”q<'&þÚœ�ƒ\:‡RZhVU¿ËâÃ}ØK-_Užûÿÿ "&$Cæ\ ³ +01ÿÿ "&$v›\ ³+01ÿÿ B&$R•T ³+01ÿÿ m&$X¢t ³+01ÿÿ  &$jt]³+°° Ð01ÿÿ �&$V;¹³+°°Ð01I°|°/°EX° /± >Y°EX°/±>Y°EX°/± >Y°EX°/± >Y°±° +X!ØôY° ± ° +X!ØôY°±° +X!ØôY°±° +X!ØôY°°Ð01!!!!!!!!!!'Iü~þH¨þªøý¬óþhû06Oþ±°äþ’ãþh\/ÿÿ]þ4ÛÅ&&z«ÿÿÿÿˆm"&(C§\ ³ +01ÿÿˆm"&(v\\ ³+01ÿÿˆmB&(ReT ³+01ÿÿˆm &(jA]³+°° Ð01ÿÿÿÆÂ"&,Cÿy\ ³+01ÿÿ˜–"&,v,\ ³+01ÿÿÿÀ¢B&,Rÿ7T ³+01ÿÿÿ¯­ &,jÿ]³+°°Ð01ÿ° `°EX°/±>Y°EX°/±>Y°EX°/± >Y°±° +X!ØôY°а±° +X!ØôY°±° +X!ØôY°°Ð013#53! !#326554&##3¦‡‡ô Zþ¦þõ$ôÁ�²²�ÁôŒµoþ«þõñþôþ­ŒþTÔ«ó©Ôþrÿÿˆ!m&1Xæt ³+01ÿÿ\ÿë"&2C\ ³ +01ÿÿ\ÿë7&2v»q ³  +01ÿÿ\ÿëW&2RÄi ³  +01ÿÿ\ÿë‚&2X͉ ³ +01ÿÿ\ÿë"&2j r³! +°!°Ð01@Ï÷� ° /°/°а ° Ð017@5þˬ/0¬þË5¬þÐþÑs;;¤þÊ6¤þÅþŤ5þË\ÿ¡î%1>°EX°/±>Y°EX°/± >Y±.° +X!ØôY°а±"° +X!ØôY°*Ð01!"&'#7&&5!273&&#"!4&''3265þ­þñO�=P�whqO d±JS�‚OUüdÔ*pD•¤x þ?!R/–¨Uþôþ¢ ‰ÌSý˜ _50ŽßSà�þúJ,#-2Ù«-TüýÚ­ÿÿxÿë"&8C \ ³ +01ÿÿxÿë"&8vÀ\ ³ +01ÿÿxÿëB&8RÉT ³ +01ÿÿxÿë &8j¥]³ +°°Ð01ÿÿ"&<vŒ\ ³ +01„Ÿ° A° /°/°EX°/±>Y°EX° /± >Y°± ° +X!ØôY° ±° +X!ØôY0132##!32654&#¨ÝþþäþÝþÜ$Ý{{{{°þòøÈÉøþß°þþA__‚‡ÿëË%'H°EX°/±>Y°EX°/± >Y°EX°/± >Y°±° +X!ØôY°±$° +X!ØôY01!!4$32#"&'73265454654&#"ªþÝß´îk,æÙQŸ'7'rALVþÔmZ:L_Mâö¿°lÃD8þ匽¼ß!LAG ŽZÈKDZ‡uÿÿ7ÿëÚ&DCk ³-+01ÿÿ7ÿëÚ&Dv  ³/+01ÿÿ7ÿë&DR) ³0+01ÿÿ7ÿë+&DX22 ³/ +01ÿÿ7ÿëË&Dj³0 +°0°-Ð01ÿÿ7ÿëM&DVËw³5+°5°;Ð01.ÿë�N.9BÞ°#/° /°EX°/±>Y°EX°/±>Y°EX°/± >Y°EX°/± >Y´ � ]²O q²¿ ]²_ ]²/ ]°±° +X!ØôY² 9²¿#]²O#q²#r²�#q²ÿ#]´_#o#]²Ÿ#r°±(° +X!ØôY°±/° +X!ØôY° ±3° +X!ØôY°±:° +X!ØôY°#±?° +X!ØôY01"&'#"&5463354&#"%'&6326632!3267%2675#""!54&Þ�ÉC<Ë‹ÀÑþóµRJQ\þåÿÔf¨;=£cÔòýv||\|NM>Öü›:~%³bmS"_^jUQLDYµ�Ÿ¬;O[K8�¼7447þøâžp…()¸0IÎ=*°X?;E´{i^oÿÿ>þ4òN&Fz>ÿÿÿÿMÿëà&HCm ³!+01ÿÿMÿëà&Hv" ³$+01ÿÿMÿë&HR+ ³$+01ÿÿMÿëÌ&Hj³$ +°$°!Ð01ÿÿÿ²®à&óCÿe ³+01ÿÿ„‚Ë&óv ³+01ÿÿÿ¬Ží&óRÿ#ÿÿ ³+01ÿÿÿ›™¶&ójþÿ³+°°Ð010ÿëpí!.:°/° /°EX°/± >Y° °а±"° +X!ØôY° ±)° +X!ØôY01#"54327&&''7'&&'772655&&#"™fqþÆëîþÓ çQ�4P<õNÀJ(\X¡EÆMþt‰#€Wz„ˆ jþê¤ÄúþÃÐâ3-S�7ˆqj ÚC/mqûgÁ–v'4ž�p™ÿÿk+&QXS2 ³ +01ÿÿCÿë@à&RCŒ ³+01ÿÿCÿë@à&RvA ³ +01ÿÿCÿë@&RRJ ³ +01ÿÿCÿë@+&RXS2 ³ +01ÿÿCÿë@Ë&Rj&³ +° °Ð01?¤D¶ @°/±° +X!ØôY°°° +XØÜY°° +XØÜY°° ° +XØÜY° ° +XØÜY01!5!%!5!!5!Dûûþ‘þÛ%þÛ%=ã­éûîéCÿs@¿%1>°EX°/±>Y°EX°/± >Y±.° +X!ØôY°а±"° +X!ØôY°*Ð0143273#"&'#7&&5!&&#"!4&''3265Cï2],F¡g_fþñï0X(G¡gei#)qi¶ÿ%qi'ò5�ÓJë�ôþÍ ’ÓGï–>h" ·�6`"ý÷´“ÿÿiÿëË&XC‹ ³+01ÿÿiÿëË&Xv@ ³+01ÿÿiÿëí&XRIÿ ³+01ÿÿiÿë¶&Xj%³+°°Ð01ÿÿþKË&\v  ³+01yþ`J!U°EX° /± >Y°EX°/±>Y°EX°/± >Y°EX°/± >Y°±° +X!ØôY°±° +X!ØôY01#"&'!#!6632!4&#"3265JÞÇU„/þÝ$/‚UÉÞþÜfiB]]DjcÿðþÜ?=ýù ý±@EþÆÿ™¾62þ&.0¦ŽÿÿþK¶&\jò³+°°Ð01ÿÿ ò&$qŽA ³ +01ÿÿ7ÿë±&Dq ³- +01ÿÿ h&$T˸ ³+01ÿÿ7ÿë&&DT\v ³0 +01ÿÿ þX:°&$W6ÿÿ7þX)N&DW%ÿÿ]ÿëÛ7&&v¡q ³" +01ÿÿ>ÿëòà&Fv ³"+01ÿÿ]ÿëÛW&&Rªi ³" +01ÿÿ>ÿëò&FR ³"+01ÿÿ]ÿëÛG&&Ut‹ ³ +01ÿÿ>ÿëòð&FUæ4 ³ +01ÿÿ]ÿëÛf&&SÁr ³" +01ÿÿ>ÿëò&FS3 ³" +01ÿÿˆáQ&'Sq] ³+01ÿÿCÿëX&G' °EX°$/±$>Y01ÿ° `°EX°/±>Y°EX°/±>Y°EX°/± >Y°±° +X!ØôY°а±° +X!ØôY°±° +X!ØôY°°Ð013#53! !#326554&##3¦‡‡ô Zþ¦þõ$ôÁ�²²�ÁôŒµoþ«þõñþôþ­ŒþTÔ«ó©ÔþrCÿë¢'„°/°EX°/±>Y°EX°/±>Y°EX°/± >Y°EX°/± >Y²Ÿ]²/q²]²?]°±° +X!ØôY°а°а±° +X!ØôY°±$° +X!ØôY01##'#"55325#535!33267&&#"¢�û3‹ZÇÝÝÉQ‚1êê%�üÄ`l?^]>kcÄû<„KN$ð:FAýµŸŸü†Ž£31Í39¾™ÿÿˆmò&(q\A ³ +01ÿÿMÿë±&Hq" ³! +01ÿÿˆmh&(T˜¸ ³+01ÿÿMÿë'&HT^w ³$ +01ÿÿˆm2&(U/v ³ +01ÿÿMÿëñ&HUõ5 ³! +01ÿÿˆþXm°&(W ÿÿMþƒO&HWØ+ÿÿˆmQ&(S|] ³+01ÿÿMÿë&HSB ³% +01ÿÿcÿëæW&*R«i ³% +01ÿÿCþK&JR5 ³0+01ÿÿcÿëæ}&*TÞÍ ³% +01ÿÿCþK&&JThv ³0 +01ÿÿcÿëæG&*Uu‹ ³! +01ÿÿCþKð&JUÿ4 ³- +01ÿÿcþ æÅ&*'Òþ‡´0&@&]² &]01ÿÿCþK�&JS2š ³1+01ÿÿˆ!B&+RÛT ³+01ÿÿiC&KRU²+01ž°‰°/°EX°/±>Y°EX°/±>Y°EX°/±>Y°EX°/± >Y°EX°/± >Y²]²/]²]°°Ð°±° +X!ØôY°а±° +X!ØôY°° а° Ð013#!!!#53!!!!5!þÝý®þÜvv$R#ü‹Rý®¯«ûü]ý£«þÿýŽÆÿú6x°/°EX°/±>Y°EX°/±>Y°EX° /± >Y°EX°/± >Y²Ÿ]²/q²]²?]°±° +X!ØôY°±° +X!ØôY°°а°Ð01#6632!4&#"!#535!3™î3”Z©ÁþÜYX<\þÜ��$îÁþðJSáëý~„~i+'üçÁµ¢¢ÿÿÿ·¤m&,Xÿ@t ³+01ÿÿÿ£�&óXÿ, ³ +01ÿÿÿÂ�ò&,qÿ.A ³+01ÿÿÿ®‰�&óqÿÿì ³ +01ÿÿÿÔˆh&,Tÿj¸ ³+01ÿÿÿÀt&óTÿVa ³ +01ÿÿ)þXÚ°&,WÖÿÿþX¿&LW»ÿÿ’Â2&,Uv ³+01…©:°EX°/±>Y°EX°/± >Y01!!!©þÜ$:ÿÿšÿëf°&,-YÿÿþKÎ&LM#ÿÿ:ÿëÞ>&-RsP ³+01ÿÿÿ¦þKˆå&PRÿÿ÷ ³+01ÿÿˆþ9°&.'¦þ“¶0@P]² ]01ÿÿpþ^&N'Vþ”¶0@P]² ]01�”: Z°EX°/±>Y°EX°/±>Y°EX°/±>Y°EX°/± >Y°EX° /± >Y°±° +X!ØôY² 901#!!3!!tþÜ$Wpþ€‘þŠ•þk:þdœþýÁÿÿˆ4 &/vE ³ +01ÿÿ}{K&Ov…²+01ÿÿˆþ4°&/'€þ”¶0 @ P ]²  ]01ÿÿnþ£&O'1þ”¶0 @ P ]²  ]01ÿÿˆ4²&/'*¢°EX° /± >Y01ÿÿ÷&O'¿°EX°/±>Y01ÿÿˆ4°&/U°ýÞ°/01ÿÿ3&OUqýª°/01 #° Y°/°EX° /± >Y°EX°/± >Y°°Ð°±° +X!ØôY°а±° +X!ØôY°°а а° а Ð017!!57!›ûûˆüTkk$rHÃHþ1à[Ã’D G°/°EX° /± >Y°EX°/± >Y°°Ð°±° +X!ØôY°ааа° аÐ017!57!·��þÜ„„$‹/Ã/ý8g+Ã+îÿÿˆ!"&1vÔ\ ³+01ÿÿkà&QvA ³+01ÿÿˆþ!°&1'ôþ”¶0@P]² ]01ÿÿkþN&Q'aþ”¶0@P]² ]01ÿÿˆ!Q&1Sô] ³+01ÿÿk&QSa ³ +01ÿÿÿæ&Q'ÿ©°EX°/±>Y01ƒþK°_°EX°/±>Y°EX°/±>Y°EX°/± >Y°EX°/± >Y°EX°/± >Y°± ° +X!ØôY°°а°Ð01#"&'732655!!7ʳ)D$29@ýµþÛ%K°ú(¾Ï ÝZR(Öü+°ü+ÔkþKNU°EX°/±>Y°EX°/±>Y°EX° /± >Y°EX°/± >Y° ±° +X!ØôY°±° +X!ØôY016632#"&'732654&#"!{ 5ža¤¸Ê´(D$2:>QQ@b þÜ:˜Q[ÓäýA¾Ï àVR¾ta/*üî:ÿÿ\ÿë&2q»V ³ +01ÿÿCÿë@±&RqA ³ +01ÿÿ\ÿë}&2T÷Í ³  +01ÿÿCÿë@&&RT}v ³ +01ÿÿ\ÿë`&2Yùr³& +°&°Ð01ÿÿCÿëo &RY³&+°&°Ð01aÿëBÅ%�°EX°/±>Y°EX° /± >Y°EX°/±>Y°EX°/± >Y°EX°/± >Y°±° +X!ØôY°±° +X!ØôY°±° +X!ØôY°±° +X!ØôY° ±° +X!ØôY01!!# !2!!!!!267&&#"Bü�\�Cþòþ°NEŽOaýA[ý¥Áû}(O'-M&”¥§ K 0 L áþ’áþ`½µþζ¾Cÿë N"09’°/°EX° /± >Y°EX°/±>Y°EX°/± >Y°EX°/± >Y²ÿ]²�q²Ÿr²r²Oq²¿]´_o]°±° +X!ØôY°&а ±-° +X!ØôY°1а±6° +X!ØôY01"&'#"554326632!3267326554&#""!54&YÊDCÈðþñïÈCA½wÛòýzma€LOBÖûŠhtqijrqiÙQ^ fW\UU\3ôò5]ST\þøáŸkŠ'*´6G'”³´“�¶·�F|e]oÿÿˆ"&5vv\ ³(+01ÿÿpà&Uvœ ³ +01ÿÿˆþ°&5'–þ”¶0(@(P(]² (]01ÿÿlþÈN&U'/þ”¶0@P]² ]01ÿÿˆQ&5S–] ³)+01ÿÿ!&US¾ ³ +01ÿÿUÿë¾7&6v‰q ³+ +01ÿÿ:ÿëÔà&Vv ³+ +01ÿÿUÿë¾W&6R’i ³* +01ÿÿ:ÿëÔ&VR ³* +01ÿÿUþ-¾Å&6z±ÿøÿÿ:þ-ÔN&VzÿøÿÿUÿë¾f&6S©r ³, +01ÿÿ:ÿëÔ&VS( ³, +01ÿÿþv°&7'kþ”¶0 @ P ]²  ]01ÿÿ þ’C&W'ÐþŠ´0@]² ]01ÿÿvQ&7Sk] ³ +01ÿÿ ÿëC5&W' %°/01v°G°/°EX° /± >Y°EX°/± >Y°±° +X!ØôY°°а ± ° +X!ØôY° Ð01#!#53!5!!3ŸÅþܶ¶þfZþdÅõý õµ%ááþÛÿóÿë’Ci°/°EX°/±>Y°EX°/± >Y°°а±° +X!ØôY°в]² ]°°а±° +X!ØôY°а± ° +X!ØôY013#3#3267#"&55#535#53˶¶ÇÇ4,!,T1—£´´žžCþ÷Í�µÕ?6Ó¦´Öµ�Í ÿÿxÿëm&8XÒt ³+01ÿÿiÿë&XXR ³ +01ÿÿxÿëò&8qÀA ³+01ÿÿiÿë�&Xq@ì ³ +01ÿÿxÿëh&8Tü¸ ³+01ÿÿiÿë&XT|a ³ +01ÿÿxÿë�&8Vk¹³+°°!Ð01ÿÿiÿë8&XVëb³+°°#Ð01ÿÿxÿëK&8Yþ]³+°°Ð01ÿÿiÿënô&XY~³+°°Ð01ÿÿxþX°&8W”ÿÿiþX1:&XW-ÿÿûB&:R“T ³ +01ÿÿÂí&ZRùÿÿ ³ +01ÿÿB&<R•T ³+01ÿÿþKí&\Rÿ ³+01ÿÿ &<jq]³+°° Ð01ÿÿMv#&=vY] ³+01ÿÿKÎË&]v  ³+01ÿÿMv3&=U,w ³ +01ÿÿKÎÛ&]Uß ³ +01ÿÿMvR&=Sy^ ³+01ÿÿKÎú&]S, ³ +01t¤-'°/°EX°/± >Y²/]°± ° +X!ØôY0134632&&#"tÒ¾%K0*GL²¶Å ×QIûNÿÎþKè-#ˆ°/°EX°/±>Y°EX°"/±">Y°EX°/± >Y°"±° +X!ØôY°± ° +X!ØôY°°ав0q² ]²]´/?]²ð]²Àq²r°±° +X!ØôY01##"&'73265#5354632&&#"3«ÏÊ´(B%09?  Ò¿%K0/GIÏmük¾Ï ÝZR•Íx¶Å ÙNIxWÿëQ%;°EX° /± >Y°EX°/± >Y° ±° +X!ØôY°±"° +X!ØôY01! !26653%4&#"3265þ­þñþóþ°O †ãRhlØ —þܪ••¤¦”–¨Uþôþ¢^  _^T¤€Àþ4<ƒEªÚÙ«þø­ÚÚ­CÿëîÏ%8°EX°/±>Y°EX°/± >Y±° +X!ØôY°±"° +X!ØôY014326653#"5!326554&#"Cïp¶C8:Óxrþñïðþñ#htqijrqi'ò5IB#‰`’Ë1>�MôþÍ3ô”³´“�¶·�xÿë€G6°EX°/±>Y°EX°/±>Y°EX° /± >Y±° +X!ØôY016653! 5!3265SH×·Áþ¼þúþûþ¿%š‡‰œ°µ¨‘çþöý°õþö õÆü:��Ž‘Æiÿëw¬F°EX°/±>Y°EX°/±>Y°EX° /± >Y°EX°/± >Y° ±° +X!ØôY01#'#"&5!3267!665r©¶ù2šd«Á#PNFd $RG¬°ÅüäœU\Ûç�ýqvg-,| unÿÿÿ—þK�ô&PSÿ4 ³+01ÿÿ \&$q6–³+°°а°!Ð01ÿÿ7ÿë&DqÆT³;+°;°/а;°AÐ01ÿÿI"&ˆv¦\ ³+01ÿÿ.ÿë�á&¨v^ ³G+01ÿÿ\ÿ¡`&švÉš ³6+01ÿÿCÿs@Ü&ºv ³5+01ÿÿUþ¾Å&6'»þ€ ´0,@,]01ÿÿ:þÔN&V'(þ€ ´0-@-]01ÿ¬þK¹:)°EX°/±>Y°EX°/± >Y± ° +X!ØôY01#"&'73265¹Ê³)A&19@:ûž¾Ï ÝZRbÿÿ9økù°EX°/±>Y01‰äkî.°/²?]°а°° +XØÜY¶/]°° +XØÜY01#'#5%3k茋ã©û……ðcä\ô.°/²?]°° +XØÜY°°° +XØÜY¶/]°Ð017!#5!ßuþçÇþçuÿjаE°/²]° ° +XØÜY´P ` q@ �   ° À Ð ]°° +XØÜY@ Ÿ¯¿Ïß]° Ð01#"&7733265»žŸ¼Õ=A?=°¡¡5DD5’˼°/°° +XØÜY01!5!ÂþÐ0Ëñ�R(Ö (° /²? ]°° +XØÜY´?O]° °а°Ð014632#"&732654&#"�{ZXzyYZ{t8))55)*7SqqSTllT+77+,89SþX<3°/°EX° /± >Y±° +X!ØôY@/?O_o]01!3267#"&5467•62"4+#$Y=l‹\b5J1+ šqeM‹6wÎdùn°/²?]°° +XØÜY²¯q@ ?O_oq°° а° ° +XØÜY²` q@   ° À Ð ]°°° +XØÜY@  °ÀÐ]²`q° °Ð01#"&#"'46323265dw[F±4$0œwZ8À4"4Ì`‡WA-*^‹W@/�äðî '° /²? ]°° +XØÜY¶/]°Ð° °Ð01!#'!#×þãê”ðëîþüþûžþz ÿÁ 1°/°° +XØÜY°° +XØÜY° ° +XØÜY°°° +XØÜY014632#"&732654&#"žjNLhhLOir'%%'äG^^GF\\F'& ''üé­þWæ°/°° +XØÜY²]01#3þW±½ç­9ü÷²þdì°/°° +XØÜY²]013#ý~æ¿®ìþÆÿÿü}ÎÿjùXüýðþ¡…1°/°° +XØÜY°° +XØÜY° ° +XØÜY°°° +XØÜY01'66'56Hý1J?JC¹ÄV@ð‰#…h[@H AûõäÿXî %°/°° +XØÜY¶/]°°а° Ð01#7!#7!ýýéþãKìðéþöýþžþMÿ�°/°° +XØÜY°° +XØÜY²O]01!5!þMþ¹GþžñîöPX°/°° +XØÜY01!#:Ñ‘Xþž™ä»Ý @°EX°/±>Y°EX° /± >Y°°° +XØÜY°а°а °° +XØÜY01#53#53!#»þþýÛýýr°”äÌÌÌ-þéÿÿ X&$aÿz²? ]01ÿÿŸ8Ã<yÿÿÿvÑZ&(daþˆ²? ]01ÿÿÿŸ…X&+daþ±²? ]01ÿÿÿ¨"Z&,daþº²?]01ÿÿÿñÿë/X&2aÿ²?]01ÿÿÿ>kX&Y°EX°/± >Y°±° +X!ØôY01!!!=ýoþܵÏû1°Å°/°EX°/±>Y°EX°/± >Y±° +X!ØôY°°Ð01!!%!#],<úQ†¤þµ°úPàuÿÿˆm°(ÿÿMv°=ÿÿˆ!°+\ÿëÅW°EX°/±>Y°EX°/±>Y°EX°/± >Y°±° +X!ØôY°±° +X!ØôY°±° +X!ØôY01!5!! ! %4&#"3265„þ„|—þ­þñþóþ°O Tþܪ••¤¦”–¨eàðþôþ¢^  _þ¡þõªÚÙ«þø­ÚÚ­ÿÿš¾°,ÿÿˆ9°.°0°EX°/±>Y°EX°/± >Y°EX°/± >Y°°Ð01#!!!šþ±þÎî+îþÏpû�°úPÿÿˆr°0ÿÿˆ!°1b7° T°EX°/±>Y°EX°/±>Y°EX°/± >Y±° +X!ØôY°±° +X!ØôY°± ° +X!ØôY017!!!!!!bÕü+pôý Z–üjààQÙ8áÿÿ\ÿëÅ2ˆ"°9°EX°/±>Y°EX°/± >Y°EX°/± >Y°±° +X!ØôY01!!!!!"þÜý®þÜšÏû1°ÿÿˆç°3HQ° \°EX°/±>Y°EX°/± >Y²9°°Ð°±° +X!ØôY²9°± ° +X!ØôY² 9°° Ð01!!55!!8þ”…û÷»þEîý˜jÔþ á˜E<—áþÿÿv°7ÿÿ°<;¸°#V°/° /°EX°/±>Y°EX°/± >Y°°Ð° °а ±° +X!ØôY°±° +X!ØôY°а° Ð01!5&5475!7'4&'66�ø3þÌ÷þÜúþÌ4ú$ýÌ�{{�@�yy�çþÞåáþãÃà âç$Éý}’4˜��— ýÌ’ÿÿ°;8ްR°/°EX°/±>Y°EX°/±>Y°EX°/±>Y°EX° /± >Y°± ° +X!ØôY° а°Ð01665!!&!7!xsx%þàöþÝûþÞ#€t#E¶¢ýûþüþÊþ©V7 ýûž·jhçÅ#N°EX°/±>Y°EX°/± >Y°EX°"/±" >Y°±° +X!ØôY°±° +X!ØôY° а!Ð01%6554&#"!53&55323!ß\j‡xw…kaþôx’?ÿÿB“vúþç!í^¿Èɾ^ïþû!çã[ \\þ¤þï\¡þä\ãÿÿÿ¯­ &,jÿ]³+°°Ð01ÿÿ &<jq]³ +°° Ð01ÿÿIÿëŽ*&‹a ÿÒ ³1+01ÿÿ_ÿì.)&�aêÿÑ ³.+01ÿÿkþa*&‘aâÿÒ ³+01ÿÿ‰ÿëˆ&“a̼ ³+01ÿÿqÿë9Ÿ&Ÿb ²+°°а°!Ð01IÿëŽN-X°EX°/±>Y°EX°/±>Y°EX° /± >Y°EX°/± >Y° ±° +X!ØôY° а±*° +X!ØôY013267#"&'#"553273267&45&&#"#$  #@*]�!1ˆ[ÈÝÞÉW…1.þB_l;TR9kb9ý @3Ò LNKO$ð:PJ…ýÆ�¥-, Ê-1¿šŽþmˆÅ*d°EX°*/±*>Y°EX°/±>Y°EX°/± >Y°EX° /± >Y°±° +X!ØôY° ±"° +X!ØôY°*±)° +X!ØôY012#"&'!4$2654&#"32654&##5s×ÿfYy…ïÏJ’=þÝÈ^X]UVl'mCewpf`ÅÒ¹b£0+º�Ïå&&þ6 Á÷ý–icOnvaüûy^lÎþ_: =°EX°/±>Y°EX°/±>Y°EX°/± >Y²9°°а° Ð01!!!37Ö1þ–þÜþ—1¶:û×þNµ&ýYddCÿë@°$T°/°EX°/±>Y°EX° /± >Y°±° +X!ØôY²9°±° +X!ØôY° ±° +X!ØôY01!#"554?%5"326554&Óþlôv™þñïðþñØ©þÝ–qihtqij°à¼Wõ›ôþÍ$éÈí±ý½·�”³´“�¶_ÿì.M*T°EX°)/±)>Y°EX°/±>Y°EX°/± >Y±° +X!ØôY°±"° +X!ØôY°)±*° +X!ØôY01"3265!#"$5467&&54$32!4&#"33H`fg]^jþéÁÜþåicWbÜÁþæfOYY\W»Ê@E7OJ7¢¬¯—Z€!$yH–¥³‘6@J27?½KþUѰ!O°EX°/±>Y°EX°/± >Y°EX°/± >Y°±° +X!ØôY²9°±° +X!ØôY01332'6654&##"&5477'!5Èþ˜m\af6“ª²•aAO>I1ÁÉ„‹Íýü°œþP�¿~fc’†}É*ÁF5(+Ü¢™ªòàkþaNF°EX°/±>Y°EX°/±>Y°EX°/± >Y°EX°/± >Y°± ° +X!ØôY016632!4&#"!{ 5ža¥·þÛQQ@b þÜ:˜Q[ÐçûÊ5tc/+üí:eÿë>Å W°EX° /± >Y°EX°/±>Y°EX°/± >Y°±° +X!ØôY°±° +X!ØôY° ±° +X!ØôY01#"32!3265!54&#">þ÷âäþö ãâ þÝþmgdbfþm“hbcf7þßþÕ+!A -þÓþàþ÷T°  °-N­¡ ®‰ÿëˆ9)°EX°/±>Y°EX° /± >Y±° +X!ØôY013267#"&5­,/"#/U7�§9ý@3 Ò«¯ôÿÿ�”:ú ÿòwî!K° /°EX°/± >Y°EX°/± >Y² 9° ±° +X!ØôY°±° +X!ØôY°°Ð01!!'&&#"'663227'&&'#GþÅx6P5 * )A%žŸ-k;)  C!•,Ž#l7FÑ žtü}5DÛ ·ƒˆPÿÿ‹þ`Q:wÿÿ:Ygþ@6°.`°/° /°EX°/±>Y°EX°/± >Y°±° +X!ØôY° ± ° +X!ØôY°±° +X!ØôY²& 9°°,а-Ð01!33#"332'6654&##"$5467&&5467#5Õþèmkkr—��£~ny™®©�R;U?AFêþë–‘cjIEÕ°èVHKWè�|\qŒ‰�À1¬I<-3éÐ…¸/"wREg!èÿÿCÿë@NRNÿëá:Q°EX°/±>Y°EX° /± >Y°EX°/± >Y°±° +X!ØôY° ±° +X!ØôY°°аÐ01#3267#"&5#!#5!ÇÁ,/"#/U7�§ÙþݘydýÝ@3 Ò«¯üœdÖpþ`>NH°EX° /± >Y°EX°/± >Y°EX°/± >Y° ±° +X!ØôY°±° +X!ØôY01#"&'!432!4&#"33265>ÜÇUƒ0þÝ äåúþÝbi_^]DjbÿðþÜ=;ýýáë"þÇþÿš¿¸‹ÿ.0¦Ž>þHìN"H°EX°/±>Y°EX°/± >Y°EX°/± >Y°±° +X!ØôY°±° +X!ØôY012!4&#"'6654&'&5542ÈòþöWSp`‚‘½­²”aANKOùôNß¿Un¶Œˆ”€†~È*ÁD6(-$Þí6Aÿë}:A°EX°/±>Y°EX°/± >Y°±° +X!ØôY°±° +X!ØôY°°Ð01!#"5543!326554&#"}þþPdþøæñþñï>üèhtibcjqiXBµcÝþß3ôê)ýØ”³´“‡ª«†3:/°EX°/±>Y°EX°/± >Y°±° +X!ØôY°Ð01!!!5!þ¥þÜþ«Ô[ü¥[ßqÿë9:6°EX°/±>Y°EX° /± >Y°EX°/± >Y±° +X!ØôY013265&'!#"$5”eTi`4.2@ãÿåþÿ:ýœŽ}Ó˜~„iþý˜þôþÁôùb5þ"·:!T°/°EX°/±>Y°EX°/±>Y°EX° /± >Y°а ±° +X!ØôY°±° +X!ØôY°°Ð01 !$5467!7&&66… (þòþÜþÝþÝþöG:29yŠ1Š|‹}:þ·ØÛþÑþ0Ò#Kî�ödƒòu‘ÁUýߊ³ý�¨þN@J%b°EX°/±>Y°EX°/±>Y°EX°/± >Y°EX°/± >Y²9°°а± ° +X!ØôY°±° +X!ØôY012!3'&&/!&&#"'66µ—™+>Ä(þš¸:(  K"o‡2;Ûþßvª\: * ,HJžs‘“ý'þV4AÞ ´†ˆþBŠ9AÔ Dþ"´:O°/°EX°/±>Y°EX°/±>Y°EX°/±>Y°EX°/± >Y±° +X!ØôY°а°Ð01665&&'!!$!7ƒ‰919HþôþÛþÜþÿþæ$�p:üªÃ�vò‚cö‘ñþ´ þ/Ó)ìþ¡¯TPÿë�:(F°EX°/±>Y°EX°/±>Y°EX°/± >Y°EX°"/±" >Y±° +X!ØôY°Ð013265!3265&'!#"&'#"47@IR^Pc4aQ]SI@EUÖòv¯23°tóÖTF:‚þýžÍ‰–Zþ¦–‰ÌŸ€‚gþü™þôþÁnjjn? ™hÿÿÿ¬ÿ몵&“jÿ³+°°Ð01ÿÿqÿë9¶&Ÿj:³+°°Ð01ÿÿCÿë@*&RaâÿÒ ³+01ÿÿqÿë9&Ÿaöÿ½ ³+01ÿÿPÿë�&£aÿ½ ³,+01zÿëÅ%J°/°EX°/±>Y°EX° /± >Y±° +X!ØôY°±° +X!ØôY°±$° +X!ØôY0154632! 5%3267&$4&#"7"׬«Èþ¾þùþöþµ4›†“ÂþÿÃ)'+3ZNÈg¹ÝÙ½ýýþûþÄHù¸ýF˜¿°œì/ABC@„Srÿó¿È#O°EX°/±>Y°EX°/±>Y°EX°/± >Y°±° +X!ØôY° в!9°!°а!°Ð016632&&#"!&&#"'663237=—‚ 2$ %8þâþÝþè8$ #2!ƒ–<•³™| Þ4+ý`þ#é”+4Þ v˜þZZÿë˜:,Q°EX°/±>Y°EX° /± >Y°EX°/± >Y°±° +X!ØôY°аа ±!° +X!ØôY°*Ð01##"&'#"467#5!&&'!32655!326˜Èât­13­rãÇv…þ’ü¾CNO`3_NMEqH�VþôþÁnjjn? V�HÉýüLžQOžNŸÌ‰–ÍÍ–‰Ìÿÿˆm"&(C§\ ³ +01ÿÿˆm &(jA]³+°° Ð01ÿÿˆ="&nvc\ ³ +01nÿììÆ!W°EX° /± >Y°EX°/±>Y°EX°/± >Y° ±° +X!ØôY°±° +X!ØôY°±° +X!ØôY01! ! !4&#"!!3265äþÙþúþùþ¸@0þ䊒ƒšµþK¢Š‰ƒðëþíR ! Tþëï�™Õ¥â"§Õ“‘Uÿë¾Å']°EX° /± >Y°EX°/± >Y² 9°±° +X!ØôY° ° а ±° +X!ØôY°°!а±%° +X!ØôY014&'$$54$32!4&#"#"$77!326šw•þüþö1íð.þå‡zu€‰¨ñøþÙòîþžŸŽw~|Tf-Kγ³ãÿ»e}hQJ_5Cܳ»ØõÝ‚ybÿÿš¾°,ÿÿÿ¯­ &,jÿ]³+°°Ð01ÿÿ:ÿë °-*;°i°/°EX°/±>Y°EX°/± >Y°EX° /± >Y°± ° +X!ØôY°±° +X!ØôY°±° +X!ØôY° ±° +X!ØôY0132#!!!#532632654&#úú(þØúýâþ~þñþë+(–mÊúz……z°þþ÷ÐÒþøÏþJþ[þŒà÷B—ý"þ’jf�ˆ>°t°/°EX°/±>Y°EX°/±>Y°EX°/±>Y°EX° /± >Y°EX°/± >Y°± ° +X!ØôY°±° +X!ØôY° ±° +X!ØôY01!!32#!!!!32654&#¬Q$úû(þ×úýâý¯þÜ$uú{„„{IgýñþþÍÎþühý˜°ýþ$Šfc‰ÿÿˆ9"&.vZ\ ³+01ÿÿ~"&ÀC\ ³ +01ÿÿ$ÿëîh&ÓTÓ¸ ³+01{þ˜° F°/°EX°/±>Y°EX°/±>Y°EX°/± >Y°EX° /± >Y±° +X!ØôY01!!!!!!{#R$þRþÜþ9°û0ÐúPþ˜hÿÿ °$wŰ M°/°EX° /± >Y°EX° /± >Y° ±° +X!ØôY°± ° +X!ØôY° ±° +X!ØôY01!32#!!32654&#,ý|úû(þ×úýÕµý|ú{……{ÏþáþúÐÒþø°ýþ’jf�ÿÿˆÊ°%ÿÿˆ=°nÿÿˆm°(WÿëâÅ*^°EX°/±>Y°EX°/±>Y°EX°/± >Y°±° +X!ØôY°±(° +X!ØôY²(9°±"° +X!ØôY012654&#"!'&$3 !"$77!32654&##5›‰„’‹m�þå:å 6‚r�Šþ´þõæþ²™xŽ¥“�ÅTlaToiRµáØÈd¦/+¬}ÉäÖÍUtu[skÛ~° C°EX°/±>Y°EX°/±>Y°EX°/± >Y°EX°/± >Y°°а° Ð01!!'!!ò%þÛýµþÝ#°úPËü4°ü6ÿÿ~h&ÀT¸ ³+01ÿÿˆ9°.*°H°EX°/±>Y°EX°/± >Y°EX°/± >Y°±° +X!ØôY°± ° +X!ØôY01!!!#5326þÜþbÿþ÷+(‰^°úPÏþJþZþ�àôE—ÿÿˆr°0ÿÿˆ!°+ÿÿ\ÿëÅ2ÿÿˆ"°{ÿÿˆç°3ÿÿ]ÿëÛÅ&ÿÿv°7ÿÿ°;–þ™á° ?°/°EX°/±>Y°EX°/±>Y°EX° /± >Y±° +X!ØôY°аÐ01!!!3!!–$R$±þÜûÙ°û1Ïû1ý¸g‹°<°/°EX°/±>Y°EX° /± >Y°EX°/± >Y°±° +X!ØôY01!# $5!3267þÛB¤AþôþÛ$Ž>§B°úP1èóÅþ;Žlž•}° X°/°EX° /± >Y°EX° /± >Y°EX°/± >Y°EX° /± >Y°±° +X!ØôY°±° +X!ØôY0132#!!!!32654&#¹úû(þ×úýâ$ÄþÜ$û<ú{……{°þúÐÒþø°úP°ýþ’jf�Vÿì§Æ!T°EX°/±>Y°EX°/±>Y°EX° /± >Y±° +X!ØôY°±° +X!ØôY°±° +X!ØôY01'&!2# 77!32655!5!54&#"^ý5þËýþýþäy„�ŒþA¿Œ�ƒxÎè þ®þõþßþôþ°îŽ‡Ñ©+á¨Ô‰ŽšÿëûÅ#q°EX°/±>Y°EX°/±>Y°EX° /± >Y°EX°/± >Y°EX° /± >Y°±° +X!ØôY°±° +X!ØôY°± ° +X!ØôY01! 5#!!35! %4&#"3265ûþ­þñþóþ°~þÜ$~O Tþܪ••¤¦”–¨Uþôþ¢^ ý¤°ý� _þ¡þõªÚÙ«þø­ÚÚ­ÿÿ7ÿëNDD: j|°/°EX°/±>Y°EX°/± >Y²à]²pq²@]²]°±° +X!ØôY²9°±° +X!ØôY°±° +X!ØôY013!2#32654&#'32654&##ÄØñe]{åÖææMJGPæ¨QMRT :˜–Lv…Y™œÃå988<¾44;7kN:,°EX°/±>Y°EX°/± >Y°±° +X!ØôY01!!!NþAþÜãXü¨:ÿÿMÿëOHk: C°EX°/±>Y°EX°/±>Y°EX°/± >Y°EX°/± >Y°°а° Ð01!!'!!ö#þÝþŸþÜ$:ûÆ”ýk:ýnÿÿk&ÕT~a ³ +01�…: Z°EX°/±>Y°EX°/±>Y°EX°/±>Y°EX°/± >Y°EX° /± >Y°±° +X!ØôY² 901#!!3!!pþÜ$féqþŸ�þ{•þk:þdœþýÄ:H°EX°/±>Y°EX°/± >Y°EX°/± >Y°±° +X!ØôY°± ° +X!ØôY01!!##'7265þÝþüÄí/d<:ûÆXëþÀþÓæ¤âÍ�ˆ:S°EX°/±>Y°EX°/±>Y°EX°/± >Y°EX°/± >Y°EX° /± >Y°°Ð°° аÐ013!!'#!!þmþÝûÄõþÜjTæûƆýyyýˆ:k: _|° /°EX°/±>Y°EX° /± >Y°EX°/± >Y°EX°/± >Y²à ]²p q²@ ]² ]° ±° +X!ØôY01!!!!!!!þÜþœþÜ$d$¤þ\:þJ¶ÿÿCÿë@NRk:9°EX°/±>Y°EX°/± >Y°EX°/± >Y°±° +X!ØôY01!!!!!þÜþšþÜ®Xü¨:ÿÿpþ`@NS>ÿëòN8°EX°/±>Y°EX°/± >Y±° +X!ØôY°±° +X!ØôY01%265!#"55432!4&#"6N^ ÿ½òþúòÈõþö\Qt__Ë[L¤Ý2ðï4äºTo´Ž‘±0:2°EX°/±>Y°EX°/± >Y°±° +X!ØôY°аÐ01!!!5!þ¦þÛþ«Ô[ü¥[ßÿÿþK:\ÿÿ:[kþšµ: ?°/°EX°/±>Y°EX°/±>Y°EX° /± >Y±° +X!ØôY°аÐ01!!!3!!k$f$œþÝüÙ:ü¦Zü¦ýºfg:A°/°EX° /± >Y°EX°/±>Y°EX°/± >Y²]°±° +X!ØôY01!!#"$5!3267!þÜ%M"ïþý$^p%I&$WÌÒTþ¬kRk$: I°EX°/±>Y°EX°/±>Y°EX°/±>Y°EX° /± >Y±° +X!ØôY°аÐ01!!!!!�&%&$úG:ü¦Zü¦ZûÆ:kþ˜:X° /°EX°/±>Y°EX°/±>Y°EX°/±>Y°EX° /± >Y±° +X!ØôY°аа а /° а /01!!!!3!!�&%&$ßþÜúŒ:ü¦Zü¦Zü«ý³h:•ã: X°/°EX° /± >Y°EX° /± >Y°EX°/± >Y°EX° /± >Y°±° +X!ØôY°±° +X!ØôY0132#!!!!32654&#ºËÚúúÚþ%)þÜ$û×ËYXXYÜÉ£¥Ë:ûÆ:ýÂþãP?=Q�E: >°/°EX° /± >Y°EX°/± >Y°± ° +X!ØôY°± ° +X!ØôY0132#!!32654&#¦ËÚúúÚþ%ËYXXYÜÉ£¥Ë:ýÂþãP?=Q?ÿëîN!h|°/°EX°/±>Y°EX°/± >Y°±° +X!ØôY°±° +X!ØôY²]²Oq²]²@]²à]°±° +X!ØôY01"!'&632#"&77!3267'!5!7&&ùM\þöþ¼íþøìÇô ZP`aþçam\J£ÞþËîîþÌã»Uo‹o¯j……ÿë:N!q°EX°/±>Y°EX°/±>Y°EX°/±>Y°EX° /± >Y°EX°/± >Y°±° +X!ØôY° ±° +X!ØôY°±° +X!ØôY0136$32#"$'#!!326554&#"©œÑðþñïØþ÷™þÜ$·htqijrqi—ÆñþÌóôþÍûÐþJ:ýØ”³´“�¶·�3: R°/°EX°/±>Y°EX°/± >Y°EX°/± >Y°±° +X!ØôY²9°±° +X!ØôY01!#!&&546333#"þÞ°ÔþÙïckûÕ¬WP¿ºRZ:ûÆ{þ…«,šbžÉþ‘8SXÿÿMÿëá&HCm ³!+01ÿÿMÿëÌ&Hj³$ +°$°!Ð01ÿñþK)‰°)/°EX°&/±&>Y°EX°/±>Y°EX°/± >Y°EX°!/±! >Y²Ÿ)]²/)q²)]´/)?)]°)±° +X!ØôY°±° +X!ØôY°±° +X!ØôY°°"а)°$Ð01!66323#"&'732654&#"!#535!!�þý3”Z©ÁÊ´(D$29?YX<\þÜxx$¸þùJSáë¬þ¾Î ÜYR­~i+'ü縵««ÿÿkNË&Óv¦ ³ +01HÿëüN!e|°/°EX°/±>Y°EX°/± >Y±° +X!ØôY°±° +X!ØôY²]²�q²q²Oq²]°±° +X!ØôY01%265!#"55432!4&#"!!@N^ ÿ½òþúòÈõþö\Qfbþã`Ë[L¤Ý2ðï4äºToŽq¯j€ÿÿ:ÿëÔNVÿÿ£Lÿÿÿ›™¶&ójþÿ³+°°Ð01ÿÿÿžþK«Mº:i°/°EX°/±>Y°EX°/± >Y°EX° /± >Y°± ° +X!ØôY°±° +X!ØôY°±° +X!ØôY° ±° +X!ØôY0132#!###'326532654&#ËÚûûÚþèÔï/ZX0ËZXXZ:þ£Ê£¥ËXëþÄþÏãÀÊÍýÂþâT@Y°EX°/±>Y°EX°/± >Y°°а° а± ° +X!ØôY°±° +X!ØôY° ±° +X!ØôY01!!32#!!!!32654&#�d$ËÚúúÚþþœþÜ$ˆËYXXY™¡þ¢É£¥Ë¹þG:ýÂþâT@Y°EX°/±>Y°EX° /± >Y°EX°/± >Y²Ÿ]²/q²]´/?]°±° +X!ØôY°±° +X!ØôY°°а°Ð01!6632!4&#"!#535!!¼þÑ3”Z©ÁþÜYX<\þÜLL$/»þöJSáëý~„~i+'ü绵¨¨ÿÿ�…Ê&×v: ³+01ÿÿkË&ÕC� ³ +01ÿÿþK&\TGa ³ +01kþš: I°/°EX°/±>Y°EX°/±>Y°EX°/± >Y°EX° /± >Y±° +X!ØôY°Ð01!!!!!�f$þ»þÝþº:ü¦ZûÆþšf:ÿæÅ°c°/°/°EX°/±>Y°EX° /± >Y²?]²]°±° +X!ØôY° а° а±° +X!ØôY° ±° +X!ØôY01#32#!#535!332654&#…Ýúû(þ×úýâžž$ÝÝú{……{B’þúÐÒþøBµ¹¹ýØþ’jf�?° U°/°EX°/±>Y°EX°/± >Y°EX°/± >Y°EX° /± >Y°°а± ° +X!ØôY°°Ð01###!!!!#Œoõd�þÏ,ÿþÎýùDŸ†þz†þz°úPOàd: D°/°EX°/±>Y°EX°/± >Y°а°а° а± ° +X!ØôY°°Ð01###!!!3''#ÝM¿E\þט,™þ×þ�ÓLþñþñ:ûÆÈÝqq­P°V° /°EX°/±>Y°EX°/± >Y° ±° +X!ØôY°а°а° а аа °а °а°Ð01!!!###!#!!!#Ñ#1,ÿþÎ�oõd�þωÛþÜ$FDŸOaúP†þz†þz…þ{°üŸà¦#:S° /°EX°/±>Y°EX° /± >Y° ±° +X!ØôY°а°а ° аа °а°а °Ð013!!###!!3''#7ʧí,™þ×^M¿E\ý·$ÀÓLýõ\ÇsûÆþñþñ:ýŽÝqqþkõöq‡°q°EX°/±>Y°EX°/±>Y°EX°/± >Y°EX° /± >Y°EX°/± >Y°°Ð°± ° +X!ØôY° а°а±° +X!ØôY01!4&##!#"!4$%!!—ôüþÜt€TþÜn�sþÜ þŠýÊþl$Úêþ¨Xƒfý¿Afƒþ¨XòÙ‹ý—…no:g°/°EX°/±>Y°EX°/± >Y°EX° /± >Y°EX°/± >Y°°а±° +X!ØôY°а°а±° +X!ØôY0135467!!54&##!#"3#nÆÁþí)þì¸ÀþÝYc þÜdXb{ü³ÎÎÙþ&Îʳ³{`þrŽ`{³{š¾°"ްEX°/±>Y°EX°/±>Y°EX°/±>Y°EX°/± >Y°EX°/± >Y°EX° /± >Y°EX°/± >Y°°Ð°±° +X!ØôY°а а° а±"° +X!ØôY01!4&##!#"!47!!!!!!ÎôüþÜt€TþÜn�sþÜ,þêþÜ$úþ‹ýÊþl$Úêþ¨Xƒfý¿Afƒþ¨X‹_ý¾°ývŠý—……i:#‡° /°EX°/±>Y°EX° /± >Y°EX°/± >Y°EX°/± >Y°EX°/± >Y°EX°/± >Y° ±° +X!ØôY° ° а°аа ° а ±#° +X!ØôY01!547#!!!!!54&##!#"3#h+êþÜ$Cþð)þì¸ÀþÝYc þÜdXb{ü³ˆ[þj:þ+Õþ&Îʳ³{`þrŽ`{³{þ@³{,5�°/°2/°EX°,/±,>Y°EX°/±>Y°EX°/± >Y°±° +X!ØôY°,±+° +X!ØôY²+,9°±#° +X!ØôY²2]°2°-° +XØÜY°2°5° +XØÜY¶55/5]°.Ð012654&#!5!2##"&&'46332654&##57!#5!„qmsrþüòyn†Žþíæ:;6TY°EX°/± >Y°EX°/± >Y°±° +X!ØôY²,]²O,q²ï,q²¿,q²,q²,r²,]°,±+° +X!ØôY²+,9°±#° +X!ØôY°2°-° +XØÜY°2°5° +XØÜY¶55/5]°.Ð012654&#!5!2##"&&'46332654&##57!#5!”\Ygeþüæ ^VmtýÓ1C>K6Rƒ¦­š8evxqŸûuþçÇþçrH>5@Í—”T{#!xT˜­3-Y°EX°/±>Y°EX°/± >Y°а±° +X!ØôY01376632&&#"!!â\0¨� 2" &= èþéþ¤1“XXv¢£ Ý;+ý:ÿÿÿÑ%@&_ÜR³+°°Ð01ÿÿ\þK ˆÅ&2\wÿÿCþK•N&R\„\ÿx)/J°EX°/±>Y°EX°/± >Y°а°а±° +X!ØôY°а±(° +X!ØôY°+Ð01#5&'&76753%4'&'#5536765ª†ÇÃÒ‹¨§‹ÑÃLjªþÜU4LÃW7RS8WÃL3TUþô¯‹{x’¯  ¯’jkŒ¯þõªmBmrJl«þø­mJojCm­Cÿ…@´/M°EX° /± >Y°EX°/± >Y° °а°а±° +X!ØôY°а ±+° +X!ØôY°(Ð01#5&'&5547675353676554'&'#5¡Ãªj‡‡k®Ä§jˆˆk¬þÅ4*Ã+55'Ä-4{nxšôòš{lnwšóôšy ”Z-jk/Z“�[+Y^1[�\þ’«Å>°/°EX° /± >Y°EX°/± >Y° ±° +X!ØôY°±° +X!ØôY01!&53 !4&#"33JþÝÔ÷3ÿþåyƒ‚ŒŒ‚¼þ’a!Dï! Rþýí�ˆÒ¨þÝ©ÓVþ‘N>°/°EX° /± >Y°EX°/± >Y° ±° +X!ØôY°±° +X!ØôY01!&55432!4&#"33þÜ¿ÏíÇóþö[Ooa`r½þ‘c &Óî5äºSp¶Œ�³k‘>°/°EX°/± >Y01%#%7%73%Y!Hþݵ¯áþßG%ÊþÞI#¹¬ä%LþàÁ¬€ªþÁŽ«€«h«‚«Fþk«ª\¢/ý'°/°° +XØÜY°°° +XØÜY°° +XØÜY01'7!' ±"± ~îlÜf`-°/° ° +XØÜY°° +XØÜY°°а°° +XØÜY012$32#54&#"##5{q=Iq}ˆ:0+þ½ƒ�xlm%33x†}ti°/°° +XØÜY0153}¾:QÜ�ŸmDkbi°/°° +XØÜY01'7'3¼Q:¾DmŸ�7þÄЯ/?O_ou°T/°d/°t/°D/°EX°/±>Y° ° +XØÜY°T°аT°\° +XØÜY°аd°$аd°l° +XØÜY°,аt°4аt°|° +XØÜY°<аD°L° +XØÜY01'&632#4&#"'&632#4&#"'&632#4&#"'&632#4&#"'&632#4&#"'&632#4&#"'&632#4&#"'&632#4&#"+pa`qh122/æq``ri032.Qq``qh032/þÒq``qh032/ýWpa`qh122/ýUqa`qh122/þæq``qh032/=q``ri032.óOggO+::+þëNhgO,9:+þ NhgO,9:+ýùNhgO,9:+þäPffP,99,OggO+::+þ NhgO,9:+ýùNhgO,9:+Iþc‰Æ #(/°/°/°'/°"/°/° /°EX°/±>Y°EX°/±>Y01#'37%%57%'%'7L z`F: z`F Mþ¦ût þ³ZœAD%þÿüóþÀE&+”AÆ`•BÅ<þ­a¢Rþ þ |bG; |bG®™D±üŽ™EÈäFEþÕüãþ»G+ÿÿ~þ«!h&À'T¸€ÿÙ ³+01ÿÿkþ«#&Õ&T~a‚ÿÙ ³ +01ÿæÅ°c°/°/°EX°/±>Y°EX° /± >Y²?]°±° +X!ØôY²]° а° а±° +X!ØôY° ±° +X!ØôY01#32#!#535!332654&#…Ýúû(þ×úýâžž$ÝÝú{……{B’þúÐÒþøBµ¹¹ýØþ’jf�wG ,°EX°/±>Y°EX°/± >Y°±° +X!ØôY01!!!!GýTþܬ$Ïû1°pkwu 2°EX°/±>Y°EX°/± >Y°±° +X!ØôY°аÐ01#!!!!w)þAþÜé#Yü¨:;ÿô=° [°EX°/±>Y°EX°/±>Y°EX° /± >Y°EX°/± >Y° ±° +X!ØôY°аа± ° +X!ØôY01#!#53!!3“çþÜ””µýoç˜ýh˜µcáþ~ÿÒN: G° /°EX°/±>Y°EX°/± >Y° ±° +X!ØôY°а °а± ° +X!ØôY01#!#53!!3qâþÜ™™ãþAâÇþ9ǵ¾âÜÿÿˆþ›f°&.]èÿÿ�þ›Ó:&×]U„^°\°EX°/±>Y°EX°/±>Y°EX° /± >Y°EX°/± >Y°EX° /± >Y°±° +X!ØôY°а°Ð01 !##5#!!3337þƒ¤þŒþî6§SþÜ$S§(°ýiüç\ååý¤°ý©ÿW�«:\°EX°/±>Y°EX°/±>Y°EX° /± >Y°EX°/± >Y°EX° /± >Y°± ° +X!ØôY°а°Ð01 !##5#!!3533›þÛ5þ‹¥—;þÜ$;—š:þýÄ•¬¬þk:þd¿¿œÿÂM°}°/°EX°/±>Y°EX°/±>Y°EX°/±>Y°EX°/± >Y°EX°/± >Y°±° +X!ØôY²]°±° +X!ØôY°° а° в901#!#535!3#3!!b¢þÜÚÚ$¡¡‚eþþœ`ý tµ‡‡µþéSýZüöÿÍrs°/°/°EX°/±>Y°EX°/±>Y°EX°/± >Y°EX°/± >Y²]°±° +X!ØôY°±° +X!ØôY°° а° в901#!#535!3#3!!øPþÜ··$ÄÄHûRþ¦�þ±Åþ;¸µ««µýë—þý°ÿÿˆþ›Ø°&+]Zÿÿkþ›Î:&Ú]Pˆ“° b°EX°/±>Y°EX°/±>Y°EX° /± >Y°EX°/± >Y°EX° /± >Y°±° +X!ØôY°± ° +X!ØôY01!!!!!!!¬R•ýŽþÝý®þÜ$>ráû1]ý£°kj: š°/°EX°/±>Y°EX° /± >Y°EX°/± >Y°EX° /± >Y´�]´/q²�q²ïq²_r²�r²r²¿q´O_q²¿]²_]²/]°±° +X!ØôY°±° +X!ØôY01!!!!!!!�dwþ­þÜþœþÜ$„¶áü§¤þ\:ÿÿþ›v°&7]ÿÿ0þ›:&ß]ãÿÿ°<ÿÿþ_:�°K°/°EX°/±>Y°EX°/±>Y°EX° /± >Y°°а±° +X!ØôY° а° Ð013!3#!#53!‚?@þohÈþݱVþp@Ÿý µþµõþ_:K°/°EX°/±>Y°EX°/±>Y°EX°/± >Y°°а±° +X!ØôY°а° Ð01%#!#53!37!3cÆþܵ{þÑ1¶²1þÐŒ þVªµ|ýYdd§ü„ÿÿþ›#°&;]¥ÿÿþ›2:&[]´+þŸõ°M°/°EX°/±>Y°EX°/± >Y°±° +X!ØôY° а± ° +X!ØôY°° а °Ð01!5!5!!!!!3!!mþ¾B$Zþ¦R$îþÜûœÎááüÏû>ý±a.þšR:T° /°EX°/±>Y°EX°/±>Y°EX°/± >Y°±° +X!ØôY°аа±° +X!ØôY° Ð01#5!#!!3!!ÚÃÅf$œþÝüÙYááý‡Zü¦ýºfÿÿ‹þ›¿°&Í]Aÿÿgþ›È:&ã]J‹°E° /°EX°/±>Y°EX°/±>Y°EX°/± >Y° °а ±° +X!ØôY°Ð01!#5&'&5!36367þÛBR§ò‰’$?7s§TB°úP1 óíltóÅþ;Ž6/%þá žg:E°/°EX°/±>Y°EX°/±>Y°EX°/± >Y°± ° +X!ØôY°а°Ð01!!"#5&'&5!36767!þÜ%'§¢b�$/§%&$W’–NfÒTþ¬k) þòN˰<°/°EX°/±>Y°EX°/± >Y°EX° /± >Y°±° +X!ØôY013!663 !4&#"N%B¤A &þÜ€�>§B°ýÏéòþ;Å�mýbÿÿ_ <ãp<À°EX°/± >Y01ÿîÿéÄ%V°/°EX° /± >Y°EX°/± >Y°°а±"° +X!ØôY° а±° +X!ØôY° ±° +X!ØôY01 &&53 !3267"!54&þ­þ‰ ›§ÄBB!`õ$8üT ÐÓtºL14ßò�®…–u9ܯVpTþ”þ–¾å&á6èË¢™ºÿ¼ÿëoN%{°/°EX° /± >Y°EX°/± >Y²ÿ]²�q²Ÿr²r²Oq²¿]´_o]°°а±"° +X!ØôY° а±° +X!ØôY° ±° +X!ØôY01"'&&536632!3267"!54&¼äþê{ƒ·))"ü¿Ûòýzma€LOBÖ�Q^ fWÝ$Æ”?^¿æþøáŸkŠ'*´6G‚|e]oÿÿš¾°,ÿÿ*þ«)°&ÈÿÙÿÿþ«#:&Ø‚ÿÙˆþK!°b°EX°/±>Y°EX°/±>Y°EX°/±>Y°EX°/± >Y°EX°/± >Y°±° +X!ØôY°±° +X!ØôY01!!#"&'73265!!¬R#Ê´(D$29@ý®þܰýŽrú(¾Ï ÝZR…ý£°kþK:b°EX°/±>Y°EX°/±>Y°EX°/±>Y°EX°/± >Y°EX°/± >Y°±° +X!ØôY°±° +X!ØôY01!!#"&'73265!!�d$Ê´(D$19@þœþÜ:þJ¶ûž¾Ï ÝZRÌþ\:ÿÿˆþ«+°&+ŠÿÙÿÿkþ«!:&Ú€ÿÙÿÿ‹þ›°&Í]Êÿÿgþ›:&ã]Óÿÿˆþ«|°&0ÛÿÙÿÿ�þ«’:&ÙñÿÙÿÿš¾°,ÿÿ h&$T˸ ³+01ÿÿ7ÿë&&DT\v ³0 +01ÿÿ  &$jt]³+°° Ð01ÿÿ7ÿëË&Dj³0 +°0°-Ð01ÿÿI°ˆÿÿ.ÿë�N¨ÿÿˆmh&(T˜¸ ³+01ÿÿMÿë'&HT^w ³$ +01VÿêWÅM° /°EX°/±>Y°EX°/± >Y°±° +X!ØôY°±° +X!ØôY° ±° +X!ØôY01 % 5!7&&#"'66267'!€^yþ’þñþÈþ´Ô ÑÒu¹L15ÝóŒ®ýS¨Åþqþµ*þÂþgk>–¼ç'á7ûÊ£š¹ÿÿ_ÿëOHa:À°EX°/± >Y°Ð01ÿÿVÿêWÖ&Nj�&³$+°$°!Ð01ÿÿ_ÿëË/Ha:ÀjW°'/°EX°/± >Y°вÀ']´''r²`'r²o'q²¯'q²�'q²?']²@'r´Ð'à'q² ']²€'r°'°"Ð01ÿÿé &Òjã]³ +°°Ð01ÿÿǶ&ÜjU³ +°°Ð01ÿÿWÿëâ"&¿j�r³/+°/°,Ð01ÿÿFÿìÜÊ&Ýj÷³/ +°/°,Ð01Tÿëa°[°/°EX°/±>Y°EX° /± >Y°±° +X!ØôY²9°±° +X!ØôY²9° ±° +X!ØôY01'!5!#"$77!32654&##5ïý¤²þ“¾ÍþÙíÐþ×vao�ŒŒ‡Éá·þhë¿ÉäÖÍVsu[�‚¶Tþua:N° /°/°EX°/±>Y±° +X!ØôY²9°±° +X!ØôY²9° ±° +X!ØôY01'!5!#"$77!32654&##5éý¢¹þ—¼ËþÙíÐþ×vao�ŒŒ‡Sâ¸þh ë¾Çå×ËTsuY�ƒµÿÿ~ò&ÀqËA ³ +01ÿÿk�&ÕqBì ³ +01ÿÿ~ &Àj°]³+°° Ð01ÿÿk¶&Õj'³ +°° Ð01ÿÿ\ÿë"&2j r³  +° °Ð01ÿÿCÿë@Ë&Rj&³ +° °Ð01ÿÿVÿì§#&Ïjhs³&+°&°#Ð01ÿÿ?ÿëîË&èjý³& +°&°#Ð01ÿÿþK�&\q ì ³ +01ÿÿþK¶&\jò³ +°°Ð01ÿÿþK9ô&\YI³ +° °Ð01ÿÿ‹ &ÍjÚ]³ +°°Ð01ÿÿg¶&ãj³ +°°Ð01ÿÿˆþ›=°&n]åÿÿkþ›N:&Ó]�ÿÿ•} &Îja]³ +°°Ð01ÿÿ•ã¶&ç'ó:j5³ +°°Ð01ÿÿKþK‰°&nL&F¯?_ÿÿLþK°:&Ób&F°‘_ö²]01ÿÿþK�°&;_åÿÿþKŸ:&[_ô°h°EX°/±>Y°EX° /± >Y°EX°/±>Y°EX°/± >Y°EX°/± >Y°±° +X!ØôY°а°а° а° Ð01#!!#53!!3ât™þŸþçþçþ«ŒhYþŽR Tþ�g�ýp ýó�µkýüý•:^°/°EX° /± >Y°EX°/±>Y°EX°/± >Y°EX°/± >Y°±° +X!ØôY°а°а° а°Ð01#!!#53!3!3axþ·±±þ¶oeþöH¢¦JþönÑþ/gþ™ѵ´þ¨XþLL�° ;°/°EX°/±>Y°EX°/± >Y± ° +X!ØôY°± ° +X!ØôY01!!"543#"3i$ýáûþÙ'ûûû{ƒƒ{°úPÒÐý0ï�fj’ÿÿCÿëGrà°!>°/°EX°/±>Y°EX°/± >Y± ° +X!ØôY°а±° +X!ØôY01!"5433!36676&'!#%#"3•ûþØ(ûû#E[c!$þèÊþ˜û|ƒ„{ÒÐû1i^L¦Nc–GÍÜàï�fj’Zÿé‡"3[°EX°/±>Y°EX°/±>Y°EX°/± >Y°EX°/± >Y°± ° +X!ØôY°±&° +X!ØôY° °-Ð0132!36676&'!#&'#"5&&#"3267&&5ZÞÉKz/$A7bk"#þâÓ„¶/4’bÈÝ›U7kb_l;[:;8=û\J\«—aÌf¹[þöþäW_X\$ð),¾™Ž£.+'Aÿèî°,^°EX°/±>Y°EX°/±>Y°EX°)/±) >Y°±° +X!ØôY°± ° +X!ØôY²9°)±° +X!ØôY014&##532654&#!5! 36676&'!#&'‹p]í´�}wþ¨XŒ…�~-']f""þßÕ¨¸~cyãhmXbäÕËt¦1#¦|D0>«—aÌf†³Zþöþ䣱-ÿâ:,Q°/°EX°"/±">Y°EX°/± >Y±° +X!ØôY°±° +X!ØôY°"± ° +X!ØôY²)901%36676&'!#&'54&#!'32654&#!'!2&DL "$󲸵 95þÿ·PKLOþú ÕêRPf[ý,1ˆzL¤Of’G×çr‚K28Õ<8Y°EX°/±>Y°EX°/± >Y° ± ° +X!ØôY°±° +X!ØôY² 9°±!° +X!ØôY01%##&&554&#!'32654&#!'!237ŸÃAg(wmþöó{xyuþÐ6øvr€q¤ þÅ0 ”EhlzágfdváãËq¢2&±ƒknþ¼':"T° /°EX°/±>Y°EX°/± >Y° ± ° +X!ØôY°±° +X!ØôY² 9°±"° +X!ØôY01##&&554&#!'32654&#!'!23'ŸÃF‘ ^YþüþT\]SþÖ2×þSP]S¥ þÅD`.KLQÄE<=RߺŸPy)"…]Aÿ膰!W°EX° /± >Y°EX°/± >Y°EX°/± >Y° ±° +X!ØôY°±° +X!ØôY°±° +X!ØôY01!!#5326!36676&'!#&'õþƒíþë5)|nÄA8al !$þâÒ¿Ò Ìþ4þrþŽãý °ûÄJ\«—aËgz½\þöþä¾Î<ÿès:!W°EX° /± >Y°EX°/± >Y°EX°/± >Y° ±° +X!ØôY°±° +X!ØôY°±° +X!ØôY01###77265!36676&'!#&'ÿÌÇèH)ZMI?KS"$þü¿ÇÚ UçþÂþÐò±ÊÌý:J\•„\Á`{¬Vöþù¾Î…ÿ艰b°EX°/±>Y°EX°/±>Y°EX°/±>Y°EX°/± >Y°EX°/± >Y°±° +X!ØôY°±° +X!ØôY0136676&'!#&'5!!!!A7bl "#þâÓ¿Ò ý³þÛ%M°ûÄJ\«—aËg¹[þöþä¾Îéý£°ýŽr\ÿèa:b°EX°/±>Y°EX°/±>Y°EX°/±>Y°EX°/± >Y°EX°/± >Y°±° +X!ØôY°± ° +X!ØôY01!!!!!36676&'!#&'ïþ‘þÜ$o$I?LT""þü¿ÆÚ ­þS:þVªý:J\•„[Áa~ªUöþù¾ÎKÿëÐÅ!;°EX°/±>Y°EX°/± >Y°±° +X!ØôY°±° +X!ØôY01 !2&&#"36676&'!½þêþ¤\q²D?C�U™µµ™p{&þÒ]  ^-,Ï!#à¤þø§àzmP®^¦kKßìFÿëN!8°EX°/±>Y°EX° /± >Y±° +X!ØôY°±° +X!ØôY01%6674&'!#"55432&&#"dE7  æ¹üþÞñ^Ž/./yEqt}Î;=4m1Ad-«±9ä*â:#Ü»}*€º ÿèc°A°EX°/±>Y°EX°/± >Y°±° +X!ØôY°аа± ° +X!ØôY01!5!!36676&'!#&'ÑþO€þUA7bl !$þâÓ¿Ò Ìääü¨J\«—aËgz½\þöþä¾ÎBÿèÝ:A°EX°/±>Y°EX°/± >Y°±° +X!ØôY°аа± ° +X!ØôY01!5!!36676&'!#&'hþÚ‹þ¿H?LT"$þû¿ÆÚ XââþJ\sgE—H]‡@×ç¾ÎoÿëøÅ*^°EX° /± >Y°EX°/±>Y°EX°(/±( >Y°±° +X!ØôY²9° ±° +X!ØôY°(± ° +X!ØôY01467&&54$!2!4&#"33#"3265!# $oˆ‚s�6 ä:þä‘k��‚ŠÅÅ‘’¤�v›þ²äþôþµ˜|­+/¦dÈØáµRioTalÛks[utUÍÖäÿÿ_ÿì.M�ÿÿ*þKC°&Ã_˜ÿÿþK=:&Ø_’ÿÿ þz°&$ZCÿÿ7þˆN&DZ‚ÿÿˆr"&0v}\ ³+01ÿÿp|à&Pv‹ ³*+01ÿÿû"&:CÕ\ ³ +01ÿÿÂË&ZC; ³ +01ÿÿû"&:vŠ\ ³ +01ÿÿÂË&Zvð ³ +01ÿÿû &:jo]³ +°°Ð01ÿÿ¶&ZjÕ³ +°°Ð01ÿÿ þž°&$`åÿÿ7þ¬N&D`4ÿÿ Ç&$^îB ³ +01ÿÿ7ÿë…&D^‚ ³<+01ÿÿ zê&$V–K³+°°Ð01ÿÿ7ÿë ¨&DV( ³2+°2°8Ð01ÿÿÿ¨â&$W˜C³+°°Ð01ÿÿÿ8ÿë &DW(³0+°0°5Ð01ÿÿ é&$X™'³+°°Ð01ÿÿ7ÿë©©&DX#ç³0+°0°5Ð01ÿÿ &$Yœ³+°°Ð01ÿÿ7ÿëÆ&DY!Ó³0+°0°8Ð01ÿÿ þžB&$'R•T`å ³+01ÿÿ7þ¬&D&R)`4 ³0+01ÿÿ ð&$ZË^³+°°Ð01ÿÿ7ÿëª&DZN³0+°0°?Ð01ÿÿ ð&$TË^³+°° Ð01ÿÿ7ÿëª&DT_³5+°5°,Ð01ÿÿ |&$[É^³+°°Ð01ÿÿ7ÿë6&D[O³0+°0°LÐ01ÿÿ @&$\Í^³+°°Ð01ÿÿ7ÿëú&D\X³0+°0°?Ð01ÿÿ þžh&$'T˸`å ³+01ÿÿ7þ¬&&D&T\v`4 ³0 +01ÿÿˆþ¨m°&(`³ ÿÿMþžO&H`•ÿÿˆmÇ&(^¾B ³ +01ÿÿMÿë†&H^„ ³0+01ÿÿˆmm&(Xnt ³+01ÿÿMÿë,&HX43 ³# +01ÿÿˆHê&(VdK³+°°Ð01ÿÿMÿë©&HV* ³$+°$°,Ð01ÿÿÿtmâ&(WdC³+°°Ð01ÿÿÿ:ÿë¡&HW*³"+°"°)Ð01ÿÿˆåé&(X_'³+°°Ð01ÿÿMÿ뫪&HX%è³"+°"°)Ð01ÿÿˆm&(Y]³+°°Ð01ÿÿMÿëÇ&HY#Ô³"+°"°,Ð01ÿÿˆþ¨mB&('ReT`³ ³+01ÿÿMþž&H&R+`• ³"+01ÿÿš/Ç&,^ŽB ³+01ÿÿ…r&ó^zÿí ³+01ÿÿ‰þ¨Ð°&,`ƒ ÿÿnþ¨µ&L`h ÿÿ\þ–Å&2`ÿøÿÿCþ–@N&R`˜ÿøÿÿ\ÿëÜ&2^W ³ +01ÿÿCÿë@…&R^£ ³+01ÿÿ\ÿë§ÿ&2VÃ`³  +° °(Ð01ÿÿCÿë-¨&RVI ³ +° °(Ð01ÿÿÿÓÿë÷&2WÃX³ +°°%Ð01ÿÿÿYÿë@ &RWI³+°°%Ð01ÿÿ\ÿëDþ&2X¾<³ +°°%Ð01ÿÿCÿëÊ©&RXDç³+°°%Ð01ÿÿ\ÿë&2Y¼(³ +°°(Ð01ÿÿCÿë@Æ&RYBÓ³+°°(Ð01ÿÿ\þ–W&2'RÄi`ÿø ³ +01ÿÿCþ–@&R&RJ`˜ÿø ³+01ÿÿWÿë&CvËR ³) +01ÿÿCÿëîà&DvB ³*+01ÿÿWÿë"&CC\ ³' +01ÿÿCÿëîà&DC� ³'+01ÿÿWÿë½&C^-8 ³6 +01ÿÿCÿëî…&D^¤ ³6+01ÿÿWÿëc&CXÝj ³) +01ÿÿCÿëî+&DXS2 ³)+01ÿÿWþžQ&C` ÿÿCþ–îÏ&D`™ÿøÿÿxþ–°&8`ÿøÿÿiþž:&X`/ÿÿxÿëÇ&8^"B ³ +01ÿÿiÿër&X^¢ÿí ³+01ÿÿxÿë€"&EvÍ\ ³+01ÿÿiÿëwË&Fv@ ³"+01ÿÿxÿë€"&EC\ ³+01ÿÿiÿëwË&FC‹ ³+01ÿÿxÿë€Ç&E^/B ³+01ÿÿiÿëwr&F^¢ÿí ³+01ÿÿxÿë€m&EXßt ³+01ÿÿiÿëw&FXR ³! +01ÿÿxþ–€G&E`$ÿøÿÿiþžw¬&F`/ÿÿ"&<C×\ ³  +01ÿÿþKË&\CV ³+01ÿÿþ¨°&<`ã ÿÿýñ:&\`TÿS°/01ÿÿÇ&<^îB ³  +01ÿÿþKr&\^mÿí ³+01ÿÿm&<Xžt ³ +01ÿÿþK&\X ³ +01ÿÿÿAÿë�&20þÏØ°$/´O$_$]°Ð01ÿÿ˜YÔ=FÚS3@ÿÿšYÐ=F°ff@ÿÿšYÐ=F°ff@ÿÿþ'�'BÿB;²°q´ °r@  0]¶ 0r¶ 0q@ p€� °]012÷c°EX°/±>Y013#2¢�<õ·aþ Á9øk°EX°/±>Y01#53k¢�<öVþ¢]Ã2þùd°/01%#3d“Ÿ<öþæ ÿÿøCGù|À@ÿÿ2÷¬&øøIÿÿ9ø¼&ùùQ2ÿª* °/° Ð01%#53#53T¢€<æV¢�<ç7þè ÿóþè÷9° L°EX°/±>Y°EX°/±>Y°EX° /± >Y°EX°/± >Y° ±° +X!ØôY°аÐ01!!!5!!!þ¡þÜþ¦Z$_Rü®RèvþŠbþ`?°~°EX° /± >Y°EX° /± >Y°EX°/±>Y°EX°/± >Y°EX°/± >Y°EX°/± >Y±° +X!ØôY°±° +X!ØôY° ааа°аÐ01!!!!5!!5!!!!!?þ¡þÛþ§Yþ§Y%_þ¡_þ` àxâvþŠâýˆ‡ëd °/° ° +XØÜY014632#"&5‡‚kn‚�mm‚&d€eZe|}dÿÿ�o&»ÿÿ�&'»_YÿìmÅ'5CQU’°R/°T/°EX°/±>Y°EX°/± >Y°EX°/± >Y°°° +XØÜY° а°$° +XØÜY±+° +X!ØôY°±2° +X!ØôY°±9° +X!ØôY°±@° +X!ØôY°9°Gа@°NÐ0146326632#"&'#"&54632#"&53326554&#"326554&#"326554&#"'-­�Js'%tJ�­¬�Ku%'rI‘­ý,¤‰�­¬�Š¥²@=:?A:Y°°° +XØÜY°°в9°° а ° Ð013##5!'3'ìnnÝþ+ÔâÝㄪªª|oý¿)þÕV�ºg°/°EX°/±>Y°EX°/±>Y²_]²ïq²Or²¯r²ßr²r²r²¿q²ð]² q°° а± ° +X!ØôY016632#4&#"#ÿ $qJˆÕ@?1CÖ®{@G–�þ¼eX*&ý×!t°_°EX° /± >Y°EX°/± >Y² 9°/±° +X!ØôY² 9°/°° +XØÜY°а° а ±° +X!ØôY01!!!!5#53!!!ýžþûþÜvvìý8b]ºÈÛÛÈ áþoX€Å*v°EX°/±>Y°EX°/± >Y²&)+°±° +X!ØôY°а)°*° +XØÜY°а)°а&°а&°%° +XØÜY°а± ° +X!ØôY²% 901!!536655#53'#'3'4632!4&#"!!!(%$¡ü 0.«¤ šñÊ×íþä\GFPdþ£Y¶)~-àà ’5ÈfÈk¾ðß·`[uXkÈfÈ�ÿë8°#,°/°EX°/±>Y°EX°"/±">Y°EX°/± >Y°EX°/± >Y°"°а"±° +X!ØôY°а±° +X!ØôY°±$° +X!ØôY°±,° +X!ØôY013#3267#"&5###!!2332654&##q¶¶4,!,T1—£"dŽþ^þÍ‘þŽnýs^stts^Cþ÷ÍýÙ?6Ó¦´(…\ƒý÷°�d‘ ý·†a]�ÿÿCþ§¢&G'Fg<B”ÿ‚²Ÿ"]´/"?"]²ï"]²"]²ð"]01GÿëíÅ+�°EX°/±>Y°EX° /± >Y²+'+²+q²¿+q°+°° +XØÜY° ±° +X!ØôY°°а+°в']²¿'q²']²'q°'°(° +XØÜY°а'°а±"° +X!ØôY01!3267#"55#535#535432&&#"!!!©þT‡x:o39z>õþÒ’’’’-ôY°EX°(/±( >Y° °° +XØÜY° ±° +X!ØôY°±° +X!ØôY°(°!° +XØÜY°(±/° +X!ØôY°!±6° +X!ØôY01#"&554632#4&#"32654632#"&53326554&#"'­š‹���‹Œ›º61245305$¨•–§¦•–©ÂE8A8@;(ý=€¬«�M‚ª«�9QK?M9QQ9øKrKÿí¯Å'_°/°EX°/±>Y°EX°/± >Y°°б ° +X!ØôY°±° +X!ØôY°± ° +X!ØôY°±$° +X!ØôY01$55#52674632354&#"66éÿþý1d36e-ɯ–¿Û¿`t@)%(EIîÔ» —Ñî»�*�þÈc4{yQ,1Y°° +XØÜY°аа°а а°а°° +XØÜY°Ð01'##333####5!âiIn�Ÿwxš�þ €�~Ž­þå*þ×þ–jýã´þN²i”ÿì�NN° /°EX° /± >Y°EX°/± >Y°° +XØÜY° °° +XØÜY²pq²Ðr° °° +XØÜY01%#"5432!3267"!&&W¼_ÚþÎCÉÏ ý7�M_ºWþ�J�:6‹^7;IèâOþÊç/þ¸59<>*A9þë4=ÿÿZÿõ`²'r †' 1K&°EX°/±>Y°EX°/± >Y°+а°7Ð01ÿÿ]ÿõ÷À'o”' ¿1â&°EX°/±>Y°EX°8/±8 >Y°Pа8°\Ð01ÿÿ_ÿõ'¯'mÿþŽ' ÷1&°EX°/±>Y°EX°-/±- >Y°Eа-°QÐ01ÿÿNÿõ€¯'w Ž' 61k&°EX° /± >Y°EX°/± >Y°2а°>Ð01?ÿëpí!:°/° /°EX°/± >Y°°а±° +X!ØôY° ±° +X!ØôY01#"54327&&'2655&&#"ê!eþÆëèþÜÿáS“/é¦Ák’#„Ysv€í<þjþØÜõþÉÐã2+›Ä,ûоŽ{*7ž�p™¤ÿï°(°/°EX°/±>Y°°а±° +X!ØôY01#!#!ïæý‚çKøËú5¨9þóÖ° R°/°EX°/±>Y²9°°Ð°±° +X!ØôY²9°± ° +X!ØôY² 9°° Ð01!!55!!˜þ.ûc?ýÁ{ýÐ'ý­á—Ì×áýµ’YÔ=°/°° +XØÜY01!5!Ôü¾BYä7^° 2° /°EX°/±>Y°EX°/± >Y°а ± ° +X!ØôY01373##5!)" Øþ^ê½Þ~š¯¯úPä`ÿëüN'5^°EX°/±>Y°EX°/±>Y°EX°/± >Y°EX° /± >Y°±° +X!ØôY°±$° +X!ØôY°+а°2Ð01#"&'#"554326632!4&#"3265!32675&&#"üþäî™áJLá—ïþåí™áLJâšìþÜuo€¤ ¨}pvú¬tr|¨ ¥ptêþÔ°Š‹¯,ê6é.¬††¬þÒ銬èSUô©��©õTR鬊ÿ¥þK¿-.°/°EX°/± >Y± ° +X!ØôY°±° +X!ØôY01#"&'732654632&&#"²É´)A&29@Ò¾%K0*GL(¿Î ÝZRÚ¶Å ×QIeê33J²+°±° +X!ØôY° а° а°аа°#а°&а±0° +X!ØôY°*а3Ð0166363267#"&'&&"66363267#"&'&&"o/|AF]VJ\C@|0 0|@C\JV]FA|//|AF]VJ\C@|0 0|@C\JV]FA|/mDN *&MEÕEM&* NDÙDN *&MEÕEM&* NDˆ¦ê8² +°±° +X!ØôY°Ð°°а °а ± ° +X!ØôY°Ð013!!!'7#5!7!5! èþ˜pØý©\r6‘qþ”ràåÊå¦DbåÊå Dÿÿ�ÿØëZgW¼@9šÿüý° /°в_]²0]01ÿÿ‰ÿØñZg!¼@9šÿüý° /°в_]01°)°EX°/±>Y°EX°/± >Y°°а° Ð01!!!'#37Žqþ�þéþ�ŵ³¶°ý'ý)ׯDDþ:þ;DD=ÿ„8°/01%#7538�z=¾oëõ—a-“°/°EX°/±>Y°EX°/±>Y°EX°/±>Y°EX°/± >Y°EX°/± >Y°±° +X!ØôY²ð]²Àq²]´/?]²0q² ]²r°±° +X!ØôY°°аÐ013#5354632&&#"3#!!!µ¡¡ùâN˜d*IwMeeÕÕˆþÜ$mÍJÌÝæ\YJÍü“:ÿÿ-&IOÜÿÿ=-&I(Üÿÿ[-&I'IÜO¸Wþrê® *;AGMS]aeimqu~‚†ŠŽ’–Ÿ°A/°Š/°ƒ/°/°EX°I/±I>Y°EX°/±>Y²@]²À]° а°а°v° +XØÜY´ßvïv]²ovq¶_vovv]²ÿvq²vr´v�vr°T° +XØÜY@ ÀTÐTàTðTq¶TT Tr²Tv9°°~° +XØÜY° а°U° +XØÜY@ ÏUßUïUÿUq°'а°+а°0аU°8аA°@° +XØÜY²O@r²/@q°sаoаkаCаE° +XØÜY°>аA°rаnаjаBаI°L° +XØÜY°M° +XØÜY°L°fаbа^аNаI°gаcа_аOаM°RаŠ°° +XØÜY°ƒ°‚° +XØÜY°M°†° +XØÜY°>°‡° +XØÜY°°ŒÐ°ƒ°�а†°‘а‡°”аŠ°•Ð01#"&55463232#4&#"32653#"&773326533!5353!#%5!#532654&'#5!!5!!5!5!!5!!5!32654&###535#53#53%#535#53#535€eh€€ff�C¼eo,(06i\þ„K@@JJB?Jº\jQ[iT62(7ùÄqÄ(Çoøm5Äì6oü\~253/Ðý[ý\ ý[ý\¼]:<9=]üñqqqqqq"ooooooÔbyybp`{{`þ¸%KK'> F-LOHDOODpENNEOþ†O\QM.-6,üÉ;ÊqqÊþÅt©©tþã©ü¶©+(&.Jttttttù8qqqqqqÄ((' þÓü~úüù~ü~úüù\ýÕ×b"&* 4676654&#"36632#33#3#¿üAüD(H^©“ˆ§Â;+6;3*O;ÊÊÊKRü1ü1Ïñ5='ƒN€—‚‚34?52M7ZX[ªýL �ÿÿÿ©„±&Kqÿ ³+01roÊÅ °EX°/±>Y°EX°/±>Y013#%73#‘fÓæSþá”lQ¯Œ9þÁ™ºÌ‰_ÿõ,#/j°-/°EX°/±>Y°EX° /± >Y²/-q²o-r´Ÿ-¯-q²ß-]´--]°-±° +X!ØôY° ±!° +X!ØôY°±'° +X!ØôY01#"&5467&&546324&#"3264&#"326üL@KZÁ“™É\OEN»Ž‰³¹M6=RR>7K>,2CD2,=P:[c?p}}p?c[:htsþ5+88++33~%+*&&//Wÿõô,'S°/°EX° /± >Y°EX°/± >Y±° +X!ØôY¶/]°±° +X!ØôY° ±"° +X!ØôY01%2655#"&54632#"&'726754&#"’L85?@�M=.”}r›³‹Ó‚¤˜ F]H26Eaÿï �'M°/°EX°/±>Y°EX°/± >Y°±° +X!ØôY°±° +X!ØôY°±"° +X!ØôY012&&#"6632#"$54$"32654&kR…A/6mCfƒ1…O¸ÊþúÐÉþô'¹BaoRJWP�Õ}lE+0Å©±ÝÿÉÑùý{+&d†]GOX*� D°/° /°EX° /± >Y°EX°/± >Y°±° +X!ØôY°°а° а °Ð013#!5!'5!!'’ˆˆþÝýÍE#ý«áÊÊ»ý…BÿïÕ�*Œ°*/°EX°/±>Y°EX°/± >Y°±° +X!ØôY² 9²*]²¯*]´/*?*q²o*q²ß*]²*]²Ÿ*q²¿*q°*±)° +X!ØôY²)*9²9°±"° +X!ØôY012654&#"!'&632#"$77!32654&##5 KGLEETþåõ¸Ñò`T`gþûÑ·þú_MIZRSÌ´EB5N?6˜¶¬ P…&"Šc¡·°©6KS:QFÃM¶�H°EX°/±>Y°EX°/± >Y²9°± ° +X!ØôY°°а±° +X!ØôY01!!56654&#"!'&632!¶ü©©AC=BJRþäóÍÇÙ�¤¡ÙÞtDk0;R]H¦Ø¾«}º‚—>�3°EX°/±>Y°EX°/± >Y²9°/±° +X!ØôY01!!#5%þܮҖæ!aÿï.� ;°EX° /± >Y°EX°/± >Y° ±° +X!ØôY°±° +X!ØôY01#"$54$32%4&#"3265.þôÙÛþó ÛÚ þÜiZZhh\Yh›ÄèèÄWÃèèÃ\oo\þ¨`no_D� F°EX°/±>Y°EX°/± >Y±° +X!ØôY²9°±° +X!ØôY² 901%!!5!5!»FüC;ýæ•ÞÞz4ßuE� =°EX°/±>Y°EX°/±>Y°EX°/± >Y²9°°а°Ð013!!!#ß=þpþÜþv<™ôýþe¤éa� D°EX°/±>Y°EX° /± >Y°EX°/± >Y°EX°/± >Y²9°°Ð01!!!!>ÊQþ�kþ±ÑÑþ¯mþœO �ý¿ý´‰þwLA(ñ�P°EX°/±>Y°EX° /± >Y°EX°/±>Y°EX°/± >Y°EX°/± >Y° аа°Ð013!!#!!338‚1þîþãµ°þãþî1�µðÁÌûs©ýW�ý2Î’� -°EX°/±>Y°EX°/±>Y°EX°/± >Y°Ð0137!!!E1þ]þÄþ\38&!Zûs�qÿí„�6°EX°/±>Y°EX°/±>Y°EX°/± >Y± ° +X!ØôY01#"$5!3265„þãìíþã$vppt�ýÌäåËðýgjihð0�2°EX°/±>Y°EX°/± >Y°±° +X!ØôY°аÐ01!!!5!þ¦þÛþ«Ô®üR®ßCÿí!�'V°EX° /± >Y°EX°/± >Y² 9²z]°±° +X!ØôY° ±° +X!ØôY°±%° +X!ØôY014&'&&54632!4&#"#"$77!326þ_}åÎùÓÜöþæS^YQZ�×ÒþöÜêþòqcd_B6H,Ÿ¡“ÂÆ¨HNB3:D,¢›œ½Æ¬TFA�M�#z°/°EX°/±>Y°EX°/± >Y°EX°/± >Y²�]²oq²ÿq²r²¿q²ß]²o]²?]°±° +X!ØôY² 9°±"° +X!ØôY01!!2!&&554&#'32654&##¥þÜÎ×ÿgcre þÓ ]Z³ªU\^Sª¢þ^�¾£_Œ+�iS$gh2QPTàPEAV_ÿuŒ�!B°/°EX°/±>Y°EX° /± >Y±° +X!ØôY² 9°±° +X!ØôY01'#"55432%4&#"3265p<7�»š0h7æþÝ!çæ#þÝ}ilxylj{Í^ >�Œ™ ÕóÔ þöÓm��nôp‘‘pnÿëQÅ ;°EX° /± >Y°EX°/± >Y° ±° +X!ØôY°±° +X!ØôY01#"32%4&#"3265Qþõåæþó æå þÝjeeijfdi7þßþÕ+!A -þÓþà®  ®þ…°  °[ÿíl� ;°EX° /± >Y°EX°/± >Y° ±° +X!ØôY°±° +X!ØôY01#"55432%4&#"3265lþÞææþÝ!çæ#þÝ}ilxylj{ÍÕþõ ÕóÔ þöÓm��nôp‘‘p�•� C°EX°/±>Y°EX° /± >Y°EX°/± >Y°EX°/± >Y°°а°Ð01!!!!7!•þÜþ:þÜ$Æ$Íý5�ý4Êœˆ;=°/²]±° +X!ØôY01!5!;ýaŸˆµ�ˆ�S°EX°/±>Y°EX°/±>Y°EX°/± >Y°EX°/± >Y°EX° /± >Y°°Ð°°а Ð013!!'#!!þmþÝûÄõþÜjU8ûs¸ýGªýW��ˆ�)°EX°/±>Y°EX°/± >Y±° +X!ØôY01%!!!¥ãüù$ÞÞ��v� P°/°EX°/±>Y°EX°/±>Y°EX°/± >Y°EX° /± >Y°±° +X!ØôY² 901#!!3!!nþÜ$Wøqþ–{þоþB�þ6ÊýåýŽÿí£�)°EX°/±>Y°EX°/± >Y± ° +X!ØôY01!#"&77!3265$ùÃÓø^IBV�üò·ÛĸRQaR�¥�°EX°/±>Y°EX°/± >Y01!!!¥þÜ$��œ� n°/°EX°/±>Y°EX° /± >Y°EX°/± >Y°EX°/± >Y²¯]´/?q²Ÿq²oq²ß]²]²]°±° +X!ØôY01!!!!!!!œþÜþ-þÜ$Ó$Êþ6�þã_ÿït� T°/°EX° /± >Y°EX°/± >Y² 9° ±° +X!ØôY°±° +X!ØôY°±° +X!ØôY01%#"55432!4&#"32675#5!tCõÃïþÕ&æêþæbok}ƒsWbÛþ¡Kg ÕóÓ ŲSK�pôr޵Á�ë� c° /°EX°/±>Y°EX°/± >Y²¯ ]´/ ? q²Ÿ q²o q²ß ]² ]² ]° ±° +X!ØôY°±° +X!ØôY01!!!!!”þþÜjýºïÎþ2�ßÿ�Õ� W° /°EX°/±>Y°EX°/± >Y²/ q² q° ±° +X!ØôY°±° +X!ØôY°±° +X!ØôY01!!!!!!þ&0ü¬TýÐÚìþòÞ�ßâ�S� ;°EX°/±>Y°EX°/± >Y°± ° +X!ØôY°± ° +X!ØôY013!2#326554&#�Ëá&þÚá§§e~~e�þôÒÒÓþö®ý0�pÓo�_ÿï:�;°EX° /± >Y°EX°/± >Y° ±° +X!ØôY°±° +X!ØôY01#"55432!4&#"32652ûèáþêáêúþæYjennehY�ÉÏ ÕóÔ ÏÇeXŒqôs�Zf�R� а/°EX°/±>Y°EX°/± >Y²¯]´/?q²Ÿq²ÿq²/r´¿Ïq²oq²ß]²]²]°±° +X!ØôY²9°±° +X!ØôY°±° +X!ØôY013!2#32654&#'32654&##�ÑØñi`~‚åÖòòQGGQò­RTQU­�£ŸS‚"�b£§ïþï?AHIº?° /°° +XØÜY°° +XØÜY°° +XØÜY°° +XØÜY°° +XØÜY°°Ð01#'73#"&7733265)¶®×x¼žŸ¼Ô=A?>Õ·âi……i+88+Ñ� B°/°EX°/±>Y°EX°/± >Y°EX°/± >Y°± ° +X!ØôY°° Ð01%!!!!!#Rþ5>9œ¥I5ê™™ý{toWM7=7Wë�óY°/²?]°° +XØÜY@ /?O]°° +XØÜY°°а° ° +XØÜY°а °а °° +XØÜY°Ð01#'#'%37#"&#"'46323265�ûžŸü&î£T@3�%pQ@)š&!ñ‰‰ä÷FjF2"EmD6#j¼’o°/²]²]²_]²?]° ° +XØÜY²° q²Ð ]¶�   ° r°° +XØÜY²`q²Àr° а°° +XØÜY°° +XØÜY°° +XØÜY01#"&7733265'3#¼žŸ¼Ô=A?>Rͪ °i……i+88+â¸kÈ" s°/²]²_]²?]° ° +XØÜY²Ï q°° +XØÜY²q° а° ° +XØÜY°° +XØÜY²?q°° +XØÜY°° +XØÜY°°° +XØÜY01#"&7733265''66'56H»Ÿ¡¼Ö=B?>éG=GBµÀT?°d~~d*55*2mhPG275jÆâ#а/²]²?]° ° +XØÜY²° r°° +XØÜY° а°° +XØÜY²Àq°° +XØÜY°°а°° +XØÜY¶Ïßïq²ï]°° ° +XØÜY²ï ]¶Ï ß ï q°°#Ð01#"&7733265#"&#"'46323265ºžž»Ô<@?=¨_E8‹'&y]G+•*'°d€€d+55+JkD2$!ImC1$Zþ›~ê°/01!!~þÜ$þ›O!þ_Ü?1°/°EX°/± >Y@/?O_o]± ° +X!ØôY01%#"&'732654&'([Y�m?[$#-5%02?4‹Keqš +/G3ÿžþK«÷°/°EX°/± >Y± ° +X!ØôY01%#"&'73265«Ê´(B%2:>÷þá¾Ï àVRÿœÿà•°/°/±° +X!ØôY01! '6674&#!d. @Àµ{cgœ‹þÒ•ûì†þñ9¼,…a~„-b°3°EX°/±>Y°EX°/± >Y²9°/±° +X!ØôY01!!!5%bþÜþï5®Î4NLÅH°EX°/±>Y°EX°/± >Y²9°± ° +X!ØôY°°а±° +X!ØôY01!!56654&#"!'&32!Lü×fVc[eiþä äá‘§þýd¿ùu¡E\u‰rÅêÄߵþåFÿë?Å*^°EX°/±>Y°EX°/±>Y°EX°/± >Y°±° +X!ØôY°±)° +X!ØôY²)9°±#° +X!ØôY0132654&#"!'&$32#"$77!32654&##�¤kggbRpþåÊäyjz€þÚåËþÝx\gxus¤TmaXj`N«ÞØÈ_«0+²vÈå×ÄTmp`sk=d° A°/°EX° /± >Y°EX°/± >Y°±° +X!ØôY°°а° а °Ð013#!!'!!'¿¥¥þÝý® \&ýŽOâþÄ<¯Åün(nÿë@°T°/°EX°/±>Y°EX°/± >Y°±° +X!ØôY°±° +X!ØôY²9°±° +X!ØôY01!!6676#"$77%32654&#"�T,ýÃ()rDÒçýîÈþánYfaggTX…+êþ°'þüèÒþêÛÀam‘u~˜=6nÿëaÅ'M°/°EX°/±>Y°EX°/± >Y°±° +X!ØôY°±° +X!ØôY°±"° +X!ØôY012&&#"6632#""32654&·RŠF3BgE…¡1–^ÃÞþïÚæþÞJ»Qr}hZmnÅÖǰ3:þë×Üþâ9Rý/4-a­º¥uy–Ͱ /°EX° /± >Y°EX°/± >Y° ± ° +X!ØôY°Ð01!77!5!ÍÕœ þÜ ̱ý[¾Ïþîþ%þ²””Aáá[ÿëcÅ#/e°EX°-/±->Y°EX°/±>Y°EX° /± >Y°-±° +X!ØôY²-9²-9° ±!° +X!ØôY°±'° +X!ØôY01#"$5467&&54$324&#"3264&#"326Byix‹þãæçþâŠykw ÙÙ þþ~dd{zgd|"gYYdeZYe.m©.2µuÊÙÙÊu¶1/¨mÂÕÕü²bvvbdstâXkiZ[kkVÿë3Å'J°/°EX° /± >Y°EX°/± >Y±° +X!ØôY°±° +X!ØôY° ±"° +X!ØôY01%2655#"5432#"&'726754&#" t‘1‡NËéÔßþÉñK¡E"@€~Il!p`XodË«ŸI?@ âÚ!þÍþêþ¨þ÷þÐÓê6.… ¦¤v}˜�c� >°/°EX°/±>Y°EX°/± >Y°± ° +X!ØôY°±° +X!ØôY01!!2#'32654&##¥þÜ÷Þ þóÞÓÓ]kk]Ómþ“�ᯰààfHIjBÿïï�R°/°EX°/±>Y°EX°/± >Y°±° +X!ØôY²�]°±° +X!ØôY°±° +X!ØôY01!!6676#"$77%32654&#"oGñþ&e?¶ÏçìÊþðeSWX]PERø•ÞòÊ´²Ò§¢;FaSP_)gÿõ,'W°/°EX°/±>Y°EX°/± >Y°±° +X!ØôY²]°±° +X!ØôY²�q°±"° +X!ØôY012&&#"6632#"&5546"32654&â7c2"'Q0Ja%d<‡Œ¾—“ÂÖ,CQ9<@A,—WK) †t{™±Œ¼�¯þCG[<25<aÿõ !T°/°EX°/±>Y°EX°/± >Y°±° +X!ØôY°±° +X!ØôY²9°±° +X!ØôY01!!6676#"&?32654&#"€4$þ•K-…—§¬”ÃÉI>A@B49>ZÇš¢‹{”sq +.<69G@ ! A°/°EX° /± >Y°EX°/± >Y°±° +X!ØôY°°а° а °Ð013##5!'33'»eeÓþf¨Óþ]Ð (�‹‹~þYÿõò,*‡°*/°EX°/±>Y°EX°/± >Y°±° +X!ØôY°±"° +X!ØôY²O*r´ß*ï*]²*q²�*r´/*?*q´**]²ÿ*q²*r´¯*¿*q°*±)° +X!ØôY²°)]012654&#"#'&632#"&77332654&##5˜><9739Ȱ†˜±G=FK³˜’¼É?<8DFCoÙ1.&3,e{wn7[_Dp|}q*/0,26…fà,H°EX°/±>Y°EX°/± >Y²9°± ° +X!ØôY°°а±° +X!ØôY01!!5%6654&#"#'&632!àý’5<#/178ɱ”�žk}mZ›ü2C)'5Y°EX°/± >Y²9°/±° +X!ØôY01!##5% ÓRvŸgÿõ+, ;°EX° /± >Y°EX°/± >Y° ±° +X!ØôY°±° +X!ØôY01#"&554632'4&#"3265+ÄžŸÃŸžÅÓMCBMLDCL3’¬¬’º‘®®‘KXXK»NUUN6ÿïÌ�'J°/°EX° /± >Y°EX°/± >Y±° +X!ØôY°±° +X!ØôY° ±"° +X!ØôY01%2655#"&54$32#"&'726754&#"æRq*j9ÅáÎÁþòÉK¦J0=vg7TfMGUWÍrVE"#Ѱ¦áÿÈþÁºíш$I_~jGQgLÿï �#/j°-/°EX°/±>Y°EX° /± >Y²/-q²-]²@-]°-±° +X!ØôY²-9²-9° ±!° +X!ØôY°±'° +X!ØôY01#"$5467&&546324&#"3264&#"326æiZi}þõËÑþê€n_lÿĽ÷þþhJQppRJg"TY°EX°/± >Y° ± ° +X!ØôY°Ð01!547!5!d«�þÜÛ|ýÔ4®Ûþâü¹¹ù„xßB™! /°EX° /± >Y°EX°/± >Y° ± ° +X!ØôY°Ð01#547!5!™iÒœWþpW…˜À®­ NœÿÿjаTÿÿÿßS�&PFÿCÿr+´Ïßq´¿Ïr´/]²/r´/?q´ßï]01ÿÿÿßS�&PFÿCÿr+´Ïßq´¿Ïr´/]²/r´/?q´ßï]01ÿÿ0�&?F/Æ ² ]²p ]01ÿÿÑä&UCµ ³ +01ÿÿÑß&Uvj ³+01ÿÿÑÿ&URs ³+01ÿÿÑ*&UX|1 ³+01ÿÿÑÊ&UjO³+°° Ð01ÿÿÑL&UVv³+°°Ð01ÿÿÑ&UqS³+°°а°!Ð01ÿÿ_þ5:�&QzVÿÿ�Õä&OCj ³ +01ÿÿ�Õß&Ov ³+01ÿÿ�Õÿ&OR( ³+01ÿÿ�ÕÊ&Oj³+°° Ð01ÿÿÿ­©ä&KCÿ` ³+01ÿÿ}ß&Kv ³+01ÿÿÿ§‰ÿ&KRÿ ³+01ÿÿÿ–”Ê&Kjþú³+°°Ð01ÿÿ�•*&EX�1 ³+01ÿÿ[ÿílä&DC¡ ³ +01ÿÿ[ÿílò&DvV, ³  +01ÿÿ[ÿíl&DR_$ ³  +01ÿÿ[ÿíl=&DXhD ³ +01ÿÿ[ÿílÝ&Dj;-³  +° °Ð01ÿÿqÿí„ä&>C¸ ³+01ÿÿqÿí„â&>vm ³+01ÿÿqÿí„&>Rv ³+01ÿÿqÿí„Í&>jR³+°°Ð01ÿÿEß&:v) ³+01ÿÿѱ&Uqj ³ +01ÿÿÑ%&UT¦u ³+01ÿÿþXê�&UWæÿÿ_ÿï:ï&QvK) ³" +01ÿÿ_ÿï:&QRT! ³" +01ÿÿ_ÿï:ÿ&QUC ³ +01ÿÿ_ÿï:&QSk* ³# +01ÿÿ�S&PS ³+01ÿÿ�Õ±&Oq ³ +01ÿÿ�Õ%&OT[u ³+01ÿÿ�Õï&OUò3 ³ +01ÿÿ�þXÕ�&OW÷ÿÿ�Õ&OS? ³+01ÿÿ_ÿït&MRi! ³% +01ÿÿ_ÿït5&MTœ… ³% +01ÿÿ_ÿïtÿ&MU3C ³" +01ÿÿ_þ t�&M'�þˆ´0%@%]² %]01ÿÿ�œÿ&LR‡ ³+01ÿÿÿž‹*&KXÿ'1 ³+01ÿÿqÿí› &>Y«³+°°Ð01ÿÿÿ»o%&KTÿQu ³+01ÿÿ=þXî�&KWêÿÿzªï&KUè3 ³+01ÿÿÿí}ÿ&JR ³+01ÿÿ�þv�&I'Fþ‘´0@]² ]01ÿÿPˆÍ&Hvä ³ +01ÿÿ�þˆ�&H' þ’¶0 @ P ]²  ]01ÿÿ�ˆŽ&H'Ý~°EX° /± >Y01ÿÿ�ˆ�&HUiý7°/01ÿÿ�•ß&Ev{ ³+01ÿÿ�þ•�&E'›þ’¶0@P]² ]01ÿÿ�•&ES› ³+01ÿÿ[ÿílÂ&DqV ³ +01ÿÿ[ÿíl8&DT’ˆ ³  +01ÿÿ[ÿí„&DY”-³& +°&°Ð01ÿÿ�Mß&Av ³(+01ÿÿ�þM�&A'>þ’¶0)@)P)]² )]01ÿÿ�M&AS> ³)+01ÿÿCÿí!ò&@v(, ³, +01ÿÿCÿí!&@R1$ ³, +01ÿÿCþ0!�&@z>ÿûÿÿCÿí!!&@SH- ³- +01ÿÿ0þ�&?'5þ’¶0 @ P ]²  ]01ÿÿ0&?S5 ³ +01ÿÿqÿí„-&>X4 ³+01ÿÿqÿ턲&>qm ³+01ÿÿqÿí„(&>T©x ³+01ÿÿqÿí„O&>Vy³+°°!Ð01ÿÿCÿí��&@@oÿÿD&9SO ³+01ÿÿDð&9U4 ³ +01ÿÿDà&9v/ ³+01ÿÿEÊ&:j³+°° Ð01ÿÿEÿ&:R2 ³+01ÿÿ(ñÿ&<R ³ +01ÿÿqþX„�&>WRÿñ°g°EX°/±>Y°EX°/± >Y°EX° /± >Y°±° +X!ØôY²9°/° ± ° +X!ØôY°±° +X!ØôY°°Ð01!6632%''2674&#"!!5!Žþ$Ey8ø"þøþç™j‚uCw<þÛþ‘pÏþ�éÜÇþÿÍ�hkƒ ý}Ïá%º°U°EX°/±>Y°EX°/± >Y°EX° /± >Y°±° +X!ØôY²9°/±° +X!ØôY°°Ð01!663 !4&#"!!5!~þ);w0 &þÝ��0z8þÛþ£YÏþ½ êòþ<Ä�n ýUÏáþšà°J°/°EX° /± >Y°EX°/± >Y°°а± ° +X!ØôY°аа ±° +X!ØôY01!!!36!3!!ÄþøüƒþópNu (³­üœ VF9þ…þšfþšFC!Tû0|ÝþÊiïé°ƒ°EX° /± >Y°EX° /± >Y°EX° /± >Y°EX°/±>Y°EX°/± >Y°EX°/± >Y°EX°/± >Y° ±° +X!ØôY°в 9° °а°Ð01#!#!!3!3!!?ªþÝ®þºþ”ÊþNiH—#“AhþUÃþ•`ý `ý Ÿý­Sý­Sýcüí$ÿëî°N°EX°/±>Y°EX°/± >Y²9²4]¶BRb]°°а±° +X!ØôY²9013!#"&''32677!‰5þ@« @ 6POýÿ;)MÔûd�šßFG7!IÿÄHì'V° /°/² 9°/² 9° /°а/°°а/±° +X!ØôY°±!° +X!ØôY°а/°°а/013 !#!5# !35!"33!32654&#ÜXþ§þðþÜþîþ©X$þÖš°°š$˜°¯™-þ´þðþôþ»¼¼D N¿þQ¿¯ª¶Îý2¹©¯½…$° ;°EX°/±>Y°EX° /± >Y±° +X!ØôY°°а°а°Ð01!!!!!©œ#˜$ùa°û0Ðû0ÐúP°…þ¢î°;° /°EX°/±>Y°EX° /± >Y± ° +X!ØôY°аа°аÐ01!!!!3!!©œ#˜$Êþñùº°û0Ðû0Ðû0ýÂ^°í° T°EX°/±>Y°EX° /± >Y² 9°/°± ° +X!ØôY°± ° +X!ØôY° ±° +X!ØôY01!32#!!32654&#¶úý&þØûýâþn¶ú{…„|°ýå÷ÎÑÿÏýåþ,‰id~„Ű B°EX° /± >Y°EX°/± >Y² 9°/± ° +X!ØôY°± ° +X!ØôY0132#!!32654&#¨úý&þØûýâ$ú{…„|•÷ÎÑÿ°ýþ,‰id~ÿïS° V°EX° /± >Y°EX°/± >Y°EX° /± >Y² 9°/± ° +X!ØôY² 9° ±° +X!ØôY01!!&&54$3!!##"33*þÅ;stüøþÜúúÔy{~vÔp=¿…×èúP¹yqq‰TÿëQ*g°EX°/±>Y°EX°/± >Y²9°/²]²9°/±° +X!ØôY²9°±° +X!ØôY°±$° +X!ØôY012#"557665366"326554&käþñïðþñßa]âºàp…7“6qhhsqijþþçßæþà æ‘d‚,5<Â~#Š{1>áœ{…¡¡…{œ!þ¼ì:G° /°EX°/±>Y°EX° /± >Y±° +X!ØôY°аа ° а±° +X!ØôY017667!3!!!!#dEœþñý�þð/C9`ÛâgÉ»mü¦ýÜDþ¼&ë¡óXpÇ:}°EX°/±>Y°EX°/±>Y°EX° /± >Y°EX°/± >Y°EX°/± >Y°EX°/± >Y² 9° /±° +X!ØôY°в 9° °а°Ð01#!#!!3!3!!€þÝ~ÑþŠ^þ´pÙj#kÚpþ´]þŠ˜þh˜þhKïþh˜þh˜þýµFÿìÜM*z°EX°/±>Y°EX°/± >Y°±° +X!ØôY°° в*9°*/²*q´*�*]²¿*q²ï*q±)° +X!ØôY²)*9°°а±"° +X!ØôY012654&#"!'&632#"$77!32654&##5JFCLGWþåøºÐñXNZ_þýѹþ÷\TQPPSœ†>94H@6‘³¤—Iy# \˜®¬¢8JN9FAºDþ`•-;g°EX°/±>Y°EX°/±>Y°EX°/± >Y°EX°/± >Y°° а°а±8° +X!ØôY°#а±1° +X!ØôY°*Ð0132!6632#"&'!#"5%4&#"3265!3267&&#"DÑ¿%A#D'¿ÒÒ½'FþÝD$¾Ð-Z_ `WüöTa`W: äþ þÇþÿðþÜ þZ¤ $ðš¿ýk¦Ž�¥—¿š": T°EX° /± >Y°EX°/± >Y² 9°/° ± ° +X!ØôY°± ° +X!ØôY°±° +X!ØôY0132#!!5!32654&#zËÛúûÚþþÌXËZXXZ÷Ѭ¨ÒXâýÝþÈWCDZ{ÿë° H°EX°/±>Y°EX° /± >Y°в 9° ±° +X!ØôY°°а°а° Ð01#"&'#"$5!3265!3265þðÚo´9:µnÚþó$g\`k&j^]i°üáõPONQõáïü|zz|ïü|zz|ïcÿëD: S°EX°/±>Y°EX°/±>Y°EX° /± >Y°EX° /± >Y°в 9° ±° +X!ØôY°Ð01#"&'#"&5!3265!3265DòÈc�47¡cÇñ%KHRX%PPIM:ýyÜìFFFFì܇ýyvrrv‡ýywqrv‡ÿæEg°EX°/±>Y°EX° /± >Y² 9°/±° +X!ØôY² 9°/°° а°а±° +X!ØôY° ±° +X!ØôY01#32#!#53!332654&#¥ÿËÚúûÙþ››%ÿÿËYXXY9þÙØ¯±Ú9´,þÔýEþ­_KHa�ÿìׯ)ƒ°EX°)/±)>Y°EX°/±>Y°EX°&/±& >Y°EX° /± >Y² 9°/°Ð°° а± ° +X!ØôY°±° +X!ØôY° ±° +X!ØôY° °а°%Ð0135! !&&#"!!3267!! 5#!!¥¸@ þä ��ƒšµþK¢Š†z  þæþþþùþ¸¸þÜ$Y Tþñõ”•Õ¥á0§Õ�•ïþñR 0ýˆ°tÿëÏN'º°EX°'/±'>Y°EX°/±>Y°EX°$/±$ >Y°EX°/± >Y²9°/´�]²q´�Ÿq²ïq²¿q´O_q´¿Ï]²/]´/r°а° а± ° +X!ØôY°±° +X!ØôY°±° +X!ØôY°°а°"Ð013632!4&#"!!3265!#"'#!!˜‡ÞÈõþö\Qca;þÅafN^ ÿ½ßþþ†þÜ$xÑäºTo†j´n†[L¤ÝÔþ<:aÿë Å c|°/°EX° /± >Y°EX°/± >Y²q²Ïq²°]²@]°±° +X!ØôY°±° +X!ØôY° ±° +X!ØôY01! ! !3265%!54&#" þ­þñþóþ°O TþÜýˆ¦”–¨ýˆxª••¤Uþôþ¢^  _þ¡þõÛ+­ÚÚ­ß)ªÚÙ«Aÿë>N ~|°/°EX°/±>Y°EX° /± >Y°±° +X!ØôY²à]²]²Oq²r²ïq²q´€�r²]²ðr° ±° +X!ØôY°±° +X!ØôY01432#"5"!7&&267'!Aïðþñïðþñýah  i_`g þah'ò5þÌóôþÍ3ô[‡ll‡ý^ƒnnƒ ÃO°EX°/±>Y°EX°/±>Y°EX°/± >Y°Ð@ $4DT]²a]°± ° +X!ØôY0137663#"!!uÓ5ª�(+=þ±þÔþ4‹QN笨ì@8û¢°ÿÿ @&ç_?R³+°°Ð01{ÿëô1.@F™°EX°/±>Y°EX°/± >Y°в 9°°а±.° +X!ØôY°а±° +X!ØôY²#9°'вA.9°A/°E° +XØÜY°1а/° +XØÜY°1°4° +XØÜY°1°8а4°=° +XØÜY0176#"&'#"$54$"3265!32654&##"$#"#546323'7'3 Õ þóÚl°:;°jÚþó Õ\gg\`kja[hh[o�þÄ(16…xpF5oþ#R;¶¨üçþèüKJJKüèüçüÙ‚‚þƒ�z|oþ‘|z�ƒü‚‚ê†x33%mlxþS7l“�lÿë Ö.@F¬°EX°/±>Y°EX°/±>Y°EX°/± >Y°в 9°±° +X!ØôY°±° +X!ØôY²"9°'а±.° +X!ØôY²A9°A/°E° +XØÜY°1а/° +XØÜY°1°4° +XØÜY°1°8а4°=° +XØÜY0176#"&'#"&5546"32655!326554&##"$#"#546323'7'3;ÉÿðÀ[“12’ZÂîþÊPZJBEONFAK[OÍ�þÅ)16…ypF4oþ#Q:¶BíÚÍÛîHGGHîÛÍÚíÙttÍutsu©©ustuÍttõ†x33%mlxþ`7m…s{ÿë(}°EX°/±>Y°EX°/±>Y°EX°(/±(>Y°EX°/± >Y°°° +XØÜY°° +XØÜY°° +XØÜY°°а±° +X!ØôY°$в9°° Ð015!!#5#"&'#"$5!3265!3265uþ–µ¦þðÚo´9:µnÚþó$g\`k&j^]i—ppçüáõPONQõáïü|zz|ïü|zz|ïcÿëD±(}°EX°/±>Y°EX°/±>Y°EX°(/±(>Y°EX°/± >Y°°° +XØÜY°° +XØÜY°° +XØÜY°°а±° +X!ØôY°$в9°° Ð015!!#5#"&'#"&5!3265!3265º8þ°µQòÈc�47¡cÇñ%KHRX%PPIMAppþùýyÜìFFFFì܇ýyvrrv‡ýywqrv‡ÿæES]°/°EX° /± >Y² 9°/±° +X!ØôY² 9°/°° а°а±° +X!ØôY° ±° +X!ØôY01#32#!#535!332654&#¥ÿËÚúûÙþ››%ÿÿËYXXYûþد±Úûµ££ü‚þ­_KHaˆç°I°EX°/±>Y°EX°/± >Y²9°/² 9±° +X!ØôY°±° +X!ØôY01!!2'#%!27'7654&#!¬þÜDû �we‰sœþà 7+€eŠ'}{þàýð°ÿÑÑ‚]–1á�]˜;Qi‰pþ`@N)j°EX°/±>Y°EX°/±>Y°EX° /± >Y°EX° /± >Y² 9² 9°±° +X!ØôY° ±"° +X!ØôY²'"901'#"&'!!6632!4&#"327'765@o`h`VrU„/þÝ 0†YÉÞþÜfiB]]D=*th\ÿð’p\q0?=ýùÚ~FLþÆÿ™¾62þ&.0‰[mD^ˆþ³µ°W° /°EX°/±>Y°EX°/± >Y°±° +X!ØôY²9°/° ± ° +X!ØôY°±° +X!ØôY01!3 %'52674&##!!=ýo®Eþúþë–g ˜®þܵÏþuþÓþãúþ³ÎΘ¸ºý¡°kþâù:E° /°EX°/±>Y°EX°/± >Y°±° +X!ØôY²9°/±° +X!ØôY01!3 '6654&##!!MþA36Àµ{cg‘�3þÝâXÀûì†þò;½-„a~„þM:ÿÿþ›\°&Ò]Þÿÿþ›:&Ü]�ÿÿWþ'âÅ&¿]‡ÿŒÿÿFþ(ÜM&Ý]*ÿ�%µ°c°EX°/±>Y°EX° /± >Y°EX°/± >Y°EX°/± >Y²9°/±° +X!ØôY°±° +X!ØôY² 901#!!5!3!!Ê¢þÜþ!‚eþþœ`ý Îâý­SýZüö:È:c°EX° /± >Y°EX°/±>Y°EX°/± >Y°EX°/± >Y²9°/±° +X!ØôY°±° +X!ØôY² 901#!!5!3!!XpþÝþu®gépþŸ�þ|•þkXâþdœþýĈþ±°d°/°EX°/±>Y°EX°/± >Y°EX°/± >Y²9°/°± ° +X!ØôY°±° +X!ØôY°±° +X!ØôY013 %'52674&##!!!!"˜Eþúþë–g ˜˜þÜý®þÜšBþÓþãùþ²ÎΘ¸ºý£Ïû1°kþè¿:R°/°EX°/±>Y°EX°/± >Y°EX°/± >Y²9°/±° +X!ØôY°±° +X!ØôY013 '6654&##!!!!Z @Àµ{df›‹ZþÜþšþÜ®žúì†þò<½-…a~„þFXü¨:aÿëÄ*9w°EX° /± >Y°EX° /± >Y°EX°/± >Y°Ð² 9° ±° +X!ØôY°±° +X!ØôY°±*° +X!ØôY². 9° ±6° +X!ØôY01"&'# 5"3267&554323366554&#"rÎZL­^þÍþ€áapβ$hoí¾Ëþ\T*^3ý•YU@HTQIN##$%‡&È\âÓ¥ÊÈûa˜Éë:þ¶þý·�ø`  xÆ@=½pÔ«›�œTÿèôN(8w°EX°/±>Y°EX° /± >Y°EX°/± >Y°Ð²9° ±° +X!ØôY°±° +X!ØôY°±(° +X!ØôY°±-° +X!ØôY²5901"&'#"55477&&554632354&#&366ôd­I<ˆHýþÃí»9AŠp12½šŸÆFA#N*þÉ5)*4/--3;ð]Í á‚g_�° 6 ]•´íþúÆ�d°Dt‘ZwlS™Gx+#vÿÿ]þ.ÛÅ&&]ªÿ“ÿÿ>þ.òN&F]=ÿ“ÿÿÿîþ0Ä&8]Ãÿ•ÿÿÿ¼þ8oN&9]ãÿ�ÿÿéh&ÒT=¸ ³ +01ÿÿÇ&ÜTºa ³ +01„þ±°Y°/°EX°/±>Y°EX°/±>Y°EX°/± >Y²9°/±° +X!ØôY²9°±° +X!ØôY01%''2674&#!!!3!+ßþþúþë–h ˜þûþÜ$fsi9 þÙûøþ²ÍΘ¸»ý£°ý¯Q�þ×e:J°/°EX°/±>Y°EX°/±>Y°EX°/± >Y²9°/±° +X!ØôY²901'6654&##!!3! ž±¿¶{df™�mþÜ$WøqX/߬„þø;½,€^}zþk:þdœÿÿaÿë ÅåÿÿAÿë>Næÿÿaÿë &åj½X³$ +°$°!Ð01ÿÿAÿë>ç&æj7³$ +°$°!Ð01ÿÿ$ÿëîò&Óq†A ³+01ÿÿ$ÿëî &Ójk]³+°°Ð01ÿÿ$ÿëîK&ÓYÄ]³ +° °Ð01J%) @K a l Œ ’ œ .¯*Ý @ >  E Q .Y ‡ ,� É @ß  + &? \e TÁFont data copyright Google 2012RobotoBoldGoogle:Roboto Bold:2013Roboto BoldVersion 1.100141; 2013Roboto-BoldRoboto is a trademark of Google.GoogleGoogle.comChristian RobertsonLicensed under the Apache License, Version 2.0http://www.apache.org/licenses/LICENSE-2.0Font data copyright Google 2012RobotoBoldGoogle:Roboto Bold:2013Roboto BoldVersion 1.100141; 2013Roboto-BoldRoboto is a trademark of Google.GoogleGoogle.comChristian RobertsonLicensed under the Apache License, Version 2.0http://www.apache.org/licenses/LICENSE-2.0ÿjd   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`a¬£„…½–膎‹�©¤Šƒ“òó�—ˆÞñžªõôö¢­ÉÇ®bc�dËeÈÊÏÌÍÎéfÓÐѯgð‘ÖÔÕhëí‰jikmln oqprsutvwêxzy{}|¸¡~€�ìîº   ýþ  ÿøù !"#$%&'()*+,-./0×123456789:;<=>?âã@ABCDEFGHIJKLMN°±OPQRSTUVWXûüäåYZ[\]^_`abcdefghijklmn»opqræçs¦tuvwxyz{|}~€�‚ØáÛÜÝàÙ߃„…†‡ˆ‰Š‹Œ�Ž��‘’“”•–—˜™š›œ�žŸ ¡¢£¤¥¦§¨©ª«Ÿ¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁ›ÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€�‚ƒ„…†‡ˆ‰Š‹Œ�Ž��‘’“”•–—˜™š›œ�žŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ     ²³¶·Ä´µÅ‚‡«Æ ¾¿!¼"#÷$%&'()*Œ+,-./˜š™ï¥’œ§�”•¹0À123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€�‚ƒ„…†‡ˆ‰Š‹Œ�Ž��‘’“”•–—˜™š›œ�žŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ     NULLuni00ADmacronperiodcenteredAmacronamacronAbreveabreveAogonekaogonek Ccircumflex ccircumflexuni010Auni010BDcarondcaronDcroatdcroatEmacronemacronEbreveebreve Edotaccent edotaccentEogonekeogonekEcaronecaron Gcircumflex gcircumflexuni0120uni0121 Gcommaaccent gcommaaccent Hcircumflex hcircumflexHbarhbarItildeitildeImacronimacronIbreveibreveIogonekiogonek IdotaccentIJij Jcircumflex jcircumflex Kcommaaccent kcommaaccent kgreenlandicLacutelacute Lcommaaccent lcommaaccentLcaronlcaronLdotldotNacutenacute Ncommaaccent ncommaaccentNcaronncaron napostropheEngengOmacronomacronObreveobreve Ohungarumlaut ohungarumlautRacuteracute Rcommaaccent rcommaaccentRcaronrcaronSacutesacute Scircumflex scircumflex Tcommaaccent tcommaaccentTcarontcaronTbartbarUtildeutildeUmacronumacronUbreveubreveUringuring Uhungarumlaut uhungarumlautUogonekuogonek Wcircumflex wcircumflex Ycircumflex ycircumflexZacutezacute Zdotaccent zdotaccentlongsOhornohornUhornuhornuni01F0 Aringacute aringacuteAEacuteaeacute Oslashacute oslashacute Scommaaccent scommaaccentuni0237uni02BCuni02F3 gravecomb acutecomb tildecombhookuni030Fdotbelowtonos dieresistonos Alphatonos anoteleia EpsilontonosEtatonos Iotatonos Omicrontonos Upsilontonos OmegatonosiotadieresistonosAlphaBetaGammaDeltaEpsilonZetaEtaThetaIotaKappaLambdaMuNuXiOmicronPiRhoSigmaTauUpsilonPhiChiPsi IotadieresisUpsilondieresis alphatonos epsilontonosetatonos iotatonosupsilondieresistonosalphabetagammadeltaepsilonzetaetathetaiotakappalambdauni03BCnuxiomicronrhosigma1sigmatauupsilonphichipsiomega iotadieresisupsilondieresis omicrontonos upsilontonos omegatonosuni03D1uni03D2uni03D6uni0400uni0401uni0403uni0404uni0405uni0406uni0407uni0408uni0409uni040Auni040Cuni040Duni040Euni040Funi0410uni0411uni0412uni0413uni0415uni0417uni0418uni0419uni041Auni041Buni041Cuni041Duni041Euni041Funi0420uni0421uni0422uni0425uni0426uni0427uni042Buni042Duni042Euni0430uni0432uni0433uni0435uni0438uni0439uni043Auni043Buni043Cuni043Duni043Euni043Funi0440uni0441uni0442uni0443uni0445uni0446uni0447uni0448uni0449uni044Buni044Cuni044Duni044Euni044Funi0450uni0451uni0452uni0453uni0454uni0455uni0456uni0457uni0458uni0459uni045Auni045Buni045Cuni045Duni045Euni045Funi0462uni0466uni0467uni0468uni0469uni046Auni046Buni046Cuni046Duni046Euni046Funi0470uni0471uni0475uni0477uni0478uni0479uni047Auni047Buni0480uni0481uni0482uni0483uni0484uni0485uni0486uni0488uni0489uni048Auni048Buni048Cuni0490uni0491uni0492uni0493uni049Auni049Buni049Cuni049Duni049Euni049Funi04A2uni04A3uni04A4uni04A5uni04ACuni04ADuni04AEuni04AFuni04B0uni04B1uni04B2uni04B3uni04B4uni04B5uni04B6uni04B7uni04B8uni04B9uni04BAuni04BBuni04BCuni04BDuni04C0uni04C5uni04C6uni04C7uni04C8uni04C9uni04CAuni04CBuni04CCuni04CDuni04CEuni04CFuni04D0uni04D1uni04D2uni04D3uni04D4uni04D5uni04D6uni04D7uni04D8uni04D9uni04DAuni04DBuni04DCuni04DDuni04DEuni04DFuni04E0uni04E1uni04E2uni04E3uni04E4uni04E5uni04E6uni04E7uni04ECuni04EDuni04EFuni04F1uni04F3uni04F4uni04F5uni04F6uni04F7uni04F8uni04F9uni04FAuni04FBuni04FCuni04FDuni04FEuni04FFuni0500uni0501uni0502uni0503uni0504uni0505uni0506uni0507uni0508uni0509uni050Auni050Buni050Cuni050Duni050Euni050Funi0510uni0511uni0512uni0513uni1E00uni1E01uni1E3Euni1E3FWgravewgraveWacutewacute Wdieresis wdieresisuni1EA0uni1EA1uni1EA2uni1EA3uni1EA4uni1EA5uni1EA6uni1EA7uni1EA8uni1EA9uni1EAAuni1EABuni1EACuni1EADuni1EAEuni1EAFuni1EB0uni1EB1uni1EB2uni1EB3uni1EB4uni1EB5uni1EB6uni1EB7uni1EB8uni1EB9uni1EBAuni1EBBuni1EBCuni1EBDuni1EBEuni1EBFuni1EC0uni1EC1uni1EC2uni1EC3uni1EC4uni1EC5uni1EC6uni1EC7uni1EC8uni1EC9uni1ECAuni1ECBuni1ECCuni1ECDuni1ECEuni1ECFuni1ED0uni1ED1uni1ED2uni1ED3uni1ED4uni1ED5uni1ED6uni1ED7uni1ED8uni1ED9uni1EDAuni1EDBuni1EDCuni1EDDuni1EDEuni1EDFuni1EE0uni1EE1uni1EE2uni1EE3uni1EE4uni1EE5uni1EE6uni1EE7uni1EE8uni1EE9uni1EEAuni1EEBuni1EECuni1EEDuni1EEEuni1EEFuni1EF0uni1EF1Ygraveygraveuni1EF4uni1EF5uni1EF6uni1EF7uni1EF8uni1EF9uni1F4Duni2000uni2001uni2002uni2003uni2004uni2005uni2006uni2007uni2008uni2009uni200Auni200Buni2015 underscoredbl quotereverseduni2025minutesecond exclamdbluni2074 nsuperiorlirapesetauni20ABEurouni2105uni2113uni2116 estimated oneeighth threeeighths fiveeighths seveneighths commaaccentuniFB02uniFB03uniFB04uniFEFFuniFFFCuniFFFD Imacron.smcp dasiaoxia eight.supnine.supsix.smcp four.smcp three.smcptwo.smcpone.smcp zero.smcpZ.smcpY.smcpX.smcpW.smcpV.smcpU.smcpT.smcpS.smcpR.smcpQ.smcp zero.lnumO.smcpN.smcpcrossbarM.smcpL.smcpK.smcpJ.smcpI.smcpH.smcpG.smcpF.smcpE.smcpD.smcpC.smcpB.smcpcommaaccentrotatebrevegravecombA.smcpcircumflexacutecombcircumflexgravecombcircumflexhookcombcircumflextildecombbreveacutecomb brevehookcombbrevetildecomb cyrillicticcyrillichookleft cyrillichooklargerighthookone.lnumtwo.lnum three.lnum four.lnum five.lnumsix.lnum seven.lnum eight.lnum nine.lnumP.smcp five.smcpsix.supfive.supfour.sup three.suptwo.sup ringacuteone.supzero.sup nine.smcp eight.smcp seven.smcp seven.sup cyrillicbreve Dcroat.smcpEth.smcp Tbar.smcp Agrave.smcp Aacute.smcpAcircumflex.smcp Atilde.smcpAdieresis.smcp Aring.smcpAringacute.smcp Ccedilla.smcp Egrave.smcp Eacute.smcpEcircumflex.smcpEdieresis.smcp Igrave.smcp Iacute.smcpIcircumflex.smcpIdieresis.smcp Ntilde.smcp Ograve.smcp Oacute.smcpOcircumflex.smcp Otilde.smcpOdieresis.smcp Ugrave.smcp Uacute.smcpUcircumflex.smcpUdieresis.smcp Yacute.smcp Amacron.smcp Abreve.smcp Aogonek.smcp Cacute.smcpCcircumflex.smcp uni010A.smcp Ccaron.smcp Dcaron.smcp Emacron.smcp Ebreve.smcpEdotaccent.smcp Eogonek.smcp Ecaron.smcpGcircumflex.smcp Gbreve.smcp uni0120.smcpGcommaaccent.smcpHcircumflex.smcp Itilde.smcpUhungarumlaut.smcp Ibreve.smcp Iogonek.smcpIdotaccent.smcpJcircumflex.smcpKcommaaccent.smcp Lacute.smcpLcommaaccent.smcp Lcaron.smcp Ldot.smcp Nacute.smcpNcommaaccent.smcp Ncaron.smcp Omacron.smcp Obreve.smcpOhungarumlaut.smcp Racute.smcpRcommaaccent.smcp Rcaron.smcp Sacute.smcpScircumflex.smcp Scedilla.smcp Scaron.smcpTcommaaccent.smcp Tcaron.smcp Utilde.smcp Umacron.smcp Ubreve.smcp Uring.smcpgermandbls.smcp Zcaron.smcpZdotaccent.smcp Zacute.smcpYdieresis.smcpYcircumflex.smcpWcircumflex.smcp Uogonek.smcpuni0402uni040Buni0414uni0416uni0423uni0424uni0428uni0429uni042Auni042Cuni042Funi0431uni0434uni0436uni0437uni0444uni044Auni0460uni0461uni0463uni0464uni0465uni0472uni0473uni0474uni0476uni047Cuni047Duni047Euni047Funi048Duni048Euni048Funi0494uni0495uni0496uni0497uni0498uni0499uni04A0uni04A1uni04A6uni04A7uni04A8uni04A9uni04AAuni04ABuni04BEuni04BFuni04C1uni04C2uni04C3uni04C4uni04E8uni04E9uni04EAuni04EBuni04EEuni04F0uni04F2ÿÿ 0DDFLTlatnÿÿÿÿkernkern 3{((ú&’ø2&'ì'P'61Ø 0'ìÄ ~ ü$²'61˜&l20'< l b'1¾'0 ¤ Ú2˜1¾ ^'Î Ð2’'Î î&’&’&’&’&’&’2&'''''ì'ì'ì'ì'ì'ì'6'6'6'6'<'''''''0'0'0'02˜2˜2˜2˜2˜'Î1¾'Î&’'&’'&’'2&2&2&2&'ì'ì''0''0''0''0''0'61Ø 0 0 0 0'ì2˜'ì2˜'ì2˜ ^ ^ ^$²$²$²'6'6'6'6'6'6&l'<'Î'< l l l&’'(&’''ì'<&’ø%œ&’' l'ì1Ø&’ Ž'ìÄ x$²'<f20D'<æ'Îìö¸’'Î|2˜1¾’˜’ÈZŒ2˜''%œ'6/Ì/Ì1Ø2º&’ ø%œ'þ1Ø'ìÄ2&$²20ê¨'2&b'0¸2˜1¾ 'Î2’"x"²1v1¾#Ü'0'0&b$^1v1v'Î/Ì&’'Î'Î$ˆ%œ&b%œ1Ø1Ø1Ø$²'<'Î'<202’&’'&’'''0'0'0202’'ì2˜1¾'Î'Î'Î%œ&b&b202’&’'&l&l&l&’'&’'&’'&’'&’'&’'&’'&’'&’'&’'&’'&’'''0''0''0''0''0''0''0''0'ì2˜'ì2˜'ì2˜'ì2˜'ì2˜'ì2˜'ì2˜2˜'6'6'<'Î'<'Î'<'Î'<'Î'ì(((((((((*(P(b(l(‚(ˆ(®(À(Ò(è))$)*)4)Z)`*Î,202º.:/Ì/Ì/ò0L1&2’1L1¾1v1v2˜1˜1˜1¾202’1Ø2&202’2˜2º2º2º{ $%&'()-./2345789:;<=>DEHINRSUYZ[\^‚ƒ„…†‡‰Š‹Œ�’”•–—˜›œ�žŸ¢£¤¥¦§ª«¬­´µ¶·¸¿ÀÁÂÃÄÅÆÇÈÊÌÎÐÒÔÕÖרÙÚÛÜÝöøûýÿ$&(*,.024689:;=?HIQcehilmnopqsuvyz|}~€�‚…‹�Ž�“•—˜™›�ž ¡¢£¦¬­®³´µ¶¸º»¼½¾¿ÂÆÈÉÊËÏÐÑÒÓÔ×ÛÝßàáâåçèéëìîïôõùûü  "(*+,./FGHILMOQRS\]_`abefjklƒ„‡‰‹�Ž��‘’“”•–—˜™š›œ�žŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´¹º»¼½¾¿ÀÁÂÃÄÅÆÎÑÓßàáâãäåæçøùûüý9:;<=>?ABDHINPUjÏÐÑÒÓÖרÙÚÛÜÝÞßâæçèïòóöü  9:<Ÿ68:i…*,‡‰‹ßáãåçèËþ»þ»þ»$ÿ]7Dÿ¼FÿÌGÿÌHÿÌJÿÌRÿÊTÿÌUÿâXÿçYÿä\ÿä‚ÿ]ƒÿ]„ÿ]…ÿ]†ÿ]‡ÿ]¢ÿ¼£ÿ¼¤ÿ¼¥ÿ¼¦ÿ¼§ÿ¼©ÿ̪ÿÌ«ÿ̬ÿÌ­ÿÌ´ÿʵÿʶÿÊ·ÿʸÿÊ»ÿç¼ÿç½ÿç¾ÿç¿ÿäÁÿäÂÿ]Ãÿ¼Äÿ]Åÿ¼Æÿ]Çÿ¼ÉÿÌËÿÌÍÿÌÏÿÌÑÿÌÕÿÌ×ÿÌÙÿÌÛÿÌÝÿÌßÿÌáÿÌãÿÌåÿÌÿÊÿÊÿÊÿÌ$&+ÿç-ÿç/ÿç1ÿç3ÿç5ÿç9ÿäDÿÌFÿçHÿ]Iÿ¼cÿ]lÿ]oÿ]vÿ]†ÿÌŠÿç‹ÿÌ�ÿä—ÿä™ÿÊœÿÌ�ÿÌŸÿç¥ÿç¦ÿʧÿçºÿ]ÊÑÿ¼ÔÿÌÛÿÊÞÿÌàÿäëÿÌìÿÌïÿÌùÿäüÿ]ÿä ÿä ÿÌÿÌ(+ÿä0Fÿ]Gÿ¼Hÿ]Iÿ¼MÿÌOÿÌQÿÌ]ÿÊ`ÿäaÿäbÿäpÿÌqÿÌrÿÌ|ÿ̃ÿ]„ÿ¼�ÿ]Žÿ¼�ÿ]�ÿ¼‘ÿ]’ÿ¼“ÿ]”ÿ¼•ÿ]–ÿ¼—ÿ]˜ÿ¼™ÿ]šÿ¼›ÿ]œÿ¼�ÿ]žÿ¼Ÿÿ] ÿ¼¡ÿ]¢ÿ¼£ÿ]¤ÿ¼¦ÿ̨ÿ̪ÿ̬ÿÌ®ÿ̰ÿ̲ÿÌ´ÿ̺ÿʼÿʾÿÊÀÿÊÂÿÊÄÿÊÆÿÊÈÿÌÊÿÌÌÿÌÎÿÊÐÿÌÒÿçÔÿçÖÿçØÿçÚÿçÜÿçÞÿçàÿäâÿääÿäæÿäúþ»þþ»þ»þ»Uÿ‡ÏÐÞÿÌæÿÊêÿÌöûÿÌýÿÌÿÌÿÊ7ÿÙ9ÿß:ÿé<ÿ¹Ÿÿ¹$ÿÙ&ÿÙ6ÿé8ÿ¹:ÿ¹iÿ¹ÿ¹…ÿ¹ÊÿÙ(ÿÙ*ÿ¹,ÿ¹0ÿÙ‡ÿé‰ÿé‹ÿéßÿ¹áÿ¹ãÿ¹åÿ¹UÏÿÙÐÿÙçÿßèÿßöÿÙ7ÿá9ÿê<ÿÇŸÿÇ$ÿá&ÿá8ÿÇ:ÿÇiÿÇÿÇ…ÿÇÊÿá(ÿá*ÿÇ,ÿÇ0ÿáßÿÇáÿÇãÿÇåÿÇÏÿáÐÿáçÿêèÿêöÿá-ÿë8ÿë›ÿëœÿë�ÿëžÿëöÿë*ÿë,ÿë.ÿë0ÿë2ÿë4ÿë³ÿëÑÿëÓÿë " " 5@B`%Q"ø"ù"û"ü"ý"""=FÿéGÿéHÿéJÿéTÿé©ÿéªÿé«ÿé¬ÿé­ÿéÉÿéËÿéÍÿéÏÿéÑÿéÕÿé×ÿéÙÿéÛÿéÝÿéßÿéáÿéãÿéåÿéÿéDÿé†ÿé‹ÿéœÿé�ÿéÔÿéÞÿéëÿéìÿéïÿé ÿéÿéMÿéOÿéQÿépÿéqÿérÿé|ÿé¦ÿé¨ÿéªÿé¬ÿé®ÿé°ÿé²ÿé´ÿéÈÿéÊÿéÌÿéÐÿéÞÿéêÿéûÿéýÿéÿéÿ¸ÿ¸ÿ¸úÿ¸þÿ¸ÿ¸ÿ¸-ÿé8ÿé›ÿéœÿé�ÿéžÿéöÿé*ÿé,ÿé.ÿé0ÿé2ÿé4ÿé³ÿéÑÿéÓÿé Zÿ˜:ÿª<ÿÐ=ÿ«>ÿë?ÿ±BÿðDÿðMÿïQÿñUIWZZÿá€ÿ¢ÿßBÿéDÿéMÿèQÿêU:&ÿñ*ÿñ2ÿñ4ÿñ‰ÿñ”ÿñ•ÿñ–ÿñ—ÿñ˜ÿñšÿñÈÿñÊÿñÌÿñÎÿñÞÿñàÿñâÿñäÿñÿñÿñÿñÿñCÿñLÿñhÿñsÿñzÿñ•¯ÿñÆÿñÉÿñ ÿñ ÿñÿñ\ÿñ{ÿñ¹ÿñ»ÿñ½ÿñ¿ÿñÁÿñÃÿñÅÿñÇÿñÉÿñËÿñÍÿñÏÿñçÿñàÿñåÿñéÿñëÿñúÿñüÿñÿñÿñ;&ÿâ*ÿâ2ÿâ4ÿâ‰ÿâ”ÿâ•ÿâ–ÿâ—ÿâ˜ÿâšÿâÈÿâÊÿâÌÿâÎÿâÞÿâàÿââÿâäÿâÿâÿâÿâÿâCÿâLÿâhÿâsÿâzÿâ€ÿ·•¯ÿâÆÿâÉÿâ ÿâ ÿâÿâ\ÿâ{ÿâ¹ÿâ»ÿâ½ÿâ¿ÿâÁÿâÃÿâÅÿâÇÿâÉÿâËÿâÍÿâÏÿâçÿâàÿâåÿâéÿâëÿâúÿâüÿâÿâÿâ7$ÿß;ÿÊ<ÿË‚ÿ߃ÿß„ÿß…ÿ߆ÿ߇ÿߟÿËÂÿßÄÿ߯ÿß8ÿË:ÿËHÿßcÿßiÿËlÿßoÿßvÿßÿË�ÿÊ…ÿË•ÿݺÿßËÿÊüÿß*ÿË,ÿË.ÿÊFÿßHÿßRÿÊkÿʃÿß�ÿß�ÿß‘ÿß“ÿß•ÿß—ÿß™ÿß›ÿß�ÿߟÿß¡ÿߣÿßßÿËáÿËãÿËåÿËÒÿÊòÿÊÿÊ(ÿ‚ÿ‚ÿ‚$ÿÄ‚ÿăÿÄ„ÿÄ…ÿĆÿćÿÄÂÿÄÄÿÄÆÿÄHÿÄcÿÄlÿÄoÿÄvÿÄ›ÿðºÿÄüÿÄFÿÄHÿăÿÄ�ÿÄ�ÿÄ‘ÿÄ“ÿÄ•ÿÄ—ÿÄ™ÿÄ›ÿÄ�ÿÄŸÿÄ¡ÿÄ£ÿÄúÿ‚þÿ‚ÿ‚ÿ‚•&žÿê¡ÿé°FÿÖGÿÖHÿÖJÿÖPÿåQÿåRÿÏSÿåTÿÖXÿ×YÿÜ\ÿÜ©ÿÖªÿÖ«ÿÖ¬ÿÖ­ÿÖ³ÿå´ÿϵÿ϶ÿÏ·ÿϸÿÏ»ÿ×¼ÿ×½ÿ×¾ÿ׿ÿÜÁÿÜÉÿÖËÿÖÍÿÖÏÿÖÑÿÖÕÿÖ×ÿÖÙÿÖÛÿÖÝÿÖßÿÖáÿÖãÿÖåÿÖÿåÿå ÿå ÿåÿÏÿÏÿÏÿÖ+ÿ×-ÿ×/ÿ×1ÿ×3ÿ×5ÿ×9ÿÜDÿÖFÿ׆ÿÖˆÿåŠÿ׋ÿÖ�ÿÜŽÿë�ÿâ‘ÿå’ÿè“ÿæ—ÿܘÿí™ÿÏšÿãœÿÖ�ÿÖžÿÞŸÿ× ÿÅ¢ÿÌ£ÿÕ¥ÿצÿϧÿ×ÓÿåÔÿÖÕÿåÖÿå×ÿåÙÿåÚÿåÛÿÏÜÿåÝÿåÞÿÖàÿÜâÿåäÿååÿåçÿåéÿåëÿÖìÿÖîÿåïÿÖõÿå÷ÿåøÿåùÿÜÿÜ ÿÜ ÿÖÿÖÿåÿå%ÿå'ÿå+ÿÜ>ÿå@ÿåDÿåMÿÖOÿÖQÿÖYÿå[ÿå]ÿÏ`ÿÜaÿÜbÿÜfÿåhÿåjÿåpÿÖqÿÖrÿÖ|ÿÖ†ÿå¦ÿÖ¨ÿÖªÿÖ¬ÿÖ®ÿÖ°ÿÖ²ÿÖ´ÿÖºÿϼÿϾÿÏÀÿÏÂÿÏÄÿÏÆÿÏÈÿÖÊÿÖÌÿÖÎÿÏÐÿÖÒÿ×Ôÿ×Öÿרÿ×Úÿ×Üÿ×Þÿ×àÿÜâÿÜäÿÜæÿÜÞÿÖæÿÏêÿÖûÿÖýÿÖÿÖÿÏvÿÔ ÿÔFÿíGÿíHÿíJÿíTÿíXÿìYÿÖ\ÿÖ©ÿíªÿí«ÿí¬ÿí­ÿí»ÿì¼ÿì½ÿì¾ÿì¿ÿÖÁÿÖÉÿíËÿíÍÿíÏÿíÑÿíÕÿí×ÿíÙÿíÛÿíÝÿíßÿíáÿíãÿíåÿíÿí+ÿì-ÿì/ÿì1ÿì3ÿì5ÿì9ÿÖDÿíFÿìQÿÔ†ÿíŠÿì‹ÿí�ÿÖ’ÿé•—ÿÖšÿçœÿí�ÿížÿÖŸÿì ÿã¥ÿì§ÿìÔÿíÞÿíàÿÖëÿíìÿíïÿíùÿÖÿÖ ÿÖ ÿíÿí+ÿÖMÿíOÿíQÿí`ÿÖaÿÖbÿÖpÿíqÿírÿí|ÿí¦ÿí¨ÿíªÿí¬ÿí®ÿí°ÿí²ÿí´ÿíÈÿíÊÿíÌÿíÐÿíÒÿìÔÿìÖÿìØÿìÚÿìÜÿìÞÿìàÿÖâÿÖäÿÖæÿÖøÿÔùÿÔûÿÔüÿÔýÿÔÿÔÿÔÞÿíêÿíûÿíýÿíÿí:ÿŽ ÿŽIÿæXÿïYÿ»\ÿ»»ÿï¼ÿï½ÿï¾ÿï¿ÿ»Áÿ»+ÿï-ÿï/ÿï1ÿï3ÿï5ÿï9ÿ»FÿïQÿŽŠÿï�ÿ»’ÿë•—ÿ»šÿéžÿ²Ÿÿï¡ÿÔ¥ÿï§ÿïàÿ»ùÿ»ÿ» ÿ»+ÿ»`ÿ»aÿ»bÿ»ÒÿïÔÿïÖÿïØÿïÚÿïÜÿïÞÿïàÿ»âÿ»äÿ»æÿ»øÿŽùÿŽûÿŽüÿŽýÿŽÿŽÿŽEFÿãGÿãHÿãJÿãTÿã©ÿãªÿã«ÿã¬ÿã­ÿãÉÿãËÿãÍÿãÏÿãÑÿãÕÿã×ÿãÙÿãÛÿãÝÿãßÿãáÿããÿãåÿãÿãDÿã†ÿã‹ÿ㕜ÿã�ÿãÔÿãÞÿãëÿãìÿãïÿã ÿãÿãMÿãOÿãQÿãpÿãqÿãrÿã|ÿã¦ÿã¨ÿãªÿã¬ÿã®ÿã°ÿã²ÿã´ÿãÈÿãÊÿãÌÿãÐÿãúþÞÿãêÿãûÿãýÿãÿãž ~ FÿäGÿäHÿäIJÿäRÿçTÿäY \ ©ÿäªÿä«ÿä¬ÿä­ÿä´ÿçµÿç¶ÿç·ÿç¸ÿç¿ Á ÉÿäËÿäÍÿäÏÿäÑÿäÕÿä×ÿäÙÿäÛÿäÝÿäßÿäáÿäãÿäåÿäÿçÿçÿçÿä9 DÿäQ†ÿä‹ÿä� Žÿê— ™ÿçš œÿä�ÿ䞦ÿçÔÿäÛÿçÞÿäà ëÿäìÿäïÿäù    ÿäÿä+ MÿäOÿäQÿä]ÿç` a b pÿäqÿärÿä|ÿä¦ÿä¨ÿäªÿä¬ÿä®ÿä°ÿä²ÿä´ÿäºÿç¼ÿç¾ÿçÀÿçÂÿçÄÿçÆÿçÈÿäÊÿäÌÿäÎÿçÐÿäà â ä æ øùûüý:=?@ÿôBÿéDÿêMÿéQÿëUÿ³Þÿäæÿçêÿäûÿäýÿäÿäÿç [ÿê]ÿê<ÿê>ÿê@ÿê¡ÿÜáÿê/ÿêSÿêlÿêÜÿêóÿêÿêd FÿèGÿèHÿèI JÿèRÿæTÿè©ÿèªÿè«ÿè¬ÿè­ÿè´ÿæµÿæ¶ÿæ·ÿæ¸ÿæÉÿèËÿèÍÿèÏÿèÑÿèÕÿè×ÿèÙÿèÛÿèÝÿèßÿèáÿèãÿèåÿèÿæÿæÿæÿèDÿèQ †ÿè‹ÿèŽÿë�ÿð™ÿæœÿè�ÿè ÿï¡£ÿì¦ÿæÔÿèÛÿæÞÿèëÿèìÿèïÿè ÿèÿèMÿèOÿèQÿè]ÿæpÿèqÿèrÿè|ÿè¦ÿè¨ÿèªÿè¬ÿè®ÿè°ÿè²ÿè´ÿèºÿæ¼ÿæ¾ÿæÀÿæÂÿæÄÿæÆÿæÈÿèÊÿèÌÿèÎÿæÐÿèø ù û ü ý   Þÿèæÿæêÿèûÿèýÿèÿèÿæ [ÿð]ÿð<ÿð>ÿð@ÿðáÿð/ÿðSÿðlÿðÜÿðóÿðÿðYÿò[ÿð\ÿò]ÿñ¿ÿòÁÿò9ÿò<ÿñ>ÿñ@ÿñ�ÿò—ÿòàÿòáÿðùÿòÿò ÿò+ÿò/ÿðSÿð`ÿòaÿòbÿòlÿðàÿòâÿòäÿòæÿòÜÿðóÿðÿð;7ÿâ9ÿã;ÿð<ÿã[ÿïŸÿã$ÿâ&ÿâ8ÿã:ÿãiÿãÿã�ÿð…ÿã¸ÿëÊÿâËÿðÍÿäßÿÇáÿï(ÿâ*ÿã,ÿã.ÿð/ÿï0ÿâ2ÿä4ÿäAÿäRÿðSÿïcÿäkÿðlÿïsÿãuÿê}ÿâ~ÿÇßÿãáÿããÿãåÿãÏÿâÐÿâÒÿðÓÿëØÿâÜÿïçÿãèÿãòÿðóÿïöÿâ÷ÿÅÿðÿïÿë ÿë ÿë}ÿâ1ÿð7ÿï9ÿò;ÿò<ÿíŸÿí$ÿï&ÿï8ÿí:ÿíiÿíÿí�ÿò…ÿí´ÿô¸ÿñÃÿôÊÿïËÿò(ÿï*ÿí,ÿí.ÿò0ÿï;ÿôRÿòkÿòsÿðuÿðwÿô}ÿð�ÿôßÿíáÿíãÿíåÿíÏÿïÐÿïÒÿòÓÿñØÿïçÿòèÿòòÿòöÿïÿòÿñ ÿñ ÿñ Wˆÿ[Žÿì•ÿÇ›ÿ¬oÿÙUÿ_ÑÿEÛÿI/7ÿÞ;ÿá<ÿߟÿß$ÿÞ&ÿÞ8ÿß:ÿßiÿßÿß�ÿá…ÿß´ÿá¸ÿæÃÿáÊÿÞËÿáØÿçôÿç(ÿÞ*ÿß,ÿß.ÿá0ÿÞ;ÿá<ÿçRÿákÿáwÿá}ÿß�ÿá‚ÿçßÿßáÿßãÿßåÿßÏÿÞÐÿÞÑÿÝÒÿáÓÿæòÿáöÿÞÿáÿæ ÿæ ÿæ"7ÿÝ;ÿß$ÿÝ&ÿÝ�ÿß´ÿ߸ÿæÃÿßÊÿÝËÿߨÿèôÿè(ÿÝ.ÿß0ÿÝ;ÿß<ÿèRÿßkÿßwÿß�ÿß‚ÿèÏÿÝÐÿÝÑÿÜÒÿßÓÿæÛÿßòÿßöÿÝÿßÿæ ÿæ ÿæ!ÿð ÿðYÿô\ÿô¿ÿôÁÿô9ÿôQÿð�ÿô—ÿôßÿòàÿôùÿôÿô ÿô+ÿô`ÿôaÿôbÿô~ÿôàÿôâÿôäÿôæÿôøÿðùÿðûÿðüÿðýÿðÿðÿðáÿô÷ÿôYFÿíGÿíHÿíJÿíRÿßTÿí©ÿíªÿí«ÿí¬ÿí­ÿí´ÿßµÿß¶ÿß·ÿ߸ÿßÉÿíËÿíÍÿíÏÿíÑÿíÕÿí×ÿíÙÿíÛÿíÝÿíßÿíáÿíãÿíåÿíÿßÿßÿßÿíDÿí†ÿí‹ÿí™ÿßœÿí�ÿí¦ÿßÔÿíÛÿßÞÿíëÿíìÿíïÿí ÿí ÿèÿíMÿíOÿíQÿí]ÿßpÿíqÿírÿí|ÿí¦ÿí¨ÿíªÿí¬ÿí®ÿí°ÿí²ÿí´ÿíºÿß¼ÿß¾ÿßÀÿßÂÿßÄÿ߯ÿßÈÿíÊÿíÌÿíÎÿßÐÿíBÿèDÿèMÿæQÿèÞÿíæÿßêÿíûÿíýÿíÿíÿß– DÿíFÿëGÿëHÿëIJÿëRÿçTÿëY \ ¢ÿí£ÿí¤ÿí¥ÿí¦ÿí§ÿí©ÿëªÿë«ÿë¬ÿë­ÿë´ÿçµÿç¶ÿç·ÿç¸ÿç¿ Á ÃÿíÅÿíÇÿíÉÿëËÿëÍÿëÏÿëÑÿëÕÿë×ÿëÙÿëÛÿëÝÿëßÿëáÿëãÿëåÿëÿçÿçÿçÿë9 DÿëIÿíQ†ÿë‹ÿë� — ™ÿçœÿë�ÿë¦ÿçÑÿíÔÿëØÿÐÛÿçÞÿëà ëÿëìÿëïÿëôÿÐù    ÿë ÿéÿë+ <ÿÐGÿíIÿíMÿëOÿëQÿë]ÿç` a b pÿëqÿërÿët v |ÿë‚ÿЄÿíŽÿí�ÿí’ÿí”ÿí–ÿí˜ÿíšÿíœÿížÿí ÿí¢ÿí¤ÿí¦ÿë¨ÿëªÿë¬ÿë®ÿë°ÿë²ÿë´ÿëºÿç¼ÿç¾ÿçÀÿçÂÿçÄÿçÆÿçÈÿëÊÿëÌÿëÎÿçÐÿëà â ä æ øùûüýÛÿ¾ÞÿëæÿçêÿëìûÿëýÿëÿëÿçØßÿíãÿíêô3ÿí5ÿí<Bÿídÿí~ÿí‚Û÷ÿíJFÿëGÿëHÿëJÿëTÿë©ÿëªÿë«ÿë¬ÿë­ÿëÉÿëËÿëÍÿëÏÿëÑÿëÕÿë×ÿëÙÿëÛÿëÝÿëßÿëáÿëãÿëåÿëÿëDÿë†ÿë‹ÿëœÿë�ÿëÔÿëØÞÿëßÿÞãÿÞëÿëìÿëïÿëô ÿëÿë3ÿÞ5ÿÞ<BÿÞMÿëOÿëQÿëdÿÞpÿëqÿërÿë|ÿë~ÿÞ‚¦ÿë¨ÿëªÿë¬ÿë®ÿë°ÿë²ÿë´ÿëÈÿëÊÿëÌÿëÐÿëÛÞÿëêÿë÷ÿ‹ûÿëýÿëÿë Yÿò[ÿí\ÿò¿ÿòÁÿò9ÿò�ÿò—ÿòØÿñàÿòáÿíôÿñùÿòÿò ÿò+ÿò/ÿí<ÿñSÿí`ÿòaÿòbÿòlÿí‚ÿñàÿòâÿòäÿòæÿòÛÿìÜÿíóÿíÿí ÿÏ ÿÏQÿÏøÿÏùÿÏûÿÏüÿÏýÿÏÿÏÿÏ ÿå ÿåQÿåøÿåùÿåûÿåüÿåýÿåÿåÿå:Uÿ³ZÿÉmÿQ}ÿSˆÿ=¨ÿ�ºÿ�€ÿ«Žÿï�ÿf“ÿcšÿ‰›ÿažÿ¤ ÿf¡ÿ¥¢ÿe£ÿdÒÿŽßÿ¤æÿeèÿhêÿaúÿe ÿxÿ…!ÿe5ÿd7ÿd8ÿˆ9ÿQNÿâoÿPtÿ~vÿžzÿc}~ÿ}ÿð;ÿê<ÿï?ÿï@ÿ°Bÿ­Dÿ­Mÿ­Qÿ­UÿdÑÿ ØÚÿßÛÿZÝÿháÿgìÿÔïÿj÷ÿ¥ùÿŽ1UÿjZÿ�mþÂ}þLjþ ¨ÿCºÿ.€ÿ[ŽÿÐ�þç“ÿXšÿ8›þÝžÿn þç¡ÿR¢þå£þâÒÿ+ßÿPæþåèþêêþÝúþå þþÿ!þå5þâ7þâ8ÿ 9þÂNÿ¹oþÀtÿvÿFzþà}~ÿÿÒÑÿJØÚÿ´ÛþÒÝþêáþéìÿ¡ïþî÷ÿRùÿ+ ÿëÛÿÀ @Uÿè`BÿãDÿãMÿãQÿæUÿœ"ÿ³WÿìZÿÙEÿë€ÿá‚ÿÉ•/žÿ¾ßÿ¤4ÿT5ÿ‚8ÿ§9ÿ×Nÿðsÿ£uÿÁ}ÿT~ÿ€:ÿx<ÿ×=ÿÄ>ÿï?ÿ½DÿôMÿôÑ÷ÿ�ßÿítÿñvÿñ~ÿïáÿïìÿñ÷ÿÑZÿç:ÿí<ÿê=ÿíßÿôUÿè$ ÿÇ  ÿ¨@IÿØUÿÂWÿß`mÿ‰}ÿĈÿx¨ÿ§ºÿ¥€ÿÀŒÿߎÿë�ÿ–�’ÿæ“ÿ¸šÿ¾›ÿ�žÿ× ÿº¡ÿÒ¢ÿÌ£ÿ¦ÿ—;ÿì<ÿñ?ÿñBÿ«Dÿ«Mÿ«Qÿ®UÿoIŽÿìš ›ÿçž ÿïÛÿ¯ˆÿÃyÿñ}ÿí•ÿç}ÿÚ;ÿôUÿêÑÿÃZ BÿíDÿíMÿíQÿíU :<=?BÿèDÿèMÿèQÿêUÿ´BÿèDÿèMÿèQÿê?UÿÖBÿíDÿíMÿíQÿðUÿ½Uÿì :=?@ÿôBÿéDÿêMÿéQÿëUÿ³:ÿë<ÿô=ÿï?ÿð:ÿá<ÿï=ÿè?ÿæ:ÿç;ÿé=ÿï?ÿëUÿñ :ÿ¦<ÿÎ=ÿª>ÿé?ÿ¯BÿíDÿìMÿëQÿíUBÿèDÿèMÿæQÿèUÿÊ<ÿô=ÿë :ÿ¤<ÿÑ=ÿ®>ÿé?ÿ¥BÿðDÿðMÿðQÿðUÿÎ[ÿÁ ÿÁ7ÿÊ9ÿÌ;ÿò<ÿËYÿâ[ÿì\ÿâŸÿË¿ÿâÁÿâ$ÿÊ&ÿÊ8ÿË9ÿâ:ÿËQÿÁiÿËÿË�ÿò…ÿË�ÿâ—ÿâ¸ÿêÊÿÊËÿòÍÿÜßÿÀàÿâáÿìùÿâÿâ ÿâ(ÿÊ*ÿË+ÿâ,ÿË.ÿò/ÿì0ÿÊ2ÿÜ4ÿÜAÿÜRÿòSÿì`ÿâaÿâbÿâcÿÜkÿòlÿìsÿÌtÿôuÿã}ÿ¯~ÿÀßÿËàÿâáÿËâÿâãÿËäÿâåÿËæÿâøÿÁùÿÁûÿÁüÿÁýÿÁÿÁÿÁÏÿÊÐÿÊÒÿòÓÿêØÿÌÜÿìáÿáçÿÌèÿÌìÿÞòÿòóÿìöÿÊ÷ÿ¹ÿòÿìÿê ÿê ÿêL7ÿ²PÿÜQÿÜSÿÜYÿì\ÿì³ÿÜ¿ÿìÁÿìÿÜÿÜ ÿÜ ÿÜ$ÿ²&ÿ²9ÿìˆÿÜ�ÿì‘ÿÜ—ÿìÊÿ²ÓÿÜÕÿÜÖÿÜ×ÿÜÙÿÜÚÿÜÜÿÜÝÿÜßÿÙàÿìâÿÜäÿÜåÿÜçÿÜéÿÜîÿÜõÿÜ÷ÿÜøÿÜùÿìÿì ÿìÿÜÿÜ%ÿÜ'ÿÜ(ÿ²+ÿì0ÿ²8ÿæ>ÿÜ@ÿÜDÿÜYÿÜ[ÿÜ`ÿìaÿìbÿìfÿÜhÿÜjÿÜtÿô~ÿÚ†ÿÜàÿìâÿìäÿìæÿìÏÿ²Ðÿ²ØÿÀáÿêìÿèöÿ²÷ÿÙŽ$&ÿä*ÿä2ÿä4ÿä7ÿÚ9ÿÚ<ÿÙ‚ƒ„…†‡‰ÿä”ÿä•ÿä–ÿä—ÿä˜ÿäšÿäŸÿÙÂÄÆÈÿäÊÿäÌÿäÎÿäÞÿäàÿäâÿääÿäÿäÿäÿäÿä$ÿÚ&ÿÚ8ÿÙ:ÿÙCÿäHLÿächÿäiÿÙlosÿävzÿäÿÙ…ÿÙ¯ÿä´ºÃÆÿäÉÿäÊÿÚÍÿÜØãÿÚôü ÿä ÿäÿä(ÿÚ*ÿÙ,ÿÙ0ÿÚ2ÿÜ3ÿÚ4ÿÜ5ÿÚ9ÿÜ;<AÿÜBÿÚFHNÿæ\ÿäcÿÜdÿÚsÿÙuÿØw{ÿä}ÿÙÿð�‚ƒ��‘“•—™›�Ÿ¡£¹ÿä»ÿä½ÿä¿ÿäÁÿäÃÿäÅÿäÇÿäÉÿäËÿäÍÿäÏÿäßÿÙáÿÙãÿÙåÿÙçÿäÏÿÚÐÿÚÑØÿÚÛàÿäåÿäçÿÚèÿÚéÿäëÿäöÿÚúÿäüÿäÿäÿäd$7ÿâ9ÿâ;<ÿ₃„…†‡ŸÿâÂÄÆ$ÿâ&ÿâ8ÿâ:ÿâHciÿâlovÿâ�…ÿâ´¸ ºÃÊÿâËÍÿáÏÿòØßÿããÿäôü(ÿâ*ÿâ,ÿâ.0ÿâ2ÿá3ÿä4ÿá5ÿä;<AÿáBÿäFHRcÿádÿäksÿâuÿâw}ÿâ~ÿã�‚ƒ��‘“•—™›�Ÿ¡£ßÿâáÿâãÿâåÿâÏÿâÐÿâÑÒÓ ØÿâÛçÿâèÿâòöÿâ÷ÿã   ßÿÆ4ÿã8ÿÙsÿÉuÿé}ÿŽ~ÿÉØÿ¸÷ÿÅ7ÿè<ÿñŸÿñ$ÿè&ÿè8ÿñ:ÿñiÿñÿñ…ÿñÊÿè(ÿè*ÿñ,ÿñ0ÿèßÿñáÿñãÿñåÿñÏÿèÐÿèöÿè6PÿìQÿìSÿì[ÿí³ÿìÿìÿì ÿì ÿìˆÿì‘ÿìÓÿìÕÿìÖÿì×ÿìÙÿìÚÿìÜÿìÝÿìßÿëáÿíâÿìäÿìåÿìçÿìéÿìîÿìõÿì÷ÿìøÿìÿìÿì%ÿì'ÿì/ÿí>ÿì@ÿìDÿìSÿíYÿì[ÿìfÿìhÿìjÿìlÿí~ÿì†ÿìÛÿëÜÿíáÿòìÿïóÿí÷ÿìÿí ßÿêãÿê3ÿê5ÿêBÿêdÿê~ÿêÛ÷ÿê ÿì ÿìQÿìøÿìùÿìûÿìüÿìýÿìÿìÿìßÿ®5ÿêtÿívÿð~ÿ®áÿÓìÿÕ÷ÿŽ @UÿÝ`BÿÓDÿÓMÿÓQÿÓUÿjžÿç¡ÿäßÿè~ÿéÛÿÆ÷ÿéZÿ¶€ÿ»žÿ¦ßÿ­ ÿÊ5ÿ†NÿÐtÿ‡vÿ~ÿ�ÿìBÿãDÿãMÿâQÿäÚÿÐáÿ¤ìÿ¾÷ÿa ÿâ9ÿê€ÿÌŽÿí’ÿꕞÿ— ÿÌ¢ÿÒ£ÿÕßÿÁ5ÿ­8ÿÏ9ÿ»Nÿãsu~ÿ¢ÿðBÿæDÿãMÿãQÿæÑÚÿæ÷ÿ” ÿïžÿç¡ÿçßÿçtÿô~ÿéáÿíìÿï÷ÿÙÒÿÚæÿÙêÿÊúÿÚ ÿÅÿÝ!ÿÚ5ÿæ7ÿØ9ÿÔoÿ±zÿÙ}ÑÿŸØÛÿžÝÿÏïÿ×ùÿÚ –úÿÕÿRÿ¯ÿ¤ÿéÿ©ÿ©þãÿáÿäÿ~ÿÃÿÞÿèÿáÿçÿÎÿ¨ÿçÿæÿÍÿóÿêÿìÿâÿçÿâÿáÿæÿÑÿXÿÆÿ’þÖÿ+ÿ)þõÿðÿtÿÅÿäÿ‹ÿXÿôÿñÿñþ‚ÿ³ÿÙÿfÿ¡ÿœÿžÿ—ÿ­ÿ£ÿ¦ÿ5ÿÂÿ³ÿŸÿ8ÿßÿdÿfÿíÿ¥ÿ¹ÿsÿÊÿÌÿÊÿ)ÿßÿôÿ·ÿâÿ·ÿÙÿÜÿÜÿWÿêÿ›ÿâÿàÿèÿÍÿFÿÛÿ³ÿaÿ ÿÿ³ÿpÿ‡ÿ ÿµÿéÿ}ÿÞÿÃÿíÿÞÿÖÿaÿèÿèÿêÿáÿâÿÎÿïÿÏÿôÿðÿïÿïÿÖÿÚÿñÿÈÿÃÿïÿíÿàÿíÿnÿïÿñÿïÿtÿÈÿéÿäÿíÿíÿBÿFÿ:ÿ`ÿNÿS þ“ÿ‚ÿjÿHþ˜ÿ´þâþçÿÌÿRÿtÿ´ÿ�ÿ¾ÿžÿèÿÀÿãÿ•ÿ ÿ±ÿÅÿ±ÿÊÿ+ÿÁÿ`ÿæÿæÿ¯ÿéÿéÿÑÿaÿ¹ÿêÿô> %&'(-./23789:;<=DEFHKPQRSUY[\]‰Š‹Œ�’”•–—˜›œ�žŸ¢£¤¥¦§©ª«¬­³´µ¶·¸¿ÀÁÃÅÇÈÉÊËÌÍÎÏÐÒÔÕÖרÙÚÛÜÝçöøûýÿ  $&(*,.024689:;<=>?@IQehimnpqsuz|~�…ˆ�‘—™›¦¬­®³´µ¶¸¼½¾ÂÆÈÉÊËÑÓÔÛÝÞàáçèëìîôõùû  "(*+,./7GILMOQRS\]_`abefjkl„†‡‰‹Ž�’”–˜šœž ¢¤¥¦§¨©ª«¬­®¯°±²³´¹º»¼½¾¿ÀÁÂÃÄÅÆÎÑÓßàáâãäåæçøùúûüýþÒÓרÜÞßâæçèïòóöüý  %%&&''((--..//2233 77 8899 :: ;; <<==DDEEFFHHKKPQRRSSUUYY[[\\]]‰‰Š�’’”˜›žŸŸ¢§©©ª­³³´¸¿¿ÀÀÁÁÃÃÅÅÇÇÈÈÉÉÊÊËËÌÌÍÍÎÎÏÏÐÐÒÒÔÔÕÕÖÖ×רØÙÙÚÚÛÛÜÜÝÝççööøøûûýýÿÿ  $$ && (( **,,..00224466 8899::;;<<==>>??@@IIeehhiimmnnppqqssuuzz|| ~~ �� ……ˆˆ��‘‘——™™››¦¦¬­®®³³´µ¶¶¸¸¼¼½½¾¾ÂÂÆÆÈÈ ÉÉÊÊ ËË ÑÑÓÓÔÔÛÛÝÝÞÞààááççèèëìîîôõùùûû   ""(( **++,,.. //77GGIILLMMOOQQRR SS\\]]__`beeffjjkk ll„„††‡‡ ‰‰ ‹‹ ŽŽ��’’””––˜˜ššœœžž  ¢¢¤¤¥¥¦¦§§¨¨©©ªª««¬¬­­®®¯¯°°±±²²³³´´¹¹ºº»»¼¼½½¾¾¿¿ÀÀÁÁÂÂÃÃÄÄÅÅÆÆÎÎÑÑÓÓßßààááââããääååææççúúþþÒÒ ÓÓרÜÜÞÞßßââææçè ïïòò óóööüüýý  õ     #$$%%&&')**+,--.12233445566778899 ::;; << ==>CDDEEFHIIJJKOPQRRSSTTUUVVWWXXYYZZ[[\\]]^noop�‚‡ˆˆ‰‰Š“”˜™™šš›žŸŸ  ¡¢§¨¨©­®²³³´¸¹º»¾¿¿ÀÀÁÁÂÂÃÃÄÄÅÅÆÆÇÇÈÈÉÉÊÊËËÌÌÍÍÎÎÏÏÐÐÑÑÒÔÕÕÖÖ×רØÙÙÚÚÛÛÜÜÝÝÞÞßßààááââããääååæõöö÷        !!""##$$%%&&')**++,,--..//001122334455667788 99:: ;;<<==>>??@@ABCCDDEEFFGGHHIIJKLLMMNNOOPPQQRbccdghhii jkllmnooppqqrrsstuvvwyzz{~ €€�� ‚„…… ††‡‡ˆˆ‰‰ŠŠ‹‹ŒŒ��Ž�‘‘’–——˜˜™™š›œ�žžŸŸ ¤¥¥¦¦§§¨®¯¯°²³³´´µ·¸¸ ¹¹ºº»ÂÃÃÄÅÆÆÇÈÉÉÊÊËË ÌÌÍÍÎÐÑÑÒÒÓÓÔÔÕרØÙÚÛÛÜÝÞÞßßààááââããäåææççèèééêêëìííîîïïððñóôôõõöö÷øùùúûüüý          $%%&&''(())** ++,, --.. //001122334:;;<<==>>??@@AABBCCDDEEFFGGHHIIJLMMNNOOPPQQRR SSTXYYZZ[[\\]]^_`bccddeeffgghhiijjkk llmoprsvwwxz{{||}€��‚‚ƒƒ„„……††‡‡ˆˆ‰‰ŠŠ‹‹ŒŒ��ŽŽ����‘‘’’““””••––——˜˜™™šš››œœ��žžŸŸ  ¡¡¢¢££¤¤¥¥¦¦§§¨¨©©ªª««¬¬­­®®¯¯°°±±²²³³´´µ¸¹¹ºº»»¼¼½½¾¾¿¿ÀÀÁÁÂÂÃÃÄÄÅÅÆÆÇÇÈÈÉÉÊÊËËÌÌÍÍÎÎÏÏÐÐÑÑÒÒÓÓÔÔÕÕÖÖ×רØÙÙÚÚÛÛÜÜÝÝÞÞßß ààáá ââãã ääåå ææççèóôö÷÷øùúú ûýþþ ÿ ÎÏÐÑÑÒÒ ÓÓ ÔÛÜÜÝÝÞÞßßààáäååææçè ééêêëëìñòò óóôõöö÷ùúúûûüüýýþÿ   6nDFLTlatn ÿÿÿÿaalt aalt liga&lnum,smcp2 Z�°ÒæCabcdefghiURQPONMLKJIHGEDjBA@?>=<;:9URQPONMLKJIHGEDjBA@?>=<;:9|}~€�ƒ„…†‡ˆ‰Š‹zŒ�Ž��‘’“”•–Ç|}~€�ƒ„…†‡ˆ‰Š‹zŒ�Ž��‘’“”•–Ë——˜˜™™šš››��žžyyŸŸ  ¡¡¢¢££¤¤¥¥§§¨¨©©//««¬¬­®®¯¯°°±±²²³³´´µµ¶¶··¸¸¹¹ºº»»¼¼½½¾¾¿¿ÀÀÁÁÂÂ{{ÃÃÄÄÅÅÆÆªªÎÎÍÍÌÌËÊÊÉÉÈÈ‚‚$= D]$‚‡>‰˜D›ŸT¡§Y©¸`»¿pÁËuÎá€äç”êò˜öù¡û¥ ­³@¹HIä¾ÜURQPONMLKJIHGEDjBA@?>=<;:9URQPONMLKJIHGEDjBA@?>=<;:9|}~€�ƒ„…†‡ˆ‰Š‹zŒ�Ž��‘’“”•–Ç|}~€�ƒ„…†‡ˆ‰Š‹zŒ�Ž��‘’“”•–Ë——˜˜™™šš››��žžyyŸŸ  ¡¡¢¢££¤¤¥¥§§¨¨©©//««¬¬­®®¯¯°°±±²²³³´´µµ¶¶··¸¸¹¹ºº»»¼¼½½¾¾¿¿ÀÀÁÁÂÂ{{ÃÃÄÄÅÅÆÆªªÎÎÍÍÌÌËÊÊÉÉÈÈ‚‚$=D]‚‡4‰˜:›ŸJ¡§O©¸V»¿fÁËkÎáväçŠêòŽöù—û› £©@¯HIÚ(LI Cabcdefghi././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/lookAndFeel/Roboto-Regular.ttfIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/lookAndFeel/Roboto-Regular0000664002537200253720000043370415257173642031625 0ustar zmoelnigzmoelnigGPOS*Ëæ‡Þ¼SºGSUBnU¦2xJLTSH¦¢$OS/2¹Ç;˜`cmapR7Ó4Tcvt àTà0fpgm/æN«ˆ¼gaspÞ° glyfÍ^2;&(�LheadÿÏ®6hhea  6T$hmtxz§h¶tƒpostBì4ºø#¶prep±³PDœ†[È_<õÌG¸3ÎÌ1ü,ýÕ \w býÕ ü,ÿ?‚  —_›œ�š3š3ÑfàïP [ Goog ÿýbýÕb+ ŸO:° ýýý«œPüF�nÚhü@gP§„¯tŠN”01#$¡R‚q�º�\�_�7�˜�„�M�f�S¡ cG�˜0ˆÎ:)`.´vE´­´©´txµ´C¾j=%´R´´µ´tq ´tqM´ýa°"j“6BâÉa(�N'( X=£�RfjŒ�?aŒb;cÃ8ŒdŒ�Ÿÿ¾�Ÿþ�Œ�ŒaŒ�Œb¾�/gÄ"Œ‹.-.^¸?û¯¸o€ýû�bkªF°hÛó‘ëZýªDX•xÆbq1#DX¶{û€IcdqljŽƒŒ™î?¡ýw-_¥xÆn;¸¬¸õzõr......‚ÿìv­´­´­´­´CÿÞC¾CÿñCÿËc*µ´tqtqtqtqtqHXtqj“j“j“j“â¹£ʼnfjfjfjfjfjfjÁ:?a;c;c;c;cÿ¹™ÿÌÿ¦²HŒ�ŒaŒaŒaŒaŒa’GŒaŒ‹Œ‹Œ‹Œ‹¢™.fj.fj.fjv?av?av?av?aE´"bc*ªb­´;c­´;c­´;c­´;c­´;ctxŒdtxŒdtxŒdtxŒdµ´Œ�ŸªCÿÈÿ£CÿÀÿ›CÿøÿÓC.C´™­¾Ÿj= ÿ¼%´�x™R´ŸR´nR´šŸR´àŸ5(.%µ´Œ�µ´Œ�µ´Œ�Œÿàˆ¡Œ�tqŒatqŒatqŒa¨h>aM´¾�M´¾kM´¾eýa/gýa/gýa/gýa/g°"Ä"°"ì"°"Äÿøj“Œ‹j“Œ‹j“Œ‹j“Œ‹j“Œ‹j“Œ‹6-ââÉa^Éa^Éa^Ÿ¾ÿé{l—a–“´‹ ÿ¼.fj‚ÿìÁ:tqŒaýa/g ÿ¼¢PÓ«šŒl�, ¸…2DÓ‡úd ¶üÑýoü�ý[ü,ý<á.¡ÿ㧈DFÿ�j= ÿÍ.´t´§­´Éaµ´tqC¾%´A1´µ´•{tq·´ ´•F°"âŸTBˆWVpCÿËâ†bObŒ� ÅŒ�†b½�.ŒaOb/sŒ��w Åx™Œ8Œ™.VŒaÅOŒ�NbŒa0QŒ�ªSw^ [Íl ÿØŒ�ŒaŒ�ÍlñqAÿêHN­´­´)t´j‡ýaC¾CÿËj=™2¤´†B%´µ´U·´. £´t´0­´Mixµ´µ´%´«1´µ´tq·´ ´v°"U7UB(µ�“Œ´Ê´ ö´ £iµ!¾!cfjmaŒ�Q�ß.;c XŒ�Œ�>™mø™Œ�ŒaŒ�Œ�?aGÍb.Â�km�Ä�ôQ­Y™Nc‡™‹N;c;cŒÿçQ�Ok/gŸÿ¦ÿ¾öAõ�Œ>™Œ�Œ��| ÿÍYÿÛ-¿ú—Ó+I  Ñ ºß•ì• ¾ã™%JÚIˆW [tq�a.ÿþ zq’atqŒaþ�{�|8vKbp�Ô¹ûO,;ØMµ´Œ� ÿÍYÿÛ´‹�d£“�tÿüQÿóæ´�M ¿xX%´>™£h™9ÿõ.ÿÏ�CŽAµ´Œ�Ä´°�3´ú�îq×lv?a°"Gâ.â.B.77“ �“kv“lvŠl”ËM¿ÿß6M¿ÿßC¾M £`™«1mµ´Œ�µ´Œ��“k´ø™C¾.fj.fj‚ÿìÁ:­´;c‘YBt‘YBt—ÁixOXªiªiµ´Œ�µ´Œ�tqŒatq�atq�aiµNcUUU�“kt´Q�ö´Q­¿AIBB.B.[Œb¤[åbW6,1KP {ÂEvA©¢�÷vb®$!FiœOb«1m.fj´þ�6-6-6-.fj.fj.fj.fÿ£.fj.fj.fj.fj.fj.fj.fj.fj­´;c­´;c­´;c­´;c­ÿì;ÿ¦­´;c­´;c­´;cC¾™C´•tqŒatqŒatqŒat2Œÿ¾tqŒatqŒatqŒa{l—a{l—a{l—a{l—a{l—aj“Œ‹j“Œ‹–“´‹–“´‹–“´‹–“´‹–“´‹ââââtÿ$))¹ \0¢Ñˆ´|¼|¼§¢P¢P¡P¢+èPðPÖPiF’W·‰Ê¡d¡¤@gPœPglgX6«¥;­G`z©ªF’¤ªb@Oé|ÒjÌ«g˜¿kVn†pßk¢Hœ¨²F’¨×?/h ÿ¼‚e0˜8ž@š)etÇ878Š84[5\ÿ™Lh„plh0xhGZåY^Nyx@Na‰7?»'‰0Gq]­™ãpÞ‹Ëp™ ’ø™½™a™@™û™Óp™G™ª™’py™ ¤�º' x ÿUn n¤�¤�¥�‘`1ÿ¾ ÿ ;[«tŸFŸ§Ÿ“Õ}Ÿby™Z|x|r”Wlj[q¸›-_¥x(G0X½G_l�ªÿöªÿö0Gº'º'º'º'º'º'º'’pG™G™G™G™ÿ·™ÿÊÿ¤™ËpËpËpËpËp‰‰‰‰aº'º'º'’p’p’p’pª™G™G™G™G™G™ÓpÓpÓpÓpû™ÿ¡‰ÿÑ<�@a™½k½™½™½™™™™ËpËpËp­™­™­™q]q]q]q]0G0G‰‰‰‰â]@N@N@Naa?‰ '*."""## +1+/%%."""""" ....""""/0"""$&  "1.0-"1"1 #0  -.+-".#"+"#+(( 0"##2" %-)"#,.+  ##  """-##(#"""""""    " 0(++(-%/'2/" /""""""""""////dHŽ€ ~’¡°ðÿ7¼ÇÉÝó #ŠŒ¡ÎÒÖ†?…ùM   " & 0 3 : < D t  ¤ § ¬!!!!"!&!.!^"""""""+"H"`"e%ÊöÃûþÿÿýÿÿ  ’ ¯ðú7¼ÆÉØó #„ŒŽ£ÑÖˆ>€ M   % 0 2 9 < D t  £ § «!!!!"!&!.!["""""""+"H"`"d%ÊöÃûþÿÿüÿÿÿõÿãÿÂÿ°ÿ£ÿ–ÿWÿNÿ6ÿþ•þŒý¨þ|þgþ[þZþUþPþ=ýÝýÜýÛýÚýØýÕý¬ý«ä¿äƒäCä)ãÖã$ããããããã ã ãâÓâÉâ¦â¤â¡âIâ<â:â/à]â$áøáUßiáIáHáAá>á2áàÿàüݘ  cimð ó  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`a†‡‰‹“˜ž£¢¤¦¥§©«ª¬­¯®°±³µ´¶¸·¼»½¾;rdei=x¡pkQvj_ˆš\s`agwWYXš]l|ƒ¨º�cn[B^om}?b‚…—018945¹bÁ:FMCDde<y6:@„Œƒ�Š��‘Ž•–”œ�›óRXqTUVzYWS°,K° PX±ŽY¸ÿ…°„± _^-°, EiD°`-°,°*!-°, F°%FRX#Y Š ŠIdŠ F had°%F hadRX#eŠY/ °SXi °TX!°@Yi °TX!°@eYY:-°, F°%FRX#ŠY F jad°%F jadRX#ŠY/ý-°,K °&PXQX°€D°@DY!! E°ÀPX°ÀD!YY-°, EiD°` E}iD°`-°,°*-°,K °&SX°@°YŠŠ °&SX#!°€ŠŠŠ#Y °&SX#!°ÀŠŠŠ#Y °&SX#!¸ŠŠŠ#Y °&SX#!¸@ŠŠŠ#Y °&SX°%E¸€PX#!¸€#!°%E#!#!Y!YD-° ,KSXED!!Y-° ,°E-° ,°E-° ,±'ˆ ŠSX¹@c¸ˆTX¹èpY°#SX° ˆ¸TX¹èpYYY-° ,°@ˆ¸ ZX±D¹èDY-° +°+²+·]L;'+·I¸þ^ÆüvÞô .VzÌrÀ r ¶ þ X º $ @ r Ò ö \ ²  J ¦nšÖ~ÎFl„¨Êæ”ð:–üLÀ0zÂÚHŽØ6’ÐJšÞ€ÈPަà&&L¤ nÎôаDÀÌæî’¬ì.~ø . ~ ¤ º ê!!r!~! !Â!ä"0"H"`"v"Œ"¨"Ú#n#z#’#ª#À#Ü#ô$ $"$>$¨$¾$Ö$î%%%2%`%Ü%ô& &"&>&V&ž&ø' '$'@'^'‚'Ø(†(’(¤(¼(Ü))()H)b)Š)î* **8*T*r*–*Ð+H+h+ˆ+ +Æ+æ,B,h,x,„,š,Â,Î,Ú,ò- -"->-T-n-„-¢-¸-à.J.Æ.Ø.ä.ú/ /6/R/^/j/€/ž/´/Ð/æ00$0>0J0f0|0¬11v1Œ1ª1¼1È1Þ1ü222*2F2R2^2t2Œ2˜2¤3 3"3T3`3l3‚3¬3¼3Ì44R4j4„4�4œ4²4Ð4à585”5¸5Ä5Ú666@6È7l7„7ž7ª7¶7Ì7ê88828N8Z8f8|8š8¬8¸8Î8ä9&9”9ª9Æ9Ø9ä9ú:":T:¤:À:Ô:à:ì;;;0;F;b;z;š;°;Ø;î<<2<š<ø=P= =þ>>N>Z>r>Š> >¾>Ê>Ö???L?„?Ä?Ü@@T@œ@ÔAA(A>AHA€A¬AÈAäBBB*B6BBBNBZBfBrB~B†BŽB¶BîBöBþCCzC‚CŠCÂCÊCÒDD"DRDZD¢DªD²E$E,E‚EèFF F,F8FDFPFhFÞGJGŒGôHzHÔIIŒI¾IÆJ2J:JBJ´J¼K KbK¾LLBL„LìMjMÈN,NTNzN†N’NžOOtOèPPP~P–Q QrQzQ–QžR RpRÀRØRðSSDSLSœS¤S¬SþTTdTÞU4UJURU–UžU¦U®U¶U¾UÆUÎVV„VŒVÂWW:WxWÊX$XjXÌY\Y´Y¼Z2Z°ZØ[([0[�\\X\€\æ](]†]î]ö^&^.^x^¤^¬_4_<_p_²_î`0`€`Øaa�bbnb€b¬c(cHcÊcÒcÚdd dtdØe:eZeze eÜf8f”fîgLgÐhbh¸iiziôjdjÐkPkÎlfmmm&mŽmønBn”n°nÆnÒnÞoboâp˜qNqÂr8r„rÌsssPshs€t†tðu u6u�uôvPvÌvøw$wbw¦wúxDxPx\xhxtx€xŒxòy`yÔz6z”zòzþ{ {|{ì|D|’}2}Ð}Ü}è}ô~~~~j~Æ~Ò~Þ$jv‚Ô€(€h€|€î�`�l�x�€�–�¾‚‚h‚t‚€ƒƒ‚ƒŽƒšƒ¦ƒ²ƒ¾ƒÊƒÒƒè„„,„P„X„`„v„œ„ü……d…’…®…Ö…ò††t†Æ†Ø†ä‡‡&‡B‡f‡n‡v‡’‡à‡üˆ ˆ2ˆ>ˆZˆ€ˆœˆ°ˆÌˆòˆþ‰ ‰*‰V‰f‰v‰‚‰Ž‰èŠ@Š‚ŠŠŠâ‹b‹ÒŒ@ŒžŒü�d�ÊŽZŽæ�>���à�.�¦�®�º�Æ�Ò�Þ�ö‘‘(‘H‘`‘€‘œ‘đБܑò’’’4’N’b’ˆ’œ’Â’Ö’ð““(“>“V“j“‚“š“²“Î“è”” ”,”B”T”j”Š”¤”¸”Ò”æ• • •F•Z•t•–•¬•¾•ʕ֕â•î–––0–D–^–r–Œ– –º–Ζè——8—R—‚—”—ª—¼—Ò—ð—ü˜˜˜ ˜6˜B˜Z˜z˜†˜¦˜¼˜Î˜ä™™ ™™0™P™\™h™~™Š™ ™¼™È™È™È™È™È™È™È™È™È™È™È™È™È™Ò™Ü™æ™þšš&š:šFšRš^š~š¾› ›@›L›\œ&œ.œ6œNœhœtœˆœÆ���žž"ž.ž¬Ÿ8Ÿ¢Ÿ²  r ˜ ¾ ä¡ ¡\¡„¡¾¡Ö¢¢�¢Ô£^£ž£È£ò¤,¤J¤®¤º¤Æ¤Ö¤Ö¦¼§§§8§¨¨ ¨p¨´©4©†©²©üª6ª†ªÖ«:«r«®«Ú¬F¬®­­V­¢­ô® ®n®’®ú¯,¯H¯–¯ò°0°t°´±±r±Š±Ü²(²f²¢³³Š³à´R´Ê´Úµµ.µVµ‚µØ¶V¶š¶ú·b·–¸¸v¸¸¹¹~¹àº"º ºò»H»r»º¼¼š¼Ì¼þ½½,½T½d½Š½¼½Ö½ö¾0¾X¾t¾€¾¦¾Ö¾ð¿*¿P¿~¿š¿Ö¿öÀ$ÀPÀzÀ˜ÀÐÀòÁ Á:ÁpÁ¢Á²ÁÊÁÖÂÂ,Â`Š¢²ÂÈÂòÂþÃÃ@ÃZÎÚôÃÔÄÄÄ$ÄLÄvĂľÄÊÄàÄôÅ"Å.ÅHÅdÅ~Å´ÅâÅîÆÆ.ÆXÆdƎƚƲÆÐÆâÆüÇ$Ç0ÇHÇrÇ ÇÞÇþÈÈ&«q°0°EX°/± >Y°EX°/±>Y²9±° +X!ØôY01#3#53pÅÅÆÆÞÒúPÌPK °/° Ð01#73#73eaÅ5eaÅ úðþòúøF¢°ˆ° /°/°EX° /± >Y°EX°/± >Y°EX°/±>Y°EX°/±>Y°±° +X!ØôY°а°а ±° +X!ØôY° °а °а°а°а°а°Ð01###5!!5!3333#3##3#ÈÿP—PìDÿR—RÿR—RÇâDÛ÷P˜“ÿDÿšþfšŒ\Ž þ` þ`Žþ¤Œþf&\nÿ0�,T°EX° /± >Y°EX°"/±">Y²" 9°°а ° а ±° +X!ØôY°"°а"±*° +X!ØôY014&'&&546753#4&#"#5&&773326P€’Êν¦ž¨¹Ä~pvuyžÍÆÎ´�¬Ü¾›q�‘xY€2=̪¥ÐÝÞïɈ¨{kax6BÅ©¬ËÀ¿×Кƒ{hÿëƒÅ )7;v°8/°:/°EX°/± >Y°EX°&/±&>Y°° ° +XØÜY±° +X!ØôY°±° +X!ØôY°&°° +XØÜY°&±-° +X!ØôY°±4° +X!ØôY014632#"&53326554&#"4632#"&53326554&#"'h¤‰‰¤£ˆŠ¥’QLIPQJKP/¤‰ˆ¥¤‡Š¥’QLIPRIJQþmÇm˜®­€M¬¬JgfKMJiiJüÍ­­N€¬¬€KggKNJhhJ÷CrC@ÿëÐÅ!,9b°EX° /± >Y°EX°/±>Y°EX°/±>Y² 9°°а±"° +X!ØôY²0 9°0°&а ±7° +X!ØôY01467&&546326653#'#"$26776654&#"@�ŒNLëžÆigmT).°NJ¹åUPÂhÙþÿÚHŒ>þ—([;Ž66Š9)aNQXˆz·\c›R©·¶€b�KPþgAžX„àYßf¯&‰ËÊŠ&¯þÂOŠ.]tkþ(þ¥ þ¥þ(tl]-‹þ1d ° /°/01#'65'73þÁ®&‡ÍÓ�&®?FþuýÓ]liá] Vãnl]ýÒþv_W°° /°EX°/± >Y° ° Ð01%73%'DþØ1( ¡ %0þÒÁƒµ°„ÖYšoVþ¤nœYþò`þé]N’4¶ ° /°Ð° ±° +X!ØôY°Ð01!!#!5!3¥�þqÅþn’Ųþ5˲§0þþ;ݰ/°° +XØÜY01%#53;–uFÅ0þÎ<£# ´°/±° +X!ØôY01!5! þêš¡fʰEX°/±>Y±° +X!ØôY01!#53fÅÅÊÿƒ°°/°EX°/± >Y01#3¸¨`§}-qÿëÅ ;°EX° /± >Y°EX°/±>Y° ±° +X!ØôY°±° +X!ØôY01#"32'4&#"3265÷××úùÖ×ùʼn‚‚ˆŠ‚‚‡+þéþ×*Y+þÕþê*½¿¿½þU½ÁÀ¾º©°6°EX°/± >Y°EX°/±>Y°°° +XØÜY±° +X!ØôY01!#5%©ÅþÖïðŽ6\&ÅR°EX°/± >Y°EX°/±>Y±° +X!ØôY²9²9°± ° +X!ØôY°° а°Ð01!!56654&#"#'&32!&üPÝ€[i—�½æÄé�þ�¼‡�¨Xm•›Œ¼å±wï‰þ__ÿëûÅ*w°/°EX°/± >Y°EX°/±>Y²Ï]²q²¿q²ï]²]²/]°±° +X!ØôY°° а° а±#° +X!ØôY°±*° +X!ØôY0132654&#"#'&632#"$77332654&##„¬ƒm|ys‹½ùÉÊðmmƒmþûËÇþû¼�{}Ž~ˆ¬3ƒu}‚‡p¥ç×ÇZ³/+¸rÇä׸sˆˆ…‡€7R° J°/°EX° /± >Y°EX°/±>Y°±° +X!ØôY°а° а °Ð@ k{‹›]013##!53!'‰ÉÉÄýr‚Ðý€¼êšþ°Poñü:«2˜ÿë°Y°/°EX°/± >Y°EX°/±>Y°±° +X!ØôY°°а±° +X!ØôY°±° +X!ØôY°°Ð01!!6676#"&77332654&#"¯TÙýÎ0.qJÉçëá¹ö²‰m}ŠŒ{th‘¯þg"-þöáÛþöÊÄwƒ°™Œ´FH„ÿë7Å'Q°EX°/± >Y°EX°/±>Y°±° +X!ØôY²9°/±° +X!ØôY°±"° +X!ØôY012&&#"6632#""32654&£K“0*1kHœ¿@¥_Ãè÷ÎÖþè8¤eŽ%ª€y‡‘Å"—úÉ8?þòÏâþã6\ýoRDvÉÚ͘�ºM&° /°EX° /± >Y°EX°/±>Y° ± ° +X!ØôY°Ð01#7!5!&þø¹)Å*òÒüèÙþÆþþ§��X›fÿëÅ#/d°EX°/± >Y°EX° /± >Y²- 9°-/²Ï-]±° +X!ØôY²-9²-9° ±!° +X!ØôY°±'° +X!ØôY01#"$5467&&546324&#"3264&#"326ò€m~—þùÒÖþû”~m|íÃÀóœžy{™˜~{š)‡gi‚ƒjh„4r«*,¼{ÊÕÕÊ{¼,*«rÀÑÑüšxššx|�Žlމqo††SÿëÅ'N°EX° /± >Y°EX°/±>Y±° +X!ØôY² 9°/±° +X!ØôY° ±"° +X!ØôY01%2655#"5432#"&'726754&#"ÿ�­1“ZÓø¼äþãåMŸ?;rm‘ “�l˜�…Ú×BGIåÛþãþëþ¥þãþЗý^I~¿ÄÁ—–ºÿÿ¡f6&l°EX°/± >Y01ÿÿcþþn6'l3°EX°/± >Y01GWwá °/±° +X!ØôY²9015HUU/üÐ0/äÉ{•zɘ—ÚÛ&²+°±° +X!ØôY°±° +X!ØôY01!5!!5!Úü¾Bü¾B7¤ý¼¤ˆWàá °/±° +X!ØôY²90155%75'ˆXü¨VUUÃþ†•þ…Äî:vÅ?°EX°/± >Y°EX°/±>Y±° +X!ØôY²9°± ° +X!ØôY016676654&#"#'&632#53c0fcTqi[€¼é´ÅÚ�t6ÎΚ‘p\u~Yjrc`¡ÂÉ´�Öp6V[þfÐ`þ;Õ—3Ce°/°1/°+/°EX° /± >Y°EX°/±>Y° ±7° +X!ØôY°а1±° +X!ØôY°+±$° +X!ØôY°±A° +X!ØôY01#"&'#"&73233267! !267# ! 3267&67&&#"Ä ÞÝIj2�`}Šå¥i€K3 =3{”þÀþ°þÌþ‰P:Xµ>&CÏcþ„þaÌt{•ûû AJ@j,/9}„öÖþËSLPOñÄ946ý·nSã¯~«þ2þ�þˆþK+#k*/ó°§þ ýýŽ”1?  Û° b°EX°/± >Y°EX°/±>Y°EX°/±>Y²9°/´�Ÿ]±° +X!ØôY°° д; K ]¶{ ‹ › ]²i ]01!#3#!#ÉýžŠÉ3©*ÉýSêðwþ‰°úP—´¯° R°/°EX°/± >Y°EX°/±>Y²ï]°±° +X!ØôY°±° +X!ØôY°±° +X!ØôY013!2#!2654&#%!2654&#!´Ûä|e„—þýÞþ«U†–}‚þŽ?nŠ•Œþê°ÅÅa™%ʆÈÓ«ýï…z€’šylvuvÿë¿Å;°EX° /± >Y°EX°/±>Y° ±° +X!ØôY°±° +X!ØôY01#"32#4&#"3265¹þØó÷þÉ7÷÷$½´¤¥ÄÄ¥¤´ÒÍþì^  _þùÙ™²þöÅþûÇþö±œ´ë° ;°EX°/± >Y°EX°/±>Y°± ° +X!ØôY°± ° +X!ØôY013! !32554#´¿Zþ¦þâúúÊééʰþ¡þêÇþéþ£û… ÐÉÎ ´z° \° /°EX°/± >Y°EX°/±>Y²ï ]² ]²/ ]° ±° +X!ØôY°±° +X!ØôY°±° +X!ØôY01!!!!!!ýeü:»ý ›£ý÷š°›þ)´w° ˆ°/°EX°/± >Y°EX°/±>Y²]²Ï]²q²q´¿Ïq²?r²or²ïq²Ÿq²Oq´ïÿ]²¯]²_]²/]°±° +X!ØôY°±° +X!ØôY01!#!!!ýhÅÃý˜„ý|°›þ xÿëÓÅ W°EX° /± >Y°EX°/±>Y° °а ±° +X!ØôY°±° +X!ØôY² 9°/±° +X!ØôY01%# 32#&&#"3267!5!Ó4þÿÌþûþ«>ûú¼ ¯¥§Ìä°|ž"þÁÁP†N , Nö¤úÀþÒÂûB*K›´° ¤°/°EX°/± >Y°EX° /± >Y°EX°/±>Y°EX°/±>Y²]²Ï]²q²q´¿Ïq²r²or²¿r´�Ÿr²?r²ïq²Ÿq²Oq´ïÿ]²¯]²_]²/]°±° +X!ØôY01!#!#3!3Åý=ÅÅÃŃý}°ýn’¾„°°EX°/± >Y°EX°/±>Y01!#3„ÆÆ°=ÿëð)°EX°/± >Y°EX°/±>Y± ° +X!ØôY013#"&7733265þÅ÷ÅÒø½‰}mаûãÃåÕˇ…“{´ °‚°/°EX°/± >Y°EX°/± >Y°EX°/±>Y°EX°/±>Y²Ï]²q²¿q²?r²�r²ïq²Ÿq²ï]²]²/]°±° +X!ØôY² 901##333##ªÅŘ ÚýË^ë‘ýo°ý|„ýEý´*°)°EX°/± >Y°EX°/±>Y±° +X!ØôY01%!!3y±üŠÅšš°´R°€°EX°/± >Y°EX°/± >Y°EX°/±>Y°EX° /± >Y°EX°/±>Y° °д4D]¶sƒ“]°° Ð@ o  � Ÿ ]²O ]²\ ]´+ ; ]°Ð0133#'##°ÐÐüÅþ(ƒþ*ŰûaŸúP@PûoŽý³ýÀ°´° x°EX°/± >Y°EX° /± >Y°EX°/±>Y°EX°/±>Y°°вK]²\]@ k{‹›]²9]°°в6]@ DTdt„”]²T ]01!##373ÅýCÅŽÅfûœ°ûœbqÿëÅ ;°EX° /± >Y°EX°/±>Y° ±° +X!ØôY°±° +X!ØôY01!"3 '4#"3265þµþøÿþÁ?ÿKÅØ¶¬Íͬ·×Vþõþ `  bþŸþõÈÿÈþûÊÿÿ˴̰ B°EX°/± >Y°EX°/±>Y²9°/± ° +X!ØôY°±° +X!ØôY01#!2#%!2654&#!yÅ-éþþéþ˜h”’““þ˜Hý¸°ðÄÇ횟yy¢qÿ;Å!?°EX°/± >Y°EX° /± >Y±° +X!ØôY² 9°±° +X!ØôY01#"3 '4#"3265dZ÷‡þì8y@ÿþÁ?ÿKÅØ¶¬Íͬ·×VŽòTé�`  bþŸþõÈÿÈþûÊÿÿË´í¯#V°EX°/± >Y°EX°/±>Y°EX°/±>Y²9°/±° +X!ØôY² 9°±"° +X!ØôY01#!2#&&554&#%!2654&#!yÅïüupxi%Ë'Štþ’6§“�—þ¶wý‰¯ÔÊp¦1'¯�‰Dl""„F…v�›‚{‡aÿë’Å'Q°EX° /± >Y°EX°/±>Y² 9°±° +X!ØôY° ±° +X!ØôY°±%° +X!ØôY014&'&$54$32#4&#"#"$773326Í–¿çþýÞIž“�ª¿æðþàèÚþ±¼Î˜•®od‡.7Ö¢ªäþú­€ž…k_09Þ¤°ÖìÆŒ’~"ް/°EX°/± >Y°EX°/±>Y°±° +X!ØôY°Ð01!#!5!Žþ,Åþ-lú뛓ÿëܰ6°EX°/± >Y°EX°/± >Y°EX°/±>Y± ° +X!ØôY01#"$533265ÜþËùðþÕżš¢Ç°ü%îüýíÛü%¥««¥Ûù° D°EX°/± >Y°EX°/± >Y°EX°/±>Y°в$]@3CScsƒ“]01373#3d!!xÕýã©ýãÖjssFúP°6ϰ„°EX°/± >Y°EX° /± >Y°EX°/± >Y°EX° /± >Y°EX°/±>Y° °д$4]@ @P`p€�]°а°вŸ]@ \l|Œ]¶+;K]0173373#'##3Ø' ® (ÙÅþ¡°þáþܰþ¢Äø¶·¸üH»»¸úPòƒƒü°BÖ° a°EX°/± >Y°EX° /± >Y°EX°/±>Y°EX°/±>Y² 9²…]²“]°°д��]@ K[k{]013##3ŠTîþ2Øëþ£þ¢îØþ2ìx8ý.ý"Bý¾ÞÒΰT°EX°/± >Y°EX°/± >Y°EX°/±>Y²9²u]°°ж{‹›]°°ж{‹›]013#3q|áþÄþ áÌäüPþ £am° >°EX°/± >Y°EX°/±>Y±° +X!ØôY°а±° +X!ØôY° Ð01%!!5!5!?.ûô ýàšš’ƒ›��þÈ€'°/°/°±° +X!ØôY°±° +X!ØôY01#3!!¼¼þ�åù~›¸'ÿƒA°°/°EX°/± >Y013#'º`º°ùÓ þÈ�€$°/°/±° +X!ØôY°±° +X!ØôY01!!53# ‚þ~½½€øH›‚=Ù° °EX°/± >Y°Ð01#3#'#ô·+†*µ¦Ù×ý)£FFÿfŸ°EX°/±>Y±° +X!ØôY01!5!Ÿüe›ššR»êÅK°/²_]²¯]²q²oq²Oq²ÿ]²]²?]²]°° +XØÜY²¯]¶/]01#73êžúæ»jÿëóN +o°EX°/± >Y°EX°/±>Y°EX°/±>Y² 9° /´¿ Ï ]°±° +X!ØôY² 9°±!° +X!ØôY° ±&° +X!ØôY01!&&'#"&5463354&#"#'&632%2675#"( 7±f©±û×Ötj_w¼뺸à ýîk¬Ýw�Z1K&Ni­˜›¯k_oaDvÄ»°ý÷:l4�nG°xQHT�ÿë+P° /°EX°/± >Y°EX°/±>Y°EX°/±>Y²/ ]°±° +X!ØôY°±° +X!ØôY01#"&'#36632#4&#"3265+áÅkž4¡Å3—eÈàʼnŒ[}%&{^‹ˆôêþáSQ�ý¢HLþÀþûºëYKþ+PZÆ£aÿëöN8°EX°/± >Y°EX°/±>Y±° +X!ØôY°±° +X!ØôY01%2653#"55432#4&#"Gb•±þý¬ìúûë¾ñ²Œk›…„…yXŒÙ4é*ç5à£c‹ß¢*¦ÝbÿëõP°/°EX°/± >Y°EX°/±>Y°EX° /± >Y²/]°±° +X!ØôY°±° +X!ØôY01323#'#"533267&&#"bßÉ_“4Å¡5šfÆàņ�Xx&&yUއ @FCSùè…LNê¤ÅPHùCOê»cÿëíN`°EX°/± >Y°EX°/±>Y² 9° /´Ð à ]²  ]°±° +X!ØôY°±° +X!ØôY° ±° +X!ØôY01"55432!3267"!54&Pâþõ¼ÛàýB˜‰d—7M:¾¥cŒó|-ð,ç3þøÜ{œÉ92€9Lȧ~tœ8É-Y°/°EX°/± >Y°EX°/± >Y°EX°/±>Y°±° +X!ØôY²/]°±° +X!ØôY°°аÐ013#5354632&&#"3#á©©µ¢"E*3VTáᨒ‰­½ –gb‰’üXdþKýN+d°EX°/± >Y°EX°/± >Y°EX° /± >Y°EX°/±>Y° ±° +X!ØôY°±!° +X!ØôY°±(° +X!ØôY013273#"&'732655#"533267&&#"däÉgœ4�òäNµE25–I�ƒ5”`ÇäÅŠ�Yx'&zV�Œ @SN�ûÀÐß+%™%ƒ†zDE 飯QJòEQì¹�A°/°EX°/± >Y°EX°/±>Y°EX°/±>Y°± ° +X!ØôY²/]016632#4&#"#3T8£c­ÁÅsrR…+ÅÅ©NWÐØýZ¨†€MBüáŸd6°EX°/± >Y°EX°/±>Y°°° +XØÜY±° +X!ØôY01!#3#53dÅÅÅÅ:Éÿ¾þKrL°EX°/± >Y°EX°/±>Y± ° +X!ØôY°°° +XØÜY²€q² ]±° +X!ØôY01#"&'73265#53r¬™34AM¿ÅÅ:ûm§µ ›Xc“Å� W°/°/°EX° /± >Y°EX°/±>Y°EX° /± >Y²ï]´¯¿]²_]°±° +X!ØôY² 901##333#Õ€ÅÅ~(ìþާèóþ üxªþý²Ÿd°/°EX°/±>Y²/]01!#3dÅÅ�oN#o°EX°/± >Y°EX° /± >Y°EX°#/±# >Y°EX°/±>Y°EX°/±>Y°EX°!/±!>Y° ±° +X!ØôY°±° +X!ØôY0166326632#4&#"#4&#"#?5£ll›'3¨p¥ÀÅnme} ÆqjZtÅ:ŽMUdd\lãäýy‰ …ŒkýQ‰˜�JCüß:�ýNF°EX°/± >Y°EX°/± >Y°EX°/±>Y°EX°/±>Y°± ° +X!ØôY016632#4&#"#?6£h¯ÀÅqtUƒ'Å:¡V_ÍÖýU§�xRGüë:aÿë*N 8°EX°/± >Y°EX° /± >Y±° +X!ØôY°±° +X!ØôY01432#"53326554&#"aßáþüààþûÅ‘��’“Ž�‘'ð7þÊñòþÌ5ñ¬àପââª�þ`)NU°EX°/± >Y°EX° /± >Y°EX°/±>Y°EX°/±>Y°±° +X!ØôY°±° +X!ØôY01#"&'#36632#4&#"3265)àÅd—5Å—5žiÉßÅ‘�Ux%%xWŒ�ôêþáCCýïÚŒNRþÁþú¸íMCýõCKÍ¢bþ`êNR°EX°/± >Y°EX°/± >Y°EX° /± >Y°EX°/±>Y±° +X!ØôY°±° +X!ØôY013273##"533267&&#"bßÉc–4–Å4Ž[ÆàŇŒQs''sO�ˆ @KHú&=>ê¤ËHA"=Fï»�ªN>°EX°/± >Y°EX° /± >Y°EX°/±>Y° °° +XØÜY´�Ÿ]01'"#36632�eNkŰ.‡X( ŒJCüû:žT^gÿëÉN'~°EX° /± >Y°EX°/±>Y² 9´)9]¶¹ÉÙ]°±° +X!ØôY° °в]² ]° ±° +X!ØôY°°"д""]°±%° +X!ØôY014&'&&54632#4&#"#"&773326cŠÅÇഽ߼wbifZŠÍÈé¼Ïî¼’biwAT+“„ºÂ‹Gq\A@J,—�²ÒŒiaU"ÿëj?Q°EX°/± >Y°EX°/± >Y°EX°/±>Y°±° +X!ØôY°±° +X!ØôY°°аÐ013#3267#"&5#53“ÍÍ?4)U+xެ¬?þû’ýoL>‡‘›‘’‹ÿëü:F°EX°/± >Y°EX°/± >Y°EX°/±>Y°EX°/±>Y°± ° +X!ØôY01%#"&5332673#>3 i±ÆÅfli‰#ű W^âï~ý€­‚UN ûÆ.ä: ;°EX°/± >Y°EX°/± >Y°EX°/±>Y°Ð@ Tdt„”]01373#3øùÉþr•þmÊ?LLûûÆ:-Ü:ƒ°EX°/± >Y°EX° /± >Y°EX°/± >Y°EX° /± >Y°EX°/±>Y°Ð@ DTdt„”]° °Ð@ DTdt„”]°°Ð@ K[k{‹›]01373373#'#3¤ØžÙªÄþÆŸÑ-+ΟþÆÄŠƒƒ°ýP’’°ûÆ“¸·ým:.Ô: S°EX°/± >Y°EX° /± >Y°EX°/±>Y°EX°/±>Y² 9²•]°°в{]²š]013##3þææþ¡iâððäiþ¡ã«�ýéýÝ™þg#þKè:R°EX°/± >Y°EX°/± >Y°EX°/±>Y²9°°Ð@ dt„”]°±° +X!ØôY0133#"&'7&326773Ú# Ûþ9)™‚JS ?P/þnÜ‘ˆ1û m¢ ›pDq$^º: >°EX°/± >Y°EX°/±>Y±° +X!ØôY°а±° +X!ØôY° Ð01%!!5!5!Iqü¤Iý¾3ššŠœ†?þ”Ÿ=°/°/°/°±° +X!ØôY01&&554�wägjjg¤Ã(n\UUUU\nþ”7ðªÍp}“{qΫï7u#µ„Îi -.¡gÍ„³$¯þòM°°/°EX°/± >Y01#3Mžžþò¾þ”v=°/°/°/±° +X!ØôY016655467&&554&'73"m^Z^^Z^m)Â¥elle¥Âö$³„Ík +) m΄µ#u7ï«Îq{“}pͪð7€‘ð#7°/°° +XØÜY±° +X!ØôY°± ° +X!ØôY°° а°Ð01#"&'&&#"'46323265ð®‚Z“U;b2C_�«„X–U:`4Baä‰ÊBJ00jKˆÁEF3.rM�þŠU:&°/°EX°/± >Y±° +X!ØôY²901#3#53UÅÅÅÅþŠÒÎkÿ &#D°EX°/± >Y°EX°/±>Y±° +X!ØôY°° а°а±° +X!ØôY01%2653#5&554753#4&#"Qb•²ʒƶ½¾µÆ�¿³Œk›…„…yXzÊèì$$É*Ç#&äßÕ�c‹ß¢*¦ÝFWÅ"a° /°EX°/± >Y°EX°/±>Y² ]° ±° +X!ØôY°±° +X!ØôY° а° а °а±° +X!ØôY01!!53665'#534632#4&#"!®ßü0 00¤ž à¼Èܾ~bct ¢g•Z£;šš Äg•›ÌéѬvr•…þò›hÿåZñ#/.°/°EX°/±>Y±'° +X!ØôY°±-° +X!ØôY01%#"&''7&&5467'7663273254#"IM¹ee¹K‚‹Š2596’‹�J²`a²K’Œ–4950ŽŒüsñ¬ªññª¬ñl>BA=„ŠŒLµcf¼N•‹’7=>8•Œ™N¹eb³L�‹{¼þ÷ ¼ºþø¯°m°EX°/± >Y°EX°/± >Y°EX° /± >Y²+² 9´]°°а±° +X!ØôY°а°а±° +X!ØôY° Ð013!!!!#!5!5!5!3ghàþ^8þ�þ�Åþ‰wþ‰7þ]â—ý2›‡›þÛ%›‡›Î‘þòV°#°/°/°EX°/± >Y°°° +XØÜY013#3‘ÅÅÅþòüèÈöZþ|Å3E[° /°1/°/°EX°#/±# >Y°±=° +X!ØôY°а ±° +X!ØôY°1±4° +X!ØôY°а#±+° +X!ØôY01#"$?32654&'&&5467&&54$32#4&#"%&&'6654&|`WEFþöáÝþÒ¼Á‡‰��Ìïâ^WDD à鼞Œ‘–†Óôßýß/S$IIˆÒ8J!HP“¯^Œ(3ˆb¬ÃÍÜ�‡w[[e??º±[�)2‹a¦ÉßÊvžw[cc:EµS dEdg; cE[kªè[°%°/²?]²¿]°а±° +X!ØôY°Ð01#53#53[ÛÛþ*ÛÛèÈÈÈXÿëãÄ)5t° /°/°/°EX°-/±- >Y°EX°3/±3>Y´]² ]° ±° +X!ØôY°±° +X!ØôY°°а3±!° +X!ØôY°-±'° +X!ØôY01#"&554632#4&#"3265%32#"! ! W°� ¼¼ �±’[[^ff^[Zý WöõXþ¨õöþ©yž('žþaþÚþØþbT—�Õ®w­Öž•_W�rxuŒVb…þ÷þ”l jþ–þù;°þPþÅþÄþN²x´Å +u°/° /°EX°/± >Y²]²¯]² ]°°Ð´Ï ß q²ÿ q² ]² ]°±° +X!ØôY² 9°±!° +X!ØôY° ±&° +X!ØôY01&&'#"&5463354&#"''&632%2675#"e !qMw‚©¡‹<:CI¢©Œ†œ þˆ3mŠKS:Â0/>zjnx4?D61 b‚ކþÆ2X+}<#nB.-0ÿÿbvk“&CöÞCDÿÞwÂ"°/±° +X!ØôY01#!5!ÂÆýƒCw¥ÿÿ# ´XÿëãÄ 2;€°/°/°3/°EX°/± >Y°EX° /± >Y±° +X!ØôY°±° +X!ØôY²°3]²3]°3±° +X!ØôY²]²]²"39°°+а±:° +X!ØôY01! ! 32#"#!2#&&554&#'36654&##Xž('žþaþÚþØþbyWöôXþ©õöþ©¼•˜­B?B; ™ CMŸ˜A[ObƒÙ;°þPþÅþÄþN²<þöþ•l iþ—þ­þ®Rƒ~>^jK8)AQ*6HD‚?8I;{L°°/°° +XØÜY´¯¿]01!5!Lý/Ñ’€¿}Å 5°EX°/± >Y° ° +XØÜY±° +X!ØôY°±° +X!ØôY014632#"&732654&#"€˜ig•”hj—ƒI54GH35IÀj››jl••l7HH77KKc÷ó D°/°EX° /± >Y°±° +X!ØôY° ±° +X!ØôY²9°°а° Ð01!!#!5!3!5!‘fþš±þƒ}±:ü½CXšþc�š›û›q›ÊÇE°EX°/± >Y°° +XØÜY²9°± ° +X!ØôY°°а±° +X!ØôY01!56654&#"#'&632!Êý°.E,9:CI¡¨�‡˜Yt™i›‚@2cŒ€tPpi‡j�äÆ*x°*/°EX°/± >Y±° +X!ØôY²*]´o**]²�*q²ÿ*q²*q²/*]²?*r²p*r°*±)° +X!ØôY²*)9°°° +XØÜY±"° +X!ØôY012654&#"#'&632#"&77332654&##5¨CAIE8E¢©~‘¨G>FL´’µ£K?HTII„q94+:0(^wwn7[`Do|to.9;0>9~ƒ»$ÅK°/²?]²]²ÿ]²oq²q²¯]²_]²]²Oq°° +XØÜY²¯]¶/]013#<æþò“Åþü™þ`ò:S°EX°/± >Y°EX°/± >Y°EX°/±>Y°EX°/±>Y°EX° /± >Y°±° +X!ØôY0132673#'#"&'#]odby ű ,SHm(Ä:ý~²�HF'ûÆl?B!#þ1Ú?D° °EX°/± >Y°EX°/±>Y01!#"543!TéþýéÑÏúP¡pgD°/°° +XØÜY01#53gÆÆpÔwþM¯'°EX°/±>Y°° +XØÜY°°° +XØÜY01!#'2654&'7$ AVž“HXHW 4 RP`rm110&‡_™ŒÅ1°EX°/± >Y°° +XØÜY°°° +XØÜY°° +XØÜY01##5%Œ®-™�†x³+Å g°EX°/± >Y° ° +XØÜY²Ð ]²� ]²ß q²/ r²_ r² r²¿ ]²� r² ]² ]±° +X!ØôY°±° +X!ØôY014632#"&53326554&#"x¼�ž¼»�ž½­XVSYZTTXv”»»”u•¹¹•XijWuTkkTÿÿn˜ƒµ&DDpÿÿ¸âÄ'®Y˜'Fªº °EX°/± >Y°EX°/±>Y°Ð01ÿÿ¸õÄ'F%'®Y˜¬+°EX° /± >Y°EX° /± >Y01ÿÿzŸÇ'FÏ'ªw«› °EX°"/±" >Y°EX° /± >Y°Ð01rþv­;5°/°EX°/± >Y±° +X!ØôY²9°± ° +X!ØôY0132653#"&54676653#…0edSpjZ�¼é³ÆÙŒu5ÎΠ’p[v~Wjrc`¡ÂÉ´Õr5V\›Ñÿÿ"&$C(]°EX°/±>Y²]01ÿÿ&$vâY°EX° /± >Y² ]01ÿÿH&$R¹]°EX°/±>Y01ÿÿT&$Xµa°EX°/±>Y01ÿÿ &$j•]°EX°/±>Y°EX° /± >Y01ÿÿŒ&$VDªI²°r²/]²]²]²r²pr²Pr²pr²/]²]²]²°r²Pr²r01ÿìa°Õ° /°EX°/± >Y°EX°/±>Y°EX°/±>Y²9°/@ �Ÿ¯¿]²q²_]¶O_oq°±° +X!ØôY²ï ]²/ ]° ± ° +X!ØôY°±° +X!ØôY°±° +X!ØôY²^q²|q°°в|q²Lq²]²^q¶L\l]²Œ]´*:]01!!!#!!!!!!'aü�ýÓÊðpÇýMNý¸Áú¬¿^þ¢°›þ.›ýòwÆÿÿvþE¿Å&&zÎÿøÿÿ´z"&(CÝ]°EX°/±>Y²]01ÿÿ´z&(v—Y°EX° /± >Y² ]01ÿÿ´zH&(R—]°EX°/±>Y01ÿÿ´z &(jr]°EX°/±>Y°EX° /± >Y01ÿÿÿÞ„"&,CÿŒ]°EX°/±>Y²]01ÿÿ¾h&,vDY°EX°/±>Y²]01ÿÿÿñWH&,RÿF]°EX°/±>Y01ÿÿÿË| &,jÿ!]°EX°/±>Y°EX°/±>Y01* ° t°/°EX°/± >Y°EX°/±>Y²Ï]²q²¿q²ï]²]²/]°±° +X!ØôY°а±° +X!ØôY°±° +X!ØôY°°Ð013#53! !!32554##!Ò¨¨¿Zþ¦þâþìúÊééÊú—›~þ¡þêÇþéþ£—þ ÐÉÎ þÿÿ´T&1Xöa°EX°/±>Y01ÿÿqÿë7&2C#r°EX° /± >Y² ]01ÿÿqÿë3&2vÝn°EX°/±>Y²]01ÿÿqÿë]&2RÝr°EX° /± >Y01ÿÿqÿëi&2XØv°EX°%/±%>Y01ÿÿqÿë"&2j¸r°EX° /± >Y°Ð01Xááy °/°а° ° +XØÜY° Ð017XGþ¹~FG~þ¸H~þ¹þº_NN~þ³M~þ²þ²~Lþ´qÿ¢í%1R°EX°/± >Y°EX°/±>Y±.° +X!ØôY°±"° +X!ØôY²."9²*".9°*°а°+Ð01!"&'#7&&53273&&#"!4&''3265þµþøU—@[•‹TY?ÿ^©HQ•„MUü4&# 2|H¬Í!ýã,j>·×Vþõþ )(šêTìŠ b3.‰ÝTâ�þýU’4”),ÿÈK†2üq""ÿËÿÿ“ÿëÜ"&8C"]°EX°/±>Y²]01ÿÿ“ÿëÜ&8vÜY°EX°/±>Y²]01ÿÿ“ÿëÜH&8RÜ]°EX°/±>Y01ÿÿ“ÿëÜ &8j·]°EX°/±>Y°EX°/±>Y01ÿÿÎ&<v”X°EX° /± >Y² ]01£a° A°/° /°EX°/± >Y°EX° /± >Y°± ° +X!ØôY° ±° +X!ØôY01!2#!#!2654&#h èþüèþóÅÅ ““““°þÛì½¾ëþǰþAýâœqrŸ‰ÿëp'>°/°EX°/±>Y°EX°/±>Y°±° +X!ØôY°±$° +X!ØôY01!#4632#"&'73265454654&#"MÄë·¡Ê�[ѲT±%,+‚=lfþ¥�fBh€:ßú¬§vÜ9Rþä‹§ª)Ÿ0_NT’PÝL]l§˜ÿÿjÿëóà&DC”²¿,q01ÿÿjÿëóÜ&DvN²¿/q¶ß/ï/ÿ/q¶////r01ÿÿjÿëó&DRN¶Ð0à0ð0q´00r²`0r²@0r01ÿÿjÿëó&DXI"´`/p/r@ �/ /°/À/Ð/q²@/r² /r01ÿÿjÿëóË&Dj)/²ð-q´--r²`-r²@-r²ð0q´00r²`0r²@0r01ÿÿjÿëóJ&DVÕh‘²€5]²À5]²5q²p5q²5r²5]²P5r¶�5 5°5q²P5q´à5ð5]² 5]²`5]²5]²€;]²À;]²;q²p;q²;r²;]²P;r¶�; ;°;q²P;q´à;ð;]² ;]²`;]²;]01:ÿë|N.9B™°EX°/± >Y°EX°/± >Y°EX°/±>Y°EX°/±>Y²#9°#/´Ð#à#]² #]±?° +X!ØôY° а±° +X!ØôY² 9°±(° +X!ØôY°/а#°3а±:° +X!ØôY01"&'#"&5463354&#"''&6326632!3267%2675#""!54&îˆÐB8ß ª¹æÜågbgz¼å¿r¯2@¯eÖçý;�›g…NC5¼üJL¦+ãx‡d\qŠ üxaZOl®—ž­UjynNеQMKSþüäwŸÆ73Š,NšW9ØpQJ].©…zšÿÿaþEöN&FzAÿøÿÿcÿëíá&HC—²À q01ÿÿcÿëíÝ&HvQ²¿#q¶ß#ï#ÿ#q²#r01ÿÿcÿëí&HRQ%²°"q@ À$Ð$à$ð$q´$$r²`$r²@$r01ÿÿcÿëíÌ&Hj,=²`!r´°!À!q²@!r²ð!q´!!r²`$r´°$À$q²@$r²ð$q´$$r01ÿÿÿ¹^Ë&óCÿg%²¿q¶ßïÿq@/?O_or01ÿÿ™CÇ&óv%²¿q¶ßïÿq@/?O_or01ÿÿÿÌ2ñ&óRÿ!²/r²?r²r²_r01ÿÿÿ¦W¶&ójþü3²r´ßïq²_r´/?r²r´ßïq²_r´/?r01Hÿë0í -1°/° /°EX°/±>Y±!° +X!ØôY° ±(° +X!ØôY01#"54327&&''%&&'772655&&#"i_hþà×ÚþéÕZŸ4 UDþÞM'S,Y°EX°/±>Y±.° +X!ØôY°±"° +X!ØôY²+."9°+°в".9°°)Ð0143273#"&'#7&&533&&#"!4&'#3265aß8g.J�hX^þüà3\*H�d`gÅ()LC%�‘?# þ¹8!�’'ð7•ÓJè�òþÌ“ÌGð•[—0¢âªP�/ýi à¬ÿÿ‹ÿëüË&XC­%²¿q¶ßïÿq@/?O_or01ÿÿ‹ÿëüÇ&Xvg%²¿q¶ßïÿq@/?O_or01ÿÿ‹ÿëüñ&XRg²/r²?r²r²_r01ÿÿ‹ÿëü¶&XjB3²r´ßïq²_r´/?r²r´ßïq²_r´/?r01ÿÿþKèÇ&\v%%²¿q¶ßïÿq@/?O_or01™þ`3P° /°EX°/± >Y°EX°/±>Y°EX°/±>Y²/ ]°±° +X!ØôY°±° +X!ØôY01#"&'#36632#4&#"32653àÅd—5ÅÅ5–bÉßÅ‘�Ux%%xWŒ�ôêþáCCýï¸ýªDHþÁþú¸íMCýõCKÍ¢ÿÿþKè¶&\j3²r´ßïq²_r´/?r²r´ßïq²_r´/?r01ÿÿú&$q´J° /01ÿÿjÿëó¸&DqMÿÿN&$Tëž°EX°/±>Y01ÿÿjÿëó &DT\6²0q²°0q²0r²�0q² 0r´Ð0à0q²�0q¶`0p0€0]² 0]01ÿÿþPQ°&$W~ÿÿjþP*N&DWWÿÿvÿë¿3&&vÉn°EX°/±>Y²]01ÿÿaÿëöÜ&Fv<²¿!q¶ß!ï!ÿ!q¶!!/!r01ÿÿvÿë¿]&&RÉr°EX°"/±">Y01ÿÿaÿëö&FR<¶Ð"à"ð"q´""r²`"r²@"r01ÿÿvÿë¿"&&U™r°EX°/±>Y01ÿÿaÿëöË&FU ²¿]²ß]²¯q²�q01ÿÿvÿë¿^&&Sàs°EX°#/±#>Y01ÿÿaÿëö&FSS"@ °#À#Ð#à#ð#q´##r²`#r²@#r01ÿÿ´ëI&'S¦^°EX°/±>Y01ÿÿbÿë&GcÝ%5°$/²€$r²$]²/$q²¿$r²?$r´O$_$]²`$]²ð$q²p$q01* ° t°/°EX°/± >Y°EX°/±>Y²Ï]²q²¿q²ï]²]²/]°±° +X!ØôY°а±° +X!ØôY°±° +X!ØôY°°Ð013#53! !!32554##!Ò¨¨¿Zþ¦þâþìúÊééÊú—›~þ¡þêÇþéþ£—þ ÐÉÎ þbÿëº'°/°/°EX°/± >Y°EX°/±>Y°EX°/±>Y²_]²/]²]°±° +X!ØôY²0]°а°в/]°±° +X!ØôY°±$° +X!ØôY01##'#"5532#535333267&&#"ºÅ¡5šfÆàßÉ_“4÷÷ÅÅüm†�Xx&&yUއÏû1…LNê@FC ›®®üФÅPHùCOê»ÿÿ´zú&(q–J² ]01ÿÿcÿëí¹&HqP ÿÿ´zN&(TÈž°EX°/±>Y01ÿÿcÿëí &HT‚]1²�$q´Ð$à$q² $r² $]²$r²°$q²$q¶`$p$€$]01ÿÿ´z &(Ug]°EX° /± >Y01ÿÿcÿëíÌ&HU!²¿ ]²¯!q²ß!]²�!q´°!À!q01ÿÿ´þPz°&(WKÿÿcþŽíN&HWì>ÿÿ´zI&(S®^°EX°/±>Y01ÿÿcÿëí&HSh"@ °%À%Ð%à%ð%q´%%r²`%r²@%r01ÿÿxÿëÓ]&*R¿r°EX°#/±#>Y01ÿÿdþKý&JRW¶Ð0à0ð0q´00r²`0r²@0r01ÿÿxÿëÓc&*Tð³°EX°%/±%>Y01ÿÿdþKý &JTˆ\6²0q²°0q²0r²�0q² 0r´Ð0à0q²�0q¶`0p0€0]² 0]01ÿÿxÿëÓ"&*U�r°EX°"/±">Y01ÿÿdþKýË&JU'²¿,]²ß-]²¯-q²�-q01ÿÿxþÓÅ&*c¤þ˜ÿÿdþKýp&J�+Y²`0]²0]²/0]² 0]²€0]01ÿÿ´H&+Rô]°EX°/±>Y01ÿÿ�G&KR \F´�Ÿ]²ï]´_oq²ßq²r´/?r²¯q´q²¿]´O_]´/]01�°u°/°/°EX°/± >Y°EX°/± >Y°EX°/±>Y°EX°/±>Y²]°°Ð°±° +X!ØôY°а±° +X!ØôY°° а° Ð013##!##533!3!5!ÿ��Åý=Å““ÅÃÅüxÃý=‘‘üƒý}‘þáýnâs°/°/°EX°/± >Y°EX° /± >Y°EX°/±>Y²_]²/]²]°±° +X!ØôY²0]°±° +X!ØôY°°а°в/]01!6632#4&#"##5353!‚þð8£c­ÁÅsrR…+Ŭ¬ÅÏþÚNWÐØýZ¨†€MBüáÏ›®®ÿÿÿÈ~T&,XÿAa°EX°/±>Y01ÿÿÿ£Yý&óXÿ ²_r²�q²?r´ïÿq´r01ÿÿÿÀ‘ú&,qÿEJ²]01ÿÿÿ›l¥&óqÿ ÿõÿÿÿøON&,Tÿwž°EX°/±>Y01ÿÿÿÓ*÷&óTÿRG ²ÿq¶?O_]²r²Ïq²¯q01ÿÿ.þP½°&,WêÿÿþP�&LWÊÿÿ´Ž &,U]°EX°/±>Y01™^:°EX°/± >Y°EX°/±>Y01!#3^ÅÅ:ÿÿ¾ÿë°&,-CÿÿŸþKv&LMÿÿ=ÿëŒ<&-R{Q°EX°/±>Y01ÿÿÿ¼þKDß&PRÿ3ÿô´/?r²r²_r01ÿÿ´þ# °&.c‚þ©ÿÿ�þ%&Ncþ«™@:ް/°EX°/± >Y°EX°/± >Y°EX°/±>Y°EX°/±>Y´¿Ï]²/q²Ÿq²ÿq²or²ßr²?r²Ïq²oq²ÿ]²_]²/]°±° +X!ØôY² 901##333#ÃeÅÅT„çþ>ãñËþ5:þ7ÉýþýÒÿÿ´*&/v7Y°EX°/±>Y²]01ÿÿŸID&Ov%G°/°ܲÿr²r²Ÿq²O]¶Ïßï]´/?r²/q´�Ÿ]´/]´ßïq01ÿÿ´þ%*°&/c{þ«ÿÿnþ%d&Oc þ«ÿÿ´*±&/câ¾°EX° /± >Y01ÿÿŸ &Oc`%7°/²€r´/]²/q²¿r²?r´O_]²`]²ðq²pq01ÿÿ´*°&/UÅýɰ/01ÿÿŸ¿&OUEý¸°/01(° Y°/°EX° /± >Y°EX°/±>Y°°а±° +X!ØôY°а±° +X!ØôY°°а а° а Ð01%!!573h þó±üŠ{{ÅKV¦Výõšg'¦'£% E° /°/°EX°/±>Y°°а±° +X!ØôY°а°аа° ав/ ]017#573x––ÅŽŽÅh:¥:ý=x6¥6ûÿÿ´&1vûY°EX° /± >Y² ]01ÿÿ�ýÜ&Qve²¿q¶ßïÿq¶/r01ÿÿ´þ%°&1cßþ«ÿÿ�þ%ýN&QcIþ«ÿÿ´I&1S^°EX°/±>Y01ÿÿ�ý&QS|"@ °ÀÐàðq´r²`r²@r01ÿÿÿàý&Qcÿ{%°/01¡þKî°X°EX°/± >Y°EX°/± >Y°EX°/±>Y°EX°/±>Y°± ° +X!ØôY°°а°а°Ð01#"&'732655#374 DY°EX°/± >Y°EX° /± >Y°EX°/±>Y° ±° +X!ØôY°±° +X!ØôY016632#"&'732654&#"#? 6 e®À¬š5 C=DrtU{&Å:–QYÍÖüü§µ  ^X�xB;üÏ:ÿÿqÿë&2qÜ_+´€�q¶0@Pr²`]¶Ðàðq² q²À]01ÿÿaÿë*¸&Rqhÿÿqÿëc&2T³°EX° /± >Y01ÿÿaÿë* &RTš\6² q²° q² r²� q² r´Ð à q²� q¶` p € ]² ]01ÿÿqÿë`&2Yjr°EX°&/±&>Y°EX° /± >Y01ÿÿaÿë@ &RYö)´àðq@  0r´à%ð%q@ %% %0%r01hÿëOÅ%”°/°EX° /± >Y°EX°/± >Y°EX°/±>Y°EX°/±>Y°±° +X!ØôY²]²/]²ï]°±° +X!ØôY°±° +X!ØôY°±° +X!ØôY° ±° +X!ØôY01!!#"32!!!!!267&&#"Oüj\‚CùþÉ5ùE�O‹ý ›ýeûI=z:=z<©À L 0 L ›þ)›ý÷  ãÕþÎÖäaÿë÷N"09˜°EX° /± >Y°EX°/± >Y°EX°/±>Y°EX°/±>Y²9°/² ]´Ðà]°±° +X!ØôY°±&° +X!ØôY° ±-° +X!ØôY°±1° +X!ØôY°±6° +X!ØôY01"&'#"554326632!3267326554&#""!54&ZƒËA@Æàþûß‚È@AÁlÛàýB˜‰d—7M:¾ûE‘��’“Ž�‘cŒó|i``i5ñð7mbanþøÜ{œÉ92€9L&¬àପâ⪌§~tœÿÿ´í&5v�Y°EX°$/±$>Y²$]01ÿÿ�äÜ&UvÀ²¿q¶ßïÿq¶/r01ÿÿ´þ%í¯&5csþ«ÿÿkþ%ªN&Ucþ«ÿÿ´íI&5S¦^°EX°(/±(>Y01ÿÿeÛ&USÙ"@ °ÀÐàðq´r²`r²@r01ÿÿaÿë’3&6vˆn°EX°(/±(>Y²(]01ÿÿgÿëÉÜ&Vv:²¿+q¶ß+ï+ÿ+q¶++/+r01ÿÿaÿë’]&6Rˆr°EX°,/±,>Y01ÿÿgÿëÉ&VR:¶Ð,à,ð,q´,,r²`,r²@,r01ÿÿaþE’Å&6z�ÿøÿÿgþFÉN&Vz?ÿùÿÿaÿë’^&6SŸs°EX°-/±->Y01ÿÿgÿëÉ&VSQ"@ °-À-Ð-à-ð-q´--r²`-r²@-r01ÿÿ"þ%ް&7cbþ«²` ]01ÿÿ"þj?&WcÏþ¡ÿÿ"ŽH&7S•]°EX° /± >Y01ÿÿ"ÿëü3&Wc¼@°/²]²_]01"ްJ°/°EX° /± >Y°EX°/±>Y°±° +X!ØôY°а°а ±° +X!ØôY° Ð01###53!5!!3–ÜÅààþ-lþ,Ü4üÌ4›F››þºÿøÿëy?~°/°EX°/± >Y°EX°/± >Y°EX°/±>Y°±° +X!ØôY²`]²]²À]°±° +X!ØôY°± ° +X!ØôY°°а°а°аÐ013#3#3267#"&5#535#53“ÍÍææ?4)U+xŽÖÖ¬¬?þû’µ›þ¿L>‡‘›A›µ’ÿÿ“ÿëÜT&8X×a°EX°/±>Y01ÿÿ‹ÿëüý&XXb ²_r²�q²?r´ïÿq´r01ÿÿ“ÿëÜú&8qÛJ²]01ÿÿ‹ÿëü¥&Xqfõÿÿ“ÿëÜN&8T ž°EX°/±>Y01ÿÿ‹ÿëü÷&XT˜G3²�q²Ïq²r¶?O_]²ÿq²¯q¶`p€]²q01ÿÿ“ÿëÜŒ&8VcªI²°r²/]²]²]²r²pr²Pr²p!r²/!]²!]²!]²°!r²P!r²!r01ÿÿ‹ÿëü5&XVîSƒ² ]´àð]²r´/?]²�q²]²oq²Pr²q²À]²€]²`]² #]´à#ð#]²#r´/#?#]²�#q²#]²o#q²P#r²#q²À#]²€#]²`#]01ÿÿ“ÿëÜK&8Yi]°EX°/±>Y°EX°/±>Y01ÿÿ‹ÿë>ô&XYô ²ßq²ßq01ÿÿ“þPܰ&8W©ÿÿ‹þP2:&XW_ÿÿ6ÏH&:R¥]°EX°/±>Y01ÿÿ-Üñ&ZR(´/?r²r²_r01ÿÿÎG&<R”\°EX° /± >Y01ÿÿþKèñ&\R%´/?r²r²_r01ÿÿÎ &<jo\°EX° /± >Y°EX° /± >Y01ÿÿam&=v„Y°EX° /± >Y² ]01ÿÿ^ºÇ&]v/%²¿ q¶ß ï ÿ q@  / ? O _ o  r01ÿÿam &=UT]°EX° /± >Y01ÿÿ^º¶&]Uÿ4²¿ ]¶ß ï ÿ q@  / ? O _ o  r²ß ]²¯ q²� q01ÿÿamI&=S›^°EX°/±>Y01ÿÿ^ºò&]SF´/?r²r²_r01Ÿ‡-"°/°EX°/±>Y°± ° +X!ØôY0134632&&#"Ÿ¶¢!E*,W[í½ ‘mbû=ÿéþKÀ-#e°/°EX°/± >Y°EX°"/±" >Y°EX°/±>Y°"±° +X!ØôY°± ° +X!ØôY°°в/]°±° +X!ØôY01##"&'73265#5354632&&#"3aÄ«š 4 C°/°EX° /± >Y°EX°/±>Y° ±° +X!ØôY°±"° +X!ØôY01!"326653'4#"3265ýþµþøÿþÁ?ÿxÎO{€Å°¢&*ÅØ¶¬Íͬ·×Vþõþ `  bPI «“Àó$G¦XÈÿÈþûÊÿÿËaÿëèÇ%;° /°EX°/± >Y°EX°/±>Y±° +X!ØôY°±"° +X!ØôY014326653#"53326554&#"aßfª@RP²…�#%þüààþûÅ‘��’“Ž�‘'ð7F?„h�¼ B�VòþÌ5ñ¬àପâ⪓ÿëW7E°/°/°EX°/± >Y°EX°/±>Y°° ° +XØÜY°±° +X!ØôY°°Ð016653#"$533265ÜV\¾Ä·þËùðþÕżš¢Ç°²£}Áó"ýyîüýíÛü%¥««¥Û‹ÿëjË[°/°/°EX°/± >Y°EX°/± >Y°EX° /± >Y°EX°/±>Y°±° +X!ØôY° ±° +X!ØôY01#'#"&5332673665d±½± 3 i±ÆÅfli‰#ÅdU˱Àüº W^âï~ý€­‚UN r€~ÿÿÿ¼þKLà&PSÿJÿõ´/?r²r²_r01ÿÿ%&$­L³S°/° /´O _ q²? r²� q²¯]²ï]´O_q²?r²�q²q²Ï]´o]´/]°° Ð01ÿÿjÿëóã&D­äqÿÿÿìa&ˆvÊY°EX°/±>Y²]01ÿÿ:ÿë|Ý&¨v~²¿Fq¶ßFïFÿFq²Fr01ÿÿqÿ¢\&švÝ—°EX°6/±6>Y01ÿÿaÿy*Û&ºv>²¿5q¶ß5ï5ÿ5q@ 55/5?5O5r01ÿÿaþ’Å&6clþ—ÿÿgþÉN&Vcþ˜ÿ¼þKp:)°EX°/± >Y°EX°/±>Y± ° +X!ØôY01#"&'73265p¬™3A;E:ûm§µ –gZ“ÿÿPýQ5°/01«äëI°/²�q²ÿq²¯q²ß]²?]°а°° +XØÜY²¯]¶/]²/q²901#'#573¡“’ öxý””íŒäëF°/²�q²ÿq²¯q²ß]²?]°° +XØÜY²/q²¯]¶/]²9°Ð0173#'53Å“ªþÿwþ¦W”õó�¤Ø°G°/²/]²Ÿ]²]²]²@]° ° +XØÜY²ÿ ]² q° ° +XØÜY´¯ ¿ ]°Ð01#"&7733265Ò¢‰Š¢—DJHF°t’’tBRSA çz°°/²?]±° +X!ØôY01#53zÚÚçÉ…Z"â 8|° /²@ ]°° +XØÜY´?O]° °° +XØÜY°°° +XØÜY014632#"&732654&#"…yWUxwVWyg>+*<<*+>TrqUVllV+=;-->>DþPÓ9)°EX° /± >Y±° +X!ØôY° °° +XØÜY01!3267#"&5467„FO-3.!$W<_yy4_6*0 {ncP�8‡á=óN°/²oq²?]²¿]²€]°° +XØÜY°° а± ° +X!ØôY°±° +X!ØôY° °Ð01#"&#"'46323265=wZGš3+:lv[8¨4)<Ó^‚]A.]‰^A/däJî ;°/²?]²o]²]²�]°° +XØÜY²¯]¶/]°а° Ð013#'3#båþÔ«UÓð�îþüþû¶þ…ìÿ¬ 1°/°° +XØÜY°° +XØÜY° ° +XØÜY°°° +XØÜY014632#"&732654&#"¶[B?ZY@B[Y(&&(êAUUA?RR?&%'(üѺþ°/°° +XØÜY01#3þƒ°ºº\ýoºþ¤°/°° +XØÜY013#ýî¶¼yþ£ÿÿü�áÿCóXüý[Úþ“v3|°/°° +XØÜY°° +XØÜY°° +XØÜY°°° +XØÜY01'6654HýoLAWI“žVAÚš %'&lgVFI Gü,äÿî "°/°а° ° +XØÜY¶  / ]°Ð01#73#73þ«þÔåþ�ñÔéþöý<þ¯þÿw°/°° +XØÜY±° +X!ØôY01#53þÚÚþ¯ÈÃöÐr°/²]²_]°° +XØÜY013#Я^rþ„¡èe '|°/°б° +X!ØôY°а а° +XØÜY01#53#533#eÇÇþÆÆŠÚŽèÈÈÈþúÿÿr&$a.ÿÿ¡pgDy°/01ÿÿÿãÞt&(daÿ ÿÿet&+daÿQÿÿès&,daÿUÿÿDÿër&2a�ÿÿÿ�2r&Y°EX°/±>Y°±° +X!ØôY01!#!1ýHÅ}úë°p°B°EX°/± >Y°EX°/±>Y±° +X!ØôY°°д�Ÿ]²}]´[k]013!%!#‡©@ú®Fþp°úPšÿÿ´z°(ÿÿam°=ÿÿ´°+qÿëÅp°/°EX°/± >Y°EX°/±>Y²Ï]²q²ïq²¿q²ï]²]²/]°±° +X!ØôY°±° +X!ØôY°±° +X!ØôY01!5!!"3 '4#"3265¿þýCþµþøÿþÁ?ÿKÅØ¶¬Íͬ·×“š×þõþ `  bþŸþõÈÿÈþûÊÿÿËÿÿ¾„°,ÿÿ´ °.1°E°EX°/± >Y°EX°/±>Y°EX°/±>Y°°Ð²Ÿ]@ =M]m}�]01##3#Ÿþaɪɓûm°úPÿÿ´R°0ÿÿ´°1{$° Y°/°EX°/± >Y°EX°/±>Y±° +X!ØôY²ï]²/]²pr°±° +X!ØôY°± ° +X!ØôY017!!!!!!{©üWSùýRœüdššA› ›ÿÿqÿëÅ2´°9°EX°/± >Y°EX°/±>Y°EX°/±>Y°±° +X!ØôY01!#!#!Æý<ÅOúë°ÿÿ´Ì°3FH°N°EX° /± >Y°EX°/±>Y² 9°°Ð°±° +X!ØôY° ± ° +X!ØôY°°Ð01!!55!!öþC ûþàþ Ðý&½ËýÕ›“EE“›ýÓÿÿ"ް7ÿÿΰ<TM°#b° /°/°EX°/± >Y°EX°/±>Y²?]´_o]°°Ð° °а ±° +X!ØôY°±° +X!ØôY°а° Ð01#5&5475377'&4&#64æ3þÍæÅèþÍ3èÅý㱡 ²r²��²ÍþåÚÝþãÕÕÝÛâý!¡»³½žŸ»ýM½ÿÿBÖ°;W°R° /°EX°/± >Y°EX°/± >Y°EX°/± >Y°EX° /± >Y° ±° +X!ØôY°Ð° ° Ð016653#&5373�­ÅþâêÆãþíĤˆÆåÓ¬;ýÅõþ×þÁ@(õ;ýŪÒÊpÐÅ#Z°EX°/± >Y°EX°/±>Y°EX°"/±">Y±!° +X!ØôY°Ð°±° +X!ØôY°±° +X!ØôY°Ð01%6554&#"!53&55323!ß��Áª©À¡�þêp€5ùù7€nðþŸûvéùùévûþàŸša3¤tcþ�þät¤þÍašÿÿÿË| &,jÿ!]°EX°/±>Y°EX°/±>Y01ÿÿÎ &<jo\°EX° /± >Y°EX° /± >Y01ÿÿbÿë€y&‹auÿÿbÿíéx&�a+ÿÿ�þaõy&‘aFÿÿÅÿësf&“a2ôÿÿ�ÿë&z&ŸbT¸°EX°/± >Y°ܰÐ01bÿë€N+d°EX°/± >Y°EX°/± >Y°EX° /± >Y°EX°/±>Y° ±° +X!ØôY°± ° +X!ØôY°±(° +X!ØôY013267#"&'#"5532732675&&#"é)# <%Kd7™cÆàßÉe›73ý³‡ŒQr''sN�ˆ9üÛH8Ž@EBCê@HDwý»¤ËG@Y°EX° /± >Y°*±)° +X!ØôY²)*9°±° +X!ØôY° ±"° +X!ØôY012#"&'#4$2654&#"32654&##5_ÃìdWw…ýÊR™;Å ´zt}mk’,�Y�•ƒo�ÅÜ®[™-,Ä�Ñí-.þ;°¥ïý—yj_Œ�jüÂ4: €p¬›.þ_ä: K°EX°/± >Y°EX°/± >Y°EX°/±>Y² 9° °дŒœ]° °дŒœ]013#337Éþ‰Åþ†Ê:üþ!ä÷ýLLaÿë*°$W°EX°/± >Y°EX°/± >Y°EX° /± >Y°±° +X!ØôY°±° +X!ØôY° ±° +X!ØôY01!#"554?%5"326554&ªþ:sepþüààþûÓ¹þ×w�‘‘��’“°—þëKö–òþÌ5ñ×+ìvþ⪬àପâbÿíéL*�°)/°EX°/± >Y°EX°/±>Y±° +X!ØôY²_)]²ÿ)]²o)q²Ï)q²?)r²o)r²ÿ)q²Ÿ)q²/)q´¿)Ï)]²/)]²Ÿ)r°)±*° +X!ØôY²*)9°±"° +X!ØôY01"32653#"&5467&&54632#4&#"33yy‰vp‘ºþö¸ÊûgcW`éÉ·ùº‹dtymsÑÝUWIdpL¢«­—[€ #zI–¤¯‹Fb_CJU–sþXʰ!E°EX°/± >Y°EX°/±>Y°EX°/±>Y±° +X!ØôY°±° +X!ØôY01332'6654&##"&547'!5Êþª�qif Ÿ´›mQB^RZ4³¹‹� ý‘°pþP™ã‘tu€o¥/VF4:Ö¨xA©0›�þaõNF°EX°/± >Y°EX°/± >Y°EX°/±>Y°EX°/±>Y°± ° +X!ØôY016632#4&#"#? 6 e±½ÅrtU{&Å:–QYÃàû¶F�}C<üÌ:wÿëÅ w°/°EX° /± >Y°EX°/±>Y²]´ïÿ]²Oq²Ÿq²q²Ï]²_]²/]° ±° +X!ØôY°±° +X!ØôY°±° +X!ØôY01#"32!54&#"!3265÷××úùÖ×ùý&‰‚‚ˆý늂‚‡+þéþ×*Y+þÕþêa‹½¿¿½þÚ…½ÁÀ¾Åÿës9)°EX°/± >Y°EX° /± >Y±° +X!ØôY013267#"&5Š5-0,-Y5w|9üÓI8 …Žž"ÿÿ™@:ú8ÿï^î!g° /°EX°/±>Y°EX°/±>Y² 9° ±° +X!ØôY°±° +X!ØôY°°вŸ]@,<L\l|Œ]²«]01!#'&&#"#566323267#"&'Û‡7 W< 6?�™(hG,  % v�5Ê‘Tj‘ ¢lüNGTš ‚Œqÿÿ™þ`ò:wÿÿ.ä:YVþDã°.]°/° /°EX°/± >Y°EX°/±>Y°±° +X!ØôY° ± ° +X!ØôY°±° +X!ØôY²& 9°°-Ð01!33#"332'6654&##"$5467&&5467#5šþØ{}‘š��»Ã �<¡²›mOA^FKDÞþ쟘lx=;×°›‚`^i›œ™x–�o¤/UF4<ãÈ‘Å,(�XMy(›ÿÿaÿë*NROÿëÌ:Q°EX°/± >Y°EX° /± >Y°EX°/±>Y°±° +X!ØôY° ±° +X!ØôY°°аÐ01#3267#"&5!##5!^{5-0,-Y5w|þuÅžýnI8 …Žž‡übžœ�þ`$NH°EX° /± >Y°EX°/±>Y°EX°/±>Y° ±° +X!ØôY°±° +X!ØôY01#"&'#5432#4&#"3265$ÛÅa˜7ÅÀãñÅ„‹{�%xW‹Œôëþâ<:ýÿà÷þÃþø½íçŒþÓCKÌ£bþWáN"H°EX°/± >Y°EX°/±>Y°EX°/±>Y°±° +X!ØôY°±° +X!ØôY012#4&#"'6654&'&554=»é²zrŠŒ¤¦´¨›mQB^X_ûþÿNѲg‡æ›*�Éj{o¤/UF03 #×*ã9aÿë|:J°EX°/± >Y°EX°/±>Y°±° +X!ØôY°±° +X!ØôY°±° +X!ØôY01!#"5547!326554&#"|þë^eþøÜàþûß9üª‘��’“Ž�‘žHÔ‚ÒþÓ5ñç+ý׬àଡÖÖ¡QÜ:/°EX°/± >Y°EX°/±>Y°±° +X!ØôY°Ð01!#!5!ÜþšÅþ ‹¡ü_¡™�ÿë&:6°EX°/± >Y°EX° /± >Y°EX°/±>Y±° +X!ØôY013265&'3#"&5RŠu‰‡B7Î3@ÞíÝñ:ýœ¯¢ý°~ˆkþýšÿþ¸òûbSþ"W:!T°/°EX°/± >Y°EX°/± >Y°EX° /± >Y°а ±° +X!ØôY°±° +X!ØôY°°Ð012#$54737&&66.äEþñþæÅþîþü@4Î9B£¨)º ±­:þ¿íÚþÕþ2ÎAê™l†þþ~›î¤ýÒ£íüýÙ^þKKI%}°EX°/± >Y°EX°/± >Y°EX°/±>Y°EX°/±>Y²9´u…]²”]°± ° +X!ØôY²9@ [k{‹›]°±° +X!ØôY012333267#"&'##&&#"#'66Ê�—*\éÆþ«Ì >+  % t‹4þ÷Ñ£!V< 6?I lÞÛý=þIK¢ ƒ�,ýÚ‚Re— [þ&M:R°/°EX°/± >Y°EX°/± >Y°EX°/± >Y°EX°/±>Y±° +X!ØôY°°а°Ð01665&'3#&37%±¬B8Ï3@þöþâÆ÷þóÅ©�9ü\ñœ}…jÿ™ðþ¾þ7Ë.æþÏÛ¢lÿë`:(F°EX°/± >Y°EX°/± >Y°EX°/±>Y°EX°"/±">Y±° +X!ØôY°Ð01326533265&'3#"&'#"547ÕJVpxkÆ~lxpVIÏDVÊØ¯*+¯}ÙÊUF:†þý¾ï¢¯,þÔ¯¢íÀ†jþüšÿþ¸zwwzHÿ›iÿÿÿØÿ뉶&“jÿ.3²r´ßïq²_r´/?r²r´ßïq²_r´/?r01ÿÿ�ÿë&¶&ŸjV3²r´ßïq²_r´/?r²r´ßïq²_r´/?r01ÿÿaÿë*y&RaJÿÿ�ÿë&f&Ÿa\ÿôÿÿlÿë`f&£ajÿôqÿë°Å%M°/°/°EX°/± >Y°EX° /± >Y±° +X!ØôY°±° +X!ØôY°±$° +X!ØôY0154632#"73267&$%4&#"7 ½—�¶þÏøîþØÅ¶›¥¾Úþ÷ãIFBM–‚ >¬Ïʱþþêþ±\ ”ýjÈüíÐûþlmml@xžÿêS»#j°EX°/± >Y°EX°/± >Y°EX°/±>Y°± ° +X!ØôY²!9°!°дK[]²‹]°!°дK[]²‹]° °Ð016632&&#"#&&#"'663237æ3{Q"2 !7þÔÄþÔ7 2#P{4²×|h ˜#'ýyý¾B‡'#˜ h|þjFFNÿë:,]°EX°/± >Y°EX°/±>Y°EX° /± >Y°±° +X!ØôY°аа ±!° +X!ØôY°±*° +X!ØôY01##"&'#"5467#5!&&'!326553326…!®¸w¥()¤v¹­ oËþô("üÑ#(SYbtÆscWTžQ¶eþþ·ytuxIþe¶QœýøY¶]^¶X¾ï¢¯úú¯¢îÿÿ´z"&(CÝ]°EX°/±>Y²]01ÿÿ´z &(jr]°EX°/±>Y°EX° /± >Y01)ÿ÷´°d°EX°/± >Y°EX°/±>Y°EX° /± >Y°±° +X!ØôY°в9°/° ± ° +X!ØôY°±° +X!ØôY01!6632/265&&#"#!5!•ýúO˜6öþ¡ >™FÅþ_lþ4òÙØâ�˜��—ýW›ÿÿ´1&nv•Y°EX°/±>Y²]01‡ÿìÐÆ!z°/°EX° /± >Y°EX°/±>Y° ±° +X!ØôY²]²ï]²¿q²?r²ïq²q²Ï]²/]²�r°±° +X!ØôY°±° +X!ØôY01#"32#4&#"!!3265ÊþØó÷þÉ7÷÷$½´¤¥Ä2ýÎÄ¥¤´ÓÍþì^  _þùÙ™²þöÅ/š<Çþö±œaÿë’Å'Q°EX° /± >Y°EX°/±>Y² 9°±° +X!ØôY° ±° +X!ØôY°±%° +X!ØôY014&'&$54$32#4&#"#"$773326Í–¿çþýÞIž“�ª¿æðþàèÚþ±¼Î˜•®od‡.7Ö¢ªäþú­€ž…k_09Þ¤°ÖìÆŒ’~ÿÿ¾„°,ÿÿÿË| &,jÿ!]°EX°/±>Y°EX°/±>Y01ÿÿ=ÿëð-2I°i°/°EX°/± >Y°EX°/±>Y°EX° /± >Y°± ° +X!ØôY°±° +X!ØôY°±° +X!ØôY° ±° +X!ØôY01!2#!!##532!2654&#÷gèþýèýÔþ×û4(–„‚g““““°ýÉ÷ÆÆöýíþoþ�šK®ý/ý»©{y¨´T°m°/°EX°/± >Y°EX°/± >Y°EX° /± >Y°EX°/±>Y°°Ð°/±° +X!ØôY°±° +X!ØôY° ±° +X!ØôY01!3!2#!!#3!2654&#yÄÅhéþþèýÓý<Åʼnh““““;uý˜ä¼½ë¡ý_°üýýø”qp“BÚ°N°EX°/± >Y°EX°/±>Y°±° +X!ØôY°в9°/°° а±° +X!ØôY01!6632#4&#"#!5!®ýðLžiðùÅ‹™Z§RÅþilþOÔìþ4̤€ý:›ÿÿ´ &.v‰Y°EX°/±>Y²]01ÿÿ´"&ÄCF]°EX°/±>Y²]01ÿÿUÿëÈN&ÏTÚž°EX°/±>Y01´þ™° I°/°EX°/± >Y°EX°/± >Y°EX°/±>Y°EX° /± >Y±° +X!ØôY°Ð013!3!#!´ÅÄÅþCÅþ4°úêúPþ™gÿÿ°$£»° M°/°EX° /± >Y°EX° /± >Y° ±° +X!ØôY°± ° +X!ØôY° ±° +X!ØôY01!!2#!!!2654&# ýHgéþüèýÔ}ýHg“”“”þ[ïÅÆö°ý%ýÅ©{w ÿÿ´¯°%ÿÿ´1°n0þ™Õ°J°/°EX° /± >Y°EX°/±>Y±° +X!ØôY°Ð°°а° а ±° +X!ØôY01%3#!#36!!! ȱûå§}M€!lý: fPÀþšþeþ™WQ!Mý³îþ–q{ÿÿ´z°(2°f°EX° /± >Y°EX°/±>Y° ° в  9° /²Ï ]±° +X!ØôY°а°в 9° °а °а°а°Ð01####33333#§™Å¢þköçþBæz¤ÅœzæþAçõœýdœýd®ý‡yý‡yýSüýxÿëßÅ*r°/°EX°(/±( >Y°EX° /± >Y²Ï]²q²¿q²ï]²]²/]°±° +X!ØôY²9° ±° +X!ØôY°(± ° +X!ØôY01!"$77332654&##532654&#"#'&$3 Ɉx‡�þÁþþâþ¼¼Æ�²Ê¸´··®¨µ±�Á¼1à*&e§/*®}ÉâÖÍr�•x…�œ„rp�Ži°ÜØ´° w°EX°/± >Y°EX°/± >Y°EX°/±>Y°EX°/±>Y°°Ð@ \l|Œœ]@ +;K]°° Ð@  $ 4 D ]@ S c s ƒ “ ]013#'#3<ÅÅýCÅŰúPVû¨°û«ÿÿ´N&ÄT1ž°EX°/±>Y01ÿÿ´ °.1÷°H°EX°/± >Y°EX°/±>Y°EX°/±>Y°±° +X!ØôY°± ° +X!ØôY01#!##532÷ÅýòÎï5)Šz°úPýíþpþŽšK®ÿÿ´R°0ÿÿ´°+ÿÿqÿëÅ2ÿÿ´°{ÿÿ´Ì°3ÿÿvÿë¿Å&ÿÿ"ް7UÿëȰM°EX°/± >Y°EX°/±>Y²9´…•]°°а±° +X!ØôY°°дŠš]0133#"&'7326773LIHåþ;‹˜C  CG=&(þݼeû?ƒ�•HPT?UÿÄíì'O° /°/²@]² 9°/°в 9° /°а±° +X!ØôY° ±° +X!ØôY°!а°'Ð0132###5#"3353"33332654&#„üSþ­üÅýþ°QüÅâ½ÍͽźÏϺþ·þÿþýþ¶ÄÄHKÍþ˜êÇÉèbüžêÉÆéÿÿBÖ°;µþ™Ø° 5°/°EX°/± >Y°EX° /± >Y±° +X!ØôY°а°Ð01#33!3!ØÅÅúÝÆÄÅû±þ™úëúP“̰<°/°EX°/± >Y°EX° /± >Y°EX°/±>Y°±° +X!ØôY01##"&533267ÌÅ_²zñøÆŠ™hÀc°úP[ÓíÌþ4¥¹´Ø° ;°EX°/± >Y°EX° /± >Y±° +X!ØôY°°а°а°Ð01!3!3!yìÄêÅùܰúêúêúP°´þ¡s°>° /°EX°/± >Y°EX° /± >Y±° +X!ØôY°а°аа° Ð01!3!33#!yìÄêÅ›¯ú°úêúêúëþ_°¼° T°EX°/± >Y°EX° /± >Y² 9°/°± ° +X!ØôY°± ° +X!ØôY° ±° +X!ØôY01!!2#!!!2654&#SgêþýéýÔþrSg”““”°ý¬æÄÄîý¬ýÙ zv—´C° \°EX° /± >Y°EX°/± >Y°EX°/±>Y°EX°/±>Y² 9°/± ° +X!ØôY°± ° +X!ØôY01!2#!3!2654&##3ygéþüèýÔÅg“”“”cÆÆpïÅÆö°ý%ýÅ©{w ý+°£»° B°EX° /± >Y°EX°/±>Y² 9°/± ° +X!ØôY°± ° +X!ØôY01!2#!3!2654&#hgêþýéýÔÅg”““”\æÄÄî°ýýÙ zv—µÿìÿÆ!T°/°EX°/± >Y°EX° /± >Y±° +X!ØôY²ï]²/]°±° +X!ØôY°±° +X!ØôY01'&32#"7733255!5!54#"¼)ò÷8þÈ÷÷þܽ²¥¤ÅýÂ>Ť¥²ÞËþ¡þóþýþòþ£Úš± ÆQ›Æ ²›¾ÿëâÅ#¦° /°EX°/± >Y°EX° /± >Y°EX°/±>Y°EX° /± >Y²_ ]²¯ ]´ / q²Ï q´ï ÿ q´Ÿ ¯ q@ Ï ß ï ÿ ]² ]²/ ]² ]° ±° +X!ØôY°±° +X!ØôY°± ° +X!ØôY01!"5##3353 '4#"3265âþµþøÿþÁÍÆÆÍ?ÿKÅØ¶¬Íͬ·×Vþõþ ` "ýˆ°ýbG bþŸþõÈÿÈþûÊÿÿËcn° ]°EX° /± >Y°EX°/±>Y² 9°/´]´?O]± ° +X!ØôY² 9°° а ±° +X!ØôY01!#&&54$3!#!!"3!4ÑU�“ñÒÅþºFþ󜣤™n6ÈŽÐæúP9Ü–ƒƒ¤ÿÿjÿëóNDaÿë**b°/°EX°/±>Y²]²/]²9°/²9°/±° +X!ØôY²9°±° +X!ØôY°±$° +X!ØôY012#"557665366"326554&kÏðþüààþû â~q˜¬»ˆÂ;²>�����’“üþí×éþØ(éŒ@|-@I°n ¤Ÿ?OšÀ�£ÔÔ£�À�#: ’°/°EX°/± >Y°EX°/±>Y´¿Ï]²/q²Ÿq²ÿq²or²ßr²?r²Ïq²oq²ÿ]²_]²/]°±° +X!ØôY²9°±° +X!ØôY°±° +X!ØôY013!2#!2654&#%32654&##�«Öì\TeqÝÆþÕ+mppmþÕç}€}æ:••Lw‰X˜œÚþ¾SNMT—JKMN�?:,°EX°/± >Y°EX°/±>Y°±° +X!ØôY01!#!?þŰžüb:.þ :J° /°EX°/± >Y°EX° /± >Y±° +X!ØôY°Ð°°а ° а±° +X!ØôY017667!3#!#!!ƒSXÃ�²ý²Ô Q@åþÀš`ÑØ—ü`þ(>þÂØ ´þWñÿÿcÿëíNH:h°EX° /± >Y°EX°/±>Y²  9° /´¿ Ï ]±° +X!ØôY°а°в 9° ° а °а °а°а°Ð01####33333#í~Åþâø‚þ î {Å{ îþŸ‚øÕþ+Õþ+=ýþB¾þB¾þýÃXÿí®L*u°EX°/± >Y°EX°/±>Y°±° +X!ØôY°° в*9°*/²/*]´¿*Ï*]²Ÿ*q±)° +X!ØôY²)*9°°а±"° +X!ØôY012654&#"#'&632#"&77332654&##5hZgh]~»ﯾÖXO[`é¿°þ»„hkwgn¼xOKD^bF‹¯£—Iy#!€[˜¬«¢LpcJWP �ü: n°EX°/± >Y°EX°/± >Y°EX°/±>Y°EX°/±>Y°°в�]¶L\l]´{‹]°° в„ ]@ C S c s ]²’ ]013#'#37ÅÅþ"ÄÄ:ûÆüþ:ýÿÿ�ü÷&äT™G3²�q²Ïq²r¶?O_]²ÿq²¯q¶`p€]²q01™A:ް/°EX°/± >Y°EX°/± >Y°EX°/±>Y°EX°/±>Y´¿Ï]²/q²Ÿq²ÿq²or²ßr²?r²Ïq²oq²ÿ]²_]²/]°±° +X!ØôY² 901##333#ß�ÅÅreçþXÊòËþ5:þ7ÉýÿýÑü:H°EX°/± >Y°EX°/±>Y°EX°/±>Y°±° +X!ØôY°± ° +X!ØôY01#!##77265üÅþ’ªÍ8)iS:ûÆžþÎþÀþÔ¨ÍöΙU:{°EX°/± >Y°EX°/± >Y°EX°/±>Y°EX°/±>Y°EX° /± >Y°°дDT]@ csƒ“]°° ж} � � ]²l ]´K [ ]°Ð0133#'##3÷böÅþ´ˆþ®Åþ8ûÆïýý:�û:  °/°EX°/± >Y°EX° /± >Y°EX°/±>Y°EX°/±>Y²Ÿ]²ÿ]²oq´Ïßq´?Or²¯r´ßïr´or²ÿq²r²Ÿq´/?q´¿Ï]²_]²/]°±° +X!ØôY01!#!#3!3ûÅþÅÅâÅÌþ4:þ,Ôÿÿaÿë*NR�ü:9°EX°/± >Y°EX°/±>Y°EX°/±>Y°±° +X!ØôY01!#!#!üÅþÅmžüb:ÿÿ�þ`)NSaÿëöN8°EX°/± >Y°EX°/±>Y±° +X!ØôY°±° +X!ØôY01%2653#"55432#4&#"Gb•±þý¬ìúûë¾ñ²Œk›…„…yXŒÙ4é*ç5à£c‹ß¢*¦ÝGÑ:/°EX°/± >Y°EX°/±>Y°±° +X!ØôY°Ð01!#!5!Ñþ›Åþ Š¡ü_¡™ÿÿþKè:\bþ`k-;]°/°EX°/± >Y°EX°/±>Y°EX°/±>Y°° а°а±8° +X!ØôY°#а±1° +X!ØôY°*Ð013236632#"&'##"5%4&#"3265!3267&&#"b̾(G Å"P/¾ÌÍ»/R"Å H)¼ÌD‚23 ‚}ü�s‚0.‚u > äþþÂþùìþãþW¤ ì¼î üñÊ¥§Èì¾ÿÿ.Ô:[�þž€: 8° /°EX°/± >Y°EX° /± >Y±° +X!ØôY°°а°Ð013!33#!�ÅãÅ„ÅüÔ:ü` ü`þbÜ;C°/°EX° /± >Y°EX°/± >Y°EX°/±>Y´¿Ï]°±° +X!ØôY01!##"&5332673ÜÅ9xDÄßÅpnBx;ŃÎÊ>þ‚z�Ø: F°EX°/± >Y°EX°/± >Y°EX°/± >Y°EX° /± >Y±° +X!ØôY°Ð01!3!3!T}Å}Åú·:ü` ü` ûÆ:�þ®ˆ:G° /°EX°/± >Y°EX° /± >Y±° +X!ØôY°°а°а°а° а /01!3!33#!T}Å}ŰÃúÊ:ü` ü` üWþR:Á: T°EX° /± >Y°EX°/±>Y² 9°/° ± ° +X!ØôY°± ° +X!ØôY°±° +X!ØôY01!2#!!5!!2654&# ÀÕ×¾þ.þà jefiÆÃœ�ÊŸ›ýòþnqURz­˜: X°/°EX° /± >Y°EX° /± >Y°EX°/±>Y°EX° /± >Y°±° +X!ØôY°±° +X!ØôY01!2#!3#3!2654&#r ÀÕ×¾þ.Å&ÅÅûÚ jefiž¸“”¿:ûÆ:ýÊþ–fLJn™: >°/°EX° /± >Y°EX°/±>Y°± ° +X!ØôY°± ° +X!ØôY01!2#!3!2654&#^ ÀÕ×¾þ.Å jefiž¸“”¿:ýÊþ–fLJncÿëãN!�°/°EX°/± >Y°EX°/±>Y°±° +X!ØôY°±° +X!ØôY²/]´¿Ï]²/q²Ïq²ÿq²Ÿq²ÿ]²_]²or²Ÿr°±° +X!ØôY01"#'&632#"&7733267'!5!7&&\�²ÿ¦Üÿÿ۷d~Šþ ‰³zW‹ÛþÇã*äþÇߣc‹ÄŒšƒ·™ÿë$N!¥°/°EX°/± >Y°EX°/± >Y°EX° /± >Y°EX°/±>Y´¿Ï]²/q²Ÿq²ÿq²or²ßr²?r²Ïq²oq²ÿ]²_]²/]°±° +X!ØôY° ±° +X!ØôY°±° +X!ØôY01!632#"'##3326554&#"^ÿÍáþüàÒþÿÿÅÅ‘��’“Ž�‘qÔ þÊñòþÌÛþ):ý׬àପââªNò: R°/°EX°/± >Y°EX°/±>Y°EX°/±>Y°±° +X!ØôY²9°±° +X!ØôY01#!#&&54633!!"òÅþõÿÔgoÝÂÙbbþükn:ûƤþ\Á% i’¹þ³Hfbkÿÿcÿëíá&HC—²À q01ÿÿcÿëíÌ&Hj,=²`!r´°!À!q²@!r²ð!q´!!r²`$r´°$À$q²@$r²ð$q´$$r01ÿçþK)}°&/°)/°EX°/± >Y°EX°/±>Y°EX° /± >Y²_)]²/)]²¿)]°)±° +X!ØôY°±° +X!ØôY°±° +X!ØôY°°"а)°$в/&]01!66323#"&'732654&#"##5353!hþì8£c­Á¬š!4 DY°EX°/±>Y±° +X!ØôY°±° +X!ØôY²/]²Ÿ]²ÿ]²oq´Ïßq²?r²ÿq²r²Ÿq´/?q´¿Ï]²_]´or´Ïßr°±° +X!ØôY01%2653#"55432#4&#"!!Qb•±þý¬ìúûë¾ñ²Œk�‡xþˆ†…yXŒÙ4é*ç5à£c‹»Šš�¸ÿÿgÿëÉNVÿÿŸdLÿÿÿ¦W¶&ójþü3²r´ßïq²_r´/?r²r´ßïq²_r´/?r01ÿÿÿ¾þKrMAž:i°/°EX°/± >Y°EX°/±>Y°EX° /± >Y°± ° +X!ØôY°±° +X!ØôY°±° +X!ØôY° ±° +X!ØôY01!2#!!##77265!2654&#ü ¿Ö×¾þ.þ²Î8)j\È ifej:þe¹“”¿žþÎþÂþÒžÚóÎýËþ“pMIg��:j°/°EX°/± >Y°EX°/± >Y°EX° /± >Y°EX°/±>Y°°б ° +X!ØôY°±° +X!ØôY° ±° +X!ØôY01!3!2#!!#3!2654&#TâÅ ÀÕ×¾þ.þÅŧ ifej¢˜þd¸“”¿ ý÷:ýËþ“pMIgn°/°/°EX°/± >Y°EX° /± >Y°EX°/±>Y²_]²¿]²/]°±° +X!ØôY°±° +X!ØôY°°а°в/]01!6632#4&#"##5353!”þÀ8£c­ÁÅsrR…+Å||Å@»þîNWÐØýZ¨†€MBüá»›ÂÂÿÿ™AÆ&æv>%²¿q¶ßïÿq@/?O_or01ÿÿ�üË&äC®%²¿ q¶ß ï ÿ q@  / ? O _ o  r01ÿÿþKè÷&\TVG3²�q²Ïq²r¶?O_]²ÿq²¯q¶`p€]²q01�þœü: F°/°EX°/± >Y°EX°/± >Y°EX°/±>Y°EX° /± >Y±° +X!ØôY01!3!#!TãÅþ¯Åþ©:ü` ûÆþœd:�ÿëi° S°EX°/± >Y°EX°/± >Y°EX° /± >Y°EX° /± >Y°в 9° ±° +X!ØôY°Ð01#"&'#"&53326533265iç»mª/3°q´ÜÅo\l„Ìzdcz°û×ÉÓWVVWÓÉ)û׃ƒ)û×~„„~)|ÿë¤: S°EX°/± >Y°EX°/± >Y°EX° /± >Y°EX° /± >Y°в 9° ±° +X!ØôY°Ð01#"&'#"&53326533265¤Ò©]’,/ša£ÅÅXKYpÆcSQe:ý&¶¿GGGG¾·Úý&lopkÚý&lopkÚÿÍ»°Y°/°/°EX°/± >Y°EX° /± >Y°±° +X!ØôY° а° а±° +X!ØôY° ±° +X!ØôY01#!2#!#53533!2654&#NægéþüèýÔÖÖÅææg“”“”MÝïÅÆöM›ÈÈýíýÅ©{w ÿÛ]°/°EX° /± >Y² 9°/±° +X!ØôY² 9°/°° а°а±° +X!ØôY° ±° +X!ØôY01!!2#!#533!!2654&#Ÿþ¿ ÀÕ×¾þ.¾¾ÅAþ¿ jefi:þ²Í¥¥Õ:šDþ¼ý~þH}\Z…¿ÿìŽÆ)…°EX°)/±) >Y°EX°/± >Y°EX°&/±&>Y°EX° /± >Y² 9°/°в  9°± ° +X!ØôY°±° +X!ØôY° ±° +X!ØôY² 9°°$Ð013532#&&#"!!32673#"5##3…Ä7÷ò½¢ž¥ÄýåÄ¥Ÿ¡½þêî÷þÉÄÆÆB _þÿß «þöÅ›PÇþöª£Óþò^ PýY°—ÿëªN'§°EX°'/±' >Y°EX°/± >Y°EX°$/±$>Y°EX°/±>Y²9°/´¿Ï]²Ÿq²ÿ]²q²/]´Ïßq°в 9°± ° +X!ØôY°±° +X!ØôY°±° +X!ØôY²9°°"Ð013632#4&#"!!32653#"'##3\»ùݾñ²Œk�‡£þ]†Žb•±þý¬Ýø»ÅÅhÓà£c‹»‹šŒ¸yXŒÙÔþ2:+ã° i°EX°/± >Y°EX°/±>Y°EX°/±>Y°EX° /± >Y² 9°/°а± ° +X!ØôY°°ж�Ÿ]´\l]01####3#!#…¡Ä”˜É ©Éý«ˆ¿¶þJ¶þJ°úPZ3 ): m°EX° /± >Y°EX°/±>Y°EX°/±>Y°EX° /± >Y² 9°/°а± ° +X!ØôY° °Ð@,<L\l|Œœ]01####3#!'#éjÄqtɸ©»Éþ'$~&þÚ&þÚ:ûÆÁ8DDÑô°o°EX°/± >Y°EX°/±>Y² 9° /±° +X!ØôY°а°а° а аа °а °а°д�Ÿ]@ <L\l|]01!3#####!#3!#—~4©É•¡Ä”˜Éžþ½ÆÆ?ˆ¿[UúP¶þJ¶þJ·þI°üª3ºè:‘°EX°/± >Y°EX°/± >Y°EX°/±>Y°EX° /± >Y°EX° /± >Y°EX°/±>Y² 9° /±° +X!ØôY°а °а °а°д�Ÿ]@ <L\l|]01!3#######3!'#©»ÉwjÄqtÉwÄÅÅÇ$~ÁyûÆ&þÚ&þÚ%þÛ:ý‡8DD•K°!p°/°EX°/± >Y°EX°/±>Y°EX°/±>Y°EX°/±>Y°°б ° +X!ØôY°±° +X!ØôY°°а±!° +X!ØôY0132#4&###'#"#4633!3!LïúÅ‹™tŃ™‰Å÷ð%þy¹ýŸ ý¾.Ñêþ�s¢~*ý—x~¢þ�sêÑ‚ý~ç•W;"g°/°EX°/± >Y°EX°/±>Y°EX°/±>Y°EX°/±>Y°°а±° +X!ØôY° а° а±"° +X!ØôY013#54&###'#"#546735!!c{þãÆÐÆw„/ Å<…vÅÔÍþäž«þ™°þ :þ! ÒÝ¢¢£}þQ¸ }£¢¢âÐßþ$@¾‚°!%„°/°EX°/± >Y°EX° /± >Y°EX°/±>Y°EX°/±>Y°EX° /± >Y°EX°/±>Y°°Ð°±° +X!ØôY°а а°"а ±%° +X!ØôY01 #4&###'#"#47!#3!!3!ƒúÅ‹™tŃ™‰ÅMþkÆÆTþy¹ýŸ ý¾.Ñêþ�s¢~*ý—x~¢þ�s¹hýl°ý~‚ý~ç™Q:!$„°/°EX°/± >Y°EX°!/±! >Y°EX°/±>Y°EX°/±>Y°EX°/±>Y°EX°/±>Y°°а±° +X!ØôY°а а°"а!±$° +X!ØôY01#54&###'#"#547!#3!!ØþãÆÐÆw„/ Å<…vÅFþ‰ÅÅÑþåâ°þ :þ! ÒÝ¢¢£}þQ¸ }£¢¢¸hþ>:þ#Ýþ%@JþD¤r,5”°,/°/°EX°/± >Y°EX°/±>Y°±° +X!ØôY²,]²ï,]²Ï,]²/,]²,q°,±+° +X!ØôY²+,9°±#° +X!ØôY°°2° +XØÜY°-° +XØÜY°.° +XØÜY°5Ð012654&#!5!2##"&&'46332654&##573#'53œš’�‰þÐ0Ó ‚s�Šþ÷Ó2LE]BOo›³¡*�•¤ž� “ªþÿwþ¦9rf…›Õµg¤,)°Èã;5FU/¤o�€•w…†›¥”õóIþDy,5İ,/°/°EX°/± >Y°EX°/±>Y°±° +X!ØôY²_,]´¿,Ï,]´/,?,q²Ÿ,q²ÿ,q²,r²?,r´Ï,ß,q²o,q²ÿ,]²Ÿ,]²/,]´o,,r°,±+° +X!ØôY²+,9°±#° +X!ØôY°°2° +XØÜY°-° +XØÜY°.° +XØÜY°5Ð012654&#!5!2##"&&'46332654&##573#'53š…~{tþÑ/Àõg[ioóÀ1LE^BPo›³¡)n�Š�Ä“ªþÿwþ¦jSKAUœ¨ŽIw#!zV—­;5FV/¤o�€[JRQ›”õóÿÿW°‚ÿÿ[þ&M:¢qÿëÅ [°EX° /± >Y°EX°/±>Y² 9|°/²�]° ±° +X!ØôY°±° +X!ØôY°±° +X!ØôY01!"3 !54#"!3265þµþøÿþÁ?ÿKü4ض¬Íüùͬ·×Vþõþ `  bþŸþõ=?ÈÿÈÚ+ÊÿÿËaÿë*N ^°EX°/± >Y°EX° /± >Y±° +X!ØôY² 9|°/´0@]´p€]±° +X!ØôY°±° +X!ØôY01432#"5267'!"!7&&aßáþüààþûå€�ýÔ�€}Ž * �'ð7þÊñòþÌ5ñþt¹’’¹.³‹Š´ÜÄL°EX°/± >Y°EX°/± >Y°EX°/±>Y°Ð@ DTdt„”]°± ° +X!ØôY0137663#"#3E!!ý1ƒl2 2=þx©þÖ~yy%œ…©?Pûu°.MT°EX°/± >Y°EX°/± >Y°EX°/±>Y°Ð@ 4DTd]²s]´€�]°±° +X!ØôY01376632&&#"#3ã•)„R"3 ; þØ•þƒÊ?LLx —4*ü¹:ÿÿÜH& _8Z°EX°/±>Y°EX°/±>Y01ÿÿÿþ &!_Ò2²8]²?]²?]01ÿÿqþK \Å&2\tÿÿaþKtN&R\Œqÿs5/s°EX°/± >Y°EX°/± >Y°EX°/±>Y°EX°/±>Y°±° +X!ØôY°±° +X!ØôY°±(° +X!ØôY°±+° +X!ØôY01#5&'&76753'4'&'#5536765¦�¾ÅÄ„ŸŸ„Äž�¦ÅlIkÅqKffKqÅkIlVþõ°Š�~‘°  ±’vyаþõÈ€Vej^€ÈþûÊ€^lhV€ËaÿŠ*¶/s°EX° /± >Y°EX°/± >Y°EX°/±>Y°EX°/±>Y°±° +X!ØôY°±° +X!ØôY°±(° +X!ØôY° ±+° +X!ØôY01#5&'&5547675353676554'&'#5©Åœe‚‚d�Å›cƒ‚d›þ}H-IÅF-IJ,FÅH.Hviw›ñð›ypqv›ñòšv¬pFgfEp¬ªqD]_Fqª�ÿëdX.@F¢°EX°/± >Y°EX°/±>Y°в 9°°а±.° +X!ØôY°а±° +X!ØôY²#9°#/°°'вA9°A/°D° +XØÜY°1а1/°4° +XØÜY°1°8а4°=° +XØÜY°1°@° +XØÜY0176#"&'#"&546"3265332654&##"$#"#546323'7'3Ô®Üݳr°23°p´ÜÛ¯\oo\l„Æ„mZqqZf.ƒþÕ*2:†|rH$rþGP:¼§æÚýÀÛçUUUUçÛ@Úæ’˜�ýÀ‘—ƒ°þPƒ—‘@�˜Ç�{64$ln|þJBsŒ{{ÿë¢ñ.@F¢°EX°/± >Y°EX°/±>Y°в 9°°а±.° +X!ØôY°а±° +X!ØôY²#9°#/°°'вA9°A/°D° +XØÜY°0а0/°/° +XØÜY°0°4° +XØÜY°0°8а4°=° +XØÜY0176#"&'#"&546"32655332654&##"$#"#546323'7':�ÅÆ¢c›./šb£ÅÄžKXXKYpÅoZJYYJ®.ƒþÕ*2:†|rH$rþIO7¹;ÒÇþÝÉÒHHHHÒÉ#ÇÒ’ƒ}þÝ‚pkêêkp‚#}ƒÌ�{64$ln|þQHm~u�ÿëi(l°EX°/± >Y°EX°/±>Y°°° +XØÜY°° +XØÜY°° +XØÜY°°а°а(а±° +X!ØôY°$в9°° Ð015!!#5#"&'#"&53326533265Õ5þµ²[ç»mª/3°q´ÜÅo\l„Ìzdcz˜mm~~èû×ÉÓWVVWÓÉ)û׃ƒ)û×~„„~)|ÿ뤱(o°EX°/± >Y°EX°/±>Y°°° +XØÜY°° +XØÜY°° +XØÜY°°а° а°в9°±° +X!ØôY°$а°(Ð015!!#5#"&'#"&53326533265|5þ³²ïÒ©]’,/ša£ÅÅXKYpÆcSQeDmm€€þöý&¶¿GGGG¾·Úý&lopkÚý&lopkÚvþ�¿Å>°/°EX° /± >Y°EX°/±>Y° ±° +X!ØôY°±° +X!ØôY01#&532#4&#"33Ä×þú7÷÷$½´¤¥ÄÄ¥sþ�pRö _þùÙ™²þöÅþûÇþöbþ�áN>°/°EX° /± >Y°EX°/±>Y° ±° +X!ØôY°±° +X!ØôY01#&55432#4&#"33§ÅµËÿܶcŠŒ‹‹jþ�r *Ë*ã9à£bŒæ›*Ÿäp”>°/°EX°/±>Y01%#%7%73%\!Gþݵ®áþßG%ÊþÞI#¹«å%Kþ࿬}ªþÀŽ«|«l«~«Jþi«|ªÔ¤£ü°/°° +XØÜY01'7!'ƒ¯ ¯"~ëlÙûó'°/° ° +XØÜY°° +XØÜY°°° +XØÜY012$32#54&#"##5'q$Iq}†;1+þÕ‚.™|nl$46|‚õW°/°° +XØÜY0153»;QÜ{ŒtB,!W°/°° +XØÜY01'7'3|P:¼BtŒ{;þÄÔ¯/?O_oš°d/°t/°D/°T/°EX°/± >Y± ° +X!ØôY°T°б° +X!ØôY°d°$б,° +X!ØôY°t°4б<° +X!ØôY°D±L° +X!ØôY°T±\° +X!ØôY°d±l° +X!ØôY°t±|° +X!ØôY01'&632#4&#"'&632#4&#"'&632#4&#"'&632#4&#"'&632#4&#"'&632#4&#"'&632#4&#"'&632#4&#"/pa`qh122/æq``ri032.Qq``qh032/þÒq``qh032/ýWpa`qh122/ýUqa`qh122/þæq``qh032/=q``ri032.óOggO+::+þëNhgO,9:+þ NhgO,9:+ýùNhgO,9:+þäPffP,99,OggO+::+þ NhgO,9:+ýùNhgO,9:+Mþc�Æ #(%°/°"/°/°/° /°/°'/°EX°/± >Y01#'37%%57%'%'7P z`F: z`F Mþ¦ût þ³ZœAD%þÿüóþÀE&+”AÆ`•BÅ<þ­a¢Rþ þ |bG; |bG®™D±üŽ™EÈäFEþÕüãþ»G+ÿÿ´þØ¥N&Ä'T1žjÿÚ°EX°/±>Y01ÿÿ�þØ ÷&ä'T™GeÿÚ3²�q²Ïq²r¶?O_]²ÿq²¯q¶`p€]²q01ÿÍ»°Y°/°/°EX°/± >Y°EX° /± >Y°±° +X!ØôY° а° а±° +X!ØôY° ±° +X!ØôY01#!2#!#53533!2654&#NægéþüèýÔÖÖÅææg“”“”MÝïÅÆöM›ÈÈýíýÅ©{w ÿÛrm°EX°/± >Y°EX° /± >Y°±° +X!ØôY² 9°/°° а°а°° +XØÜY°±° +X!ØôY° ±° +X!ØôY01!!2#!#5353!!2654&#Ÿþ¿ ÀÕ×¾þ.¾¾ÅAþ¿ jefiý×Í¥¥Õ›ÂÂü¢þH}\Z…´æ°W°EX°/± >Y°EX°/±>Y²9°/±° +X!ØôY² 9°±° +X!ØôY²9²901#!2'#%!27'7654&#!yÅ-ém‡t“j”þ˜hN:lso(““þ˜Hý¸°ðÄ·s’h 0švhyCZy¢�þ`,N'x°EX° /± >Y°EX°/± >Y°EX° /± >Y°EX°/±>Y²9² 9²9°±° +X!ØôY°± ° +X!ØôY²$ 9²% 901'#"&'#36632#4&#"327'765)gjtiWtd—5Å©5œfÉßÅ‘�Ux%%xWQ:lt_*ôà�uit2CCýïÚ…JOþÁþú¸íMCýõCK"xijZ|£$þ/°/°EX°/± >Y°EX°/±>Y°±° +X!ØôY01!#!3$ýDżÅúë°N�Du/°/°EX°/± >Y°EX°/±>Y°±° +X!ØôY01!#!3DþÅðÅžüb:;ÿü1° G° /°EX°/± >Y°EX°/±>Y° ±° +X!ØôY°а °а± ° +X!ØôY01!##53!!!}þüŸ¸}ýH©ýW©›l›þ/ÿó?: Q° /°EX°/± >Y°EX°/±>Y²_ ]²/ ]° ±° +X!ØôY°а °а± ° +X!ØôY01!##53!!!tþàÅœœ°þ Üþ$Ü›ÜþÙ´þà…°W° /°EX°/± >Y°EX°/±>Y°±° +X!ØôY²9°/° ± ° +X!ØôY°±° +X!ØôY01!3 /265&&###!1ýH´<óã—‚ÈÉ´Å}þ,þÍþñþùþèŽÌ¿ÊÓýd°�þäÂ:E° /°EX°/± >Y°EX°/±>Y°±° +X!ØôY²9°/±° +X!ØôY01!32'665&&###!?þoâ¾4�p«�oŰžþéþÿÜŠþç#•"�r“¥þ:ÿÿþ™y°&™Tÿÿþ™(:&â™ÿÿxþRßÅ&Ù›ÿ¹ÿÿXþS®L&ã™Eÿºÿÿ´þ™f°&.™Aÿÿ™þ™r:&æ™M£ÿ°�°/°EX° /± >Y°EX°/± >Y°EX° /± >Y°EX°/±>Y²Ï]²q²¿q²ïq²Ÿq²ï]²]²/]°± ° +X!ØôY² 9°а°Ð01 ###5##33533Õþr¸öþ¬N�bÅÅb�L=°ýOý’óóýn°ý|ÿÿ„™c:’°/°EX°/± >Y°EX° /± >Y°EX°/±>Y°EX° /± >Y´¿Ï]²/q²Ÿq²ÿq²or²?r²Ïq²oq²ÿ]²_]²/]°± ° +X!ØôY² 9°а°Ð01 ###5##33533@þ­vùþó�KÅÅK�ÿ:þýÆË¿¿þ5:þ7ÓÓÉÿõ4°›°/°/°EX°/± >Y°EX°/± >Y°EX°/±>Y°EX°/±>Y²Ï]²q²¿q²?r²ïq²Ÿq²ï]²]²/]°±° +X!ØôY°±° +X!ØôY°° а° в901###53533#33#7ªÅÓÓÅéé˜ ÚýË^ë‘ýo‚›““›þª„ýEýÿÏ0}°/°/°/°EX°/± >Y°EX°/±>Y°EX°/±>Y²Oq²¯q²¿]²_]°±° +X!ØôY°±° +X!ØôY²/]°° а° в901###53533#33#é€ÅÕÕÅçç~(ìþާèóþ ¾›¿¿›ýÒªþý²C‹°y°EX° /± >Y°EX°/± >Y°EX°/±>Y°EX°/±>Y²9°/²Ï]´ïÿ]²/]²Ÿq±° +X!ØôY°±° +X!ØôY² 901##!5!33#ŽªÅþ$¡˜ ÚýË^ë‘ýo›ý|„ýEýA†:y°EX°/± >Y°EX° /± >Y°EX°/±>Y°EX°/±>Y²9°/´¿Ï]²Ÿq²/]²or±° +X!ØôY°±° +X!ØôY² 901##!5!33#$�ÅþcbreçþXÊòËþ5žœþ7ÉýÿýÑÿÿ´þ™’°&+™mÿÿ�þ™Œ:&é™g´z° ¬°/°EX°/± >Y°EX° /± >Y°EX°/±>Y°EX° /± >Y²]²Ï]²q²q´¿Ïq²r²or²�r²?r²ïq²Ÿq²Oq´ïÿ]²¯]²_]²/]°±° +X!ØôY°± ° +X!ØôY01!!!#!#3yÃ>ý‡Åý=ÅÅ’›úëƒý}°�e: ¨°/°EX°/± >Y°EX° /± >Y°EX°/±>Y°EX° /± >Y²Ÿ]²ÿ]²oq´Ïßq´?Or²¯r´or²ÿq²r²Ÿq´/?q´¿Ï]²_]²/]°±° +X!ØôY°± ° +X!ØôY01!!!#!#3Tâ/þ–ÅþÅÅfÔœübÌþ4:´þàͰZ°/°EX°/± >Y°EX°/±>Y°в9°/°± ° +X!ØôY°±° +X!ØôY°±° +X!ØôY013 /265&&###!#!r<óã—‚ÈÉrÆý<ÅOAþÍþñþùþèŽÌ¿ÊÓýdúë°�þä·:H°/°EX°/± >Y°EX°/±>Y°в9°/±° +X!ØôY°±° +X!ØôY0132'665&&###!#!ü¨ë(¾4�p¶–¨ÅþÅm‡þÿÜŠþç#•"�r”¤þžüb:qÿâ›Â*9�°EX° /± >Y°EX° /± >Y°EX°/±>Y°EX°/±>Y² 9° ±° +X!ØôY°±° +X!ØôY².9²'.9°±*° +X!ØôY²/ 9° ±6° +X!ØôY01"&'# 5"3267&554323366554&#"›mÇXFœUþïþªüÅw‹ã¿"?zƒå·¶äqf3q?ýƒuo\fsbbu%% !Ž,¦h˜þ÷ͨëþÒb§ãì9þÍòø�þô_ 6™ëDCå�û¬Öܦlÿë¡O*:�°EX° /± >Y°EX°/± >Y°EX°/±>Y°EX°/±>Y² 9°±° +X!ØôY°±° +X!ØôY²7 9²79²'79°±*° +X!ØôY° ±/° +X!ØôY01"&'#"554"3267&&554632354&#&766¡Z¡F;„HÚþíØHT ˆ+]b­’‘°B<&X1öB79>KF-2 !!Qþ9Í —¯‰;¼òOØg½îþÂioÃK ’l{ �xkf¢31™ÿÿvþR¿Å&&™åÿ¹ÿÿaþRöN&F™Xÿ¹ÿÿ"þ™Ž°&7™&ÿÿGþ™Ñ:&î™Øÿÿΰ<ÿÿ.þ_ä:�ΰr° /°EX°/± >Y°EX°/± >Y°EX°/±>Y° °Ð@4DTdt„”¤´ÄÔäô ]¶$q° °а ± ° +X!ØôY°Ð0133##'#533q|áþ]xÌÄè”þ^áÌäüú›þ ›.þ_ä:r°EX°/± >Y°EX°/± >Y°EX°/±>Y°EX°/±>Y°EX°/±>Y±° +X!ØôY°° в4 ]@ T d t „ ” ]°°аÐ01###5333733QäÅØ¼þ¢ÊùÉþ¦Ç þl”›¬ýLLûüTÿÿBþ™ð°&;™Ëÿÿ.þ™ :&[™æ7þ�œ°Q° /°EX°/± >Y°EX°/± >Y°EX°/±>Y°±° +X!ØôY°а±° +X!ØôY° Ð01!5!!!33#!Œþ«ºþaÄÅÁÅûµ››ûˆúñýüc þž;Q° /°EX°/± >Y°EX°/± >Y°EX°/±>Y°±° +X!ØôY°а±° +X!ØôY° Ð01!5!#!33#!,þôÄóãÅ„ÅüÔ ››üú ü`þbÿÿ“þ™]°&Ó™8ÿÿþ™m;&ó™H“̰E°/°EX°/± >Y°EX°/± >Y°EX°/±>Y°± ° +X!ØôY°а°Ð01##5#"&533336767ÌÅ_YžñøÆŠ™ž`c°úP[ îèÓíÌþ4¥9þйÜ;L°/°EX°/± >Y°EX°/± >Y°EX°/±>Y´¿Ï]°± ° +X!ØôY°а°Ð01!##5&'&5337673ÜÅ9< žœ_oÅ8(Ež<;Ń„‚ XgÊ>þ‚=, þêŠÃ°<°/°EX°/± >Y°EX°/±>Y°EX° /± >Y°±° +X!ØôY01336632#4&#"ŠÅ`±zðùÆ‹˜iÀb°ý¥Ôìþ4̤€ýHÿÿ”ñ<óp<À°EX°/±>Y01Mÿé,Ã'Z°EX°/± >Y°EX°/±>Y²$9°$/±° +X!ØôY°а$° а±° +X!ØôY°±° +X!ØôY01 5&&7733 !3267"!54&Gþ¶þ‘ž£—SUQé*ü.÷ýkšK02Àî«Ò µ�GÄš]}^þ�þÉlùþÄ.&‹$??þòÑÎ÷ÿßÿëZN&f°EX°/± >Y°EX°/±>Y²9°/´Ðà]² ]°а±#° +X!ØôY° а±° +X!ØôY°±° +X!ØôY01"55&&536$32!3267"!54&½âþõwz�-0!£ÛàýB˜‰d—7M:¾¥cŒó|-ð¯‡Eb½îþøÜ{œÉ92€9Lȧ~tœÿÿMþW,Ã&g™ÿ¾ÿÿÿßþYZN&h™ÿÀÿÿ¾„°,ÿÿ2N&ÂTþž°EX°/±>Y01ÿÿ÷&âTdG3²�q²Ïq²r¶?O_]²ÿq²¯q¶`p€]²q01£þÝаX°/°EX°/± >Y°EX°/± >Y°EX°/±>Y²9°/°Ð°±° +X!ØôY°±° +X!ØôY01/265&&#!#333Åöóã—‚ÈÉþ÷ÅÅ€Þ:þÓúþùþèŽÌ¿ÊÒýh°ýŽr™þþ:P°/°EX°/± >Y°EX°/± >Y°EX°/±>Y²9°/´¿Ï]°Ð°±° +X!ØôY01'665&&###333‰¸×¾3€q²š¨ÅÅTƒçeÞ¹…þõ"– ‘k�‹þ5:þ7Éÿÿ1þØ›°&Ç`ÿÚÿÿþØ :&çeÿÚ´þK°³°/°EX°/± >Y°EX°/± >Y°EX°/±>Y°EX°/±>Y²]²Ï]²q²q´¿Ïq²r²or²¿r´�Ÿr²?r²ïq²Ÿq²Oq´ïÿ]²¯]²_]²/]°±° +X!ØôY°±° +X!ØôY01!3#"&'73265!#yÂÆ­š5 D=Dý>Űýn’ù÷§µ –gZÜý}°�þKû:­°/°EX°/± >Y°EX°/± >Y°EX°/±>Y°EX°/±>Y²Ÿ]²ÿ]²oq´Ïßq´?Or²¯r²ïr´or²ÿq²r²Ÿq´/?q´¿Ï]²_]²/]°±° +X!ØôY°±° +X!ØôY01!3#"&'73265!#TâÅ­™5 CY01ÿÿjÿëó &DT\6²0q²°0q²0r²�0q² 0r´Ð0à0q²�0q¶`0p0€0]² 0]01ÿÿ &$j•]°EX°/±>Y°EX° /± >Y01ÿÿjÿëóË&Dj)/²ð-q´--r²`-r²@-r²ð0q´00r²`0r²@0r01ÿÿÿìa°ˆÿÿ:ÿë|N¨ÿÿ´zN&(TÈž°EX°/±>Y01ÿÿcÿëí &HT‚]1²�$q´Ð$à$q² $r² $]²$r²°$q²$q¶`$p$€$]01Yÿë!ÅM° /°EX°/± >Y°EX°/±>Y°±° +X!ØôY°±° +X!ØôY° ±° +X!ØôY01 # 5!76#"'6627'!fJqþ¢üþÐþÂüùül™J12¿ðªÒüÍÇÅþqþº1þÄþha8lø=/%‹#AúÀ ÒÏöÿÿtÿìþOHa:À°EX°/±>Y°Ð01ÿÿYÿë!ß&ƒjs/‰²ï!]¶?!O!_!q¶!!/!r´!!]@�!Ÿ!¯!¿!Ï!ß!ï!q´!!q´o!!]²°!]²ï$]¶?$O$_$q¶$$/$r´$$]@�$Ÿ$¯$¿$Ï$ß$ï$q´$$q´o$$]²°$]01ÿÿtÿìþË/Ha:Àj6?°EX°/±>Y°в`!r²@!r²ð!q´!!r²`$r²@$r²ð$q´$$r01ÿÿ2 &Âj­]°EX°/±>Y°EX°/±>Y01ÿÿ¶&âjÞ3²r´ßïq²_r´/?r²r´ßïq²_r´/?r01ÿÿxÿëß"&Ãj©r°EX°//±/>Y°EX°,/±,>Y01ÿÿXÿí®Ê&ãj%9²ð,q´,,r²ß,q²`,r²@,r²ð/q´//r²ß/q²`/r²@/r01iÿë-°S°/°EX°/± >Y°EX° /± >Y°±° +X!ØôY°°а ±° +X!ØôY°±° +X!ØôY01'!5!#"$77332654&##5 ý‰eþgÛñþîÝÀþ뽘y‹Ÿ¡ ’›xþ ãÇÈãÖÍr�•x™�šiþu-:G°/° /°EX°/± >Y±° +X!ØôY°±° +X!ØôY²9° ±° +X!ØôY01'!5!#"$77332654&##5øýŸeþtÖéþíÜ¿þ꽘y‹Ÿ¢ “™œxþâÄÆä×Ëp�•všŽšÿÿ´ú&ÄqÿJ² ]01ÿÿ�ü¥&äqgõÿÿ´ &ÄjÛ]°EX°/±>Y°EX° /± >Y01ÿÿ�ü¶&äjC3² r´ß ï q²_ r´/ ? r²r´ßïq²_r´/?r01ÿÿqÿë"&2j¸r°EX° /± >Y°EX°/±>Y01ÿÿaÿë*Ë&RjD/²ðq´r²`r²@r²ð q´  r²` r²@ r01ÿÿqÿëÅÿÿaÿë*Nÿÿqÿë&jÎX°EX°$/±$>Y°EX°!/±!>Y01ÿÿaÿë*ç&j-7ƒ²`!r@ À!Ð!à!ð!]@!! !0!@!P!`!p!€!�! !°!À! q²@!r²ð!q´!!r²`$r@ À$Ð$à$ð$]@$$ $0$@$P$`$p$€$�$ $°$À$ q²@$r²ð$q´$$r01ÿÿµÿìÿ#&Ùj²s°EX°&/±&>Y°EX°#/±#>Y01ÿÿcÿëãË&ùj!/²ð#q´##r²`#r²@#r²ð&q´&&r²`&r²@&r01ÿÿUÿëÈú&Ïq¨J²]01ÿÿþKè¥&\q$õÿÿUÿëÈ &Ïj„]°EX°/±>Y°EX°/±>Y01ÿÿþKè¶&\j3²r´ßïq²_r´/?r²r´ßïq²_r´/?r01ÿÿUÿëÈK&ÏY6]°EX°/±>Y°EX°/±>Y01ÿÿþKüô&\Y² ²ßq²ßq01ÿÿ“Ì &Ój®]°EX°/±>Y°EX°/±>Y01ÿÿܶ&ój&3²r´ßïq²_r´/?r²r´ßïq²_r´/?r01ÿÿ´þ™1°&n™åÿÿ�þ™?:&ß™Ÿÿÿ´C &Ø',¿jz]°EX°/±>Y°EX°/±>Y01ÿÿ­˜¶&ø'ó:j"3²r´ßïq²_r´/?r²r´ßïq²_r´/?r01ÿÿAþK}°&nL&‚¯?›ÿÿBþK¡:&ßb&‚°‘›öÿÿBþK#°&;›±ÿÿ.þK>:&[›ÌBÖ°d°EX° /± >Y°EX°/± >Y°EX°/±>Y°EX°/±>Y²9°/±° +X!ØôY² 9°а° в 901####53333Õ¬­ëþ£þ¢î­›�þkìRTîþjŸ›ýeBý¾››zýÈ8ý†.Ô:d°EX° /± >Y°EX°/± >Y°EX°/±>Y°EX°/±>Y²9°/±° +X!ØôY² 9°а° в 901####533338 <âððä;²§þÚããææþÙ•Þþ"™þgÞ›Áþq�þ?[r° ;°/°EX°/± >Y°EX°/±>Y± ° +X!ØôY°± ° +X!ØôY013!"$54$3!"3­ÅýÔéþþêgþ™”’’”p@úPöÆÅïý*; w{©ÿÿbÿëõG[n°!A°/°/°EX°/± >Y°EX°/±>Y± ° +X!ØôY°а±° +X!ØôY01!"$54$3!376676&'3#%!"3FéþþêgÅSjt¾!$ó°þèþ™”’’”öÆÅï@úé�~M§Od—HÌÚš; w{©bÿét"3Y°/°/°EX°/± >Y°EX°/±>Y°EX°/±>Y²/]°± ° +X!ØôY°±&° +X!ØôY° °-Ð0132336676&'7#&'#"5&&#"3267&&5bßÉYŒ4Å\M†”¾!$þìËx£)5¡mÆàÁ'rNއ†�Tt' @>;CûA_uÒ¹aËfz½\þöþäU]WYê=:C껤ÅIB"6ÿèÓ°,W°/°"/°EX°/± >Y°EX°)/±)>Y°±° +X!ØôY°± ° +X!ØôY²9°)±° +X!ØôY014&##532654&#!5!236676&'3#&'¿‰t¿ˆ¦“�˜þ™gïýuoviOCt€¾""þ» ®rv‘›~ƒy‡›ÔÉq¥1(°€DL_Ô·aÌf†³Zþ÷þã�«1ÿãë:,T°/° /°EX°"/±" >Y°EX°/±>Y±° +X!ØôY°±° +X!ØôY°"± ° +X!ØôY²)901%36676&'3#&'54&##'32654&#!'!2ì'/ju ¾"$ò±ŠŠjbÓ¸wqrwþú Îâ`]cYÕ*,™‰L¤Of’G׿r�KGOšSMQ_™ª˜Qr$zYPþüѰ#T° /°EX°/± >Y°EX°/±>Y° ± ° +X!ØôY°±° +X!ØôY² 9°±"° +X!ØôY01%##&&554&##532654&#!5!23Ñ–u9=)‰tÜ¢§•�˜þîïüuowiˆ.þÎ#ƒG„v‘š‚zˆ›ÔËp¦0(°€ˆ{þèÁ:"T° /°EX°/± >Y°EX°/±>Y° ± ° +X!ØôY°±° +X!ØôY² 9°±!° +X!ØôY01%##&&554&##532654&#!5!23Á–u>?%jbïÒxpqwþèÍáa^fY€þÎc3_P[šSNQ^™©™Qt$„aFEÿèu°!Z°/°EX° /± >Y°EX°/±>Y°EX°/±>Y° ±° +X!ØôY°±° +X!ØôY°±° +X!ØôY01!##532!36676&'7#&'$þ(Øú5)•…a[M‡“¾!$þì˪ºýëþrþŽš F°û©_uÒ¹aËfz½\þöþä±ÀAÿèA:!Z°/°EX° /± >Y°EX°/±>Y°EX°/±>Y° ±° +X!ØôY°±° +X!ØôY°±° +X!ØôY01!##77265!36676&'3#&'-þͲÎ9)k\½ZLkt ¿!$󱨺žþÐþÃþϨÔñÌý_u»¤\Àax¯Vôþú±À©ÿè~°¶°/° /°EX°/± >Y°EX°/± >Y°EX°/±>Y°EX°/±>Y°±° +X!ØôY²_]²¯]´ïÿ]²Oq²Ÿq²ïq²?r´�Ÿr²or²r´¿Ïq²q²q²Ï]²]²/]²¿r°±° +X!ØôY0136676&'7#&'!#3!òZM‡” ¾"$þìË©ºýAÅÅ¿°û©_uÒ¹aÊg|»\þöþä±À*ý}°ýn’�ÿèU:²°/°/°EX°/± >Y°EX°/± >Y°EX°/±>Y°EX°/±>Y²Ÿ]²ÿ]²oq´Ïßq´?Or²¯r´ßïr´or²ÿq²r²Ÿq´/?q´¿Ï]²_]²/]°±° +X!ØôY°± ° +X!ØôY01!#3!336676&'3#&'@þÅÅìÅ[Lju½"$ò²©ºÌþ4:þ+Õý_u»¤[Áa{¬Vôþú±ÀvÿëŸÅ!;°EX°/± >Y°EX°/±>Y°±° +X!ØôY°±° +X!ØôY01 !2&&#"36676&'3¹ÿþ½Cq²D?C�U¯Ïϯˆ”¾*þë^  _-+‡!#þöÃþøÆþöš‰SµaÅVNØæbÿëÆN!8°EX°/± >Y°EX° /± >Y±° +X!ØôY°±° +X!ØôY01%6674&'3#"55432&&#"Q_N ½ Ì¥æþ÷ÿÛ^Ž/./zD‰Œ•…ST:z8Ds5ž¤:ã*â:#“çš*žå$ÿèM°A°EX°/± >Y°EX°/±>Y°±° +X!ØôY°аа± ° +X!ØôY01!5!!36676&'7#&'üþ(€þ[L‡• ¿"#þìÌ©º››üD_uÒ¹`Êh|»\þöþä±ÀFÿè½:A°EX°/± >Y°EX°/±>Y°±° +X!ØôY°аа± ° +X!ØôY01!5!!36676&'3#&'¨þž‹þœZMju ½"$󱩺¡™™ý¸_u›‰L§Pg”HØç±ÀœÿëÅ*o°)/°EX°/± >Y°EX°/±>Y±° +X!ØôY²)]²ï)]²)q²Ï)]²/)]²¿)q°)±*° +X!ØôY²*)9°±"° +X!ØôY01"32653# $5467&&54$!2#4&#"33͵·Ê²œÇ¼þ¼áþþþÁއx‡*ß2¼ÃŒ²´§¯¸˜�…x•�rÍÖãÈ~­*0¦eÇØÜ°iŽ�pr„œÿÿbÿíéL�ÿÿ1þK»°&Ç›IÿÿþKÀ:&ç›Nÿÿþ…°&$ZUÿÿjþ…óN&DZœÿÿ´R&0v¦Y°EX°/±>Y²]01ÿÿ�oÜ&Pv·²¿'q¶ß'ï'ÿ'q¶''/'r01ÿÿ6Ï"&:Cë]°EX°/±>Y²]01ÿÿ-ÜË&ZCn%²¿q¶ßïÿq@/?O_or01ÿÿ6Ï&:v¥Y°EX°/±>Y²]01ÿÿ-ÜÇ&Zv(%²¿q¶ßïÿq@/?O_or01ÿÿ6Ï &:j€]°EX°/±>Y°EX°/±>Y01ÿÿ-ܶ&Zj3²r´ßïq²_r´/?r²r´ßïq²_r´/?r01ÿÿþ¯°&$`îÿÿjþ¯óN&D`RÿÿÈ&$^èR°EX° /± >Y01ÿÿjÿëó†&D^z²,]01ÿÿ$ñ&$’³Y°EX°/±>Y²à]°Ð01ÿÿjÿ뮯&D’=°2/²?2]²02r°8Ð01ÿÿà&$“ÄH°EX°/±>Y²à]°Ð01ÿÿÿ£ÿëóž&D“N°0/²?0]°5Ð01ÿÿ&$”¼4/°/´ßï]´?Oq²]´q´o]²?]°Ð01ÿÿjÿëwÅ&D”Fô°0/²?0]°5Ð01ÿÿ2&$•º6/°/´ßï]´?Oq²]´q´o]²?]°Ð01ÿÿjÿëóò&D•Jö°0/²?0]°8Ð01ÿÿþ¯H&$'R¹]`î°EX°/±>Y01ÿÿjþ¯ó&D&RN`R¶Ð0à0ð0q´00r²`0r²@0r01ÿÿß&$–çT°EX°/±>Y°Ð01ÿÿjÿëó�&D–u°0/²0]²?0]°?Ð01ÿÿß&$�çT°EX°/±>Y° Ð01ÿÿjÿëó�&D�u°5/²5]°,Ð01ÿÿw&$—òM°EX°/±>Y°,Ð01ÿÿjÿëó1&D—y°0/²0]²?0]²p0q°LÐ01ÿÿ%&$˜íQ°EX°/±>Y°Ð01ÿÿjÿëóã&D˜y°0/²0r²0]²Ï0q²?0]°?Ð01ÿÿþ¯N&$'Tëž`î°EX°/±>Y01ÿÿjþ¯ó &D&T\`R6²0q²°0q²0r²�0q² 0r´Ð0à0q²�0q¶`0p0€0]² 0]01ÿÿ´þ¹z°&(`Ë ÿÿcþ¯íN&H`”ÿÿ´zÈ&(^ÃR°EX° /± >Y01ÿÿcÿëí‡&H^}² ]01ÿÿ´zT&(X’a°EX°/±>Y01ÿÿcÿëí&HXL '²@#r²p#q´`#p#r² #r@ �# #°#À#Ð#q01ÿÿ´÷ñ&(’†Y°EX°/±>Y²à]°Ð01ÿÿcÿë±°&H’@°$/²?$]°,Ð01ÿÿÿìzà&(“—H°EX°/±>Y²à]°Ð01ÿÿÿ¦ÿëíŸ&H“Q°$/²?$]°)Ð01ÿÿ´À&(”�4/°/´ßï]´?Oq²]´q´o]²?]°Ð01ÿÿcÿëzÆ&H”Iõ°"/²?"]°)Ð01ÿÿ´z2&(•“6/°/´ßï]´?Oq²]´q´o]²?]°Ð01ÿÿcÿëíó&H•M÷°"/²?"]°,Ð01ÿÿ´þ¹zH&('R—]`Ë °EX°/±>Y01ÿÿcþ¯í&H&RQ`”"@ °$À$Ð$à$ð$q´$$r²`$r²@$r01ÿÿ¾È&,^pR°EX°/±>Y01ÿÿ™Þs&ó^Kÿý²]01ÿÿ´þ¸Ž°&,`x ÿÿ•þ¹o&L`Y ÿÿqþ¨Å&2`ÿùÿÿaþ§*N&R`�ÿøÿÿqÿëÝ&2^ g°EX°/±>Y01ÿÿaÿë*†&R^•²]01ÿÿqÿë=&2’Ìn°EX°"/±">Y²à"]°(Ð01ÿÿaÿëɯ&R’X° /²? ]°(Ð01ÿÿ2ÿëõ&2“Ý]°EX° /± >Y²à ]°%Ð01ÿÿÿ¾ÿë*ž&R“i° /²? ]°%Ð01ÿÿqÿë&2”ÕI°EX° /± >Y²à ]°%Ð01ÿÿaÿë’Å&R”aô°/²?]°%Ð01ÿÿqÿëG&2•ÙK°EX°/±>Y²à]°(Ð01ÿÿaÿë*ò&R•eö° /²? ]°(Ð01ÿÿqþ¨]&2'RÝr`ÿù°EX° /± >Y01ÿÿaþ§*&R&Ri`�ÿø¶Ð à ð q´  r²` r²@ r01ÿÿlÿëÿ &CvàGD²)]²Ï)]@ ¿)Ï)ß)ï)ÿ)q²)r²_)r´/)?)r¶)�)Ÿ)q²o)]²ð)]²@)q01ÿÿaÿëèÜ&Dvi²¿)q¶ß)ï)ÿ)q¶))/)r01ÿÿlÿëÿ&CC&KD@ ¿&Ï&ß&ï&ÿ&q²&r²_&r´/&?&r²o']´'�'q²']²Ï']´0'@'q²ð']01ÿÿaÿëèà&DC¯²¿&q01ÿÿlÿëÿÝ&C^ g°EX°&/±&>Y01ÿÿaÿëè†&D^•²&]01ÿÿlÿëÿB&CXÛO°EX°)/±)>Y01ÿÿaÿëè&DXd"´`)p)r@ �) )°)À)Ð)q²@)r² )r01ÿÿlþ¯ÿu&C` ÿÿaþ§èÇ&D`�ÿøÿÿ“þ¨Ü°&8`ÿùÿÿ‹þ¯ü:&X`Yÿÿ“ÿëÜÈ&8^R°EX°/±>Y01ÿÿ‹ÿëüs&X^“ÿýÿÿ“ÿëW&EvÛY°EX°/±>Y²]01ÿÿ‹ÿëjÇ&Fvg%²¿!q¶ß!ï!ÿ!q@!!/!?!O!_!o!!r01ÿÿ“ÿëW"&EC!]ÿÿ‹ÿëjË&FC­%²¿q¶ßïÿq@/?O_or01ÿÿ“ÿëWÈ&E^R°EX°/±>Y01ÿÿ‹ÿëjs&F^“ÿý²]01ÿÿ“ÿëWT&EXÖa°EX°/±>Y01ÿÿ‹ÿëjý&FXb ²_!r²�!q²?!r´ï!ÿ!q´!!r01ÿÿ“þ¨W7&E`ÿùÿÿ‹þ¯jË&F`YÿÿÎ!&<CÚ\°EX° /± >Y² ]01ÿÿþKèË&\Ck%²¿q¶ßïÿq@/?O_or01ÿÿþ¹Î°&<`È ÿÿþè:&\`$ÿdÿÿÎÇ&<^ÀQ°EX° /± >Y01ÿÿþKès&\^QÿýÿÿÎS&<X�`°EX° /± >Y01ÿÿþKèý&\X ²_r²�q²?r´ïÿq´r01ÿÿÿ$ÿë“&2lþ¼Îÿÿ´ˆò#FZÚS3@ÿÿ½ˆõ#FZ°ff@ÿÿ½ˆõ#FZ°ff@ÿÿþh 'BÿB@  0]´ °]01PüQ°/013#P a<Å´dþ–²PýQ°/01#53Q a<ÅWþ¦WÄPÿQù°/01%#53Q a<Åþçñÿÿ+ý,G5|À@ÿÿPüš&44IÿÿPý¢&55QPÿ… °/° Ð01%#53#53Q a<Å4 a<Å`þ±E¸þ±MºF$° L°EX°/± >Y°EX°/± >Y°EX° /± >Y°EX°/±>Y° ±° +X!ØôY°аÐ01!#!5!3!$þqÅþvŠÅ�žübžœvþŠWþ`4°~°EX° /± >Y°EX° /± >Y°EX°/± >Y°EX°/±>Y°EX°/±>Y°EX°/±>Y±° +X!ØôY°±° +X!ØôY° ааа°аÐ01!!#!5!!5!3!!!4þqÅþw‰þw‰Å�þq�þ` šœvþŠœüü‰'á °/° ° +XØÜY014632#"&5‰p^_qp__pXppXY°EX°/±>Y°EX°/±>Y°°° +XØÜY° а°$° +XØÜY°±+° +X!ØôY°±2° +X!ØôY°±9° +X!ØôY°2°@а$±G° +X!ØôY°±N° +X!ØôY0146326632#"&'#"&54632#"&5326554&#"326554&#"326554&#"'3¤ˆJu%%uJ‰¥¤ˆKv%%tIФý ¤ˆŠ¤¤ˆ‰¥…QKJPRJJPÈQKIPQJJPûEQKIQRJJPømÇme~®?66?­N€¬=77=¬€�®­€M¬¬üÌKggKNJhhJNKggKNJhhJæJgfKMJiiJûÖCrCÿÿP ÿÿPKl˜'µ °/°/01#53(ÿ”þÙ'”&þr……X˜µ °/°/01#ì'þÙ”ÿÿµþ{þ{Ž�ÿÿ«Œ°&;no# °/°/017'¨mÇmnCrCG0SÅ :°/°/°EX° /± >Y°°° +XØÜY°°а° а ° в› ]013##5!'3!'¾••¬þ9ƱþG  i�¸¸`}ý¤yz‹úº2°/°EX°/± >Y°EX°/± >Y± ° +X!ØôY°°Ð016632#4&#"#$nFz‡´GA5H´«x@G—œþÛf[6/ýÉ ÿÿw°&)‚ÿŠþ€FWÅ(¥°'/°#/°EX°/± >Y°EX°/±>Y±° +X!ØôY°в ']²¿'q²ß']²'q²o']²O'q²€'q²ð'q°'±(° +X!ØôY° а'° в?#]´##]°#±$° +X!ØôY°а#°а±° +X!ØôY01!!53667#53'#53'4632#4&#"!!!³ßü0 -/ª¥ž˜à¼Èܾ~bct¦þ`›¹S–6šš ­f›�›’ÌéѬvr•…’›�›¤ÿë°#,°/°EX°"/±" >Y°EX°/± >Y°EX°/±>Y°EX°/±>Y°"°а"±° +X!ØôY°а±° +X!ØôY°±$° +X!ØôY°±,° +X!ØôY013#3267#"&5####!2332654&##9ÍÍ?4)U+xއi‚è�Åbè‚i‡üõ�““““�?þû’ýoL>‡‘›‘•d{ý̰}e”ý�§z{ªÿÿbþìº'B¡ÿ†ÓOÿëÕÅ*z°EX°/± >Y°EX° /± >Y²*&+°*±° +X!ØôY° ±° +X!ØôY°°а*°д&&]°&±'° +X!ØôY°а&°а±!° +X!ØôY01!3267#"5#535#535432&&#"!!!’þ«“9p48{=çþã’’’’ç;uB6q8’«ìþìáŠÍ�!Õ›ˆ›ô#Ÿά›ˆ|ÿëƒÅ+9=e°/°!/°:/°Y°EX°(/±(>Y° ±° +X!ØôY°±° +X!ØôY°(±/° +X!ØôY°!±6° +X!ØôY01#"&554632#4&#"32654632#"&53326554&#"'¥–~�š™€~˜ŠF@AFGB?E¤‰ˆ¥¤‡Š¥’QLIPRIJQþmÇm i‘¬M®”g9NiJMJgP6ýE­­N€¬¬€KggKNJhhJ÷CrCjÿísÅ'Y°/°EX°/± >Y°EX°/±>Y°± ° +X!ØôY°°а±° +X!ØôY°± ° +X!ØôY° °%Ð01&55#52674632354&#"66ÎÇÍ1e47e.Ÿ‹z›Ë¯`u ,$32UZ ïÓ ´ ٱʬ�*žþ®d\‘’Ñ,LNmlþ›@Ìÿÿ«NÂ"1÷#|#ÿýÎÿg—`°j°/°EX°/± >Y°EX° /± >Y°EX°/± >Y²ï]²or²Ÿr²_q²@]²€]°°ааа°° +XØÜY°аÐ01'##333####5!–3œ]t¡¢n]ýä‘^‘€îþ§gþ›þz†ýçÇþ9ÇR˜ÿì“NS°EX° /± >Y°EX°/±>Y² 9°/°°° +XØÜY²pq° °° +XØÜY°°° +XØÜY01%#"5432!3267"!&&W¼_ÚþÎCÉÏ ý7�M_ºWþ�J�:6‹^7;IèâOþÊç/þ¸59<>*A9þë4=ÿÿkÿõR²'® †'FmK&°EX°/± >Y°EX°/±>Y°+а°7Ð01ÿÿnÿõéÀ'«”'F¿mâ&°EX°/± >Y°EX°8/±8>Y°Pа8°\Ð01ÿÿpÿõ¯'©ÿþŽ'F÷m&°EX°/± >Y°EX°-/±->Y°Eа-°QÐ01ÿÿkÿõr¯'³ Ž'F6mk&°EX° /± >Y°EX°/±>Y°2а°>Ð01Hÿë0í!1°/° /°EX°/±>Y±° +X!ØôY° ±° +X!ØôY01#"54327&&'2655&&#"çBþà×ÚþéúÚ_¨6ë°’…©$¬ˆ‡¤í?þlþÙÜõþÉÏé;4Áì4û<ä®�C\Éœ„ɨÿ-ô°(°/°EX°/± >Y°°а±° +X!ØôY01#!#!ôÅý>ÅLÓèúƒFþó®°1°/°EX° /± >Y°±° +X!ØôY° ± ° +X!ØôY01!!55!!eýÒuû˜býžüØ0$ýo›’ÉÏ“›ýg¨ˆë#°/±° +X!ØôY01!5!ëü½Cˆ›?­° >° /°EX°/± >Y°EX°/±>Y°Ð@ dt„”]° ± ° +X!ØôY01373##5!*�ÉýÛ•ø¼HTSS\úPtœhÿë»N'5[°EX°/± >Y°EX°/± >Y°EX°/±>Y°EX° /± >Y±° +X!ØôY°±$° +X!ØôY°+а°2Ð01#"&'#"5543266323275&#"!4&#"3265»úÍ¥îPPï£ÎùøÍ¤ðQOð¥Ëúùrƒ‰ÕÕŠ~‚É„|ŠÔÔ‰~„ûáþÑל›Ø/áBà1Ø›šÙþÎßBªÌl*jϧ§Ïþël*nþëÍ©ÿ¼þK“-.°/°EX°/±>Y± ° +X!ØôY°±° +X!ØôY01#"&'732654632&&#"p¬™3A;E¶¢!E*,W[Y§µ –gZ­½ ‘mbe3p²+°±° +X!ØôY° ° +XØÜY°° а ±° +X!ØôY°а°#° +XØÜY°°&а#±*° +X!ØôY°±0° +X!ØôY°*°3Ð0166363267#"&'&&"66363267#"&'&&"o/|AE@eVBB@|0 0|@BBVe@EA|//|AE@eY@A@|0 0|@BBVi=DA|/jDN2,ME®EM,2NDýDN2.MF¯EM,4NE˜§Úã8² +°±° +X!ØôY°Ð°°а °а ± ° +X!ØôY°Ð013!!!'7#5!7!5!Áþ䌨ýý…WdÇ"ŒþR “WÛ¤ü¤ð<´¤ü¤<ÿÿžç:'ZÿüýGW¼@9š1°EX°/±>Y° в ]²/ q²¯ q²¿ ]²0 q²À ]01ÿÿšò:'Zÿüý}G!¼@9š1°EX°/±>Y°в]²/q²¯q²¿]²0q²À]01)ß°)°EX°/± >Y°EX°/±>Y°°а° Ð013#!'#37·–’þq•þníþÿú°ý'ý)×22þþ22eÿz@ó°/²]´@P]°° +XØÜY01%#753@za=žgíöƒÕ-s°/°EX°/± >Y°EX°/± >Y°EX°/± >Y°EX°/±>Y°EX°/±>Y°±° +X!ØôY²/]°±° +X!ØôY°°аÐ013#5354632&&#"3#!#3ƪªÕ½C‚X"5x?ug××JÆÆ¨’u¶È hlu’üX:ÿÿ8'-&IOÃÿÿ8˜-&IdÃÿÿ8ê-&I'IÃO†[þrî® *;AGMS]aeimqu~‚†ŠŽ’–°Y°EX°g/±g >Y°EX°c/±c >Y°EX°_/±_ >Y°EX°O/±O >Y°EX° /± >Y°EX°/±>Y°EX°+/±+>Y²@]²@q²À]²@q²À]²@]²vr²?v]¶_vovv]²_vq´ßvïv]²Ovr´ïvÿvr²/vq²Ïvq°v°T° +XØÜY´T Tr²Tv9° ° ° +XØÜY² r°°'° +XØÜY²'r²À0]²@0q²@0]°0°8° +XØÜY°ˆ°=° +XØÜY°<°?° +XØÜY²/?q²O?r°<°rаnаjаBа?°sаoаkаCа=°EаI°L° +XØÜY°fаbа^аNаH°Rа°U° +XØÜY²Ur°°~° +XØÜY@ Ï~ß~ï~ÿ~q²~r°„°�° +XØÜY°H°…° +XØÜY°€°‰° +XØÜY°€°ŒÐ°�°�а„°�а…°‘аˆ°”а‰°•Ð01#"&55463232#4&#"32653#"&773326533!5353!#%5!#532654&'#5!!5!!5!5!!5!!5!32654&###535#53#53%#535#53#539€eh€€ff�C¼eo,(06i\þ„K@@JJB?Jº\jQ[iT62(7ùÄqÄ(Çoøm5Äì6oü\~253/Ðý[ý\ ý[ý\¼]:<9=]üñqqqqqq"ooooooÔbyybp`{{`þ¸%KK'> F-LOHDOODpENNEOþ†O\QM.-6,üÉ;ÊqqÊþÅt©©tþã©ü¶©+(&.Jttttttù8qqqqqqÄ((' þÓü~úüù~ü~úüù\ýÕ×b"&* 4676654&#"36632#33#3#¿üAüD(H^©“ˆ§Â;+6;3*O;ÊÊÊKRü1ü1Ïñ5='ƒN€—‚‚34?52M7ZX[ªýL �ÿÿÿ™j·&‡qÿ²]01hoÌÅ °EX°/± >Y°Ð013#%73#•fÑåRþÓ¢lR¼Œ9þÁ�ÆÌ‰pÿõ,#/Q°EX°/±>Y°EX° /± >Y²- 9°-/±° +X!ØôY° ±!° +X!ØôY°±'° +X!ØôY01#"&5467&&546324&#"3264&#"326ïI>IV¹Œ’ÀYLBJ±‡‚¬’\@F`_HAZK7=OQ<5LP;[c?p||p?dZ;issþ/3CB44==“-54..99hÿõì,'S°/°EX° /± >Y°EX°/±>Y±° +X!ØôY¶/]°±° +X!ØôY° ±"° +X!ØôY01%2655#"&54632#"&'726754&#"—H`T/‘¤´�Š·Ã’3n2+THY°EX°/±>Y°±° +X!ØôY°±° +X!ØôY°±"° +X!ØôY012&&#"6632#"&54$"32654&OB“C!:rIy›2�X¹È÷¡Xz†fi€r�”£}j4:Ƴ«ÕøÄ7Ãøý±@6-}§†bhwG� K°/°EX° /± >Y°EX°/±>Y°±° +X!ØôY°°а° а ° в{ ]²[ ]013##5!'3'RÃÃÅý¾?ÌÅþ™…šëëz(üøûþZÿï£�*…°EX°/±>Y°EX°/±>Y°±° +X!ØôY°° а±"° +X!ØôY²*"9°*/´ß*ï*]´*/*]²¯*]´Ÿ*¯*q´o**r±)° +X!ØôY²)*9°°Ð012654&#"#'&632#"&77332654&##5hcnjTr»â§ÀÝ`T`gðÀ¨ñºy_l~on¨�_TLh`GŒ®¬ P…&#Šc¡¶«¢MnmRb_–Ys�N°EX°/±>Y°EX°/±>Y±° +X!ØôY°в9°± ° +X!ØôY°° а°Ð01!!56654&#"#'&632!süó–fE\Wer¼໯Éužø˜–ar>TqsS�ʸ¨m™ ùNÃ�6°EX°/±>Y°EX°/±>Y°°° +XØÜY±° +X!ØôY01!#5%ÃŰuÞ !xÿïú� ;°EX° /± >Y°EX°/±>Y° ±° +X!ØôY°±° +X!ØôY01#"&54632'4&#"3265ú÷ÉÊø÷ÉÊøÅˆusˆ‰tt‡›ÅçèÄWÃèèÃ|•–{þ¨}—–~NØ� F°EX°/±>Y°EX°/±>Y±° +X!ØôY²9°±° +X!ØôY² 901%!!5!5!=›üv�ý¡P˜˜v~™r5�o°EX°/±>Y°EX°/±>Y°EX°/±>Y²9@ eu…•]°°в[]¶{‹›]²j]°°ж{‹›]²[]²j]013#3)/ÝþTÅþZÝM@ý þf£ê7B� a°EX°/±>Y°EX° /± >Y°EX°/±>Y°EX°/±>Y² 9@ Ueu…•]² 9²[]¶zŠš]013##3:éþx‘æþáþãé’þwèܱý¿ý´ºþFLA?À�€°EX°/±>Y°EX°/±>Y°EX°/±>Y°EX° /± >Y°EX°/±>Y° °жCSc]²4]´q�]²�]°а° д� � ]@ L \ l | ]017373###3ÇݷݳÓþÚ¶áãµþÚÓƒü{ƒûsWü©�'ƒ� @°EX°/±>Y°EX°/±>Y°EX°/±>Y°дDT]@ br‚’]01373#3;AÓþ.¹þ/Ó)RPfûs�‰ÿït�6°EX°/±>Y°EX°/±>Y°EX°/±>Y± ° +X!ØôY01#"$533265tþéßÝþèÄ©ˆ‰©�ýÃÜÜÃÿý{Œ‹|ÿGÑ�/°EX°/±>Y°EX°/±>Y°±° +X!ØôY°Ð01!#!5!Ñþ›Åþ Šôü ô™]ÿï�'_°EX° /± >Y°EX°/±>Y² 9´©¹]´)]°±° +X!ØôY° ±° +X!ØôY°±%° +X!ØôY014&'&&54632#4&#"#"$773326L|¢ßËóÎÒ뻄w}s²×ÌþÚÊþî¼£vƒ�0GX(:•–“®º¨\s]JIQ+:œ‘š¨ª¸ld^™,�#a°/°EX°/±>Y°EX°/±>Y°EX°/±>Y²¿q²/q² ]°±° +X!ØôY² 9°±"° +X!ØôY01#!2#&&554&#%!2654&#!^ÅÍÍác`h[ Ë hbþÙxpqwþøßþ!�´¢Y~'�iv-Vb4tZdš^X\ipÿŠš�!B°EX°/±>Y°EX° /± >Y² 9°±° +X!ØôY° ±° +X!ØôY01'#"55432'4&#"3265[40£‡§8…IßþéßàŤŽ�¢£ŽŽ¢ÍY›<Ÿt¡ ÕóÔ þ÷Ô—¬¬—ôš¬¬š‹ÿëRÅ ;°EX° /± >Y°EX°/±>Y° ±° +X!ØôY°±° +X!ØôY01#"32'4&#"3265RþþààþûßàÅ“Œ‹“•‹Œ‘+þéþ×*Y+þÕþê*½¿¿½þU½ÁÀ¾pÿï[� ;°EX° /± >Y°EX°/±>Y° ±° +X!ØôY°±° +X!ØôY01#"55432'4&#"3265[þëàßþéßàŤŽ�¢£ŽŽ¢ÍÖþø ÕóÔ þ÷Ô—¬¬—ôš¬¬š™v� p°EX°/±>Y°EX° /± >Y°EX°/±>Y°EX°/±>Y°°ж}��]´\l]²K]°°Ð@ $4DT]@ csƒ“]01!##373vÄý²ÅÅNÄ[ü§�ü¥Y’ˆ#°/±° +X!ØôY01!5!ý�ˆ›™U�ƒ°EX°/±>Y°EX°/±>Y°EX°/±>Y°EX°/±>Y°EX° /± >Y°°Ð²%]@ dt„”]´CS]°°д�Ÿ]@ L\l|]²+]° Ð0133#'##3÷böÅþ´ˆþ®ÅþŠûs)üÕ=üÅ�™k�)°EX°/±>Y°EX°/±>Y±° +X!ØôY01%!!3^ ý.Ř˜�™A�’°/°EX°/±>Y°EX°/±>Y°EX°/±>Y°EX°/±>Y²�]´ßï]²Oq²ßq²Or´or²r´Ÿ¯q²q²¿]²_]²]°±° +X!ØôY² 901##333#ÁcÅÅT„çþ9èñôþ �þüýÖý§@ÿïw�)°EX°/±>Y°EX°/±>Y± ° +X!ØôY013#"&7733265³Äã¯Ãâ¼vkXv�üժɲªeeyb™]�°EX°/±>Y°EX°/±>Y01!#3]ÄÄ�™Z� n|°/°EX°/±>Y°EX° /± >Y°EX°/±>Y°EX°/±>Y²ß]²or²¯]²ßr²r²p]²@]°±° +X!ØôY01!#!#3!3ZÆýÊÅÅ6Æëþ�ý÷ pÿïK� T°/°EX° /± >Y°EX°/±>Y² 9° ±° +X!ØôY°±° +X!ØôY°±° +X!ØôY01%#"55432#4&#"32675!5!K-òµçþà"áÞó¼‘~Œ²°’i‰þþÅ�Am ÕóÓ É�en¸‹ôޏ*úš™Ê� O|°/°EX°/±>Y°EX°/±>Y²Ÿq²@]²p]°±° +X!ØôY°±° +X!ØôY01!#!!!sýëÅ1ý”õþ �™þ›™È� V°EX°/±>Y°EX°/±>Y² 9° /²¯ ]±° +X!ØôY°±° +X!ØôY°±° +X!ØôY01!!!!!!qýíjüÑ/ý–þ†˜�™þ¸™1� ;°EX°/±>Y°EX°/±>Y°± ° +X!ØôY°± ° +X!ØôY013!2#326554&#™¥Ó þàÓàà~°°~�þóÑÒÒþõôü¤º‹Ó‰»pÿï&�;°EX° /± >Y°EX°/±>Y° ±° +X!ØôY°±° +X!ØôY01#"55432#4&#"3265þýÎÏþëÏÔþ½Ž€{¤¤{Ž}½Ë ÒóÑ Ë»yzº‰ô‹»z|™ �!v|°/°EX°/±>Y°EX°/±>Y²q´`pq²Ÿq²0q²p]²@]°±° +X!ØôY²9°±° +X!ØôY°± ° +X!ØôY013!2#!2654&'#%32654&##™�Õí^WftÝÅþó mojg þóÈ|�{‚È�ŸŸT‚!–`¢§ þ�^XTd�YUVF Œz°/°° +XØÜY0173# yaÅ ÷þÿŠ�ßà‹[° /²? ]°° +XØÜY@ O_oq°° +XØÜY²q²ÿq@ /?r°° +XØÜY°° +XØÜY°°Ð01#'73#"&7733265ówȳo¤‹Œ¤—EKIFÆ¿ÛYrrY3??3'Š� ]°EX°/±>Y°EX°/±>Y°EX°/±>Y²9°/´�Ÿ]± ° +X!ØôY°° д� Ÿ ]¶\ l | ]01!#3#!#WþgÌÕºÔËýÖ‡Á þô�ûs¦òxäq˜ @°/°° +XØÜY¶/?Or°° +XØÜY°°а° ° +XØÜY° ° +XØÜY013#'#'3#™ž Ƨ§Ç&ÓÌ“ëþÿ��®þüÿUäM˜ @°/°а°° +XØÜY¶/?Or°° +XØÜY°° ° +XØÜY° ° +XØÜY01#'#'3#3Mǧ§Æ žþ‡“ËÒê��Wnä1Ñа/°а°° +XØÜY´àðq´r¶€� ]@ 0@P`pq°° +XØÜY@O_o�Ÿ¯¿Ïßï q°° ° +XØÜY° ° +XØÜY°° +XØÜY°° +XØÜY01#'#'3'6654HMªÄÄ© ÆôB7K>‰K9꺺}… " ^WK=@=näMü”°/°а°° +XØÜY´� ]@ @P`pq´r°° +XØÜY@O_o�Ÿ¯q° ° +XØÜY°° +XØÜY° °а°° +XØÜY´/?q° °° +XØÜY´/?q°°Ð01#'#'37#"&#"'46323265MªÄÄ©!�¶aB5q&3P`B*{'6ê°°úEkG;"EoE8#�ßà‹b°/° ° +XØÜY@ Ÿ ¯ ¿ Ï r@ O _ o  q° ° +XØÜY² q²ÿ q@   / ? r°а °° +XØÜY°° +XØÜY01#"&7733265'3#ؤ‹Œ¤—EKIF]›Ÿj°YrrY3??3ÛÀ�àÊ* x°/° ° +XØÜY@ Ÿ ¯ ¿ Ï ß r@ O _ o  q° ° +XØÜY² q²ÿ q@   / ? r°а °° +XØÜY°° +XØÜY°° +XØÜY°° +XØÜY01#"&7733265''66'56Hž†‡ž�DHGD¼I<QFŽ˜S?°YqqY2@?38~SNB57?�ÛÓÔ#‚°/° ° +XØÜY¶O _ o q@ Ÿ ¯ ¿ Ï r° ° +XØÜY²ÿ q¶  / r² q°а °° +XØÜY°° +XØÜY°°а°° +XØÜY°° ° +XØÜY°°#Ð01#"&7733265#"&#"'46323265Ë ˆ‰¡”CJGE”_G:|)"-X^I-‡+ 0°[tt[4AA4 KkL4%JoL3&`þ™%�°/01#3%ÅÅþ™þcÉC°/± ° +X!ØôY017#"&'732654&'øih…fD`'!7"=6F;C4�Lcn{ 0*1W.ÿ¾þKrš°EX°/±>Y± ° +X!ØôY01%#"&'732655r¬™3@Y°EX°/±>Y°°° +XØÜY±° +X!ØôY01!#5%*ÅþÖïðŽ6[%ÅR°EX°/± >Y°EX°/±>Y±° +X!ØôY²9²9°± ° +X!ØôY°° а°Ð01!!56654&#"#'&32!%üQÝ€Zi—�½æÄé�þ�¼‡�¨Xm•›Œ¼å±wï‰þ_tÿë$Å*~°/°EX°/± >Y°EX°/±>Y²Ï]²q²¿q²ï]²]²/]°±° +X!ØôY°° а±*° +X!ØôY²*9°° а±#° +X!ØôY0132654&#"#'&632#"$77332654&##™¬Žv†ƒs‹½úÈÓûrr‰qþïÓÇþû¼�{†™ˆ’¬3‚v}‚‡p¥ç×ÇZ³/+¸rÇä׸sˆˆ…‡€Fa° H°/°EX° /± >Y°EX°/±>Y°±° +X!ØôY°°а° а ° д‹ › ]013##!53!'˜ÉÉÄýr‚Ðý€¼êšþ°Poñü:»/§ÿë"°Y°/°EX°/± >Y°EX°/±>Y°±° +X!ØôY°°а±° +X!ØôY°±° +X!ØôY°°Ð01!!6676#"&77332654&#"¾TÙýÎ0.qJÉçëá¹ö³ˆm}ŠŒ{th‘¯þg"-þöáÛþöÊÄwƒ°™�³FH“ÿëFÅ'Q°EX°/± >Y°EX°/±>Y°±° +X!ØôY²9°/±° +X!ØôY°±"° +X!ØôY012&&#"6632#""32654&²K“0*1kHœ¿@¥_Ãè÷ÎÖþè8¤eŽ%ª€y‡‘Å"—úÉ8?þòÏâþã6\ýoRDvÉÚ͘�ºÎ° ,°EX° /± >Y°EX°/±>Y° ± ° +X!ØôY01#7!5!Îóª%Å'ßÀý°þÅþþ¨��X›}ÿëXÅ#/c°EX°/± >Y°EX° /± >Y²- 9°-/²Ï-]±° +X!ØôY²-9°°а ±!° +X!ØôY°±'° +X!ØôY01#"$5467&&546324&#"3264&#"326/…rƒ�þîÛßþñ™„r‚øËÉýœª€ƒ¤¢‡ƒ¥)‘prŒ�sqŽ4r«*,¼{ÊÕÕÊ|»,)¬rÀÑÑüšw›™y|�Žlމqo††bÿëÅ'J°/°EX° /± >Y°EX°/±>Y±° +X!ØôY°±° +X!ØôY° ±"° +X!ØôY01%2655#"5432#"&'726754&#"�­1“ZÓø¼äþãåMŸ?;rm‘ “�l˜�…Ú×BGIåÛþãþëþ¥þãþЗý^I~¿ÄÁ—–º™� >°/°EX°/±>Y°EX°/±>Y°± ° +X!ØôY°±° +X!ØôY01#!2#%!2654&#!^ÅÒËééËþó uyyuþó¤þ\�Ð¥¦Îš~Z\‚Zÿï¨�`°EX°/±>Y°EX°/±>Y°±° +X!ØôY²9°/°°а±° +X!ØôY°±° +X!ØôY°°Ð01!!6676#"&?32654&#"‡G¦þ!%r8µÌÒÛ²ï½{cvroefcø•¤þÊ%ʹ²Ò¡�Sg|nk}95xÿõ,'Q°EX°/±>Y°EX°/±>Y°±° +X!ØôY²9°/±° +X!ØôY°±"° +X!ØôY012&&#"6632#"&5546"32654&Þ5l+'R3Si$e?„”¶��¹Í€@SVDGTJ,^NB"&Œzv’ª‡Ö‡©þV,& NaK;?Frÿõö!^°EX°/±>Y°EX°/±>Y°±° +X!ØôY²9°/±° +X!ØôY°±° +X!ØôY²9°°Ð01!!6676#"&?32654&#"’4þ•O*„–Ÿ¦‰¶¢RDNLMCACZÇ…¹‘€z�nj 06EBBQ"W(! E°EX° /± >Y°EX°/±>Y² 9°/±° +X!ØôY°°а° а °Ð013##5!'33'ª~~ªþ_¦­þcó ‚˜˜f#ýù6jÿõä,*€°EX°/±>Y°EX°/±>Y°±° +X!ØôY°° в*9°*/´**]¶/*?*O*q²ÿ*q´**r±)° +X!ØôY²)*9°°а±"° +X!ØôY012654&#"#'&632#"&77332654&##5¨CAIE8E¢©~‘¨G>FL´’µ£K?HTII„×94+:0(^wwn7[`Do|to.9;0>9~qÊ,N°EX°/±>Y°EX°/±>Y±° +X!ØôY°в9°± ° +X!ØôY°° а°Ð01!!56654&#"#'&632!Êý°.E,9:CI¡¨�‡˜Yt™i‚@2cŒ€tPpi‡›=trO°/²/q²?]²]²_]°° +XØÜY°° +XØÜY°° +XØÜY°° +XØÜY°°° +XØÜY013#4632#"&732654&#"«ÇØ�€fIFdcGIfX3$"11"$3r³ØH__HH\\H#10$%33_Œ,6°EX°/±>Y°EX°/±>Y°°° +XØÜY±° +X!ØôY01!##5%Œ®-�†xÿõ, ;°EX° /± >Y°EX°/±>Y° ±° +X!ØôY°±° +X!ØôY01#"&554632'4&#"3265»—™»º˜˜¼­YNNXYOMXˆžžˆë†  †LVVLìNVVNGÿï �'N°EX° /± >Y°EX°/±>Y±° +X!ØôY² 9°/±° +X!ØôY° ±"° +X!ØôY01%2655#"&54632#"&'726754&#"Þl‘-HÃÝð¾¹òÿÂD”CY°EX° /± >Y²- 9°-/²¯-]´-/-]±° +X!ØôY²-9°°а ±!° +X!ØôY°±'° +X!ØôY01#"&5467&&546324&#"3264&#"326¦fVfy÷¹Âÿ{j[h鴬㣋ai‘‘kbˆ#wR]{}]St\W„%'�^¢¶¶¢^‘&%„W™¨¨ýVTooTWmmdJb^NMccGg� ,°EX° /± >Y°EX°/±>Y° ± ° +X!ØôY01#57!5!g½£ÅçŽý� ôèþÀþí¹¹ –™™_¬! /°EX° /± >Y°EX°/±>Y° ± ° +X!ØôY°Ð01#547!5!¬†o¬›Yþ`MžžË¶µSƒÿÿ�¤Ø°Tÿÿÿö1�&Œ‚ÿdÿ}/²q²Ÿq²or´/]´r²Oq²ÿ]²_]01ÿÿÿö1�&Œ‚ÿdÿ}4²¯]²q²Ÿq²or´r²Oq²ÿ]²_]´/]01ÿÿGÑ�&{‚-ú² ]01ÿÿ'Šß&‘C¾/¶¿ Ï ß ]²Ÿ q²ß q² ]²¿ q²/ q²� ]²o ]01ÿÿ'ŠÛ&‘vxJ´¿Ï]²Ÿq²ïq²/q²�]²o]²ßq²]²ÿq@ /?Or²¿q²ß]01ÿÿ'Š&‘Rx²o ]²ßq²]²¿]²�]01ÿÿ'Š&‘Xs%@ /?Oq²]²�q²�]²o]01ÿÿ'ŠÊ&‘jS[² q@ � Ÿ ¯ ¿ q² ]²ß q´_ o q²� ]²o ]²�]´_oq²ßq@ �Ÿ¯¿q²q²o]²]01ÿÿ'ŠI&‘Vÿg5²/q²]²Oq²ß]²¿]²ß]²Oq²/q²¿]²]01ÿÿ'Šâ&‘­p°EX°/±>Y°ܰа° Ð01ÿÿpþH&�&�zmÿûÿÿ™Èß&‹CŠ/¶¿ Ï ß ]²Ÿ q²ß q² ]²¿ q²/ q²� ]²o ]01ÿÿ™ÈÛ&‹vDD´¿Ï]²Ÿq²/q²�]²o]¶ßïÿq@ /?Or²]²¿q²ß]01ÿÿ™È&‹RD²o ]²ßq²]²¿]²�]01ÿÿ™ÈÊ&‹j[² q@ � Ÿ ¯ ¿ q² ]²ß q´_ o q²� ]²o ]²�]´_oq²ßq@ �Ÿ¯¿q²q²o]²]01ÿÿÿ·]ß&‡Cÿe/¶¿Ïß]²Ÿq²ßq²]²¿q²/q²�]²o]01ÿÿ™AÛ&‡vD´¿Ï]²Ÿq²/q²�]²o]¶ßïÿq@ /?Or²]²¿q²ß]01ÿÿÿÊ0&‡Rÿ²o]²ßq²]²¿]²�]01ÿÿÿ¤UÊ&‡jþú[²q@ �Ÿ¯¿q²]²ßq´_oq²�]²o]²�]´_oq²ßq@ �Ÿ¯¿q²q²o]²]01ÿÿ™v&�X’%@ /?Oq²]²�q²�]²o]01ÿÿpÿï[ï&€C¾*A²Àq²o]¶¿Ïß]²]²�]²ð]´q² q@ 0@P`p€q01ÿÿpÿï[ë&€vx&;²�]²Ï]²À q²¿ ]² ]²ß ]²o ]²  q@ 0 @ P ` p € q01ÿÿpÿï[&€Rx*:²� ]² ]²¿ ]²o ]²ð ]@  0 @ P ` p € �   ° À q01ÿÿpÿï[!&€Xs.$²o]²]²�]¶Ðàð]¶P`pq01ÿÿpÿï[Ú&€jS*W²Àq²o]²]²�]²ð]²pq@  0@q²p q²o ]² ]²� ]²À q@  0 @ q²ð ]01ÿÿ‰ÿïtà&zCÛ*¶¿Ïß]²Ÿq²]²¿q²/q²�]²o]01ÿÿ‰ÿïtÜ&zv•B²�]²Ÿq²Ï]²¿]²/q¶ßïÿq¶/r²¿q²ß]²o]²]01ÿÿ‰ÿït&zR•²¿]²]²�]²o]01ÿÿ‰ÿïtË&zjpQ²q@ �Ÿ¯¿q²]´_oq²�]²o]²�]´_oq@ �Ÿ¯¿q²q²o]²]01ÿÿ5Ú&vvFG²� ]²Ÿ q²Ï ]²¿ ]²/ q¶ß ï ÿ q@   / ? O r²¿ q²ß ]²o ]² ]01ÿÿ'Š·&‘qw² ]01ÿÿ'Š &‘T©[²]²�q´_oq01ÿÿ'þP½�&‘Wêÿÿpÿï&ë&�vh&;²!]²Ï!]²�!]²À"q²ß"]²o"]²¿"]² "q@ 0"@"P"`"p"€"q01ÿÿpÿï&&�Rh*:²�"]²"]²¿"]²o"]²ð"]@"" "0"@"P"`"p"€"�" "°"À" q01ÿÿpÿï&Ú&�U8*L²ð]²q²Àq²r²�]²ß]²]²¿]²o]´àðq@ 0@P`pq²q01ÿÿpÿï&&�S+:²�"]²"]²¿"]²o"]²ð"]@"" "0"@"P"`"p"€"�" "°"À" q01ÿÿ™1&ŒS,²¿]²]²�]²o]01ÿÿ™È·&‹qC² ]01ÿÿ™È &‹Tu[²]²�q´_oq01ÿÿ™ÈÊ&‹U7² ]²� ]²ß ]²ß q@ � Ÿ ¯ ¿ q²¿ ]²o ]²ð q² r01ÿÿ™þPÈ�&‹Wÿÿ™È&‹S[²¿]²]²�]²o]01ÿÿpÿïK&‰Rt*:²�%]²%]²¿%]²o%]²ð%]@%% %0%@%P%`%p%€%�% %°%À% q01ÿÿpÿïK&‰T¥k²p%r² %]²p%q²@%q01ÿÿpÿïKÚ&‰UD*L²ð!]²!q²À"q²"r²�"]²ß"]²"]²¿"]²o"]´à"ð"q@ "0"@"P"`"p"q²"q01ÿÿpþK�&‰cYþ›ÿÿ™Z&ˆR²¿]²]²ßq²�]²o]01ÿÿÿ¡W&‡Xÿ%@ /?Oq²]²�q²�]²o]01ÿÿ‰ÿït &zY"=´_oq@ �Ÿ¯¿q²ß]²¿]@ �Ÿ¯¿q²¿]´_oq²ß]01ÿÿÿÑ( &‡TÿP[²]²�q´_oq01ÿÿ<þPË�&‡Wøÿÿ�iÊ&‡Uï7²]²�]²ß]²ßq@ �Ÿ¯¿q²¿]²o]²ðq²r01ÿÿ@ÿïBü&†R1:²ïq²¿]²ÿq@/?O_or²]²ßq²�]²o]01ÿÿ™þ!A�&…cþ§ÿÿkk«&„vèæ`²Ÿ q² ]²Ï ]²� ]²ß ]²¿ q@ ¯ ¿ Ï ß r²ÿ r¶ß ï ÿ q@  / ? O _ o  � r²/ q²¿ ]²o ]01ÿÿ™þ#k�&„cãþ©ÿÿ™kŽ&„cK›°EX° /± >Y01ÿÿ™k�&„U1ý* °/²]01ÿÿ™vÛ&�v—?²Ÿq²�]²/q¶ßïÿq@ /?Or²¿q¶¿Ïß]²o]²]01ÿÿ™þ#v�&�c{þ©ÿÿ™v&�S®²¿]²]²�]²o]01ÿÿpÿï[Ç&€qw²]@ 0@P`pr¶� °r01ÿÿpÿï[&€T©k²p r² ]²p q²@ q01ÿÿpÿï[&€Y*Q²ð]@  0@q²Àq²pq²¿ ]²ß ]²À%q²¿%]²ß%]²p%q²ð%]@ %% %0%@%q01ÿÿ™,Û&}v%A²Ÿ'q¶¿(Ï(ß(]²¿(q²(]¶ß(ï(ÿ(q@ ((/(?(O(r²/(q²�(]²o(]01ÿÿ™þ#,�&}c þ©ÿÿ™,&}S<²¿(]²(]²�(]²o(]01ÿÿ]ÿïë&|vP&5@ 0,@,P,`,p,€,q²�,]²,]¶¿,Ï,ß,]²o,]²À,q² ,q01ÿÿ]ÿï&|RP*:²�,]²,]²¿,]²o,]²ð,]@,, ,0,@,P,`,p,€,�, ,°,À, q01ÿÿ]þH�&|zUÿûÿÿ]ÿï&|Sg+:²�,]²,]²¿,]²o,]²ð,]@,, ,0,@,P,`,p,€,�, ,°,À, q01ÿÿGþ#Ñ�&{c þ©ÿÿGÑ&{S=²¿ ]² ]²� ]²o ]01ÿÿ‰ÿït&zX� @ /?Oq²]²�]²o]01ÿÿ‰ÿït¸&zq”²]01ÿÿ‰ÿït &zTÆ\²�q²]´_oq² ]01ÿÿ‰ÿïtJ&zVh5²/q²]²Oq²ß]²¿]²ß!]²O!q²/!q²¿!]²!]01ÿÿ]ÿï‚�&||qÿÿNØ&uS:²¿]²]²�]²o]01ÿÿNØÊ&uUó7² ]²� ]²ß ]²ß q@ � Ÿ ¯ ¿ q²¿ ]²o ]²ð q² r01ÿÿNØÛ&uv#A²Ÿ q¶¿Ïß]²¿q²]¶ßïÿq@ /?Or²/q²�]²o]01ÿÿ5É&vj!c² q@ � Ÿ ¯ ¿ q² ]¶ß ï ÿ q´_ o q²� ]²o ]²� ]´_ o q¶ß ï ÿ q@ � Ÿ ¯ ¿ q² q²o ]² ]01ÿÿ5&vRF&²ï q²¿ ]²ÿ q² ]²ß q²� ]²o ]01ÿÿ?À&xR²¿]²]²ßq²�]²o]01ÿÿ‰þPt�&zWvJ%,FTj x ˜ ž ¨ .»*éF >  Q ] 4k Ÿ ,» ç @ C O &c \‰ TåFont data copyright Google 2012RobotoRegularGoogle:Roboto Regular:2013Roboto RegularVersion 1.100141; 2013Roboto-RegularRoboto is a trademark of Google.GoogleGoogle.comChristian RobertsonLicensed under the Apache License, Version 2.0http://www.apache.org/licenses/LICENSE-2.0Font data copyright Google 2012RobotoRegularGoogle:Roboto Regular:2013Roboto RegularVersion 1.100141; 2013Roboto-RegularRoboto is a trademark of Google.GoogleGoogle.comChristian RobertsonLicensed under the Apache License, Version 2.0http://www.apache.org/licenses/LICENSE-2.0ÿjd   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`a¬£„…½–膎‹�©¤Šƒ“òó�—ˆÞñžªõôö¢­ÉÇ®bc�dËeÈÊÏÌÍÎéfÓÐѯgð‘ÖÔÕhëí‰jikmln oqprsutvwêxzy{}|¸¡~€�ìîº   ýþ  ÿøù !"#$%&'()*+,-./0×123456789:;<=>?âã@ABCDEFGHIJKLMN°±OPQRSTUVWXûüäåYZ[\]^_`abcdefghijklmn»opqræçs¦tuvwxyz{|}~€�‚ØáÛÜÝàÙ߃„…†‡ˆ‰Š‹Œ�Ž��‘’“”•–—˜™š›œ�žŸ ¡¢£¤¥¦§¨©ª«Ÿ¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁ›ÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€�‚ƒ„…†‡ˆ‰Š‹Œ�Ž��‘’“”•–—˜™š›œ�žŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUV²³WX¶·ÄY´µÅ‚‡Z«Æ[\¾¿]¼^_÷`abcdefŒghijk˜š™ï¥’œ§�”•¹lÀmnopqrstuvwxyz{|}~€�‚ƒ„…†‡ˆ‰Š‹Œ�Ž��‘’“”•–—˜™š›œ�žŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ     NULLuni00ADmacronperiodcenteredAmacronamacronAbreveabreveAogonekaogonek Ccircumflex ccircumflexuni010Auni010BDcarondcaronDcroatdcroatEmacronemacronEbreveebreve Edotaccent edotaccentEogonekeogonekEcaronecaron Gcircumflex gcircumflexuni0120uni0121 Gcommaaccent gcommaaccent Hcircumflex hcircumflexHbarhbarItildeitildeImacronimacronIbreveibreveIogonekiogonek IdotaccentIJij Jcircumflex jcircumflex Kcommaaccent kcommaaccent kgreenlandicLacutelacute Lcommaaccent lcommaaccentLcaronlcaronLdotldotNacutenacute Ncommaaccent ncommaaccentNcaronncaron napostropheEngengOmacronomacronObreveobreve Ohungarumlaut ohungarumlautRacuteracute Rcommaaccent rcommaaccentRcaronrcaronSacutesacute Scircumflex scircumflex Tcommaaccent tcommaaccentTcarontcaronTbartbarUtildeutildeUmacronumacronUbreveubreveUringuring Uhungarumlaut uhungarumlautUogonekuogonek Wcircumflex wcircumflex Ycircumflex ycircumflexZacutezacute Zdotaccent zdotaccentlongsOhornohornUhornuhornuni01F0 Aringacute aringacuteAEacuteaeacute Oslashacute oslashacute Scommaaccent scommaaccentuni0237uni02BCuni02F3 gravecomb acutecomb tildecombhookuni030Fdotbelowtonos dieresistonos Alphatonos anoteleia EpsilontonosEtatonos Iotatonos Omicrontonos Upsilontonos OmegatonosiotadieresistonosAlphaBetaGammaDeltaEpsilonZetaEtaThetaIotaKappaLambdaMuNuXiOmicronPiRhoSigmaTauUpsilonPhiChiPsi IotadieresisUpsilondieresis alphatonos epsilontonosetatonos iotatonosupsilondieresistonosalphabetagammadeltaepsilonzetaetathetaiotakappalambdauni03BCnuxiomicronrhosigma1sigmatauupsilonphichipsiomega iotadieresisupsilondieresis omicrontonos upsilontonos omegatonosuni03D1uni03D2uni03D6uni0400uni0401uni0402uni0403uni0404uni0405uni0406uni0407uni0408uni0409uni040Auni040Buni040Cuni040Duni040Euni040Funi0410uni0411uni0412uni0413uni0414uni0415uni0416uni0417uni0418uni0419uni041Auni041Buni041Cuni041Duni041Euni041Funi0420uni0421uni0422uni0423uni0424uni0425uni0426uni0427uni0428uni0429uni042Auni042Buni042Cuni042Duni042Euni042Funi0430uni0431uni0432uni0433uni0434uni0435uni0436uni0437uni0438uni0439uni043Auni043Buni043Cuni043Duni043Euni043Funi0440uni0441uni0442uni0443uni0444uni0445uni0446uni0447uni0448uni0449uni044Auni044Buni044Cuni044Duni044Euni044Funi0450uni0451uni0452uni0453uni0454uni0455uni0456uni0457uni0458uni0459uni045Auni045Buni045Cuni045Duni045Euni045Funi0460uni0461uni0462uni0463uni0464uni0465uni0466uni0467uni0468uni0469uni046Auni046Buni046Cuni046Duni046Euni046Funi0470uni0471uni0472uni0473uni0474uni0475uni0476uni0477uni0478uni0479uni047Auni047Buni047Cuni047Duni047Euni047Funi0480uni0481uni0482uni0483uni0484uni0485uni0486uni0488uni0489uni048Auni048Buni048Cuni048Duni048Euni048Funi0490uni0491uni0492uni0493uni0494uni0495uni0496uni0497uni0498uni0499uni049Auni049Buni049Cuni049Duni049Euni049Funi04A0uni04A1uni04A2uni04A3uni04A4uni04A5uni04A6uni04A7uni04A8uni04A9uni04AAuni04ABuni04ACuni04ADuni04AEuni04AFuni04B0uni04B1uni04B2uni04B3uni04B4uni04B5uni04B6uni04B7uni04B8uni04B9uni04BAuni04BBuni04BCuni04BDuni04BEuni04BFuni04C0uni04C1uni04C2uni04C3uni04C4uni04C5uni04C6uni04C7uni04C8uni04C9uni04CAuni04CBuni04CCuni04CDuni04CEuni04CFuni04D0uni04D1uni04D2uni04D3uni04D4uni04D5uni04D6uni04D7uni04D8uni04D9uni04DAuni04DBuni04DCuni04DDuni04DEuni04DFuni04E0uni04E1uni04E2uni04E3uni04E4uni04E5uni04E6uni04E7uni04E8uni04E9uni04EAuni04EBuni04ECuni04EDuni04EEuni04EFuni04F0uni04F1uni04F2uni04F3uni04F4uni04F5uni04F6uni04F7uni04F8uni04F9uni04FAuni04FBuni04FCuni04FDuni04FEuni04FFuni0500uni0501uni0502uni0503uni0504uni0505uni0506uni0507uni0508uni0509uni050Auni050Buni050Cuni050Duni050Euni050Funi0510uni0511uni0512uni0513uni1E00uni1E01uni1E3Euni1E3FWgravewgraveWacutewacute Wdieresis wdieresisuni1EA0uni1EA1uni1EA2uni1EA3uni1EA4uni1EA5uni1EA6uni1EA7uni1EA8uni1EA9uni1EAAuni1EABuni1EACuni1EADuni1EAEuni1EAFuni1EB0uni1EB1uni1EB2uni1EB3uni1EB4uni1EB5uni1EB6uni1EB7uni1EB8uni1EB9uni1EBAuni1EBBuni1EBCuni1EBDuni1EBEuni1EBFuni1EC0uni1EC1uni1EC2uni1EC3uni1EC4uni1EC5uni1EC6uni1EC7uni1EC8uni1EC9uni1ECAuni1ECBuni1ECCuni1ECDuni1ECEuni1ECFuni1ED0uni1ED1uni1ED2uni1ED3uni1ED4uni1ED5uni1ED6uni1ED7uni1ED8uni1ED9uni1EDAuni1EDBuni1EDCuni1EDDuni1EDEuni1EDFuni1EE0uni1EE1uni1EE2uni1EE3uni1EE4uni1EE5uni1EE6uni1EE7uni1EE8uni1EE9uni1EEAuni1EEBuni1EECuni1EEDuni1EEEuni1EEFuni1EF0uni1EF1Ygraveygraveuni1EF4uni1EF5uni1EF6uni1EF7uni1EF8uni1EF9uni1F4Duni2000uni2001uni2002uni2003uni2004uni2005uni2006uni2007uni2008uni2009uni200Auni200Buni2015 underscoredbl quotereverseduni2025minutesecond exclamdbluni2074 nsuperiorlirapesetauni20ABEurouni2105uni2113uni2116 estimated oneeighth threeeighths fiveeighths seveneighths commaaccentuniFB02uniFB03uniFB04uniFEFFuniFFFCuniFFFD Imacron.smcp dasiaoxia eight.supnine.supsix.smcp four.smcp three.smcptwo.smcpone.smcp zero.smcpZ.smcpY.smcpX.smcpW.smcpV.smcpU.smcpT.smcpS.smcpR.smcpQ.smcp zero.lnumO.smcpN.smcpcrossbarM.smcpL.smcpK.smcpJ.smcpI.smcpH.smcpG.smcpF.smcpE.smcpD.smcpC.smcpB.smcpcommaaccentrotatebrevegravecombA.smcpcircumflexacutecombcircumflexgravecombcircumflexhookcombcircumflextildecombbreveacutecomb brevehookcombbrevetildecomb cyrillicticcyrillichookleft cyrillichooklargerighthookone.lnumtwo.lnum three.lnum four.lnum five.lnumsix.lnum seven.lnum eight.lnum nine.lnumP.smcp five.smcpsix.supfive.supfour.sup three.suptwo.sup ringacuteone.supzero.sup nine.smcp eight.smcp seven.smcp seven.sup cyrillicbreve Dcroat.smcpEth.smcp Tbar.smcp Agrave.smcp Aacute.smcpAcircumflex.smcp Atilde.smcpAdieresis.smcp Aring.smcpAringacute.smcp Ccedilla.smcp Egrave.smcp Eacute.smcpEcircumflex.smcpEdieresis.smcp Igrave.smcp Iacute.smcpIcircumflex.smcpIdieresis.smcp Ntilde.smcp Ograve.smcp Oacute.smcpOcircumflex.smcp Otilde.smcpOdieresis.smcp Ugrave.smcp Uacute.smcpUcircumflex.smcpUdieresis.smcp Yacute.smcp Amacron.smcp Abreve.smcp Aogonek.smcp Cacute.smcpCcircumflex.smcp uni010A.smcp Ccaron.smcp Dcaron.smcp Emacron.smcp Ebreve.smcpEdotaccent.smcp Eogonek.smcp Ecaron.smcpGcircumflex.smcp Gbreve.smcp uni0120.smcpGcommaaccent.smcpHcircumflex.smcp Itilde.smcpUhungarumlaut.smcp Ibreve.smcp Iogonek.smcpIdotaccent.smcpJcircumflex.smcpKcommaaccent.smcp Lacute.smcpLcommaaccent.smcp Lcaron.smcp Ldot.smcp Nacute.smcpNcommaaccent.smcp Ncaron.smcp Omacron.smcp Obreve.smcpOhungarumlaut.smcp Racute.smcpRcommaaccent.smcp Rcaron.smcp Sacute.smcpScircumflex.smcp Scedilla.smcp Scaron.smcpTcommaaccent.smcp Tcaron.smcp Utilde.smcp Umacron.smcp Ubreve.smcp Uring.smcpgermandbls.smcp Zcaron.smcpZdotaccent.smcp Zacute.smcpYdieresis.smcpYcircumflex.smcpWcircumflex.smcp Uogonek.smcpÿÿ 0DDFLTlatnÿÿÿÿkernkern 2¨.’1æ1æV0<ô-¦1Ä0Ĭ0à0à-d x0à0à1Ä!þ Ö P-¸-$0&/Ê1$ ¤ ¶0¦.’0Ú ø "1.’ –1¦ 0 1¦ 60<0<0<0<0<0<-¦0Ä0Ä0Ä0Ä0à0à0à0à1Ä0à1Ä1Ä1Ä1Ä1Ä1$0¦0¦0¦0¦0¦0¦0Ú0Ú0Ú0Ú111111¦.’1¦0<0¦0<0¦0<0¦-¦-¦-¦-¦1Ä1Ä0Ä0Ú0Ä0Ú0Ä0Ú0Ä0Ú0Ä0Ú0à0à0à0à0à0à-d x x x x0à0à0à1Ä11Ä11Ä1 – – –-¸-¸-¸0&1$1¦1$ ¤ ¤ ¤0<0¦1æ0<0Ä0à0à1Ä1$0<ô.ú0<0Ä ¤0à1Ä0à-d0<0à0à ¶1Ä!þ -¸1$Ž/Êl0à1$1¦àº1¦¤1.’ž¤ŽÄVˆ10Ä0Ä.ú0à0à,Ü,Üt-d.¬0à0<ô.úþ0Ä/Ê!80à-d0à0à0à1Ä!þ-¦-¸.¬/Ê0à0à" ,Ü,Ü#²$p$ú0¦%T&./À&´0Ú0 &Ú'1.’(^1¦.’0 *Ì+--.’,00Ú0Ú/À,²--1¦,Ü-0<1-$1¦-$1¦-:.’.ú/À.ú/Ê0 -d-d-d-d0à-¦-¸1$1¦1$/Ê0 0à/Ê0 0à0à0à0<0¦0<0¦0Ä0Ú0Ú0Ú/Ê0 1Ä11.’.¬1¦.¬1¦.¬1¦.ú/À/À/Ê0 0<0¦0à0&0&0&0<0¦0<0¦0<0¦0<0¦0<0¦0<0¦0<0¦0<0¦0<0¦0<0¦0<0¦0<0¦0Ä0Ú0Ä0Ú0Ä0Ú0Ä0Ú0Ä0Ú0Ä0Ú0Ä0Ú0Ä0Ú0à0à1Ä11Ä11Ä11Ä11Ä11Ä11Ä111$1¦1$1¦1$1¦1$1¦1Ä1æ1æ1æ1æ1æ1æ1æ21ì2t2222$262H2Z2t2z2„’ $%&'()+,./01234579:;<=>DEHINRSUYZ[\^‚ƒ„…†‡‰Š‹Œ�Ž��‘’“”•–—˜Ÿ¢£¤¥¦§ª«¬­´µ¶·¸¿ÀÁÂÃÄÅÆÇÈÊÌÎÐÒÔÕÖרÙÚÛÜÝæêìîðòøûýÿ $&(689:;=?HIQcefghilmnopqrstuvwxyz|}~€�‚„…‹�Ž�“•—˜™›�ž ¡¢£¦¬­®¯²³µ¶·¸º»¼½¾¿ÀÁÂÃÄÆÇÈÉÊÌÍÎÏÑÒÔÕÖØÙÚÛÜÝÞßàáâãæêìîïðñòõöøùúüýÿ  !"#-:;<=ABEGIKMUWYZ[]^klmtxz{|}~�‚„†‡ˆ‘’–˜™š›œ�ž¡¢¦§¨¿ÀÁÃÅÇÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñóõö÷øùúûüýþÿ  !"#45789ABuvwxy{}~€„…Œ‘9:%<Ÿ6%8:i… "Y[Ã%Å%Ç%!Êþïþïþï$ÿÅ7DÿÞFÿëGÿëHÿëJÿëRÿëTÿëUÿæXÿêYÿè\ÿè‚ÿŃÿÅ„ÿÅ…ÿņÿŇÿÅ¢ÿÞ£ÿÞ¤ÿÞ¥ÿÞ¦ÿÞ§ÿÞ©ÿëªÿë«ÿë¬ÿë­ÿë´ÿëµÿë¶ÿë·ÿë¸ÿë»ÿê¼ÿê½ÿê¾ÿê¿ÿèÁÿèÂÿÅÃÿÞÄÿÅÅÿÞÆÿÅÇÿÞÉÿëËÿëÍÿëÏÿëÑÿëÕÿë×ÿëÙÿëÛÿëÝÿëßÿëáÿëãÿëåÿëÿëÿëÿëÿë$&+ÿê-ÿê/ÿê1ÿê3ÿê5ÿê9ÿèDÿëFÿêHÿÅIÿÞcÿÅlÿÅoÿÅvÿņÿëŠÿê‹ÿë�ÿè—ÿè™ÿëœÿë�ÿëŸÿê¥ÿê¦ÿë§ÿê®·¼ÿÅÎÜÿÞáÿëêÿëíÿëïÿèðÿëüÿëýÿëÿë ÿèÿÅÿë!ÿè#ÿè%ÿë)ÿë-ÿëKTÿëVÿëWZÿè_{ÿÅ|ÿÞ}ÿÅ~ÿÞ‚ÿë„ÿë†ÿë’ÿë”ÿë–ÿëšÿèœÿèžÿè¬ÿë­ÿë®ÿë¸ÿë¿ÿÅÀÿÞÉÿÅÊÿÞËÿÅÌÿÞÍÿÅÎÿÞÏÿÅÐÿÞÑÿÅÒÿÞÓÿÅÔÿÞÕÿÅÖÿÞ×ÿÅØÿÞÙÿÅÚÿÞÛÿÅÜÿÞÝÿÅÞÿÞßÿÅàÿÞâÿëäÿëæÿëèÿëêÿëìÿëîÿëðÿëöÿëøÿëúÿëüÿëþÿëÿëÿëÿëÿëÿë ÿë ÿëÿêÿêÿêÿêÿêÿêÿêÿèÿè ÿè"ÿè6þï:þï>þï?þï7ÿß9ÿä:ÿì<ÿÝŸÿÝ$ÿß&ÿß6ÿì8ÿÝ:ÿÝiÿÝÿÝ…ÿÝ®ÿß·ÿßÎÿß ÿä"ÿäKÿßWÿßYÿÝ[ÿÝ_ÿßÃÿìÅÿìÇÿìÿÝÿÝÿÝ!ÿÝ7ÿÎ9ÿí<ÿПÿÐ$ÿÎ&ÿÎ8ÿÐ:ÿÐiÿÐÿÐ…ÿЮÿηÿÎÎÿÎ ÿí"ÿíKÿÎWÿÎYÿÐ[ÿÐ_ÿÎÿÐÿÐÿÐ!ÿÐ-ÿî8ÿî›ÿîœÿî�ÿîžÿîöÿî*ÿî,ÿî.ÿî0ÿî2ÿî4ÿî´ÿî ÿîÿîJ  @FÿèGÿèHÿèJÿèTÿè`©ÿèªÿè«ÿè¬ÿè­ÿèÉÿèËÿèÍÿèÏÿèÑÿèÕÿè×ÿèÙÿèÛÿèÝÿèßÿèáÿèãÿèåÿèÿèDÿèQ†ÿè‹ÿèœÿè�ÿèáÿèíÿèðÿèüÿèýÿèÿè%ÿè)ÿè-ÿèTÿèVÿè‚ÿè„ÿè†ÿè”ÿè¬ÿè­ÿè®ÿè¸ÿèâÿèäÿèæÿèèÿèêÿèìÿèîÿèðÿèÿèÿèÿè ÿè45789AB=FÿìGÿìHÿìJÿìTÿì©ÿìªÿì«ÿì¬ÿì­ÿìÉÿìËÿìÍÿìÏÿìÑÿìÕÿì×ÿìÙÿìÛÿìÝÿìßÿìáÿìãÿìåÿìÿìDÿì†ÿì‹ÿìœÿì�ÿìáÿìíÿìðÿìüÿìýÿìÿì%ÿì)ÿì-ÿìTÿìVÿì‚ÿì„ÿì†ÿì”ÿì¬ÿì­ÿì®ÿì¸ÿìâÿìäÿìæÿìèÿìêÿììÿìîÿìðÿìÿìÿìÿì ÿìÿ„ÿ„ÿ„6ÿ„:ÿ„>ÿ„?ÿ„-ÿì8ÿì›ÿìœÿì�ÿìžÿìöÿì*ÿì,ÿì.ÿì0ÿì2ÿì4ÿì´ÿì ÿìÿìZÿÌvÿµxÿÖyÿ·zÿî{ÿ»~ÿòIWZZÿå€ÿË¢ÿä~ÿì:&ÿó*ÿó2ÿó4ÿó‰ÿó”ÿó•ÿó–ÿó—ÿó˜ÿóšÿóÈÿóÊÿóÌÿóÎÿóÞÿóàÿóâÿóäÿóÿóÿóÿóÿóCÿóLÿóhÿósÿózÿó• °ÿóÊÿóÍÿó ÿóÿó$ÿó&ÿó(ÿó*ÿó,ÿóSÿóUÿó‘ÿó“ÿó•ÿó·ÿóõÿó÷ÿóùÿóûÿóýÿóÿÿóÿóÿóÿóÿó ÿó ÿó#ÿó;&ÿæ*ÿæ2ÿæ4ÿæ‰ÿæ”ÿæ•ÿæ–ÿæ—ÿæ˜ÿæšÿæÈÿæÊÿæÌÿæÎÿæÞÿæàÿæâÿæäÿæÿæÿæÿæÿæCÿæLÿæhÿæsÿæzÿæ€ÿ•°ÿæÊÿæÍÿæ ÿæÿæ$ÿæ&ÿæ(ÿæ*ÿæ,ÿæSÿæUÿæ‘ÿæ“ÿæ•ÿæ·ÿæõÿæ÷ÿæùÿæûÿæýÿæÿÿæÿæÿæÿæÿæ ÿæ ÿæ#ÿæ7$ÿä;ÿÒ<ÿÓ‚ÿäƒÿä„ÿä…ÿä†ÿä‡ÿäŸÿÓÂÿäÄÿäÆÿä8ÿÓ:ÿÓHÿäcÿäiÿÓlÿäoÿävÿäÿÓ�ÿÒ…ÿÓ•ÿâ¼ÿäÂÿÒÑÿÒÿäAÿÒYÿÓ[ÿÓ]ÿÒlÿÒ{ÿä}ÿä‡ÿÒ§ÿÒ¿ÿäÉÿäËÿäÍÿäÏÿäÑÿäÓÿäÕÿä×ÿäÙÿäÛÿäÝÿäßÿäÿÓÿÓÿÓ!ÿÓ(ÿFÿFÿF$ÿÍ‚ÿ̓ÿÍ„ÿÍ…ÿ͆ÿ͇ÿÍÂÿÍÄÿÍÆÿÍHÿÍcÿÍlÿÍoÿÍvÿÍ›ÿò¼ÿÍÿÍ{ÿÍ}ÿÍ¿ÿÍÉÿÍËÿÍÍÿÍÏÿÍÑÿÍÓÿÍÕÿÍ×ÿÍÙÿÍÛÿÍÝÿÍßÿÍ6ÿF:ÿF>ÿF?ÿF•žÿí¡ÿì°FÿÜGÿÜHÿÜJÿÜPÿÂQÿÂRÿÖSÿÂTÿÜXÿÝYÿá\ÿá©ÿܪÿÜ«ÿܬÿÜ­ÿܳÿ´ÿÖµÿÖ¶ÿÖ·ÿÖ¸ÿÖ»ÿݼÿݽÿݾÿÝ¿ÿáÁÿáÉÿÜËÿÜÍÿÜÏÿÜÑÿÜÕÿÜ×ÿÜÙÿÜÛÿÜÝÿÜßÿÜáÿÜãÿÜåÿÜÿÂÿ ÿ ÿÂÿÖÿÖÿÖÿÜ+ÿÝ-ÿÝ/ÿÝ1ÿÝ3ÿÝ5ÿÝ9ÿáDÿÜFÿ݆ÿ܈ÿŠÿÝ‹ÿÜ�ÿáŽÿî�ÿæ‘ÿÂ’ÿë“ÿé—ÿá˜ÿð™ÿÖšÿçœÿÜ�ÿÜžÿãŸÿÝ ÿ΢ÿÔ£ÿÛ¥ÿݦÿÖ§ÿÝßÿÂáÿÜäÿÂåÿÂæÿÂèÿÂéÿÂêÿÖëÿÂìÿÂíÿÜïÿáðÿÜòÿÂôÿÂõÿÂøÿÂúÿÂüÿÜýÿÜÿÿÂÿÜÿÂÿ ÿ ÿáÿÖ!ÿá#ÿá%ÿÜ)ÿÜ-ÿÜ6ÿÂFÿÂNÿÂPÿÂTÿÜVÿÜZÿásÿÂuÿÂyÿ‚ÿÜ„ÿ܆ÿÜŽÿÂ�ÿÂ’ÿÖ”ÿÜ–ÿÖšÿáœÿážÿá¢ÿ¤ÿ¦ÿ¬ÿÜ­ÿÜ®ÿܸÿÜÂÿÂâÿÜäÿÜæÿÜèÿÜêÿÜìÿÜîÿÜðÿÜöÿÖøÿÖúÿÖüÿÖþÿÖÿÖÿÖÿÜÿÜÿÜ ÿÖ ÿÜÿÝÿÝÿÝÿÝÿÝÿÝÿÝÿáÿá ÿá"ÿávÿÚ ÿÚFÿðGÿðHÿðJÿðTÿðXÿïYÿÜ\ÿÜ©ÿðªÿð«ÿð¬ÿð­ÿð»ÿï¼ÿï½ÿï¾ÿï¿ÿÜÁÿÜÉÿðËÿðÍÿðÏÿðÑÿðÕÿð×ÿðÙÿðÛÿðÝÿðßÿðáÿðãÿðåÿðÿð+ÿï-ÿï/ÿï1ÿï3ÿï5ÿï9ÿÜDÿðFÿïQÿÚ†ÿðŠÿï‹ÿð�ÿÜ’ÿì•—ÿÜšÿêœÿð�ÿðžÿÜŸÿï ÿç¥ÿï§ÿïáÿðíÿðïÿÜðÿðüÿðýÿðÿð ÿÜ!ÿÜ#ÿÜ%ÿð)ÿð-ÿðTÿðVÿðZÿÜ‚ÿð„ÿð†ÿð”ÿðšÿÜœÿÜžÿܬÿð­ÿð®ÿð¸ÿðâÿðäÿðæÿðèÿðêÿðìÿðîÿððÿðÿðÿðÿð ÿðÿïÿïÿïÿïÿïÿïÿïÿÜÿÜ ÿÜ"ÿÜ4ÿÚ5ÿÚ7ÿÚ8ÿÚ9ÿÚAÿÚBÿÚ:ÿ  ÿ IÿéXÿñYÿÅ\ÿÅ»ÿñ¼ÿñ½ÿñ¾ÿñ¿ÿÅÁÿÅ+ÿñ-ÿñ/ÿñ1ÿñ3ÿñ5ÿñ9ÿÅFÿñQÿ Šÿñ�ÿÅ’ÿî•—ÿÅšÿìžÿ¾Ÿÿñ¡ÿÚ¥ÿñ§ÿñïÿÅ ÿÅ!ÿÅ#ÿÅZÿÅšÿÅœÿÅžÿÅÿñÿñÿñÿñÿñÿñÿñÿÅÿÅ ÿÅ"ÿÅ4ÿ 5ÿ 7ÿ 8ÿ 9ÿ Aÿ Bÿ >FÿçGÿçHÿçJÿçTÿç©ÿçªÿç«ÿç¬ÿç­ÿçÉÿçËÿçÍÿçÏÿçÑÿçÕÿç×ÿçÙÿçÛÿçÝÿçßÿçáÿçãÿçåÿçÿçDÿç†ÿç‹ÿ畜ÿç�ÿçáÿçíÿçðÿçüÿçýÿçÿç%ÿç)ÿç-ÿçTÿçVÿç‚ÿç„ÿç†ÿç”ÿç¬ÿç­ÿç®ÿç¸ÿçâÿçäÿçæÿçèÿçêÿçìÿçîÿçðÿçÿçÿçÿç ÿçž z FÿèGÿèHÿèI JÿèRÿêTÿèY \ ©ÿèªÿè«ÿè¬ÿè­ÿè´ÿêµÿê¶ÿê·ÿê¸ÿê¿ Á ÉÿèËÿèÍÿèÏÿèÑÿèÕÿè×ÿèÙÿèÛÿèÝÿèßÿèáÿèãÿèåÿèÿêÿêÿêÿè9 DÿèQ †ÿè‹ÿè� Žÿí— ™ÿêš œÿè�ÿèž ¦ÿêáÿèêÿêíÿèï ðÿèüÿèýÿèÿè ÿê! # %ÿè)ÿè-ÿèTÿèVÿèZ ‚ÿè„ÿè†ÿè’ÿê”ÿè–ÿêš œ ž ¬ÿè­ÿè®ÿè¸ÿèâÿèäÿèæÿèèÿèêÿèìÿèîÿèðÿèöÿêøÿêúÿêüÿêþÿêÿêÿêÿèÿèÿè ÿê ÿè   " 4 5 7 8 9 A B v y {|ÿõ~ÿì [ÿí]ÿí<ÿí>ÿí@ÿí¡ÿáâÿíñÿíBÿí^ÿímÿíˆÿí¨ÿíd FÿëGÿëHÿëI JÿëRÿéTÿë©ÿëªÿë«ÿë¬ÿë­ÿë´ÿéµÿé¶ÿé·ÿé¸ÿéÉÿëËÿëÍÿëÏÿëÑÿëÕÿë×ÿëÙÿëÛÿëÝÿëßÿëáÿëãÿëåÿëÿéÿéÿéÿëDÿëQ †ÿë‹ÿëŽÿî�ÿò™ÿéœÿë�ÿë ÿñ¡£ÿï¦ÿéáÿëêÿéíÿëðÿëüÿëýÿëÿëÿé%ÿë)ÿë-ÿëTÿëVÿë‚ÿë„ÿë†ÿë’ÿé”ÿë–ÿé¬ÿë­ÿë®ÿë¸ÿëâÿëäÿëæÿëèÿëêÿëìÿëîÿëðÿëöÿéøÿéúÿéüÿéþÿéÿéÿéÿëÿëÿë ÿé ÿë4 5 7 8 9 A B [ÿò]ÿò<ÿò>ÿò@ÿòâÿòñÿòBÿò^ÿòmÿòˆÿò¨ÿòYÿô[ÿò\ÿô]ÿó¿ÿôÁÿô9ÿô<ÿó>ÿó@ÿó�ÿô—ÿôâÿòïÿôñÿò ÿô!ÿô#ÿôBÿòZÿô^ÿòmÿòˆÿòšÿôœÿôžÿô¨ÿòÿôÿô ÿô"ÿô[ÿÊ ÿÊ7ÿÒ9ÿÔ;ÿô<ÿÓYÿæ[ÿï\ÿæŸÿÓ¿ÿæÁÿæ$ÿÒ&ÿÒ8ÿÓ9ÿæ:ÿÓQÿÊiÿÓÿÓ�ÿô…ÿÓ�ÿæ—ÿæ®ÿÒ·ÿÒºÿíÂÿôÎÿÒÏÿíÑÿôÓÿáØÿÔâÿïîÿÉïÿæñÿï ÿæ ÿå ÿÔ!ÿæ"ÿÔ#ÿæ+ÿãAÿôBÿïKÿÒLÿÄWÿÒYÿÓZÿæ[ÿÓ]ÿô^ÿï_ÿÒaÿácÿálÿômÿïvÿá‡ÿôˆÿï™ÿíšÿæ›ÿíœÿæ�ÿížÿæŸÿá§ÿô¨ÿï¯ÿÔ°ÿõ±ÿç¹ÿgºÿÉÿÓÿæÿÓÿæÿÓ ÿæ!ÿÓ"ÿæ4ÿÊ5ÿÊ7ÿÊ8ÿÊ9ÿÊAÿÊBÿÊ$7ÿ¾Yÿï\ÿï¿ÿïÁÿï$ÿ¾&ÿ¾9ÿï�ÿï—ÿï®ÿ¾·ÿ¾Îÿ¾ØÿÉîÿßïÿï ÿï ÿí!ÿï#ÿï+ÿëKÿ¾LÿßWÿ¾Zÿï_ÿ¾gÿéšÿïœÿïžÿï°ÿõºÿàÿïÿï ÿï"ÿï;7ÿæ9ÿç;ÿò<ÿç[ÿñŸÿç$ÿæ&ÿæ8ÿç:ÿçiÿçÿç�ÿò…ÿç®ÿæ·ÿæºÿîÂÿòÎÿæÏÿîÑÿòÓÿèØÿæâÿñîÿÐñÿñ ÿç"ÿçAÿòBÿñKÿæLÿÎWÿæYÿç[ÿç]ÿò^ÿñ_ÿæaÿècÿèlÿòmÿñvÿè‡ÿòˆÿñ™ÿî›ÿî�ÿîŸÿè§ÿò¨ÿñ¯ÿç±ÿí¹ÿæºÿÐÿçÿçÿç!ÿç ¹ÿæŽ$&ÿè*ÿè2ÿè4ÿè7ÿà9ÿà<ÿß‚ƒ„…†‡‰ÿè”ÿè•ÿè–ÿè—ÿè˜ÿèšÿèŸÿßÂÄÆÈÿèÊÿèÌÿèÎÿèÞÿèàÿèâÿèäÿèÿèÿèÿèÿè$ÿà&ÿà8ÿß:ÿßCÿèHLÿèchÿèiÿßlosÿèvzÿèÿß…ÿß®ÿà°ÿèµ·ÿà¼ÀÇÊÿèÍÿèÎÿàÓÿáØÿààçóÿà ÿèÿè ÿà"ÿà$ÿè&ÿè(ÿè*ÿè,ÿèKÿàSÿèUÿèWÿàYÿß[ÿß_ÿàaÿábÿàcÿádÿàhÿápqvÿáwÿà{}ƒÿé‘ÿè“ÿè•ÿèŸÿá ÿà¯ÿß±ÿÞ³·ÿè¹ÿß»ÿò½¾¿ÉËÍÏÑÓÕ×ÙÛÝßõÿè÷ÿèùÿèûÿèýÿèÿÿèÿèÿèÿèÿè ÿè ÿèÿßÿßÿß!ÿß#ÿè1ÿò7ÿñ9ÿô;ÿô<ÿðŸÿð$ÿñ&ÿñ8ÿð:ÿðiÿðÿð�ÿô…ÿð®ÿñµÿõ·ÿñºÿóÂÿôÇÿõÎÿñÏÿóÑÿôØÿñ ÿô"ÿôAÿôKÿñWÿñYÿð[ÿð]ÿô_ÿñlÿôpÿõ‡ÿô™ÿó›ÿó�ÿó§ÿô¯ÿò±ÿò³ÿõ¹ÿò½ÿõÿðÿðÿð!ÿðWˆþÛŽÿØ•ÿš›ÿÈÀÿàÿU«ÿÐd$7ÿæ9ÿæ;<ÿ悃„…†‡ŸÿæÂÄÆ$ÿæ&ÿæ8ÿæ:ÿæHciÿælovÿæ�…ÿæ®ÿæµ·ÿæº ¼ÀÂÇÎÿæÏ ÑÓÿåØÿæÙÿôàçîÿçóÿè ÿæ"ÿæAKÿæLÿçWÿæYÿæ[ÿæ]_ÿæaÿåbÿècÿådÿèlpqvÿåwÿè{}‡™ › � Ÿÿå ÿ觯ÿæ±ÿæ³¹ÿæºÿç½¾¿ÉËÍÏÑÓÕ×ÙÛÝßÿæÿæÿæ!ÿæ/7ÿã;ÿå<ÿäŸÿä$ÿã&ÿã8ÿä:ÿäiÿäÿä�ÿå…ÿä®ÿãµÿå·ÿãºÿéÀÿâÂÿåÇÿåÎÿãÏÿéÑÿåçÿêÿêAÿåKÿãWÿãYÿä[ÿä]ÿå_ÿãlÿåpÿåqÿê‡ÿå™ÿé›ÿé�ÿé§ÿå³ÿå¹ÿä½ÿå¾ÿêÿäÿäÿä!ÿä"7ÿâ;ÿä$ÿâ&ÿâ�ÿä®ÿâµÿä·ÿâºÿéÀÿáÂÿäÇÿäÎÿâÏÿéÑÿäàÿäçÿëÿëAÿäKÿâWÿâ]ÿä_ÿâlÿäpÿäqÿë‡ÿä™ÿé›ÿé�ÿé§ÿä³ÿä½ÿä¾ÿë7ÿë<ÿóŸÿó$ÿë&ÿë8ÿó:ÿóiÿóÿó…ÿó®ÿë·ÿëÎÿëKÿëWÿëYÿó[ÿó_ÿëÿóÿóÿó!ÿó6PÿïQÿïSÿï[ÿð³ÿïÿïÿï ÿï ÿïˆÿï‘ÿïßÿïàÿîâÿðäÿïåÿïæÿïèÿïéÿïëÿïìÿïîÿîñÿðòÿïôÿïõÿïøÿïúÿïÿÿïÿïÿï ÿï ÿô+ÿñ6ÿïBÿðFÿïLÿïNÿïPÿï^ÿðmÿðsÿïuÿïyÿïˆÿðŽÿï�ÿï¢ÿï¤ÿï¦ÿï¨ÿðºÿïÂÿï!ÿò ÿòYÿõ\ÿõ¿ÿõÁÿõ9ÿõQÿò�ÿõ—ÿõîÿôïÿõ ÿõ ÿõ!ÿõ#ÿõLÿõZÿõšÿõœÿõžÿõºÿõÿõÿõ ÿõ"ÿõ4ÿò5ÿò7ÿò8ÿò9ÿòAÿòBÿò àîÿíóÿíLÿíbÿídÿíwÿí ÿíºÿí ÿõ ÿõQÿõ4ÿõ5ÿõ7ÿõ8ÿõ9ÿõAÿõBÿõVFÿðGÿðHÿðJÿðRÿÈTÿð©ÿðªÿð«ÿð¬ÿð­ÿð´ÿȵÿȶÿÈ·ÿȸÿÈÉÿðËÿðÍÿðÏÿðÑÿðÕÿð×ÿðÙÿðÛÿðÝÿðßÿðáÿðãÿðåÿðÿÈÿÈÿÈÿðDÿð†ÿð‹ÿð™ÿÈœÿð�ÿð¦ÿÈáÿðêÿÈíÿððÿðüÿðýÿðÿðÿÈ%ÿð'ÿë)ÿð-ÿðTÿðVÿð‚ÿð„ÿð†ÿð’ÿÈ”ÿð–ÿȬÿð­ÿð®ÿð¸ÿðâÿðäÿðæÿðèÿðêÿðìÿðîÿððÿðöÿÈøÿÈúÿÈüÿÈþÿÈÿÈÿÈÿðÿðÿð ÿÈ ÿð~ÿë› DÿðFÿîGÿîHÿîI JÿîRÿêTÿîY \ ¢ÿð£ÿð¤ÿð¥ÿð¦ÿð§ÿð©ÿîªÿî«ÿî¬ÿî­ÿî´ÿêµÿê¶ÿê·ÿê¸ÿê¿ Á ÃÿðÅÿðÇÿðÉÿîËÿîÍÿîÏÿîÑÿîÕÿî×ÿîÙÿîÛÿîÝÿîßÿîáÿîãÿîåÿîÿêÿêÿêÿî9 DÿîIÿðQ †ÿî‹ÿî� — ™ÿêœÿî�ÿî¦ÿêÜÿðàÿÈáÿîçÿ×êÿêíÿîï ðÿîüÿîýÿîÿîÿ× ÿê! # %ÿî'ÿì)ÿî+ -ÿîTÿîVÿîZ qÿ×|ÿð~ÿð‚ÿî„ÿî†ÿî’ÿê”ÿî–ÿêš œ ž ¬ÿî­ÿî®ÿî° ² ¸ÿî¾ÿ×ÀÿðÊÿðÌÿðÎÿðÐÿðÒÿðÔÿðÖÿðØÿðÚÿðÜÿðÞÿðàÿðâÿîäÿîæÿîèÿîêÿîìÿîîÿîðÿîöÿêøÿêúÿêüÿêþÿêÿêÿêÿîÿîÿî ÿê ÿî   " 4 5 7 8 9 A B v y {|ÿõ~ÿìàçîÿðóÿðû Lÿðbÿðdÿðqwÿð ÿðºÿð¾JFÿîGÿîHÿîJÿîTÿî©ÿîªÿî«ÿî¬ÿî­ÿîÉÿîËÿîÍÿîÏÿîÑÿîÕÿî×ÿîÙÿîÛÿîÝÿîßÿîáÿîãÿîåÿîÿîDÿî†ÿî‹ÿîœÿî�ÿîàáÿîçíÿîîÿãðÿîóÿãüÿîýÿîÿî%ÿî)ÿî-ÿîLÿâTÿîVÿîbÿãdÿãqwÿã‚ÿî„ÿî†ÿî”ÿî ÿã¬ÿî­ÿî®ÿî¸ÿîºÿã¾âÿîäÿîæÿîèÿîêÿîìÿîîÿîðÿîÿîÿîÿî ÿî Yÿô[ÿð\ÿô¿ÿôÁÿô9ÿô�ÿô—ÿôàÿïâÿðçÿóïÿôñÿðÿó ÿô!ÿô#ÿôBÿðZÿô^ÿðmÿðqÿóˆÿðšÿôœÿôžÿô¨ÿð¾ÿóÿôÿô ÿô"ÿô ÿÖ ÿÖQÿÖ4ÿÖ5ÿÖ7ÿÖ8ÿÖ9ÿÖAÿÖBÿÖ ØÿÃîÿÏLÿÎcÿçgÿ߯ÿѱÿì¹ÿ ºÿÑîÿº ÿÙ+ÿÛLÿ dÿí°ÿð²ÿòºÿº @Uÿâ`~ÿÙ ÿØ ÿØQÿØ4ÿØ5ÿØ7ÿØ8ÿØ9ÿØAÿØBÿØZÿÁ€ÿÅžÿ´Ýÿ×îÿ¹ ÿ²'ÿÒ+ÿÈLÿ dÿŃÿä°ÿ̲ÿ̺ÿË»ÿï~ÿç ÿæ@ÿô`ÿïhÿí6Uÿ¿ZÿÑmÿi}ÿmˆÿD¨ÿ¬ºÿ¡€ÿ¸Žÿñ�ÿ~“ÿ{šÿ››ÿyžÿ² ÿ~¡ÿ³¢ÿ}£ÿ|Àÿ¯ØÝÿäÞÿ àÿtãÿ€îÿ²÷ÿ}ùÿ€ûÿy ÿ} ÿ'ÿg+ÿÚ:ÿ�<ÿ˜Hÿ}Lÿ³Rÿ dÿ|fÿ|gÿšhÿlƒÿæ«ÿk°ÿ’²ÿ­¶ÿ{¹ºÿ‘»ÿòwÿíxÿñ{ÿñ|ÿ¼~ÿ¹žÿê¡ÿèàÿîîÿëLÿìºÿìÀÿ®ØÞÿààÿ­ãÿÖ÷ÿßûÿÒ ÿà'ÿÎ:ÿÝ<ÿâHÿàRÿàdÿéfÿÞhÿÚ«ÿ½¶ÿß¹1Uÿ~Zÿ�mþë}þòˆþ¬¨ÿ]ºÿK€ÿrŽÿÒ�ÿ“ÿ šÿA›ÿžÿh ÿ¡ÿj¢ÿ£ÿ ÀÿcØÝÿ½ÞÿIàþþãÿîÿh÷ÿùÿûÿ ÿ ÿ'þé+ÿ¬:ÿ<ÿ<HÿLÿjRÿIdÿ fÿ gÿ?hþñƒÿÀ«þï°ÿ1²ÿ_¶ÿ ¹ºÿ0»ÿÕàÿÉ'ÿî€ÿÔŽÿð’ÿ핞ÿà ÿç¢ÿå£ÿîÀÝÿéîÿ×Lÿ×dÿÓgÿÖhÿŃÿç¯ ± ºÿÖ»ÿò~ÿé'ÿñ @ Uÿë`~ÿç"ÿ°WÿïZÿßEÿî€ÿå‚ÿÑ•žÿÈÀØÿÅîÿÊLÿ‚cÿedÿ…gÿhhÿ݃ÿò¯ÿ°±ÿʹÿ¨ºÿÇvÿÄxÿÝyÿÍzÿñ{ÿÇîÿð ÿñ+ÿóLÿñ°ÿó²ÿóºÿñIÿîZÿêvÿðxÿíyÿðîÿõÀàcÿädÿågÿä¯ÿã±ÿâ¹ÿäžÿê¡ÿêîÿê ÿð+ÿñLÿë°ÿõºÿì ÿâ  ÿÏ@IÿêUÿØWÿê`mÿ®}ÿ͈ÿ ¨ÿÁºÿÀ€ÿÐŒÿêŽÿî�ÿÆ� ’ÿé“ÿÖšÿè›ÿºžÿé ÿË¡ÿÁ¢ÿÚ£ÿÇ=ÿÓwÿïxÿó{ÿó~ÿËI Žÿõš ›ÿêž àÿÈ'ÿñˆÿßyÿó}ÿð•ÿêÀÿߨÿà¹ÿàwÿõZ vx y{~ÿë{~ÿðv y {|ÿõ~ÿìvÿîxÿõyÿñ{ÿòvÿåxÿñyÿë{ÿévÿêwÿìyÿñ{ÿîvÿ´xÿÕyÿ·zÿì{ÿ»~ÿð~ÿëxÿõyÿîvÿ¿xÿØyÿÇzÿì{ÿÀ~ÿòP $Ø ÿÚÿˆÿÎÿÅÿìÿ¦ÿ¥þæÿåÿèÿÉÿóÿãÿëÿåÿêÿÕÿ‡ÿêÿéÿáÿíÿíÿïÿæÿãÿäÿäÿåÿêÿæÿåÿéÿØÿ£ÿ^ÿáÿÿ2ÿ3þêÿòÿ…ÿçÿèÿ£ÿOÿõÿóÿóþnÿÎÿÝÿqÿ¨ÿ”ÿ­ÿ§ÿ§ÿ±ÿ´þÿÿËÿ¿ÿ¯ÿ~ÿ|þñÿäÿðÿ³ÿÄÿµÿÒÿÔÿÒÿ)ÿäÿõÿfÿóÿÕÿßÿáÿáÿrÿíÿÄÿæÿëÿëÿáÿÑÿgÿçÿlÿÁÿ¿ÿØÿ¿ÿÆÿ ÿÙÿìÿjÿãÿ ÿðÿéÿâÿ  ÿëÿëÿíÿåÿæÿïÿñÿãÿõÿòÿñÿñÿõÿòÿóÿðÿìÿñÿðÿëÿðÿíÿìÿTÿñÿóÿñÿ[ÿ×ÿìÿÙÿðÿðÿ4ÿ^ÿUÿUÿfÿjþ8ÿ’ÿ}ÿbÿÿ þ ÿ½ÿÑÿjÿ†ÿÀÿœÿÈÿ­ÿëÿçÿÉÿ¥ÿ¯ÿ½ÿ®ÿ½ÿÒþwÿÊÿ»ÿéÿ;ÿéÿìÿìÿØÿyÿÝÿíÿõh %&'(+,-./0123789:;<=DEFHKPQRSUY[\]‰Š‹Œ�Ž��‘’“”•–—˜›œ�žŸ¢£¤¥¦§©ª«¬­³´µ¶·¸¿ÀÁÃÅÇÈÉÊËÌÍÎÏÐÒÔÕÖרÙÚÛÜÝæçêìîðòöøûýÿ   $&(*,.024689:;<=>?@IQefghimnpqrstuwxz|~�„…ˆ�‘—™›¦¬­¯²³´µ¶¸º»¾¿ÁÂÄÆÇÈÉÊÌÍÎÏÑÒÔÖØÜßáâêìíïðñöøùüýÿ  !"#:;<=ABEGIKMUVWYZ[]^fklmtxz|~�‚„†‡ˆ‘’–˜™š›œ�ž¡¢¦§¨ÀÁÂÃÅÇÊÌÎÐÒÔÖØÚÜÞàáâãäåæçèéêëìíîïðñóõö÷øùúûüýþÿ   !"#456789:>?ABÈ$%%&&''(()*+,--..// 012233 4677 8899 :: ;;<<==>CDDEEFFGGHHIJKKLOPQRRSSTTUUVXYYZZ[[\\]]^ˆ‰‰Š�Ž‘’’““”˜™š›žŸŸ ¡¢§¨¨©©ª­®²³³´¸¹¾¿¿ÀÀÁÁÂÂÃÃÄÄÅÅÆÆÇÇÈÈÉÉÊÊËËÌÌÍÍÎÎÏÏÐÐÑÑÒÒÓÓÔÔÕÕÖÖ×רØÙÙÚÚÛÛÜÜÝÝÞåææççèéêêëëììííîîïïððññòòóõöö÷÷øøùúûû üüýý þþÿÿ        #$$ %%&& ''(( ))**++,,--..//00112233445566 778899::;;<<==>>??@@AHIIJdeefghhiijlmmnnooppqqrrssttuuvvwxyyzz{{|| }}~~ €€��‚ƒ„„……†‡ˆˆ‰Œ��Ž�‘‘’–——˜˜™™šš››œ¥¦¦§«¬­®®¯¯°±²³´´µ¶··¸¸¹¹ºº»»¼½¾¾¿¿ÀÀÁÁÂÂÃÃÄÄÅÅÆÆÇÉÊÊËËÌÌ ÍÍÎÎ ÏÏÐÐÑÑÒÒÓÓÔÔÕÕÖÖ×רØÙÛÜÜÝÞßßààááââãéêêëëììííîîïïððññòõöö÷÷øøùùúûüýþþÿÿ       !!"" ##$9::;;<<==>@AABBCDEEFFGGHHIIJJKKLLMMNTUUVVWW XXYYZZ[[\\]]^^_effgjkkllmmnsttuwxxyyzz{{||}}~~€��‚‚ƒƒ„„……††‡‡ˆˆ‰�‘‘’’“•––——˜˜™™šš››œœ��žžŸ ¡¡¢¢£¥¦¦§§¨¨©¿ÀÀÁÁÂÂÃà ÄÄÅÅ ÆÆÇÇ ÈÉÊÊËËÌÌÍÍÎÎÏÏÐÐÑÑÒÒÓÓÔÔÕÕÖÖ×רØÙÙÚÚÛÛÜÜÝÝÞÞßßààááââããääååææççèèééêêëëììííîîïïððññòòóóôôõõöö÷÷øøùùúúûûüüýýþþÿÿ         !!""##$56679::;=>?ý     #$$%%&&')**+,--.12233445566778899 ::;; << ==>CDDEEFHIIJJKOPQRRSSTTUUVVWWXXYYZZ[[\\]]^noop�‚‡ˆˆ‰‰Š“”˜™™šš›žŸŸ  ¡¢§¨¨©­®²³³´¸¹º»¾¿¿ÀÀÁÁÂÂÃÃÄÄÅÅÆÆÇÇÈÈÉÉÊÊËËÌÌÍÍÎÎÏÏÐÐÑÑÒÔÕÕÖÖ×רØÙÙÚÚÛÛÜÜÝÝÞÞßßààááââããääååæõöö÷        !!""##$$%%&&')**++,,--..//001122334455667788 99:: ;;<<==>>??@@ABCCDDEEFFGGHHIIJKLLMMNNOOPPQQRbccdghhii jkllmnooppqqrrsstuvvwyzz{~ €€�� ‚„…… ††‡‡ˆˆ‰‰ŠŠ‹‹ŒŒ��Ž�‘‘’–——˜˜™™š›œ�žžŸŸ ¤¥¥¦¦§§¨­®®¯¯°°±³´´µµ¶¶··¸¹ºº »»¼¼½ÁÂ ÃÆÇÇÈÉÊÊËÌÍÍÎÎÏÏ ÐÐÑÑ ÒÒÓÓÔÛÜÜÝÞßßààááââããäæççèéêêëìííîîïïððññòòóóôõö÷øøùùúúûûüýþþÿÿ          !!"" ##$$%%&&''(())**++,,--.5667@AA BBCEFFGJKKLMNNOOPPQRSSTTUUVVWWXXYY ZZ[[ \\]] ^^__``aabbckll mmnoppqqrrssttuuvvwwxxyyzz{{||}}~~�‚‚ƒƒ„„……††‡‡ ˆˆ‰�ŽŽ����‘‘’’““””••––—˜™™ šš›› œœ�� žžŸŸ  ¡¡¢¢££¤¤¥¥¦¦§§ ¨¨©«¬®¯²³³´¶··¸¸¹¼½½¾¾¿¿ÀÀÁÁÂÂÃÃÄÄÅÅÆÆÇÇÈÈÉÉÊÊËËÌÌÍÍÎÎÏÏÐÐÑÑÒÒÓÓÔÔÕÕÖÖ×רØÙÙÚÚÛÛÜÜÝÝÞÞßßààááââããääååææççèèééêêëëììííîîïïððñôõõöö÷÷øøùùúúûûüüýýþþÿÿ               !! ""##$/02334566 79:: ;=>? @@AB 6nDFLTlatn ÿÿÿÿaalt aalt liga&lnum,smcp2 Z�°Òæ�žŸ ¡¢£¤¥‘Ž�Œ‹Š‰ˆ‡†…„ƒ�€¦~}|{zyxwvu‘Ž�Œ‹Š‰ˆ‡†…„ƒ�€¦~}|{zyxwvu¸¹º»¼½¿ÀÁÂÃÄÅÆÇ¶ÈÉÊËÌÍÎÏÐÑÒ¸¹º»¼½¿ÀÁÂÃÄÅÆÇ¶ÈÉÊËÌÍÎÏÐÑÒÓÓÔÔÕÕÖÖ××ÙÙÚÚµµÛÛÜÜÝÝÞÞßßààááããääååkkççèèéêêëëììííîîïïððññòòóóôôõõöö÷÷øøùùúúûûüüýýþþ··ÿÿææ    ¾¾$= D]$‚‡>‰˜D›ŸT¡§Y©¸`»¿pÁËuÎá€äç”êò˜öù¡û¥ ­³@¹HIä¾Ü‘Ž�Œ‹Š‰ˆ‡†…„ƒ�€¦~}|{zyxwvu‘Ž�Œ‹Š‰ˆ‡†…„ƒ�€¦~}|{zyxwvu¸¹º»¼½¿ÀÁÂÃÄÅÆÇ¶ÈÉÊËÌÍÎÏÐÑÒ¸¹º»¼½¿ÀÁÂÃÄÅÆÇ¶ÈÉÊËÌÍÎÏÐÑÒÓÓÔÔÕÕÖÖ××ÙÙÚÚµµÛÛÜÜÝÝÞÞßßààááããääååkkççèèéêêëëììííîîïïððññòòóóôôõõöö÷÷øøùùúúûûüüýýþþ··ÿÿææ    ¾¾$=D]‚‡4‰˜:›ŸJ¡§O©¸V»¿fÁËkÎáväçŠêòŽöù—û› £©@¯HIÚdLI �žŸ ¡¢£¤¥IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/tDesignN7.h0000664002537200253720000002261415257173642026621 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #ifndef tDesign #define tDesign #define tDesignN 108 #define tDesignN4 27 const float tDesignX[108] = { -6.2552098816025403e-01, -7.6724274137005000e-01, 6.2549292863399197e-01, 1.4125997828575301e-01, 7.6721717759772201e-01, 1.4099410473243601e-01, 7.6736712135195595e-01, -1.4110742173862700e-01, -7.6734155757957501e-01, -1.4114666127949399e-01, -6.2563191604213397e-01, 6.2565997556820796e-01, 5.5718804807150901e-01, -4.4855878114542003e-02, -5.5702317656050904e-01, -8.2927698135379002e-01, 4.5006085132029999e-02, -8.2918499027380599e-01, 4.4745112627006998e-02, 8.2928590372669597e-01, -4.4895319644503003e-02, 8.2917606790087495e-01, 5.5701504778817001e-01, -5.5717991929916000e-01, -2.5606556541091302e-01, 8.6081719374945198e-01, 2.5597811384409902e-01, 4.3978041092751302e-01, -8.6089686693789003e-01, 4.3990520370521202e-01, -8.6076630581432301e-01, -4.3995156541454600e-01, 8.6084597900267401e-01, -4.3973404921832598e-01, -2.5582218268915202e-01, 2.5590963425598701e-01, -2.1484747074631200e-01, -3.2361689068531999e-02, 2.1465339125871499e-01, 9.7615689068417499e-01, 3.2184871976156999e-02, 9.7611156926422904e-01, 3.2404387317596997e-02, -9.7615046971745001e-01, -3.2227570225247998e-02, -9.7611799023095502e-01, -2.1465924111250101e-01, 2.1485332060012000e-01, -5.3165795341807498e-01, -8.2723218781240604e-01, 5.3169396936776903e-01, -1.8101393718458500e-01, 8.2726500032424000e-01, -1.8127474648822200e-01, 8.2733791296439896e-01, 1.8117842505718901e-01, -8.2737072547624402e-01, 1.8111025861543301e-01, -5.3184382687047704e-01, 5.3180781092069196e-01, -6.6005297843145305e-01, -6.4094327816202401e-01, 6.6013081619875302e-01, -3.9136612719466501e-01, 6.4101419265168003e-01, -3.9161316223270598e-01, 6.4107453220554200e-01, 3.9149358257622602e-01, -6.4114544669527695e-01, 3.9148570685099998e-01, -6.6024693506526499e-01, 6.6016909729786299e-01, -8.8780954478645102e-01, -2.9606679202398800e-01, 8.8773949759830995e-01, 3.5241631177768501e-01, 2.9600297518161600e-01, 3.5219661875437602e-01, 2.9624330876316002e-01, -3.5235743521461599e-01, -2.9617949192046300e-01, -3.5225549531753603e-01, -8.8779313738577503e-01, 8.8786318457398505e-01, -2.6223504413331999e-01, -9.6314675317787901e-01, 2.6224675918237900e-01, -5.8802018270752002e-02, 9.6315742623209200e-01, -5.9041039930676997e-02, 9.6319891046170603e-01, 5.8993521775315999e-02, -9.6320958351592201e-01, 5.8849536426176997e-02, -2.6242122941200902e-01, 2.6240951436281401e-01, -7.1550756396758597e-01, -5.5106960749299505e-01, 7.1542220236242304e-01, 4.2945081991723100e-01, 5.5099183837379995e-01, 4.2921163886689701e-01, 5.5121186943026401e-01, -4.2934124731755902e-01, -5.5113410031069798e-01, -4.2932121146642199e-01, -7.1552202902948903e-01, 7.1560739063481005e-01 }; const float tDesignY[108] = { -7.6736100455440004e-01, 1.4111163829346099e-01, 7.6733660249794700e-01, -6.2549733653830897e-01, 1.4114244506563300e-01, 6.2552289788503701e-01, -1.4100347084649500e-01, 6.2563000782531097e-01, -1.4125061251247001e-01, -6.2565556917104204e-01, 7.6724769830047901e-01, -7.6722329624468000e-01, -4.4753456478336000e-02, -8.2928321459249399e-01, 4.4896837512349998e-02, 5.5703033190420503e-01, -8.2917875903364502e-01, -5.5718052466765500e-01, 8.2918688703432897e-01, -5.5702257253401499e-01, 8.2927508659166504e-01, 5.5717276529851500e-01, 4.4854360354950003e-02, -4.4997741388974000e-02, 8.6077038249211302e-01, 4.3994289345351500e-01, -8.6084643502441804e-01, -2.5597846406739999e-01, 4.3974272223969801e-01, 2.5605812969381098e-01, -4.3989863859713502e-01, 2.5582961902214102e-01, -4.3978697709420700e-01, -2.5590928465027801e-01, -8.6081673980214601e-01, 8.6089279233474503e-01, -3.2398468989078000e-02, 9.7614987283473797e-01, 3.2229687143748999e-02, -2.1466216402371399e-01, 9.7611858946613905e-01, 2.1483896433853100e-01, -9.7611274016758898e-01, 2.1466774803890701e-01, -9.7615572213334600e-01, -2.1484454835123701e-01, 3.2359572226460999e-02, -3.2190790383644002e-02, -8.2733395309414903e-01, -1.8117329158711201e-01, 8.2736527447942199e-01, -5.3169577178312599e-01, -1.8111539252056499e-01, 5.3166296238471600e-01, 1.8126523580375101e-01, 5.3183881918442399e-01, 1.8102344830596800e-01, -5.3180600978737802e-01, 8.2723764080317497e-01, -8.2726896218810797e-01, -6.4107030142388999e-01, -3.9149062636001303e-01, 6.4113799328744603e-01, -6.6012999043443699e-01, -3.9148866400992499e-01, 6.6005908267428703e-01, 3.9160477185840398e-01, 6.6024083241350595e-01, 3.9137451851339300e-01, -6.6016992465307600e-01, 6.4095073311544604e-01, -6.4101842497735295e-01, -2.9623400130957600e-01, 3.5235640251299599e-01, 2.9617308454855401e-01, -8.8774383566762505e-01, 3.5225652886781700e-01, 8.8780764645461296e-01, -3.5220289417086997e-01, 8.8779503785732405e-01, -3.5241003721051500e-01, -8.8785884864438702e-01, 2.9607320010986299e-01, -2.9601228334985002e-01, -9.6319683231608300e-01, -5.8986076633669997e-02, 9.6320702034564298e-01, -2.6225020229379598e-01, -5.8856981708732999e-02, 2.6223953025181002e-01, 5.9031435382660001e-02, 2.6241674392460101e-01, 5.8811622961071001e-02, -2.6240607188442000e-01, 9.6314931866947096e-01, -9.6315950669898998e-01, -5.5120377013878596e-01, 4.2934318058472698e-01, 5.5112953514542895e-01, -7.1542827141113796e-01, 4.2931927923402502e-01, 7.1550603315030004e-01, -4.2921946203971501e-01, 7.1552356157107400e-01, -4.2944299777979000e-01, -7.1560132331116300e-01, 5.5107417398569403e-01, -5.5099993899509803e-01 }; const float tDesignZ[108] = { 1.4099851793647000e-01, -6.2564053685251797e-01, 1.4125556518516100e-01, -7.6733219697741695e-01, 6.2566493636760601e-01, 7.6736025871308000e-01, -6.2551236780518904e-01, -7.6725210253135101e-01, 6.2548796829052100e-01, 7.6722404079571904e-01, -1.4112290771545599e-01, -1.4113117540585601e-01, -8.2917947829134198e-01, 5.5702540354431995e-01, -8.2928249394029196e-01, -4.4909882380584999e-02, -5.5716876964570805e-01, 4.4744997884746000e-02, 5.5717769272137596e-01, -4.4841315410965997e-02, -5.5703432661946795e-01, 4.5006199906779003e-02, 8.2929025250191502e-01, 8.2917171972979897e-01, 4.3989177627590598e-01, -2.5582026785434298e-01, 4.3979383867736099e-01, 8.6085319079278699e-01, 2.5589631246609601e-01, -8.6076573233998099e-01, -2.5606748043269800e-01, 8.6080998258632901e-01, 2.5599143582016198e-01, -8.6089744103919696e-01, -4.3994266822003403e-01, -4.3974294673258002e-01, 9.7611008780827402e-01, -2.1467218461029700e-01, 9.7615837285132601e-01, -3.2216146673043997e-02, 2.1484094887733499e-01, 3.2410241444203999e-02, -2.1483452740444700e-01, -3.2373112644705999e-02, 2.1466576313819399e-01, 3.2179017872419002e-02, -9.7615278941891304e-01, -9.7611567124064702e-01, -1.8126872489459300e-01, -5.3184879981305899e-01, -1.8101995890933201e-01, -8.2736543365847803e-01, 5.3181748168958998e-01, 8.2732941487290201e-01, -5.3165298086319801e-01, -8.2723748023304300e-01, 5.3168429898609004e-01, 8.2727349901848002e-01, 1.8116299141426401e-01, 1.8112569239054299e-01, -3.9161069226471701e-01, -6.6024753210531795e-01, -3.9136859744761698e-01, -6.4114035141588099e-01, 6.6017984729226498e-01, 6.4106250751801097e-01, -6.6005238187220605e-01, -6.4094837390819004e-01, 6.6012006668508705e-01, 6.4102621780620295e-01, 3.9147942788312301e-01, 3.9149986182944901e-01, 3.5219260164602201e-01, -8.8780032680142895e-01, 3.5242032914248200e-01, -2.9616486190489599e-01, 8.8786123721763399e-01, 2.9623491461120199e-01, -8.8780235601777802e-01, -2.9608142225558498e-01, 8.8774144560171397e-01, 2.9601136954931501e-01, -3.5236913228520400e-01, -3.5224379850346499e-01, -5.9030871962555999e-02, -2.6242898964534700e-01, -5.8812186281487003e-02, -9.6320670369560302e-01, 2.6241880267639200e-01, 9.6319498772430001e-01, -2.6222728409157697e-01, -9.6314963370005802e-01, 2.6223747105966400e-01, 9.6316134967128597e-01, 5.8978710569357003e-02, 5.8864347675232000e-02, 4.2921245285983900e-01, -7.1553247374448803e-01, 4.2945000623737800e-01, -5.5112102276912700e-01, 7.1560670100512502e-01, 5.5120639109748604e-01, -7.1549711977444796e-01, -5.5108268543699401e-01, 7.1542289251366897e-01, 5.5099731710809297e-01, -4.2935472600113200e-01, -4.2930773309624498e-01 }; #endif IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/ConfigurationHelper.h0000664002537200253720000010113315257173642030760 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich, Leo McCormack Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once #ifndef CONFIGURATIONHELPER_ENABLE_MATRIX_METHODS #define CONFIGURATIONHELPER_ENABLE_MATRIX_METHODS 0 #endif #ifndef CONFIGURATIONHELPER_ENABLE_DECODER_METHODS #define CONFIGURATIONHELPER_ENABLE_DECODER_METHODS 0 #endif #ifndef CONFIGURATIONHELPER_ENABLE_LOUDSPEAKERLAYOUT_METHODS #define CONFIGURATIONHELPER_ENABLE_LOUDSPEAKERLAYOUT_METHODS 0 #else #undef CONFIGURATIONHELPER_ENABLE_GENERICLAYOUT_METHODS #define CONFIGURATIONHELPER_ENABLE_GENERICLAYOUT_METHODS 1 #endif #ifndef CONFIGURATIONHELPER_ENABLE_GENERICLAYOUT_METHODS #define CONFIGURATIONHELPER_ENABLE_GENERICLAYOUT_METHODS 0 #endif #ifndef CONFIGURATIONHELPER_ENABLE_ALL_METHODS #define CONFIGURATIONHELPER_ENABLE_ALL_METHODS 0 #endif #if CONFIGURATIONHELPER_ENABLE_DECODER_METHODS #undef CONFIGURATIONHELPER_ENABLE_MATRIX_METHODS #define CONFIGURATIONHELPER_ENABLE_MATRIX_METHODS 1 #endif #if CONFIGURATIONHELPER_ENABLE_ALL_METHODS #undef CONFIGURATIONHELPER_ENABLE_MATRIX_METHODS #define CONFIGURATIONHELPER_ENABLE_MATRIX_METHODS 1 #undef CONFIGURATIONHELPER_ENABLE_DECODER_METHODS #define CONFIGURATIONHELPER_ENABLE_DECODER_METHODS 1 #undef CONFIGURATIONHELPER_ENABLE_LOUDSPEAKERLAYOUT_METHODS #define CONFIGURATIONHELPER_ENABLE_LOUDSPEAKERLAYOUT_METHODS 1 #undef CONFIGURATIONHELPER_ENABLE_GENERICLAYOUT_METHODS #define CONFIGURATIONHELPER_ENABLE_GENERICLAYOUT_METHODS 1 #endif #if CONFIGURATIONHELPER_ENABLE_MATRIX_METHODS #include "ReferenceCountedMatrix.h" #endif #if CONFIGURATIONHELPER_ENABLE_DECODER_METHODS #include "ReferenceCountedDecoder.h" #endif //============================================================================== /** This class contains some helper-functions for loading / storing Decoders, Matrices and LoudspeakerLayouts from / as JSON configuration files. This file should be included into a JUCE project as it has JUCE dependencies. */ class ConfigurationHelper { public: // =============== IMPORT ====================================================== /** Loads a JSON-file (fileToParse) and writes the parsed content to a juce::var object (dest). */ static juce::Result parseFile (const juce::File& fileToParse, juce::var& dest) { if (! fileToParse.exists()) return juce::Result::fail ("File '" + fileToParse.getFullPathName() + "' does not exist!"); juce::String jsonString = fileToParse.loadFileAsString(); juce::Result result = juce::JSON::parse (jsonString, dest); if (! result.wasOk()) return juce::Result::fail ("File '" + fileToParse.getFullPathName() + "' could not be parsed:\n" + result.getErrorMessage()); return juce::Result::ok(); } #if CONFIGURATIONHELPER_ENABLE_MATRIX_METHODS /** Loads a JSON-file (fileToParse) and tries to parse for a TransformationMatrix object. If successful, writes the matrix into the destination (dest). */ static juce::Result parseFileForTransformationMatrix (const juce::File& fileToParse, ReferenceCountedMatrix::Ptr* dest) { jassert (dest != nullptr); // parsing configuration file juce::var parsedJson; { juce::Result result = parseFile (fileToParse, parsedJson); if (! result.wasOk()) return juce::Result::fail (result.getErrorMessage()); } // looking for a 'TransformationMatrix' object juce::var tmVar = parsedJson.getProperty ("TransformationMatrix", parsedJson); juce::Result result = convertTransformationMatrixVarToMatrix ( tmVar, dest, parsedJson.getProperty ("Name", juce::var ("")), parsedJson.getProperty ("Description", juce::var (""))); if (! result.wasOk()) return juce::Result::fail (result.getErrorMessage()); return juce::Result::ok(); } /** Converts the juce::dsp::Matrix object within a TransformationMatrix juce::var object (tmVar) to a ReferenceCountedMatrix (matrix). */ static juce::Result convertTransformationMatrixVarToMatrix (juce::var& tmVar, ReferenceCountedMatrix::Ptr* matrix, juce::var nameFallback = juce::var (""), juce::var descriptionFallback = juce::var ("")) { jassert (matrix != nullptr); juce::String name = tmVar.getProperty (juce::Identifier ("Name"), nameFallback); juce::String description = tmVar.getProperty (juce::Identifier ("Description"), descriptionFallback); if (! tmVar.hasProperty ("Matrix")) return juce::Result::fail ("There is no 'Matrix' array."); int rows, cols; juce::var matrixData = tmVar.getProperty ("Matrix", juce::var()); auto result = getMatrixDataSize (matrixData, rows, cols); if (! result.wasOk()) return juce::Result::fail (result.getErrorMessage()); ReferenceCountedMatrix::Ptr newMatrix = new ReferenceCountedMatrix (name, description, rows, cols); result = getMatrix (matrixData, rows, cols, newMatrix->getMatrix()); if (! result.wasOk()) return juce::Result::fail (result.getErrorMessage()); *matrix = newMatrix; return juce::Result::ok(); } /** Converts a 'Matrix' juce::var object to a juce::dsp::Matrix object. */ static juce::Result getMatrix (juce::var& matrixData, int rows, int cols, juce::dsp::Matrix& dest) { for (int r = 0; r < rows; ++r) { auto rowVar = matrixData.getArray()->getUnchecked (r); if (rowVar.size() != cols) return juce::Result::fail ("Matrix row " + juce::String (r + 1) + " has wrong length (should be " + juce::String (cols) + ")."); for (int c = 0; c < cols; ++c) { auto colVar = rowVar.getArray()->getUnchecked (c); if (colVar.isDouble() || colVar.isInt()) { dest (r, c) = colVar; } else return juce::Result::fail ("Datatype of matrix element (" + juce::String (r + 1) + "," + juce::String (c + 1) + ") could not be parsed."); } } return juce::Result::ok(); } /** Extracts the number of rows and columns out of a 'Matrix' juce::var object. */ static juce::Result getMatrixDataSize (juce::var& matrixData, int& rows, int& cols) { rows = matrixData.size(); cols = matrixData.getArray()->getUnchecked (0).size(); return juce::Result::ok(); } #endif // #if CONFIGURATIONHELPER_ENABLE_MATRIX_METHODS #if CONFIGURATIONHELPER_ENABLE_DECODER_METHODS /** Converts a Decoder juce::var object (decoderVar) to a ReferenceCountedDecoder (decoder). */ static juce::Result DecoderVar (juce::var& decoderVar, ReferenceCountedDecoder::Ptr* decoder, juce::var nameFallback = juce::var (""), juce::var descriptionFallback = juce::var ("")) { jassert (decoder != nullptr); juce::String name = decoderVar.getProperty (juce::Identifier ("Name"), nameFallback); juce::String description = decoderVar.getProperty (juce::Identifier ("Description"), descriptionFallback); if (! decoderVar.hasProperty ("Matrix")) return juce::Result::fail ("There is no 'Matrix' array within the 'Decoder' object."); // get matrix size int rows, cols; auto matrixData = decoderVar.getProperty ("Matrix", juce::var()); auto result = getMatrixDataSize (matrixData, rows, cols); if (! result.wasOk()) return juce::Result::fail (result.getErrorMessage()); //check if cols is a valid number of Ambisonic channels const int decoderOrder = sqrt (cols) - 1; if (cols != juce::square (decoderOrder + 1)) return juce::Result::fail ( "Decoder matrix's number of columns is no valid Ambisonic channel count: nCh = (order+1)^2."); // create decoder and get matrix from 'Decoder' object ReferenceCountedDecoder::Ptr newDecoder = new ReferenceCountedDecoder (name, description, rows, cols); result = getMatrix (matrixData, rows, cols, newDecoder->getMatrix()); if (! result.wasOk()) return juce::Result::fail (result.getErrorMessage()); if (decoderVar.hasProperty ("Routing")) { auto routingData = decoderVar.getProperty ("Routing", juce::var()); result = getRoutingArray (routingData, rows, newDecoder); if (! result.wasOk()) return juce::Result::fail (result.getErrorMessage()); } // ============ SETTINGS ===================== ReferenceCountedDecoder::Settings settings; // normalization if (! decoderVar.hasProperty ("ExpectedInputNormalization")) juce::Result::fail ("Could not find 'ExpectedInputNormalization' attribute."); auto expectedNormalization ( decoderVar.getProperty ("ExpectedInputNormalization", juce::var())); if (expectedNormalization.toString().equalsIgnoreCase ("sn3d")) settings.expectedNormalization = ReferenceCountedDecoder::Normalization::sn3d; else if (expectedNormalization.toString().equalsIgnoreCase ("n3d")) settings.expectedNormalization = ReferenceCountedDecoder::Normalization::n3d; else return juce::Result::fail ( "Could not parse 'ExpectedInputNormalization' attribute. Expected 'sn3d' or 'n3d' but got '" + expectedNormalization.toString() + "'."); // weights if (decoderVar.hasProperty ("Weights")) { auto weights (decoderVar.getProperty ("Weights", juce::var())); if (weights.toString().equalsIgnoreCase ("maxrE")) settings.weights = ReferenceCountedDecoder::Weights::maxrE; else if (weights.toString().equalsIgnoreCase ("inPhase")) settings.weights = ReferenceCountedDecoder::Weights::inPhase; else if (weights.toString().equalsIgnoreCase ("none")) settings.weights = ReferenceCountedDecoder::Weights::none; else return juce::Result::fail ( "Could not parse 'Weights' attribute. Expected 'maxrE', 'inPhase' or 'none' but got '" + weights.toString() + "'."); } // weights already applied if (decoderVar.hasProperty ("WeightsAlreadyApplied")) { auto weightsAlreadyApplied ( decoderVar.getProperty ("WeightsAlreadyApplied", juce::var())); if (weightsAlreadyApplied.isBool()) settings.weightsAlreadyApplied = weightsAlreadyApplied; else return juce::Result::fail ( "Could not parse 'WeightsAlreadyApplied' attribute. Expected bool but got '" + weightsAlreadyApplied.toString() + "'."); } if (decoderVar.hasProperty ("SubwooferChannel")) { auto subwooferChannel (decoderVar.getProperty ("SubwooferChannel", juce::var())); if (subwooferChannel.isInt()) { if (static_cast (subwooferChannel) < 1 || static_cast (subwooferChannel) > 64) return juce::Result::fail ( "'SubwooferChannel' attribute is not a valid channel number (1 <= subwooferChannel <= 64)."); settings.subwooferChannel = subwooferChannel; } else return juce::Result::fail ( "Could not parse 'SubwooferChannel' attribute. Expected channel number (int) but got '" + subwooferChannel.toString() + "'."); } newDecoder->setSettings (settings); *decoder = newDecoder; return juce::Result::ok(); } /** Extracts the routing array from a 'Routing' Var object and writes it to the ReferenceCountedMatrix object. */ static juce::Result getRoutingArray (juce::var& routingData, const int rows, ReferenceCountedMatrix::Ptr dest) { if (routingData.size() != rows) return juce::Result::fail ( "Length of 'Routing' attribute does not match number of matrix outputs (rows)."); auto& routingArray = dest->getRoutingArrayReference(); for (int r = 0; r < rows; ++r) { auto element = routingData.getArray()->getUnchecked (r); if (element.isInt()) routingArray.set (r, (int) element - 1); else return juce::Result::fail ("Datatype of 'Routing' element at position " + juce::String (r + 1) + " could not be interpreted (expected integer)."); } return juce::Result::ok(); } /** Loads a JSON-file (fileToParse) and tries to parse for a 'Decoder' object. If successful, writes the decoder into the destination (decoder). */ static juce::Result parseFileForDecoder (const juce::File& fileToParse, ReferenceCountedDecoder::Ptr* decoder) { jassert (decoder != nullptr); // parsing configuration file juce::var parsedJson; juce::Result result = parseFile (fileToParse, parsedJson); if (! result.wasOk()) return juce::Result::fail (result.getErrorMessage()); result = parseVarForDecoder (parsedJson, decoder); if (! result.wasOk()) return juce::Result::fail (result.getErrorMessage()); return juce::Result::ok(); } /** Parses a 'Decoder' object from a JSON juce::var. If successful, writes the decoder into the destination (decoder). */ static juce::Result parseVarForDecoder (const juce::var& jsonVar, ReferenceCountedDecoder::Ptr* decoder) { jassert (decoder != nullptr); // looking for a 'Decoder' object if (! jsonVar.hasProperty ("Decoder")) return juce::Result::fail ("No 'Decoder' object found in the configuration file."); auto decoderObject = jsonVar.getProperty ("Decoder", jsonVar); auto result = DecoderVar (decoderObject, decoder, jsonVar.getProperty ("Name", juce::var ("")), jsonVar.getProperty ("Description", juce::var (""))); if (! result.wasOk()) return juce::Result::fail (result.getErrorMessage()); return juce::Result::ok(); } #endif //#if CONFIGURATIONHELPER_ENABLE_DECODER_METHODS #if CONFIGURATIONHELPER_ENABLE_LOUDSPEAKERLAYOUT_METHODS /** Loads a JSON-file (fileToParse) and tries to parse for a 'LoudspeakerLayout' object. If successful, writes the loudspeakers (named 'elements') into a ValeTree object (loudspeakers). Set 'undoManager' to nullptr in case you don't want to use a undoManager. */ static juce::Result parseFileForLoudspeakerLayout (const juce::File& fileToParse, juce::ValueTree& loudspeakers, juce::UndoManager* undoManager) { return parseFileForGenericLayout (fileToParse, loudspeakers, undoManager); } /** Load and parse for a 'LoudspeakerLayout' object from a JSON juce::var. If successful, writes the generic object into a juce::ValueTree object (elements). Set 'undoManager' to nullptr in case you don't want to use a undoManager. */ static juce::Result parseVarForLoudspeakerLayout (const juce::var& parsedJson, juce::ValueTree& loudspeakers, juce::UndoManager* undoManager) { return parseVarForGenericLayout (parsedJson, loudspeakers, undoManager); } #endif // #if CONFIGURATIONHELPER_ENABLE_LOUDSPEAKERLAYOUT_METHODS #if CONFIGURATIONHELPER_ENABLE_GENERICLAYOUT_METHODS /** Loads a JSON-file (fileToParse) and tries to parse for a 'LoudspeakerLayout' or 'GenericLayout' object. If successful, writes the generic object into a juce::ValueTree object (elements). Set 'undoManager' to nullptr in case you don't want to use a undoManager. */ static juce::Result parseFileForGenericLayout (const juce::File& fileToParse, juce::ValueTree& elements, juce::UndoManager* undoManager) { // parse configuration file juce::var parsedJson; juce::Result result = parseFile (fileToParse, parsedJson); if (! result.wasOk()) return juce::Result::fail (result.getErrorMessage()); return parseVarForGenericLayout (parsedJson, elements, undoManager); } /** Load and parse for a 'LoudspeakerLayout' or 'GenericLayout' object from a JSON juce::var. If successful, writes the generic object into a juce::ValueTree object (elements). Set 'undoManager' to nullptr in case you don't want to use a undoManager. */ static juce::Result parseVarForGenericLayout (const juce::var& parsedJson, juce::ValueTree& elements, juce::UndoManager* undoManager) { // looks for a 'GenericLayout' or 'LoudspeakerLayout' object juce::var genericLayout; if (parsedJson.hasProperty ("GenericLayout")) genericLayout = parsedJson.getProperty ("GenericLayout", juce::var()); else if (parsedJson.hasProperty ("LoudspeakerLayout")) genericLayout = parsedJson.getProperty ("LoudspeakerLayout", juce::var()); else return juce::Result::fail ( "No 'GenericLayout' or 'LoudspeakerLayout' object found in the configuration file."); // looks for a 'GenericLayout' or 'LoudspeakerLayout' object juce::var elementArray; if (genericLayout.hasProperty ("Elements")) elementArray = genericLayout.getProperty ("Elements", juce::var()); else if (genericLayout.hasProperty ("Loudspeakers")) elementArray = genericLayout.getProperty ("Loudspeakers", juce::var()); else return juce::Result::fail ( "No 'Elements' or 'Loudspeakers' attribute found within the 'GenericLayout' or 'LoudspeakerLayout' object."); juce::Result result = addElementsToValueTree (elementArray, elements, undoManager); if (! result.wasOk()) return juce::Result::fail (result.getErrorMessage()); return juce::Result::ok(); } /** Appends all elements within the GenericLayout to the elements juce::ValueTree. */ static juce::Result addElementsToValueTree (juce::var& elementArray, juce::ValueTree& elements, juce::UndoManager* undoManager) { if (! elementArray.isArray()) return juce::Result::fail ("'elementArray' is not an array."); const int nElements = elementArray.size(); for (int i = 0; i < nElements; ++i) { juce::var& element = elementArray[i]; float azimuth, elevation, radius, gain; int channel; bool isImaginary; if (! element.hasProperty ("Azimuth")) return juce::Result::fail ("No 'Azimuth' attribute for element #" + juce::String (i + 1) + "."); auto azi = element.getProperty ("Azimuth", juce::var()); if (azi.isDouble() || azi.isInt()) azimuth = azi; else return juce::Result::fail ("Wrong datatype for attribute 'Azimuth' for element #" + juce::String (i + 1) + "."); if (! element.hasProperty ("Elevation")) return juce::Result::fail ("No 'Elevation' attribute for element #" + juce::String (i + 1) + "."); auto ele = element.getProperty ("Elevation", juce::var()); if (ele.isDouble() || ele.isInt()) elevation = ele; else return juce::Result::fail ("Wrong datatype for attribute 'Elevation' for element #" + juce::String (i + 1) + "."); if (! element.hasProperty ("Radius")) return juce::Result::fail ("No 'Radius' attribute for element #" + juce::String (i + 1) + "."); auto rad = element.getProperty ("Radius", juce::var()); if (rad.isDouble() || rad.isInt()) radius = rad; else return juce::Result::fail ("Wrong datatype for attribute 'Radius' for element #" + juce::String (i + 1) + "."); if (! element.hasProperty ("Gain")) return juce::Result::fail ("No 'Gain' attribute for element #" + juce::String (i + 1) + "."); auto g = element.getProperty ("Gain", juce::var()); if (g.isDouble() || g.isInt()) gain = g; else return juce::Result::fail ("Wrong datatype for attribute 'Gain' for element #" + juce::String (i + 1) + "."); if (! element.hasProperty ("Channel")) return juce::Result::fail ("No 'Channel' attribute for element #" + juce::String (i + 1) + "."); auto ch = element.getProperty ("Channel", juce::var()); if (ch.isInt()) channel = ch; else return juce::Result::fail ("Wrong datatype for attribute 'Channel' for element #" + juce::String (i + 1) + "."); if (! element.hasProperty ("IsImaginary")) return juce::Result::fail ("No 'IsImaginary' attribute for element #" + juce::String (i + 1) + "."); auto im = element.getProperty ("IsImaginary", juce::var()); if (im.isBool()) isImaginary = im; else return juce::Result::fail ( "Wrong datatype for attribute 'IsImaginary' for element #" + juce::String (i + 1) + "."); elements.appendChild ( createElement (azimuth, elevation, radius, channel, isImaginary, gain), undoManager); } return juce::Result::ok(); } /** Creates a single element juce::ValueTree, which can be appended to another juce::ValueTree holding several elements. */ static juce::ValueTree createElement (float azimuth, float elevation, float radius, int channel, bool isImaginary, float gain) { juce::ValueTree newElement ("Element"); newElement.setProperty ("Azimuth", azimuth, nullptr); newElement.setProperty ("Elevation", elevation, nullptr); newElement.setProperty ("Radius", radius, nullptr); newElement.setProperty ("Channel", channel, nullptr); newElement.setProperty ("Imaginary", isImaginary, nullptr); newElement.setProperty ("Gain", gain, nullptr); return newElement; } #endif // #if CONFIGURATIONHELPER_ENABLE_GENERICLAYOUT_METHODS #if CONFIGURATIONHELPER_ENABLE_DECODER_METHODS // =============== EXPORT ====================================================== /** Converts a ReferenceCountedDecoder object to a juce::var object. Useful for writing the Decoder to a configuration file. */ static juce::var convertDecoderToVar (ReferenceCountedDecoder::Ptr& decoder) { if (decoder == nullptr) return juce::var(); auto* obj = new juce::DynamicObject(); obj->setProperty ("Name", decoder->getName()); obj->setProperty ("Description", decoder->getDescription()); ReferenceCountedDecoder::Settings settings = decoder->getSettings(); obj->setProperty ( "ExpectedInputNormalization", settings.expectedNormalization == ReferenceCountedDecoder::Normalization::n3d ? "n3d" : "sn3d"); obj->setProperty ("Weights", settings.weights == ReferenceCountedDecoder::Weights::maxrE ? "maxrE" : settings.weights == ReferenceCountedDecoder::Weights::inPhase ? "inPhase" : "none"); obj->setProperty ("WeightsAlreadyApplied", juce::var (settings.weightsAlreadyApplied)); const int subwooferChannel = settings.subwooferChannel; if (subwooferChannel > 0) obj->setProperty ("SubwooferChannel", subwooferChannel); // decoder matrix juce::var decoderMatrix = convertMatrixToVar (decoder->getMatrix()); obj->setProperty ("Matrix", decoderMatrix); // routing array juce::var routing; juce::Array& routingArray = decoder->getRoutingArrayReference(); for (int i = 0; i < routingArray.size(); ++i) routing.append (routingArray[i] + 1); // one count obj->setProperty ("Routing", routing); return juce::var (obj); } #endif // #if CONFIGURATIONHELPER_ENABLE_DECODER_METHODS #if CONFIGURATIONHELPER_ENABLE_MATRIX_METHODS /** Converts a juce::dsp::Matrix object to a juce::var object. */ static juce::var convertMatrixToVar (juce::dsp::Matrix& mat) { juce::var matrixVar; for (int m = 0; m < mat.getSize()[0]; ++m) { juce::var row; for (int n = 0; n < mat.getSize()[1]; ++n) row.append (mat (m, n)); matrixVar.append (row); } return matrixVar; } /** Converts a ReferenceCountedMatrix object to a juce::var object. Useful for writing the juce::dsp::Matrix to a configuration file. */ static juce::var convertTransformationMatrixToVar (ReferenceCountedMatrix::Ptr& matrix) { if (matrix == nullptr) return juce::var(); auto* obj = new juce::DynamicObject(); obj->setProperty ("Name", matrix->getName()); obj->setProperty ("Description", matrix->getDescription()); auto transformationMatrix = convertMatrixToVar (matrix->getMatrix()); obj->setProperty ("Matrix", transformationMatrix); return juce::var (obj); } #endif // #if CONFIGURATIONHELPER_ENABLE_MATRIX_METHODS #if CONFIGURATIONHELPER_ENABLE_LOUDSPEAKERLAYOUT_METHODS /** Converts a loudspeakers juce::ValueTree object to a juce::var object. Useful for writing the loudspeakers to a configuration file ('LoudspeakerLayout'). Make sure the juce::ValueTree contains valid loudspeakers. */ static juce::var convertLoudspeakersToVar (juce::ValueTree& loudspeakers, juce::String name = "", juce::String description = "") { auto* obj = new juce::DynamicObject(); // loudspeaker layout object if (! name.isEmpty()) obj->setProperty ("Name", name); if (! description.isEmpty()) obj->setProperty ("Description", description); juce::var loudspeakerArray; for (juce::ValueTree::Iterator it = loudspeakers.begin(); it != loudspeakers.end(); ++it) { auto* loudspeaker = new juce:: DynamicObject(); // loudspeaker which gets added to the loudspeakerArray juce::var loudspeaker->setProperty ("Azimuth", (*it).getProperty ("Azimuth")); loudspeaker->setProperty ("Elevation", (*it).getProperty ("Elevation")); loudspeaker->setProperty ("Radius", (*it).getProperty ("Radius")); loudspeaker->setProperty ("IsImaginary", (*it).getProperty ("Imaginary")); loudspeaker->setProperty ("Channel", (*it).getProperty ("Channel")); loudspeaker->setProperty ("Gain", (*it).getProperty ("Gain")); loudspeakerArray.append (juce::var (loudspeaker)); } obj->setProperty ("Loudspeakers", loudspeakerArray); return juce::var (obj); } #endif //#if CONFIGURATIONHELPER_ENABLE_LOUDSPEAKERLAYOUT_METHODS #if CONFIGURATIONHELPER_ENABLE_GENERICLAYOUT_METHODS /** Converts a elements juce::ValueTree object to a juce::var object. Useful for writing the sources to a configuration file ('GenericLayout'). Make sure the juce::ValueTree contains valid elements. */ static juce::var convertElementsToVar (juce::ValueTree& elements, juce::String name = "", juce::String description = "") { auto* obj = new juce::DynamicObject(); if (! name.isEmpty()) obj->setProperty ("Name", name); if (! description.isEmpty()) obj->setProperty ("Description", description); juce::var elementArray; for (juce::ValueTree::Iterator it = elements.begin(); it != elements.end(); ++it) { auto* element = new juce::DynamicObject(); element->setProperty ("Azimuth", (*it).getProperty ("Azimuth")); element->setProperty ("Elevation", (*it).getProperty ("Elevation")); element->setProperty ("Radius", (*it).getProperty ("Radius")); element->setProperty ("IsImaginary", (*it).getProperty ("Imaginary")); element->setProperty ("Channel", (*it).getProperty ("Channel")); element->setProperty ("Gain", (*it).getProperty ("Gain")); elementArray.append (juce::var (element)); } obj->setProperty ("Elements", elementArray); return juce::var (obj); } #endif //#if CONFIGURATIONHELPER_ENABLE_GENERICLAYOUT_METHODS /** Writes a configuration juce::var to a JSON file. Example use-case: DynamicObject* configuration = new DynamicObject(); configuration->setProperty("Name", juce::var("Configuration Name")); configuration->setProperty("Description", juce::var("Description")); configuration->setProperty ("Decoder", ConfigurationHelper::convertDecoderToVar (referenceCountedDecoder)); configuration->setProperty ("LoudspeakerLayout", ConfigurationHelper::convertLoudspeakersToVar (loudspeakersValueTree)); ConfigurationHelper::writeConfigurationToFile (fileName, juce::var (configuration)); */ static juce::Result writeConfigurationToFile (juce::File& fileToWrite, juce::var configuration) { juce::String jsonString = juce::JSON::toString (configuration); if (fileToWrite.replaceWithText (jsonString)) return juce::Result::ok(); else return juce::Result::fail ("Writing configuration failed."); } }; IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/customComponents/0000775002537200253720000000000015257173642030221 5ustar zmoelnigzmoelnig././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/customComponents/OnOffButton.hIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/customComponents/OnOffButt0000664002537200253720000001322415257173642032014 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2018 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once #include "../JuceLibraryCode/JuceHeader.h" //============================================================================== /* */ static const unsigned char powerButtonData[] = { 110, 109, 43, 135, 207, 65, 0, 0, 0, 0, 98, 47, 221, 189, 65, 0, 0, 0, 0, 68, 139, 175, 65, 47, 221, 228, 63, 68, 139, 175, 65, 20, 174, 127, 64, 108, 68, 139, 175, 65, 51, 51, 204, 65, 98, 68, 139, 175, 65, 35, 219, 221, 65, 47, 221, 189, 65, 246, 40, 236, 65, 43, 135, 207, 65, 246, 40, 236, 65, 98, 39, 49, 225, 65, 246, 40, 236, 65, 18, 131, 239, 65, 35, 219, 221, 65, 18, 131, 239, 65, 51, 51, 204, 65, 108, 18, 131, 239, 65, 20, 174, 127, 64, 98, 18, 131, 239, 65, 47, 221, 228, 63, 39, 49, 225, 65, 0, 0, 0, 0, 43, 135, 207, 65, 0, 0, 0, 0, 99, 109, 70, 182, 31, 65, 133, 235, 13, 65, 98, 66, 96, 15, 65, 162, 69, 14, 65, 4, 86, 254, 64, 229, 208, 20, 65, 35, 219, 229, 64, 178, 157, 33, 65, 98, 12, 2, 35, 64, 2, 43, 111, 65, 0, 0, 0, 0, 31, 133, 170, 65, 0, 0, 0, 0, 221, 36, 224, 65, 98, 0, 0, 0, 0, 76, 55, 41, 66, 98, 16, 58, 65, 125, 191, 87, 66, 43, 135, 207, 65, 125, 191, 87, 66, 98, 12, 2, 33, 66, 125, 191, 87, 66, 98, 144, 79, 66, 76, 55, 41, 66, 37, 134, 79, 66, 221, 36, 224, 65, 98, 12, 130, 79, 66, 31, 133, 170, 65, 10, 87, 69, 66, 2, 43, 111, 65, 199, 203, 50, 66, 178, 157, 33, 65, 98, 94, 186, 44, 66, 113, 61, 8, 65, 117, 147, 34, 66, 2, 43, 7, 65, 20, 46, 28, 66, 227, 165, 31, 65, 98, 4, 214, 21, 66, 133, 235, 55, 65, 129, 149, 21, 66, 201, 118, 96, 65, 57, 180, 27, 66, 74, 12, 122, 65, 98, 86, 142, 40, 66, 72, 225, 151, 65, 141, 151, 47, 66, 231, 251, 186, 65, 141, 151, 47, 66, 221, 36, 224, 65, 98, 141, 151, 47, 66, 172, 156, 23, 66, 186, 73, 15, 66, 186, 201, 55, 66, 139, 108, 207, 65, 186, 201, 55, 66, 98, 174, 71, 128, 65, 186, 201, 55, 66, 188, 116, 255, 64, 172, 156, 23, 66, 188, 116, 255, 64, 221, 36, 224, 65, 98, 188, 116, 255, 64, 231, 251, 186, 65, 133, 235, 27, 65, 180, 200, 151, 65, 199, 75, 79, 65, 74, 12, 122, 65, 98, 217, 206, 103, 65, 250, 126, 96, 65, 219, 249, 102, 65, 221, 36, 56, 65, 90, 100, 77, 65, 227, 165, 31, 65, 98, 141, 151, 64, 65, 115, 104, 19, 65, 98, 16, 48, 65, 104, 145, 13, 65, 70, 182, 31, 65, 133, 235, 13, 65, 99, 109, 70, 182, 31, 65, 133, 235, 13, 65, 99, 101, 0, 0 }; class OnOffButton : public juce::ToggleButton { public: OnOffButton() { powerButton.loadPathFromData (powerButtonData, sizeof (powerButtonData)); } ~OnOffButton() override = default; void paint (juce::Graphics& g) override { auto bounds = getLocalBounds(); const float boxSize = bounds.getWidth() * 0.8f; juce::Rectangle buttonArea (0.5f * (bounds.getWidth() - boxSize), 0.5f * (bounds.getHeight() - boxSize), boxSize, boxSize); const bool isButtonDown = isMouseButtonDown(); const bool isMouseOverButton = isMouseOver(); const bool ticked = getToggleState(); if (isButtonDown) buttonArea.reduce (0.8f, 0.8f); else if (isMouseOverButton) buttonArea.reduce (0.4f, 0.4f); g.setColour (findColour (juce::ToggleButton::tickColourId) .withMultipliedAlpha (ticked ? 1.0f : isMouseOverButton ? 0.7f : 0.5f)); g.drawEllipse (buttonArea, 1.0f); buttonArea.reduce (1.5f, 1.5f); g.setColour (findColour (juce::ToggleButton::tickColourId) .withMultipliedAlpha (ticked ? 1.0f : isMouseOverButton ? 0.5f : 0.2f)); g.fillEllipse (buttonArea); g.setColour (ticked ? findColour (juce::ResizableWindow::backgroundColourId) : findColour (juce::ToggleButton::tickColourId) .withMultipliedAlpha (isMouseOverButton ? 0.7f : 0.5f)); g.fillPath (powerButton, powerButton.getTransformToScaleToFit (buttonArea.reduced (2.0f), true)); } void resized() override {} private: juce::Path powerButton; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (OnOffButton) }; ././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/customComponents/MuteSoloButton.hIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/customComponents/MuteSoloB0000664002537200253720000000542615257173642032024 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once #include //============================================================================== /* */ class MuteSoloButton : public juce::ToggleButton { public: enum Type { mute, solo }; MuteSoloButton() { setType (Type::mute); } ~MuteSoloButton() {} void setType (Type newType) { type = newType; setColour (juce::ToggleButton::tickColourId, type == Type::mute ? juce::Colours::red : juce::Colours::yellow); repaint(); } void paint (juce::Graphics& g) override { juce::Rectangle bounds = getLocalBounds().reduced (1, 1); const bool state = getToggleState(); getLookAndFeel().drawTickBox (g, *this, bounds.getX(), bounds.getY(), bounds.getWidth(), bounds.getHeight(), getToggleState(), isEnabled(), isMouseOver(), isMouseButtonDown()); auto currentFont = juce::FontOptions ( getLookAndFeel().getTypefaceForFont ( juce::FontOptions (static_cast (bounds.getHeight() - 4), 0))) .withHeight (static_cast (bounds.getHeight() - 4)); g.setFont (currentFont); g.setColour (state ? juce::Colours::black : findColour (juce::ToggleButton::tickColourId)); g.drawFittedText (type == solo ? "S" : "M", bounds, juce::Justification::centred, 1); } void resized() override {} private: Type type; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MuteSoloButton) }; ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/customComponents/LevelMeter.hIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/customComponents/LevelMete0000664002537200253720000001410415257173642032026 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once #include "../JuceLibraryCode/JuceHeader.h" //============================================================================== /* */ class LevelMeter : public juce::Component { class Overlay : public juce::Component { public: Overlay() { setBufferedToImage (true); } ~Overlay() override = default; const float decibelsToY (const float dB) { return offset - scale * std::tanh (dB / minLevel * -2.0f); } void setMinLevel (float newMinLevel) { minLevel = newMinLevel; repaint(); } const float getOffset() { return offset; } const float getMeterHeight() { return getHeight() - 2; } const juce::Rectangle getMeterArea() { return meterArea; } private: void paint (juce::Graphics& g) override { juce::Path bg; juce::Rectangle meterArea (0, 0, getWidth(), getHeight()); meterArea.reduce (2, 2); int width = meterArea.getWidth(); int xPos = meterArea.getX(); bg.addRoundedRectangle (meterArea, 2); g.setColour (juce::Colour (0xFF212121)); g.strokePath (bg, juce::PathStrokeType (2.f)); g.setColour (juce::Colours::white); auto currentFont = juce::FontOptions (getLookAndFeel().getTypefaceForFont ( juce::FontOptions (9.0f, 0))) .withHeight (9.0f); g.setFont (currentFont); int lastTextDrawPos = -1; drawLevelMark (g, xPos, width, 0, "0"); drawLevelMark (g, xPos, width, -3, "3"); drawLevelMark (g, xPos, width, -6, "6"); for (float dB = -10.0f; dB >= minLevel; dB -= 5.0f) lastTextDrawPos = drawLevelMark (g, xPos, width, dB, juce::String (juce::roundToInt (-dB)), lastTextDrawPos); } void resized() override { offset = 0.1 * getHeight(); scale = getHeight() - offset; meterArea = juce::Rectangle (0, 0, getWidth(), getHeight()).reduced (2, 2); } const int inline drawLevelMark (juce::Graphics& g, int x, int width, const int level, const juce::String& label, int lastTextDrawPos = -1) { float yPos = decibelsToY (level); x = x + 1.0f; width = width - 2.0f; g.drawLine (x, yPos, x + 2, yPos); g.drawLine (x + width - 2, yPos, x + width, yPos); if (yPos - 4 > lastTextDrawPos) { g.drawText (label, x + 2, yPos - 4, width - 4, 9, juce::Justification::centred, false); return yPos + 5; } return lastTextDrawPos; } juce::Rectangle meterArea; float minLevel = -60.0f; float scale = 0.0f; float offset = 0.0f; }; public: LevelMeter() { addAndMakeVisible (overlay); } ~LevelMeter() {} void setGainReductionMeter (bool isGainReductionMeter) { isGRmeter = isGainReductionMeter; repaint(); } void paint (juce::Graphics& g) override { const int height = overlay.getMeterHeight(); auto meterArea = overlay.getMeterArea(); g.setColour (juce::Colours::black); g.fillRect (meterArea); juce::Rectangle lvlRect; if (isGRmeter) lvlRect = juce::Rectangle ( juce::Point (meterArea.getX(), overlay.getOffset()), juce::Point (meterArea.getRight(), overlay.decibelsToY (level))); else lvlRect = juce::Rectangle ( juce::Point (meterArea.getX(), height), juce::Point (meterArea.getRight(), overlay.decibelsToY (level))); g.setColour (levelColour); g.fillRect (lvlRect); } void setColour (juce::Colour newColour) { levelColour = newColour; repaint(); } void setLevel (const float newLevel) { if (level != newLevel) { level = newLevel; repaint(); } } void setMinLevel (float newMinLevel) { overlay.setMinLevel (newMinLevel); repaint(); } void resized() override { overlay.setBounds (getLocalBounds()); } private: Overlay overlay; juce::Colour levelColour = juce::Colour (juce::Colours::green); bool isGRmeter = false; float level = 0.0f; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (LevelMeter) }; ././@LongLink0000644000000000000000000000015200000000000011601 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/customComponents/DoubleSlider.hIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/customComponents/DoubleSli0000664002537200253720000001304515257173642032031 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once #include "ReverseSlider.h" //============================================================================== /* */ class DoubleSlider : public juce::Component, public juce::Slider::Listener { public: DoubleSlider() { leftSlider.reset (new ReverseSlider ("left")); middleSlider.reset (new ReverseSlider ("middle")); rightSlider.reset (new ReverseSlider ("right")); addAndMakeVisible (leftSlider.get()); addAndMakeVisible (middleSlider.get()); addAndMakeVisible (rightSlider.get()); leftSlider->setSliderStyle (juce::Slider::IncDecButtons); leftSlider->setTextBoxStyle (juce::Slider::TextBoxAbove, false, 50, 50); leftSlider->setRange (minRange, maxRange, 1); leftSlider->setIncDecButtonsMode (juce::Slider::incDecButtonsDraggable_AutoDirection); leftSlider->addListener (this); middleSlider->setSliderStyle (juce::Slider::TwoValueHorizontal); middleSlider->setTextBoxStyle (juce::Slider::NoTextBox, false, 50, 50); middleSlider->addListener (this); rightSlider->setSliderStyle (juce::Slider::IncDecButtons); rightSlider->setTextBoxStyle (juce::Slider::TextBoxAbove, false, 50, 50); rightSlider->setRange (minRange, maxRange, 1); rightSlider->setIncDecButtonsMode (juce::Slider::incDecButtonsDraggable_AutoDirection); rightSlider->addListener (this); } ~DoubleSlider() {} ReverseSlider* getLeftSliderAddress() { return leftSlider.get(); } ReverseSlider* getMiddleSliderAddress() { return middleSlider.get(); } ReverseSlider* getRightSliderAddress() { return rightSlider.get(); } void setLeftRightSliderWidth (float width) { leftRightSliderWidth = width; resized(); }; void setColour (juce::Colour colour) { middleSlider->setColour (juce::Slider::rotarySliderOutlineColourId, colour); }; void setRangeAndPosition (juce::NormalisableRange leftRange, juce::NormalisableRange rightRange) { minRange = juce::jmin (leftRange.start, rightRange.start); maxRange = juce::jmax (leftRange.end, rightRange.end); middleSlider->setRange (minRange, maxRange); middleSlider->setSkewFactor (leftRange.skew); middleSlider->setMinAndMaxValues (leftSlider->getValue(), rightSlider->getValue()); }; void setSkew (double skew) { leftSlider->setSkewFactor (skew); middleSlider->setSkewFactor (skew); rightSlider->setSkewFactor (skew); } void mouseDown (const juce::MouseEvent& event) override {}; void mouseUp (const juce::MouseEvent& event) override {}; void sliderDragStarted (juce::Slider* slider) override {}; void sliderDragEnded (juce::Slider* slider) override {}; void sliderValueChanged (juce::Slider* slider) override { if (slider->getName().equalsIgnoreCase ("middle")) { leftSlider->setValue (slider->getMinValue()); rightSlider->setValue (slider->getMaxValue()); } else if (slider->getName().equalsIgnoreCase ("left")) { middleSlider->setMinValue (leftSlider->getValue(), juce::dontSendNotification, true); } else if (slider->getName().equalsIgnoreCase ("right")) { middleSlider->setMaxValue (rightSlider->getValue(), juce::dontSendNotification, true); } }; void paint (juce::Graphics& g) override {} void resized() override { // This method is where you should set the bounds of any child // components that your component contains.. juce::Rectangle bounds = getLocalBounds(); leftSlider->setBounds (bounds.removeFromLeft (leftRightSliderWidth + buttonsWidth)); leftSlider->setTextBoxStyle (juce::Slider::TextBoxAbove, false, leftRightSliderWidth, bounds.getHeight()); rightSlider->setBounds (bounds.removeFromRight (leftRightSliderWidth + buttonsWidth)); rightSlider->setTextBoxStyle (juce::Slider::TextBoxAbove, false, leftRightSliderWidth, bounds.getHeight()); middleSlider->setBounds (bounds); } private: JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DoubleSlider) std::unique_ptr leftSlider, middleSlider, rightSlider; float leftRightSliderWidth = 50; float minRange = 0; float maxRange = 1; float buttonsWidth = 10; }; ././@LongLink0000644000000000000000000000015500000000000011604 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/customComponents/HammerAitovGrid.hIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/customComponents/HammerAit0000664002537200253720000001603715257173642032022 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once #include "../HammerAitov.h" #include "Conversions.h" //============================================================================== /* */ class HammerAitovGrid : public juce::Component { public: HammerAitovGrid() { setBufferedToImage (true); //calculating path prototype outline.clear(); boldGrid.clear(); regularGrid.clear(); juce::Path* workingPath; // vertical lines for (int ele = -90; ele <= 90; ele += 30) { if (ele % 45 == 0) workingPath = &boldGrid; else workingPath = ®ularGrid; workingPath->startNewSubPath (anglesToPoint (-180, ele)); for (int azi = -165; azi <= 180; azi += 15) { workingPath->lineTo (anglesToPoint (azi, ele)); } } // horizontal lines for (int azi = -180; azi <= 180; azi += 30) { if (azi % 90 == 0) workingPath = &boldGrid; else workingPath = ®ularGrid; workingPath->startNewSubPath (anglesToPoint (azi, -90)); for (int ele = -85; ele <= 90; ele += 5) { workingPath->lineTo (anglesToPoint (azi, ele)); } } outline.startNewSubPath (anglesToPoint (180, -90)); for (int ele = -85; ele <= 90; ele += 5) { outline.lineTo (anglesToPoint (180, ele)); } for (int ele = 85; ele >= -85; ele -= 5) { outline.lineTo (anglesToPoint (-180, ele)); } outline.closeSubPath(); } ~HammerAitovGrid() override = default; void paint (juce::Graphics& g) override { juce::Path path; g.setColour (juce::Colour (0xFF2D2D2D)); juce::Path rectangle; rectangle.addRectangle (getLocalBounds()); rectangle.setUsingNonZeroWinding (false); path = outline; path.applyTransform (toArea); rectangle.addPath (path); g.fillPath (rectangle); g.setColour (juce::Colours::white); path = boldGrid; path.applyTransform (toArea); g.strokePath (path, juce::PathStrokeType (1.0f)); path = regularGrid; path.applyTransform (toArea); g.strokePath (path, juce::PathStrokeType (0.2f)); // text auto currentFont = juce::FontOptions (getLookAndFeel().getTypefaceForFont (juce::FontOptions (12.0f, 1))) .withHeight (12.0f); g.setFont (currentFont); juce::Point textPos; textPos = anglesToPoint (0, 0); textPos.applyTransform (toArea); g.drawText ("FRONT", textPos.x, textPos.y - 12, 30, 12, juce::Justification::centred); textPos = anglesToPoint (90, 0); textPos.applyTransform (toArea); g.drawText ("LEFT", textPos.x, textPos.y - 12, 30, 12, juce::Justification::centred); textPos = anglesToPoint (-90, 0); textPos.applyTransform (toArea); g.drawText ("RIGHT", textPos.x, textPos.y - 12, 30, 12, juce::Justification::centred); textPos = anglesToPoint (180, 0); textPos.applyTransform (toArea); g.drawText ("BACK", textPos.x, textPos.y - 12, 30, 12, juce::Justification::centred); textPos = anglesToPoint (-180, 0); textPos.applyTransform (toArea); g.drawText ("BACK", textPos.x - 30, textPos.y - 12, 30, 12, juce::Justification::centred); textPos = anglesToPoint (0, -90); textPos.applyTransform (toArea); g.drawText ("TOP", textPos.x - 15, textPos.y - 12, 30, 12, juce::Justification::centred); textPos = anglesToPoint (0, 90); textPos.applyTransform (toArea); g.drawText ("BOTTOM", textPos.x - 25, textPos.y, 50, 12, juce::Justification::centred); currentFont = juce::FontOptions (getLookAndFeel().getTypefaceForFont (juce::FontOptions (12.0f, 2))) .withHeight (12.0f); g.setFont (currentFont); // azimuth labels for (int azi = -150; azi <= 150; azi += 30) { textPos = anglesToPoint (azi, 0); textPos.applyTransform (toArea); g.drawText (juce::String (azi) + juce::String (juce::CharPointer_UTF8 ("\xc2\xb0")), textPos.x, textPos.y, 25, 12, juce::Justification::centred); } // elevation labels for (int ele = -60; ele <= 60; ele += 30) { if (ele != 0) { textPos = anglesToPoint (0, -ele); textPos.applyTransform (toArea); g.drawText (juce::String (ele) + juce::String (juce::CharPointer_UTF8 ("\xc2\xb0")), textPos.x, textPos.y - 12, 20, 12, juce::Justification::centred); } } } void resized() override { juce::Rectangle area = getLocalBounds(); toArea = juce::AffineTransform::fromTargetPoints (area.getCentreX(), area.getCentreY(), area.getRight() - 10.0f, area.getCentreY(), area.getCentreX(), area.getBottom() - 20.0f); } juce::Point anglesToPoint (int azimuthInDegree, int elevationInDegree) //hammer-aitov-projection { return HammerAitov::sphericalToXY ( Conversions::degreesToRadians (azimuthInDegree), Conversions::degreesToRadians (elevationInDegree)); } private: juce::Path outline; juce::Path boldGrid; juce::Path regularGrid; juce::AffineTransform toArea; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (HammerAitovGrid) }; IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/customComponents/XYPad.h0000664002537200253720000001157315257173642031366 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once //============================================================================== /* */ class XYPad : public juce::Component { struct xySlidersAndColour { juce::Slider* xSlider = nullptr; juce::Slider* ySlider = nullptr; juce::Colour colour; }; public: XYPad() {} ~XYPad() {} void paint (juce::Graphics& g) override { int topLeftX = plotArea.getX(); int bottomY = plotArea.getY() + plotArea.getHeight(); int size = elements.size(); for (int i = 0; i < size; ++i) { bool isActive = activeElem == i; xySlidersAndColour handle = elements.getReference (i); juce::Range xRange = handle.xSlider->getRange(); juce::Range yRange = handle.ySlider->getRange(); float xPos = topLeftX + (handle.xSlider->getValue() - xRange.getStart()) * width / xRange.getLength(); float yPos = bottomY - (handle.ySlider->getValue() - yRange.getStart()) * height / yRange.getLength(); juce::Path path; path.addEllipse (xPos - 8, yPos - 8, 16, 16); g.setColour (handle.colour); g.fillPath (path); if (isActive) { g.setColour (juce::Colours::white); g.strokePath (path, juce::PathStrokeType (2.0f)); } } } void resized() override { juce::Rectangle bounds = getLocalBounds(); bounds.reduce (12, 12); plotArea = bounds; width = bounds.getWidth(); height = bounds.getHeight(); } void mouseMove (const juce::MouseEvent& event) override { juce::Point pos = event.getPosition(); int oldActiveElem = activeElem; activeElem = -1; int topLeftX = plotArea.getX(); int bottomY = plotArea.getY() + plotArea.getHeight(); for (int i = elements.size(); --i >= 0;) { xySlidersAndColour handle = elements.getReference (i); juce::Range xRange = handle.xSlider->getRange(); juce::Range yRange = handle.ySlider->getRange(); float xPos = topLeftX + (handle.xSlider->getValue() - xRange.getStart()) * width / xRange.getLength(); float yPos = bottomY - (handle.ySlider->getValue() - yRange.getStart()) * height / yRange.getLength(); if (pos.getDistanceSquaredFrom (juce::Point (xPos, yPos).toInt()) < 80) { activeElem = i; break; } } if (oldActiveElem != activeElem) repaint(); } void mouseDrag (const juce::MouseEvent& event) override { juce::Point pos = event.getPosition() - plotArea.getTopLeft(); if (activeElem != -1 && elements.size() - 1 >= activeElem) { xySlidersAndColour handle = elements.getReference (activeElem); juce::Range xRange = handle.xSlider->getRange(); juce::Range yRange = handle.ySlider->getRange(); handle.xSlider->setValue (xRange.getLength() * pos.x / width + xRange.getStart()); handle.ySlider->setValue (yRange.getLength() * (height - pos.y) / height + yRange.getStart()); repaint(); } } void mouseUp (const juce::MouseEvent& event) override { activeElem = -1; repaint(); } void addElement (juce::Slider& newXSlider, juce::Slider& newYSlider, juce::Colour newColour) { elements.add ({ &newXSlider, &newYSlider, newColour }); } protected: juce::Array elements; int activeElem = -1; juce::Rectangle plotArea; float width; float height; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (XYPad) }; ././@LongLink0000644000000000000000000000015600000000000011605 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/customComponents/FilterVisualizer.hIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/customComponents/FilterVis0000664002537200253720000004766715257173642032077 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once #include #include template class FilterVisualizer : public juce::Component { struct Settings { float fMin = 20.0f; // minimum displayed frequency float fMax = 20000.0f; // maximum displayed frequency float dbMin = -15.0f; // min displayed dB float dbMax = 15.0f; // max displayed dB float gridDiv = 5.0f; // how many dB per divisions (between grid lines) bool gainHandleLin = false; // are the filter gain sliders linear? }; template struct FilterWithSlidersAndColour { typename juce::dsp::IIR::Coefficients::Ptr coefficients; juce::Colour colour; juce::Slider* frequencySlider = nullptr; juce::Slider* gainSlider = nullptr; juce::Slider* qSlider = nullptr; float* overrideGain = nullptr; bool enabled = true; }; const float mL = 23.0f; const float mR = 10.0f; const float mT = 7.0f; const float mB = 15.0f; const float OH = 3.0f; public: FilterVisualizer() : overallGainInDb (0.0f), sampleRate (48000.0) { init(); } FilterVisualizer (float fMin, float fMax, float dbMin, float dbMax, float gridDiv, bool gainHandleLin = false) : overallGainInDb (0.0f), sampleRate (48000.0), s { fMin, fMax, dbMin, dbMax, gridDiv, gainHandleLin } { init(); } ~FilterVisualizer() override {} void init() { dynamic = s.dbMax - s.dbMin; zero = 2.0f * s.dbMax / dynamic; scale = 1.0f / (zero + std::tanh (s.dbMin / dynamic * -2.0f)); } void paint (juce::Graphics& g) override { g.setColour (juce::Colours::steelblue.withMultipliedAlpha (0.01f)); g.fillAll(); g.setFont ( juce::FontOptions (getLookAndFeel().getTypefaceForFont (juce::FontOptions (12.0f, 2)))); g.setFont (12.0f); // db labels float dyn = s.dbMax - s.dbMin; int numgridlines = juce::roundToInt (dyn / s.gridDiv + 1); //g.setFont(juce::Font(getLookAndFeel().getTypefaceForFont (juce::Font(10.0f, 1))); g.setColour (juce::Colours::white); int lastTextDrawPos = -1; for (int i = 0; i < numgridlines; ++i) { const auto db_val = s.dbMax - i * s.gridDiv; lastTextDrawPos = drawLevelMark (g, 0, 20, juce::roundToInt (db_val), juce::String (db_val, 0), lastTextDrawPos); } // frequency labels for (float f = s.fMin; f <= s.fMax; f += pow (10.0f, floor (log10 (f)))) { int xpos = hzToX (f); juce::String axislabel; bool drawText = false; if ((f == 20) || (f == 50) || (f == 100) || (f == 500)) { axislabel = juce::String (f, 0); drawText = true; } else if ((f == 1000) || (f == 5000) || (f == 10000) || (f == 20000)) { axislabel = juce::String (f / 1000, 0); axislabel << "k"; drawText = true; } else continue; g.drawText (axislabel, xpos - 10, dbToY (s.dbMin) + OH + 0.0f, 20, 12, juce::Justification::centred, false); } g.setColour (juce::Colours::steelblue.withMultipliedAlpha (0.8f)); g.strokePath (dbGridPath, juce::PathStrokeType (0.5f)); g.setColour (juce::Colours::steelblue.withMultipliedAlpha (0.9f)); g.strokePath (hzGridPathBold, juce::PathStrokeType (1.0f)); g.setColour (juce::Colours::steelblue.withMultipliedAlpha (0.8f)); g.strokePath (hzGridPath, juce::PathStrokeType (0.5f)); // draw filter magnitude responses juce::Path magnitude; allMagnitudesInDb.fill (overallGainInDb); const int xMin = hzToX (s.fMin); const int xMax = hzToX (s.fMax); const int yMin = juce::jmax (dbToY (s.dbMax), 0); const int yMax = juce::jmax (dbToY (s.dbMin), yMin); const int yZero = filtersAreParallel ? yMax + 10 : dbToY (0.0f); g.excludeClipRegion ( juce::Rectangle (0.0f, yMax + OH, getWidth(), getHeight() - yMax - OH)); if (filtersAreParallel) complexMagnitudes.fill (std::complex()); for (int b = elements.size(); --b >= 0;) { bool isActive = activeElem == b; magnitude.clear(); auto handle (elements[b]); const bool isEnabled = handle->enabled; typename juce::dsp::IIR::Coefficients::Ptr coeffs = handle->coefficients; //calculate magnitude response if (coeffs != nullptr) coeffs->getMagnitudeForFrequencyArray (frequencies.getRawDataPointer(), magnitudes.getRawDataPointer(), numPixels, sampleRate); float additiveDB = 0.0f; if (filtersAreParallel && handle->gainSlider != nullptr) additiveDB = handle->gainSlider->getValue(); //calculate phase response if needed if (filtersAreParallel && coeffs != nullptr) coeffs->getPhaseForFrequencyArray (frequencies.getRawDataPointer(), phases.getRawDataPointer(), numPixels, sampleRate); float db = juce::Decibels::gainToDecibels (magnitudes[0]) + additiveDB; magnitude.startNewSubPath (xMin, juce::jlimit (static_cast (yMin), static_cast (yMax) + OH + 1.0f, dbToYFloat (db))); for (int i = 1; i < numPixels; ++i) { const auto decibels = juce::Decibels::gainToDecibels (magnitudes[i]) + additiveDB; float y = juce::jlimit (static_cast (yMin), static_cast (yMax) + OH + 1.0f, dbToYFloat (decibels)); float x = xMin + i; magnitude.lineTo (x, y); } g.setColour (handle->colour.withMultipliedAlpha (isEnabled ? 0.7f : 0.1f)); g.strokePath (magnitude, juce::PathStrokeType (isActive ? 2.5f : 1.0f)); magnitude.lineTo (xMax, yZero); magnitude.lineTo (xMin, yZero); magnitude.closeSubPath(); g.setColour (handle->colour.withMultipliedAlpha (isEnabled ? 0.3f : 0.1f)); g.fillPath (magnitude); float multGain = (handle->overrideGain != nullptr) ? *handle->overrideGain : juce::Decibels::decibelsToGain (additiveDB); //overall magnitude update if (isEnabled) { if (filtersAreParallel) { for (int i = 0; i < numPixels; ++i) { complexMagnitudes.setUnchecked ( i, complexMagnitudes[i] + std::polar (magnitudes[i] * multGain, phases[i])); //*addGain } } else { for (int i = 0; i < numPixels; ++i) { const float dB = juce::Decibels::gainToDecibels (magnitudes[i] * multGain); allMagnitudesInDb.setUnchecked (i, allMagnitudesInDb[i] + dB); } } } } if (filtersAreParallel) for (int i = 0; i < numPixels; ++i) { const float dB = juce::Decibels::gainToDecibels (std::abs (complexMagnitudes[i])); allMagnitudesInDb.setUnchecked (i, allMagnitudesInDb[i] + dB); } //all magnitudes combined magnitude.clear(); magnitude.startNewSubPath (xMin, juce::jlimit (static_cast (yMin), static_cast (yMax) + OH + 1.0f, dbToYFloat (allMagnitudesInDb[0]))); for (int x = xMin + 1; x <= xMax; ++x) { magnitude.lineTo (x, juce::jlimit (static_cast (yMin), static_cast (yMax) + OH + 1.0f, dbToYFloat (allMagnitudesInDb[x - xMin]))); } g.setColour (juce::Colours::white); g.strokePath (magnitude, juce::PathStrokeType (1.5f)); magnitude.lineTo (xMax, yZero); magnitude.lineTo (xMin, yZero); magnitude.closeSubPath(); g.setColour (juce::Colours::white.withMultipliedAlpha (0.1f)); g.fillPath (magnitude); const int size = elements.size(); for (int i = 0; i < size; ++i) { auto handle (elements[i]); float circX = handle->frequencySlider == nullptr ? hzToX (s.fMin) : hzToX (handle->frequencySlider->getValue()); float circY; if (! s.gainHandleLin) circY = handle->gainSlider == nullptr ? dbToY (0.0f) : dbToY (handle->gainSlider->getValue()); else circY = handle->gainSlider == nullptr ? dbToY (0.0f) : dbToY (juce::Decibels::gainToDecibels (handle->gainSlider->getValue())); g.setColour (juce::Colour (0xFF191919)); g.drawEllipse (circX - 5.0f, circY - 5.0f, 10.0f, 10.0f, 3.0f); g.setColour (handle->colour); g.drawEllipse (circX - 5.0f, circY - 5.0f, 10.0f, 10.0f, 2.0f); g.setColour (activeElem == i ? handle->colour : handle->colour.withSaturation (0.2)); g.fillEllipse (circX - 5.0f, circY - 5.0f, 10.0f, 10.0f); } } int inline drawLevelMark (juce::Graphics& g, int x, int width, const int level, const juce::String& label, int lastTextDrawPos = -1) { float yPos = dbToYFloat (level); x = x + 1; width = width - 2; if (yPos - 4 > lastTextDrawPos) { g.drawText (label, x + 2, yPos - 4, width - 4, 9, juce::Justification::right, false); return yPos + 5; } return lastTextDrawPos; } int dbToY (float dB) { int ypos = juce::roundToInt (dbToYFloat (dB)); return ypos; } float dbToYFloat (float dB) { const float height = static_cast (getHeight()) - mB - mT; if (height <= 0.0f) return 0.0f; float temp; if (dB < 0.0f) temp = zero + std::tanh (dB / dynamic * -2.0f); else temp = zero - 2.0f * dB / dynamic; return mT + scale * height * temp; } float yToDb (const float y) { float height = static_cast (getHeight()) - mB - mT; float temp = (y - mT) / height / scale - zero; float dB; if (temp > 0.0f) dB = std::atanh (temp) * dynamic * -0.5f; else dB = -0.5f * temp * dynamic; return std::isnan (dB) ? s.dbMin : dB; } int hzToX (float hz) { float width = static_cast (getWidth()) - mL - mR; int xpos = mL + width * (log (hz / s.fMin) / log (s.fMax / s.fMin)); return xpos; } float xToHz (int x) { float width = static_cast (getWidth()) - mL - mR; return s.fMin * pow ((s.fMax / s.fMin), ((x - mL) / width)); } void setSampleRate (const double newSampleRate) { if (newSampleRate == 0) sampleRate = 48000.0; else sampleRate = newSampleRate; repaint(); } void setOverallGain (float newGain) { float gainInDb = juce::Decibels::gainToDecibels (newGain); if (overallGainInDb != gainInDb) { overallGainInDb = gainInDb; repaint(); } } void setOverallGainInDecibels (float newGainInDecibels) { if (overallGainInDb != newGainInDecibels) { overallGainInDb = newGainInDecibels; repaint(); } } void mouseWheelMove (const juce::MouseEvent& event, const juce::MouseWheelDetails& wheel) override { if (activeElem != -1) { juce::Slider* slHandle = elements[activeElem]->qSlider; if (slHandle != nullptr) slHandle->mouseWheelMove (event, wheel); } } void mouseDrag (const juce::MouseEvent& event) override { juce::Point pos = event.getPosition(); float frequency = xToHz (pos.x); float gain; if (! s.gainHandleLin) gain = yToDb (pos.y); else gain = juce::Decibels::decibelsToGain (yToDb (pos.y)); if (activeElem != -1) { auto handle (elements[activeElem]); if (handle->frequencySlider != nullptr) handle->frequencySlider->setValue (frequency); if (handle->gainSlider != nullptr) handle->gainSlider->setValue (gain); } } void mouseMove (const juce::MouseEvent& event) override { juce::Point pos = event.getPosition(); int oldActiveElem = activeElem; activeElem = -1; for (int i = elements.size(); --i >= 0;) { auto handle (elements[i]); float gain; if (handle->gainSlider == nullptr) gain = 0.0f; else { if (! s.gainHandleLin) gain = handle->gainSlider->getValue(); else gain = juce::Decibels::gainToDecibels (handle->gainSlider->getValue()); } juce::Point filterPos ( handle->frequencySlider == nullptr ? hzToX (0.0f) : hzToX (handle->frequencySlider->getValue()), handle->gainSlider == nullptr ? dbToY (0.0f) : dbToY (gain)); if (pos.getDistanceSquaredFrom (filterPos) < 45) { activeElem = i; break; } } if (oldActiveElem != activeElem) repaint(); } void resized() override { int xMin = hzToX (s.fMin); int xMax = hzToX (s.fMax); numPixels = xMax - xMin + 1; frequencies.resize (numPixels); for (int i = 0; i < numPixels; ++i) frequencies.set (i, xToHz (xMin + i)); allMagnitudesInDb.resize (numPixels); magnitudes.resize (numPixels); magnitudes.fill (1.0f); phases.resize (numPixels); complexMagnitudes.resize (numPixels); const float width = getWidth() - mL - mR; dbGridPath.clear(); float dyn = s.dbMax - s.dbMin; int numgridlines = dyn / s.gridDiv + 1; for (int i = 0; i < numgridlines; ++i) { float db_val = s.dbMax - i * s.gridDiv; int ypos = dbToY (db_val); dbGridPath.startNewSubPath (mL - OH, ypos); dbGridPath.lineTo (mL + width + OH, ypos); } hzGridPath.clear(); hzGridPathBold.clear(); for (float f = s.fMin; f <= s.fMax; f += powf (10, floor (log10 (f)))) { int xpos = hzToX (f); if ((f == 20) || (f == 50) || (f == 100) || (f == 500) || (f == 1000) || (f == 5000) || (f == 10000) || (f == 20000)) { hzGridPathBold.startNewSubPath (xpos, dbToY (s.dbMax) - OH); hzGridPathBold.lineTo (xpos, dbToY (s.dbMin) + OH); } else { hzGridPath.startNewSubPath (xpos, dbToY (s.dbMax) - OH); hzGridPath.lineTo (xpos, dbToY (s.dbMin) + OH); } } } void enableFilter (const int filterIdx, const bool shouldBeEnabled) { if (filterIdx < elements.size()) { auto element = elements[filterIdx]; element->enabled = shouldBeEnabled; repaint(); } } void replaceCoefficients ( const int filterIdx, typename juce::dsp::IIR::Coefficients::Ptr newCoefficients) { if (filterIdx < elements.size()) { auto element = elements[filterIdx]; element->coefficients = newCoefficients; repaint(); } } void addCoefficients (typename juce::dsp::IIR::Coefficients::Ptr newCoeffs, juce::Colour newColourForCoeffs, juce::Slider* frequencySlider = nullptr, juce::Slider* gainSlider = nullptr, juce::Slider* qSlider = nullptr, float* overrideLinearGain = nullptr) { elements.add (new FilterWithSlidersAndColour { newCoeffs, newColourForCoeffs, frequencySlider, gainSlider, qSlider, overrideLinearGain }); } void setParallel (bool shouldBeParallel) { filtersAreParallel = shouldBeParallel; } private: bool filtersAreParallel = false; float overallGainInDb { 0.0 }; double sampleRate; int activeElem = -1; float dynamic, zero, scale; Settings s; juce::Path dbGridPath; juce::Path hzGridPath; juce::Path hzGridPathBold; juce::Array frequencies; juce::Array magnitudes; juce::Array phases; int numPixels; juce::Array> complexMagnitudes; juce::Array allMagnitudesInDb; juce::OwnedArray> elements; }; ././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/customComponents/TitleBar.hIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/customComponents/TitleBar.0000664002537200253720000005466115257173642031744 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once #include "../ambisonicTools.h" #include "TitleBarPaths.h" #ifdef JUCE_OSC_H_INCLUDED #include "../OSC/OSCStatus.h" #endif class AlertSymbol : public juce::Component, public juce::SettableTooltipClient { public: AlertSymbol (juce::Colour colourToUse = juce::Colours::yellow) : juce::Component(), colour (colourToUse) { warningSign.loadPathFromData (WarningSignData, sizeof (WarningSignData)); setBufferedToImage (true); } void paint (juce::Graphics& g) override { warningSign.applyTransform ( warningSign.getTransformToScaleToFit (getLocalBounds().toFloat(), true, juce::Justification::centred)); g.setColour (colour); g.fillPath (warningSign); } private: juce::Path warningSign; juce::Colour colour; }; class IOWidget : public juce::Component { public: IOWidget() : juce::Component() { addChildComponent (alert); alert.setBounds (15, 15, 15, 15); alert.setTooltip ("Not enough channels available \n for your current setting."); } virtual const int getComponentSize() = 0; virtual void setMaxSize (int maxSize) = 0; void setBusTooSmall (bool isBusTooSmall) { busTooSmall = isBusTooSmall; alert.setVisible (isBusTooSmall); } bool isBusTooSmall() { return busTooSmall; } private: AlertSymbol alert; bool busTooSmall = false; }; class NoIOWidget : public IOWidget { public: NoIOWidget() {} void setMaxSize (int maxSize) override { juce::ignoreUnused (maxSize); } const int getComponentSize() override { return 0; } }; class BinauralIOWidget : public IOWidget { public: BinauralIOWidget() : IOWidget() { BinauralPath.loadPathFromData (BinauralPathData, sizeof (BinauralPathData)); setBufferedToImage (true); } const int getComponentSize() override { return 30; } void setMaxSize (int maxSize) override { juce::ignoreUnused (maxSize); } void paint (juce::Graphics& g) override { BinauralPath.applyTransform ( BinauralPath .getTransformToScaleToFit (0, 0, 30, 30, true, juce::Justification::centred)); g.setColour ((juce::Colours::white).withMultipliedAlpha (0.5)); g.fillPath (BinauralPath); } private: juce::Path BinauralPath; }; template class AudioChannelsIOWidget : public IOWidget, private juce::ComboBox::Listener { public: AudioChannelsIOWidget() : IOWidget() { WaveformPath.loadPathFromData (WaveformPathData, sizeof (WaveformPathData)); setBufferedToImage (true); if (selectable) { cbChannels.reset (new juce::ComboBox()); addAndMakeVisible (cbChannels.get()); cbChannels->setJustificationType (juce::Justification::centred); cbChannels->addSectionHeading ("Number of channels"); cbChannels->addItem ("Auto", 1); for (int i = 1; i <= maxChannels; ++i) cbChannels->addItem (juce::String (i), i + 1); cbChannels->setBounds (35, 8, 70, 15); cbChannels->addListener (this); } } const int getComponentSize() override { return selectable ? 110 : 75; } void updateDisplayTextIfNotSelectable() { if (availableChannels < channelSizeIfNotSelectable) { displayTextIfNotSelectable = juce::String (channelSizeIfNotSelectable) + " (bus too small)"; setBusTooSmall (true); } else { displayTextIfNotSelectable = juce::String (channelSizeIfNotSelectable); setBusTooSmall (false); } repaint(); } void checkIfBusIsTooSmall() { if (availableChannels < cbChannels->getSelectedId() - 1) setBusTooSmall (true); else setBusTooSmall (false); } void comboBoxChanged (juce::ComboBox* comboBoxThatHasChanged) override { juce::ignoreUnused (comboBoxThatHasChanged); checkIfBusIsTooSmall(); } void setMaxSize (int maxPossibleNumberOfChannels) override { if (availableChannels != maxPossibleNumberOfChannels) { availableChannels = maxPossibleNumberOfChannels; if (selectable) { if (maxPossibleNumberOfChannels > 0) cbChannels->changeItemText ( 1, "Auto (" + juce::String (maxPossibleNumberOfChannels) + ")"); else cbChannels->changeItemText (1, "(Auto)"); int currId = cbChannels->getSelectedId(); if (currId == 0) currId = 1; //bad work around int i; for (i = 1; i <= maxPossibleNumberOfChannels; ++i) { cbChannels->changeItemText (i + 1, juce::String (i)); } for (i = maxPossibleNumberOfChannels + 1; i <= maxChannels; ++i) { cbChannels->changeItemText (i + 1, juce::String (i) + " (bus too small)"); } checkIfBusIsTooSmall(); cbChannels->setText (cbChannels->getItemText (cbChannels->indexOfItemId (currId))); } else { updateDisplayTextIfNotSelectable(); } } } void setSizeIfUnselectable (int newSize) { if (! selectable && channelSizeIfNotSelectable != newSize) { channelSizeIfNotSelectable = newSize; updateDisplayTextIfNotSelectable(); } } juce::ComboBox* getChannelsCbPointer() { if (selectable) return cbChannels.get(); return nullptr; } void paint (juce::Graphics& g) override { WaveformPath.applyTransform ( WaveformPath .getTransformToScaleToFit (0, 0, 30, 30, true, juce::Justification::centred)); g.setColour ((juce::Colours::white).withMultipliedAlpha (0.5)); g.fillPath (WaveformPath); if (! selectable) { g.setColour ((juce::Colours::white).withMultipliedAlpha (0.5)); g.setFont (juce::FontOptions ( getLookAndFeel().getTypefaceForFont (juce::FontOptions (15.0f, 1))) .withHeight (15.0f)); g.drawFittedText (displayTextIfNotSelectable, 35, 0, 40, 30, juce::Justification::centredLeft, 2); } } private: std::unique_ptr cbChannels; juce::Path WaveformPath; int availableChannels { 64 }; int channelSizeIfNotSelectable = maxChannels; juce::String displayTextIfNotSelectable = juce::String (maxChannels); }; template class AmbisonicIOWidget : public IOWidget { public: AmbisonicIOWidget() : IOWidget() { AmbiLogoPath.loadPathFromData (AmbiLogoPathData, sizeof (AmbiLogoPathData)); setBufferedToImage (true); if (selectable) { addAndMakeVisible (&cbOrder); cbOrder.setJustificationType (juce::Justification::centred); cbOrder.setBounds (35, 15, 70, 15); updateMaxOrder(); } else { displayTextIfNotSelectable = getOrderString (order) + " order"; } addAndMakeVisible (&cbNormalization); cbNormalization.setJustificationType (juce::Justification::centred); cbNormalization.addSectionHeading ("Normalization"); cbNormalization.addItem ("N3D", 1); cbNormalization.addItem ("SN3D", 2); cbNormalization.setBounds (35, 0, 70, 15); } ~AmbisonicIOWidget() override {} void setOrderIfUnselectable (int newOrder) { if (! selectable && orderIfNotSelectable != newOrder) { orderIfNotSelectable = newOrder; updateDisplayTextIfNotSelectable(); } } void updateDisplayTextIfNotSelectable() { if (maxPossibleOrder < orderIfNotSelectable) { displayTextIfNotSelectable = getOrderString (orderIfNotSelectable) + " (bus too small)"; setBusTooSmall (true); } else { displayTextIfNotSelectable = getOrderString (orderIfNotSelectable) + " order"; setBusTooSmall (false); } repaint(); } void updateMaxOrder() { const int previousIndex = cbOrder.getSelectedItemIndex(); cbOrder.clear(); cbOrder.addSectionHeading ("Ambisonic Order"); cbOrder.addItem ("Auto", 1); for (int o = 0; o <= maxOrder; ++o) cbOrder.addItem (getOrderString (o), o + 2); cbOrder.setSelectedItemIndex (previousIndex); } void setMaxOrder (int newMaxOrder) { maxOrder = newMaxOrder; updateMaxOrder(); const int savedMaxPossibleOrder = maxPossibleOrder; maxPossibleOrder = -1; setMaxSize (savedMaxPossibleOrder); } const int getComponentSize() override { return 110; } /** Sets the maximally available size of the processor for this Widget. */ void setMaxSize (int newMaxPossibleOrder) override { if (maxPossibleOrder != juce::jmin (newMaxPossibleOrder, maxOrder)) { maxPossibleOrder = juce::jmin (newMaxPossibleOrder, maxOrder); if (selectable) { if (maxPossibleOrder > -1) cbOrder.changeItemText (1, "Auto (" + getOrderString (maxPossibleOrder) + ")"); else cbOrder.changeItemText (1, "(Auto)"); int currId = cbOrder.getSelectedId(); if (currId == 0) currId = 1; //bad work around for (int i = 1; i <= maxPossibleOrder; ++i) cbOrder.changeItemText (i + 2, getOrderString (i)); for (int i = maxPossibleOrder + 1; i <= maxOrder; ++i) cbOrder.changeItemText (i + 2, getOrderString (i) + " (bus too small)"); DBG (cbOrder.getItemText (cbOrder.indexOfItemId ((currId)))); cbOrder.setText (cbOrder.getItemText (cbOrder.indexOfItemId ((currId)))); if (currId - 2 > maxPossibleOrder) setBusTooSmall (true); else setBusTooSmall (false); } else { updateDisplayTextIfNotSelectable(); } } } juce::ComboBox* getNormCbPointer() { return &cbNormalization; } juce::ComboBox* getOrderCbPointer() { if (! selectable) // There's no Ambisonic Order ComboBox, when order is not selectable! jassertfalse; return &cbOrder; } void paint (juce::Graphics& g) override { AmbiLogoPath.applyTransform ( AmbiLogoPath .getTransformToScaleToFit (0, 0, 30, 30, true, juce::Justification::centred)); g.setColour ((juce::Colours::white).withMultipliedAlpha (0.5)); g.fillPath (AmbiLogoPath); if (! selectable) { g.setColour ((juce::Colours::white).withMultipliedAlpha (0.5)); g.setFont (juce::FontOptions ( getLookAndFeel().getTypefaceForFont (juce::FontOptions (15.0f, 1)))); g.drawFittedText (displayTextIfNotSelectable, 35, 15, 55, 15, juce::Justification::centred, 1); } }; private: juce::ComboBox cbNormalization, cbOrder; juce::Path AmbiLogoPath; int maxOrder = order; int orderIfNotSelectable = order; int maxPossibleOrder = -1; juce::String displayTextIfNotSelectable; }; class DirectivityIOWidget : public IOWidget { public: DirectivityIOWidget() : IOWidget() { DirectivityPath.loadPathFromData (DirectivityPathData, sizeof (DirectivityPathData)); setBufferedToImage (true); orderStrings[0] = juce::String ("0th"); orderStrings[1] = juce::String ("1st"); orderStrings[2] = juce::String ("2nd"); orderStrings[3] = juce::String ("3rd"); orderStrings[4] = juce::String ("4th"); orderStrings[5] = juce::String ("5th"); orderStrings[6] = juce::String ("6th"); orderStrings[7] = juce::String ("7th"); addAndMakeVisible (&cbOrder); cbOrder.setJustificationType (juce::Justification::centred); cbOrder.addSectionHeading ("Directivity Order"); cbOrder.addItem ("Auto", 1); cbOrder.addItem ("0th", 2); cbOrder.addItem ("1st", 3); cbOrder.addItem ("2nd", 4); cbOrder.addItem ("3rd", 5); cbOrder.addItem ("4th", 6); cbOrder.addItem ("5th", 7); cbOrder.addItem ("6th", 8); cbOrder.addItem ("7th", 9); cbOrder.setBounds (35, 15, 70, 15); addAndMakeVisible (&cbNormalization); cbNormalization.setJustificationType (juce::Justification::centred); cbNormalization.addSectionHeading ("Normalization"); cbNormalization.addItem ("N3D", 1); cbNormalization.addItem ("SN3D", 2); cbNormalization.setBounds (35, 0, 70, 15); } const int getComponentSize() override { return 110; } void setMaxSize (int maxPossibleOrder) override { if (maxPossibleOrder > -1) cbOrder.changeItemText (1, "Auto (" + orderStrings[maxPossibleOrder] + ")"); else cbOrder.changeItemText (1, "(Auto)"); int currId = cbOrder.getSelectedId(); if (currId == 0) currId = 1; //bad work around int i; for (i = 1; i <= maxPossibleOrder; ++i) { cbOrder.changeItemText (i + 2, orderStrings[i]); } for (i = maxPossibleOrder + 1; i <= 7; ++i) { cbOrder.changeItemText (i + 2, orderStrings[i] + " (bus too small)"); } cbOrder.setText (cbOrder.getItemText (cbOrder.indexOfItemId (currId))); if (currId - 2 > maxPossibleOrder) setBusTooSmall (true); else setBusTooSmall (false); } juce::ComboBox* getNormCbPointer() { return &cbNormalization; } juce::ComboBox* getOrderCbPointer() { return &cbOrder; } void paint (juce::Graphics& g) override { DirectivityPath.applyTransform ( DirectivityPath .getTransformToScaleToFit (0, 0, 30, 30, true, juce::Justification::centred)); g.setColour ((juce::Colours::white).withMultipliedAlpha (0.5)); g.fillPath (DirectivityPath); } private: juce::String orderStrings[8]; juce::ComboBox cbNormalization, cbOrder; juce::Path DirectivityPath; }; // ======================================================== TITLEBAR ========================= template class TitleBar : public juce::Component { public: TitleBar() : juce::Component() { addAndMakeVisible (&inputWidget); addAndMakeVisible (&outputWidget); } Tin* getInputWidgetPtr() { return &inputWidget; } Tout* getOutputWidgetPtr() { return &outputWidget; } void setTitle (juce::String newBoldText, juce::String newRegularText) { boldText = newBoldText; regularText = newRegularText; } void setFont (juce::Typeface::Ptr newBoldFont, juce::Typeface::Ptr newRegularFont) { boldFont = juce::FontOptions (newBoldFont).withHeight (boldHeight); regularFont = juce::FontOptions (newRegularFont).withHeight (regularHeight); } void resized() override { const int leftWidth = inputWidget.getComponentSize(); const int rightWidth = outputWidget.getComponentSize(); inputWidget.setBounds (getLocalBounds().removeFromLeft (leftWidth).reduced (0, 15)); outputWidget.setBounds (getLocalBounds().removeFromRight (rightWidth).reduced (0, 15)); } void setMaxSize (std::pair inOutSizes) { inputWidget.setMaxSize (inOutSizes.first); outputWidget.setMaxSize (inOutSizes.second); } void paint (juce::Graphics& g) override { juce::Rectangle bounds = getLocalBounds(); const float centreX = bounds.getX() + bounds.getWidth() * 0.5f; const float centreY = bounds.getY() + bounds.getHeight() * 0.5f; const int leftWidth = inputWidget.getComponentSize(); const int rightWidth = outputWidget.getComponentSize(); // Typeset title sting juce::AttributedString titleText; titleText.append (boldText, boldFont, juce::Colours::white); titleText.append (regularText, regularFont, juce::Colours::white); titleText.setJustification (juce::Justification::bottom); // Create TextLayout of title const float maxWidth = static_cast (bounds.getWidth() - rightWidth - leftWidth); juce::TextLayout titleTextLayout; titleTextLayout.createLayout (juce::AttributedString (titleText), maxWidth); // Define title text area const float titleWidth = titleTextLayout.getWidth(); const float titleHeight = titleTextLayout.getHeight(); juce::Rectangle textArea (0, 0, titleWidth, titleHeight); textArea.setCentre (centreX, centreY); if (textArea.getX() < leftWidth) textArea.setX (leftWidth); if (textArea.getRight() > bounds.getRight() - rightWidth) textArea.setRight (bounds.getRight() - rightWidth); // Draw title titleTextLayout.draw (g, textArea); // Draw separation line g.setColour ((juce::Colours::white).withMultipliedAlpha (0.5)); g.drawLine (bounds.getX(), bounds.getY() + bounds.getHeight() - 4, bounds.getX() + bounds.getWidth(), bounds.getY() + bounds.getHeight() - 4); } private: Tin inputWidget; Tout outputWidget; juce::FontOptions boldFont = juce::FontOptions (25.f); juce::FontOptions regularFont = juce::FontOptions (25.f); juce::String boldText = "Bold"; juce::String regularText = "Regular"; const float boldHeight = 25.f; const float regularHeight = 25.f; }; class IEMLogo : public juce::Component { public: IEMLogo() : juce::Component() { IEMPath.loadPathFromData (IEMpathData, sizeof (IEMpathData)); url = juce::URL ("https://plugins.iem.at/"); } void paint (juce::Graphics& g) override { juce::Rectangle bounds = getLocalBounds(); bounds.removeFromBottom (3); bounds.removeFromLeft (1); IEMPath.applyTransform (IEMPath.getTransformToScaleToFit (bounds.reduced (2, 2).toFloat(), true, juce::Justification::bottomLeft)); if (isMouseOver()) { g.setColour (juce::Colour::fromRGB (52, 88, 165)); g.fillAll(); } g.setColour (isMouseOver() ? juce::Colour::fromRGB (249, 226, 45) : juce::Colours::white.withMultipliedAlpha (0.5)); g.fillPath (IEMPath); } void mouseEnter (const juce::MouseEvent& event) override { juce::ignoreUnused (event); setMouseCursor (juce::MouseCursor (juce::MouseCursor::PointingHandCursor)); repaint(); } void mouseExit (const juce::MouseEvent& event) override { juce::ignoreUnused (event); setMouseCursor (juce::MouseCursor (juce::MouseCursor::NormalCursor)); repaint(); } void mouseUp (const juce::MouseEvent& event) override { juce::ignoreUnused (event); if (url.isWellFormed()) url.launchInDefaultBrowser(); } private: juce::Path IEMPath; juce::URL url; }; class Footer : public juce::Component { public: Footer() : juce::Component() { addAndMakeVisible (&iemLogo); } void paint (juce::Graphics& g) override { juce::Rectangle bounds = getLocalBounds(); g.setColour (juce::Colours::white.withAlpha (0.5f)); g.setFont ( juce::FontOptions (getLookAndFeel().getTypefaceForFont (juce::FontOptions (14.0f, 0))) .withHeight (14.0f)); juce::String versionString = "v"; #if JUCE_DEBUG versionString = "DEBUG - v"; #endif versionString.append (JucePlugin_VersionString, 6); g.drawText (versionString, 0, 0, bounds.getWidth() - 8, bounds.getHeight() - 2, juce::Justification::bottomRight); } void resized() override { iemLogo.setBounds (0, 0, 40, getHeight()); } private: IEMLogo iemLogo; }; #ifdef JUCE_OSC_H_INCLUDED class OSCFooter : public juce::Component { public: OSCFooter (OSCParameterInterface& oscInterface) : oscStatus (oscInterface) { addAndMakeVisible (footer); addAndMakeVisible (oscStatus); } void resized() override { auto bounds = getLocalBounds(); footer.setBounds (bounds); bounds.removeFromBottom (2); bounds = bounds.removeFromBottom (16); bounds.removeFromLeft (50); oscStatus.setBounds (bounds); } private: OSCStatus oscStatus; Footer footer; }; #endif ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/customComponents/PositionPlane.hIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/customComponents/PositionP0000664002537200253720000004562415257173642032103 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once class PositionPlane : public juce::Component { public: PositionPlane() : drawPlane (xy), autoScale (true), dimensions (1.0f, 1.0f, 1.0f) {}; ~PositionPlane() { deleteAllChildren(); }; enum Planes { xy, zy, zx }; class Element { public: Element() {} Element (juce::String newID) { ID = newID; } virtual ~Element() {} virtual void startMovement() {}; virtual void moveElement (const juce::MouseEvent& event, const juce::Point centre, const float scale, Planes plane, PositionPlane* positionPlane, int xFactor = 1, int yFactor = 1, int zFactor = 1) = 0; virtual void stopMovement() {}; void setActive (bool shouldBeActive) { active = shouldBeActive; } bool isActive() { return active; } void setColour (juce::Colour newColour) { faceColour = newColour; } juce::Colour getColour() { return faceColour; } void setLabel (juce::String newLabel) { label = newLabel; } void setID (juce::String newID) { ID = newID; } virtual juce::Vector3D getPosition() = 0; juce::String getLabel() { return label; }; juce::String getID() { return ID; }; void addPlane (PositionPlane* positionPlane) { jassert (positionPlane != nullptr); if (positionPlane != nullptr) planesImIn.add (positionPlane); }; void removePlane (PositionPlane* positionPlane) { planesImIn.removeFirstMatchingValue (positionPlane); }; void repaintAllPlanesImIn() { for (int i = planesImIn.size(); --i >= 0;) { PositionPlane* handle = planesImIn.getUnchecked (i); handle->repaint(); } } private: bool active = true; juce::Colour faceColour = juce::Colours::white; juce::String ID = ""; juce::String label = ""; juce::Array planesImIn; }; class ParameterElement : public Element { public: ParameterElement (juce::AudioProcessorParameter& xParameter, juce::NormalisableRange xParameterRange, juce::AudioProcessorParameter& yParameter, juce::NormalisableRange yParameterRange, juce::AudioProcessorParameter& zParameter, juce::NormalisableRange zParameterRange) : x (xParameter), xRange (xParameterRange), y (yParameter), yRange (yParameterRange), z (zParameter), zRange (zParameterRange) { } void startMovement() override { x.beginChangeGesture(); y.beginChangeGesture(); z.beginChangeGesture(); }; void moveElement (const juce::MouseEvent& event, const juce::Point centre, const float scale, Planes plane, PositionPlane* positionPlane, int xFactor = 1, int yFactor = 1, int zFactor = 1) override { auto mousePos = event.getPosition().toFloat(); mousePos.x -= centre.x; mousePos.y -= centre.y; mousePos /= scale; juce::Vector3D roomDims = positionPlane->getDimensions(); juce::Vector3D pos; switch (plane) { case xy: pos.x = -mousePos.y * xFactor; pos.y = -mousePos.x * yFactor; pos.x = juce::Range (-0.5 * roomDims.x, 0.5 * roomDims.x).clipValue (pos.x); pos.y = juce::Range (-0.5 * roomDims.y, 0.5 * roomDims.y).clipValue (pos.y); x.setValueNotifyingHost (xRange.convertTo0to1 (pos.x / scaling.x)); y.setValueNotifyingHost (yRange.convertTo0to1 (pos.y / scaling.y)); break; case zy: pos.z = -mousePos.y * zFactor; pos.y = -mousePos.x * yFactor; pos.z = juce::Range (-0.5 * roomDims.z, 0.5 * roomDims.z).clipValue (pos.z); pos.y = juce::Range (-0.5 * roomDims.y, 0.5 * roomDims.y).clipValue (pos.y); z.setValueNotifyingHost (zRange.convertTo0to1 (pos.z / scaling.z)); y.setValueNotifyingHost (yRange.convertTo0to1 (pos.y / scaling.y)); break; case zx: pos.z = -mousePos.y * zFactor; pos.x = mousePos.x * xFactor; pos.z = juce::Range (-0.5 * roomDims.z, 0.5 * roomDims.z).clipValue (pos.z); pos.x = juce::Range (-0.5 * roomDims.x, 0.5 * roomDims.x).clipValue (pos.x); z.setValueNotifyingHost (zRange.convertTo0to1 (pos.z / scaling.z)); x.setValueNotifyingHost (xRange.convertTo0to1 (pos.x / scaling.x)); break; } } void stopMovement() override { x.endChangeGesture(); y.endChangeGesture(); z.endChangeGesture(); }; /** Get cartesian coordinates */ juce::Vector3D getPosition() override { return juce::Vector3D (xRange.convertFrom0to1 (x.getValue()) * scaling.x, yRange.convertFrom0to1 (y.getValue()) * scaling.y, zRange.convertFrom0to1 (z.getValue()) * scaling.z); }; /** Sets per-axis factors with which the parameter values are multiplied to get the position in the units of the plane's dimensions (e.g. normalized values to meters). */ void setScaling (juce::Vector3D newScaling) { scaling = newScaling; } private: juce::AudioProcessorParameter& x; juce::NormalisableRange xRange; juce::AudioProcessorParameter& y; juce::NormalisableRange yRange; juce::AudioProcessorParameter& z; juce::NormalisableRange zRange; juce::Vector3D scaling { 1.0f, 1.0f, 1.0f }; }; class PositionPlaneListener { public: virtual ~PositionPlaneListener() {} virtual void PositionPlaneElementChanged (PositionPlane* plane, Element* element) = 0; }; void paint (juce::Graphics& g) override { juce::Rectangle bounds (0, 0, getBounds().getWidth(), getBounds().getHeight()); float innerSpacing = 3.0f; bounds.reduce (innerSpacing, innerSpacing); const float width = bounds.getWidth(); const float height = bounds.getHeight(); const float centreX = bounds.getCentreX(); const float centreY = bounds.getCentreY(); float drawH; float drawW; const int xFactor = xFlip ? -1 : 1; const int yFactor = yFlip ? -1 : 1; const int zFactor = zFlip ? -1 : 1; switch (drawPlane) { default: case xy: drawH = dimensions.x; drawW = dimensions.y; break; case zy: drawH = dimensions.z; drawW = dimensions.y; break; case zx: drawH = dimensions.z; drawW = dimensions.x; break; } if (autoScale) { float dimRatio = drawH / drawW; if (dimRatio >= height / width) scale = height / drawH; else scale = width / drawW; if (dimRatio >= height / width) scale = height / drawH; else scale = width / drawW; } drawW *= scale; drawH *= scale; juce::Rectangle room (innerSpacing + 0.5f * (width - drawW), innerSpacing + 0.5f * (height - drawH), drawW, drawH); g.setColour (juce::Colours::white.withMultipliedSaturation (0.9f)); g.setFont (10.0f); switch (drawPlane) { default: case xy: g.drawArrow ( juce::Line (centreX, centreY, centreX, centreY - 20.0f * xFactor), 1.0f, 4.0f, 4.0f); g.drawArrow ( juce::Line (centreX, centreY, centreX - 20.0f * yFactor, centreY), 1.0f, 4.0f, 4.0f); g.drawSingleLineText ("x", centreX + 2.0f, centreY + 2.0f - 9.0f * xFactor); g.drawSingleLineText ("y", centreX - 2.0f - 10.0f * yFactor, centreY + 7.0f); break; case zy: g.drawArrow ( juce::Line (centreX, centreY, centreX, centreY - 20.0f * zFactor), 1.0f, 4.0f, 4.0f); g.drawArrow ( juce::Line (centreX, centreY, centreX - 20.0f * yFactor, centreY), 1.0f, 4.0f, 4.0f); g.drawSingleLineText ("z", centreX + 2.0f, centreY + 2.0f - 9.0f * zFactor); g.drawSingleLineText ("y", centreX - 2.0f - 10.0f * yFactor, centreY + 7.0f); ; break; case zx: g.drawArrow ( juce::Line (centreX, centreY, centreX, centreY - 20.0f * zFactor), 1.0f, 4.0f, 4.0f); g.drawArrow ( juce::Line (centreX, centreY, centreX + 20.0f * xFactor, centreY), 1.0f, 4.0f, 4.0f); g.drawSingleLineText ("z", centreX + 2.0f, centreY + 2.0f - 9.0f * zFactor); g.drawSingleLineText ("x", centreX + 2.0f, centreY + 2.0f - 9.0f * xFactor); break; } g.setColour (juce::Colours::steelblue.withMultipliedAlpha (0.3f)); g.fillRect (room); g.setColour (juce::Colours::white); g.drawRect (room, 1.0f); for (int i = elements.size(); --i >= 0;) { Element* handle = (Element*) elements.getUnchecked (i); juce::Vector3D position = handle->getPosition(); g.setColour (handle->isActive() ? handle->getColour() : juce::Colours::grey); juce::Path path; float posH, posW; switch (drawPlane) { default: case xy: posH = position.x * xFactor; posW = position.y * yFactor; break; case zy: posH = position.z * zFactor; posW = position.y * yFactor; break; case zx: posH = position.z * zFactor; posW = -position.x * xFactor; break; } juce::Rectangle temp (centreX - posW * scale - 10 / 2, centreY - posH * scale - 10 / 2, 11, 11); path.addEllipse (temp); g.fillPath (path); } }; float setDimensions (juce::Vector3D newDimensions) { dimensions = newDimensions; repaint(); float width = getBounds().getWidth(); float height = getBounds().getHeight(); float drawH, drawW; float tempScale; switch (drawPlane) { default: case xy: drawH = dimensions.x; drawW = dimensions.y; break; case zy: drawH = dimensions.z; drawW = dimensions.y; break; case zx: drawH = dimensions.z; drawW = dimensions.x; break; } float dimRatio = drawH / drawW; if (dimRatio >= height / width) tempScale = height / drawH; else tempScale = width / drawW; return tempScale; } void useAutoScale (bool shouldUseAutoScale) { autoScale = shouldUseAutoScale; } bool usingAutoScale() { return autoScale; } void setScale (float newScale) { if (! autoScale) scale = newScale; } juce::Vector3D getDimensions() { return dimensions; } void mouseDown (const juce::MouseEvent& event) override { Element* handle; auto bounds = getLocalBounds().toType(); const float centreX = bounds.getCentreX(); const float centreY = bounds.getCentreY(); int nElem = elements.size(); activeElem = -1; float activeDSquared = 80.0f; //dummy value if (nElem > 0) { const int xFactor = xFlip ? -1 : 1; const int yFactor = yFlip ? -1 : 1; const int zFactor = zFlip ? -1 : 1; auto pos = event.getPosition(); float mouseX = (centreY - pos.getY()); float mouseY = (centreX - pos.getX()); if (drawPlane == zx) mouseY *= -1; for (int i = elements.size(); --i >= 0;) { handle = elements.getUnchecked (i); float posH, posW; juce::Vector3D position = handle->getPosition(); switch (drawPlane) { default: case xy: posH = position.x * xFactor; posW = position.y * yFactor; break; case zy: posH = position.z * zFactor; posW = position.y * yFactor; break; case zx: posH = position.z * zFactor; posW = position.x * xFactor; break; } float tx = (mouseX - posH * scale); float ty = (mouseY - posW * scale); float dSquared = tx * tx + ty * ty; if (dSquared <= 80.0f && dSquared < activeDSquared) { activeElem = i; activeDSquared = dSquared; } } } if (activeElem != -1) { elements.getUnchecked (activeElem)->startMovement(); } } void mouseDrag (const juce::MouseEvent& event) override { auto bounds = getLocalBounds().toType(); const auto centre = bounds.getCentre(); const int xFactor = xFlip ? -1 : 1; const int yFactor = yFlip ? -1 : 1; const int zFactor = zFlip ? -1 : 1; if (activeElem != -1) { Element* handle = elements.getUnchecked (activeElem); handle->moveElement (event, centre, scale, drawPlane, this, xFactor, yFactor, zFactor); handle->repaintAllPlanesImIn(); sendChanges (handle); } repaint(); } void mouseUp (const juce::MouseEvent& event) override { if (activeElem != -1) { elements.getUnchecked (activeElem)->stopMovement(); } } void setPlane (Planes PlaneToDraw) { drawPlane = PlaneToDraw; } void addListener (PositionPlaneListener* const listener) { jassert (listener != 0); if (listener != 0) listeners.add (listener); }; void removeListener (PositionPlaneListener* const listener) { listeners.removeFirstMatchingValue (listener); }; void sendChanges (Element* element) { for (int i = listeners.size(); --i >= 0;) ((PositionPlaneListener*) listeners.getUnchecked (i)) ->PositionPlaneElementChanged (this, element); } void addElement (Element* const element) { jassert (element != 0); if (element != 0) { elements.add (element); element->addPlane (this); } }; void removeElement (Element* const element) { element->removePlane (this); elements.removeFirstMatchingValue (element); }; int indexofSmallestElement (float* array, int size) { int index = 0; for (int i = 1; i < size; i++) { if (array[i] < array[index]) index = i; } return index; } void setXFlip (const bool flipped) { if (xFlip != flipped) { xFlip = flipped; repaint(); } } void setYFlip (const bool flipped) { if (yFlip != flipped) { yFlip = flipped; repaint(); } } void setZFlip (const bool flipped) { if (zFlip != flipped) { zFlip = flipped; repaint(); } } private: Planes drawPlane; juce::String suffix; bool xFlip = false; bool yFlip = false; bool zFlip = false; bool autoScale; juce::Vector3D dimensions; float scale; int activeElem; bool activeElemWasUpBeforeDrag; juce::Array listeners; juce::Array elements; }; ././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/customComponents/SimpleLabel.hIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/customComponents/SimpleLab0000664002537200253720000001357015257173642032022 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once #include "../JuceLibraryCode/JuceHeader.h" //============================================================================== /* */ class SimpleLabel : public juce::Component { public: SimpleLabel() {} SimpleLabel (juce::String textToDisplay) { text = textToDisplay; } void setText (juce::String newText) { text = newText; repaint(); } void setText (juce::String newText, bool newBold) { text = newText; isBold = newBold; repaint(); } void setText (juce::String newText, bool newBold, juce::Justification newJustification) { text = newText; isBold = newBold; justification = newJustification; repaint(); } void setJustification (juce::Justification newJustification) { justification = newJustification; repaint(); } void setTextColour (const juce::Colour newColour) { if (colour != newColour) { colour = newColour; repaint(); } } void enablementChanged() override { repaint(); } void paint (juce::Graphics& g) override { juce::Rectangle bounds = getLocalBounds(); paintSimpleLabel (g, bounds, text, isBold, justification); } virtual void paintSimpleLabel (juce::Graphics& g, juce::Rectangle bounds, juce::String labelText, bool isBoldFlag, juce::Justification labelJustification) { g.setColour (colour.withMultipliedAlpha (this->isEnabled() ? 1.0f : 0.4f)); g.setFont (bounds.getHeight()); g.setFont (juce::FontOptions ( getLookAndFeel().getTypefaceForFont (juce::FontOptions (isBoldFlag ? 1 : 0)))); g.drawText (labelText, bounds, labelJustification, true); } void resized() override {} private: JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (SimpleLabel) juce::String text = ""; bool isBold = false; juce::Colour colour = juce::Colours::white; juce::Justification justification = juce::Justification::centred; }; //============================================================================== /* */ class TripleLabel : public juce::Component { public: TripleLabel() { // In your constructor, you should add any child components, and // initialise any special settings that your component needs. } void setText (juce::String newLeftText, juce::String newMiddleText, juce::String newRightText, bool newLeftBold, bool newMiddleBold, bool newRightBold) { leftText = newLeftText; middleText = newMiddleText; rightText = newRightText; leftBold = newLeftBold; middleBold = newMiddleBold; rightBold = newRightBold; repaint(); } void paint (juce::Graphics& g) override { juce::Rectangle bounds = getLocalBounds(); paintTripleLabel (g, bounds, leftText, middleText, rightText, leftBold, middleBold, rightBold); } virtual void paintTripleLabel (juce::Graphics& g, juce::Rectangle bounds, juce::String leftLabelText, juce::String middleLabelText, juce::String rightLabelText, bool leftBoldFlag, bool middleBoldFlag, bool rightBoldFlag) { g.setColour (juce::Colours::white); int height = bounds.getHeight(); juce::FontOptions tempFont (height, leftBoldFlag ? 1 : 0); g.setFont (juce::FontOptions (getLookAndFeel().getTypefaceForFont (tempFont))); g.setFont (height); g.drawText (leftLabelText, bounds, juce::Justification::left, true); tempFont = juce::FontOptions (height, middleBoldFlag ? 1 : 0); g.setFont (juce::FontOptions (getLookAndFeel().getTypefaceForFont (tempFont))); g.setFont (height + (middleBold ? 2 : 0)); g.drawText (middleLabelText, bounds, juce::Justification::centred, true); tempFont = juce::FontOptions (height, rightBoldFlag ? 1 : 0); g.setFont (juce::FontOptions (getLookAndFeel().getTypefaceForFont (tempFont))); g.setFont (height); g.drawText (rightLabelText, bounds, juce::Justification::right, true); } void resized() override {} private: JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (TripleLabel) juce::String leftText = ""; juce::String middleText = ""; juce::String rightText = ""; bool leftBold, middleBold, rightBold; }; ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/customComponents/ReverseSlider.hIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/customComponents/ReverseSl0000664002537200253720000002155315257173642032064 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ /* Parts of this code originate from Yair Chuchem's juce::AudioProcessorParameterSlider class: https://gist.github.com/yairchu */ #pragma once #include #define RS_FLT_EPSILON 1.19209290E-07F class ReverseSlider : public juce::Slider { public: ReverseSlider() : juce::Slider(), lastDistanceFromDragStart (0), reversed (false), isDual (false), scrollWheelEnabled (true) { } ReverseSlider (const juce::String& componentName) : juce::Slider (componentName), lastDistanceFromDragStart (0), reversed (false), isDual (false), scrollWheelEnabled (true) { } public: class SliderAttachment : public juce::AudioProcessorValueTreeState::SliderAttachment { public: SliderAttachment (juce::AudioProcessorValueTreeState& stateToControl, const juce::String& parameterID, ReverseSlider& sliderToControl) : juce::AudioProcessorValueTreeState::SliderAttachment (stateToControl, parameterID, sliderToControl) { sliderToControl.setParameter (stateToControl.getParameter (parameterID)); } SliderAttachment (juce::AudioProcessorValueTreeState& stateToControl, const juce::String& parameterID, juce::Slider& sliderToControl) : juce::AudioProcessorValueTreeState::SliderAttachment (stateToControl, parameterID, sliderToControl) { } virtual ~SliderAttachment() = default; }; void setReverse (bool shouldBeReversed) { if (reversed != shouldBeReversed) { reversed = shouldBeReversed; repaint(); } } void setDual (bool shouldBeDual) { if (isDual != shouldBeDual) { isDual = shouldBeDual; repaint(); } } void setParameter (const juce::AudioProcessorParameter* p) { if (parameter == p) return; parameter = p; updateText(); repaint(); } juce::String getTextFromValue (double value) override { if (parameter == nullptr) return juce::Slider::getTextFromValue (value); const juce::NormalisableRange range (getMinimum(), getMaximum(), getInterval(), getSkewFactor()); const float normalizedVal = (float) range.convertTo0to1 (value); juce::String result = parameter->getText (normalizedVal, getNumDecimalPlacesToDisplay()) + " " + parameter->getLabel(); return result; } double getValueFromText (const juce::String& text) override { if (parameter == nullptr) return juce::Slider::getValueFromText (text); const juce::NormalisableRange range (getMinimum(), getMaximum(), getInterval(), getSkewFactor()); return range.convertFrom0to1 (parameter->getValueForText (text)); } double proportionOfLengthToValue (double proportion) override { double ret = 0; if (reversed) ret = getMaximum() + getMinimum() - juce::Slider::proportionOfLengthToValue (proportion); else ret = juce::Slider::proportionOfLengthToValue (proportion); return ret; } double valueToProportionOfLength (double value) override { double ret = 0; if (reversed) ret = juce::jlimit (0., 1., 1.0 - juce::Slider::valueToProportionOfLength (value)); else ret = juce::Slider::valueToProportionOfLength (value); return ret; } void increment() { setValue (getValue() + getInterval()); } void decrement() { setValue (getValue() - getInterval()); } void setScrollWheelEnabled (bool enabled) { scrollWheelEnabled = enabled; juce::Slider::setScrollWheelEnabled (enabled); } void mouseWheelMove (const juce::MouseEvent& e, const juce::MouseWheelDetails& wheel) override { if (isRotary() && ! getRotaryParameters().stopAtEnd && scrollWheelEnabled) { const double delta = (std::abs (wheel.deltaX) > std::abs (wheel.deltaY) ? -wheel.deltaX : wheel.deltaY) * (wheel.isReversed ? -1.0f : 1.0f) * (reversed ? -1.0f : 1.0f); bool positiveDelta = delta >= 0.0; if (std::abs (getValue() - getMaximum()) < getInterval() || std::abs (getValue() - getMaximum()) < RS_FLT_EPSILON) { if (positiveDelta) setValue (getMinimum()); } else if (std::abs (getValue() - getMinimum()) < getInterval() || std::abs (getValue() - getMinimum()) < RS_FLT_EPSILON) { if (! positiveDelta) setValue (getMaximum()); } } juce::Slider::mouseWheelMove (e, wheel); } void mouseDown (const juce::MouseEvent& e) override { lastDistanceFromDragStart = 0; juce::Slider::mouseDown (e); } void mouseDrag (const juce::MouseEvent& e) override { if (isRotary() && ! getRotaryParameters().stopAtEnd && scrollWheelEnabled) { int delta = 0; switch (getSliderStyle()) { case RotaryVerticalDrag: delta = -e.getDistanceFromDragStartY() - lastDistanceFromDragStart; break; case RotaryHorizontalDrag: delta = e.getDistanceFromDragStartX() - lastDistanceFromDragStart; break; case RotaryHorizontalVerticalDrag: delta = e.getDistanceFromDragStartX() - e.getDistanceFromDragStartY() - lastDistanceFromDragStart; break; default: break; } delta = delta * (reversed ? -1 : 1); if (std::abs (getValue() - getMaximum()) < getInterval() || std::abs (getValue() - getMaximum()) < RS_FLT_EPSILON) { if (delta > 0) { setValue (getMinimum()); juce::Slider::mouseDown (e); //hack } } else if (std::abs (getValue() - getMinimum()) < getInterval() || std::abs (getValue() - getMinimum()) < RS_FLT_EPSILON) { if (delta < 0) { setValue (getMaximum()); juce::Slider::mouseDown (e); //hack } } } switch (getSliderStyle()) { case RotaryVerticalDrag: lastDistanceFromDragStart = -e.getDistanceFromDragStartY(); break; case RotaryHorizontalDrag: lastDistanceFromDragStart = e.getDistanceFromDragStartX(); break; case RotaryHorizontalVerticalDrag: lastDistanceFromDragStart = e.getDistanceFromDragStartX() - e.getDistanceFromDragStartY(); break; default: break; } juce::Slider::mouseDrag (e); } private: int lastDistanceFromDragStart; bool reversed; bool isDual; bool scrollWheelEnabled; const juce::AudioProcessorParameter* parameter { nullptr }; }; ././@LongLink0000644000000000000000000000015200000000000011601 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/customComponents/SpherePanner.hIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/customComponents/SpherePan0000664002537200253720000005665115257173642032046 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once #include "../../resources/Conversions.h" #include "../../resources/Quaternion.h" #include "../JuceLibraryCode/JuceHeader.h" class SpherePannerBackground : public juce::Component { public: SpherePannerBackground() { setBufferedToImage (true); }; ~SpherePannerBackground() {}; void resized() override { auto sphere = getLocalBounds().reduced (10, 10).toFloat(); radius = 0.5f * juce::jmin (sphere.getWidth(), sphere.getHeight()); sphereArea.setBounds (0, 0, 2 * radius, 2 * radius); sphereArea.setCentre (getLocalBounds().getCentre().toFloat()); }; void paint (juce::Graphics& g) override { const auto bounds = getLocalBounds().toFloat(); const float centreX = bounds.getCentreX(); const float centreY = bounds.getCentreY(); g.setColour (juce::Colours::white); g.drawEllipse (centreX - radius, centreY - radius, 2.0f * radius, 2.0f * radius, 1.0f); auto currentFont = juce::FontOptions (getLookAndFeel().getTypefaceForFont (juce::FontOptions (12.0f, 1))) .withHeight (12.0f); g.setFont (currentFont); g.drawText ("FRONT", centreX - 15, centreY - radius - 12, 30, 12, juce::Justification::centred); g.drawText ("BACK", centreX - 15, centreY + radius, 30, 12, juce::Justification::centred); g.drawFittedText ("L\nE\nF\nT", sphereArea.getX() - 10, centreY - 40, 10, 80, juce::Justification::centred, 4); g.drawFittedText ("R\nI\nG\nH\nT", sphereArea.getRight(), centreY - 40, 10, 80, juce::Justification::centred, 5); g.setColour (juce::Colours::steelblue.withMultipliedAlpha (0.2f)); juce::Path circles; for (int deg = 75; deg >= 0; deg -= 15) { float rCirc; if (! linearElevation) rCirc = radius * std::cos (Conversions::degreesToRadians (deg)); else rCirc = radius * (90 - deg) / 90; circles.addEllipse (centreX - rCirc, centreY - rCirc, 2.0f * rCirc, 2.0f * rCirc); g.fillPath (circles); } g.setColour (juce::Colours::steelblue.withMultipliedAlpha (0.7f)); g.strokePath (circles, juce::PathStrokeType (.5f)); juce::ColourGradient gradient (juce::Colours::black.withMultipliedAlpha (0.7f), centreX, centreY, juce::Colours::black.withMultipliedAlpha (0.1f), 0, 0, true); g.setGradientFill (gradient); juce::Path line; line.startNewSubPath (centreX, centreY - radius); line.lineTo (centreX, centreY + radius); juce::Path path; path.addPath (line); path.addPath (line, juce::AffineTransform().rotation (0.25f * juce::MathConstants::pi, centreX, centreY)); path.addPath (line, juce::AffineTransform().rotation (0.5f * juce::MathConstants::pi, centreX, centreY)); path.addPath (line, juce::AffineTransform().rotation (0.75f * juce::MathConstants::pi, centreX, centreY)); g.strokePath (path, juce::PathStrokeType (0.5f)); } void setElevationStyle (bool linear) { linearElevation = linear; }; private: float radius = 1.0f; juce::Rectangle sphereArea; bool linearElevation = false; }; class SpherePanner : public juce::Component { public: SpherePanner() { setBufferedToImage (true); addAndMakeVisible (background); background.addMouseListener (this, false); // could this be risky? } ~SpherePanner() override = default; class Listener { public: virtual ~Listener() {} virtual void mouseWheelOnSpherePannerMoved (SpherePanner* sphere, const juce::MouseEvent& event, const juce::MouseWheelDetails& wheel) {}; }; class Element { public: Element() {} virtual ~Element() {} virtual void startMovement() {} virtual void moveElement (const juce::MouseEvent& event, juce::Point centre, float radius, bool upBeforeDrag, bool linearElevation, bool rightClick = false) = 0; virtual void stopMovement() {} /** Get cartesian coordinates */ virtual juce::Vector3D getCoordinates() = 0; void setActive (bool isActive) { active = isActive; } bool isActive() { return active; } void setColour (juce::Colour newColour) { colour = newColour; } void setTextColour (juce::Colour newColour) { textColour = newColour; } juce::Colour getColour() { return colour; } juce::Colour getTextColour() { return textColour; } void setLabel (juce::String newLabel) { label = newLabel; } void setGrabPriority (int newPriority) { grabPriority = newPriority; } int getGrabPriority() { return grabPriority; } void setGrabRadius (float newRadius) { grabRadius = newRadius; } float getGrabRadius() { return grabRadius; } juce::String getLabel() { return label; } private: bool active = true; float grabRadius = 0.123f; int grabPriority = 0; juce::Colour colour = juce::Colours::white; juce::Colour textColour = juce::Colours::black; juce::String label = ""; }; class StandardElement : public Element { public: StandardElement() = default; void moveElement (const juce::MouseEvent& event, juce::Point centre, float radius, bool upBeforeDrag, bool linearElevation, bool rightClick) override { auto pos = event.getPosition(); const float azimuth = -1.0f * centre.getAngleToPoint (pos); float r = centre.getDistanceFrom (pos) / radius; if (r > 1.0f) { r = 1.0f / r; upBeforeDrag = ! upBeforeDrag; } if (linearElevation) r = std::sin (r * juce::MathConstants::halfPi); float elevation = std::acos (r); if (! upBeforeDrag) elevation *= -1.0f; position = Conversions::sphericalToCartesian (azimuth, elevation); } /* Get cartesian coordinates */ juce::Vector3D getCoordinates() override { return position; }; bool setCoordinates ( juce::Vector3D newPosition) // is true when position is updated (use it for repainting) { if (position.x != newPosition.x || position.y != newPosition.y || position.z != newPosition.z) { position = newPosition; return true; } return false; } private: juce::Vector3D position; }; class AzimuthElevationParameterElement : public Element { public: AzimuthElevationParameterElement (juce::AudioProcessorParameter& azimuthParameter, juce::NormalisableRange azimuthParameterRange, juce::AudioProcessorParameter& elevationParameter, juce::NormalisableRange elevationParameterRange) : Element(), azimuth (azimuthParameter), azimuthRange (azimuthParameterRange), elevation (elevationParameter), elevationRange (elevationParameterRange) { } void startMovement() override { azimuth.beginChangeGesture(); elevation.beginChangeGesture(); }; void moveElement (const juce::MouseEvent& event, juce::Point centre, float radius, bool upBeforeDrag, bool linearElevation, bool rightClick) override { auto pos = event.getPosition(); const float azi = -1.0f * centre.getAngleToPoint (pos); const float azimuthInDegrees { Conversions::radiansToDegrees (azi) }; if (! rightClick) { float r = centre.getDistanceFrom (pos) / radius; if (r > 1.0f) { r = 1.0f / r; upBeforeDrag = ! upBeforeDrag; } if (linearElevation) r = std::sin (r * juce::MathConstants::halfPi); float ele = std::acos (r); if (! upBeforeDrag) ele *= -1.0f; const float elevationInDegrees { Conversions::radiansToDegrees (ele) }; elevation.setValueNotifyingHost (elevationRange.convertTo0to1 (elevationInDegrees)); } azimuth.setValueNotifyingHost (azimuthRange.convertTo0to1 (azimuthInDegrees)); } void stopMovement() override { azimuth.endChangeGesture(); elevation.endChangeGesture(); } const float getAzimuthInRadians() { const float azimuthInDegrees { azimuthRange.convertFrom0to1 (azimuth.getValue()) }; return Conversions::degreesToRadians (azimuthInDegrees); } const float getElevationInRadians() { const float elevationInDegrees { elevationRange.convertFrom0to1 ( elevation.getValue()) }; return Conversions::degreesToRadians (elevationInDegrees); } /* Get cartesian coordinates */ juce::Vector3D getCoordinates() override { return Conversions::sphericalToCartesian (getAzimuthInRadians(), getElevationInRadians()); } private: juce::AudioProcessorParameter& azimuth; juce::NormalisableRange azimuthRange; juce::AudioProcessorParameter& elevation; juce::NormalisableRange elevationRange; }; class RollWidthParameterElement : public Element { public: RollWidthParameterElement (AzimuthElevationParameterElement& center, juce::AudioProcessorParameter& rollParameter, juce::NormalisableRange rollParameterRange, juce::AudioProcessorParameter& widthParameter, juce::NormalisableRange widthParameterRange) : centerElement (center), roll (rollParameter), rollRange (rollParameterRange), width (widthParameter), widthRange (widthParameterRange) { } void startMovement() override { roll.beginChangeGesture(); width.beginChangeGesture(); } void moveElement (const juce::MouseEvent& event, juce::Point centre, float radius, bool upBeforeDrag, bool linearElevation, bool rightClick) override { juce::Point pos = event.getPosition(); const float azi = -1.0f * centre.getAngleToPoint (pos); float r = centre.getDistanceFrom (pos) / radius; if (r > 1.0f) { r = 1.0f / r; upBeforeDrag = ! upBeforeDrag; } if (linearElevation) r = std::sin (r * juce::MathConstants::halfPi); float ele = std::acos (r); if (! upBeforeDrag) ele *= -1.0f; auto posXYZ = Conversions::sphericalToCartesian (azi, ele); // ==== calculate width juce::Vector3D dPos = posXYZ - centerElement.getCoordinates(); const float alpha = 4.0f * std::asin (dPos.length() / 2.0f); width.setValueNotifyingHost ( widthRange.convertTo0to1 (Conversions::radiansToDegrees (alpha))); // ==== calculate roll iem::Quaternion quat; float ypr[3]; ypr[0] = centerElement.getAzimuthInRadians(); ypr[1] = -centerElement.getElevationInRadians(); // pitch ypr[2] = 0.0f; quat.fromYPR (ypr); quat.conjugate(); const auto rotated = quat.rotateVector (posXYZ); float rollInRadians = atan2 (rotated.z, rotated.y); if (isMirrored) rollInRadians = atan2 (-rotated.z, -rotated.y); roll.setValueNotifyingHost ( rollRange.convertTo0to1 (Conversions::radiansToDegrees (rollInRadians))); } void stopMovement() override { roll.endChangeGesture(); width.endChangeGesture(); } /* Get cartesian coordinates */ juce::Vector3D getCoordinates() override { float ypr[3]; ypr[0] = centerElement.getAzimuthInRadians(); ypr[1] = -centerElement.getElevationInRadians(); // pitch ypr[2] = Conversions::degreesToRadians (rollRange.convertFrom0to1 (roll.getValue())); //updating not active params iem::Quaternion quat; quat.fromYPR (ypr); const float widthInRadiansQuarter ( Conversions::degreesToRadians (widthRange.convertFrom0to1 (width.getValue())) / 4.0f); iem::Quaternion quatLRot { iem::Quaternion ( cos (widthInRadiansQuarter), 0.0f, 0.0f, sin (widthInRadiansQuarter)) }; if (isMirrored) quatLRot.conjugate(); iem::Quaternion quatL = quat * quatLRot; return quatL.getCartesian(); } void setMirrored (bool mirrored) { isMirrored = mirrored; } private: AzimuthElevationParameterElement& centerElement; juce::AudioProcessorParameter& roll; juce::NormalisableRange rollRange; juce::AudioProcessorParameter& width; juce::NormalisableRange widthRange; bool isMirrored = false; }; void resized() override { background.setBounds (getLocalBounds()); const auto sphere = getLocalBounds().reduced (10, 10).toFloat(); radius = 0.5f * juce::jmin (sphere.getWidth(), sphere.getHeight()); centre = getLocalBounds().getCentre(); sphereArea.setBounds (0, 0, 2 * radius, 2 * radius); sphereArea.setCentre (centre.toFloat()); } void paintOverChildren (juce::Graphics& g) override { const auto bounds = getLocalBounds().toFloat(); const float centreX = bounds.getCentreX(); const float centreY = bounds.getCentreY(); auto currentFont = juce::FontOptions (getLookAndFeel().getTypefaceForFont (juce::FontOptions (12.0f, 1))); g.setFont (currentFont); const int size = elements.size(); for (int i = 0; i < size; ++i) { SpherePanner::Element* handle = elements.getUnchecked (i); auto pos = handle->getCoordinates(); const bool isUp = pos.z >= -0.0f; const float diam = 15.0f + 4.0f * pos.z; const juce::Colour colour = handle->isActive() ? handle->getColour() : juce::Colours::grey; g.setColour (colour); if (linearElevation) { const float r = sqrt (pos.y * pos.y + pos.x * pos.x); const float factor = std::asin (r) / r / juce::MathConstants::halfPi; pos *= factor; } const juce::Rectangle circleArea (centreX - pos.y * radius - diam / 2, centreY - pos.x * radius - diam / 2, diam, diam); juce::Path panPos; panPos.addEllipse (circleArea); g.strokePath (panPos, juce::PathStrokeType (1.0f)); if (i == activeElem) { g.setColour (colour.withAlpha (0.8f)); g.drawEllipse (circleArea.withSizeKeepingCentre (1.3f * diam, 1.3f * diam), 0.9f); } g.setColour (colour.withAlpha (isUp ? 1.0f : 0.3f)); g.fillPath (panPos); g.setColour (isUp ? handle->getTextColour() : colour); g.setFont (isUp ? 15.0f : 10.0f); g.drawText (handle->getLabel(), circleArea.toNearestInt(), juce::Justification::centred, false); } } void mouseWheelMove (const juce::MouseEvent& event, const juce::MouseWheelDetails& wheel) override { for (int i = listeners.size(); --i >= 0;) listeners.getUnchecked (i)->mouseWheelOnSpherePannerMoved (this, event, wheel); } void mouseMove (const juce::MouseEvent& event) override { const int oldActiveElem = activeElem; activeElem = -1; const int nElem = elements.size(); if (nElem > 0) { const auto centre = getLocalBounds().getCentre(); const juce::Point dif = centre - event.getPosition(); const juce::Point mousePos (dif.y / radius, dif.x / radius); // scale and swap xy int highestPriority = -1; int smallestDist = 123456789; // basically infinity for (int i = 0; i < nElem; ++i) { Element* handle (elements.getUnchecked (i)); auto elementPosition = handle->getCoordinates(); if (linearElevation) { const float r = sqrt (elementPosition.y * elementPosition.y + elementPosition.x * elementPosition.x); const float factor = std::asin (r) / r / juce::MathConstants::halfPi; elementPosition *= factor; } const juce::Point connection (mousePos.x - elementPosition.x, mousePos.y - elementPosition.y); const auto distance = connection.getDistanceFromOrigin(); if (distance <= handle->getGrabRadius()) { if (handle->getGrabPriority() > highestPriority) { activeElem = i; highestPriority = handle->getGrabPriority(); smallestDist = distance; } else if (handle->getGrabPriority() == highestPriority && distance < smallestDist) { activeElem = i; smallestDist = distance; } } } } if (activeElem != -1) activeElemWasUpBeforeDrag = elements.getUnchecked (activeElem)->getCoordinates().z >= 0.0f; if (oldActiveElem != activeElem) repaint(); } void mouseDrag (const juce::MouseEvent& event) override { const bool rightClick = event.mods.isRightButtonDown(); if (activeElem != -1) { elements.getUnchecked (activeElem) ->moveElement (event, centre, radius, activeElemWasUpBeforeDrag, linearElevation, rightClick); repaint(); } } void mouseDown (const juce::MouseEvent& event) override { if (activeElem != -1) elements.getUnchecked (activeElem)->startMovement(); } void mouseUp (const juce::MouseEvent& event) override { if (activeElem != -1) elements.getUnchecked (activeElem)->stopMovement(); } void mouseDoubleClick (const juce::MouseEvent& event) override { setElevationStyle (! linearElevation); background.repaint(); repaint(); } void addListener (Listener* const listener) { jassert (listener != nullptr); if (listener != nullptr) listeners.add (listener); } void removeListener (Listener* const listener) { listeners.removeFirstMatchingValue (listener); } void addElement (Element* const element) { jassert (element != nullptr); if (element != nullptr) elements.addIfNotAlreadyThere (element); } void removeElement (Element* const element) { elements.removeFirstMatchingValue (element); } void setElevationStyle (bool linear) { linearElevation = linear; background.setElevationStyle (linear); } protected: float radius = 1.0f; juce::Rectangle sphereArea; juce::Point centre; int activeElem = -1; bool activeElemWasUpBeforeDrag; juce::Array listeners; juce::Array elements; bool linearElevation = false; SpherePannerBackground background; }; ././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/customComponents/CompressorVisualizer.hIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/customComponents/Compresso0000664002537200253720000002515615257173642032127 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2018 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once #include "../Compressor.h" #include "../JuceLibraryCode/JuceHeader.h" //============================================================================== /* */ class CompressorVisualizer : public juce::Component { class GridAndLabels : public juce::Component { public: GridAndLabels (float minDB) : minDecibels (minDB) { setBufferedToImage (true); createGrid(); } ~GridAndLabels() {} void createGrid() { const float step = 10.0f; grid.clear(); for (int val = -step; val > minDecibels; val -= step) { // add horizontal line grid.startNewSubPath (minDecibels, val); grid.lineTo (0.0f, val); // add vertical line grid.startNewSubPath (val, minDecibels); grid.lineTo (val, 0.0f); } } void paint (juce::Graphics& g) override { g.setColour (juce::Colours::steelblue.withMultipliedAlpha (0.8f)); g.strokePath (grid, juce::PathStrokeType (0.5f), contentTransform); g.setColour (juce::Colours::white.withMultipliedAlpha (0.5f)); g.drawRect (contentBounds, 1.0f); juce::Line unity (minDecibels + 0.5f, minDecibels + 0.5f, -0.5f, -0.5f); unity.applyTransform (contentTransform); float dashLengths[2]; dashLengths[0] = 2.0f; dashLengths[1] = 2.0f; g.drawDashedLine (unity, dashLengths, 2, 0.5f); g.setColour (juce::Colours::white); auto currentFont = juce::FontOptions (getLookAndFeel().getTypefaceForFont ( juce::FontOptions (12.0f, 2))) .withHeight (12.0f); g.setFont (currentFont); const float step = 10.0f; float xPos = 0.0f; float yPos = 0.0f; contentTransform.transformPoint (xPos, yPos); g.drawText ("0 dB", xPos + 1, yPos - 12, 19, 12.0f, juce::Justification::left, false); for (int val = -step; val >= minDecibels; val -= step) { // vertical labels float xPos = 0.0f; float yPos = val; contentTransform.transformPoint (xPos, yPos); g.drawText (juce::String (val), xPos + 4, yPos - 6, 18, 12.0f, juce::Justification::left, false); // horizontal labels xPos = val; yPos = 0.0f; contentTransform.transformPoint (xPos, yPos); g.drawText (juce::String (val), xPos - 9, yPos - 12, 18, 12.0f, juce::Justification::centred, false); } } void resized() override { auto bounds = getLocalBounds(); bounds.removeFromTop (12); bounds.removeFromRight (22); bounds.removeFromLeft (10); bounds.removeFromBottom (8); contentBounds = bounds; contentTransform = juce::AffineTransform::fromTargetPoints ( juce::Point (minDecibels, minDecibels), contentBounds.getBottomLeft(), juce::Point (0, 0), contentBounds.getTopRight(), juce::Point (0, minDecibels), contentBounds.getBottomRight()); } juce::Rectangle getBoundsForContent() { return contentBounds; } juce::AffineTransform getTransformForContent() { return contentTransform; } private: const float minDecibels; juce::Path grid; juce::Rectangle contentBounds { 0, 0, 1, 1 }; juce::AffineTransform contentTransform; }; class Characteristic : public juce::Component { public: Characteristic (iem::Compressor* compressorToGetCharacteristicFrom, float minDB) : compressor (compressorToGetCharacteristicFrom), minDecibels (minDB) { setBufferedToImage (true); } ~Characteristic() {} void updateCharacteristic() { const float threshold = compressor->getTreshold(); const float knee = compressor->getKnee(); const float kneeStart = threshold - knee / 2.0f; const float kneeEnd = threshold + knee / 2.0f; characteristic.clear(); characteristic.startNewSubPath (minDecibels - 1.0f, minDecibels - 1.0f); characteristic.lineTo (minDecibels, compressor->getCharacteristicSample (minDecibels)); characteristic.lineTo (kneeStart, compressor->getCharacteristicSample (kneeStart)); const int kneeSamples = juce::jmax (1, static_cast (knee)); float val = kneeStart; float step = knee / kneeSamples; for (int i = 0; i < kneeSamples; ++i) { val += step; characteristic.lineTo (val, compressor->getCharacteristicSample (val)); } characteristic.lineTo (kneeEnd, compressor->getCharacteristicSample (kneeEnd)); characteristic.lineTo (0.0f, compressor->getCharacteristicSample (0.0f)); characteristic.lineTo (1.0f, compressor->getCharacteristicSample (0.0f)); characteristic.lineTo (1.0f, minDecibels - 1.0f); characteristic.closeSubPath(); repaint(); } void paint (juce::Graphics& g) override { g.setColour (juce::Colours::white); g.strokePath (characteristic, juce::PathStrokeType (2.0f), transform); g.setColour (juce::Colours::steelblue.withMultipliedAlpha (0.3f)); g.fillPath (characteristic, transform); } void resized() override {} void setTransformForContent (juce::AffineTransform newTransform) { transform = newTransform; } void setCompressorToVisualize (iem::Compressor* compressorToVisualize) { compressor = compressorToVisualize; } private: iem::Compressor* compressor; const float minDecibels; juce::Path characteristic; juce::AffineTransform transform; }; public: CompressorVisualizer (iem::Compressor* compressorToVisualize) : compressor (compressorToVisualize), minDecibels (-60.0f), gridAndLabels (minDecibels), characteristic (compressor, minDecibels) { init(); } CompressorVisualizer (iem::Compressor& compressorToVisualize) : compressor (&compressorToVisualize), minDecibels (-60.0f), gridAndLabels (minDecibels), characteristic (compressor, minDecibels) { init(); } CompressorVisualizer (iem::Compressor* compressorToVisualize, const float rangeInDecibels) : compressor (compressorToVisualize), minDecibels (-1.0f * rangeInDecibels), gridAndLabels (minDecibels), characteristic (compressor, minDecibels) { init(); } CompressorVisualizer (iem::Compressor& compressorToVisualize, const float rangeInDecibels) : compressor (&compressorToVisualize), minDecibels (-1.0f * rangeInDecibels), gridAndLabels (minDecibels), characteristic (compressor, minDecibels) { init(); } ~CompressorVisualizer() {} void init() { addAndMakeVisible (gridAndLabels); addAndMakeVisible (characteristic); updateCharacteristic(); } void updateCharacteristic() { characteristic.updateCharacteristic(); } void setMarkerLevels (const float inputLevel, const float gainReduction) { const float makeUpGain = compressor->getMakeUpGain(); const auto tempOutLevel = inputLevel + gainReduction + makeUpGain; if (inLevel != inputLevel || outLevel != tempOutLevel) { inLevel = inputLevel; outLevel = tempOutLevel; repaint(); } } void paint (juce::Graphics& g) override {} void paintOverChildren (juce::Graphics& g) override { if (inLevel < minDecibels || outLevel < minDecibels) return; juce::Rectangle circle (0.0f, 0.0f, 10.0f, 10.0f); float x = inLevel; float y = outLevel; transform.transformPoint (x, y); circle.setCentre (x, y); g.setColour (juce::Colours::cornflowerblue); g.fillRoundedRectangle (circle, 5.0f); } void resized() override { gridAndLabels.setBounds (getLocalBounds()); const juce::Rectangle contentBounds = gridAndLabels.getBoundsForContent(); transform = gridAndLabels.getTransformForContent(); characteristic.setTransformForContent ( transform.translated (-contentBounds.getX(), -contentBounds.getY())); characteristic.setBounds (contentBounds); } void setCompressorToVisualize (iem::Compressor* compressorToVisualize) { compressor = compressorToVisualize; characteristic.setCompressorToVisualize (compressor); } private: iem::Compressor* compressor; const float minDecibels; GridAndLabels gridAndLabels; Characteristic characteristic; juce::AffineTransform transform; float inLevel = 0.0f; float outLevel = 0.0f; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (CompressorVisualizer) }; ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/customComponents/TitleBarPaths.hIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/customComponents/TitleBarP0000664002537200253720000012467515257173642032011 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once static const unsigned char WarningSignData[] = { 110, 109, 248, 99, 240, 67, 117, 51, 149, 67, 98, 8, 12, 242, 67, 117, 115, 149, 67, 135, 54, 243, 67, 68, 91, 150, 67, 115, 24, 244, 67, 205, 188, 151, 67, 108, 203, 241, 7, 68, 125, 175, 202, 67, 98, 240, 215, 8, 68, 68, 251, 205, 67, 152, 166, 7, 68, 0, 0, 210, 67, 4, 198, 5, 68, 0, 0, 210, 67, 108, 227, 245, 211, 67, 0, 0, 210, 67, 98, 221, 52, 208, 67, 0, 0, 210, 67, 45, 210, 205, 67, 68, 251, 205, 67, 119, 158, 207, 67, 125, 175, 202, 67, 108, 121, 105, 235, 67, 205, 188, 151, 67, 98, 182, 51, 236, 67, 231, 91, 150, 67, 227, 133, 237, 67, 174, 103, 149, 67, 244, 29, 239, 67, 117, 51, 149, 67, 98, 186, 137, 239, 67, 129, 37, 149, 67, 76, 247, 239, 67, 117, 51, 149, 67, 248, 99, 240, 67, 117, 51, 149, 67, 99, 109, 33, 80, 243, 67, 23, 105, 195, 67, 108, 39, 193, 236, 67, 23, 105, 195, 67, 108, 39, 193, 236, 67, 23, 41, 201, 67, 108, 33, 80, 243, 67, 23, 41, 201, 67, 108, 33, 80, 243, 67, 23, 105, 195, 67, 99, 109, 33, 80, 243, 67, 31, 117, 168, 67, 108, 39, 193, 236, 67, 31, 117, 168, 67, 108, 39, 193, 236, 67, 143, 226, 189, 67, 108, 33, 80, 243, 67, 143, 226, 189, 67, 108, 33, 80, 243, 67, 31, 117, 168, 67, 99, 101, 0, 0 }; static const unsigned char BinauralPathData[] = { 110, 109, 90, 164, 139, 66, 0, 0, 147, 67, 108, 90, 164, 139, 66, 0, 0, 240, 67, 108, 0, 0, 208, 65, 0, 0, 240, 67, 98, 152, 110, 102, 65, 0, 0, 240, 67, 0, 0, 160, 64, 139, 76, 235, 67, 0, 0, 160, 64, 0, 128, 229, 67, 108, 0, 0, 160, 64, 0, 128, 157, 67, 98, 0, 0, 160, 64, 117, 179, 151, 67, 152, 110, 102, 65, 0, 0, 147, 67, 0, 0, 208, 65, 0, 0, 147, 67, 108, 90, 164, 139, 66, 0, 0, 147, 67, 99, 109, 0, 0, 200, 66, 0, 128, 124, 67, 98, 211, 205, 176, 66, 0, 128, 124, 67, 0, 0, 158, 66, 117, 243, 130, 67, 0, 0, 158, 66, 0, 192, 136, 67, 108, 0, 0, 158, 66, 0, 64, 250, 67, 98, 0, 0, 158, 66, 70, 6, 0, 68, 211, 205, 176, 66, 0, 96, 2, 68, 0, 0, 200, 66, 0, 96, 2, 68, 108, 0, 0, 220, 66, 0, 96, 2, 68, 98, 45, 50, 243, 66, 0, 96, 2, 68, 0, 0, 3, 67, 70, 6, 0, 68, 0, 0, 3, 67, 0, 64, 250, 67, 108, 0, 0, 3, 67, 0, 192, 136, 67, 98, 0, 0, 3, 67, 117, 243, 130, 67, 45, 50, 243, 66, 0, 128, 124, 67, 0, 0, 220, 66, 0, 128, 124, 67, 108, 0, 0, 200, 66, 0, 128, 124, 67, 99, 109, 0, 0, 150, 67, 0, 0, 128, 65, 98, 10, 119, 18, 67, 0, 0, 128, 65, 0, 0, 176, 65, 10, 119, 12, 67, 0, 0, 176, 65, 0, 0, 147, 67, 108, 0, 0, 80, 66, 0, 0, 147, 67, 98, 0, 0, 80, 66, 115, 8, 29, 67, 115, 8, 35, 67, 0, 0, 56, 66, 0, 0, 150, 67, 0, 0, 56, 66, 108, 0, 0, 150, 67, 0, 0, 128, 65, 99, 109, 0, 0, 150, 67, 0, 0, 128, 65, 98, 123, 196, 226, 67, 0, 0, 128, 65, 0, 128, 16, 68, 10, 119, 12, 67, 0, 128, 16, 68, 0, 0, 147, 67, 108, 0, 0, 9, 68, 0, 0, 147, 67, 98, 0, 0, 9, 68, 115, 8, 29, 67, 199, 123, 218, 67, 0, 0, 56, 66, 0, 0, 150, 67, 0, 0, 56, 66, 108, 0, 0, 150, 67, 0, 0, 128, 65, 99, 109, 78, 106, 4, 68, 0, 0, 240, 67, 108, 78, 106, 4, 68, 0, 0, 147, 67, 108, 201, 94, 15, 68, 0, 0, 147, 67, 98, 14, 69, 18, 68, 0, 0, 147, 67, 201, 158, 20, 68, 117, 179, 151, 67, 201, 158, 20, 68, 0, 128, 157, 67, 108, 201, 158, 20, 68, 0, 128, 229, 67, 98, 201, 158, 20, 68, 139, 76, 235, 67, 14, 69, 18, 68, 0, 0, 240, 67, 201, 94, 15, 68, 0, 0, 240, 67, 108, 78, 106, 4, 68, 0, 0, 240, 67, 99, 109, 145, 189, 249, 67, 0, 96, 2, 68, 108, 145, 189, 244, 67, 0, 96, 2, 68, 98, 6, 241, 238, 67, 0, 96, 2, 68, 145, 61, 234, 67, 70, 6, 0, 68, 145, 61, 234, 67, 0, 64, 250, 67, 108, 145, 61, 234, 67, 0, 192, 136, 67, 98, 145, 61, 234, 67, 117, 243, 130, 67, 6, 241, 238, 67, 0, 128, 124, 67, 145, 189, 244, 67, 0, 128, 124, 67, 108, 145, 189, 249, 67, 0, 128, 124, 67, 98, 29, 138, 255, 67, 0, 128, 124, 67, 201, 30, 2, 68, 117, 243, 130, 67, 201, 30, 2, 68, 0, 192, 136, 67, 108, 201, 30, 2, 68, 0, 64, 250, 67, 98, 201, 30, 2, 68, 70, 6, 0, 68, 29, 138, 255, 67, 0, 96, 2, 68, 145, 189, 249, 67, 0, 96, 2, 68, 99, 101, 0, 0 }; static const unsigned char DirectivityPathData[] = { 110, 109, 170, 65, 173, 67, 18, 131, 220, 66, 98, 227, 181, 174, 67, 213, 248, 223, 66, 139, 44, 176, 67, 35, 91, 227, 66, 139, 140, 177, 67, 242, 82, 231, 66, 108, 14, 253, 172, 67, 158, 239, 219, 66, 98, 68, 107, 142, 67, 88, 249, 152, 66, 195, 149, 93, 67, 23, 89, 187, 66, 43, 199, 58, 67, 100, 91, 24, 67, 98, 236, 241, 33, 67, 248, 51, 67, 67, 70, 182, 49, 67, 199, 43, 118, 67, 137, 129, 77, 67, 129, 197, 141, 67, 98, 94, 154, 67, 67, 70, 22, 136, 67, 180, 40, 40, 67, 182, 19, 113, 67, 61, 42, 26, 67, 94, 218, 131, 67, 98, 100, 123, 10, 67, 27, 111, 145, 67, 90, 164, 86, 67, 94, 218, 154, 67, 90, 164, 86, 67, 94, 218, 154, 67, 98, 90, 164, 86, 67, 94, 218, 154, 67, 172, 220, 22, 67, 225, 122, 149, 67, 53, 126, 26, 67, 2, 27, 161, 67, 98, 100, 91, 30, 67, 68, 123, 173, 67, 94, 26, 85, 67, 205, 156, 160, 67, 29, 26, 85, 67, 172, 156, 160, 67, 98, 94, 26, 85, 67, 205, 156, 160, 67, 70, 246, 14, 67, 10, 231, 183, 67, 74, 76, 57, 67, 215, 179, 195, 67, 98, 2, 203, 94, 67, 10, 39, 206, 67, 57, 148, 102, 67, 225, 26, 165, 67, 57, 148, 102, 67, 225, 26, 165, 67, 98, 57, 148, 102, 67, 225, 26, 165, 67, 182, 147, 103, 67, 88, 201, 194, 67, 63, 101, 129, 67, 0, 240, 190, 67, 98, 147, 136, 138, 67, 39, 161, 187, 67, 72, 1, 131, 67, 201, 102, 175, 67, 211, 13, 112, 67, 254, 52, 161, 67, 98, 225, 250, 139, 67, 213, 72, 186, 67, 174, 183, 154, 67, 39, 97, 181, 67, 70, 86, 156, 67, 119, 110, 174, 67, 98, 27, 31, 158, 67, 61, 138, 164, 67, 43, 39, 142, 67, 176, 18, 161, 67, 102, 102, 135, 67, 217, 158, 159, 67, 98, 178, 141, 153, 67, 39, 225, 161, 67, 178, 77, 174, 67, 96, 229, 156, 67, 35, 171, 187, 67, 158, 239, 143, 67, 98, 14, 189, 190, 67, 162, 245, 140, 67, 227, 53, 193, 67, 119, 158, 137, 67, 98, 112, 195, 67, 244, 253, 133, 67, 98, 2, 107, 210, 67, 135, 246, 84, 67, 158, 127, 202, 67, 10, 183, 23, 67, 139, 140, 177, 67, 242, 82, 231, 66, 98, 250, 78, 174, 67, 164, 240, 222, 66, 162, 213, 175, 67, 51, 179, 226, 66, 14, 253, 172, 67, 158, 239, 219, 66, 108, 170, 65, 173, 67, 18, 131, 220, 66, 99, 101, 0, 0 }; static const unsigned char AmbiLogoPathData[] = { 110, 109, 252, 201, 149, 67, 217, 206, 87, 63, 108, 47, 221, 147, 67, 29, 90, 100, 63, 98, 152, 78, 86, 67, 68, 139, 124, 64, 117, 115, 23, 67, 102, 38, 137, 66, 199, 107, 22, 67, 0, 0, 22, 67, 108, 152, 110, 22, 67, 160, 218, 22, 67, 108, 145, 109, 25, 67, 90, 228, 22, 67, 98, 225, 26, 50, 67, 27, 175, 24, 67, 158, 15, 74, 67, 184, 158, 30, 67, 178, 125, 95, 67, 100, 59, 43, 67, 98, 215, 195, 73, 67, 152, 110, 56, 67, 172, 60, 55, 67, 31, 101, 74, 67, 195, 117, 42, 67, 238, 124, 96, 67, 98, 254, 84, 70, 67, 4, 246, 134, 67, 209, 226, 116, 67, 70, 54, 149, 67, 100, 91, 149, 67, 176, 146, 149, 67, 108, 20, 94, 149, 67, 0, 0, 150, 67, 108, 172, 92, 149, 67, 80, 109, 150, 67, 98, 213, 216, 117, 67, 10, 231, 150, 67, 236, 49, 69, 67, 150, 227, 164, 67, 98, 144, 42, 67, 76, 215, 187, 67, 98, 154, 217, 55, 67, 70, 198, 198, 67, 127, 202, 73, 67, 150, 35, 208, 67, 39, 17, 96, 67, 27, 143, 214, 67, 98, 188, 20, 73, 67, 203, 225, 220, 67, 53, 222, 48, 67, 29, 154, 224, 67, 152, 110, 22, 67, 176, 146, 224, 67, 108, 199, 107, 22, 67, 0, 0, 225, 67, 98, 182, 51, 23, 67, 188, 44, 5, 68, 66, 0, 86, 67, 4, 190, 20, 68, 47, 221, 147, 67, 233, 198, 21, 68, 108, 252, 201, 149, 67, 12, 202, 21, 68, 108, 201, 182, 151, 67, 233, 198, 21, 68, 98, 238, 108, 192, 67, 100, 3, 21, 68, 252, 217, 223, 67, 51, 219, 4, 68, 20, 94, 224, 67, 0, 0, 225, 67, 108, 113, 93, 224, 67, 240, 199, 224, 67, 98, 0, 128, 211, 67, 254, 116, 224, 67, 160, 154, 198, 67, 6, 65, 221, 67, 176, 130, 187, 67, 123, 148, 214, 67, 98, 225, 122, 198, 67, 94, 234, 207, 67, 168, 230, 207, 67, 254, 244, 198, 67, 135, 86, 214, 67, 195, 197, 187, 67, 98, 84, 115, 200, 67, 96, 5, 165, 67, 113, 29, 177, 67, 55, 201, 150, 67, 76, 55, 150, 67, 80, 109, 150, 67, 108, 4, 54, 150, 67, 0, 0, 150, 67, 108, 76, 55, 150, 67, 176, 146, 149, 67, 98, 141, 167, 176, 67, 213, 24, 149, 67, 2, 251, 200, 67, 106, 28, 135, 67, 231, 75, 214, 67, 104, 81, 96, 67, 98, 76, 167, 207, 67, 117, 115, 74, 67, 217, 174, 198, 67, 213, 184, 55, 67, 133, 139, 187, 67, 203, 225, 42, 67, 98, 154, 9, 199, 67, 41, 60, 30, 67, 254, 36, 211, 67, 199, 203, 22, 67, 172, 92, 224, 67, 160, 218, 22, 67, 108, 20, 94, 224, 67, 0, 0, 22, 67, 98, 94, 250, 223, 67, 29, 154, 134, 66, 182, 147, 192, 67, 244, 253, 160, 64, 201, 182, 151, 67, 29, 90, 100, 63, 108, 252, 201, 149, 67, 217, 206, 87, 63, 98, 86, 110, 150, 67, 109, 231, 91, 63, 143, 18, 151, 67, 137, 65, 96, 63, 201, 182, 151, 67, 29, 90, 100, 63, 98, 201, 182, 151, 67, 29, 90, 100, 63, 201, 182, 151, 67, 29, 90, 100, 63, 201, 182, 151, 67, 29, 90, 100, 63, 98, 45, 82, 232, 67, 129, 149, 3, 64, 219, 41, 21, 68, 152, 142, 7, 67, 248, 171, 21, 68, 51, 19, 148, 67, 98, 248, 171, 21, 68, 51, 19, 148, 67, 248, 171, 21, 68, 51, 19, 148, 67, 248, 171, 21, 68, 51, 19, 148, 67, 98, 254, 172, 21, 68, 109, 183, 148, 67, 4, 174, 21, 68, 199, 91, 149, 67, 10, 175, 21, 68, 0, 0, 150, 67, 108, 254, 228, 21, 68, 0, 0, 150, 67, 98, 102, 230, 21, 68, 182, 179, 153, 67, 170, 193, 21, 68, 37, 102, 157, 67, 45, 122, 21, 68, 184, 14, 161, 67, 98, 74, 108, 19, 68, 236, 209, 237, 67, 51, 131, 227, 67, 25, 76, 21, 68, 201, 182, 151, 67, 233, 198, 21, 68, 98, 201, 182, 151, 67, 233, 198, 21, 68, 201, 182, 151, 67, 233, 198, 21, 68, 201, 182, 151, 67, 233, 198, 21, 68, 98, 143, 18, 151, 67, 240, 199, 21, 68, 86, 110, 150, 67, 6, 201, 21, 68, 252, 201, 149, 67, 12, 202, 21, 68, 98, 195, 37, 149, 67, 6, 201, 21, 68, 137, 129, 148, 67, 240, 199, 21, 68, 80, 221, 147, 67, 233, 198, 21, 68, 98, 47, 221, 147, 67, 233, 198, 21, 68, 47, 221, 147, 67, 233, 198, 21, 68, 47, 221, 147, 67, 233, 198, 21, 68, 98, 123, 148, 2, 67, 121, 73, 21, 68, 238, 124, 31, 64, 242, 210, 231, 67, 80, 141, 215, 62, 0, 0, 150, 67, 108, 68, 139, 236, 62, 49, 104, 148, 67, 98, 123, 20, 238, 62, 231, 75, 148, 67, 160, 26, 239, 62, 125, 47, 148, 67, 215, 163, 240, 62, 51, 19, 148, 67, 98, 215, 163, 240, 62, 51, 19, 148, 67, 215, 163, 240, 62, 51, 19, 148, 67, 215, 163, 240, 62, 51, 19, 148, 67, 98, 233, 38, 209, 63, 223, 239, 6, 67, 209, 34, 7, 67, 209, 34, 59, 64, 47, 221, 147, 67, 29, 90, 100, 63, 98, 47, 221, 147, 67, 29, 90, 100, 63, 47, 221, 147, 67, 29, 90, 100, 63, 80, 221, 147, 67, 29, 90, 100, 63, 98, 137, 129, 148, 67, 137, 65, 96, 63, 195, 37, 149, 67, 109, 231, 91, 63, 252, 201, 149, 67, 217, 206, 87, 63, 99, 109, 252, 201, 224, 67, 207, 215, 22, 67, 108, 172, 92, 224, 67, 160, 218, 22, 67, 98, 252, 9, 224, 67, 96, 165, 48, 67, 80, 205, 220, 67, 152, 238, 73, 67, 231, 75, 214, 67, 104, 81, 96, 67, 98, 80, 45, 221, 67, 10, 247, 118, 67, 74, 124, 224, 67, 6, 209, 136, 67, 25, 148, 224, 67, 0, 0, 150, 67, 98, 88, 105, 224, 67, 72, 49, 163, 67, 4, 54, 221, 67, 94, 106, 176, 67, 135, 86, 214, 67, 195, 197, 187, 67, 98, 248, 19, 221, 67, 131, 208, 198, 67, 193, 42, 224, 67, 45, 242, 211, 67, 113, 93, 224, 67, 240, 199, 224, 67, 108, 0, 0, 225, 67, 252, 201, 224, 67, 98, 59, 215, 2, 68, 23, 233, 224, 67, 164, 184, 18, 68, 25, 36, 197, 67, 45, 122, 21, 68, 184, 14, 161, 67, 98, 39, 177, 21, 68, 84, 147, 152, 67, 238, 164, 21, 68, 51, 67, 156, 67, 10, 175, 21, 68, 0, 0, 150, 67, 108, 248, 171, 21, 68, 51, 19, 148, 67, 98, 115, 232, 20, 68, 160, 186, 86, 67, 49, 192, 4, 68, 125, 223, 23, 67, 252, 201, 224, 67, 207, 215, 22, 67, 99, 109, 248, 147, 21, 67, 207, 215, 22, 67, 98, 143, 194, 133, 66, 125, 159, 23, 67, 238, 124, 147, 64, 139, 108, 86, 67, 215, 163, 240, 62, 51, 19, 148, 67, 108, 68, 139, 236, 62, 49, 104, 148, 67, 108, 80, 141, 215, 62, 0, 0, 150, 67, 98, 98, 16, 216, 62, 66, 48, 191, 67, 233, 102, 134, 66, 25, 148, 224, 67, 248, 147, 21, 67, 25, 148, 224, 67, 108, 152, 110, 22, 67, 176, 146, 224, 67, 98, 57, 20, 23, 67, 80, 173, 211, 67, 145, 141, 29, 67, 180, 8, 199, 67, 98, 144, 42, 67, 76, 215, 187, 67, 98, 211, 205, 28, 67, 123, 132, 176, 67, 92, 47, 22, 67, 27, 47, 163, 67, 0, 0, 22, 67, 0, 0, 150, 67, 98, 63, 85, 22, 67, 131, 208, 136, 67, 94, 186, 28, 67, 104, 49, 119, 67, 195, 117, 42, 67, 238, 124, 96, 67, 98, 164, 208, 29, 67, 131, 128, 73, 67, 190, 95, 22, 67, 252, 73, 49, 67, 152, 110, 22, 67, 160, 218, 22, 67, 108, 248, 147, 21, 67, 207, 215, 22, 67, 99, 109, 252, 201, 149, 67, 231, 107, 150, 67, 108, 172, 92, 149, 67, 80, 109, 150, 67, 98, 131, 0, 149, 67, 207, 87, 177, 67, 98, 192, 134, 67, 250, 158, 200, 67, 39, 17, 96, 67, 27, 143, 214, 67, 98, 162, 197, 118, 67, 238, 108, 221, 67, 127, 154, 136, 67, 59, 159, 224, 67, 252, 201, 149, 67, 252, 201, 224, 67, 98, 219, 233, 162, 67, 217, 174, 224, 67, 2, 59, 176, 67, 59, 111, 221, 67, 176, 130, 187, 67, 123, 148, 214, 67, 98, 215, 163, 164, 67, 51, 51, 201, 67, 125, 175, 150, 67, 248, 211, 176, 67, 76, 55, 150, 67, 80, 109, 150, 67, 108, 252, 201, 149, 67, 231, 107, 150, 67, 99, 109, 252, 201, 149, 67, 199, 107, 22, 67, 98, 39, 129, 136, 67, 223, 143, 22, 67, 180, 72, 118, 67, 78, 98, 29, 67, 178, 125, 95, 67, 100, 59, 43, 67, 98, 66, 240, 134, 67, 84, 227, 68, 67, 238, 156, 148, 67, 18, 227, 118, 67, 100, 91, 149, 67, 176, 146, 149, 67, 108, 252, 201, 149, 67, 25, 148, 149, 67, 108, 76, 55, 150, 67, 176, 146, 149, 67, 98, 117, 147, 150, 67, 164, 80, 117, 67, 182, 211, 164, 67, 137, 193, 70, 67, 133, 139, 187, 67, 203, 225, 42, 67, 98, 72, 49, 176, 67, 37, 38, 29, 67, 121, 249, 162, 67, 137, 193, 22, 67, 252, 201, 149, 67, 199, 107, 22, 67, 99, 101, 0, 0 }; static const unsigned char IEMpathData[] = { 110, 109, 199, 203, 118, 66, 117, 147, 213, 66, 108, 94, 186, 124, 66, 66, 224, 213, 66, 98, 160, 154, 133, 66, 119, 254, 215, 66, 72, 97, 137, 66, 158, 239, 220, 66, 190, 31, 138, 66, 80, 77, 228, 66, 98, 190, 31, 138, 66, 152, 110, 236, 66, 43, 135, 131, 66, 174, 7, 243, 66, 199, 203, 118, 66, 174, 7, 243, 66, 98, 61, 138, 102, 66, 174, 7, 243, 66, 16, 88, 89, 66, 152, 110, 236, 66, 10, 87, 89, 66, 80, 77, 228, 66, 98, 16, 88, 89, 66, 139, 44, 220, 66, 61, 138, 102, 66, 117, 147, 213, 66, 199, 203, 118, 66, 117, 147, 213, 66, 99, 109, 162, 37, 92, 67, 117, 147, 213, 66, 98, 63, 21, 88, 67, 117, 147, 213, 66, 246, 200, 84, 67, 139, 44, 220, 66, 180, 200, 84, 67, 80, 77, 228, 66, 98, 246, 200, 84, 67, 152, 110, 236, 66, 63, 21, 88, 67, 174, 7, 243, 66, 162, 37, 92, 67, 174, 7, 243, 66, 98, 70, 54, 96, 67, 174, 7, 243, 66, 209, 130, 99, 67, 152, 110, 236, 66, 209, 130, 99, 67, 80, 77, 228, 66, 98, 209, 130, 99, 67, 139, 44, 220, 66, 70, 54, 96, 67, 117, 147, 213, 66, 162, 37, 92, 67, 117, 147, 213, 66, 99, 109, 39, 49, 237, 65, 117, 147, 213, 66, 98, 90, 100, 204, 65, 109, 103, 214, 66, 154, 153, 179, 65, 45, 178, 219, 66, 174, 71, 178, 65, 80, 77, 228, 66, 98, 174, 71, 178, 65, 152, 110, 236, 66, 252, 169, 204, 65, 174, 7, 243, 66, 39, 49, 237, 65, 174, 7, 243, 66, 98, 29, 218, 6, 66, 174, 7, 243, 66, 74, 12, 20, 66, 152, 110, 236, 66, 74, 12, 20, 66, 80, 77, 228, 66, 98, 92, 143, 18, 66, 158, 239, 220, 66, 12, 2, 11, 66, 119, 254, 215, 66, 86, 14, 249, 65, 66, 224, 213, 66, 108, 39, 49, 237, 65, 117, 147, 213, 66, 99, 109, 111, 50, 124, 67, 117, 147, 213, 66, 98, 12, 34, 120, 67, 117, 147, 213, 66, 195, 213, 116, 67, 139, 44, 220, 66, 195, 213, 116, 67, 80, 77, 228, 66, 98, 195, 213, 116, 67, 152, 110, 236, 66, 12, 34, 120, 67, 174, 7, 243, 66, 111, 50, 124, 67, 174, 7, 243, 66, 98, 170, 33, 128, 67, 174, 7, 243, 66, 207, 199, 129, 67, 152, 110, 236, 66, 207, 199, 129, 67, 80, 77, 228, 66, 98, 49, 152, 129, 67, 158, 239, 220, 66, 135, 166, 128, 67, 119, 254, 215, 66, 86, 174, 125, 67, 66, 224, 213, 66, 108, 111, 50, 124, 67, 117, 147, 213, 66, 99, 109, 76, 183, 23, 67, 117, 147, 213, 66, 98, 233, 166, 19, 67, 117, 147, 213, 66, 94, 90, 16, 67, 139, 44, 220, 66, 94, 90, 16, 67, 80, 77, 228, 66, 98, 94, 90, 16, 67, 152, 110, 236, 66, 233, 166, 19, 67, 174, 7, 243, 66, 76, 183, 23, 67, 174, 7, 243, 66, 98, 240, 199, 27, 67, 174, 7, 243, 66, 123, 20, 31, 67, 152, 110, 236, 66, 123, 20, 31, 67, 80, 77, 228, 66, 98, 123, 20, 31, 67, 139, 44, 220, 66, 240, 199, 27, 67, 117, 147, 213, 66, 76, 183, 23, 67, 117, 147, 213, 66, 99, 109, 39, 177, 7, 67, 117, 147, 213, 66, 98, 197, 160, 3, 67, 117, 147, 213, 66, 57, 84, 0, 67, 139, 44, 220, 66, 57, 84, 0, 67, 80, 77, 228, 66, 98, 57, 84, 0, 67, 152, 110, 236, 66, 197, 160, 3, 67, 174, 7, 243, 66, 39, 177, 7, 67, 174, 7, 243, 66, 98, 203, 193, 11, 67, 174, 7, 243, 66, 86, 14, 15, 67, 152, 110, 236, 66, 86, 14, 15, 67, 80, 77, 228, 66, 98, 27, 175, 14, 67, 158, 239, 220, 66, 133, 203, 12, 67, 119, 254, 215, 66, 205, 44, 9, 67, 66, 224, 213, 66, 108, 39, 177, 7, 67, 117, 147, 213, 66, 99, 109, 213, 24, 60, 67, 117, 147, 213, 66, 98, 115, 8, 56, 67, 117, 147, 213, 66, 231, 187, 52, 67, 139, 44, 220, 66, 231, 187, 52, 67, 80, 77, 228, 66, 98, 231, 187, 52, 67, 152, 110, 236, 66, 115, 8, 56, 67, 174, 7, 243, 66, 213, 24, 60, 67, 174, 7, 243, 66, 98, 121, 41, 64, 67, 174, 7, 243, 66, 70, 118, 67, 67, 152, 110, 236, 66, 4, 118, 67, 67, 80, 77, 228, 66, 98, 70, 118, 67, 67, 139, 44, 220, 66, 121, 41, 64, 67, 117, 147, 213, 66, 213, 24, 60, 67, 117, 147, 213, 66, 99, 109, 254, 84, 239, 66, 117, 147, 213, 66, 98, 188, 52, 231, 66, 117, 147, 213, 66, 166, 155, 224, 66, 139, 44, 220, 66, 35, 155, 224, 66, 80, 77, 228, 66, 98, 166, 155, 224, 66, 152, 110, 236, 66, 188, 52, 231, 66, 174, 7, 243, 66, 254, 84, 239, 66, 174, 7, 243, 66, 98, 201, 118, 247, 66, 174, 7, 243, 66, 223, 15, 254, 66, 152, 110, 236, 66, 223, 15, 254, 66, 80, 77, 228, 66, 98, 223, 15, 254, 66, 139, 44, 220, 66, 201, 118, 247, 66, 117, 147, 213, 66, 254, 84, 239, 66, 117, 147, 213, 66, 99, 109, 45, 178, 54, 66, 117, 147, 213, 66, 98, 164, 112, 38, 66, 117, 147, 213, 66, 119, 62, 25, 66, 139, 44, 220, 66, 113, 61, 25, 66, 80, 77, 228, 66, 98, 119, 62, 25, 66, 152, 110, 236, 66, 164, 112, 38, 66, 174, 7, 243, 66, 45, 178, 54, 66, 174, 7, 243, 66, 98, 182, 243, 70, 66, 174, 7, 243, 66, 227, 37, 84, 66, 152, 110, 236, 66, 227, 37, 84, 66, 80, 77, 228, 66, 98, 227, 37, 84, 66, 139, 44, 220, 66, 182, 243, 70, 66, 117, 147, 213, 66, 45, 178, 54, 66, 117, 147, 213, 66, 99, 109, 0, 64, 210, 66, 66, 224, 213, 66, 108, 180, 72, 207, 66, 117, 147, 213, 66, 98, 240, 39, 199, 66, 117, 147, 213, 66, 217, 142, 192, 66, 139, 44, 220, 66, 217, 142, 192, 66, 80, 77, 228, 66, 98, 217, 142, 192, 66, 152, 110, 236, 66, 240, 39, 199, 66, 174, 7, 243, 66, 180, 72, 207, 66, 174, 7, 243, 66, 98, 252, 105, 215, 66, 174, 7, 243, 66, 150, 3, 222, 66, 152, 110, 236, 66, 18, 3, 222, 66, 80, 77, 228, 66, 98, 31, 69, 221, 66, 158, 239, 220, 66, 113, 125, 217, 66, 119, 254, 215, 66, 0, 64, 210, 66, 66, 224, 213, 66, 99, 109, 231, 59, 175, 66, 53, 222, 181, 66, 108, 231, 59, 175, 66, 53, 222, 181, 66, 98, 35, 27, 167, 66, 53, 222, 181, 66, 143, 130, 160, 66, 76, 119, 188, 66, 12, 130, 160, 66, 16, 152, 196, 66, 98, 143, 130, 160, 66, 88, 185, 204, 66, 35, 27, 167, 66, 111, 82, 211, 66, 231, 59, 175, 66, 111, 82, 211, 66, 98, 178, 93, 183, 66, 111, 82, 211, 66, 70, 246, 189, 66, 88, 185, 204, 66, 70, 246, 189, 66, 16, 152, 196, 66, 98, 70, 246, 189, 66, 76, 119, 188, 66, 178, 93, 183, 66, 53, 222, 181, 66, 231, 59, 175, 66, 53, 222, 181, 66, 99, 109, 45, 178, 54, 66, 53, 222, 181, 66, 108, 45, 178, 54, 66, 53, 222, 181, 66, 98, 164, 112, 38, 66, 53, 222, 181, 66, 119, 62, 25, 66, 76, 119, 188, 66, 113, 61, 25, 66, 16, 152, 196, 66, 98, 119, 62, 25, 66, 88, 185, 204, 66, 164, 112, 38, 66, 111, 82, 211, 66, 45, 178, 54, 66, 111, 82, 211, 66, 98, 182, 243, 70, 66, 111, 82, 211, 66, 227, 37, 84, 66, 88, 185, 204, 66, 227, 37, 84, 66, 16, 152, 196, 66, 98, 227, 37, 84, 66, 76, 119, 188, 66, 182, 243, 70, 66, 53, 222, 181, 66, 45, 178, 54, 66, 53, 222, 181, 66, 99, 109, 162, 37, 92, 67, 178, 221, 181, 66, 108, 162, 37, 92, 67, 178, 221, 181, 66, 98, 63, 21, 88, 67, 178, 221, 181, 66, 246, 200, 84, 67, 201, 118, 188, 66, 180, 200, 84, 67, 141, 151, 196, 66, 98, 246, 200, 84, 67, 213, 184, 204, 66, 63, 21, 88, 67, 236, 81, 211, 66, 162, 37, 92, 67, 236, 81, 211, 66, 98, 70, 54, 96, 67, 236, 81, 211, 66, 209, 130, 99, 67, 213, 184, 204, 66, 209, 130, 99, 67, 141, 151, 196, 66, 98, 209, 130, 99, 67, 201, 118, 188, 66, 70, 54, 96, 67, 178, 221, 181, 66, 162, 37, 92, 67, 178, 221, 181, 66, 99, 109, 213, 24, 60, 67, 178, 221, 181, 66, 108, 213, 24, 60, 67, 178, 221, 181, 66, 98, 115, 8, 56, 67, 178, 221, 181, 66, 231, 187, 52, 67, 201, 118, 188, 66, 231, 187, 52, 67, 141, 151, 196, 66, 98, 231, 187, 52, 67, 213, 184, 204, 66, 115, 8, 56, 67, 236, 81, 211, 66, 213, 24, 60, 67, 236, 81, 211, 66, 98, 121, 41, 64, 67, 236, 81, 211, 66, 70, 118, 67, 67, 213, 184, 204, 66, 4, 118, 67, 67, 141, 151, 196, 66, 98, 70, 118, 67, 67, 201, 118, 188, 66, 121, 41, 64, 67, 178, 221, 181, 66, 213, 24, 60, 67, 178, 221, 181, 66, 99, 109, 111, 50, 124, 67, 178, 221, 181, 66, 108, 111, 50, 124, 67, 178, 221, 181, 66, 98, 12, 34, 120, 67, 178, 221, 181, 66, 195, 213, 116, 67, 201, 118, 188, 66, 195, 213, 116, 67, 141, 151, 196, 66, 98, 195, 213, 116, 67, 213, 184, 204, 66, 12, 34, 120, 67, 236, 81, 211, 66, 111, 50, 124, 67, 236, 81, 211, 66, 98, 170, 33, 128, 67, 236, 81, 211, 66, 207, 199, 129, 67, 213, 184, 204, 66, 207, 199, 129, 67, 141, 151, 196, 66, 98, 207, 199, 129, 67, 201, 118, 188, 66, 170, 33, 128, 67, 178, 221, 181, 66, 111, 50, 124, 67, 178, 221, 181, 66, 99, 109, 111, 50, 124, 67, 240, 39, 150, 66, 98, 12, 34, 120, 67, 240, 39, 150, 66, 195, 213, 116, 67, 6, 193, 156, 66, 195, 213, 116, 67, 203, 225, 164, 66, 98, 195, 213, 116, 67, 18, 3, 173, 66, 12, 34, 120, 67, 41, 156, 179, 66, 111, 50, 124, 67, 41, 156, 179, 66, 98, 170, 33, 128, 67, 41, 156, 179, 66, 207, 199, 129, 67, 18, 3, 173, 66, 207, 199, 129, 67, 203, 225, 164, 66, 98, 49, 152, 129, 67, 25, 132, 157, 66, 135, 166, 128, 67, 242, 146, 152, 66, 86, 174, 125, 67, 188, 116, 150, 66, 108, 111, 50, 124, 67, 240, 39, 150, 66, 99, 109, 254, 84, 239, 66, 240, 39, 150, 66, 98, 188, 52, 231, 66, 240, 39, 150, 66, 166, 155, 224, 66, 6, 193, 156, 66, 35, 155, 224, 66, 203, 225, 164, 66, 98, 166, 155, 224, 66, 18, 3, 173, 66, 188, 52, 231, 66, 41, 156, 179, 66, 254, 84, 239, 66, 41, 156, 179, 66, 98, 201, 118, 247, 66, 41, 156, 179, 66, 223, 15, 254, 66, 18, 3, 173, 66, 223, 15, 254, 66, 203, 225, 164, 66, 98, 223, 15, 254, 66, 6, 193, 156, 66, 201, 118, 247, 66, 240, 39, 150, 66, 254, 84, 239, 66, 240, 39, 150, 66, 99, 109, 180, 72, 207, 66, 240, 39, 150, 66, 98, 240, 39, 199, 66, 240, 39, 150, 66, 217, 142, 192, 66, 6, 193, 156, 66, 217, 142, 192, 66, 203, 225, 164, 66, 98, 217, 142, 192, 66, 18, 3, 173, 66, 240, 39, 199, 66, 41, 156, 179, 66, 180, 72, 207, 66, 41, 156, 179, 66, 98, 252, 105, 215, 66, 41, 156, 179, 66, 150, 3, 222, 66, 18, 3, 173, 66, 18, 3, 222, 66, 203, 225, 164, 66, 98, 31, 69, 221, 66, 25, 132, 157, 66, 113, 125, 217, 66, 242, 146, 152, 66, 0, 64, 210, 66, 188, 116, 150, 66, 108, 180, 72, 207, 66, 240, 39, 150, 66, 99, 109, 162, 37, 92, 67, 240, 39, 150, 66, 98, 63, 21, 88, 67, 240, 39, 150, 66, 246, 200, 84, 67, 6, 193, 156, 66, 180, 200, 84, 67, 203, 225, 164, 66, 98, 246, 200, 84, 67, 18, 3, 173, 66, 63, 21, 88, 67, 41, 156, 179, 66, 162, 37, 92, 67, 41, 156, 179, 66, 98, 70, 54, 96, 67, 41, 156, 179, 66, 209, 130, 99, 67, 18, 3, 173, 66, 209, 130, 99, 67, 203, 225, 164, 66, 98, 209, 130, 99, 67, 6, 193, 156, 66, 70, 54, 96, 67, 240, 39, 150, 66, 162, 37, 92, 67, 240, 39, 150, 66, 99, 109, 231, 59, 175, 66, 240, 39, 150, 66, 98, 35, 27, 167, 66, 240, 39, 150, 66, 143, 130, 160, 66, 6, 193, 156, 66, 12, 130, 160, 66, 203, 225, 164, 66, 98, 143, 130, 160, 66, 18, 3, 173, 66, 35, 27, 167, 66, 41, 156, 179, 66, 231, 59, 175, 66, 41, 156, 179, 66, 98, 178, 93, 183, 66, 41, 156, 179, 66, 70, 246, 189, 66, 18, 3, 173, 66, 70, 246, 189, 66, 203, 225, 164, 66, 98, 70, 246, 189, 66, 6, 193, 156, 66, 178, 93, 183, 66, 240, 39, 150, 66, 231, 59, 175, 66, 240, 39, 150, 66, 99, 109, 76, 183, 23, 67, 240, 39, 150, 66, 98, 233, 166, 19, 67, 240, 39, 150, 66, 94, 90, 16, 67, 6, 193, 156, 66, 94, 90, 16, 67, 203, 225, 164, 66, 98, 94, 90, 16, 67, 18, 3, 173, 66, 233, 166, 19, 67, 41, 156, 179, 66, 76, 183, 23, 67, 41, 156, 179, 66, 98, 240, 199, 27, 67, 41, 156, 179, 66, 123, 20, 31, 67, 18, 3, 173, 66, 123, 20, 31, 67, 203, 225, 164, 66, 98, 123, 20, 31, 67, 6, 193, 156, 66, 240, 199, 27, 67, 240, 39, 150, 66, 76, 183, 23, 67, 240, 39, 150, 66, 99, 109, 45, 178, 54, 66, 240, 39, 150, 66, 98, 164, 112, 38, 66, 240, 39, 150, 66, 119, 62, 25, 66, 6, 193, 156, 66, 113, 61, 25, 66, 203, 225, 164, 66, 98, 119, 62, 25, 66, 18, 3, 173, 66, 164, 112, 38, 66, 41, 156, 179, 66, 45, 178, 54, 66, 41, 156, 179, 66, 98, 182, 243, 70, 66, 41, 156, 179, 66, 227, 37, 84, 66, 18, 3, 173, 66, 227, 37, 84, 66, 203, 225, 164, 66, 98, 227, 37, 84, 66, 6, 193, 156, 66, 182, 243, 70, 66, 240, 39, 150, 66, 45, 178, 54, 66, 240, 39, 150, 66, 99, 109, 213, 24, 60, 67, 240, 39, 150, 66, 98, 115, 8, 56, 67, 240, 39, 150, 66, 231, 187, 52, 67, 6, 193, 156, 66, 231, 187, 52, 67, 203, 225, 164, 66, 98, 231, 187, 52, 67, 18, 3, 173, 66, 115, 8, 56, 67, 41, 156, 179, 66, 213, 24, 60, 67, 41, 156, 179, 66, 98, 121, 41, 64, 67, 41, 156, 179, 66, 70, 118, 67, 67, 18, 3, 173, 66, 4, 118, 67, 67, 203, 225, 164, 66, 98, 70, 118, 67, 67, 6, 193, 156, 66, 121, 41, 64, 67, 240, 39, 150, 66, 213, 24, 60, 67, 240, 39, 150, 66, 99, 109, 39, 177, 7, 67, 240, 39, 150, 66, 98, 197, 160, 3, 67, 240, 39, 150, 66, 57, 84, 0, 67, 6, 193, 156, 66, 57, 84, 0, 67, 203, 225, 164, 66, 98, 57, 84, 0, 67, 18, 3, 173, 66, 197, 160, 3, 67, 41, 156, 179, 66, 39, 177, 7, 67, 41, 156, 179, 66, 98, 203, 193, 11, 67, 41, 156, 179, 66, 86, 14, 15, 67, 18, 3, 173, 66, 86, 14, 15, 67, 203, 225, 164, 66, 98, 27, 175, 14, 67, 25, 132, 157, 66, 133, 203, 12, 67, 242, 146, 152, 66, 205, 44, 9, 67, 188, 116, 150, 66, 108, 39, 177, 7, 67, 240, 39, 150, 66, 99, 109, 213, 24, 60, 67, 90, 228, 108, 66, 108, 213, 24, 60, 67, 90, 228, 108, 66, 98, 115, 8, 56, 67, 90, 228, 108, 66, 231, 187, 52, 67, 135, 22, 122, 66, 231, 187, 52, 67, 8, 44, 133, 66, 98, 231, 187, 52, 67, 80, 77, 141, 66, 115, 8, 56, 67, 102, 230, 147, 66, 213, 24, 60, 67, 102, 230, 147, 66, 98, 121, 41, 64, 67, 102, 230, 147, 66, 70, 118, 67, 67, 80, 77, 141, 66, 4, 118, 67, 67, 8, 44, 133, 66, 98, 70, 118, 67, 67, 135, 22, 122, 66, 121, 41, 64, 67, 90, 228, 108, 66, 213, 24, 60, 67, 90, 228, 108, 66, 99, 109, 231, 59, 175, 66, 90, 228, 108, 66, 108, 231, 59, 175, 66, 90, 228, 108, 66, 98, 35, 27, 167, 66, 90, 228, 108, 66, 143, 130, 160, 66, 135, 22, 122, 66, 12, 130, 160, 66, 8, 44, 133, 66, 98, 143, 130, 160, 66, 80, 77, 141, 66, 35, 27, 167, 66, 102, 230, 147, 66, 231, 59, 175, 66, 102, 230, 147, 66, 98, 178, 93, 183, 66, 102, 230, 147, 66, 70, 246, 189, 66, 80, 77, 141, 66, 70, 246, 189, 66, 8, 44, 133, 66, 98, 70, 246, 189, 66, 135, 22, 122, 66, 178, 93, 183, 66, 90, 228, 108, 66, 231, 59, 175, 66, 90, 228, 108, 66, 99, 109, 76, 183, 23, 67, 90, 228, 108, 66, 108, 76, 183, 23, 67, 90, 228, 108, 66, 98, 233, 166, 19, 67, 90, 228, 108, 66, 94, 90, 16, 67, 135, 22, 122, 66, 94, 90, 16, 67, 8, 44, 133, 66, 98, 94, 90, 16, 67, 80, 77, 141, 66, 233, 166, 19, 67, 102, 230, 147, 66, 76, 183, 23, 67, 102, 230, 147, 66, 98, 240, 199, 27, 67, 102, 230, 147, 66, 123, 20, 31, 67, 80, 77, 141, 66, 123, 20, 31, 67, 8, 44, 133, 66, 98, 123, 20, 31, 67, 135, 22, 122, 66, 240, 199, 27, 67, 90, 228, 108, 66, 76, 183, 23, 67, 90, 228, 108, 66, 99, 109, 111, 50, 124, 67, 90, 228, 108, 66, 108, 111, 50, 124, 67, 90, 228, 108, 66, 98, 12, 34, 120, 67, 90, 228, 108, 66, 195, 213, 116, 67, 135, 22, 122, 66, 195, 213, 116, 67, 8, 44, 133, 66, 98, 195, 213, 116, 67, 80, 77, 141, 66, 12, 34, 120, 67, 102, 230, 147, 66, 111, 50, 124, 67, 102, 230, 147, 66, 98, 170, 33, 128, 67, 102, 230, 147, 66, 207, 199, 129, 67, 80, 77, 141, 66, 207, 199, 129, 67, 8, 44, 133, 66, 98, 207, 199, 129, 67, 135, 22, 122, 66, 170, 33, 128, 67, 90, 228, 108, 66, 111, 50, 124, 67, 90, 228, 108, 66, 99, 109, 162, 37, 92, 67, 90, 228, 108, 66, 108, 162, 37, 92, 67, 90, 228, 108, 66, 98, 63, 21, 88, 67, 90, 228, 108, 66, 246, 200, 84, 67, 135, 22, 122, 66, 180, 200, 84, 67, 8, 44, 133, 66, 98, 246, 200, 84, 67, 80, 77, 141, 66, 63, 21, 88, 67, 102, 230, 147, 66, 162, 37, 92, 67, 102, 230, 147, 66, 98, 70, 54, 96, 67, 102, 230, 147, 66, 209, 130, 99, 67, 80, 77, 141, 66, 209, 130, 99, 67, 8, 44, 133, 66, 98, 209, 130, 99, 67, 135, 22, 122, 66, 70, 54, 96, 67, 90, 228, 108, 66, 162, 37, 92, 67, 90, 228, 108, 66, 99, 109, 45, 178, 54, 66, 90, 228, 108, 66, 108, 45, 178, 54, 66, 90, 228, 108, 66, 98, 164, 112, 38, 66, 90, 228, 108, 66, 119, 62, 25, 66, 135, 22, 122, 66, 113, 61, 25, 66, 8, 44, 133, 66, 98, 119, 62, 25, 66, 80, 77, 141, 66, 164, 112, 38, 66, 102, 230, 147, 66, 45, 178, 54, 66, 102, 230, 147, 66, 98, 182, 243, 70, 66, 102, 230, 147, 66, 227, 37, 84, 66, 80, 77, 141, 66, 227, 37, 84, 66, 8, 44, 133, 66, 98, 227, 37, 84, 66, 135, 22, 122, 66, 182, 243, 70, 66, 90, 228, 108, 66, 45, 178, 54, 66, 90, 228, 108, 66, 99, 109, 59, 31, 76, 67, 207, 119, 45, 66, 98, 27, 15, 72, 67, 207, 119, 45, 66, 143, 194, 68, 67, 252, 169, 58, 66, 143, 194, 68, 67, 133, 235, 74, 66, 98, 143, 194, 68, 67, 20, 46, 91, 66, 27, 15, 72, 67, 66, 96, 104, 66, 59, 31, 76, 67, 66, 96, 104, 66, 98, 33, 48, 80, 67, 66, 96, 104, 66, 106, 124, 83, 67, 20, 46, 91, 66, 106, 124, 83, 67, 133, 235, 74, 66, 98, 47, 29, 83, 67, 33, 48, 60, 66, 219, 57, 81, 67, 211, 77, 50, 66, 35, 155, 77, 67, 104, 17, 46, 66, 108, 59, 31, 76, 67, 207, 119, 45, 66, 99, 109, 254, 84, 239, 66, 207, 119, 45, 66, 98, 188, 52, 231, 66, 207, 119, 45, 66, 166, 155, 224, 66, 252, 169, 58, 66, 35, 155, 224, 66, 133, 235, 74, 66, 98, 166, 155, 224, 66, 20, 46, 91, 66, 188, 52, 231, 66, 66, 96, 104, 66, 254, 84, 239, 66, 66, 96, 104, 66, 98, 201, 118, 247, 66, 66, 96, 104, 66, 223, 15, 254, 66, 20, 46, 91, 66, 223, 15, 254, 66, 133, 235, 74, 66, 98, 223, 15, 254, 66, 252, 169, 58, 66, 201, 118, 247, 66, 207, 119, 45, 66, 254, 84, 239, 66, 207, 119, 45, 66, 99, 109, 45, 178, 54, 66, 207, 119, 45, 66, 108, 207, 119, 54, 66, 244, 125, 45, 66, 108, 113, 61, 54, 66, 207, 119, 45, 66, 98, 225, 250, 37, 66, 207, 119, 45, 66, 174, 199, 24, 66, 252, 169, 58, 66, 174, 199, 24, 66, 133, 235, 74, 66, 98, 174, 199, 24, 66, 20, 46, 91, 66, 225, 250, 37, 66, 66, 96, 104, 66, 113, 61, 54, 66, 66, 96, 104, 66, 108, 207, 119, 54, 66, 29, 90, 104, 66, 108, 45, 178, 54, 66, 66, 96, 104, 66, 98, 182, 243, 70, 66, 66, 96, 104, 66, 227, 37, 84, 66, 20, 46, 91, 66, 227, 37, 84, 66, 133, 235, 74, 66, 98, 227, 37, 84, 66, 252, 169, 58, 66, 182, 243, 70, 66, 207, 119, 45, 66, 45, 178, 54, 66, 207, 119, 45, 66, 99, 109, 8, 44, 108, 67, 207, 119, 45, 66, 108, 113, 29, 108, 67, 244, 125, 45, 66, 108, 152, 14, 108, 67, 207, 119, 45, 66, 98, 53, 254, 103, 67, 207, 119, 45, 66, 236, 177, 100, 67, 252, 169, 58, 66, 236, 177, 100, 67, 133, 235, 74, 66, 98, 236, 177, 100, 67, 20, 46, 91, 66, 53, 254, 103, 67, 66, 96, 104, 66, 152, 14, 108, 67, 66, 96, 104, 66, 108, 113, 29, 108, 67, 29, 90, 104, 66, 108, 8, 44, 108, 67, 66, 96, 104, 66, 98, 238, 60, 112, 67, 66, 96, 104, 66, 55, 137, 115, 67, 20, 46, 91, 66, 55, 137, 115, 67, 133, 235, 74, 66, 98, 55, 137, 115, 67, 252, 169, 58, 66, 238, 60, 112, 67, 207, 119, 45, 66, 8, 44, 108, 67, 207, 119, 45, 66, 99, 109, 180, 72, 207, 66, 207, 119, 45, 66, 98, 240, 39, 199, 66, 207, 119, 45, 66, 217, 142, 192, 66, 252, 169, 58, 66, 217, 142, 192, 66, 133, 235, 74, 66, 98, 217, 142, 192, 66, 20, 46, 91, 66, 240, 39, 199, 66, 66, 96, 104, 66, 180, 72, 207, 66, 66, 96, 104, 66, 98, 252, 105, 215, 66, 66, 96, 104, 66, 150, 3, 222, 66, 20, 46, 91, 66, 18, 3, 222, 66, 133, 235, 74, 66, 98, 31, 69, 221, 66, 33, 48, 60, 66, 113, 125, 217, 66, 211, 77, 50, 66, 0, 64, 210, 66, 104, 17, 46, 66, 108, 180, 72, 207, 66, 207, 119, 45, 66, 99, 109, 162, 37, 92, 67, 207, 119, 45, 66, 98, 63, 21, 88, 67, 207, 119, 45, 66, 246, 200, 84, 67, 252, 169, 58, 66, 180, 200, 84, 67, 133, 235, 74, 66, 98, 246, 200, 84, 67, 20, 46, 91, 66, 63, 21, 88, 67, 66, 96, 104, 66, 162, 37, 92, 67, 66, 96, 104, 66, 98, 70, 54, 96, 67, 66, 96, 104, 66, 209, 130, 99, 67, 20, 46, 91, 66, 209, 130, 99, 67, 133, 235, 74, 66, 98, 209, 130, 99, 67, 252, 169, 58, 66, 70, 54, 96, 67, 207, 119, 45, 66, 162, 37, 92, 67, 207, 119, 45, 66, 99, 109, 39, 177, 7, 67, 207, 119, 45, 66, 108, 143, 162, 7, 67, 244, 125, 45, 66, 108, 182, 147, 7, 67, 207, 119, 45, 66, 98, 150, 131, 3, 67, 207, 119, 45, 66, 201, 54, 0, 67, 252, 169, 58, 66, 201, 54, 0, 67, 133, 235, 74, 66, 98, 201, 54, 0, 67, 20, 46, 91, 66, 150, 131, 3, 67, 66, 96, 104, 66, 182, 147, 7, 67, 66, 96, 104, 66, 108, 143, 162, 7, 67, 29, 90, 104, 66, 108, 39, 177, 7, 67, 66, 96, 104, 66, 98, 203, 193, 11, 67, 66, 96, 104, 66, 86, 14, 15, 67, 20, 46, 91, 66, 86, 14, 15, 67, 133, 235, 74, 66, 98, 86, 14, 15, 67, 252, 169, 58, 66, 203, 193, 11, 67, 207, 119, 45, 66, 39, 177, 7, 67, 207, 119, 45, 66, 99, 109, 39, 49, 237, 65, 207, 119, 45, 66, 98, 90, 100, 204, 65, 184, 30, 47, 66, 154, 153, 179, 65, 63, 181, 57, 66, 174, 71, 178, 65, 133, 235, 74, 66, 98, 174, 71, 178, 65, 20, 46, 91, 66, 252, 169, 204, 65, 66, 96, 104, 66, 39, 49, 237, 65, 66, 96, 104, 66, 98, 29, 218, 6, 66, 66, 96, 104, 66, 74, 12, 20, 66, 20, 46, 91, 66, 74, 12, 20, 66, 133, 235, 74, 66, 98, 92, 143, 18, 66, 33, 48, 60, 66, 12, 2, 11, 66, 211, 77, 50, 66, 86, 14, 249, 65, 104, 17, 46, 66, 108, 39, 49, 237, 65, 207, 119, 45, 66, 99, 109, 123, 148, 61, 67, 104, 17, 46, 66, 108, 213, 24, 60, 67, 207, 119, 45, 66, 98, 115, 8, 56, 67, 207, 119, 45, 66, 231, 187, 52, 67, 252, 169, 58, 66, 231, 187, 52, 67, 133, 235, 74, 66, 98, 231, 187, 52, 67, 20, 46, 91, 66, 115, 8, 56, 67, 66, 96, 104, 66, 213, 24, 60, 67, 66, 96, 104, 66, 98, 121, 41, 64, 67, 66, 96, 104, 66, 70, 118, 67, 67, 20, 46, 91, 66, 4, 118, 67, 67, 133, 235, 74, 66, 98, 10, 23, 67, 67, 33, 48, 60, 66, 117, 51, 65, 67, 211, 77, 50, 66, 123, 148, 61, 67, 104, 17, 46, 66, 99, 109, 45, 178, 54, 66, 147, 24, 141, 65, 108, 45, 178, 54, 66, 147, 24, 141, 65, 98, 164, 112, 38, 66, 147, 24, 141, 65, 119, 62, 25, 66, 238, 124, 167, 65, 113, 61, 25, 66, 0, 0, 200, 65, 98, 119, 62, 25, 66, 31, 133, 232, 65, 164, 112, 38, 66, 188, 116, 1, 66, 45, 178, 54, 66, 188, 116, 1, 66, 98, 182, 243, 70, 66, 188, 116, 1, 66, 227, 37, 84, 66, 31, 133, 232, 65, 227, 37, 84, 66, 0, 0, 200, 65, 98, 227, 37, 84, 66, 238, 124, 167, 65, 182, 243, 70, 66, 147, 24, 141, 65, 45, 178, 54, 66, 147, 24, 141, 65, 99, 101, 0, 0 }; static const unsigned char WaveformPathData[] = { 110, 109, 135, 86, 64, 67, 242, 114, 59, 67, 108, 135, 86, 64, 67, 254, 212, 177, 67, 108, 223, 111, 52, 67, 254, 212, 177, 67, 108, 223, 111, 52, 67, 242, 114, 59, 67, 108, 135, 86, 64, 67, 242, 114, 59, 67, 99, 109, 68, 43, 141, 67, 100, 251, 74, 67, 108, 16, 56, 135, 67, 100, 251, 74, 67, 108, 16, 56, 135, 67, 197, 16, 170, 67, 108, 68, 43, 141, 67, 197, 16, 170, 67, 108, 68, 43, 141, 67, 100, 251, 74, 67, 99, 109, 135, 86, 124, 67, 119, 222, 96, 67, 108, 223, 111, 112, 67, 119, 222, 96, 67, 108, 223, 111, 112, 67, 59, 31, 159, 67, 108, 135, 86, 124, 67, 59, 31, 159, 67, 108, 135, 86, 124, 67, 119, 222, 96, 67, 99, 109, 135, 86, 34, 67, 225, 26, 101, 67, 108, 223, 111, 22, 67, 225, 26, 101, 67, 108, 223, 111, 22, 67, 6, 1, 157, 67, 108, 135, 86, 34, 67, 6, 1, 157, 67, 108, 135, 86, 34, 67, 225, 26, 101, 67, 99, 109, 68, 43, 156, 67, 250, 222, 108, 67, 108, 16, 56, 150, 67, 250, 222, 108, 67, 108, 16, 56, 150, 67, 217, 30, 153, 67, 108, 68, 43, 156, 67, 217, 30, 153, 67, 108, 68, 43, 156, 67, 250, 222, 108, 67, 99, 109, 135, 86, 94, 67, 205, 12, 118, 67, 108, 223, 111, 82, 67, 205, 12, 118, 67, 108, 223, 111, 82, 67, 16, 136, 148, 67, 108, 135, 86, 94, 67, 16, 136, 148, 67, 108, 135, 86, 94, 67, 205, 12, 118, 67, 99, 109, 135, 86, 4, 67, 41, 28, 125, 67, 108, 66, 224, 240, 66, 41, 28, 125, 67, 108, 66, 224, 240, 66, 98, 0, 145, 67, 108, 135, 86, 4, 67, 98, 0, 145, 67, 108, 135, 86, 4, 67, 41, 28, 125, 67, 99, 109, 68, 43, 171, 67, 25, 52, 132, 67, 108, 16, 56, 165, 67, 25, 52, 132, 67, 108, 16, 56, 165, 67, 94, 90, 139, 67, 108, 68, 43, 171, 67, 94, 90, 139, 67, 108, 68, 43, 171, 67, 25, 52, 132, 67, 99, 109, 14, 173, 204, 66, 25, 52, 132, 67, 108, 190, 223, 180, 66, 25, 52, 132, 67, 108, 190, 223, 180, 66, 94, 90, 139, 67, 108, 14, 173, 204, 66, 94, 90, 139, 67, 108, 14, 173, 204, 66, 25, 52, 132, 67, 99, 101, 0, 0 }; IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/customComponents/MailBox.h0000664002537200253720000000604315257173642031730 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2018 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #include "../JuceLibraryCode/JuceHeader.h" #pragma once // For now, this class defines messages, which can be displayed by the Display component. Future might bring more features like switching between several active messages... we will see ;-) namespace MailBox { struct Message { // could become a reference counted object and Display should check regularly if its the only one who holds this reference -> delete juce::String headline = "No Message available"; juce::String text = ""; juce::Colour messageColour = juce::Colours::lightgrey; }; class Display : public juce::Component { public: Display() : juce::Component() {} ~Display() override {} void paint (juce::Graphics& g) override { juce::Colour messageColour = message.messageColour; juce::Colour textColour = juce::Colours::white; juce::Rectangle background (getLocalBounds()); g.setColour (messageColour); g.drawRect (background); g.setColour (messageColour.withMultipliedAlpha (0.1f)); g.fillRect (background); auto currentFont = juce::FontOptions (getLookAndFeel().getTypefaceForFont (juce::FontOptions (17.0f, 0))) .withHeight (17.0f); g.setFont (currentFont); juce::Rectangle textArea = background.reduced (4, 2); g.setColour (textColour); g.drawText (message.headline, textArea.removeFromTop (20), juce::Justification::topLeft); currentFont = juce::FontOptions (getLookAndFeel().getTypefaceForFont (juce::FontOptions (14.0f, 2))) .withHeight (14.0f); g.setFont (currentFont); g.drawFittedText (message.text, textArea, juce::Justification::topLeft, juce::roundToInt (textArea.getHeight() / 13.0f)); } void resized() override {} void setMessage (Message messageToDisplay) { message = messageToDisplay; repaint(); } private: Message message; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Display) }; } // namespace MailBox ././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/customComponents/RoundButton.hIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/customComponents/RoundButt0000664002537200253720000001123715257173642032076 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2018 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once #include "../JuceLibraryCode/JuceHeader.h" //============================================================================== /* */ class RoundButton : public juce::ToggleButton { public: RoundButton() {} ~RoundButton() {} void paint (juce::Graphics& g) override { auto bounds = getLocalBounds(); juce::Rectangle buttonArea; if (isCircularShape) { const float boxSize = bounds.getWidth() >= bounds.getHeight() ? bounds.getHeight() * 0.8f : bounds.getWidth() * 0.8f; buttonArea = juce::Rectangle ((bounds.getWidth() - boxSize) * 0.5f, (bounds.getHeight() - boxSize) * 0.5f, boxSize, boxSize); } else { buttonArea = juce::Rectangle (bounds.getX(), bounds.getY(), bounds.getWidth(), bounds.getHeight()); buttonArea.reduce (0.5f, 0.4f); } const bool isButtonDown = isMouseButtonDown(); const bool isMouseOverButton = isMouseOver(); const bool ticked = getToggleState(); if (isButtonDown) buttonArea.reduce (0.8f, 0.8f); else if (isMouseOverButton) buttonArea.reduce (0.4f, 0.4f); g.setColour (findColour (juce::ToggleButton::tickColourId) .withMultipliedAlpha (ticked ? 1.0f : isMouseOverButton ? 0.7f : 0.5f)); isCircularShape == true ? g.drawEllipse (buttonArea, 1.0f) : g.drawRoundedRectangle (buttonArea, 10.0f, 1.0f); buttonArea.reduce (1.5f, 1.5f); g.setColour (findColour (juce::ToggleButton::tickColourId) .withMultipliedAlpha (ticked ? 1.0f : isMouseOverButton ? 0.5f : 0.2f)); isCircularShape == true ? g.fillEllipse (buttonArea) : g.fillRoundedRectangle (buttonArea, 10.0f); auto currentFont = juce::FontOptions (getLookAndFeel().getTypefaceForFont (juce::FontOptions ( static_cast (buttonArea.getHeight()) * scaleFontSize, 1))) .withHeight (buttonArea.getHeight() * scaleFontSize); g.setFont (currentFont); g.setColour (findColour (getToggleState() ? juce::TextButton::textColourOnId : juce::TextButton::textColourOffId) .withMultipliedAlpha (isEnabled() ? 1.0f : 0.5f)); g.setColour (ticked ? findColour (juce::ResizableWindow::backgroundColourId) : findColour (juce::ToggleButton::tickColourId) .withMultipliedAlpha (isMouseOverButton ? 0.7f : 0.5f)); g.drawText (getButtonText(), getLocalBounds(), juce::Justification::centred); } void resized() override {} void setScaleFontSize (const float newScale) { scaleFontSize = newScale; } void setCircularShape (bool shouldBeCircularShape) { isCircularShape = shouldBeCircularShape; } private: bool isCircularShape = true; float scaleFontSize = 1.0f; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (RoundButton) }; IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/ReferenceCountedMatrix.h0000664002537200253720000000543015257173642031421 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once class ReferenceCountedMatrix : public juce::ReferenceCountedObject { public: typedef juce::ReferenceCountedObjectPtr Ptr; ReferenceCountedMatrix (const juce::String& nameToUse, const juce::String& descriptionToUse, int rows, int columns) : name (nameToUse), description (descriptionToUse), matrix (rows, columns) { for (int i = 0; i < rows; ++i) routingArray.add (i); DBG (getConstructorMessage()); } ~ReferenceCountedMatrix() { DBG (getDeconstructorMessage()); } virtual juce::String getConstructorMessage() const { return "Matrix named '" + name + "' constructed. Size: " + juce::String (matrix.getNumRows()) + "x" + juce::String (matrix.getNumColumns()); } virtual juce::String getDeconstructorMessage() const { return "Matrix named '" + name + "' destroyed."; } juce::dsp::Matrix& getMatrix() { return matrix; } juce::String getName() const { return name; } juce::String getDescription() const { return description; } const int getNumOutputChannels() { int maxChannel = 0; for (int i = routingArray.size(); --i >= 0;) { const int newValue = routingArray.getUnchecked (i); if (newValue > maxChannel) maxChannel = newValue; } return maxChannel + 1; } const int getNumInputChannels() { return (int) matrix.getNumColumns(); } juce::Array& getRoutingArrayReference() { return routingArray; } protected: juce::String name; juce::String description; juce::dsp::Matrix matrix; juce::Array routingArray; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ReferenceCountedMatrix) }; IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/FilterVisualizerHelper.h0000664002537200253720000000522215257173642031456 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once /* Hard coded convolution of IIR coefficients. Use double! */ template class FilterVisualizerHelper { public: static juce::Array cascadeSecondOrderCoefficients (juce::Array& c0, juce::Array& c1) { juce::Array c12; c12.resize (9); const int o = 2; c12.setUnchecked (0, c0[0] * c1[0]); c12.setUnchecked (1, c0[0] * c1[1] + c0[1] * c1[0]); c12.setUnchecked (2, c0[0] * c1[2] + c0[1] * c1[1] + c0[2] * c1[0]); c12.setUnchecked (3, c0[1] * c1[2] + c0[2] * c1[1]); c12.setUnchecked (4, c0[2] * c1[2]); c12.setUnchecked (5, c1[1 + o] + c0[1 + o]); c12.setUnchecked (6, c1[2 + o] + c0[1 + o] * c1[1 + o] + c0[2 + o]); c12.setUnchecked (7, c0[1 + o] * c1[2 + o] + c0[2 + o] * c1[1 + o]); c12.setUnchecked (8, c0[2 + o] * c1[2 + o]); return c12; } static juce::Array cascadeFirstAndSecondOrderCoefficients (juce::Array& firstOrder, juce::Array& secondOrder) { juce::Array& c1 = firstOrder; juce::Array& c2 = secondOrder; juce::Array c12; c12.resize (7); //b c12.setUnchecked (0, c1[0] * c2[0]); c12.setUnchecked (1, c1[0] * c2[1] + c1[1] * c2[0]); c12.setUnchecked (2, c1[0] * c2[2] + c1[1] * c2[1]); c12.setUnchecked (3, c1[1] * c2[2]); //a c12.setUnchecked (4, c1[2] + c2[3]); c12.setUnchecked (5, c1[2] * c2[3] + c2[4]); c12.setUnchecked (6, c1[2] * c2[4]); return c12; } }; IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/Queue.h0000664002537200253720000000513715257173642026104 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once // A simple queue of arbitrary sample type (SampleType) with fixed numbers of samples (BufferSize). // A good thing to transfer data between processor and editoras it should be lock-free. // IMPORTANT INFORMATION: If this queue is full, new data WON'T be inserted! // The two methods return the number of actually written or read samples. template class Queue { public: Queue() : abstractFifo (BufferSize) {} int addToQueue (const SampleType* samples, size_t numSamples) { jassert (numSamples <= BufferSize); // don't push more samples than the buffer holds int start1, size1, start2, size2; abstractFifo.prepareToWrite (numSamples, start1, size1, start2, size2); if (size1 > 0) for (int i = 0; i < size1; ++i) buffer[start1 + i] = samples[i]; if (size2 > 0) for (int i = 0; i < size2; ++i) buffer[i] = samples[size1 + i]; abstractFifo.finishedWrite (size1 + size2); return size1 + size2; } int readFromQueue (SampleType* outputBuffer, int numItems) { int start1, size1, start2, size2; abstractFifo.prepareToRead (numItems, start1, size1, start2, size2); if (size1 > 0) for (int i = 0; i < size1; ++i) outputBuffer[i] = buffer[start1 + i]; if (size2 > 0) for (int i = 0; i < size2; ++i) outputBuffer[start1 + i] = buffer[i]; abstractFifo.finishedRead (size1 + size2); return size1 + size2; } private: AbstractFifo abstractFifo; std::array buffer; }; IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/Quaternion.h0000664002537200253720000001165015257173642027142 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once #include #include #include #include #include "../JuceLibraryCode/JuceHeader.h" namespace iem { template class Quaternion { public: Quaternion() : w (Type (1.0)), x (Type (0.0)), y (Type (0.0)), z (Type (0.0)) {} Quaternion (Type qw, Type qx, Type qy, Type qz) : w (qw), x (qx), y (qy), z (qz) {} Type w, x, y, z; Type magnitude() const { return sqrt (w * w + x * x + y * y + z * z); } void normalize() { Type mag = magnitude(); if (mag != Type (0.0)) *this = this->scale (Type (1.0) / mag); } void conjugate() { x = -x; y = -y; z = -z; } Quaternion getConjugate() const { return Quaternion (w, -x, -y, -z); } Quaternion operator* (const Quaternion& q) const { return Quaternion (w * q.w - x * q.x - y * q.y - z * q.z, w * q.x + x * q.w + y * q.z - z * q.y, w * q.y - x * q.z + y * q.w + z * q.x, w * q.z + x * q.y - y * q.x + z * q.w); } Quaternion operator+ (const Quaternion& q) const { return Quaternion (w + q.w, x + q.x, y + q.y, z + q.z); } Quaternion operator- (const Quaternion& q) const { return Quaternion (w - q.w, x - q.x, y - q.y, z - q.z); } Quaternion operator/ (Type scalar) const { return scale (Type (1.0) / scalar); } Quaternion operator* (Type scalar) const { return scale (scalar); } Quaternion scale (Type scalar) const { return Quaternion (w * scalar, x * scalar, y * scalar, z * scalar); } juce::Vector3D rotateVector (juce::Vector3D vec) { // has to be tested! iem::Quaternion t (0, vec.x, vec.y, vec.z); t = *this * t; t = t * this->getConjugate(); return { t.x, t.y, t.z }; } /** Rotates the cartesian vector (1, 0, 0) by this quaternion and returns it. */ juce::Vector3D getCartesian() const { juce::Vector3D ret; ret.x = Type (1.0) - Type (2.0) * y * y - Type (2.0) * z * z; ret.y = Type (2.0) * x * y + Type (2.0) * w * z; ret.z = Type (2.0) * x * z - Type (2.0) * w * y; return ret; } void toYPR (Type* ypr) { //CONVERSION FROM QUATERNION DATA TO TAIT-BRYAN ANGLES yaw, pitch and roll //IMPORTANT: rotation order: yaw, pitch, roll (intrinsic rotation: z-y'-x'') !! //MNEMONIC: swivel on your swivel chair, look up/down, then tilt your head left/right... // ... that's how we yaw, pitch'n'roll. Type ysqr = y * y; // yaw (z-axis rotation) Type t0 = Type (2.0) * (w * z + x * y); Type t1 = Type (1.0) - Type (2.0) * (ysqr + z * z); ypr[0] = atan2 (t0, t1); // pitch (y-axis rotation) t0 = Type (2.0) * (w * y - z * x); t0 = t0 > Type (1.0) ? Type (1.0) : t0; t0 = t0 < Type (-1.0) ? Type (-1.0) : t0; ypr[1] = asin (t0); // roll (x-axis rotation) t0 = Type (2.0) * (w * x + y * z); t1 = Type (1.0) - Type (2.0) * (x * x + ysqr); ypr[2] = atan2 (t0, t1); } void fromYPR (Type* ypr) { //CONVERSION FROM TAIT-BRYAN ANGLES DATA TO QUATERNION //IMPORTANT: rotation order: yaw, pitch, roll (intrinsic rotation: z-y'-x'') !! //MNEMONIC: swivel on your swivel chair, look up/down, then tilt your head left/right... // ... that's how we yaw, pitch'n'roll. Type t0 = cos (ypr[0] * Type (0.5)); Type t1 = sin (ypr[0] * Type (0.5)); Type t2 = cos (ypr[2] * Type (0.5)); Type t3 = sin (ypr[2] * Type (0.5)); Type t4 = cos (ypr[1] * Type (0.5)); Type t5 = sin (ypr[1] * Type (0.5)); w = t0 * t2 * t4 + t1 * t3 * t5; x = t0 * t3 * t4 - t1 * t2 * t5; y = t0 * t2 * t5 + t1 * t3 * t4; z = t1 * t2 * t4 - t0 * t3 * t5; } }; } // namespace iem IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/MatrixMultiplication.h0000664002537200253720000001625215257173642031202 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once #include "../JuceLibraryCode/JuceHeader.h" #include "ReferenceCountedDecoder.h" #include "ReferenceCountedMatrix.h" class MatrixMultiplication { public: MatrixMultiplication() {} void prepare (const juce::dsp::ProcessSpec& newSpec, bool prepareInputBuffering = true) { spec = newSpec; if (prepareInputBuffering) { buffer.setSize (buffer.getNumChannels(), spec.maximumBlockSize); bufferPrepared = true; } else { buffer.setSize (0, 0); bufferPrepared = false; } checkIfNewMatrixAvailable(); } void processReplacing (juce::dsp::AudioBlock data) { checkIfNewMatrixAvailable(); // you have to call the prepare method with prepareInputBuffering set to true in order tu use the processReplacing method jassert (bufferPrepared); ReferenceCountedMatrix::Ptr retainedCurrentMatrix (currentMatrix); if (retainedCurrentMatrix == nullptr || ! bufferPrepared) { data.clear(); return; } auto& T = retainedCurrentMatrix->getMatrix(); const int nInputChannels = juce::jmin (static_cast (data.getNumChannels()), static_cast (T.getNumColumns())); const int nSamples = static_cast (data.getNumSamples()); // copy input data to buffer for (int ch = 0; ch < nInputChannels; ++ch) buffer.copyFrom (ch, 0, data.getChannelPointer (ch), nSamples); juce::dsp::AudioBlock ab (buffer.getArrayOfWritePointers(), nInputChannels, 0, nSamples); processNonReplacing (ab, data, false); } void processNonReplacing (const juce::dsp::AudioBlock inputBlock, juce::dsp::AudioBlock outputBlock, const bool checkNewMatrix = true) { // you should call the processReplacing instead, it will buffer the input data // this is a weak check, as e.g. if number channels differ, it won't trigger jassert (inputBlock != outputBlock); juce::ScopedNoDenormals noDenormals; if (checkNewMatrix) checkIfNewMatrixAvailable(); ReferenceCountedMatrix::Ptr retainedCurrentMatrix (currentMatrix); if (retainedCurrentMatrix == nullptr) { outputBlock.clear(); return; } auto& T = retainedCurrentMatrix->getMatrix(); const int nInputChannels = juce::jmin (static_cast (inputBlock.getNumChannels()), static_cast (T.getNumColumns())); const int nSamples = static_cast (inputBlock.getNumSamples()); for (int row = 0; row < T.getNumRows(); ++row) { const int destCh = retainedCurrentMatrix->getRoutingArrayReference().getUnchecked (row); if (destCh < outputBlock.getNumChannels()) { float* dest = outputBlock.getChannelPointer (destCh); juce::FloatVectorOperations::multiply (dest, inputBlock.getChannelPointer (0), T (row, 0), nSamples); // first channel for (int i = 1; i < nInputChannels; ++i) // remaining channels juce::FloatVectorOperations::addWithMultiply (dest, inputBlock.getChannelPointer (i), T (row, i), nSamples); } } juce::Array routingCopy (retainedCurrentMatrix->getRoutingArrayReference()); routingCopy.sort(); int lastDest = -1; const int nElements = routingCopy.size(); for (int i = 0; i < nElements; ++i) { const int destCh = routingCopy[i]; for (; ++lastDest < destCh;) if (lastDest < outputBlock.getNumChannels()) juce::FloatVectorOperations::clear (outputBlock.getChannelPointer (lastDest), (int) outputBlock.getNumSamples()); lastDest = destCh; } for (int ch = routingCopy.getLast() + 1; ch < outputBlock.getNumChannels(); ++ch) juce::FloatVectorOperations::clear (outputBlock.getChannelPointer (ch), (int) outputBlock.getNumSamples()); } const bool checkIfNewMatrixAvailable() { if (newMatrixAvailable) { newMatrixAvailable = false; currentMatrix = newMatrix; newMatrix = nullptr; if (currentMatrix != nullptr) { DBG ("MatrixTransformer: New matrix with name '" << currentMatrix->getName() << "' set."); const int cols = (int) currentMatrix->getMatrix().getNumColumns(); buffer.setSize (cols, buffer.getNumSamples()); DBG ("MatrixTransformer: buffer resized to " << buffer.getNumChannels() << "x" << buffer.getNumSamples()); } return true; } return false; }; void setMatrix (ReferenceCountedMatrix::Ptr newMatrixToUse, bool force = false) { newMatrix = newMatrixToUse; newMatrixAvailable = true; if (force) checkIfNewMatrixAvailable(); } ReferenceCountedMatrix::Ptr getMatrix() { return currentMatrix; } private: //============================================================================== juce::dsp::ProcessSpec spec = { -1, 0, 0 }; ReferenceCountedMatrix::Ptr currentMatrix { nullptr }; ReferenceCountedMatrix::Ptr newMatrix { nullptr }; juce::AudioBuffer buffer; bool bufferPrepared { false }; bool newMatrixAvailable { false }; }; IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/Compressor.h0000664002537200253720000001322515257173642027151 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once #include namespace iem { class Compressor { public: Compressor() {} ~Compressor() {} void prepare (const juce::dsp::ProcessSpec spec) { sampleRate = spec.sampleRate; alphaAttack = 1.0 - timeToGain (attackTime); alphaRelease = 1.0 - timeToGain (releaseTime); prepared = true; } void setAttackTime (float attackTimeInSeconds) { attackTime = attackTimeInSeconds; alphaAttack = 1.0 - timeToGain (attackTime); } void setReleaseTime (float releaseTimeInSeconds) { releaseTime = releaseTimeInSeconds; alphaRelease = 1.0 - timeToGain (releaseTime); } double timeToGain (float timeInSeconds) { return exp (-1.0 / (sampleRate * timeInSeconds)); } void setKnee (float kneeInDecibels) { knee = kneeInDecibels; kneeHalf = knee / 2.0f; } const float getKnee() { return knee; } void setThreshold (float thresholdInDecibels) { threshold = thresholdInDecibels; } const float getTreshold() { return threshold; } void setMakeUpGain (float makeUpGainInDecibels) { makeUpGain = makeUpGainInDecibels; } const float getMakeUpGain() { return makeUpGain; } void setRatio (float ratio) { slope = 1.0f / ratio - 1.0f; } const float getMaxLevelInDecibels() { return maxLevel; } void applyCharacteristicToOverShoot (float& overShoot) { if (overShoot <= -kneeHalf) overShoot = 0.0f; //y_G = levelInDecibels; else if (overShoot > -kneeHalf && overShoot <= kneeHalf) overShoot = 0.5f * slope * juce::square (overShoot + kneeHalf) / knee; //y_G = levelInDecibels + 0.5f * slope * square(overShoot + kneeHalf) / knee; else overShoot = slope * overShoot; } void getGainFromSidechainSignal (const float* sideChainSignal, float* destination, const int numSamples) { maxLevel = -INFINITY; for (int i = 0; i < numSamples; ++i) { // convert sample to decibels float levelInDecibels = juce::Decibels::gainToDecibels (abs (sideChainSignal[i])); if (levelInDecibels > maxLevel) maxLevel = levelInDecibels; // calculate overshoot and apply knee and ratio float overShoot = levelInDecibels - threshold; applyCharacteristicToOverShoot (overShoot); //y_G = levelInDecibels + slope * overShoot; // ballistics const float diff = overShoot - state; if (diff < 0.0f) state += alphaAttack * diff; else state += alphaRelease * diff; destination[i] = juce::Decibels::decibelsToGain (state + makeUpGain); } } void getGainFromSidechainSignalInDecibelsWithoutMakeUpGain (const float* sideChainSignal, float* destination, const int numSamples) { maxLevel = -INFINITY; for (int i = 0; i < numSamples; ++i) { // convert sample to decibels float levelInDecibels = juce::Decibels::gainToDecibels (abs (sideChainSignal[i])); if (levelInDecibels > maxLevel) maxLevel = levelInDecibels; // calculate overshoot and apply knee and ratio float overShoot = levelInDecibels - threshold; applyCharacteristicToOverShoot (overShoot); //y_G = levelInDecibels + slope * overShoot; // ballistics const float diff = overShoot - state; if (diff < 0.0f) state += alphaAttack * diff; else state += alphaRelease * diff; destination[i] = state; } } void getCharacteristic (float* inputLevels, float* dest, const int numSamples) { for (int i = 0; i < numSamples; ++i) { dest[i] = getCharacteristicSample (inputLevels[i]); } } inline float getCharacteristicSample (float inputLevel) { float overShoot = inputLevel - threshold; applyCharacteristicToOverShoot (overShoot); return overShoot + inputLevel + makeUpGain; } private: double sampleRate { 0.0 }; bool prepared; float knee { 0.0f }, kneeHalf { 0.0f }; float threshold { -10.0f }; float attackTime { 0.01f }; float releaseTime { 0.15f }; float slope { 0.0f }; float makeUpGain { 0.0f }; float maxLevel { -INFINITY }; //state juce::variable float state { 0.0f }; double alphaAttack; double alphaRelease; }; } // namespace iem IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/Conversions.h0000664002537200253720000001207615257173642027330 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2018 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #include #pragma once template class Conversions { public: static Type radiansToDegrees (Type radians) { return radians * (Type (180) / Type (3.14159265358979323846264338327950288)); } static Type degreesToRadians (Type degrees) { return degrees * (Type (3.14159265358979323846264338327950288) / Type (180)); } static void cartesianToSpherical (const Type x, const Type y, const Type z, Type& azimuthInRadians, Type& elevationInRadians, Type& radius) { const float xSquared = x * x; const float ySquared = y * y; radius = sqrt (xSquared + ySquared + z * z); azimuthInRadians = atan2 (y, x); elevationInRadians = atan2 (z, sqrt (xSquared + ySquared)); } static void cartesianToSpherical (const Type x, const Type y, const Type z, Type& azimuthInRadians, Type& elevationInRadians) { const float xSquared = x * x; const float ySquared = y * y; azimuthInRadians = atan2 (y, x); elevationInRadians = atan2 (z, sqrt (xSquared + ySquared)); } static void cartesianToSpherical (const juce::Vector3D cartesian, Type& azimuthInRadians, Type& elevationInRadians) { cartesianToSpherical (cartesian.x, cartesian.y, cartesian.z, azimuthInRadians, elevationInRadians); } static juce::Vector3D cartesianToSpherical (juce::Vector3D cartvect) { const Type r = cartvect.length(); return juce::Vector3D ( r, // radius juce::radiansToDegrees (atan2 (cartvect.y, cartvect.x)), // azimuth juce::radiansToDegrees ( atan2 (cartvect.z, sqrt (cartvect.x * cartvect.x + cartvect.y * cartvect.y))) // elevation ); } static juce::Vector3D sphericalToCartesian (const Type azimuthInRadians, const Type elevationInRadians) { juce::Vector3D cartesian; sphericalToCartesian (azimuthInRadians, elevationInRadians, cartesian.x, cartesian.y, cartesian.z); return cartesian; } static juce::Vector3D sphericalToCartesian (const Type azimuthInRadians, const Type elevationInRadians, const Type radius) { return sphericalToCartesian (azimuthInRadians, elevationInRadians) * radius; } static void sphericalToCartesian (const Type azimuthInRadians, const Type elevationInRadians, const Type radius, Type& x, Type& y, Type& z) { Type _x; Type _y; Type _z; sphericalToCartesian (azimuthInRadians, elevationInRadians, _x, _y, _z); x = radius * _x; y = radius * _y; z = radius * _z; } static void sphericalToCartesian (const Type azimuthInRadians, const Type elevationInRadians, Type& x, Type& y, Type& z) { const Type cosElevation = cos (elevationInRadians); x = cosElevation * cos (azimuthInRadians); y = cosElevation * sin (azimuthInRadians); z = sin (elevationInRadians); } }; IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/MultiChannelFilter.h0000664002537200253720000004767515257173642030566 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Authors: Felix Holzmüller Copyright (c) 2024 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ // Based on the MultiEQ by Daniel Rudrich #pragma once #include enum FilterType { FirstOrderHighPass, SecondOrderHighPass, LinkwitzRileyHighPass, LowShelf, PeakFilter, HighShelf, FirstOrderLowPass, SecondOrderLowPass, LinkwitzRileyLowPass, AllPass }; struct FilterParameters { FilterType type = AllPass; float frequency = 1000.0f; float linearGain = 1.0f; float q = 0.707f; bool enabled = false; }; template class MultiChannelFilter { #if JUCE_USE_SIMD using IIRfloat = juce::dsp::SIMDRegister; static constexpr int IIRfloat_elements = juce::dsp::SIMDRegister::size(); static constexpr int nMaxSIMDFilters = ((maxChannels % IIRfloat_elements) == 0) ? (static_cast (maxChannels / IIRfloat_elements)) : (static_cast (maxChannels / IIRfloat_elements) + 1); #else /* !JUCE_USE_SIMD */ using IIRfloat = float; static constexpr int IIRfloat_elements = 1; static constexpr int nMaxSIMDFilters = maxChannels; #endif /* JUCE_USE_SIMD */ public: MultiChannelFilter() { // Create dummy filter coeffs for (int i = 0; i < 2; ++i) { additionalTempCoefficients[i] = juce::dsp::IIR::Coefficients::makeAllPass (48000.0f, 20.0f); additionalProcessorCoefficients[i] = juce::dsp::IIR::Coefficients::makeAllPass (48000.0f, 20.0f); } for (int i = 0; i < numFilterBands; ++i) { processorCoefficients[i] = juce::dsp::IIR::Coefficients::makeAllPass (48000.0, 20.0f); tempCoefficients[i] = juce::dsp::IIR::Coefficients::makeAllPass (48000.0, 20.0f); } for (int i = 0; i < numFilterBands; ++i) { filterArrays[i].clear(); for (int ch = 0; ch < nMaxSIMDFilters; ++ch) filterArrays[i].add ( new juce::dsp::IIR::Filter (processorCoefficients[i])); } for (int i = 0; i < 2; ++i) { additionalFilterArrays[i].clear(); for (int ch = 0; ch < nMaxSIMDFilters; ++ch) additionalFilterArrays[i].add ( new juce::dsp::IIR::Filter (additionalProcessorCoefficients[i])); } } ~MultiChannelFilter() {} void prepare (const juce::dsp::ProcessSpec spec, FilterParameters params[]) { for (int f = 0; f < numFilterBands; ++f) updateFilterParams (params[f], f); prepare (spec); } void prepare (const juce::dsp::ProcessSpec spec) { sampleRate = spec.sampleRate; maxBlockSize = spec.maximumBlockSize; for (int f = 0; f < numFilterBands; ++f) { createFilterCoefficients (f); } copyFilterCoefficientsToProcessor(); interleavedData.clear(); for (int i = 0; i < nMaxSIMDFilters; ++i) { // reset filters for (int f = 0; f < numFilterBands; ++f) { filterArrays[f][i]->reset (IIRfloat (0.0f)); } interleavedData.add ( new juce::dsp::AudioBlock (interleavedBlockData[i], 1, maxBlockSize)); clear (*interleavedData.getLast()); } zero = juce::dsp::AudioBlock (zeroData, IIRfloat_elements, maxBlockSize); zero.clear(); } template void process (const ProcessContext& context) noexcept { check(); const auto& inputBlock = context.getInputBlock(); auto&& outputBlock = context.getOutputBlock(); const int L = inputBlock.getNumSamples(); int nInChannels = inputBlock.getNumChannels(); int nOutChannels = outputBlock.getNumChannels(); const int maxNChIn = juce::jmin (nInChannels, nOutChannels, maxChannels); if (maxNChIn < 1) return; const int nSIMDFilters = 1 + (maxNChIn - 1) / IIRfloat_elements; // update iir filter coefficients if (userHasChangedFilterSettings.get()) copyFilterCoefficientsToProcessor(); using Format = juce::AudioData::Format; //interleave input data for (int i = 0; i < nSIMDFilters; ++i) { int nSubChannels = juce::jmin (IIRfloat_elements, maxNChIn - i * IIRfloat_elements); const auto& subInputBlock = inputBlock.getSubsetChannelBlock (i * IIRfloat_elements, nSubChannels); auto inChannels = prepareChannelPointers (subInputBlock); juce::AudioData::interleaveSamples ( juce::AudioData::NonInterleavedSource { inChannels.data(), IIRfloat_elements }, juce::AudioData::InterleavedDest { reinterpret_cast (interleavedData[i]->getChannelPointer (0)), IIRfloat_elements }, L); } // apply filters for (int f = 0; f < numFilterBands; ++f) { if (filterParameters[f].enabled) { for (int i = 0; i < nSIMDFilters; ++i) { const IIRfloat* chPtr[1] = { interleavedData[i]->getChannelPointer (0) }; juce::dsp::AudioBlock ab (const_cast (chPtr), 1, L); juce::dsp::ProcessContextReplacing context (ab); filterArrays[f][i]->process (context); } } } // check and apply additional filters (Linkwitz Riley -> two BiQuads) if (filterParameters[0].type == FilterType::LinkwitzRileyHighPass && filterParameters[0].enabled) { for (int i = 0; i < nSIMDFilters; ++i) { const IIRfloat* chPtr[1] = { chPtr[0] = interleavedData[i]->getChannelPointer (0) }; juce::dsp::AudioBlock ab (const_cast (chPtr), 1, L); juce::dsp::ProcessContextReplacing context (ab); additionalFilterArrays[0][i]->process (context); } } if (filterParameters[numFilterBands - 1].type == FilterType::LinkwitzRileyLowPass && filterParameters[numFilterBands - 1].enabled) { for (int i = 0; i < nSIMDFilters; ++i) { const IIRfloat* chPtr[1] = { interleavedData[i]->getChannelPointer (0) }; juce::dsp::AudioBlock ab (const_cast (chPtr), 1, L); juce::dsp::ProcessContextReplacing context (ab); additionalFilterArrays[1][i]->process (context); } } // deinterleave for (int i = 0; i < nSIMDFilters; ++i) { int nSubChannels = juce::jmin (IIRfloat_elements, maxNChIn - i * IIRfloat_elements); auto subOutBlock = outputBlock.getSubsetChannelBlock (i * IIRfloat_elements, nSubChannels); auto outChannels = prepareChannelPointers (subOutBlock); juce::AudioData::deinterleaveSamples ( juce::AudioData::InterleavedSource { reinterpret_cast (interleavedData[i]->getChannelPointer (0)), IIRfloat_elements }, juce::AudioData::NonInterleavedDest { outChannels.data(), IIRfloat_elements }, L); zero.clear(); } } void updateFilterParams (FilterParameters newParams, int filterIndex, bool recalculateCoeffs = true) { filterParameters[filterIndex] = newParams; if (recalculateCoeffs) { createFilterCoefficients (filterIndex); userHasChangedFilterSettings = true; } } juce::dsp::IIR::Coefficients::Ptr getCoefficientsForGui (const int filterIndex) const { return guiCoefficients[filterIndex]; }; void updateGuiCoefficients() { for (int f = 0; f < numFilterBands; ++f) { const auto frequency = juce::jmin (static_cast (0.5 * sampleRate), filterParameters[f].frequency); switch (filterParameters[f].type) { case FilterType::FirstOrderHighPass: guiCoefficients[f] = juce::dsp::IIR::Coefficients::makeFirstOrderHighPass (sampleRate, frequency); break; case FilterType::SecondOrderHighPass: guiCoefficients[f] = juce::dsp::IIR::Coefficients::makeHighPass (sampleRate, frequency, filterParameters[f].q); break; case FilterType::LinkwitzRileyHighPass: { auto coeffs = juce::dsp::IIR::Coefficients::makeHighPass (sampleRate, frequency); coeffs->coefficients = FilterVisualizerHelper::cascadeSecondOrderCoefficients ( coeffs->coefficients, coeffs->coefficients); guiCoefficients[f] = coeffs; break; } case FilterType::LowShelf: guiCoefficients[f] = juce::dsp::IIR::Coefficients::makeLowShelf ( sampleRate, frequency, filterParameters[f].q, filterParameters[f].linearGain); break; case FilterType::PeakFilter: guiCoefficients[f] = juce::dsp::IIR::Coefficients::makePeakFilter ( sampleRate, frequency, filterParameters[f].q, filterParameters[f].linearGain); break; case FilterType::HighShelf: guiCoefficients[f] = juce::dsp::IIR::Coefficients::makeHighShelf ( sampleRate, frequency, filterParameters[f].q, filterParameters[f].linearGain); break; case FilterType::FirstOrderLowPass: guiCoefficients[f] = juce::dsp::IIR::Coefficients::makeFirstOrderLowPass (sampleRate, frequency); break; case FilterType::SecondOrderLowPass: guiCoefficients[f] = juce::dsp::IIR::Coefficients::makeLowPass (sampleRate, frequency, filterParameters[f].q); break; case FilterType::LinkwitzRileyLowPass: { auto coeffs = juce::dsp::IIR::Coefficients::makeLowPass (sampleRate, frequency); coeffs->coefficients = FilterVisualizerHelper::cascadeSecondOrderCoefficients ( coeffs->coefficients, coeffs->coefficients); guiCoefficients[f] = coeffs; break; } case FilterType::AllPass: guiCoefficients[f] = juce::dsp::IIR::Coefficients::makeAllPass (sampleRate, frequency); break; default: break; } } } private: void check() { for (int band = 0; band < numFilterBands; ++band) jassert (processorCoefficients[band] != nullptr); jassert (additionalProcessorCoefficients[0] != nullptr); jassert (additionalProcessorCoefficients[1] != nullptr); } static juce::Array cascadeSecondOrderCoefficients (juce::Array& c0, juce::Array& c1) { juce::Array c12; c12.resize (9); const int o = 2; c12.setUnchecked (0, c0[0] * c1[0]); c12.setUnchecked (1, c0[0] * c1[1] + c0[1] * c1[0]); c12.setUnchecked (2, c0[0] * c1[2] + c0[1] * c1[1] + c0[2] * c1[0]); c12.setUnchecked (3, c0[1] * c1[2] + c0[2] * c1[1]); c12.setUnchecked (4, c0[2] * c1[2]); c12.setUnchecked (5, c1[1 + o] + c0[1 + o]); c12.setUnchecked (6, c1[2 + o] + c0[1 + o] * c1[1 + o] + c0[2 + o]); c12.setUnchecked (7, c0[1 + o] * c1[2 + o] + c0[2 + o] * c1[1 + o]); c12.setUnchecked (8, c0[2 + o] * c1[2 + o]); return c12; } inline juce::dsp::IIR::Coefficients::Ptr createFilterCoefficients (const FilterType type, const float frequency, const float Q, const float gain) { const auto f = juce::jmin (static_cast (0.5 * sampleRate), frequency); switch (type) { case FilterType::FirstOrderHighPass: return juce::dsp::IIR::Coefficients::makeFirstOrderHighPass (sampleRate, f); break; case FilterType::SecondOrderHighPass: return juce::dsp::IIR::Coefficients::makeHighPass (sampleRate, f, Q); break; case FilterType::LowShelf: return juce::dsp::IIR::Coefficients::makeLowShelf (sampleRate, f, Q, gain); break; case FilterType::PeakFilter: return juce::dsp::IIR::Coefficients::makePeakFilter (sampleRate, f, Q, gain); break; case FilterType::HighShelf: return juce::dsp::IIR::Coefficients::makeHighShelf (sampleRate, f, Q, gain); break; case FilterType::FirstOrderLowPass: return juce::dsp::IIR::Coefficients::makeFirstOrderLowPass (sampleRate, f); break; case FilterType::SecondOrderLowPass: return juce::dsp::IIR::Coefficients::makeLowPass (sampleRate, f, Q); break; default: return juce::dsp::IIR::Coefficients::makeAllPass (sampleRate, f, Q); break; } } void createLinkwitzRileyFilter (const bool isUpperBand) { if (isUpperBand) { const auto frequency = juce::jmin (static_cast (0.5 * sampleRate), filterParameters[numFilterBands - 1].frequency); tempCoefficients[numFilterBands - 1] = juce::dsp::IIR::Coefficients::makeLowPass (sampleRate, frequency, 0.7071f); additionalTempCoefficients[1] = processorCoefficients[numFilterBands - 1]; } else { const auto frequency = juce::jmin (static_cast (0.5 * sampleRate), filterParameters[0].frequency); tempCoefficients[0] = juce::dsp::IIR::Coefficients::makeHighPass (sampleRate, frequency, 0.7071f); additionalTempCoefficients[0] = processorCoefficients[0]; } } void createFilterCoefficients (const int filterIndex) { if (filterIndex == 0 && filterParameters[0].type == FilterType::LinkwitzRileyHighPass) { createLinkwitzRileyFilter (false); } else if (filterIndex == numFilterBands - 1 && filterParameters[numFilterBands - 1].type == FilterType::LinkwitzRileyLowPass) { createLinkwitzRileyFilter (true); } else { tempCoefficients[filterIndex] = createFilterCoefficients (filterParameters[filterIndex].type, filterParameters[filterIndex].frequency, filterParameters[filterIndex].q, filterParameters[filterIndex].linearGain); } } void copyFilterCoefficientsToProcessor() { for (int b = 0; b < numFilterBands; ++b) *processorCoefficients[b] = *tempCoefficients[b]; *additionalProcessorCoefficients[0] = *additionalTempCoefficients[0]; *additionalProcessorCoefficients[1] = *additionalTempCoefficients[1]; userHasChangedFilterSettings = false; } inline void clear (juce::dsp::AudioBlock& ab) { const int N = static_cast (ab.getNumSamples()) * IIRfloat_elements; const int nCh = static_cast (ab.getNumChannels()); for (int ch = 0; ch < nCh; ++ch) juce::FloatVectorOperations::clear ( reinterpret_cast (ab.getChannelPointer (ch)), N); } template auto prepareChannelPointers (const juce::dsp::AudioBlock& block) { std::array result {}; for (size_t ch = 0; ch < result.size(); ++ch) result[ch] = (ch < block.getNumChannels() ? block.getChannelPointer (ch) : zero.getChannelPointer (ch)); return result; } double sampleRate { 48000.0f }; uint32_t maxBlockSize { 64 }; // filter dummy for GUI juce::dsp::IIR::Coefficients::Ptr guiCoefficients[numFilterBands]; juce::dsp::IIR::Coefficients::Ptr processorCoefficients[numFilterBands]; juce::dsp::IIR::Coefficients::Ptr additionalProcessorCoefficients[2]; juce::dsp::IIR::Coefficients::Ptr tempCoefficients[numFilterBands]; juce::dsp::IIR::Coefficients::Ptr additionalTempCoefficients[2]; // data for interleaving audio juce::HeapBlock interleavedBlockData[nMaxSIMDFilters], zeroData; juce::OwnedArray> interleavedData; juce::dsp::AudioBlock zero; FilterParameters filterParameters[numFilterBands]; // filters for processing juce::OwnedArray> filterArrays[numFilterBands]; juce::OwnedArray> additionalFilterArrays[2]; juce::Atomic userHasChangedFilterSettings { true }; };IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/ambisonicTools.h0000664002537200253720000001732715257173642030011 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once const int squares[] = { 0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196, 225, 256, 289, 324, 361, 400, 441, 484, 529, 576, 625, 676, 729, 784, 841, 900, 961, 1024, 1089, 1156, 1225, 1296, 1369, 1444, 1521, 1600, 1681, 1764, 1849, 1936, 2025, 2116, 2209, 2304, 2401, 2500, 2601, 2704, 2809, 2916, 3025, 3136, 3249, 3364, 3481, 3600, 3721, 3844, 3969, 4096, 4225, 4356, 4489, 4624, 4761, 4900, 5041, 5184, 5329, 5476, 5625, 5776, 5929, 6084, 6241, 6400, 6561, 6724, 6889, 7056, 7225, 7396, 7569, 7744, 7921, 8100, 8281, 8464, 8649, 8836, 9025, 9216, 9409, 9604, 9801, 10000, 10201, 10404, 10609, 10816, 11025, 11236, 11449, 11664, 11881, 12100, 12321, 12544, 12769, 12996, 13225, 13456, 13689, 13924, 14161, 14400, 14641, 14884, 15129, 15376, 15625, 15876, 16129, 16384, 16641, 16900, 17161, 17424, 17689, 17956, 18225, 18496, 18769, 19044, 19321, 19600, 19881, 20164, 20449, 20736, 21025, 21316, 21609, 21904, 22201, 22500, 22801, 23104, 23409, 23716, 24025, 24336, 24649, 24964, 25281, 25600, 25921, 26244, 26569, 26896, 27225, 27556, 27889, 28224, 28561, 28900, 29241, 29584, 29929, 30276, 30625, 30976, 31329, 31684, 32041, 32400, 32761, 33124, 33489, 33856, 34225, 34596, 34969, 35344, 35721, 36100, 36481, 36864, 37249, 37636, 38025, 38416, 38809, 39204, 39601, 40000, 40401, 40804, 41209, 41616, 42025, 42436, 42849, 43264, 43681, 44100, 44521, 44944, 45369, 45796, 46225, 46656, 47089, 47524, 47961, 48400, 48841, 49284, 49729, 50176, 50625, 51076, 51529, 51984, 52441, 52900, 53361, 53824, 54289, 54756, 55225, 55696, 56169, 56644, 57121, 57600, 58081, 58564, 59049, 59536, 60025, 60516, 61009, 61504, 62001, 62500, 63001, 63504, 64009, 64516, 65025 }; inline int isqrt (int x) { const int* p = squares; if (p[128] <= x) p += 128; if (p[64] <= x) p += 64; if (p[32] <= x) p += 32; if (p[16] <= x) p += 16; if (p[8] <= x) p += 8; if (p[4] <= x) p += 4; if (p[2] <= x) p += 2; if (p[1] <= x) p += 1; return (int) (p - squares); } // convert ACN to l (degree) and m (order) inline void ACNtoLM (int acn, int& l, int& m) { l = isqrt (acn); m = acn - l * (l + 1); } inline const juce::String getOrderString (int order) { switch (order) { case 1: return juce::String (order) + juce::String ("st"); case 2: return juce::String (order) + juce::String ("nd"); case 3: return juce::String (order) + juce::String ("rd"); } return juce::String (order) + juce::String ("th"); } const float sn3d2n3d[64] = { 1.0000000000000000e+00f, 1.7320508075688772e+00f, 1.7320508075688772e+00f, 1.7320508075688772e+00f, 2.2360679774997898e+00f, 2.2360679774997898e+00f, 2.2360679774997898e+00f, 2.2360679774997898e+00f, 2.2360679774997898e+00f, 2.6457513110645907e+00f, 2.6457513110645907e+00f, 2.6457513110645907e+00f, 2.6457513110645907e+00f, 2.6457513110645907e+00f, 2.6457513110645907e+00f, 2.6457513110645907e+00f, 3.0000000000000000e+00f, 3.0000000000000000e+00f, 3.0000000000000000e+00f, 3.0000000000000000e+00f, 3.0000000000000000e+00f, 3.0000000000000000e+00f, 3.0000000000000000e+00f, 3.0000000000000000e+00f, 3.0000000000000000e+00f, 3.3166247903553998e+00f, 3.3166247903553998e+00f, 3.3166247903553998e+00f, 3.3166247903553998e+00f, 3.3166247903553998e+00f, 3.3166247903553998e+00f, 3.3166247903553998e+00f, 3.3166247903553998e+00f, 3.3166247903553998e+00f, 3.3166247903553998e+00f, 3.3166247903553998e+00f, 3.6055512754639891e+00f, 3.6055512754639891e+00f, 3.6055512754639891e+00f, 3.6055512754639891e+00f, 3.6055512754639891e+00f, 3.6055512754639891e+00f, 3.6055512754639891e+00f, 3.6055512754639891e+00f, 3.6055512754639891e+00f, 3.6055512754639891e+00f, 3.6055512754639891e+00f, 3.6055512754639891e+00f, 3.6055512754639891e+00f, 3.8729833462074170e+00f, 3.8729833462074170e+00f, 3.8729833462074170e+00f, 3.8729833462074170e+00f, 3.8729833462074170e+00f, 3.8729833462074170e+00f, 3.8729833462074170e+00f, 3.8729833462074170e+00f, 3.8729833462074170e+00f, 3.8729833462074170e+00f, 3.8729833462074170e+00f, 3.8729833462074170e+00f, 3.8729833462074170e+00f, 3.8729833462074170e+00f, 3.8729833462074170e+00f }; const float n3d2sn3d[64] = { 1.0000000000000000e+00f, 5.7735026918962584e-01f, 5.7735026918962584e-01f, 5.7735026918962584e-01f, 4.4721359549995793e-01f, 4.4721359549995793e-01f, 4.4721359549995793e-01f, 4.4721359549995793e-01f, 4.4721359549995793e-01f, 3.7796447300922720e-01f, 3.7796447300922720e-01f, 3.7796447300922720e-01f, 3.7796447300922720e-01f, 3.7796447300922720e-01f, 3.7796447300922720e-01f, 3.7796447300922720e-01f, 3.3333333333333331e-01f, 3.3333333333333331e-01f, 3.3333333333333331e-01f, 3.3333333333333331e-01f, 3.3333333333333331e-01f, 3.3333333333333331e-01f, 3.3333333333333331e-01f, 3.3333333333333331e-01f, 3.3333333333333331e-01f, 3.0151134457776363e-01f, 3.0151134457776363e-01f, 3.0151134457776363e-01f, 3.0151134457776363e-01f, 3.0151134457776363e-01f, 3.0151134457776363e-01f, 3.0151134457776363e-01f, 3.0151134457776363e-01f, 3.0151134457776363e-01f, 3.0151134457776363e-01f, 3.0151134457776363e-01f, 2.7735009811261457e-01f, 2.7735009811261457e-01f, 2.7735009811261457e-01f, 2.7735009811261457e-01f, 2.7735009811261457e-01f, 2.7735009811261457e-01f, 2.7735009811261457e-01f, 2.7735009811261457e-01f, 2.7735009811261457e-01f, 2.7735009811261457e-01f, 2.7735009811261457e-01f, 2.7735009811261457e-01f, 2.7735009811261457e-01f, 2.5819888974716110e-01f, 2.5819888974716110e-01f, 2.5819888974716110e-01f, 2.5819888974716110e-01f, 2.5819888974716110e-01f, 2.5819888974716110e-01f, 2.5819888974716110e-01f, 2.5819888974716110e-01f, 2.5819888974716110e-01f, 2.5819888974716110e-01f, 2.5819888974716110e-01f, 2.5819888974716110e-01f, 2.5819888974716110e-01f, 2.5819888974716110e-01f, 2.5819888974716110e-01f, }; const float sn3d2n3d_short[8] = { 1.0000000000000000e+00f, 1.7320508075688772e+00f, 2.2360679774997898e+00f, 2.6457513110645907e+00f, 3.0000000000000000e+00f, 3.3166247903553998e+00f, 3.6055512754639891e+00f, 3.8729833462074170e+00f }; const float n3d2sn3d_short[8] = { 1.0000000000000000e+00f, 5.7735026918962584e-01f, 4.4721359549995793e-01f, 3.7796447300922720e-01f, 3.3333333333333331e-01f, 3.0151134457776363e-01f, 2.7735009811261457e-01f, 2.5819888974716110e-01f }; IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/viridis_cropped.h0000664002537200253720000005227215257173642030207 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2018 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ /* This data originates from https://matplotlib.org/examples/color/colormaps_reference.html. The following rgb color data is cropped and stretched. */ #pragma once const float viridis_cropped[256][3] = { { 2.4862898999999999e-01, 2.7877509000000000e-01, 5.3455560999999996e-01 }, { 2.4719630141176469e-01, 2.8229182541176467e-01, 5.3564756811764702e-01 }, { 2.4575108611764707e-01, 2.8579548647058822e-01, 5.3670143882352939e-01 }, { 2.4429415011764705e-01, 2.8928603670588232e-01, 5.3771804270588230e-01 }, { 2.4282629788235294e-01, 2.9276343658823528e-01, 5.3869819882352943e-01 }, { 2.4134744235294117e-01, 2.9622628823529412e-01, 5.3963923352941179e-01 }, { 2.3985752164705881e-01, 2.9967240717647059e-01, 5.4053699223529406e-01 }, { 2.3835995847058822e-01, 3.0310529670588238e-01, 5.4140170329411763e-01 }, { 2.3685551741176469e-01, 3.0652496235294119e-01, 5.4223418305882354e-01 }, { 2.3534504447058827e-01, 3.0993138505882356e-01, 5.4303528047058824e-01 }, { 2.3382903941176469e-01, 3.1332171117647062e-01, 5.4380008941176472e-01 }, { 2.3230902423529409e-01, 3.1669655341176473e-01, 5.4453131529411769e-01 }, { 2.3078602517647059e-01, 3.2005830976470584e-01, 5.4523448364705884e-01 }, { 2.2926062305882353e-01, 3.2340708235294113e-01, 5.4591031905882359e-01 }, { 2.2773349811764704e-01, 3.2674293752941175e-01, 5.4655958341176469e-01 }, { 2.2620540941176470e-01, 3.3006206235294117e-01, 5.4717561294117645e-01 }, { 2.2467760823529409e-01, 3.3336774058823526e-01, 5.4776585658823529e-01 }, { 2.2315075000000001e-01, 3.3666085600000001e-01, 5.4833259000000001e-01 }, { 2.2162543423529410e-01, 3.3994151458823529e-01, 5.4887652035294121e-01 }, { 2.2010237447058822e-01, 3.4320933317647057e-01, 5.4939748870588234e-01 }, { 2.1858335235294118e-01, 3.4646103176470583e-01, 5.4989060647058818e-01 }, { 2.1706817023529412e-01, 3.4970077741176475e-01, 5.5036371894117653e-01 }, { 2.1555733282352940e-01, 3.5292870482352945e-01, 5.5081745505882362e-01 }, { 2.1405132529411763e-01, 3.5614495541176472e-01, 5.5125243305882354e-01 }, { 2.1255147117647061e-01, 3.5934807564705884e-01, 5.5166681623529412e-01 }, { 2.1105947352941176e-01, 3.6253730411764706e-01, 5.5206047470588238e-01 }, { 2.0957431694117648e-01, 3.6571543470588236e-01, 5.5243790470588228e-01 }, { 2.0809622752941176e-01, 3.6888268364705884e-01, 5.5279956682352938e-01 }, { 2.0662542988235294e-01, 3.7203926576470586e-01, 5.5314591517647060e-01 }, { 2.0516427023529413e-01, 3.7518285847058824e-01, 5.5347404964705893e-01 }, { 2.0371231823529412e-01, 3.7831506941176474e-01, 5.5378661588235301e-01 }, { 2.0226887411764705e-01, 3.8143735352941177e-01, 5.5408583023529412e-01 }, { 2.0083416635294118e-01, 3.8454990070588235e-01, 5.5437211776470596e-01 }, { 1.9940840588235292e-01, 3.8765290752941178e-01, 5.5464589705882350e-01 }, { 1.9799510000000001e-01, 3.9074345199999999e-01, 5.5490364999999997e-01 }, { 1.9659145882352941e-01, 3.9382488470588239e-01, 5.5514982647058819e-01 }, { 1.9519740199999999e-01, 3.9689758741176473e-01, 5.5538500811764702e-01 }, { 1.9381302411764706e-01, 3.9996175670588235e-01, 5.5560951764705890e-01 }, { 1.9243920882352941e-01, 4.0301694094117646e-01, 5.5582285352941185e-01 }, { 1.9107803800000001e-01, 4.0606186729411764e-01, 5.5602346341176467e-01 }, { 1.8972671235294120e-01, 4.0909910647058823e-01, 5.5621453529411768e-01 }, { 1.8838520741176468e-01, 4.1212886223529410e-01, 5.5639629494117648e-01 }, { 1.8705348764705881e-01, 4.1515133882352939e-01, 5.5656895529411765e-01 }, { 1.8573327235294118e-01, 4.1816551117647061e-01, 5.5673113470588231e-01 }, { 1.8442438411764706e-01, 4.2117176823529412e-01, 5.5688314705882347e-01 }, { 1.8312491470588238e-01, 4.2417159705882346e-01, 5.5702674882352943e-01 }, { 1.8183473188235294e-01, 4.2716520082352938e-01, 5.5716205788235296e-01 }, { 1.8055369235294116e-01, 4.3015278282352942e-01, 5.5728918129411764e-01 }, { 1.7928408176470589e-01, 4.3313299011764711e-01, 5.5740595047058827e-01 }, { 1.7802375552941177e-01, 4.3610734870588241e-01, 5.5751409623529413e-01 }, { 1.7677177411764705e-01, 4.3907651000000003e-01, 5.5761431882352941e-01 }, { 1.7552791000000001e-01, 4.4204066800000003e-01, 5.5770663999999992e-01 }, { 1.7429207529411767e-01, 4.4499993188235293e-01, 5.5779090235294115e-01 }, { 1.7306631917647058e-01, 4.4795314705882350e-01, 5.5786449599999999e-01 }, { 1.7184763905882353e-01, 4.5090214823529406e-01, 5.5793011247058821e-01 }, { 1.7063600176470589e-01, 4.5384707882352937e-01, 5.5798782823529414e-01 }, { 1.6943123776470587e-01, 4.5678810364705885e-01, 5.5803763176470578e-01 }, { 1.6823365611764707e-01, 4.5972501317647063e-01, 5.5807834411764701e-01 }, { 1.6704325811764706e-01, 4.6265774599999998e-01, 5.5810864341176480e-01 }, { 1.6585824105882352e-01, 4.6558736658823530e-01, 5.5813040105882350e-01 }, { 1.6467832411764705e-01, 4.6851404117647055e-01, 5.5814347176470580e-01 }, { 1.6350322811764706e-01, 4.7143793305882348e-01, 5.5814769941176468e-01 }, { 1.6233358152941177e-01, 4.7435868376470586e-01, 5.5814080235294117e-01 }, { 1.6116854670588238e-01, 4.7727677941176472e-01, 5.5812319282352940e-01 }, { 1.6000725211764705e-01, 4.8019273964705877e-01, 5.5809594611764701e-01 }, { 1.5884947117647058e-01, 4.8310671058823529e-01, 5.5805884000000006e-01 }, { 1.5769498647058824e-01, 4.8601883423529413e-01, 5.5801164717647056e-01 }, { 1.5654447823529413e-01, 4.8892878611764706e-01, 5.5795058258823527e-01 }, { 1.5539681999999999e-01, 4.9183723800000001e-01, 5.5787820199999993e-01 }, { 1.5425177188235295e-01, 4.9474439235294115e-01, 5.5779465023529418e-01 }, { 1.5310922941176472e-01, 4.9765037000000001e-01, 5.5769964294117647e-01 }, { 1.5196924411764706e-01, 5.0055522199999991e-01, 5.5759214341176477e-01 }, { 1.5083234588235295e-01, 5.0345893705882361e-01, 5.5746862882352943e-01 }, { 1.4969844976470589e-01, 5.0636182494117643e-01, 5.5733271200000001e-01 }, { 1.4856750517647058e-01, 5.0926401364705876e-01, 5.5718399505882354e-01 }, { 1.4743942176470587e-01, 5.1216563352941180e-01, 5.5702203352941182e-01 }, { 1.4631457058823530e-01, 5.1506675717647066e-01, 5.5684397117647066e-01 }, { 1.4519348152941175e-01, 5.1796753376470583e-01, 5.5664855588235296e-01 }, { 1.4407592694117646e-01, 5.2086811858823534e-01, 5.5643824647058826e-01 }, { 1.4296228176470588e-01, 5.2376858188235287e-01, 5.5621266741176467e-01 }, { 1.4185295941176471e-01, 5.2666899000000000e-01, 5.5597143823529405e-01 }, { 1.4074999752941175e-01, 5.2956941999999996e-01, 5.5570971258823532e-01 }, { 1.3965362364705883e-01, 5.3246995799999997e-01, 5.5542946176470598e-01 }, { 1.3856404941176470e-01, 5.3537064905882348e-01, 5.5513192670588241e-01 }, { 1.3748206070588234e-01, 5.3827153211764711e-01, 5.5481670317647069e-01 }, { 1.3640849999999999e-01, 5.4117263999999998e-01, 5.5448339000000002e-01 }, { 1.3534998670588236e-01, 5.4407390552941182e-01, 5.5412527105882348e-01 }, { 1.3430315847058824e-01, 5.4697547082352937e-01, 5.5374775388235298e-01 }, { 1.3326924435294119e-01, 5.4987735047058828e-01, 5.5335041176470590e-01 }, { 1.3224954223529412e-01, 5.5277955294117653e-01, 5.5293281647058823e-01 }, { 1.3124728529411764e-01, 5.5568211117647048e-01, 5.5249235058823520e-01 }, { 1.3026817258823531e-01, 5.5858507058823526e-01, 5.5202479435294116e-01 }, { 1.2930980494117650e-01, 5.6148832635294121e-01, 5.5153521200000000e-01 }, { 1.2837404564705882e-01, 5.6439186388235307e-01, 5.5102317870588235e-01 }, { 1.2746283188235294e-01, 5.6729566294117650e-01, 5.5048827141176471e-01 }, { 1.2658447764705882e-01, 5.7019971882352938e-01, 5.4992514823529415e-01 }, { 1.2574285823529413e-01, 5.7310386188235296e-01, 5.4933449741176477e-01 }, { 1.2493542400000002e-01, 5.7600807988235292e-01, 5.4871938870588233e-01 }, { 1.2416449847058825e-01, 5.7891235305882360e-01, 5.4807927270588230e-01 }, { 1.2343255623529412e-01, 5.8181664905882358e-01, 5.4741364729411768e-01 }, { 1.2275688882352941e-01, 5.8472085470588242e-01, 5.4671388352941175e-01 }, { 1.2213186941176471e-01, 5.8762488905882360e-01, 5.4598568494117639e-01 }, { 1.2155795999999999e-01, 5.9052868199999997e-01, 5.4523024399999998e-01 }, { 1.2103831752941176e-01, 5.9343215682352946e-01, 5.4444715223529405e-01 }, { 1.2057872905882352e-01, 5.9633521164705883e-01, 5.4363482847058819e-01 }, { 1.2020294470588236e-01, 5.9923751705882355e-01, 5.4278458294117649e-01 }, { 1.1989580988235295e-01, 6.0213909164705881e-01, 5.4190536317647064e-01 }, { 1.1966047800000000e-01, 6.0503987717647056e-01, 5.4099655564705884e-01 }, { 1.1950021329411764e-01, 6.0793980211764709e-01, 5.4005761011764708e-01 }, { 1.1943067517647059e-01, 6.1083860047058824e-01, 5.3908367447058825e-01 }, { 1.1946515588235296e-01, 6.1373597294117654e-01, 5.3807152235294120e-01 }, { 1.1958929423529412e-01, 6.1663202776470594e-01, 5.3702767094117654e-01 }, { 1.1980649811764707e-01, 6.1952664341176478e-01, 5.3595175352941182e-01 }, { 1.2012013941176471e-01, 6.2241969376470585e-01, 5.3484341305882355e-01 }, { 1.2055954117647058e-01, 6.2531056247058836e-01, 5.3369417388235296e-01 }, { 1.2111802117647058e-01, 6.2819921176470594e-01, 5.3250766411764705e-01 }, { 1.2178572752941177e-01, 6.3108574882352952e-01, 5.3128730541176472e-01 }, { 1.2256528305882351e-01, 6.3397004270588242e-01, 5.3003268764705891e-01 }, { 1.2345929705882354e-01, 6.3685195117647053e-01, 5.2874348282352945e-01 }, { 1.2451233999999999e-01, 6.3973035000000000e-01, 5.2740702200000000e-01 }, { 1.2568910647058823e-01, 6.4260583705882357e-01, 5.2603425529411763e-01 }, { 1.2698885752941177e-01, 6.4547830870588230e-01, 5.2462560011764703e-01 }, { 1.2841312294117646e-01, 6.4834760647058820e-01, 5.2318077717647060e-01 }, { 1.2997371058823529e-01, 6.5121327529411766e-01, 5.2169652223529406e-01 }, { 1.3169827611764706e-01, 6.5407428952941171e-01, 5.2016480235294116e-01 }, { 1.3355119000000001e-01, 6.5693145588235291e-01, 5.1859565176470590e-01 }, { 1.3553276247058824e-01, 6.5978460482352941e-01, 5.1698879611764714e-01 }, { 1.3764316647058822e-01, 6.6263356176470589e-01, 5.1534397600000004e-01 }, { 1.3990595352941176e-01, 6.6547727823529401e-01, 5.1365383399999998e-01 }, { 1.4232042764705882e-01, 6.6831542670588229e-01, 5.1191790611764709e-01 }, { 1.4486219941176470e-01, 6.7114863117647050e-01, 5.1014299588235301e-01 }, { 1.4753041458823532e-01, 6.7397671082352939e-01, 5.0832884141176471e-01 }, { 1.5032411317647060e-01, 6.7679948600000006e-01, 5.0647517152941179e-01 }, { 1.5327702388235293e-01, 6.7961509400000009e-01, 5.0457021964705895e-01 }, { 1.5636161152941178e-01, 6.8242432952941179e-01, 5.0262180776470589e-01 }, { 1.5956626235294116e-01, 6.8522745529411755e-01, 5.0063298941176471e-01 }, { 1.6288942400000000e-01, 6.8802427799999999e-01, 4.9860357399999999e-01 }, { 1.6633182094117646e-01, 6.9081446541176472e-01, 4.9653254094117649e-01 }, { 1.6992794352941179e-01, 6.9359545164705882e-01, 4.9440617658823527e-01 }, { 1.7363544564705879e-01, 6.9636930176470591e-01, 4.9223846752941175e-01 }, { 1.7745250882352942e-01, 6.9913581882352938e-01, 4.9002905882352943e-01 }, { 1.8137730752941175e-01, 7.0189480023529405e-01, 4.8777769247058822e-01 }, { 1.8542057623529407e-01, 7.0464503988235294e-01, 4.8547910376470593e-01 }, { 1.8959158611764704e-01, 7.0738516788235306e-01, 4.8312799047058824e-01 }, { 1.9386264294117644e-01, 7.1011686988235301e-01, 4.8073449811764712e-01 }, { 1.9823192117647062e-01, 7.1283993588235295e-01, 4.7829850058823531e-01 }, { 2.0269760835294115e-01, 7.1555415470588224e-01, 4.7581987388235292e-01 }, { 2.0727838258823533e-01, 7.1825717117647070e-01, 4.7328884247058822e-01 }, { 2.1196342882352939e-01, 7.2094935658823533e-01, 4.7070869576470586e-01 }, { 2.1673778623529416e-01, 7.2363180552941175e-01, 4.6808501435294114e-01 }, { 2.2159983117647059e-01, 7.2630429235294125e-01, 4.6541766470588231e-01 }, { 2.2654791364705890e-01, 7.2896658458823538e-01, 4.6270669082352939e-01 }, { 2.3160687082352943e-01, 7.3161491329411765e-01, 4.5993794341176469e-01 }, { 2.3675033199999995e-01, 7.3425190799999995e-01, 4.5712372800000001e-01 }, { 2.4197343811764707e-01, 7.3687778023529416e-01, 4.5426575776470585e-01 }, { 2.4727476764705880e-01, 7.3949230588235293e-01, 4.5136396176470589e-01 }, { 2.5265749247058827e-01, 7.4209452282352950e-01, 4.4841556764705881e-01 }, { 2.5813766294117646e-01, 7.4468112376470597e-01, 4.4540970905882349e-01 }, { 2.6369073011764710e-01, 7.4725543317647070e-01, 4.4235944835294116e-01 }, { 2.6931565352941178e-01, 7.4981722164705888e-01, 4.3926443623529415e-01 }, { 2.7501128941176478e-01, 7.5236625705882354e-01, 4.3612456705882352e-01 }, { 2.8078715447058827e-01, 7.5490011035294124e-01, 4.3293313635294123e-01 }, { 2.8664396752941168e-01, 7.5741781847058820e-01, 4.2968827247058827e-01 }, { 2.9256662905882347e-01, 7.5992180917647056e-01, 4.2639900294117650e-01 }, { 2.9855412305882356e-01, 7.6241185447058823e-01, 4.2306530588235292e-01 }, { 3.0460545294117647e-01, 7.6488772647058823e-01, 4.1968716117647054e-01 }, { 3.1073585835294115e-01, 7.6734523917647057e-01, 4.1625275694117647e-01 }, { 3.1693352870588226e-01, 7.6978637399999994e-01, 4.1276933976470592e-01 }, { 3.2319141411764718e-01, 7.7221235941176469e-01, 4.0924116835294111e-01 }, { 3.2950888964705893e-01, 7.7462294952941180e-01, 4.0566791094117649e-01 }, { 3.3588539000000001e-01, 7.7701790000000004e-01, 4.0204917000000001e-01 }, { 3.4234002811764697e-01, 7.7939100058823529e-01, 3.9836957729411770e-01 }, { 3.4885059541176455e-01, 7.8174776399999990e-01, 3.9464553870588243e-01 }, { 3.5541633329411770e-01, 7.8408795682352950e-01, 3.9087708341176464e-01 }, { 3.6203650305882357e-01, 7.8641135023529407e-01, 3.8706424823529412e-01 }, { 3.6871574882352937e-01, 7.8871594529411759e-01, 3.8320256529411767e-01 }, { 3.7546140752941171e-01, 7.9099850482352951e-01, 3.7928491458823532e-01 }, { 3.8225858588235306e-01, 7.9326332305882352e-01, 3.7532311929411760e-01 }, { 3.8910661717647066e-01, 7.9551018247058825e-01, 3.7131725058823528e-01 }, { 3.9600484988235291e-01, 7.9773886411764705e-01, 3.6726737482352939e-01 }, { 4.0296254764705874e-01, 7.9994529235294121e-01, 3.6316458647058825e-01 }, { 4.0997762094117635e-01, 8.0212971188235294e-01, 3.5900931117647061e-01 }, { 4.1704044788235300e-01, 8.0429501435294126e-01, 3.5481016811764698e-01 }, { 4.2415019870588233e-01, 8.0644100835294119e-01, 3.5056756741176470e-01 }, { 4.3130624317647054e-01, 8.0856748635294118e-01, 3.4628164282352947e-01 }, { 4.3852154411764693e-01, 8.1066807823529397e-01, 3.4193943588235298e-01 }, { 4.4578393870588251e-01, 8.1274729505882348e-01, 3.3755179317647049e-01 }, { 4.5309002600000003e-01, 8.1480616200000000e-01, 3.3312155199999993e-01 }, { 4.6043917670588236e-01, 8.1684448941176480e-01, 3.2864892435294119e-01 }, { 4.6783244541176466e-01, 8.1886122882352930e-01, 3.2413243070588238e-01 }, { 4.7528061999999988e-01, 8.2085007941176469e-01, 3.1956054176470594e-01 }, { 4.8276920094117659e-01, 8.2281762964705885e-01, 3.1494733564705879e-01 }, { 4.9029753223529415e-01, 8.2476372105882356e-01, 3.1029313141176468e-01 }, { 4.9786495223529409e-01, 8.2668819682352934e-01, 3.0559826294117648e-01 }, { 5.0547610494117634e-01, 8.2858774929411760e-01, 3.0085742176470592e-01 }, { 5.1313284352941180e-01, 8.3046030176470587e-01, 2.9606806529411761e-01 }, { 5.2082646470588245e-01, 8.3231051764705888e-01, 2.9123888047058821e-01 }, { 5.2855595082352946e-01, 8.3413832376470587e-01, 2.8637077858823534e-01 }, { 5.3632015647058817e-01, 8.3594367247058821e-01, 2.8146486352941180e-01 }, { 5.4412628705882338e-01, 8.3772087505882353e-01, 2.7651293294117657e-01 }, { 5.5196882764705890e-01, 8.3947253823529411e-01, 2.7152072294117646e-01 }, { 5.5984284423529418e-01, 8.4120136541176471e-01, 2.6649356788235296e-01 }, { 5.6774750623529413e-01, 8.4290729399999997e-01, 2.6143232482352946e-01 }, { 5.7568196705882346e-01, 8.4459026623529410e-01, 2.5633789835294130e-01 }, { 5.8365477000000010e-01, 8.4624223399999998e-01, 2.5120089799999995e-01 }, { 5.9165514352941184e-01, 8.4787070176470591e-01, 2.4603353882352935e-01 }, { 5.9968157623529406e-01, 8.4947613952941170e-01, 2.4083780964705881e-01 }, { 6.0773311176470579e-01, 8.5105856211764708e-01, 2.3561514117647064e-01 }, { 6.1581059235294111e-01, 8.5261613082352938e-01, 2.3036521823529421e-01 }, { 6.2391686764705889e-01, 8.5414426741176475e-01, 2.2508649317647050e-01 }, { 6.3204399823529411e-01, 8.5564963411764716e-01, 2.1978833647058821e-01 }, { 6.4019089423529407e-01, 8.5713233705882352e-01, 2.1447306094117652e-01 }, { 6.4835645094117633e-01, 8.5859249623529421e-01, 2.0914312905882360e-01 }, { 6.5654236905882368e-01, 8.6002619376470590e-01, 2.0380002094117641e-01 }, { 6.6474643776470599e-01, 8.6143373670588241e-01, 1.9844964576470586e-01 }, { 6.7296427352941168e-01, 8.6281945647058822e-01, 1.9309786529411765e-01 }, { 6.8119463599999985e-01, 8.6418358011764718e-01, 1.8774877035294124e-01 }, { 6.8943626858823548e-01, 8.6552634623529412e-01, 1.8240671470588227e-01 }, { 6.9768997494117657e-01, 8.6684216317647067e-01, 1.7708297352941171e-01 }, { 7.0595158141176473e-01, 8.6813583858823540e-01, 1.7178452894117646e-01 }, { 7.1421895588235285e-01, 8.6940942647058828e-01, 1.6651707705882357e-01 }, { 7.2249072399999992e-01, 8.7066328800000004e-01, 1.6128797200000008e-01 }, { 7.3076551564705894e-01, 8.7189742011764715e-01, 1.5610627870588228e-01 }, { 7.3904119247058830e-01, 8.7310643341176475e-01, 1.5100678258823524e-01 }, { 7.4731524505882352e-01, 8.7429750941176465e-01, 1.4598488011764710e-01 }, { 7.5558623882352938e-01, 8.7547113235294116e-01, 1.4105282470588243e-01 }, { 7.6385272494117662e-01, 8.7662780141176477e-01, 1.3622366411764697e-01 }, { 7.7211217752941186e-01, 8.7776613929411762e-01, 1.3152905294117642e-01 }, { 7.8036094435294112e-01, 8.7888525141176466e-01, 1.2701571223529412e-01 }, { 7.8859908376470589e-01, 8.7998972929411767e-01, 1.2267358494117650e-01 }, { 7.9682513117647047e-01, 8.8108018588235293e-01, 1.1852288764705889e-01 }, { 8.0503762823529423e-01, 8.8215724694117648e-01, 1.1458472188235289e-01 }, { 8.1323113705882355e-01, 8.8321897623529411e-01, 1.1094443847058821e-01 }, { 8.2140434752941172e-01, 8.8426759494117646e-01, 1.0762614188235295e-01 }, { 8.2955808917647045e-01, 8.8530559129411768e-01, 1.0462064094117651e-01 }, { 8.3769099470588249e-01, 8.8633366529411761e-01, 1.0195326235294112e-01 }, { 8.4580171388235303e-01, 8.8735252200000003e-01, 9.9649241058823501e-02 }, { 8.5388036894117647e-01, 8.8836060400000005e-01, 9.7875451529411767e-02 }, { 8.6193178999999986e-01, 8.8936142600000001e-01, 9.6552406000000007e-02 }, { 8.6995577552941161e-01, 8.9035605305882348e-01, 9.5680108470588249e-02 }, { 8.7795116117647065e-01, 8.9134522176470576e-01, 9.5272329999999988e-02 }, { 8.8591487576470584e-01, 8.9232945964705879e-01, 9.5370016000000002e-02 }, { 8.9383743458823517e-01, 8.9330914223529412e-01, 9.6097958941176453e-02 }, { 9.0172701694117641e-01, 8.9428640329411757e-01, 9.7303858588235273e-02 }, { 9.0958256858823550e-01, 8.9526202058823534e-01, 9.8978742588235330e-02 }, { 9.1740255176470598e-01, 8.9623697588235296e-01, 1.0111137294117649e-01 }, { 9.2517744458823536e-01, 8.9721320529411763e-01, 1.0375501164705883e-01 }, { 9.3290720588235287e-01, 8.9819091317647048e-01, 1.0688897505882350e-01 }, { 9.4059861199999983e-01, 8.9917073647058821e-01, 1.1040127399999994e-01 }, { 9.4825107858823543e-01, 9.0015332729411779e-01, 1.1426930141176475e-01 }, { 9.5586406176470584e-01, 9.0113932647058825e-01, 1.1847021352941178e-01 }, { 9.6342624141176469e-01, 9.0213074517647063e-01, 1.2305158682352940e-01 }, { 9.7094351211764696e-01, 9.0312790058823533e-01, 1.2792661847058817e-01 }, { 9.7841969752941194e-01, 9.0413090529411766e-01, 1.3304486611764715e-01 }, { 9.8585455823529422e-01, 9.0514029035294108e-01, 1.3838742552941183e-01 }, { 9.9324789000000002e-01, 9.0615657000000005e-01, 1.4393619999999999e-01, } }; IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/efficientSHvanilla.h0000664002537200253720000001135515257173642030555 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #include "../JuceLibraryCode/JuceHeader.h" void SHEval0 (const float fX, const float fY, const float fZ, float* SHcoeffs); void SHEval1 (const float fX, const float fY, const float fZ, float* SHcoeffs); void SHEval2 (const float fX, const float fY, const float fZ, float* SHcoeffs); void SHEval3 (const float fX, const float fY, const float fZ, float* SHcoeffs); void SHEval4 (const float fX, const float fY, const float fZ, float* SHcoeffs); void SHEval5 (const float fX, const float fY, const float fZ, float* SHcoeffs); void SHEval6 (const float fX, const float fY, const float fZ, float* SHcoeffs); void SHEval7 (const float fX, const float fY, const float fZ, float* SHcoeffs); #ifndef M_2_SQRTPI #define M_2_SQRTPI 1.12837916709551257389615890312154517 #endif #ifndef sqrt4PI #define sqrt4PI 3.544907701811032 #endif // encoding and decoding with same direction and order yields the same encoded signal // normalization is done at the decoding stage constexpr float decodeCorrection (const int N) { return sqrt4PI / (N + 1) / (N + 1); } inline void SHEval (const int N, const float fX, const float fY, const float fZ, float* SHcoeffs, const bool doEncode = true) { switch (N) { case 0: SHEval0 (fX, fY, fZ, SHcoeffs); juce::FloatVectorOperations::multiply (SHcoeffs, doEncode ? sqrt4PI : decodeCorrection (0), 1); break; case 1: SHEval1 (fX, fY, fZ, SHcoeffs); juce::FloatVectorOperations::multiply (SHcoeffs, doEncode ? sqrt4PI : decodeCorrection (1), 4); break; case 2: SHEval2 (fX, fY, fZ, SHcoeffs); juce::FloatVectorOperations::multiply (SHcoeffs, doEncode ? sqrt4PI : decodeCorrection (2), 9); break; case 3: SHEval3 (fX, fY, fZ, SHcoeffs); juce::FloatVectorOperations::multiply (SHcoeffs, doEncode ? sqrt4PI : decodeCorrection (3), 16); break; case 4: SHEval4 (fX, fY, fZ, SHcoeffs); juce::FloatVectorOperations::multiply (SHcoeffs, doEncode ? sqrt4PI : decodeCorrection (4), 25); break; case 5: SHEval5 (fX, fY, fZ, SHcoeffs); juce::FloatVectorOperations::multiply (SHcoeffs, doEncode ? sqrt4PI : decodeCorrection (5), 36); break; case 6: SHEval6 (fX, fY, fZ, SHcoeffs); juce::FloatVectorOperations::multiply (SHcoeffs, doEncode ? sqrt4PI : decodeCorrection (6), 49); break; case 7: SHEval7 (fX, fY, fZ, SHcoeffs); juce::FloatVectorOperations::multiply (SHcoeffs, doEncode ? sqrt4PI : decodeCorrection (7), 64); break; } } inline void SHEval (const int N, const juce::Vector3D position, float* pSH, const bool doEncode = true) { SHEval (N, position.x, position.y, position.z, pSH, doEncode); } IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/NewtonApple/0000775002537200253720000000000015257173642027075 5ustar zmoelnigzmoelnig././@LongLink0000644000000000000000000000015500000000000011604 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/NewtonApple/NewtonApple_hull3D.cppIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/NewtonApple/NewtonApple_hu0000664002537200253720000015744715257173642031772 0ustar zmoelnigzmoelnig/* This file was modified to fit the requirements of the IEM Plug-in Suite. */ #include #include #include #include #include #include #include #include #include #include "NewtonApple_hull3D.h" using namespace std; /* copyright 2017 Dr David Sinclair david@newtonapples.net all rights reserved. version of 22-mar-2017. this code is released under GPL3, a copy of the license can be found at http://www.gnu.org/licenses/gpl-3.0.html you can purchase a un-restricted license from http://newtonapples.net where algorithm details are explained. If you do choose to purchase a license you might also like Newton Apple Chocolates!, the cleverest chocolates on the Internet. */ /* read an ascii file of (r,c) or (r,c,z) point pairs. the first line of the points file should contain " 2 points" or maybe " 3 points" if it does not have the word points in it the first line is interpretted as a point pair or triplod. */ int read_R3 (std::vector& pts, char* fname) { char s0[513]; int nump = 0; float p1, p2, p3; R3 pt; std::string line; std::string points_str ("points"); std::ifstream myfile; myfile.open (fname); if (myfile.is_open()) { getline (myfile, line); //int numc = line.length(); // check string for the string "points" int n = (int) line.find (points_str); if (n < line.length()) { while (myfile.good()) { getline (myfile, line); if (line.length() <= 512) { copy (line.begin(), line.end(), s0); s0[line.length()] = 0; int v = sscanf (s0, "%g %g %g", &p1, &p2, &p3); if (v == 3) { pt.id = nump; nump++; pt.x = p1; pt.y = p2; pt.z = p3; pts.push_back (pt); } else { v = sscanf (s0, "%g %g", &p1, &p2); if (v == 2) { pt.id = nump; nump++; pt.x = p1; pt.y = p2; pt.z = p1 * p1 + p2 * p2; pts.push_back (pt); } } } } } else { // assume all number pairs on a line are points if (line.length() <= 512) { copy (line.begin(), line.end(), s0); s0[line.length()] = 0; int v = sscanf (s0, "%g %g %g", &p1, &p2, &p3); if (v == 3) { pt.id = nump; nump++; pt.x = p1; pt.y = p2; pt.z = p3; pts.push_back (pt); } else { v = sscanf (s0, "%g %g", &p1, &p2); if (v == 2) { pt.id = nump; nump++; pt.x = p1; pt.y = p2; pt.z = p1 * p1 + p2 * p2; pts.push_back (pt); } } } while (myfile.good()) { getline (myfile, line); if (line.length() <= 512) { copy (line.begin(), line.end(), s0); s0[line.length()] = 0; int v = sscanf (s0, "%g %g %g", &p1, &p2, &p3); if (v == 3) { pt.id = nump; nump++; pt.x = p1; pt.y = p2; pt.z = p3; pts.push_back (pt); } else { v = sscanf (s0, "%g %g", &p1, &p2); if (v == 2) { pt.id = nump; nump++; pt.x = p1; pt.y = p2; pt.z = p1 * p1 + p2 * p2; pts.push_back (pt); } } } } } myfile.close(); } nump = (int) pts.size(); return (nump); }; /* write out a set of points to disk */ void write_R3 (std::vector& pts, char* fname) { std::ofstream out (fname, ios::out); int nr = (int) pts.size(); out << nr << " 3 points" << endl; for (int r = 0; r < nr; r++) { out << pts[r].x << ' ' << pts[r].y << ' ' << pts[r].z << endl; } out.close(); return; }; /* write out triangle ids to be compatible with matlab/octave array numbering. */ void write_Tris (std::vector& ts, char* fname) { std::ofstream out (fname, ios::out); int nr = (int) ts.size(); out << nr << " 6 point-ids (1,2,3) adjacent triangle-ids ( limbs ab ac bc )" << endl; for (int r = 0; r < nr; r++) { out << ts[r].a + 1 << ' ' << ts[r].b + 1 << ' ' << ts[r].c + 1 << ' ' << ts[r].ab + 1 << ' ' << ts[r].ac + 1 << ' ' << ts[r].bc + 1 << endl; //" " << ts[r].ro << endl; } out.close(); return; }; /* To create a Delaunay triangulation from a 2D point set: make the 'z' coordinate = (x*x + y*y), find the convex hull in R3 of a point cloud. using a sweep-hull algorithm called the Newton Apple Wrapper. discard the facets that are not downward facing. */ int NewtonApple_Delaunay (std::vector& pts, std::vector& hulk) { int nump = (int) pts.size(); if (nump <= 4) { cerr << "less than 4 points, aborting " << endl; return (-1); } sort (pts.begin(), pts.end()); std::vector hull; init_hull3D_compact (pts, hull); //int num = init_hull3D(pts, hull); // return(0); // exit here is you do not need to write the triangles to disk. // just pick out the hull triangles and renumber. int numh = (int) hull.size(); int* taken = new int[numh]; //int taken[numh]; memset (taken, -1, numh * sizeof (int)); int cnt = 0; for (int t = 0; t < numh; t++) { // create an index from old tri-id to new tri-id. if (hull[t].keep > 0) { // point index remains unchanged. taken[t] = cnt; cnt++; } } for (int t = 0; t < numh; t++) { // create an index from old tri-id to new tri-id. if (hull[t].keep > 0) { // point index remains unchanged. Tri T = hull[t]; T.id = taken[t]; if (taken[T.ab] < 0) { cerr << "broken hull" << endl; delete[] taken; return -1; //exit(0); } T.ab = taken[T.ab]; if (taken[T.bc] < 0) { cerr << "broken hull" << endl; delete[] taken; return -1; //exit(0); } T.bc = taken[T.bc]; if (taken[T.ac] < 0) { cerr << "broken hull" << endl; delete[] taken; return -1; //exit(0); } T.ac = taken[T.ac]; // look at the normal to the triangle if (hull[t].ez < 0) { hulk.push_back (T); } } } delete[] taken; return (1); } /* find the convex hull in R3 of a point cloud. using a sweep-hull algorithm called the Newton Apple Wrapper. */ int NewtonApple_hull_3D (std::vector& pts, std::vector& hulk) { int nump = (int) pts.size(); if (nump < 4) { cerr << "less than 4 points, aborting " << endl; return (-1); } sort (pts.begin(), pts.end()); std::vector hull; init_hull3D_compact (pts, hull); // return(0); // exit here is you do not need to write the triangles to disk. // just pick out the hull triangles and renumber. int numh = (int) hull.size(); int* taken = new int[numh]; //int taken[numh]; memset (taken, -1, numh * sizeof (int)); int cnt = 0; for (int t = 0; t < numh; t++) { // create an index from old tri-id to new tri-id. if (hull[t].keep > 0) { // point index remains unchanged. taken[t] = cnt; cnt++; } } for (int t = 0; t < numh; t++) { // create an index from old tri-id to new tri-id. if (hull[t].keep > 0) { // point index remains unchanged. Tri T = hull[t]; T.id = taken[t]; if (taken[T.ab] < 0) { cerr << "broken hull" << endl; delete[] taken; return -1; //exit(0); } T.ab = taken[T.ab]; if (taken[T.bc] < 0) { cerr << "broken hull" << endl; delete[] taken; return -1; //exit(0); } T.bc = taken[T.bc]; if (taken[T.ac] < 0) { cerr << "broken hull" << endl; delete[] taken; return -1; //exit(0); } T.ac = taken[T.ac]; hulk.push_back (T); } } delete[] taken; return (1); } // if you are de-duplicating points in R2 remember to set .z to something sensible. int de_duplicateR3 (std::vector& pts, std::vector& outx, std::vector& pts2) { int nump = (int) pts.size(); std::vector dpx; R3 d; for (int k = 0; k < nump; k++) { d.x = pts[k].x; d.y = pts[k].y; d.z = pts[k].z; d.id = k; dpx.push_back (d); } sort (dpx.begin(), dpx.end()); //cerr << "de-duplicating "; pts2.clear(); pts2.push_back (pts[dpx[0].id]); pts2[0].id = 0; int cnt = 1; for (int k = 0; k < nump - 1; k++) { if (dpx[k].x == dpx[k + 1].x && dpx[k].y == dpx[k + 1].y && dpx[k].z == dpx[k + 1].z) { outx.push_back (dpx[k + 1].id); } else { pts[dpx[k + 1].id].id = cnt; pts2.push_back (pts[dpx[k + 1].id]); cnt++; } } //cerr << "removed " << outx.size() << " points " << endl; return ((int) outx.size()); } // initialise the hull to the point where there is a not zero volume // hull. int init_hull3D (std::vector& pts, std::vector& hull) { int nump = (int) pts.size(); std::vector norts; hull.reserve (nump * 4); float mr = 0, mc = 0, mz = 0; float Mr = 0, Mc = 0, Mz = 0; Tri T1 (0, 1, 2); float r0 = pts[0].x, c0 = pts[0].y, z0 = pts[0].z; float r1 = pts[1].x, c1 = pts[1].y, z1 = pts[1].z; float r2 = pts[2].x, c2 = pts[2].y, z2 = pts[2].z; Mr = r0 + r1 + r2; Mc = c0 + c1 + c2; Mz = z0 + z1 + z2; // check for colinearity float r01 = r1 - r0, r02 = r2 - r0; float c01 = c1 - c0, c02 = c2 - c0; float z01 = z1 - z0, z02 = z2 - z0; float e0 = c01 * z02 - c02 * z01; float e1 = -r01 * z02 + r02 * z01; float e2 = r01 * c02 - r02 * c01; if (e0 == 0 && e1 == 0 && e2 == 0) { // do not add a facet. cerr << "stop fucking me around and give me a valid opening facet, you tit. " << endl; return (-1); } T1.id = 0; T1.er = e0; T1.ec = e1; T1.ez = e2; T1.ab = 1; // adjacent facet id number T1.ac = 1; T1.bc = 1; hull.push_back (T1); T1.id = 1; T1.er = -e0; T1.ec = -e1; T1.ez = -e2; T1.ab = 0; T1.ac = 0; T1.bc = 0; hull.push_back (T1); std::vector xlist; Tri Tnew; for (int p = 3; p < nump; p++) { // add points until a non coplanar set of points is achieved. R3& pt = pts[p]; Mr += pt.x; mr = Mr / (p + 1); Mc += pt.y; mc = Mc / (p + 1); Mz += pt.z; mz = Mz / (p + 1); // find the first visible plane. int numh = (int) hull.size(); int hvis = -1; float r = pt.x; float c = pt.y; float z = pt.z; xlist.clear(); for (int h = numh - 1; h >= 0; h--) { Tri& t = hull[h]; float R1 = pts[t.a].x; float C1 = pts[t.a].y; float Z1 = pts[t.a].z; float dr = r - R1; float dc = c - C1; float dz = z - Z1; float d = dr * t.er + dc * t.ec + dz * t.ez; if (d > 0) { hvis = h; hull[h].keep = 0; xlist.push_back (hvis); break; } } if (hvis < 0) { add_coplanar (pts, hull, p); } if (hvis >= 0) { // new triangular facets are formed from neighbouring invisible planes. int numh = (int) hull.size(); int numx = (int) xlist.size(); for (int x = 0; x < numx; x++) { int xid = xlist[x]; int ab = hull[xid].ab; // facet adjacent to line ab Tri& tAB = hull[ab]; float R1 = pts[tAB.a].x; // point on next triangle float C1 = pts[tAB.a].y; float Z1 = pts[tAB.a].z; float dr = r - R1; float dc = c - C1; float dz = z - Z1; float d = dr * tAB.er + dc * tAB.ec + dz * tAB.ez; if (d > 0) { // add to xlist. if (hull[ab].keep == 1) { hull[ab].keep = 0; xlist.push_back (ab); numx++; } } else { // spawn a new triangle. Tnew.id = (int) hull.size(); Tnew.keep = 2; Tnew.a = p; Tnew.b = hull[xid].a; Tnew.c = hull[xid].b; Tnew.ab = -1; Tnew.ac = -1; Tnew.bc = ab; // make normal vector. float dr1 = pts[Tnew.a].x - pts[Tnew.b].x, dr2 = pts[Tnew.a].x - pts[Tnew.c].x; float dc1 = pts[Tnew.a].y - pts[Tnew.b].y, dc2 = pts[Tnew.a].y - pts[Tnew.c].y; float dz1 = pts[Tnew.a].z - pts[Tnew.b].z, dz2 = pts[Tnew.a].z - pts[Tnew.c].z; float er = (dc1 * dz2 - dc2 * dz1); float ec = -(dr1 * dz2 - dr2 * dz1); float ez = (dr1 * dc2 - dr2 * dc1); dr = mr - r; // points from new facet towards [mr,mc,mz] dc = mc - c; dz = mz - z; // make it point outwards. float dromadery = dr * er + dc * ec + dz * ez; if (dromadery > 0) { Tnew.er = -er; Tnew.ec = -ec; Tnew.ez = -ez; } else { Tnew.er = er; Tnew.ec = ec; Tnew.ez = ez; } // update the touching triangle tAB int A = hull[xid].a, B = hull[xid].b; if ((tAB.a == A && tAB.b == B) || (tAB.a == B && tAB.b == A)) { tAB.ab = (int) hull.size(); } else if ((tAB.a == A && tAB.c == B) || (tAB.a == B && tAB.c == A)) { tAB.ac = (int) hull.size(); } else if ((tAB.b == A && tAB.c == B) || (tAB.b == B && tAB.c == A)) { tAB.bc = (int) hull.size(); } else { cerr << "Oh crap, the di-lithium crystals are fucked!" << endl; } hull.push_back (Tnew); } // second side of the struck out triangle int ac = hull[xid].ac; // facet adjacent to line ac if (ac == -1) // quick fix return -1; Tri& tAC = hull[ac]; R1 = pts[tAC.a].x; // point on next triangle C1 = pts[tAC.a].y; Z1 = pts[tAC.a].z; dr = r - R1; dc = c - C1; dz = z - Z1; d = dr * tAC.er + dc * tAC.ec + dz * tAC.ez; if (d > 0) { // add to xlist. if (hull[ac].keep == 1) { hull[ac].keep = 0; xlist.push_back (ac); numx++; } } else { // spawn a new triangle. Tnew.id = (int) hull.size(); Tnew.keep = 2; Tnew.a = p; Tnew.b = hull[xid].a; Tnew.c = hull[xid].c; Tnew.ab = -1; Tnew.ac = -1; Tnew.bc = ac; // make normal vector. float dr1 = pts[Tnew.a].x - pts[Tnew.b].x, dr2 = pts[Tnew.a].x - pts[Tnew.c].x; float dc1 = pts[Tnew.a].y - pts[Tnew.b].y, dc2 = pts[Tnew.a].y - pts[Tnew.c].y; float dz1 = pts[Tnew.a].z - pts[Tnew.b].z, dz2 = pts[Tnew.a].z - pts[Tnew.c].z; float er = (dc1 * dz2 - dc2 * dz1); float ec = -(dr1 * dz2 - dr2 * dz1); float ez = (dr1 * dc2 - dr2 * dc1); dr = mr - r; // points from new facet towards [mr,mc,mz] dc = mc - c; dz = mz - z; // make it point outwards. float dromadery = dr * er + dc * ec + dz * ez; if (dromadery > 0) { Tnew.er = -er; Tnew.ec = -ec; Tnew.ez = -ez; } else { Tnew.er = er; Tnew.ec = ec; Tnew.ez = ez; } // update the touching triangle tAC int A = hull[xid].a, C = hull[xid].c; if ((tAC.a == A && tAC.b == C) || (tAC.a == C && tAC.b == A)) { tAC.ab = (int) hull.size(); } else if ((tAC.a == A && tAC.c == C) || (tAC.a == C && tAC.c == A)) { tAC.ac = (int) hull.size(); } else if ((tAC.b == A && tAC.c == C) || (tAC.b == C && tAC.c == A)) { tAC.bc = (int) hull.size(); } else { cerr << "Oh crap, warp drive failure, dude!" << endl; } hull.push_back (Tnew); } // third side of the struck out triangle int bc = hull[xid].bc; // facet adjacent to line ac Tri& tBC = hull[bc]; R1 = pts[tBC.a].x; // point on next triangle C1 = pts[tBC.a].y; Z1 = pts[tBC.a].z; dr = r - R1; dc = c - C1; dz = z - Z1; d = dr * tBC.er + dc * tBC.ec + dz * tBC.ez; if (d > 0) { // add to xlist. if (hull[bc].keep == 1) { hull[bc].keep = 0; xlist.push_back (bc); numx++; } } else { // spawn a new triangle. Tnew.id = (int) hull.size(); Tnew.keep = 2; Tnew.a = p; Tnew.b = hull[xid].b; Tnew.c = hull[xid].c; Tnew.ab = -1; Tnew.ac = -1; Tnew.bc = bc; // make normal vector. float dr1 = pts[Tnew.a].x - pts[Tnew.b].x, dr2 = pts[Tnew.a].x - pts[Tnew.c].x; float dc1 = pts[Tnew.a].y - pts[Tnew.b].y, dc2 = pts[Tnew.a].y - pts[Tnew.c].y; float dz1 = pts[Tnew.a].z - pts[Tnew.b].z, dz2 = pts[Tnew.a].z - pts[Tnew.c].z; float er = (dc1 * dz2 - dc2 * dz1); float ec = -(dr1 * dz2 - dr2 * dz1); float ez = (dr1 * dc2 - dr2 * dc1); dr = mr - r; // points from new facet towards [mr,mc,mz] dc = mc - c; dz = mz - z; // make it point outwards. float dromadery = dr * er + dc * ec + dz * ez; if (dromadery > 0) { Tnew.er = -er; Tnew.ec = -ec; Tnew.ez = -ez; } else { Tnew.er = er; Tnew.ec = ec; Tnew.ez = ez; } // update the touching triangle tBC int B = hull[xid].b, C = hull[xid].c; if ((tBC.a == B && tBC.b == C) || (tBC.a == C && tBC.b == B)) { tBC.ab = (int) hull.size(); } else if ((tBC.a == B && tBC.c == C) || (tBC.a == C && tBC.c == B)) { tBC.ac = (int) hull.size(); } else if ((tBC.b == B && tBC.c == C) || (tBC.b == C && tBC.c == B)) { tBC.bc = (int) hull.size(); } else { cerr << "Oh crap, rocket engine failure" << endl; } hull.push_back (Tnew); } } // patch up the new triangles in hull. int numN = (int) hull.size(); //std::vector norts; int numS = (int) norts.size(); int nums = 0; Snork snort; for (int q = numN - 1; q >= numh; q--) { if (hull[q].keep > 1) { if (nums < numS) { norts[nums].id = q; norts[nums].a = hull[q].b; norts[nums].b = 1; nums++; } else { snort.id = q; snort.a = hull[q].b; snort.b = 1; norts.push_back (snort); nums++; numS = (int) norts.size(); } if (nums < numS) { norts[nums].id = q; norts[nums].a = hull[q].c; norts[nums].b = 0; nums++; } else { snort.a = hull[q].c; snort.b = 0; norts.push_back (snort); nums++; numS = (int) norts.size(); } hull[q].keep = 1; } } sort (norts.begin(), norts.begin() + nums); // int nums = (int) norts.size(); if (nums >= 2) { for (int s = 0; s < nums - 1; s++) { if (norts[s].a == norts[s + 1].a) { // link triangle sides. if (norts[s].b == 1) { hull[norts[s].id].ab = norts[s + 1].id; } else { hull[norts[s].id].ac = norts[s + 1].id; } if (norts[s + 1].b == 1) { hull[norts[s + 1].id].ab = norts[s].id; } else { hull[norts[s + 1].id].ac = norts[s].id; } } } } } /*else{ cerr << "still in the coplanar state you fucking baboon..." << endl; // rather complicated and need to add points to the 2D-hull as two faced triangles. exit(0); }*/ } return (0); } // add a point coplanar to the existing planar hull in 3D // this is not an efficient routine and should only be used // to add in duff (coplanar) pts at the start. // it should not be called in doing a Delaunay triangulation // of a 2D set raised into 3D. void add_coplanar (std::vector& pts, std::vector& hull, int id) { int numh = (int) hull.size(); float er, ec, ez; for (int k = 0; k < numh; k++) { //find vizible edges. from external edges. if (hull[k].c == hull[hull[k].ab].c) { // -> ab is an external edge. // test this edge for visibility from new point pts[id]. int A = hull[k].a; int B = hull[k].b; int C = hull[k].c; int zot = cross_test (pts, A, B, C, id, er, ec, ez); if (zot < 0) { // visible edge facet, create 2 new hull plates. Tri up, down; up.keep = 2; up.id = (int) hull.size(); up.a = id; up.b = A; up.c = B; up.er = er; up.ec = ec; up.ez = ez; up.ab = -1; up.ac = -1; down.keep = 2; down.id = (int) hull.size() + 1; down.a = id; down.b = A; down.c = B; down.ab = -1; down.ac = -1; down.er = -er; down.ec = -ec; down.ez = -ez; float xx = hull[k].er * er + hull[k].ec * ec + hull[k].ez * ez; if (xx > 0) { up.bc = k; down.bc = hull[k].ab; hull[k].ab = up.id; hull[down.bc].ab = down.id; } else { down.bc = k; up.bc = hull[k].ab; hull[k].ab = down.id; hull[up.bc].ab = up.id; } hull.push_back (up); hull.push_back (down); } } if (hull[k].a == hull[hull[k].bc].a) { // bc is an external edge. // test this edge for visibility from new point pts[id]. int A = hull[k].b; int B = hull[k].c; int C = hull[k].a; int zot = cross_test (pts, A, B, C, id, er, ec, ez); if (zot < 0) { // visible edge facet, create 2 new hull plates. Tri up, down; up.keep = 2; up.id = (int) hull.size(); up.a = id; up.b = A; up.c = B; up.er = er; up.ec = ec; up.ez = ez; up.ab = -1; up.ac = -1; down.keep = 2; down.id = (int) hull.size() + 1; down.a = id; down.b = A; down.c = B; down.ab = -1; down.ac = -1; down.er = -er; down.ec = -ec; down.ez = -ez; float xx = hull[k].er * er + hull[k].ec * ec + hull[k].ez * ez; if (xx > 0) { up.bc = k; down.bc = hull[k].bc; hull[k].bc = up.id; hull[down.bc].bc = down.id; } else { down.bc = k; up.bc = hull[k].bc; hull[k].bc = down.id; hull[up.bc].bc = up.id; } hull.push_back (up); hull.push_back (down); } } if (hull[k].b == hull[hull[k].ac].b) { // ac is an external edge. // test this edge for visibility from new point pts[id]. int A = hull[k].a; int B = hull[k].c; int C = hull[k].b; int zot = cross_test (pts, A, B, C, id, er, ec, ez); if (zot < 0) { // visible edge facet, create 2 new hull plates. Tri up, down; up.keep = 2; up.id = (int) hull.size(); up.a = id; up.b = A; up.c = B; up.er = er; up.ec = ec; up.ez = ez; up.ab = -1; up.ac = -1; down.keep = 2; down.id = (int) hull.size() + 1; down.a = id; down.b = A; down.c = B; down.ab = -1; down.ac = -1; down.er = -er; down.ec = -ec; down.ez = -ez; float xx = hull[k].er * er + hull[k].ec * ec + hull[k].ez * ez; if (xx > 0) { up.bc = k; down.bc = hull[k].ac; hull[k].ac = up.id; hull[down.bc].ac = down.id; } else { down.bc = k; up.bc = hull[k].ac; hull[k].ac = down.id; hull[up.bc].ac = up.id; } hull.push_back (up); hull.push_back (down); } } } // fix up the non asigned hull adjecencies (correctly). int numN = (int) hull.size(); std::vector norts; Snork snort; for (int q = numN - 1; q >= numh; q--) { if (hull[q].keep > 1) { snort.id = q; snort.a = hull[q].b; snort.b = 1; norts.push_back (snort); snort.a = hull[q].c; snort.b = 0; norts.push_back (snort); hull[q].keep = 1; } } sort (norts.begin(), norts.end()); int nums = (int) norts.size(); Snork snor; snor.id = -1; snor.a = -1; snor.b = -1; norts.push_back (snor); snor.id = -2; snor.a = -2; snor.b = -2; norts.push_back (snor); if (nums >= 2) { for (int s = 0; s < nums - 1; s++) { if (norts[s].a == norts[s + 1].a) { // link triangle sides. if (norts[s].a != norts[s + 2].a) { // edge of figure case if (norts[s].b == 1) { hull[norts[s].id].ab = norts[s + 1].id; } else { hull[norts[s].id].ac = norts[s + 1].id; } if (norts[s + 1].b == 1) { hull[norts[s + 1].id].ab = norts[s].id; } else { hull[norts[s + 1].id].ac = norts[s].id; } s++; } else { // internal figure boundary 4 junction case. int s1 = s + 1, s2 = s + 2, s3 = s + 3; int id = norts[s].id; int id1 = norts[s1].id; int id2 = norts[s2].id; int id3 = norts[s3].id; // check normal directions of id and id1..3 float barf = hull[id].er * hull[id1].er + hull[id].ec * hull[id1].ec + hull[id].ez * hull[id1].ez; if (barf > 0) { } else { barf = hull[id].er * hull[id2].er + hull[id].ec * hull[id2].ec + hull[id].ez * hull[id2].ez; if (barf > 0) { int tmp = id2; id2 = id1; id1 = tmp; tmp = s2; s2 = s1; s1 = tmp; } else { barf = hull[id].er * hull[id3].er + hull[id].ec * hull[id3].ec + hull[id].ez * hull[id3].ez; if (barf > 0) { int tmp = id3; id3 = id1; id1 = tmp; tmp = s3; s3 = s1; s1 = tmp; } } } if (norts[s].b == 1) { hull[norts[s].id].ab = norts[s1].id; } else { hull[norts[s].id].ac = norts[s1].id; } if (norts[s1].b == 1) { hull[norts[s1].id].ab = norts[s].id; } else { hull[norts[s1].id].ac = norts[s].id; } // use s2 and s3 if (norts[s2].b == 1) { hull[norts[s2].id].ab = norts[s3].id; } else { hull[norts[s2].id].ac = norts[s3].id; } if (norts[s3].b == 1) { hull[norts[s3].id].ab = norts[s2].id; } else { hull[norts[s3].id].ac = norts[s2].id; } s += 3; } } } } return; } // cross product relative sign test. // remmebers the cross product of (ab x cx) int cross_test (std::vector& pts, int A, int B, int C, int X, float& er, float& ec, float& ez) { float Ar = pts[A].x; float Ac = pts[A].y; float Az = pts[A].z; float Br = pts[B].x; float Bc = pts[B].y; float Bz = pts[B].z; float Cr = pts[C].x; float Cc = pts[C].y; float Cz = pts[C].z; float Xr = pts[X].x; float Xc = pts[X].y; float Xz = pts[X].z; float ABr = Br - Ar; float ABc = Bc - Ac; float ABz = Bz - Az; float ACr = Cr - Ar; float ACc = Cc - Ac; float ACz = Cz - Az; float AXr = Xr - Ar; float AXc = Xc - Ac; float AXz = Xz - Az; er = (ABc * AXz - ABz * AXc); ec = -(ABr * AXz - ABz * AXr); ez = (ABr * AXc - ABc * AXr); float kr = (ABc * ACz - ABz * ACc); float kc = -(ABr * ACz - ABz * ACr); float kz = (ABr * ACc - ABc * ACr); // look at sign of (ab x ac).(ab x ax) float globit = kr * er + kc * ec + kz * ez; if (globit > 0) return (1); if (globit == 0) return (0); return (-1); } /* routine to reuse non-visible triangles after the sweephull has passed. should use a lot less memory. */ int init_hull3D_compact (std::vector& pts, std::vector& hull) { int nump = (int) pts.size(); std::vector norts; hull.reserve (nump * 2); // keep track of covered (dead) triangles. std::vector Dlist; for (int d = 0; d < 64; d++) { Dlist.push_back (-1); } int numD = 64; // number of dead triangle slots. int D_idx = -1; // index to next dead triangle slot to be retuned to use. // keep track of last triangles added. std::vector Tlast; for (int d = 0; d < 64; d++) { Tlast.push_back (-1); } int numL = 64; // number slots. int L_idx = -1; // keep track of covered (dead) triangles. std::vector Xout; for (int d = 0; d < 64; d++) { Xout.push_back (-1); } //int numX = 64; // number of dead triangle slots. //int X_idx = -1; // index to next dead triangle slot to be retuned to use. float mr = 0, mc = 0, mz = 0; float Mr = 0, Mc = 0, Mz = 0; Tri T1 (0, 1, 2); float r0 = pts[0].x, c0 = pts[0].y, z0 = pts[0].z; float r1 = pts[1].x, c1 = pts[1].y, z1 = pts[1].z; float r2 = pts[2].x, c2 = pts[2].y, z2 = pts[2].z; Mr = r0 + r1 + r2; Mc = c0 + c1 + c2; Mz = z0 + z1 + z2; // check for colinearity float r01 = r1 - r0, r02 = r2 - r0; float c01 = c1 - c0, c02 = c2 - c0; float z01 = z1 - z0, z02 = z2 - z0; float e0 = c01 * z02 - c02 * z01; float e1 = -r01 * z02 + r02 * z01; float e2 = r01 * c02 - r02 * c01; if (e0 == 0 && e1 == 0 && e2 == 0) { // do not add a facet. cerr << "stop fucking me around and give me a valid opening facet, you tit. " << endl; return (-1); } T1.id = 0; T1.er = e0; T1.ec = e1; T1.ez = e2; T1.ab = 1; // adjacent facet id number T1.ac = 1; T1.bc = 1; hull.push_back (T1); T1.id = 1; T1.er = -e0; T1.ec = -e1; T1.ez = -e2; T1.ab = 0; T1.ac = 0; T1.bc = 0; hull.push_back (T1); std::vector xlist; Tri Tnew; for (int p = 3; p < nump; p++) { // add points until a non coplanar set of points is achieved. R3& pt = pts[p]; Mr += pt.x; mr = Mr / (p + 1); Mc += pt.y; mc = Mc / (p + 1); Mz += pt.z; mz = Mz / (p + 1); // find the first visible plane. int numh = (int) hull.size(); int hvis = -1; float r = pt.x; float c = pt.y; float z = pt.z; xlist.clear(); if (L_idx >= 0) { for (int L = L_idx; L >= 0; L--) { int h = Tlast[L]; Tri& t = hull[h]; float R1 = pts[t.a].x; float C1 = pts[t.a].y; float Z1 = pts[t.a].z; float dr = r - R1; float dc = c - C1; float dz = z - Z1; float d = dr * t.er + dc * t.ec + dz * t.ez; if (d > 0) { hvis = h; hull[h].keep = 0; xlist.push_back (hvis); // cerr << "y" ; break; } } } if (hvis <= 0) { for (int h = numh - 1; h >= 0; h--) { Tri& t = hull[h]; float R1 = pts[t.a].x; float C1 = pts[t.a].y; float Z1 = pts[t.a].z; float dr = r - R1; float dc = c - C1; float dz = z - Z1; float d = dr * t.er + dc * t.ec + dz * t.ez; if (d > 0 && hull[h].keep > 0) { hvis = h; hull[h].keep = 0; xlist.push_back (hvis); //cerr << "n" ; break; } } } if (hvis < 0) { add_coplanar (pts, hull, p); } if (hvis >= 0) { L_idx = -1; // new triangular facets are formed from neighbouring invisible planes. //int numh = (int) hull.size(); int numx = (int) xlist.size(); for (int x = 0; x < numx; x++) { int xid = xlist[x]; int ab = hull[xid].ab; // facet adjacent to line ab Tri& tAB = hull[ab]; float R1 = pts[tAB.a].x; // point on next triangle float C1 = pts[tAB.a].y; float Z1 = pts[tAB.a].z; float dr = r - R1; float dc = c - C1; float dz = z - Z1; float d = dr * tAB.er + dc * tAB.ec + dz * tAB.ez; if (d > 0) { // add to xlist. if (hull[ab].keep == 1) { hull[ab].keep = 0; xlist.push_back (ab); numx++; } } else { // spawn a new triangle. Tnew.keep = 2; Tnew.a = p; Tnew.b = hull[xid].a; Tnew.c = hull[xid].b; Tnew.ab = -1; Tnew.ac = -1; Tnew.bc = ab; // make normal vector. float dr1 = pts[Tnew.a].x - pts[Tnew.b].x, dr2 = pts[Tnew.a].x - pts[Tnew.c].x; float dc1 = pts[Tnew.a].y - pts[Tnew.b].y, dc2 = pts[Tnew.a].y - pts[Tnew.c].y; float dz1 = pts[Tnew.a].z - pts[Tnew.b].z, dz2 = pts[Tnew.a].z - pts[Tnew.c].z; float er = (dc1 * dz2 - dc2 * dz1); float ec = -(dr1 * dz2 - dr2 * dz1); float ez = (dr1 * dc2 - dr2 * dc1); dr = mr - r; // points from new facet towards [mr,mc,mz] dc = mc - c; dz = mz - z; // make it point outwards. float dromadery = dr * er + dc * ec + dz * ez; if (dromadery > 0) { Tnew.er = -er; Tnew.ec = -ec; Tnew.ez = -ez; } else { Tnew.er = er; Tnew.ec = ec; Tnew.ez = ez; } // try to reuse a Dead triangle. int new_flag = 1, H_idx = (int) hull.size(); if (D_idx >= 0) { H_idx = Dlist[D_idx]; D_idx--; new_flag = -1; } Tnew.id = H_idx; // update the touching triangle tAB int A = hull[xid].a, B = hull[xid].b; if ((tAB.a == A && tAB.b == B) || (tAB.a == B && tAB.b == A)) { tAB.ab = H_idx; } else if ((tAB.a == A && tAB.c == B) || (tAB.a == B && tAB.c == A)) { tAB.ac = H_idx; } else if ((tAB.b == A && tAB.c == B) || (tAB.b == B && tAB.c == A)) { tAB.bc = H_idx; } else { cerr << "Oh crap, the di-lithium crystals are fucked!" << endl; return (-1); } L_idx++; if (L_idx < numL) { Tlast[L_idx] = H_idx; } else { Tlast.push_back (H_idx); } if (new_flag > 0) { hull.push_back (Tnew); } else { hull[H_idx] = Tnew; } } // second side of the struck out triangle int ac = hull[xid].ac; // facet adjacent to line ac if (ac == -1) // quick fix return -1; Tri& tAC = hull[ac]; R1 = pts[tAC.a].x; // point on next triangle C1 = pts[tAC.a].y; Z1 = pts[tAC.a].z; dr = r - R1; dc = c - C1; dz = z - Z1; d = dr * tAC.er + dc * tAC.ec + dz * tAC.ez; if (d > 0) { // add to xlist. if (hull[ac].keep == 1) { hull[ac].keep = 0; xlist.push_back (ac); numx++; } } else { // spawn a new triangle. //Tnew.id = (int) hull.size(); Tnew.keep = 2; Tnew.a = p; Tnew.b = hull[xid].a; Tnew.c = hull[xid].c; Tnew.ab = -1; Tnew.ac = -1; Tnew.bc = ac; // make normal vector. float dr1 = pts[Tnew.a].x - pts[Tnew.b].x, dr2 = pts[Tnew.a].x - pts[Tnew.c].x; float dc1 = pts[Tnew.a].y - pts[Tnew.b].y, dc2 = pts[Tnew.a].y - pts[Tnew.c].y; float dz1 = pts[Tnew.a].z - pts[Tnew.b].z, dz2 = pts[Tnew.a].z - pts[Tnew.c].z; float er = (dc1 * dz2 - dc2 * dz1); float ec = -(dr1 * dz2 - dr2 * dz1); float ez = (dr1 * dc2 - dr2 * dc1); dr = mr - r; // points from new facet towards [mr,mc,mz] dc = mc - c; dz = mz - z; // make it point outwards. float dromadery = dr * er + dc * ec + dz * ez; if (dromadery > 0) { Tnew.er = -er; Tnew.ec = -ec; Tnew.ez = -ez; } else { Tnew.er = er; Tnew.ec = ec; Tnew.ez = ez; } // try to reuse a Dead triangle. int new_flag = 1, H_idx = (int) hull.size(); if (D_idx >= 0) { H_idx = Dlist[D_idx]; D_idx--; new_flag = -1; } Tnew.id = H_idx; // update the touching triangle tAC int A = hull[xid].a, C = hull[xid].c; if ((tAC.a == A && tAC.b == C) || (tAC.a == C && tAC.b == A)) { tAC.ab = H_idx; } else if ((tAC.a == A && tAC.c == C) || (tAC.a == C && tAC.c == A)) { tAC.ac = H_idx; } else if ((tAC.b == A && tAC.c == C) || (tAC.b == C && tAC.c == A)) { tAC.bc = H_idx; } else { cerr << "Oh crap, warp drive failure, dude!" << endl; return (-1); } L_idx++; if (L_idx < numL) { Tlast[L_idx] = H_idx; } else { Tlast.push_back (H_idx); } if (new_flag > 0) { hull.push_back (Tnew); } else { hull[H_idx] = Tnew; } //hull.push_back(Tnew); } // third side of the struck out triangle int bc = hull[xid].bc; // facet adjacent to line ac Tri& tBC = hull[bc]; R1 = pts[tBC.a].x; // point on next triangle C1 = pts[tBC.a].y; Z1 = pts[tBC.a].z; dr = r - R1; dc = c - C1; dz = z - Z1; d = dr * tBC.er + dc * tBC.ec + dz * tBC.ez; if (d > 0) { // add to xlist. if (hull[bc].keep == 1) { hull[bc].keep = 0; xlist.push_back (bc); numx++; } } else { // spawn a new triangle. // Tnew.id = (int) hull.size(); Tnew.keep = 2; Tnew.a = p; Tnew.b = hull[xid].b; Tnew.c = hull[xid].c; Tnew.ab = -1; Tnew.ac = -1; Tnew.bc = bc; // make normal vector. float dr1 = pts[Tnew.a].x - pts[Tnew.b].x, dr2 = pts[Tnew.a].x - pts[Tnew.c].x; float dc1 = pts[Tnew.a].y - pts[Tnew.b].y, dc2 = pts[Tnew.a].y - pts[Tnew.c].y; float dz1 = pts[Tnew.a].z - pts[Tnew.b].z, dz2 = pts[Tnew.a].z - pts[Tnew.c].z; float er = (dc1 * dz2 - dc2 * dz1); float ec = -(dr1 * dz2 - dr2 * dz1); float ez = (dr1 * dc2 - dr2 * dc1); dr = mr - r; // points from new facet towards [mr,mc,mz] dc = mc - c; dz = mz - z; // make it point outwards. float dromadery = dr * er + dc * ec + dz * ez; if (dromadery > 0) { Tnew.er = -er; Tnew.ec = -ec; Tnew.ez = -ez; } else { Tnew.er = er; Tnew.ec = ec; Tnew.ez = ez; } // try to reuse a Dead triangle. int new_flag = 1, H_idx = (int) hull.size(); if (D_idx >= 0) { H_idx = Dlist[D_idx]; D_idx--; new_flag = -1; } Tnew.id = H_idx; // update the touching triangle tBC int B = hull[xid].b, C = hull[xid].c; if ((tBC.a == B && tBC.b == C) || (tBC.a == C && tBC.b == B)) { tBC.ab = H_idx; } else if ((tBC.a == B && tBC.c == C) || (tBC.a == C && tBC.c == B)) { tBC.ac = H_idx; } else if ((tBC.b == B && tBC.c == C) || (tBC.b == C && tBC.c == B)) { tBC.bc = H_idx; } else { cerr << "Oh crap, rocket engine failure" << endl; return (-1); } L_idx++; if (L_idx < numL) { Tlast[L_idx] = H_idx; } else { Tlast.push_back (H_idx); } if (new_flag > 0) { hull.push_back (Tnew); } else { hull[H_idx] = Tnew; } // hull.push_back(Tnew); } } numx = (int) xlist.size(); for (int x = 0; x < numx; x++) { // cerr << xlist[x] << " "; D_idx++; // keep track of all dead triangles. if (D_idx < numD) { Dlist[D_idx] = xlist[x]; } else { Dlist.push_back (xlist[x]); numD++; } } numx = 0; // patch up the new triangles in hull. //int numN = (int) hull.size(); //std::vector norts; int numS = (int) norts.size(); int nums = 0; Snork snort; //for( int q = numN-1; q>= numh; q--){ for (int L = L_idx; L >= 0; L--) { int q = Tlast[L]; if (hull[q].keep > 1) { if (nums < numS) { norts[nums].id = q; norts[nums].a = hull[q].b; norts[nums].b = 1; nums++; } else { snort.id = q; snort.a = hull[q].b; snort.b = 1; norts.push_back (snort); nums++; numS = (int) norts.size(); } if (nums < numS) { norts[nums].id = q; norts[nums].a = hull[q].c; norts[nums].b = 0; nums++; } else { snort.a = hull[q].c; snort.b = 0; norts.push_back (snort); nums++; numS = (int) norts.size(); } hull[q].keep = 1; } } sort (norts.begin(), norts.begin() + nums); // int nums = (int) norts.size(); if (nums >= 2) { for (int s = 0; s < nums - 1; s++) { if (norts[s].a == norts[s + 1].a) { // link triangle sides. if (norts[s].b == 1) { hull[norts[s].id].ab = norts[s + 1].id; } else { hull[norts[s].id].ac = norts[s + 1].id; } if (norts[s + 1].b == 1) { hull[norts[s + 1].id].ab = norts[s].id; } else { hull[norts[s + 1].id].ac = norts[s].id; } } } } } /*else{ cerr << "still in the coplanar state you fucking baboon..." << endl; // rather complicated and need to add points to the 2D-hull as two faced triangles. exit(0); }*/ //cerr << D_idx << " " ; } cerr << "max triangles used " << hull.size() << endl; return (0); } ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/NewtonApple/NewtonApple_hull3D.hIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/resources/NewtonApple/NewtonApple_hu0000664002537200253720000000762115257173642031756 0ustar zmoelnigzmoelnig#ifndef _structures_h #define _structures_h // for FILE #include #include #include /* copyright 2017 Dr David Sinclair david@newtonapples.net all rights reserved. version of 22-mar-2017. this code is released under GPL3, a copy of the license can be found at http://www.gnu.org/licenses/gpl-3.0.html you can purchase a un-restricted license from http://newtonapples.net where algorithm details are explained. If you do choose to purchase a license you might also like Newton Apple Chocolates!, the cleverest chocolates on the Internet. */ struct Tri { int id, keep; int a, b, c; int ab, bc, ac; // adjacent edges index to neighbouring triangle. float er, ec, ez; // visible normal to triangular facet. Tri() {} Tri (int x, int y, int q) : id (0), keep (1), a (x), b (y), c (q), ab (-1), bc (-1), ac (-1), er (0), ec (0), ez (0) { } Tri (const Tri& p) : id (p.id), keep (p.keep), a (p.a), b (p.b), c (p.c), ab (p.ab), bc (p.bc), ac (p.ac), er (p.er), ec (p.ec), ez (p.ez) { } Tri& operator= (const Tri& p) { id = p.id; keep = p.keep; a = p.a; b = p.b; c = p.c; ab = p.ab; bc = p.bc; ac = p.ac; er = p.er; ec = p.ec; ez = p.ez; return *this; } }; struct R3 { int id, lspNum, realLspNum = -1; float x, y, z; float azimuth, elevation, radius; bool isImaginary; float gain; int channel = -1; R3() {} R3 (float xc, float yc, float zc) : id (-1), x (xc), y (yc), z (zc) {} R3 (const R3& p) : id (p.id), lspNum (p.lspNum), realLspNum (p.realLspNum), x (p.x), y (p.y), z (p.z), azimuth (p.azimuth), elevation (p.elevation), radius (p.radius), isImaginary (p.isImaginary), gain (p.gain), channel (p.channel) { } R3& operator= (const R3& p) { lspNum = p.lspNum; realLspNum = p.realLspNum; isImaginary = p.isImaginary; channel = p.channel; gain = p.gain; azimuth = p.azimuth; elevation = p.elevation; radius = p.radius; id = p.id; x = p.x; y = p.y; z = p.z; return *this; } }; // sort into descending order (for use in corner response ranking). inline bool operator< (const R3& a, const R3& b) { if (a.z == b.z) { if (a.x == b.x) { return a.y < b.y; } return a.x < b.x; } return a.z < b.z; } struct Snork { int id; int a, b; Snork() : id (-1), a (0), b (0) {} Snork (int i, int r, int x) : id (i), a (r), b (x) {} Snork (const Snork& p) : id (p.id), a (p.a), b (p.b) {} Snork& operator= (const Snork& p) { id = p.id; a = p.a; b = p.b; return *this; } }; // sort into descending order (for use in corner response ranking). inline bool operator< (const Snork& a, const Snork& b) { if (a.a == b.a) { return a.b < b.b; } return a.a < b.a; } // from NewtonApple_hull3D.cpp int read_R3 (std::vector& pts, char* fname); void write_R3 (std::vector& pts, char* fname); void write_Tris (std::vector& ts, char* fname); int de_duplicateR3 (std::vector& pts, std::vector& outx, std::vector& pts2); int NewtonApple_Delaunay (std::vector& pts, std::vector& hulk); int NewtonApple_hull_3D (std::vector& pts, std::vector& hull); int init_hull3D (std::vector& pts, std::vector& hull); void add_coplanar (std::vector& pts, std::vector& hull, int id); int cross_test (std::vector& pts, int A, int B, int C, int X, float& er, float& ec, float& ez); int init_hull3D_compact (std::vector& pts, std::vector& hull); #endif IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/CMakeLists.txt0000664002537200253720000002446015257173642025375 0ustar zmoelnigzmoelnigcmake_minimum_required (VERSION 3.22 FATAL_ERROR) include(CheckIncludeFiles) # _____ ______ __ __ _____ _ _ _____ _ _ # |_ _| ____| \/ | | __ \| | (_) / ____| (_) | # | | | |__ | \ / | | |__) | |_ _ __ _ _ _ __ | (___ _ _ _| |_ ___ # | | | __| | |\/| | | ___/| | | | |/ _` |______| | '_ \ \___ \| | | | | __/ _ \ # _| |_| |____| | | | | | | | |_| | (_| |______| | | | | ____) | |_| | | || __/ # |_____|______|_| |_| |_| |_|\__,_|\__, | |_|_| |_| |_____/ \__,_|_|\__\___| # __/ | # |___/ # The following list will hold all the plug-ins which will be built. # Simply comment them out if you want to build only a subset of the plug-ins. set (PLUGINS_TO_BUILD AllRADecoder BinauralDecoder CoordinateConverter DirectionalCompressor DirectivityShaper DistanceCompensator DualDelay EnergyVisualizer FdnReverb GranularEncoder MatrixMultiplier MultiBandCompressor MultiEncoder MultiEQ OmniCompressor ProbeDecoder RoomEncoder SceneRotator SimpleDecoder StereoEncoder ToolBox ) # The following options let you select the plug-ins formats you want to build. # You can either change them here or use the command line to switch them on/off. option (IEM_USE_SYSTEM_JUCE "Use JUCE found via CMake rather than the bundled one." OFF) option (IEM_BUILD_VST2 "Build VST2 version of the plug-ins." OFF) option (IEM_BUILD_VST3 "Build VST3 version of the plug-ins." OFF) option (IEM_BUILD_LV2 "Build LV2 version of the plug-ins." OFF) option (IEM_BUILD_AAX "Build AAX version of the plug-ins." OFF) option (IEM_BUILD_STANDALONE "Build standalones of the plug-ins." ON) option (IEM_STANDALONE_JACK_SUPPORT "Build standalones with JACK support." ON) include (Versions.cmake) set (IEM_POST_BUILD_INSTALL "USER" CACHE STRING "Define if plug-ins are installed for USER, SYSTEM or if you want NO installation") set (prefix "/usr/local" CACHE STRING "Path prefix for custom installation") set (CMAKE_POSITION_INDEPENDENT_CODE ON) # Create compile_commands.json # This is useful for IDEs like CLion or Visual Studio Code set (CMAKE_EXPORT_COMPILE_COMMANDS ON) # Actual project configuration project (IEMPluginSuite VERSION ${IEMPluginSuite_VERISON} LANGUAGES C CXX) set_property (GLOBAL PROPERTY USE_FOLDERS YES) # set copy paths for built plug-ins if (IEM_POST_BUILD_INSTALL STREQUAL "NO") set_directory_properties (PROPERTIES JUCE_COPY_PLUGIN_AFTER_BUILD OFF) elseif (CMAKE_SYSTEM_NAME STREQUAL "Darwin") set_directory_properties (PROPERTIES JUCE_COPY_PLUGIN_AFTER_BUILD ON) if (IEM_POST_BUILD_INSTALL STREQUAL "SYSTEM") set (prefix "/Library/Audio/Plug-Ins") else() # Defaulting to USER set (prefix "$ENV{HOME}/Library/Audio/Plug-Ins") endif() set_directory_properties (PROPERTIES JUCE_VST_COPY_DIR "${prefix}/VST/IEM") set_directory_properties (PROPERTIES JUCE_VST3_COPY_DIR "${prefix}/VST3/IEM") set_directory_properties (PROPERTIES JUCE_LV2_COPY_DIR "${prefix}/LV2") set_directory_properties (PROPERTIES JUCE_AAX_COPY_DIR "/Library/Application Support/Avid/Audio/Plug-Ins/IEM") # TODO: I've found no references for a local AAX installation on macOS, so I need to check this elseif (CMAKE_SYSTEM_NAME STREQUAL "Windows") set_directory_properties (PROPERTIES JUCE_COPY_PLUGIN_AFTER_BUILD ON) if(MSVC) message (STATUS "MSVC detected, setting runtime library to Multi-threaded (/MT)") add_compile_options($<$:/MT> # Runtime library: Multi-threaded $<$:/MT> # Runtime library: Multi-threaded $<$:/MTd> # Runtime library: Multi-threaded Debug ) endif() if ((IEM_POST_BUILD_INSTALL STREQUAL "USER") AND (prefix STREQUAL "/usr/local")) if (IEM_BUILD_VST3 OR IEM_BUILD_VST2 OR IEM_BUILD_AAX) message (WARNING "VST, VST3 and AAX plug-ins are installed for all users by default as there is no officially supported consistent directory for local installation. Using SYSTEM for those. You can provide a costum prefix to change this behaviour.") set (IEM_POST_BUILD_INSTALL "SYSTEM") endif() set_directory_properties(PROPERTIES JUCE_LV2_COPY_DIR "$ENV{APPDATA}/LV2") endif() if (IEM_POST_BUILD_INSTALL STREQUAL "USER") set_directory_properties (PROPERTIES JUCE_VST_COPY_DIR "${prefix}/VST") set_directory_properties (PROPERTIES JUCE_VST3_COPY_DIR "${prefix}/VST3") set_directory_properties(PROPERTIES JUCE_LV2_COPY_DIR "${prefix}/LV2") set_directory_properties(PROPERTIES JUCE_AAX_COPY_DIR "${prefix}/AAX") else() # Defaulting to SYSTEM as this is the only valid path on Windows for VST and VST3 set_directory_properties(PROPERTIES JUCE_LV2_COPY_DIR "$ENV{CommonProgramFiles}/LV2") if (CMAKE_SIZEOF_VOID_P EQUAL 8) set_directory_properties (PROPERTIES JUCE_VST_COPY_DIR "$ENV{ProgramW6432}/Steinberg/VSTplugins/IEM") set_directory_properties (PROPERTIES JUCE_VST3_COPY_DIR "$ENV{CommonProgramFiles}/VST3/IEM") set_directory_properties (PROPERTIES JUCE_AAX_COPY_DIR "$ENV{CommonProgramFiles}/Avid/Audio/Plug-Ins/IEM") else() set_directory_properties (PROPERTIES JUCE_VST_COPY_DIR "$ENV{ProgramFiles(x86)}/Steinberg/Vstplugins/IEM") set_directory_properties (PROPERTIES JUCE_VST3_COPY_DIR "$ENV{CommonProgramFiles(x86)}/VST3/IEM") endif() endif() elseif ((CMAKE_SYSTEM_NAME STREQUAL "Linux") OR (CMAKE_SYSTEM_NAME MATCHES ".*BSD")) set_directory_properties (PROPERTIES JUCE_COPY_PLUGIN_AFTER_BUILD ON) if (IEM_POST_BUILD_INSTALL STREQUAL "SYSTEM") set_directory_properties (PROPERTIES JUCE_VST_COPY_DIR "${prefix}/lib/vst/IEM") set_directory_properties (PROPERTIES JUCE_VST3_COPY_DIR "${prefix}/lib/vst3/IEM") set_directory_properties (PROPERTIES JUCE_LV2_COPY_DIR "${prefix}/lib/lv2") else() # Defaulting to USER set_directory_properties (PROPERTIES JUCE_VST_COPY_DIR "$ENV{HOME}/.vst/IEM") set_directory_properties (PROPERTIES JUCE_VST3_COPY_DIR "$ENV{HOME}/.vst3/IEM") set_directory_properties (PROPERTIES JUCE_LV2_COPY_DIR "$ENV{HOME}/.lv2") endif() endif() # add JUCE dependency if (IEM_USE_SYSTEM_JUCE) set (CMAKE_WARN_DEPRECATED TRUE) message (DEPRECATION "Using a system JUCE installation may be deprecated in future releases. Please use the fetched version instead.") find_package (JUCE CONFIG REQUIRED) else() add_subdirectory (JUCE) endif() # formats set (IEM_FORMATS "") if (IEM_BUILD_VST2) SET (VST2SDKPATH "${CMAKE_CURRENT_SOURCE_DIR}/src/VST_SDK/VST2_SDK/" CACHE STRING "Path to the VST2 SDK") # checking VST2 SDK if (VST2SDKPATH STREQUAL "${CMAKE_CURRENT_SOURCE_DIR}/src/VST_SDK/VST2_SDK/") set(CMAKE_REQUIRED_INCLUDES "${VST2SDKPATH}") include(CheckIncludeFiles) CHECK_INCLUDE_FILES(pluginterfaces/vst2.x/aeffectx.h HAVE_VST2_HEADERS) IF (NOT HAVE_VST2_HEADERS) message (FATAL_ERROR "You have to specify the VST2SDKPATH variable with the path to the VST2 SDK if you want to build VST2 versions.") endif() endif() juce_set_vst2_sdk_path (${VST2SDKPATH}) list (APPEND IEM_FORMATS VST) message ("-- IEM: Building VST2 versions") endif() if (IEM_BUILD_VST3) message ("-- IEM: Building VST3 versions") list (APPEND IEM_FORMATS VST3) endif() if (IEM_BUILD_LV2) message ("-- IEM: Building LV2 versions") list (APPEND IEM_FORMATS LV2) endif() if (IEM_BUILD_AAX) message ("-- IEM: Building AAX versions") list (APPEND IEM_FORMATS AAX) endif() if (IEM_BUILD_STANDALONE) message ("-- IEM: Building Standalone versions") list (APPEND IEM_FORMATS Standalone) endif() include_directories (resources/ /usr/local/include) add_compile_definitions (DONT_SET_USING_JUCE_NAMESPACE=1 JUCE_MODAL_LOOPS_PERMITTED=1) # Disable HarfBuzz's color glyph painting (COLRv1). When built against FreeType >= 2.13, it # references FT_Get_Color_Glyph_Paint & co., which are missing in older FreeType versions # bundled with some hosts (e.g. Ardour), causing the plug-ins to fail loading. if (CMAKE_SYSTEM_NAME STREQUAL "Linux") add_compile_definitions (HB_NO_PAINT=1) endif() juce_add_binary_data (LAF_fonts SOURCES resources/lookAndFeel/Roboto-Bold.ttf resources/lookAndFeel/Roboto-Light.ttf resources/lookAndFeel/Roboto-Medium.ttf resources/lookAndFeel/Roboto-Regular.ttf) juce_add_binary_data (IEM_logo HEADER_NAME "IEMLogo.h" NAMESPACE "IEMLogo" SOURCES resources/Standalone/IEMPluginSuiteSmall.png) foreach (subproject IN LISTS PLUGINS_TO_BUILD) add_subdirectory (${subproject}) endforeach() # link fftw if necessary, only needed by BinauralDecoder, and not on macOS if (BinauralDecoder IN_LIST PLUGINS_TO_BUILD AND NOT CMAKE_SYSTEM_NAME STREQUAL "Darwin") if (CMAKE_SYSTEM_NAME STREQUAL "Windows") # build fftw3f on windows set (BUILD_SHARED_LIBS OFF) set (BUILD_TESTS OFF) set (ENABLE_FLOAT ON) set (ENABLE_SSE ON) set(CMAKE_POLICY_DEFAULT_CMP0077 NEW) add_subdirectory (fftw) set_target_properties ("fftw3f" PROPERTIES POSITION_INDEPENDET_CODE ON) endif() if (IEM_FORMATS) target_compile_definitions ("BinauralDecoder" PUBLIC JUCE_DSP_USE_STATIC_FFTW=1) target_link_libraries ("BinauralDecoder" PRIVATE fftw3f) endif() endif() if (IEM_BUILD_STANDALONE) foreach (subproject IN LISTS PLUGINS_TO_BUILD) target_sources(${subproject} PRIVATE resources/Standalone/StandaloneApp.cpp resources/Standalone/MyStandaloneFilterWindow.h resources/Standalone/IEM_JackAudio.h resources/Standalone/IEM_AudioDeviceSelectorComponent.cpp resources/Standalone/IEM_AudioDeviceSelectorComponent.h) endforeach() if (NOT IEM_STANDALONE_JACK_SUPPORT) foreach (subproject IN LISTS PLUGINS_TO_BUILD) target_compile_definitions(${subproject} PUBLIC DONT_BUILD_WITH_JACK_SUPPORT=1) endforeach() endif() endif() IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/StereoEncoder/0000775002537200253720000000000015257173642025370 5ustar zmoelnigzmoelnigIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/StereoEncoder/Source/0000775002537200253720000000000015257173642026630 5ustar zmoelnigzmoelnig././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/StereoEncoder/Source/PluginProcessor.cppIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/StereoEncoder/Source/PluginProcessor0000664002537200253720000005532715257173642031725 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #include "PluginProcessor.h" #include "PluginEditor.h" //============================================================================== StereoEncoderAudioProcessor::StereoEncoderAudioProcessor() : AudioProcessorBase ( #ifndef JucePlugin_PreferredChannelConfigurations BusesProperties() #if ! JucePlugin_IsMidiEffect #if ! JucePlugin_IsSynth .withInput ("Input", juce::AudioChannelSet::stereo(), true) #endif .withOutput ("Output", ((juce::PluginHostType::getPluginLoadedAs() == juce::AudioProcessor::wrapperType_VST3) ? juce::AudioChannelSet::ambisonic (1) : juce::AudioChannelSet::ambisonic (7)), true) #endif , #endif createParameterLayout()), posC (1.0f, 0.0f, 0.0f), posL (1.0f, 0.0f, 0.0f), posR (1.0f, 0.0f, 0.0f), updatedPositionData (true) { parameters.addParameterListener ("qw", this); parameters.addParameterListener ("qx", this); parameters.addParameterListener ("qy", this); parameters.addParameterListener ("qz", this); parameters.addParameterListener ("azimuth", this); parameters.addParameterListener ("elevation", this); parameters.addParameterListener ("roll", this); parameters.addParameterListener ("width", this); parameters.addParameterListener ("orderSetting", this); parameters.addParameterListener ("useSN3D", this); orderSetting = parameters.getRawParameterValue ("orderSetting"); useSN3D = parameters.getRawParameterValue ("useSN3D"); qw = parameters.getRawParameterValue ("qw"); qx = parameters.getRawParameterValue ("qx"); qy = parameters.getRawParameterValue ("qy"); qz = parameters.getRawParameterValue ("qz"); azimuth = parameters.getRawParameterValue ("azimuth"); elevation = parameters.getRawParameterValue ("elevation"); roll = parameters.getRawParameterValue ("roll"); width = parameters.getRawParameterValue ("width"); highQuality = parameters.getRawParameterValue ("highQuality"); processorUpdatingParams = false; sphericalInput = true; //input from ypr juce::FloatVectorOperations::clear (SHL, 64); juce::FloatVectorOperations::clear (SHR, 64); } StereoEncoderAudioProcessor::~StereoEncoderAudioProcessor() = default; //============================================================================== int StereoEncoderAudioProcessor::getNumPrograms() { return 1; // NB: some hosts don't cope very well if you tell them there are 0 programs, // so this should be at least 1, even if you're not really implementing programs. } int StereoEncoderAudioProcessor::getCurrentProgram() { return 0; } void StereoEncoderAudioProcessor::setCurrentProgram (int index) { } const juce::String StereoEncoderAudioProcessor::getProgramName (int index) { return juce::String(); } void StereoEncoderAudioProcessor::changeProgramName (int index, const juce::String& newName) { } //============================================================================== void StereoEncoderAudioProcessor::prepareToPlay (double sampleRate, int samplesPerBlock) { checkInputAndOutput (this, 2, *orderSetting, true); bufferCopy.setSize (2, samplesPerBlock); smoothAzimuthL.setCurrentAndTargetValue (*azimuth / 180.0f * juce::MathConstants::pi); smoothElevationL.setCurrentAndTargetValue (*elevation / 180.0f * juce::MathConstants::pi); smoothAzimuthR.setCurrentAndTargetValue (*azimuth / 180.0f * juce::MathConstants::pi); smoothElevationR.setCurrentAndTargetValue (*elevation / 180.0f * juce::MathConstants::pi); smoothAzimuthL.reset (1, samplesPerBlock); smoothElevationL.reset (1, samplesPerBlock); smoothAzimuthR.reset (1, samplesPerBlock); smoothElevationR.reset (1, samplesPerBlock); const float widthInRadiansQuarter { Conversions::degreesToRadians (*width) / 4.0f }; const iem::Quaternion quatLRot { iem::Quaternion (cos (widthInRadiansQuarter), 0.0f, 0.0f, sin (widthInRadiansQuarter)) }; const iem::Quaternion quatL = quaternionDirection * quatLRot; const iem::Quaternion quatR = quaternionDirection * quatLRot.getConjugate(); const auto left = quatL.getCartesian(); const auto right = quatR.getCartesian(); SHEval (7, left, _SHL); SHEval (7, right, _SHR); positionHasChanged = true; // just to be sure } void StereoEncoderAudioProcessor::releaseResources() { // When playback stops, you can use this as an opportunity to free up any // spare memory, etc. } inline void StereoEncoderAudioProcessor::updateQuaternions() { float ypr[3]; ypr[0] = Conversions::degreesToRadians (*azimuth); ypr[1] = -Conversions::degreesToRadians (*elevation); // pitch ypr[2] = Conversions::degreesToRadians (*roll); //updating not active params quaternionDirection.fromYPR (ypr); processorUpdatingParams = true; parameters.getParameter ("qw")->setValueNotifyingHost ( parameters.getParameterRange ("qw").convertTo0to1 (quaternionDirection.w)); parameters.getParameter ("qx")->setValueNotifyingHost ( parameters.getParameterRange ("qx").convertTo0to1 (quaternionDirection.x)); parameters.getParameter ("qy")->setValueNotifyingHost ( parameters.getParameterRange ("qy").convertTo0to1 (quaternionDirection.y)); parameters.getParameter ("qz")->setValueNotifyingHost ( parameters.getParameterRange ("qz").convertTo0to1 (quaternionDirection.z)); processorUpdatingParams = false; } void StereoEncoderAudioProcessor::updateEuler() { float ypr[3]; quaternionDirection = iem::Quaternion (*qw, *qx, *qy, *qz); quaternionDirection.normalize(); quaternionDirection.toYPR (ypr); //updating not active params processorUpdatingParams = true; parameters.getParameter ("azimuth")->setValueNotifyingHost ( parameters.getParameterRange ("azimuth").convertTo0to1 ( Conversions::radiansToDegrees (ypr[0]))); parameters.getParameter ("elevation") ->setValueNotifyingHost ( parameters.getParameterRange ("elevation") .convertTo0to1 (-Conversions::radiansToDegrees (ypr[1]))); parameters.getParameter ("roll")->setValueNotifyingHost ( parameters.getParameterRange ("roll").convertTo0to1 ( Conversions::radiansToDegrees (ypr[2]))); processorUpdatingParams = false; } void StereoEncoderAudioProcessor::processBlock (juce::AudioBuffer& buffer, juce::MidiBuffer& midiMessages) { checkInputAndOutput (this, 2, *orderSetting); const int L = buffer.getNumSamples(); const int totalNumInputChannels = getTotalNumInputChannels() < 2 ? 1 : 2; const int ambisonicOrder = *orderSetting < 0.5f ? output.getOrder() : juce::roundToInt (orderSetting->load()) - 1; const int nChOut = juce::jmin (buffer.getNumChannels(), juce::square (ambisonicOrder + 1)); for (int i = 0; i < totalNumInputChannels; ++i) bufferCopy.copyFrom (i, 0, buffer.getReadPointer (i), buffer.getNumSamples()); buffer.clear(); const float widthInRadiansQuarter { Conversions::degreesToRadians (*width) / 4.0f }; const iem::Quaternion quatLRot { iem::Quaternion (cos (widthInRadiansQuarter), 0.0f, 0.0f, sin (widthInRadiansQuarter)) }; const iem::Quaternion quatL = quaternionDirection * quatLRot; const iem::Quaternion quatR = quaternionDirection * quatLRot.getConjugate(); const auto left = quatL.getCartesian(); const auto right = quatR.getCartesian(); //conversion to spherical for high-quality mode float azimuthL, azimuthR, elevationL, elevationR; Conversions::cartesianToSpherical (left, azimuthL, elevationL); Conversions::cartesianToSpherical (right, azimuthR, elevationR); if (*highQuality < 0.5f) // no high-quality { if (positionHasChanged.compareAndSetBool (false, true)) { smoothAzimuthL.setCurrentAndTargetValue (azimuthL); smoothElevationL.setCurrentAndTargetValue (elevationL); smoothAzimuthR.setCurrentAndTargetValue (azimuthR); smoothElevationR.setCurrentAndTargetValue (elevationR); SHEval (ambisonicOrder, left.x, left.y, left.z, SHL); SHEval (ambisonicOrder, right.x, right.y, right.z, SHR); if (*useSN3D > 0.5f) { juce::FloatVectorOperations::multiply (SHL, SHL, n3d2sn3d, nChOut); juce::FloatVectorOperations::multiply (SHR, SHR, n3d2sn3d, nChOut); } } const float* leftIn = bufferCopy.getReadPointer (0); const float* rightIn = bufferCopy.getReadPointer (1); for (int i = 0; i < nChOut; ++i) { buffer.copyFromWithRamp (i, 0, leftIn, buffer.getNumSamples(), _SHL[i], SHL[i]); buffer.addFromWithRamp (i, 0, rightIn, buffer.getNumSamples(), _SHR[i], SHR[i]); } } else // high-quality sampling { if (smoothAzimuthL.getTargetValue() - azimuthL > juce::MathConstants::pi) smoothAzimuthL.setCurrentAndTargetValue (smoothAzimuthL.getTargetValue() - 2.0f * juce::MathConstants::pi); else if (azimuthL - smoothAzimuthL.getTargetValue() > juce::MathConstants::pi) smoothAzimuthL.setCurrentAndTargetValue (smoothAzimuthL.getTargetValue() + 2.0f * juce::MathConstants::pi); if (smoothElevationL.getTargetValue() - elevationL > juce::MathConstants::pi) smoothElevationL.setCurrentAndTargetValue (smoothElevationL.getTargetValue() - 2.0f * juce::MathConstants::pi); else if (elevationL - smoothElevationL.getTargetValue() > juce::MathConstants::pi) smoothElevationL.setCurrentAndTargetValue (smoothElevationL.getTargetValue() + 2.0f * juce::MathConstants::pi); if (smoothAzimuthR.getTargetValue() - azimuthR > juce::MathConstants::pi) smoothAzimuthR.setCurrentAndTargetValue (smoothAzimuthR.getTargetValue() - 2.0f * juce::MathConstants::pi); else if (azimuthR - smoothAzimuthR.getTargetValue() > juce::MathConstants::pi) smoothAzimuthR.setCurrentAndTargetValue (smoothAzimuthR.getTargetValue() + 2.0f * juce::MathConstants::pi); if (smoothElevationR.getTargetValue() - elevationR > juce::MathConstants::pi) smoothElevationR.setCurrentAndTargetValue (smoothElevationR.getTargetValue() - 2.0f * juce::MathConstants::pi); else if (elevationR - smoothElevationR.getTargetValue() > juce::MathConstants::pi) smoothElevationR.setCurrentAndTargetValue (smoothElevationR.getTargetValue() + 2.0f * juce::MathConstants::pi); smoothAzimuthL.setTargetValue (azimuthL); smoothElevationL.setTargetValue (elevationL); smoothAzimuthR.setTargetValue (azimuthR); smoothElevationR.setTargetValue (elevationR); for (int i = 0; i < L; ++i) // left { const float azimuth = smoothAzimuthL.getNextValue(); const float elevation = smoothElevationL.getNextValue(); float sample = bufferCopy.getSample (0, i); const juce::Vector3D pos = Conversions::sphericalToCartesian (azimuth, elevation); SHEval (ambisonicOrder, pos.x, pos.y, pos.z, SHL); for (int ch = 0; ch < nChOut; ++ch) buffer.setSample (ch, i, sample * SHL[ch]); } for (int i = 0; i < L; ++i) // right { const float azimuth = smoothAzimuthR.getNextValue(); const float elevation = smoothElevationR.getNextValue(); float sample = bufferCopy.getSample (1, i); const juce::Vector3D pos = Conversions::sphericalToCartesian (azimuth, elevation); SHEval (ambisonicOrder, pos.x, pos.y, pos.z, SHR); for (int ch = 0; ch < nChOut; ++ch) buffer.addSample (ch, i, sample * SHR[ch]); } if (*useSN3D > 0.5f) { for (int ch = 0; ch < nChOut; ++ch) { buffer.applyGain (ch, 0, L, n3d2sn3d[ch]); } juce::FloatVectorOperations::multiply (SHL, SHL, n3d2sn3d, nChOut); juce::FloatVectorOperations::multiply (SHR, SHR, n3d2sn3d, nChOut); } } juce::FloatVectorOperations::copy (_SHL, SHL, nChOut); juce::FloatVectorOperations::copy (_SHR, SHR, nChOut); } //============================================================================== bool StereoEncoderAudioProcessor::hasEditor() const { return true; // (change this to false if you choose to not supply an editor) } juce::AudioProcessorEditor* StereoEncoderAudioProcessor::createEditor() { return new StereoEncoderAudioProcessorEditor (*this, parameters); } void StereoEncoderAudioProcessor::parameterChanged (const juce::String& parameterID, float newValue) { if (! processorUpdatingParams) { if (parameterID == "qw" || parameterID == "qx" || parameterID == "qy" || parameterID == "qz") { sphericalInput = false; updateEuler(); updatedPositionData = true; positionHasChanged = true; } else if (parameterID == "azimuth" || parameterID == "elevation" || parameterID == "roll") { sphericalInput = true; updateQuaternions(); updatedPositionData = true; positionHasChanged = true; } else if (parameterID == "width") { updatedPositionData = true; positionHasChanged = true; } } if (parameterID == "orderSetting") { userChangedIOSettings = true; positionHasChanged = true; } else if (parameterID == "useSN3D") { positionHasChanged = true; } } //============================================================================== void StereoEncoderAudioProcessor::getStateInformation (juce::MemoryBlock& destData) { auto state = parameters.copyState(); auto oscConfig = state.getOrCreateChildWithName ("OSCConfig", nullptr); oscConfig.copyPropertiesFrom (oscParameterInterface.getConfig(), nullptr); std::unique_ptr xml (state.createXml()); copyXmlToBinary (*xml, destData); } void StereoEncoderAudioProcessor::setStateInformation (const void* data, int sizeInBytes) { std::unique_ptr xmlState (getXmlFromBinary (data, sizeInBytes)); if (xmlState.get() != nullptr) if (xmlState->hasTagName (parameters.state.getType())) { parameters.replaceState (juce::ValueTree::fromXml (*xmlState)); if (parameters.state.hasProperty ("OSCPort")) // legacy { oscParameterInterface.getOSCReceiver().connect ( parameters.state.getProperty ("OSCPort", juce::var (-1))); parameters.state.removeProperty ("OSCPort", nullptr); } auto oscConfig = parameters.state.getChildWithName ("OSCConfig"); if (oscConfig.isValid()) oscParameterInterface.setConfig (oscConfig); } } //============================================================================== const bool StereoEncoderAudioProcessor::processNotYetConsumedOSCMessage (const juce::OSCMessage& message) { juce::String prefix ("/" + juce::String (JucePlugin_Name)); if (! message.getAddressPattern().toString().startsWith (prefix)) return false; juce::OSCMessage msg (message); msg.setAddressPattern (message.getAddressPattern().toString().substring ( juce::String (JucePlugin_Name).length() + 1)); if (msg.getAddressPattern().toString().equalsIgnoreCase ("/quaternions") && msg.size() == 4) { float qs[4]; for (int i = 0; i < 4; ++i) if (msg[i].isFloat32()) qs[i] = msg[i].getFloat32(); else if (msg[i].isInt32()) qs[i] = msg[i].getInt32(); oscParameterInterface.setValue ("qw", qs[0]); oscParameterInterface.setValue ("qx", qs[1]); oscParameterInterface.setValue ("qy", qs[2]); oscParameterInterface.setValue ("qz", qs[3]); return true; } return false; } //============================================================================== std::vector> StereoEncoderAudioProcessor::createParameterLayout() { // add your audio parameters here std::vector> params; params.push_back (OSCParameterInterface::createParameterTheOldWay ( "orderSetting", "Ambisonics Order", "", juce::NormalisableRange (0.0f, 8.0f, 1.0f), 0.0f, [] (float value) { if (value >= 0.5f && value < 1.5f) return "0th"; else if (value >= 1.5f && value < 2.5f) return "1st"; else if (value >= 2.5f && value < 3.5f) return "2nd"; else if (value >= 3.5f && value < 4.5f) return "3rd"; else if (value >= 4.5f && value < 5.5f) return "4th"; else if (value >= 5.5f && value < 6.5f) return "5th"; else if (value >= 6.5f && value < 7.5f) return "6th"; else if (value >= 7.5f) return "7th"; else return "Auto"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "useSN3D", "Normalization", "", juce::NormalisableRange (0.0f, 1.0f, 1.0f), 1.0f, [] (float value) { if (value >= 0.5f) return "SN3D"; else return "N3D"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "qw", "Quaternion W", "", juce::NormalisableRange (-1.0f, 1.0f, 0.001f), 1.0, [] (float value) { return juce::String (value, 2); }, nullptr, true)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "qx", "Quaternion X", "", juce::NormalisableRange (-1.0f, 1.0f, 0.001f), 0.0, [] (float value) { return juce::String (value, 2); }, nullptr, true)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "qy", "Quaternion Y", "", juce::NormalisableRange (-1.0f, 1.0f, 0.001f), 0.0, [] (float value) { return juce::String (value, 2); }, nullptr, true)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "qz", "Quaternion Z", "", juce::NormalisableRange (-1.0f, 1.0f, 0.001f), 0.0, [] (float value) { return juce::String (value, 2); }, nullptr, true)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "azimuth", "Azimuth Angle", juce::CharPointer_UTF8 (R"(°)"), juce::NormalisableRange (-180.0f, 180.0f, 0.01f), 0.0, [] (float value) { return juce::String (value, 2); }, nullptr, true)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "elevation", "Elevation Angle", juce::CharPointer_UTF8 (R"(°)"), juce::NormalisableRange (-180.0f, 180.0f, 0.01f), 0.0, [] (float value) { return juce::String (value, 2); }, nullptr, true)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "roll", "Roll Angle", juce::CharPointer_UTF8 (R"(°)"), juce::NormalisableRange (-180.0f, 180.0f, 0.01f), 0.0, [] (float value) { return juce::String (value, 2); }, nullptr, true)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "width", "Stereo Width", juce::CharPointer_UTF8 (R"(°)"), juce::NormalisableRange (-360.0f, 360.0f, 0.01f), 0.0, [] (float value) { return juce::String (value, 2); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "highQuality", "Sample-wise Panning", "", juce::NormalisableRange (0.0f, 1.0f, 1.0f), 0.0f, [] (float value) { return value < 0.5f ? "OFF" : "ON"; }, nullptr)); return params; } //============================================================================== // This creates new instances of the plugin.. juce::AudioProcessor* JUCE_CALLTYPE createPluginFilter() { return new StereoEncoderAudioProcessor(); } ././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/StereoEncoder/Source/PluginEditor.cppIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/StereoEncoder/Source/PluginEditor.cp0000664002537200253720000003717415257173642031575 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #include "PluginEditor.h" #include "PluginProcessor.h" //============================================================================== StereoEncoderAudioProcessorEditor::StereoEncoderAudioProcessorEditor ( StereoEncoderAudioProcessor& p, juce::AudioProcessorValueTreeState& vts) : juce::AudioProcessorEditor (&p), footer (p.getOSCParameterInterface()), processor (p), valueTreeState (vts), centerElement (*valueTreeState.getParameter ("azimuth"), valueTreeState.getParameterRange ("azimuth"), *valueTreeState.getParameter ("elevation"), valueTreeState.getParameterRange ("elevation")), leftElement (centerElement, *valueTreeState.getParameter ("roll"), valueTreeState.getParameterRange ("roll"), *valueTreeState.getParameter ("width"), valueTreeState.getParameterRange ("width")), rightElement (centerElement, *valueTreeState.getParameter ("roll"), valueTreeState.getParameterRange ("roll"), *valueTreeState.getParameter ("width"), valueTreeState.getParameterRange ("width")) { // Make sure that before the constructor has finished, you've set the // editor's size to whatever you need it to be. setSize (500, 325); setLookAndFeel (&globalLaF); // ==== SPHERE AND ELEMENTS =============== addAndMakeVisible (&sphere); sphere.addListener (this); leftElement.setColour (juce::Colours::aqua); sphere.addElement (&leftElement); leftElement.setLabel ("L"); rightElement.setColour (juce::Colours::red); rightElement.setMirrored (true); sphere.addElement (&rightElement); rightElement.setLabel ("R"); centerElement.setColour (juce::Colours::white); sphere.addElement (¢erElement); centerElement.setGrabPriority (1); // ====================================== addAndMakeVisible (&title); title.setTitle (juce::String ("Stereo"), juce::String ("Encoder")); title.setFont (globalLaF.robotoBold, globalLaF.robotoLight); addAndMakeVisible (&footer); toolTipWin.setLookAndFeel (&globalLaF); toolTipWin.setMillisecondsBeforeTipAppears (500); toolTipWin.setOpaque (false); cbNormalizationAtachement.reset ( new ComboBoxAttachment (valueTreeState, "useSN3D", *title.getOutputWidgetPtr()->getNormCbPointer())); cbOrderAtachement.reset ( new ComboBoxAttachment (valueTreeState, "orderSetting", *title.getOutputWidgetPtr()->getOrderCbPointer())); // ======================== AZIMUTH ELEVATION ROLL WIDTH GROUP ypGroup.setText ("Azimuth, Elevation, Roll, Width"); ypGroup.setTextLabelPosition (juce::Justification::centredLeft); ypGroup.setColour (juce::GroupComponent::outlineColourId, globalLaF.ClSeperator); ypGroup.setColour (juce::GroupComponent::textColourId, juce::Colours::white); addAndMakeVisible (&ypGroup); ypGroup.setVisible (true); addAndMakeVisible (&azimuthSlider); azimuthAttachment.reset (new SliderAttachment (valueTreeState, "azimuth", azimuthSlider)); azimuthSlider.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); azimuthSlider.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); azimuthSlider.setReverse (true); azimuthSlider.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[0]); azimuthSlider.setRotaryParameters (juce::MathConstants::pi, 3 * juce::MathConstants::pi, false); azimuthSlider.setTooltip ("Azimuth angle"); azimuthSlider.setTextValueSuffix (juce::CharPointer_UTF8 (R"(°)")); addAndMakeVisible (&elevationSlider); elevationAttachment.reset (new SliderAttachment (valueTreeState, "elevation", elevationSlider)); elevationSlider.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); elevationSlider.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); elevationSlider.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[1]); elevationSlider.setRotaryParameters (0.5 * juce::MathConstants::pi, 2.5 * juce::MathConstants::pi, false); elevationSlider.setTooltip ("Elevation angle"); elevationSlider.setTextValueSuffix (juce::CharPointer_UTF8 (R"(°)")); addAndMakeVisible (&rollSlider); rollAttachment.reset (new SliderAttachment (valueTreeState, "roll", rollSlider)); rollSlider.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); rollSlider.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); rollSlider.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[2]); rollSlider.setReverse (false); rollSlider.setRotaryParameters (juce::MathConstants::pi, 3 * juce::MathConstants::pi, false); rollSlider.setTooltip ("Roll angle"); rollSlider.setTextValueSuffix (juce::CharPointer_UTF8 (R"(°)")); // ====================== QUATERNION GROUP quatGroup.setText ("Quaternions"); quatGroup.setTextLabelPosition (juce::Justification::centredLeft); quatGroup.setColour (juce::GroupComponent::outlineColourId, globalLaF.ClSeperator); quatGroup.setColour (juce::GroupComponent::textColourId, juce::Colours::white); addAndMakeVisible (&quatGroup); quatGroup.setVisible (true); addAndMakeVisible (&qwSlider); qwAttachment.reset (new SliderAttachment (valueTreeState, "qw", qwSlider)); qwSlider.setSliderStyle (juce::Slider::LinearHorizontal); qwSlider.setTextBoxStyle (juce::Slider::TextBoxLeft, false, 50, 15); qwSlider.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[0]); addAndMakeVisible (&qxSlider); qxAttachment.reset (new SliderAttachment (valueTreeState, "qx", qxSlider)); qxSlider.setSliderStyle (juce::Slider::LinearHorizontal); qxSlider.setTextBoxStyle (juce::Slider::TextBoxLeft, false, 50, 15); qxSlider.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[0]); addAndMakeVisible (&qySlider); qyAttachment.reset (new SliderAttachment (valueTreeState, "qy", qySlider)); qySlider.setSliderStyle (juce::Slider::LinearHorizontal); qySlider.setTextBoxStyle (juce::Slider::TextBoxLeft, false, 50, 15); qySlider.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[0]); addAndMakeVisible (&qzSlider); qzAttachment.reset (new SliderAttachment (valueTreeState, "qz", qzSlider)); qzSlider.setSliderStyle (juce::Slider::LinearHorizontal); qzSlider.setTextBoxStyle (juce::Slider::TextBoxLeft, false, 50, 15); qzSlider.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[0]); // =========================== SETTINGS GROUP addAndMakeVisible (&settingsGroup); settingsGroup.setText ("Settings"); settingsGroup.setTextLabelPosition (juce::Justification::centredLeft); settingsGroup.setColour (juce::GroupComponent::outlineColourId, globalLaF.ClSeperator); settingsGroup.setColour (juce::GroupComponent::textColourId, juce::Colours::white); settingsGroup.setVisible (true); addAndMakeVisible (&widthSlider); widthAttachment.reset (new SliderAttachment (valueTreeState, "width", widthSlider)); widthSlider.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); widthSlider.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); widthSlider.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[3]); widthSlider.setReverse (false); widthSlider.setRotaryParameters (juce::MathConstants::pi, 3 * juce::MathConstants::pi, false); widthSlider.setTooltip ("Stereo Width"); //widthSlider.setEnabled(*processor.inputMode >= 0.5f); // ================ LABELS =================== addAndMakeVisible (&lbAzimuth); lbAzimuth.setText ("Azimuth"); addAndMakeVisible (&lbElevation); lbElevation.setText ("Elevation"); addAndMakeVisible (&lbRoll); lbRoll.setText ("Roll"); addAndMakeVisible (&lblWidth); lblWidth.setText ("Width"); addAndMakeVisible (&lbW); lbW.setText ("W"); addAndMakeVisible (&lbX); lbX.setText ("X"); addAndMakeVisible (&lbY); lbY.setText ("Y"); addAndMakeVisible (&lbZ); lbZ.setText ("Z"); // KeyListener addKeyListener (this); startTimer (20); } void StereoEncoderAudioProcessorEditor::mouseWheelOnSpherePannerMoved ( SpherePanner* sphere, const juce::MouseEvent& event, const juce::MouseWheelDetails& wheel) { if (event.mods.isCommandDown() && event.mods.isAltDown()) rollSlider.mouseWheelMove (event, wheel); else if (event.mods.isShiftDown()) widthSlider.mouseWheelMove (event, wheel); else if (event.mods.isAltDown()) elevationSlider.mouseWheelMove (event, wheel); else if (event.mods.isCommandDown()) azimuthSlider.mouseWheelMove (event, wheel); } StereoEncoderAudioProcessorEditor::~StereoEncoderAudioProcessorEditor() { setLookAndFeel (nullptr); } //============================================================================== void StereoEncoderAudioProcessorEditor::paint (juce::Graphics& g) { g.fillAll (globalLaF.ClBackground); } void StereoEncoderAudioProcessorEditor::timerCallback() { // === update titleBar widgets according to available input/output channel counts title.setMaxSize (processor.getMaxSize()); // ========================================== if (processor.updatedPositionData.get()) { processor.updatedPositionData = false; sphere.repaint(); } } void StereoEncoderAudioProcessorEditor::resized() { const int leftRightMargin = 30; const int headerHeight = 60; const int footerHeight = 25; juce::Rectangle area (getLocalBounds()); juce::Rectangle footerArea (area.removeFromBottom (footerHeight)); footer.setBounds (footerArea); area.removeFromLeft (leftRightMargin); area.removeFromRight (leftRightMargin); juce::Rectangle headerArea = area.removeFromTop (headerHeight); title.setBounds (headerArea); area.removeFromTop (10); juce::Rectangle sliderRow; // ============== SIDEBAR RIGHT ==================== // ================================================= juce::Rectangle sideBarArea (area.removeFromRight (190)); const int sliderHeight = 15; const int rotSliderHeight = 55; const int rotSliderSpacing = 10; const int sliderSpacing = 3; const int rotSliderWidth = 40; const int labelHeight = 15; const int labelWidth = 20; // -------------- Azimuth Elevation Roll Width ------------------ juce::Rectangle yprArea (sideBarArea.removeFromTop (25 + rotSliderHeight + labelHeight)); ypGroup.setBounds (yprArea); yprArea.removeFromTop (25); //for box headline sliderRow = (yprArea.removeFromTop (rotSliderHeight)); azimuthSlider.setBounds (sliderRow.removeFromLeft (rotSliderWidth)); sliderRow.removeFromLeft (rotSliderSpacing); elevationSlider.setBounds (sliderRow.removeFromLeft (rotSliderWidth)); sliderRow.removeFromLeft (rotSliderSpacing); rollSlider.setBounds (sliderRow.removeFromLeft (rotSliderWidth)); sliderRow.removeFromLeft (rotSliderSpacing); widthSlider.setBounds (sliderRow.removeFromLeft (rotSliderWidth)); lbAzimuth.setBounds (yprArea.removeFromLeft (rotSliderWidth)); yprArea.removeFromLeft (rotSliderSpacing - 5); lbElevation.setBounds (yprArea.removeFromLeft (rotSliderWidth + 10)); yprArea.removeFromLeft (rotSliderSpacing - 5); lbRoll.setBounds (yprArea.removeFromLeft (rotSliderWidth)); yprArea.removeFromLeft (rotSliderSpacing); lblWidth.setBounds (yprArea.removeFromLeft (rotSliderWidth)); sideBarArea.removeFromTop (20); // ------------- Quaternion ------------------------ juce::Rectangle quatArea (sideBarArea.removeFromTop (165)); quatGroup.setBounds (quatArea); quatArea.removeFromTop (25); //for box headline sliderRow = quatArea.removeFromTop (sliderHeight); qwSlider.setBounds (sliderRow.removeFromRight (185 - labelWidth)); lbW.setBounds (sliderRow); quatArea.removeFromTop (sliderSpacing); sliderRow = quatArea.removeFromTop (sliderHeight); qxSlider.setBounds (sliderRow.removeFromRight (185 - labelWidth)); lbX.setBounds (sliderRow); quatArea.removeFromTop (sliderSpacing); sliderRow = quatArea.removeFromTop (sliderHeight); qySlider.setBounds (sliderRow.removeFromRight (185 - labelWidth)); lbY.setBounds (sliderRow); quatArea.removeFromTop (sliderSpacing); sliderRow = quatArea.removeFromTop (sliderHeight); qzSlider.setBounds (sliderRow.removeFromRight (185 - labelWidth)); lbZ.setBounds (sliderRow); quatArea.removeFromTop (sliderSpacing); // ============== SIDEBAR LEFT ==================== area.removeFromRight (10); // spacing sphere.setBounds (area.getX(), area.getY(), area.getWidth() - 20, area.getWidth() - 20); } bool StereoEncoderAudioProcessorEditor::keyPressed (const juce::KeyPress& key, juce::Component* originatingComponent) { DBG ("Key pressed: " << key.getKeyCode()); if (key.getModifiers().isShiftDown()) { switch (key.getKeyCode()) { case 90: // zenith case 84: // top case 85: // up azimuthSlider.setValue (0.0); elevationSlider.setValue (90.0); break; case 68: // down case 78: // nadir azimuthSlider.setValue (0.0); elevationSlider.setValue (-90.0); break; case 70: // front azimuthSlider.setValue (0.0); elevationSlider.setValue (0.0); break; case 66: // back azimuthSlider.setValue (-180.0); elevationSlider.setValue (0.0); break; case 76: // left azimuthSlider.setValue (90.0); elevationSlider.setValue (0.0); break; case 82: // right azimuthSlider.setValue (-90.0); elevationSlider.setValue (0.0); break; default: return false; } return true; } return false; } ././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/StereoEncoder/Source/PluginProcessor.hIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/StereoEncoder/Source/PluginProcessor0000664002537200253720000001065115257173642031714 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once #include "../../resources/AudioProcessorBase.h" #include "../JuceLibraryCode/JuceHeader.h" #include "../../resources/Quaternion.h" #include "../../resources/ambisonicTools.h" #include "../../resources/efficientSHvanilla.h" #include "../../resources/Conversions.h" #define ProcessorClass StereoEncoderAudioProcessor //============================================================================== /** */ class StereoEncoderAudioProcessor : public AudioProcessorBase, IOTypes::Ambisonics<>> { public: constexpr static int numberOfInputChannels = 2; constexpr static int numberOfOutputChannels = 64; //============================================================================== StereoEncoderAudioProcessor(); ~StereoEncoderAudioProcessor(); //============================================================================== void prepareToPlay (double sampleRate, int samplesPerBlock) override; void releaseResources() override; void processBlock (juce::AudioBuffer&, juce::MidiBuffer&) override; //============================================================================== juce::AudioProcessorEditor* createEditor() override; bool hasEditor() const override; //============================================================================== int getNumPrograms() override; int getCurrentProgram() override; void setCurrentProgram (int index) override; const juce::String getProgramName (int index) override; void changeProgramName (int index, const juce::String& newName) override; //============================================================================== void getStateInformation (juce::MemoryBlock& destData) override; void setStateInformation (const void* data, int sizeInBytes) override; void parameterChanged (const juce::String& parameterID, float newValue) override; // ====== OSC ================================================================== const bool processNotYetConsumedOSCMessage (const juce::OSCMessage& message) override; // ================= //======= Parameters =========================================================== std::vector> createParameterLayout(); //============================================================================== inline void updateQuaternions(); inline void updateEuler(); juce::Vector3D posC, posL, posR; juce::Atomic updatedPositionData; std::atomic* orderSetting; std::atomic* useSN3D; std::atomic* qw; std::atomic* qx; std::atomic* qy; std::atomic* qz; std::atomic* azimuth; std::atomic* elevation; std::atomic* roll; std::atomic* width; std::atomic* highQuality; // -------------------- bool sphericalInput; double phi, theta; private: //============================================================================== bool processorUpdatingParams; float SHL[64]; float SHR[64]; float _SHL[64]; float _SHR[64]; juce::Atomic positionHasChanged = true; iem::Quaternion quaternionDirection; juce::AudioBuffer bufferCopy; juce::LinearSmoothedValue smoothAzimuthL, smoothElevationL; juce::LinearSmoothedValue smoothAzimuthR, smoothElevationR; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (StereoEncoderAudioProcessor) }; IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/StereoEncoder/Source/PluginEditor.h0000664002537200253720000001000015257173642031375 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #include "../JuceLibraryCode/JuceHeader.h" #include "PluginProcessor.h" #include "../../resources/customComponents/ReverseSlider.h" #include "../../resources/customComponents/SimpleLabel.h" #include "../../resources/customComponents/SpherePanner.h" #include "../../resources/customComponents/TitleBar.h" #include "../../resources/lookAndFeel/IEM_LaF.h" typedef ReverseSlider::SliderAttachment SliderAttachment; typedef juce::AudioProcessorValueTreeState::ComboBoxAttachment ComboBoxAttachment; //============================================================================== /** */ class StereoEncoderAudioProcessorEditor : public juce::AudioProcessorEditor, private juce::Timer, public SpherePanner::Listener, private juce::KeyListener { public: StereoEncoderAudioProcessorEditor (StereoEncoderAudioProcessor&, juce::AudioProcessorValueTreeState&); ~StereoEncoderAudioProcessorEditor(); //============================================================================== void paint (juce::Graphics&) override; void resized() override; void mouseWheelOnSpherePannerMoved (SpherePanner* sphere, const juce::MouseEvent& event, const juce::MouseWheelDetails& wheel) override; bool keyPressed (const juce::KeyPress& key, juce::Component* originatingComponent) override; private: LaF globalLaF; TitleBar, AmbisonicIOWidget<>> title; OSCFooter footer; void timerCallback() override; // This reference is provided as a quick way for your editor to // access the processor object that created it. StereoEncoderAudioProcessor& processor; juce::AudioProcessorValueTreeState& valueTreeState; juce::GroupComponent quatGroup, ypGroup, settingsGroup; ReverseSlider azimuthSlider, elevationSlider, rollSlider, widthSlider, qwSlider, qxSlider, qySlider, qzSlider; juce::ComboBox inputChooser; SpherePanner sphere; SpherePanner::AzimuthElevationParameterElement centerElement; SpherePanner::RollWidthParameterElement leftElement; SpherePanner::RollWidthParameterElement rightElement; std::unique_ptr qwAttachment; std::unique_ptr qxAttachment; std::unique_ptr qyAttachment; std::unique_ptr qzAttachment; std::unique_ptr azimuthAttachment; std::unique_ptr elevationAttachment; std::unique_ptr rollAttachment; std::unique_ptr widthAttachment; std::unique_ptr cbNormalizationAtachement; std::unique_ptr cbOrderAtachement; juce::TooltipWindow toolTipWin; // labels SimpleLabel lbAzimuth, lbElevation, lbRoll, lblWidth, lbW, lbX, lbY, lbZ; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (StereoEncoderAudioProcessorEditor) }; IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/StereoEncoder/CMakeLists.txt0000664002537200253720000000362415257173642030135 0ustar zmoelnigzmoelnigset (PLUGIN_TARGET "") if (IEM_FORMATS) juce_add_plugin (StereoEncoder PLUGIN_MANUFACTURER_CODE IEMA PLUGIN_CODE StEn ICON_BIG "../resources/Standalone/IEMPluginSuiteSmall.png" ICON_SMALL "../resources/Standalone/IEMPluginSuiteSmall.png" COMPANY_NAME "IEM" PRODUCT_NAME "StereoEncoder" FORMATS ${IEM_FORMATS} VERSION ${StereoEncoder_VERSION} LV2URI "http://plugins.iem.at/StereoEncoder" VST2_CATEGORY kPlugSurroundFx kPlugCategSpacializer VST3_CATEGORIES Spatial Surround Up-Downmix AAX_CATEGORY SoundField) list (APPEND PLUGIN_TARGET StereoEncoder) endif() foreach (TARGET IN LISTS PLUGIN_TARGET) juce_generate_juce_header (${TARGET}) target_sources (${TARGET} PRIVATE Source/PluginEditor.cpp Source/PluginEditor.h Source/PluginProcessor.cpp Source/PluginProcessor.h ../resources/OSC/OSCInputStream.h ../resources/OSC/OSCParameterInterface.cpp ../resources/OSC/OSCParameterInterface.h ../resources/OSC/OSCStatus.cpp ../resources/OSC/OSCStatus.h ../resources/OSC/OSCUtilities.h ../resources/efficientSHvanilla.cpp ) target_compile_definitions (${TARGET} PRIVATE JUCE_USE_CURL=0 JUCE_WEB_BROWSER=0 JUCE_USE_CUSTOM_PLUGIN_STANDALONE_APP=1 JUCE_USE_FLAC=0 JUCE_USE_OGGVORBIS=0 JUCE_USE_MP3AUDIOFORMAT=0 JUCE_USE_LAME_AUDIO_FORMAT=0 JUCE_USE_WINDOWS_MEDIA_FORMAT=0 JUCE_VST3_CAN_REPLACE_VST2=0) target_include_directories (${TARGET} PRIVATE Source) target_link_libraries (${TARGET} PRIVATE LAF_fonts IEM_logo juce::juce_audio_utils juce::juce_audio_plugin_client juce::juce_osc juce::juce_opengl juce::juce_recommended_config_flags juce::juce_recommended_lto_flags) endforeach() IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/SceneRotator/0000775002537200253720000000000015257173642025237 5ustar zmoelnigzmoelnigIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/SceneRotator/Source/0000775002537200253720000000000015257173642026477 5ustar zmoelnigzmoelnig././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/SceneRotator/Source/PluginProcessor.cppIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/SceneRotator/Source/PluginProcessor.0000664002537200253720000011770715257173642031653 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2018 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ /* The computation of Ambisonic rotation matrices is done by the recursive method of Ivanic and Ruedenberg: Ivanic, J., Ruedenberg, K. (1996). Rotation Matrices for Real Spherical Harmonics. Direct Determination by Recursion. The Journal of Physical Chemistry, 100(15), 6342?6347. Including their corrections: Ivanic, J., Ruedenberg, K. (1998). Rotation Matrices for Real Spherical Harmonics. Direct Determination by Recursion Page: Additions and Corrections. Journal of Physical Chemistry A, 102(45), 9099?9100. It also follows the implementations of Archontis Politis (Spherical Harmonic Transform Toolbox) and Matthias Kronlachner (AmbiX Plug-in Suite). */ #include "PluginProcessor.h" #include "PluginEditor.h" //============================================================================== SceneRotatorAudioProcessor::SceneRotatorAudioProcessor() : AudioProcessorBase ( #ifndef JucePlugin_PreferredChannelConfigurations BusesProperties() #if ! JucePlugin_IsMidiEffect #if ! JucePlugin_IsSynth .withInput ("Input", ((juce::PluginHostType::getPluginLoadedAs() == juce::AudioProcessor::wrapperType_VST3) ? juce::AudioChannelSet::ambisonic (1) : juce::AudioChannelSet::ambisonic (7)), true) #endif .withOutput ("Output", ((juce::PluginHostType::getPluginLoadedAs() == juce::AudioProcessor::wrapperType_VST3) ? juce::AudioChannelSet::ambisonic (1) : juce::AudioChannelSet::ambisonic (7)), true) #endif , #endif createParameterLayout()) { // get pointers to the parameters orderSetting = parameters.getRawParameterValue ("orderSetting"); useSN3D = parameters.getRawParameterValue ("useSN3D"); yaw = parameters.getRawParameterValue ("yaw"); pitch = parameters.getRawParameterValue ("pitch"); roll = parameters.getRawParameterValue ("roll"); qw = parameters.getRawParameterValue ("qw"); qx = parameters.getRawParameterValue ("qx"); qy = parameters.getRawParameterValue ("qy"); qz = parameters.getRawParameterValue ("qz"); invertYaw = parameters.getRawParameterValue ("invertYaw"); invertPitch = parameters.getRawParameterValue ("invertPitch"); invertRoll = parameters.getRawParameterValue ("invertRoll"); invertQuaternion = parameters.getRawParameterValue ("invertQuaternion"); rotationSequence = parameters.getRawParameterValue ("rotationSequence"); // add listeners to parameter changes parameters.addParameterListener ("orderSetting", this); parameters.addParameterListener ("useSN3D", this); parameters.addParameterListener ("yaw", this); parameters.addParameterListener ("pitch", this); parameters.addParameterListener ("roll", this); parameters.addParameterListener ("qw", this); parameters.addParameterListener ("qx", this); parameters.addParameterListener ("qy", this); parameters.addParameterListener ("qz", this); parameters.addParameterListener ("invertYaw", this); parameters.addParameterListener ("invertPitch", this); parameters.addParameterListener ("invertRoll", this); parameters.addParameterListener ("invertQuaternion", this); parameters.addParameterListener ("rotationSequence", this); orderMatrices.add (new juce::dsp::Matrix (0, 0)); // 0th orderMatricesCopy.add (new juce::dsp::Matrix (0, 0)); // 0th for (int l = 1; l <= 7; ++l) { const int nCh = (2 * l + 1); auto elem = orderMatrices.add (new juce::dsp::Matrix (nCh, nCh)); elem->clear(); auto elemCopy = orderMatricesCopy.add (new juce::dsp::Matrix (nCh, nCh)); elemCopy->clear(); } trackerDriver.addListener (this); trackerDriver.setAutoDisconnect (false); startTimer (500); } SceneRotatorAudioProcessor::~SceneRotatorAudioProcessor() { closeMidiInput(); } //============================================================================== int SceneRotatorAudioProcessor::getNumPrograms() { return 1; // NB: some hosts don't cope very well if you tell them there are 0 programs, // so this should be at least 1, even if you're not really implementing programs. } int SceneRotatorAudioProcessor::getCurrentProgram() { return 0; } void SceneRotatorAudioProcessor::setCurrentProgram (int index) { } const juce::String SceneRotatorAudioProcessor::getProgramName (int index) { return {}; } void SceneRotatorAudioProcessor::changeProgramName (int index, const juce::String& newName) { } //============================================================================== void SceneRotatorAudioProcessor::prepareToPlay (double sampleRate, int samplesPerBlock) { checkInputAndOutput (this, *orderSetting, *orderSetting, true); copyBuffer.setSize (copyBuffer.getNumChannels(), samplesPerBlock); // Use this method as the place to do any pre-playback // initialisation that you need.. juce::MidiMessageCollector::reset (sampleRate); rotationParamsHaveChanged = true; } void SceneRotatorAudioProcessor::releaseResources() { // When playback stops, you can use this as an opportunity to free up any // spare memory, etc. } void SceneRotatorAudioProcessor::processBlock (juce::AudioSampleBuffer& buffer, juce::MidiBuffer& midiMessages) { checkInputAndOutput (this, *orderSetting, *orderSetting, false); juce::ScopedNoDenormals noDenormals; const int L = buffer.getNumSamples(); const int inputOrder = input.getOrder(); const int nChIn = juce::jmin (input.getNumberOfChannels(), buffer.getNumChannels()); const int actualOrder = floor (sqrt (nChIn)) - 1; const int actualChannels = juce::square (actualOrder + 1); jassert (actualChannels <= nChIn); if (currentMidiScheme != MidiScheme::none) { removeNextBlockOfMessages (midiMessages, buffer.getNumSamples()); for (const auto& msg : midiMessages) { const auto message = msg.getMessage(); if (! message.isController()) break; switch (currentMidiScheme) { case MidiScheme::mrHeadTrackerYprDir: case MidiScheme::mrHeadTrackerYprInv: switch (message.getControllerNumber()) { case 48: yawLsb = message.getControllerValue(); break; case 49: pitchLsb = message.getControllerValue(); break; case 50: rollLsb = message.getControllerValue(); break; case 16: { float yawVal = (128 * message.getControllerValue() + yawLsb) * (1.0f / 16384); parameters.getParameter ("yaw")->setValueNotifyingHost (yawVal); break; } case 17: { float pitchVal = (128 * message.getControllerValue() + pitchLsb) * (1.0f / 16384); parameters.getParameter ("pitch")->setValueNotifyingHost (pitchVal); break; } case 18: { float rollVal = (128 * message.getControllerValue() + rollLsb) * (1.0f / 16384); parameters.getParameter ("roll")->setValueNotifyingHost (rollVal); break; } } // switch (message.getControllerNumber()) break; case MidiScheme::mrHeadTrackerQuaternions: switch (message.getControllerNumber()) { case 48: qwLsb = message.getControllerValue(); break; case 49: qxLsb = message.getControllerValue(); break; case 50: qyLsb = message.getControllerValue(); break; case 51: qzLsb = message.getControllerValue(); break; case 16: { float qwVal = (128 * message.getControllerValue() + qwLsb) * (1.0f / 16384); parameters.getParameter ("qw")->setValueNotifyingHost (qwVal); break; } case 17: { float qxVal = (128 * message.getControllerValue() + qxLsb) * (1.0f / 16384); parameters.getParameter ("qx")->setValueNotifyingHost (qxVal); break; } case 18: { float qyVal = (128 * message.getControllerValue() + qyLsb) * (1.0f / 16384); parameters.getParameter ("qy")->setValueNotifyingHost (qyVal); break; } case 19: { float qzVal = (128 * message.getControllerValue() + qzLsb) * (1.0f / 16384); parameters.getParameter ("qz")->setValueNotifyingHost (qzVal); break; } } // switch (message.getControllerNumber()) break; default: break; } // switch (currentMidiScheme) } //while (i.getNextEvent (message, time)) } //if (currentMidiScheme != MidiScheme::none) bool newRotationMatrix = false; if (rotationParamsHaveChanged.get()) { newRotationMatrix = true; calcRotationMatrix (inputOrder); } // make copy of input for (int ch = 0; ch < actualChannels; ++ch) copyBuffer.copyFrom (ch, 0, buffer, ch, 0, L); // clear all channels except first for (int ch = 1; ch < buffer.getNumChannels(); ++ch) buffer.clear (ch, 0, L); // rotate buffer for (int l = 1; l <= actualOrder; ++l) { const int offset = l * l; const int nCh = 2 * l + 1; auto R = orderMatrices[l]; auto Rcopy = orderMatricesCopy[l]; for (int o = 0; o < nCh; ++o) { const int chOut = offset + o; for (int p = 0; p < nCh; ++p) { buffer.addFromWithRamp (chOut, 0, copyBuffer.getReadPointer (offset + p), L, Rcopy->operator() (o, p), R->operator() (o, p)); } } } // make copies for fading between old and new matrices if (newRotationMatrix) for (int l = 1; l <= inputOrder; ++l) *orderMatricesCopy[l] = *orderMatrices[l]; midiMessages.clear(); } double SceneRotatorAudioProcessor::P (int i, int l, int a, int b, juce::dsp::Matrix& R1, juce::dsp::Matrix& Rlm1) { double ri1 = R1 (i + 1, 2); double rim1 = R1 (i + 1, 0); double ri0 = R1 (i + 1, 1); if (b == -l) return ri1 * Rlm1 (a + l - 1, 0) + rim1 * Rlm1 (a + l - 1, 2 * l - 2); else if (b == l) return ri1 * Rlm1 (a + l - 1, 2 * l - 2) - rim1 * Rlm1 (a + l - 1, 0); else return ri0 * Rlm1 (a + l - 1, b + l - 1); }; double SceneRotatorAudioProcessor::U (int l, int m, int n, juce::dsp::Matrix& Rone, juce::dsp::Matrix& Rlm1) { return P (0, l, m, n, Rone, Rlm1); } double SceneRotatorAudioProcessor::V (int l, int m, int n, juce::dsp::Matrix& Rone, juce::dsp::Matrix& Rlm1) { if (m == 0) { auto p0 = P (1, l, 1, n, Rone, Rlm1); auto p1 = P (-1, l, -1, n, Rone, Rlm1); return p0 + p1; } else if (m > 0) { auto p0 = P (1, l, m - 1, n, Rone, Rlm1); if (m == 1) // d = 1; return p0 * sqrt (2); else // d = 0; return p0 - P (-1, l, 1 - m, n, Rone, Rlm1); } else { auto p1 = P (-1, l, -m - 1, n, Rone, Rlm1); if (m == -1) // d = 1; return p1 * sqrt (2); else // d = 0; return p1 + P (1, l, m + 1, n, Rone, Rlm1); } } double SceneRotatorAudioProcessor::W (int l, int m, int n, juce::dsp::Matrix& Rone, juce::dsp::Matrix& Rlm1) { if (m > 0) { auto p0 = P (1, l, m + 1, n, Rone, Rlm1); auto p1 = P (-1, l, -m - 1, n, Rone, Rlm1); return p0 + p1; } else if (m < 0) { auto p0 = P (1, l, m - 1, n, Rone, Rlm1); auto p1 = P (-1, l, 1 - m, n, Rone, Rlm1); return p0 - p1; } return 0.0; } void SceneRotatorAudioProcessor::calcRotationMatrix (const int order) { const auto yawRadians = Conversions::degreesToRadians (*yaw) * (*invertYaw > 0.5 ? -1 : 1); const auto pitchRadians = Conversions::degreesToRadians (*pitch) * (*invertPitch > 0.5 ? -1 : 1); const auto rollRadians = Conversions::degreesToRadians (*roll) * (*invertRoll > 0.5 ? -1 : 1); auto ca = std::cos (yawRadians); auto cb = std::cos (pitchRadians); auto cy = std::cos (rollRadians); auto sa = std::sin (yawRadians); auto sb = std::sin (pitchRadians); auto sy = std::sin (rollRadians); juce::dsp::Matrix rotMat (3, 3); if (*rotationSequence >= 0.5f) // roll -> pitch -> yaw (extrinsic rotations) { rotMat (0, 0) = ca * cb; rotMat (1, 0) = sa * cb; rotMat (2, 0) = -sb; rotMat (0, 1) = ca * sb * sy - sa * cy; rotMat (1, 1) = sa * sb * sy + ca * cy; rotMat (2, 1) = cb * sy; rotMat (0, 2) = ca * sb * cy + sa * sy; rotMat (1, 2) = sa * sb * cy - ca * sy; rotMat (2, 2) = cb * cy; } else // yaw -> pitch -> roll (extrinsic rotations) { rotMat (0, 0) = ca * cb; rotMat (1, 0) = sa * cy + ca * sb * sy; rotMat (2, 0) = sa * sy - ca * sb * cy; rotMat (0, 1) = -sa * cb; rotMat (1, 1) = ca * cy - sa * sb * sy; rotMat (2, 1) = ca * sy + sa * sb * cy; rotMat (0, 2) = sb; rotMat (1, 2) = -cb * sy; rotMat (2, 2) = cb * cy; } auto Rl = orderMatrices[1]; Rl->operator() (0, 0) = rotMat (1, 1); Rl->operator() (0, 1) = rotMat (1, 2); Rl->operator() (0, 2) = rotMat (1, 0); Rl->operator() (1, 0) = rotMat (2, 1); Rl->operator() (1, 1) = rotMat (2, 2); Rl->operator() (1, 2) = rotMat (2, 0); Rl->operator() (2, 0) = rotMat (0, 1); Rl->operator() (2, 1) = rotMat (0, 2); Rl->operator() (2, 2) = rotMat (0, 0); for (int l = 2; l <= order; ++l) { auto Rone = orderMatrices[1]; auto Rlm1 = orderMatrices[l - 1]; auto Rl = orderMatrices[l]; for (int m = -l; m <= l; ++m) { for (int n = -l; n <= l; ++n) { const int d = (m == 0) ? 1 : 0; double denom; if (abs (n) == l) denom = (2 * l) * (2 * l - 1); else denom = l * l - n * n; double u = sqrt ((l * l - m * m) / denom); double v = sqrt ((1.0 + d) * (l + abs (m) - 1.0) * (l + abs (m)) / denom) * (1.0 - 2.0 * d) * 0.5; double w = sqrt ((l - abs (m) - 1.0) * (l - abs (m)) / denom) * (1.0 - d) * (-0.5); if (u != 0.0) u *= U (l, m, n, *Rone, *Rlm1); if (v != 0.0) v *= V (l, m, n, *Rone, *Rlm1); if (w != 0.0) w *= W (l, m, n, *Rone, *Rlm1); Rl->operator() (m + l, n + l) = u + v + w; } } } rotationParamsHaveChanged = false; } //============================================================================== bool SceneRotatorAudioProcessor::hasEditor() const { return true; // (change this to false if you choose to not supply an editor) } juce::AudioProcessorEditor* SceneRotatorAudioProcessor::createEditor() { return new SceneRotatorAudioProcessorEditor (*this, parameters); } //============================================================================== void SceneRotatorAudioProcessor::getStateInformation (juce::MemoryBlock& destData) { auto state = parameters.copyState(); auto oscConfig = state.getOrCreateChildWithName ("OSCConfig", nullptr); oscConfig.copyPropertiesFrom (oscParameterInterface.getConfig(), nullptr); state.setProperty ("MidiDeviceName", juce::var (currentMidiDeviceInfo.name), nullptr); state.setProperty ("MidiDeviceScheme", juce::var (static_cast (currentMidiScheme)), nullptr); std::unique_ptr xml (state.createXml()); copyXmlToBinary (*xml, destData); } void SceneRotatorAudioProcessor::setStateInformation (const void* data, int sizeInBytes) { // You should use this method to restore your parameters from this memory block, // whose contents will have been created by the getStateInformation() call. std::unique_ptr xmlState (getXmlFromBinary (data, sizeInBytes)); if (xmlState.get() != nullptr) if (xmlState->hasTagName (parameters.state.getType())) { parameters.replaceState (juce::ValueTree::fromXml (*xmlState)); if (parameters.state.hasProperty ("OSCPort")) // legacy { oscParameterInterface.getOSCReceiver().connect ( parameters.state.getProperty ("OSCPort", juce::var (-1))); parameters.state.removeProperty ("OSCPort", nullptr); } auto oscConfig = parameters.state.getChildWithName ("OSCConfig"); if (oscConfig.isValid()) oscParameterInterface.setConfig (oscConfig); if (parameters.state.hasProperty ("MidiDeviceName")) openMidiInput (parameters.state.getProperty ("MidiDeviceName", juce::var ("")), true); else closeMidiInput(); if (parameters.state.hasProperty ("MidiDeviceScheme")) setMidiScheme (MidiScheme (static_cast ( parameters.state.getProperty ("MidiDeviceScheme", juce::var (0))))); } usingYpr = true; } //============================================================================== void SceneRotatorAudioProcessor::parameterChanged (const juce::String& parameterID, float newValue) { DBG ("Parameter with ID " << parameterID << " has changed. New value: " << newValue); if (! updatingParams.get()) { if (parameterID == "qw" || parameterID == "qx" || parameterID == "qy" || parameterID == "qz") { usingYpr = false; updateEuler(); rotationParamsHaveChanged = true; } else if (parameterID == "yaw" || parameterID == "pitch" || parameterID == "roll") { usingYpr = true; updateQuaternions(); rotationParamsHaveChanged = true; } } if (parameterID == "orderSetting") { userChangedIOSettings = true; } else if (parameterID == "invertYaw" || parameterID == "invertPitch" || parameterID == "invertRoll" || parameterID == "invertQuaternion") { if (usingYpr.get()) updateQuaternions(); else updateEuler(); rotationParamsHaveChanged = true; } else if (parameterID == "rotationSequence") { if (usingYpr.get()) updateQuaternions(); else updateEuler(); rotationParamsHaveChanged = true; } } inline void SceneRotatorAudioProcessor::updateQuaternions() { const float wa = cos (Conversions::degreesToRadians (*yaw) * 0.5f); const float za = sin (Conversions::degreesToRadians (*yaw) * (*invertYaw >= 0.5 ? -0.5f : 0.5f)); const float wb = cos (Conversions::degreesToRadians (*pitch) * 0.5f); const float yb = sin (Conversions::degreesToRadians (*pitch) * (*invertPitch >= 0.5 ? -0.5f : 0.5f)); const float wc = cos (Conversions::degreesToRadians (*roll) * 0.5f); const float xc = sin (Conversions::degreesToRadians (*roll) * (*invertRoll >= 0.5 ? -0.5f : 0.5f)); float qw, qx, qy, qz; if (*rotationSequence >= 0.5f) // roll -> pitch -> yaw (extrinsic rotations) { qw = wa * wc * wb + za * xc * yb; qx = wa * xc * wb - za * wc * yb; qy = wa * wc * yb + za * xc * wb; qz = za * wc * wb - wa * xc * yb; } else // yaw -> pitch -> roll (extrinsic rotations) { qw = wc * wb * wa - xc * yb * za; qx = wc * yb * za + xc * wb * wa; qy = wc * yb * wa - xc * wb * za; qz = wc * wb * za + xc * yb * wa; } if (*invertQuaternion >= 0.5f) { qx = -qx; qy = -qy; qz = -qz; } updatingParams = true; parameters.getParameter ("qw")->setValueNotifyingHost ( parameters.getParameterRange ("qw").convertTo0to1 (qw)); parameters.getParameter ("qx")->setValueNotifyingHost ( parameters.getParameterRange ("qx").convertTo0to1 (qx)); parameters.getParameter ("qy")->setValueNotifyingHost ( parameters.getParameterRange ("qy").convertTo0to1 (qy)); parameters.getParameter ("qz")->setValueNotifyingHost ( parameters.getParameterRange ("qz").convertTo0to1 (qz)); updatingParams = false; } void SceneRotatorAudioProcessor::updateEuler() { float ypr[3]; auto quaternionDirection = iem::Quaternion (*qw, *qx, *qy, *qz); quaternionDirection.normalize(); if (*invertQuaternion >= 0.5f) quaternionDirection = quaternionDirection.getConjugate(); // Thanks to Amy de Buitléir for this great algorithm! const float p0 = quaternionDirection.w; const float p1 = quaternionDirection.z; const float p2 = quaternionDirection.y; const float p3 = quaternionDirection.x; float e; if (*rotationSequence >= 0.5f) // roll -> pitch -> yaw (extrinsic rotations) e = -1.0f; else // yaw -> pitch -> roll (extrinsic rotations) e = 1.0f; // pitch (y-axis rotation) float t0 = 2.0f * (p0 * p2 + e * p1 * p3); t0 = juce::jlimit (-1.0f, 1.0f, t0); ypr[1] = asin (t0); if (ypr[1] == juce::MathConstants::pi || ypr[1] == -juce::MathConstants::pi) { ypr[2] = 0.0f; ypr[0] = atan2 (p1, p0); } else { // yaw (z-axis rotation) t0 = 2.0f * (p0 * p1 - e * p2 * p3); float t1 = 1.0f - 2.0f * (p1 * p1 + p2 * p2); ypr[0] = atan2 (t0, t1); // roll (x-axis rotation) t0 = 2.0f * (p0 * p3 - e * p1 * p2); t1 = 1.0f - 2.0f * (p2 * p2 + p3 * p3); ypr[2] = atan2 (t0, t1); } if (*invertYaw >= 0.5) ypr[0] *= -1.0f; if (*invertPitch >= 0.5) ypr[1] *= -1.0f; if (*invertRoll >= 0.5) ypr[2] *= -1.0f; //updating not active params updatingParams = true; parameters.getParameter ("yaw")->setValueNotifyingHost ( parameters.getParameterRange ("yaw").convertTo0to1 ( Conversions::radiansToDegrees (ypr[0]))); parameters.getParameter ("pitch")->setValueNotifyingHost ( parameters.getParameterRange ("pitch").convertTo0to1 ( Conversions::radiansToDegrees (ypr[1]))); parameters.getParameter ("roll")->setValueNotifyingHost ( parameters.getParameterRange ("roll").convertTo0to1 ( Conversions::radiansToDegrees (ypr[2]))); updatingParams = false; } void SceneRotatorAudioProcessor::updateBuffers() { DBG ("IOHelper: input size: " << input.getSize()); DBG ("IOHelper: output size: " << output.getSize()); copyBuffer.setSize (input.getNumberOfChannels(), copyBuffer.getNumSamples()); } //============================================================================== const bool SceneRotatorAudioProcessor::interceptOSCMessage (juce::OSCMessage& message) { juce::String prefix ("/" + juce::String (JucePlugin_Name)); if (message.getAddressPattern().toString().equalsIgnoreCase ( "/" + juce::String (JucePlugin_Name) + "/quaternions") && message.size() == 4) { float qs[4]; for (int i = 0; i < 4; ++i) if (message[i].isFloat32()) qs[i] = message[i].getFloat32(); else if (message[i].isInt32()) qs[i] = message[i].getInt32(); oscParameterInterface.setValue ("qw", qs[0]); oscParameterInterface.setValue ("qx", qs[1]); oscParameterInterface.setValue ("qy", qs[2]); oscParameterInterface.setValue ("qz", qs[3]); return true; } else if (message.getAddressPattern().toString().equalsIgnoreCase ( "/" + juce::String (JucePlugin_Name) + "/ypr") && message.size() == 3) { float ypr[3]; for (int i = 0; i < 3; ++i) if (message[i].isFloat32()) ypr[i] = message[i].getFloat32(); else if (message[i].isInt32()) ypr[i] = message[i].getInt32(); oscParameterInterface.setValue ("yaw", ypr[0]); oscParameterInterface.setValue ("pitch", ypr[1]); oscParameterInterface.setValue ("roll", ypr[2]); return true; } return false; } //============================================================================== std::vector> SceneRotatorAudioProcessor::createParameterLayout() { // add your audio parameters here std::vector> params; params.push_back (OSCParameterInterface::createParameterTheOldWay ( "orderSetting", "Ambisonics Order", "", juce::NormalisableRange (0.0f, 8.0f, 1.0f), 0.0f, [] (float value) { if (value >= 0.5f && value < 1.5f) return "0th"; else if (value >= 1.5f && value < 2.5f) return "1st"; else if (value >= 2.5f && value < 3.5f) return "2nd"; else if (value >= 3.5f && value < 4.5f) return "3rd"; else if (value >= 4.5f && value < 5.5f) return "4th"; else if (value >= 5.5f && value < 6.5f) return "5th"; else if (value >= 6.5f && value < 7.5f) return "6th"; else if (value >= 7.5f) return "7th"; else return "Auto"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "useSN3D", "Normalization", "", juce::NormalisableRange (0.0f, 1.0f, 1.0f), 1.0f, [] (float value) { if (value >= 0.5f) return "SN3D"; else return "N3D"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "yaw", "Yaw Angle", juce::CharPointer_UTF8 (R"(°)"), juce::NormalisableRange (-180.0f, 180.0f, 0.01f), 0.0, [] (float value) { return juce::String (value, 2); }, nullptr, true)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "pitch", "Pitch Angle", juce::CharPointer_UTF8 (R"(°)"), juce::NormalisableRange (-180.0f, 180.0f, 0.01f), 0.0, [] (float value) { return juce::String (value, 2); }, nullptr, true)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "roll", "Roll Angle", juce::CharPointer_UTF8 (R"(°)"), juce::NormalisableRange (-180.0f, 180.0f, 0.01f), 0.0, [] (float value) { return juce::String (value, 2); }, nullptr, true)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "qw", "Quaternion W", "", juce::NormalisableRange (-1.0f, 1.0f, 0.001f), 1.0, [] (float value) { return juce::String (value, 2); }, nullptr, true)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "qx", "Quaternion X", "", juce::NormalisableRange (-1.0f, 1.0f, 0.001f), 0.0, [] (float value) { return juce::String (value, 2); }, nullptr, true)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "qy", "Quaternion Y", "", juce::NormalisableRange (-1.0f, 1.0f, 0.001f), 0.0, [] (float value) { return juce::String (value, 2); }, nullptr, true)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "qz", "Quaternion Z", "", juce::NormalisableRange (-1.0f, 1.0f, 0.001f), 0.0, [] (float value) { return juce::String (value, 2); }, nullptr, true)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "invertYaw", "Invert Yaw", "", juce::NormalisableRange (0.0f, 1.0f, 1.0f), 0.0, [] (float value) { return value >= 0.5f ? "ON" : "OFF"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "invertPitch", "Invert Pitch", "", juce::NormalisableRange (0.0f, 1.0f, 1.0f), 0.0, [] (float value) { return value >= 0.5f ? "ON" : "OFF"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "invertRoll", "Invert Roll", "", juce::NormalisableRange (0.0f, 1.0f, 1.0f), 0.0, [] (float value) { return value >= 0.5f ? "ON" : "OFF"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "invertQuaternion", "Invert Quaternion", "", juce::NormalisableRange (0.0f, 1.0f, 1.0f), 0.0, [] (float value) { return value >= 0.5f ? "ON" : "OFF"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "rotationSequence", "Sequence of Rotations", "", juce::NormalisableRange (0.0f, 1.0f, 1.0f), 1.0, [] (float value) { return value >= 0.5f ? "Roll->Pitch->Yaw" : "Yaw->Pitch->Roll"; }, nullptr)); return params; } //============================================================================== void SceneRotatorAudioProcessor::timerCallback() { // retrying to connect to a desired device which might not be physically connected if (currentMidiDeviceInfo.identifier != "" && (midiInput == nullptr && supMidiState != Midi::State::Connected)) openMidiInput (currentMidiDeviceInfo); } //============================================================================== juce::MidiDeviceInfo SceneRotatorAudioProcessor::getCurrentMidiDeviceInfo() { return currentMidiDeviceInfo; } /** Open Midi input with just a given device name as string. Overloaded method for compatibility reasons */ void SceneRotatorAudioProcessor::openMidiInput (const juce::String midiDeviceName, bool forceUpdatingcurrentMidiDeviceInfo) { const juce::ScopedLock scopedLock (changingMidiDevice); juce::Array devices = juce::MidiInput::getAvailableDevices(); juce::MidiDeviceInfo selectedMidiDevice; // Check which available device corresponds to the given device name for (int i = 0; i < devices.size(); ++i) { if (devices[i].name.compare (midiDeviceName) == 0) { selectedMidiDevice = devices[i]; break; } } openMidiInput (selectedMidiDevice, forceUpdatingcurrentMidiDeviceInfo); } void SceneRotatorAudioProcessor::openMidiInput (juce::MidiDeviceInfo midiDevice, bool forceUpdatingcurrentMidiDeviceInfo) { if (midiDevice.identifier.isEmpty()) return closeMidiInput(); // <- not sure if that syntax is totally wrong or brilliant! const juce::ScopedLock scopedLock (changingMidiDevice); juce::Array devices = juce::MidiInput::getAvailableDevices(); const int index = devices.indexOf (midiDevice); if (devices[index].name.startsWith (juce::String ("Head Tracker"))) { if (supMidiState == Midi::State::Available) { trackerDriver.connect(); currentMidiDeviceInfo = midiDevice; DBG ("Supperware HT connected"); if (currentMidiScheme == MidiScheme::supperwareQuaternions) { trackerDriver.turnOn (false, true); trackerDriver.zero(); DBG ("Supperware HT turned on"); } return; } else { DBG ("Supperware HT selected, but MIDI state unavailable"); currentMidiDeviceInfo = midiDevice; // Still updating midiDevice so that is can be reconnected when available return; } } else if (supMidiState == Midi::State::Connected) // If HT connected but not selected as HT device closeMidiInput(); if (index != -1) { midiInput = juce::MidiInput::openDevice (devices[index].identifier, this); if (midiInput == nullptr) { deviceHasChanged = true; showMidiOpenError = true; return; } midiInput->start(); DBG ("Opened MidiInput: " << midiInput->getName()); currentMidiDeviceInfo = midiDevice; deviceHasChanged = true; return; } if (forceUpdatingcurrentMidiDeviceInfo) { currentMidiDeviceInfo = midiDevice; deviceHasChanged = true; } return; } void SceneRotatorAudioProcessor::closeMidiInput() { const juce::ScopedLock scopedLock (changingMidiDevice); if (currentMidiDeviceInfo.name.startsWith (juce::String ("Head Tracker"))) { if (currentMidiScheme == MidiScheme::supperwareQuaternions) { trackerDriver.turnOff(); DBG ("Supperware HT turned off"); } trackerDriver.disconnect(); DBG ("Closing Supperware Head Tracker"); } else if (midiInput != nullptr) { midiInput->stop(); midiInput.reset(); DBG ("Closed MidiInput"); } // It ain't beautiful, but it's honest work currentMidiDeviceInfo.name = ""; currentMidiDeviceInfo.identifier = ""; deviceHasChanged = true; return; } void SceneRotatorAudioProcessor::trackerMidiConnectionChanged (Midi::State newState) { if (newState != supMidiState) { DBG ("Supperware HT MIDI state changed to " << static_cast (newState)); supMidiState = newState; } } void SceneRotatorAudioProcessor::setMidiScheme (MidiScheme newMidiScheme) { if ((currentMidiScheme == MidiScheme::supperwareQuaternions) && (supMidiState == Midi::State::Connected)) { trackerDriver.turnOff(); DBG ("Supperware HT turned off"); } currentMidiScheme = newMidiScheme; DBG ("Scheme set to " << midiSchemeNames[static_cast (newMidiScheme)]); switch (newMidiScheme) { case MidiScheme::none: break; case MidiScheme::mrHeadTrackerYprDir: parameters.getParameter ("rotationSequence") ->setValueNotifyingHost (1.0f); // roll->pitch->yaw break; case MidiScheme::mrHeadTrackerYprInv: parameters.getParameter ("rotationSequence") ->setValueNotifyingHost (1.0f); // roll->pitch->yaw break; case MidiScheme::mrHeadTrackerQuaternions: break; case MidiScheme::supperwareQuaternions: { if (supMidiState == Midi::State::Connected) { trackerDriver.turnOn (true, true); trackerDriver.zero(); DBG ("Supperware HT turned on"); } else { DBG ("Supperware HT not connected"); } break; } default: DBG ("Not supported MidiScheme - I guess the casting from int failed hard!"); jassertfalse; break; } schemeHasChanged = true; } void SceneRotatorAudioProcessor::trackerOrientationQ (float inp_qw, float inp_qx, float inp_qy, float inp_qz) { // The supperware head tracker sends quaternions with different reference system --> x and y are swapped updatingParams = true; // We always get all quaternions at once --> no need to update eulers four times parameters.getParameter ("qw")->setValueNotifyingHost ( parameters.getParameterRange ("qw").convertTo0to1 (inp_qw)); parameters.getParameter ("qx")->setValueNotifyingHost ( parameters.getParameterRange ("qx").convertTo0to1 (-inp_qy)); parameters.getParameter ("qy")->setValueNotifyingHost ( parameters.getParameterRange ("qy").convertTo0to1 (inp_qx)); updatingParams = false; parameters.getParameter ("qz")->setValueNotifyingHost ( parameters.getParameterRange ("qz").convertTo0to1 (-inp_qz)); } //============================================================================== // This creates new instances of the plugin.. juce::AudioProcessor* JUCE_CALLTYPE createPluginFilter() { return new SceneRotatorAudioProcessor(); } IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/SceneRotator/Source/PluginEditor.cpp0000664002537200253720000004226015257173642031614 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #include "PluginEditor.h" #include "PluginProcessor.h" //============================================================================== SceneRotatorAudioProcessorEditor::SceneRotatorAudioProcessorEditor ( SceneRotatorAudioProcessor& p, juce::AudioProcessorValueTreeState& vts) : juce::AudioProcessorEditor (&p), processor (p), valueTreeState (vts), footer (p.getOSCParameterInterface()) { // ============== BEGIN: essentials ====================== // set GUI size and lookAndFeel //setSize(500, 300); // use this to create a fixed-size GUI setResizeLimits (450, 320, 800, 500); // use this to create a resizable GUI setResizable (true, true); setLookAndFeel (&globalLaF); // make title and footer visible, and set the PluginName addAndMakeVisible (&title); title.setTitle (juce::String ("Scene"), juce::String ("Rotator")); title.setFont (globalLaF.robotoBold, globalLaF.robotoLight); addAndMakeVisible (&footer); // ============= END: essentials ======================== // create the connection between title component's comboBoxes and parameters cbOrderAttachement.reset ( new ComboBoxAttachment (valueTreeState, "orderSetting", *title.getInputWidgetPtr()->getOrderCbPointer())); cbNormalizationAttachement.reset ( new ComboBoxAttachment (valueTreeState, "useSN3D", *title.getInputWidgetPtr()->getNormCbPointer())); // ======================== YAW, PITCH, ROLL GROUP yprGroup.setText ("Yaw, Pitch & Roll"); yprGroup.setTextLabelPosition (juce::Justification::centredLeft); addAndMakeVisible (&yprGroup); addAndMakeVisible (&slYaw); slYawAttachment.reset (new SliderAttachment (valueTreeState, "yaw", slYaw)); slYaw.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); slYaw.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); slYaw.setReverse (true); slYaw.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[0]); slYaw.setRotaryParameters (juce::MathConstants::pi, 3 * juce::MathConstants::pi, false); slYaw.setTooltip ("Yaw angle: rotation around z-axis"); slYaw.setTextValueSuffix (juce::CharPointer_UTF8 (R"(°)")); addAndMakeVisible (&slPitch); slPitchAttachment.reset (new SliderAttachment (valueTreeState, "pitch", slPitch)); slPitch.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); slPitch.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); slPitch.setReverse (true); slPitch.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[1]); slPitch.setRotaryParameters (0.5 * juce::MathConstants::pi, 2.5 * juce::MathConstants::pi, false); slPitch.setTooltip ("Pitch angle: rotation around y-axis"); slPitch.setTextValueSuffix (juce::CharPointer_UTF8 (R"(°)")); addAndMakeVisible (&slRoll); slRollAttachment.reset (new SliderAttachment (valueTreeState, "roll", slRoll)); slRoll.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); slRoll.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); slRoll.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[2]); slRoll.setReverse (false); slRoll.setRotaryParameters (juce::MathConstants::pi, 3 * juce::MathConstants::pi, false); slRoll.setTooltip ("Roll angle: rotation around x-axis"); slRoll.setTextValueSuffix (juce::CharPointer_UTF8 (R"(°)")); addAndMakeVisible (tbInvertYaw); tbInvertYawAttachment.reset (new ButtonAttachment (valueTreeState, "invertYaw", tbInvertYaw)); tbInvertYaw.setColour (juce::ToggleButton::ColourIds::tickColourId, globalLaF.ClWidgetColours[0]); tbInvertYaw.setButtonText ("Flip"); addAndMakeVisible (tbInvertPitch); tbInvertPitchAttachment.reset ( new ButtonAttachment (valueTreeState, "invertPitch", tbInvertPitch)); tbInvertPitch.setColour (juce::ToggleButton::ColourIds::tickColourId, globalLaF.ClWidgetColours[1]); tbInvertPitch.setButtonText ("Flip"); addAndMakeVisible (tbInvertRoll); tbRollFlipAttachment.reset (new ButtonAttachment (valueTreeState, "invertRoll", tbInvertRoll)); tbInvertRoll.setColour (juce::ToggleButton::ColourIds::tickColourId, globalLaF.ClWidgetColours[2]); tbInvertRoll.setButtonText ("Flip"); addAndMakeVisible (tbInvertQuaternion); tbInvertQuaternionAttachment.reset ( new ButtonAttachment (valueTreeState, "invertQuaternion", tbInvertQuaternion)); tbInvertQuaternion.setColour (juce::ToggleButton::ColourIds::tickColourId, globalLaF.ClWidgetColours[0]); tbInvertQuaternion.setButtonText ("Invert Quaternions"); addAndMakeVisible (cbRotationSequence); cbRotationSequence.setTooltip ("Sequence of intrinsic rotations"); cbRotationSequence.addSectionHeading ("Rotation sequence"); cbRotationSequence.addItem ("Yaw -> Pitch -> Roll", 1); cbRotationSequence.addItem ("Roll -> Pitch -> Yaw", 2); cbRotationSequence.setJustificationType (juce::Justification::centred); cbRotationSequenceAttachment.reset ( new ComboBoxAttachment (valueTreeState, "rotationSequence", cbRotationSequence)); // ====================== QUATERNION GROUP quatGroup.setText ("Quaternions"); quatGroup.setTextLabelPosition (juce::Justification::centredLeft); addAndMakeVisible (&quatGroup); addAndMakeVisible (&slQW); slQWAttachment.reset (new SliderAttachment (valueTreeState, "qw", slQW)); slQW.setSliderStyle (juce::Slider::LinearHorizontal); slQW.setTextBoxStyle (juce::Slider::TextBoxLeft, false, 50, 15); slQW.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[0]); addAndMakeVisible (&slQX); slQXAttachment.reset (new SliderAttachment (valueTreeState, "qx", slQX)); slQX.setSliderStyle (juce::Slider::LinearHorizontal); slQX.setTextBoxStyle (juce::Slider::TextBoxLeft, false, 50, 15); slQX.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[0]); addAndMakeVisible (&slQY); slQYAttachment.reset (new SliderAttachment (valueTreeState, "qy", slQY)); slQY.setSliderStyle (juce::Slider::LinearHorizontal); slQY.setTextBoxStyle (juce::Slider::TextBoxLeft, false, 50, 15); slQY.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[0]); addAndMakeVisible (&slQZ); slQZAttachment.reset (new SliderAttachment (valueTreeState, "qz", slQZ)); slQZ.setSliderStyle (juce::Slider::LinearHorizontal); slQZ.setTextBoxStyle (juce::Slider::TextBoxLeft, false, 50, 15); slQZ.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[0]); // ================ LABELS =================== addAndMakeVisible (&lbYaw); lbYaw.setText ("Yaw"); addAndMakeVisible (&lbPitch); lbPitch.setText ("Pitch"); addAndMakeVisible (&lbRoll); lbRoll.setText ("Roll"); addAndMakeVisible (&lbQW); lbQW.setText ("W"); addAndMakeVisible (&lbQX); lbQX.setText ("X"); addAndMakeVisible (&lbQY); lbQY.setText ("Y"); addAndMakeVisible (&lbQZ); lbQZ.setText ("Z"); // ====================== MIDI GROUP addAndMakeVisible (midiGroup); midiGroup.setText ("MIDI Connection"); midiGroup.setTextLabelPosition (juce::Justification::centredLeft); addAndMakeVisible (cbMidiDevices); cbMidiDevices.setJustificationType (juce::Justification::centred); refreshMidiDeviceList(); cbMidiDevices.addListener (this); addAndMakeVisible (cbMidiScheme); cbMidiScheme.setJustificationType (juce::Justification::centred); cbMidiScheme.addSectionHeading ("Select Device's MIDI Scheme"); cbMidiScheme.addItemList (processor.getMidiSchemes(), 1); cbMidiScheme.setSelectedId (static_cast (processor.getCurrentMidiScheme()) + 1); updateSelectedMidiScheme(); cbMidiScheme.addListener (this); addAndMakeVisible (slMidiDevices); slMidiDevices.setText ("Device"); addAndMakeVisible (slMidiScheme); slMidiScheme.setText ("Scheme"); tooltipWin.setLookAndFeel (&globalLaF); tooltipWin.setMillisecondsBeforeTipAppears (500); tooltipWin.setOpaque (false); // start timer after everything is set up properly startTimer (20); } SceneRotatorAudioProcessorEditor::~SceneRotatorAudioProcessorEditor() { setLookAndFeel (nullptr); } //============================================================================== void SceneRotatorAudioProcessorEditor::paint (juce::Graphics& g) { g.fillAll (globalLaF.ClBackground); } void SceneRotatorAudioProcessorEditor::resized() { // ============ BEGIN: header and footer ============ const int leftRightMargin = 30; const int headerHeight = 60; const int footerHeight = 25; juce::Rectangle area (getLocalBounds()); juce::Rectangle footerArea (area.removeFromBottom (footerHeight)); footer.setBounds (footerArea); area.removeFromLeft (leftRightMargin); area.removeFromRight (leftRightMargin); juce::Rectangle headerArea = area.removeFromTop (headerHeight); title.setBounds (headerArea); area.removeFromTop (10); area.removeFromBottom (5); // =========== END: header and footer ================= const int sliderHeight = 17; const int rotSliderHeight = 55; const int rotSliderSpacing = 10; const int sliderSpacing = 4; const int rotSliderWidth = 40; //const int labelHeight = 15; const int labelWidth = 20; auto topArea (area.removeFromTop (150)); // -------------- Yaw Pitch Roll ------------------ auto yprArea (topArea.removeFromLeft (160)); yprGroup.setBounds (yprArea); yprArea.removeFromTop (25); //for box headline auto sliderRow (yprArea.removeFromTop (rotSliderHeight)); slYaw.setBounds (sliderRow.removeFromLeft (rotSliderWidth + 5)); sliderRow.removeFromLeft (rotSliderSpacing); slPitch.setBounds (sliderRow.removeFromLeft (rotSliderWidth + 5)); sliderRow.removeFromLeft (rotSliderSpacing); slRoll.setBounds (sliderRow.removeFromLeft (rotSliderWidth + 5)); sliderRow = yprArea.removeFromTop (20); lbYaw.setBounds (sliderRow.removeFromLeft (rotSliderWidth + 5)); sliderRow.removeFromLeft (rotSliderSpacing); lbPitch.setBounds (sliderRow.removeFromLeft (rotSliderWidth + 5)); sliderRow.removeFromLeft (rotSliderSpacing); lbRoll.setBounds (sliderRow.removeFromLeft (rotSliderWidth + 5)); sliderRow = yprArea.removeFromTop (20); tbInvertYaw.setBounds (sliderRow.removeFromLeft (rotSliderWidth + 5)); sliderRow.removeFromLeft (rotSliderSpacing); tbInvertPitch.setBounds (sliderRow.removeFromLeft (rotSliderWidth + 5)); sliderRow.removeFromLeft (rotSliderSpacing); tbInvertRoll.setBounds (sliderRow.removeFromLeft (rotSliderWidth + 5)); yprArea.removeFromTop (5); sliderRow = yprArea.removeFromTop (20); sliderRow.reduce (10, 0); cbRotationSequence.setBounds (sliderRow); // ------------- Quaternions ------------------------ auto quatArea (topArea.removeFromRight (190)); quatGroup.setBounds (quatArea); quatArea.removeFromTop (25); //for box headline quatArea.removeFromTop (5); sliderRow = quatArea.removeFromTop (sliderHeight); slQW.setBounds (sliderRow.removeFromRight (185 - labelWidth)); lbQW.setBounds (sliderRow); quatArea.removeFromTop (sliderSpacing); sliderRow = quatArea.removeFromTop (sliderHeight); slQX.setBounds (sliderRow.removeFromRight (185 - labelWidth)); lbQX.setBounds (sliderRow); quatArea.removeFromTop (sliderSpacing); sliderRow = quatArea.removeFromTop (sliderHeight); slQY.setBounds (sliderRow.removeFromRight (185 - labelWidth)); lbQY.setBounds (sliderRow); quatArea.removeFromTop (sliderSpacing); sliderRow = quatArea.removeFromTop (sliderHeight); slQZ.setBounds (sliderRow.removeFromRight (185 - labelWidth)); lbQZ.setBounds (sliderRow); quatArea.removeFromTop (sliderSpacing); sliderRow = quatArea.removeFromTop (20); sliderRow.removeFromLeft (20); tbInvertQuaternion.setBounds (sliderRow); // ------------- MIDI Connection ------------------------ area.removeFromTop (10); midiGroup.setBounds (area); area.removeFromTop (25); auto row = area.removeFromTop (20); auto leftSide = row.removeFromLeft (180); slMidiDevices.setBounds (leftSide.removeFromLeft (40)); cbMidiDevices.setBounds (leftSide); row.removeFromLeft (10); slMidiScheme.setBounds (row.removeFromLeft (48)); cbMidiScheme.setBounds (row.removeFromLeft (140)); } void SceneRotatorAudioProcessorEditor::timerCallback() { // === update titleBar widgets according to available input/output channel counts title.setMaxSize (processor.getMaxSize()); // ========================================== // insert stuff you want to do be done at every timer callback if (processor.deviceHasChanged.get()) { processor.deviceHasChanged = false; refreshMidiDeviceList(); } if (processor.schemeHasChanged.get()) { processor.schemeHasChanged = false; updateSelectedMidiScheme(); } if (processor.showMidiOpenError.get()) { processor.showMidiOpenError = false; juce::AlertWindow alert ( "Could no open device", "The MIDI device could not be opened, although it's listed in the available device list. This can happen if this process has already opened that device. Please visit https://plugins.iem.at/docs/scenerotator/ for troubleshooting.", juce::AlertWindow::NoIcon); alert.setLookAndFeel (&globalLaF); alert.addButton ("OK", 1, juce::KeyPress (juce::KeyPress::returnKey, 0, 0)); alert.addButton ("Visit website", 2); if (alert.runModalLoop() == 2) juce::URL ("https://plugins.iem.at/docs/scenerotator/").launchInDefaultBrowser(); } } void SceneRotatorAudioProcessorEditor::comboBoxChanged (juce::ComboBox* comboBoxThatHasChanged) { if (comboBoxThatHasChanged == &cbMidiDevices && ! refreshingMidiDevices.get()) { auto id = cbMidiDevices.getSelectedId(); if (id == -3) // refresh refreshMidiDeviceList(); else if (id == -2) { processor.closeMidiInput(); refreshMidiDeviceList(); } else if (id > 0) // an actual device is selected! { juce::String deviceName = cbMidiDevices.getText(); processor.openMidiInput (deviceName); } } else if (comboBoxThatHasChanged == &cbMidiScheme && ! updatingMidiScheme.get()) { processor.setMidiScheme ( SceneRotatorAudioProcessor::MidiScheme (cbMidiScheme.getSelectedId() - 1)); } } void SceneRotatorAudioProcessorEditor::refreshMidiDeviceList() { cbMidiDevices.clear(); cbMidiDevices.addItem ("(refresh list...)", -3); cbMidiDevices.addItem ("none / use DAW input", -2); juce::MidiDeviceInfo currentDevice = processor.getCurrentMidiDeviceInfo(); int select = -2; juce::Array devices = juce::MidiInput::getAvailableDevices(); if (! currentDevice.identifier.isEmpty()) { if (devices.contains (currentDevice)) select = devices.indexOf (currentDevice) + 1; else { cbMidiDevices.addItem (currentDevice.name + " (not available)", -1); select = -1; } } cbMidiDevices.addSeparator(); cbMidiDevices.addSectionHeading ("Available Devices"); for (int i = 0; i < devices.size(); ++i) { cbMidiDevices.addItem (devices[i].name, i + 1); } juce::ScopedValueSetter> refreshing (refreshingMidiDevices, true, false); cbMidiDevices.setSelectedId (select, juce::sendNotificationSync); } void SceneRotatorAudioProcessorEditor::updateSelectedMidiScheme() { juce::ScopedValueSetter> refreshing (updatingMidiScheme, true, false); //cbMidiScheme.setSelectedId (select, juce::sendNotificationSync); } ././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/SceneRotator/Source/PluginProcessor.hIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/SceneRotator/Source/PluginProcessor.0000664002537200253720000001760215257173642031644 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once #include "../../resources/AudioProcessorBase.h" #include "../JuceLibraryCode/JuceHeader.h" #include "../../resources/Conversions.h" #include "../../resources/Quaternion.h" #include "../../resources/ReferenceCountedMatrix.h" #include "../../resources/ht-api-juce/supperware/Tracker.h" #include "../../resources/ht-api-juce/supperware/midi/midi.h" #define ProcessorClass SceneRotatorAudioProcessor //============================================================================== class SceneRotatorAudioProcessor : public AudioProcessorBase, IOTypes::Ambisonics<>, true>, private juce::MidiMessageCollector, private juce::Timer, private Midi::TrackerDriver::Listener { public: constexpr static int numberOfInputChannels = 64; constexpr static int numberOfOutputChannels = 64; //============================================================================== SceneRotatorAudioProcessor(); ~SceneRotatorAudioProcessor(); //============================================================================== void prepareToPlay (double sampleRate, int samplesPerBlock) override; void releaseResources() override; void processBlock (juce::AudioSampleBuffer&, juce::MidiBuffer&) override; //============================================================================== juce::AudioProcessorEditor* createEditor() override; bool hasEditor() const override; //============================================================================== int getNumPrograms() override; int getCurrentProgram() override; void setCurrentProgram (int index) override; const juce::String getProgramName (int index) override; void changeProgramName (int index, const juce::String& newName) override; //============================================================================== void getStateInformation (juce::MemoryBlock& destData) override; void setStateInformation (const void* data, int sizeInBytes) override; //============================================================================== void parameterChanged (const juce::String& parameterID, float newValue) override; void updateBuffers() override; // use this to implement a buffer update method //======= Parameters =========================================================== std::vector> createParameterLayout(); //======= OSC ================================================================== inline const bool interceptOSCMessage (juce::OSCMessage& message) override; //============================================================================== inline void updateQuaternions(); inline void updateEuler(); void rotateBuffer (juce::AudioBuffer* bufferToRotate, const int nChannels, const int samples); void calcRotationMatrix (const int order); //======= MIDI Connection ====================================================== enum class MidiScheme { none = 0, mrHeadTrackerYprDir, mrHeadTrackerYprInv, mrHeadTrackerQuaternions, supperwareQuaternions }; const juce::StringArray midiSchemeNames { "none (link only)", "MrHT YPR Direct", "MrHT YPR Inverse", "MrHT Quaternions", "Supperware" }; const juce::Identifier midiSchemeIdentifieres[5] { "none", "MrHT_YprDir", "MrHT_YprInv", "MrHT_Quat", "Sup_Quat" }; juce::MidiDeviceInfo getCurrentMidiDeviceInfo(); void openMidiInput (juce::MidiDeviceInfo midiDevice, bool forceUpdatingCurrentMidiDeviceName = false); void openMidiInput (juce::String midiDeviceName, bool forceUpdatingCurrentMidiDeviceName = false); void closeMidiInput(); const juce::StringArray getMidiSchemes() { return midiSchemeNames; }; MidiScheme getCurrentMidiScheme() { return currentMidiScheme; }; void setMidiScheme (MidiScheme newMidiScheme); //======= Supperware =========================================================== void trackerMidiConnectionChanged (Midi::State newState) override; void trackerOrientationQ (float inp_qw, float inp_qx, float inp_qy, float inp_qz) override; //============================================================================== // Flags for editor juce::Atomic deviceHasChanged = false; juce::Atomic showMidiOpenError = false; juce::Atomic schemeHasChanged = false; private: //============================================================================== juce::Atomic usingYpr = true; // list of used audio parameters std::atomic* orderSetting; std::atomic* useSN3D; std::atomic* yaw; std::atomic* pitch; std::atomic* roll; std::atomic* qw; std::atomic* qx; std::atomic* qy; std::atomic* qz; std::atomic* invertYaw; std::atomic* invertPitch; std::atomic* invertRoll; std::atomic* invertQuaternion; std::atomic* rotationSequence; juce::Atomic updatingParams { false }; juce::Atomic rotationParamsHaveChanged { true }; juce::AudioBuffer copyBuffer; juce::OwnedArray> orderMatrices; juce::OwnedArray> orderMatricesCopy; double P (int i, int l, int a, int b, juce::dsp::Matrix& R1, juce::dsp::Matrix& Rlm1); double U (int l, int m, int n, juce::dsp::Matrix& Rone, juce::dsp::Matrix& Rlm1); double V (int l, int m, int n, juce::dsp::Matrix& Rone, juce::dsp::Matrix& Rlm1); double W (int l, int m, int n, juce::dsp::Matrix& Rone, juce::dsp::Matrix& Rlm1); void timerCallback() override; // ============ MIDI Device Connection ====================== // MrHeadTracker 14-bit MIDI Data int yawLsb = 0, pitchLsb = 0, rollLsb = 0; int qwLsb = 0, qxLsb = 0, qyLsb = 0, qzLsb = 0; std::unique_ptr midiInput; juce::MidiDeviceInfo currentMidiDeviceInfo; MidiScheme currentMidiScheme = MidiScheme::none; juce::CriticalSection changingMidiDevice; // TrackerDriver for Supperware head tracker Midi::TrackerDriver trackerDriver; Midi::State supMidiState = Midi::State::Unavailable; //============================================================================== JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (SceneRotatorAudioProcessor) }; IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/SceneRotator/Source/PluginEditor.h0000664002537200253720000001067215257173642031263 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once #include "../JuceLibraryCode/JuceHeader.h" #include "PluginProcessor.h" //Plugin Design Essentials #include "../../resources/customComponents/TitleBar.h" #include "../../resources/lookAndFeel/IEM_LaF.h" //Custom juce::Components #include "../../resources/customComponents/ReverseSlider.h" #include "../../resources/customComponents/SimpleLabel.h" typedef ReverseSlider::SliderAttachment SliderAttachment; // all ReverseSliders will make use of the parameters' valueToText() function typedef juce::AudioProcessorValueTreeState::ComboBoxAttachment ComboBoxAttachment; typedef juce::AudioProcessorValueTreeState::ButtonAttachment ButtonAttachment; //============================================================================== /** */ class SceneRotatorAudioProcessorEditor : public juce::AudioProcessorEditor, private juce::Timer, private juce::ComboBox::Listener { public: SceneRotatorAudioProcessorEditor (SceneRotatorAudioProcessor&, juce::AudioProcessorValueTreeState&); ~SceneRotatorAudioProcessorEditor(); //============================================================================== void paint (juce::Graphics&) override; void resized() override; void timerCallback() override; void comboBoxChanged (juce::ComboBox* comboBoxThatHasChanged) override; void refreshMidiDeviceList(); void updateSelectedMidiScheme(); private: // ====================== begin essentials ================== // lookAndFeel class with the IEM plug-in suite design LaF globalLaF; juce::TooltipWindow tooltipWin; // stored references to the AudioProcessor and juce::ValueTreeState holding all the parameters SceneRotatorAudioProcessor& processor; juce::AudioProcessorValueTreeState& valueTreeState; // title and footer component TitleBar, NoIOWidget> title; OSCFooter footer; // =============== end essentials ============ // Attachments to create a connection between IOWidgets comboboxes // and the associated parameters std::unique_ptr cbNormalizationAttachement; std::unique_ptr cbOrderAttachement; ReverseSlider slYaw, slPitch, slRoll, slQW, slQX, slQY, slQZ; std::unique_ptr slYawAttachment; std::unique_ptr slPitchAttachment; std::unique_ptr slRollAttachment; std::unique_ptr slQWAttachment; std::unique_ptr slQXAttachment; std::unique_ptr slQYAttachment; std::unique_ptr slQZAttachment; juce::ComboBox cbRotationSequence; std::unique_ptr cbRotationSequenceAttachment; // juce::Labels and Groups SimpleLabel lbYaw, lbPitch, lbRoll, lbQW, lbQX, lbQY, lbQZ; juce::GroupComponent quatGroup, yprGroup; juce::ToggleButton tbInvertYaw, tbInvertPitch, tbInvertRoll, tbInvertQuaternion; std::unique_ptr tbInvertYawAttachment, tbInvertPitchAttachment, tbRollFlipAttachment, tbInvertQuaternionAttachment; // MIDI Section juce::GroupComponent midiGroup; SimpleLabel slMidiDevices, slMidiScheme; juce::ComboBox cbMidiDevices, cbMidiScheme; juce::Atomic refreshingMidiDevices = false; juce::Atomic updatingMidiScheme = false; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (SceneRotatorAudioProcessorEditor) }; IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/SceneRotator/CMakeLists.txt0000664002537200253720000000362615257173642030006 0ustar zmoelnigzmoelnigset (PLUGIN_TARGET "") if (IEM_FORMATS) juce_add_plugin (SceneRotator PLUGIN_MANUFACTURER_CODE IEMA PLUGIN_CODE ScRo ICON_BIG "../resources/Standalone/IEMPluginSuiteSmall.png" ICON_SMALL "../resources/Standalone/IEMPluginSuiteSmall.png" COMPANY_NAME "IEM" PRODUCT_NAME "SceneRotator" FORMATS ${IEM_FORMATS} VERSION ${SceneRotator_VERSION} LV2URI "http://plugins.iem.at/SceneRotator" VST2_CATEGORY kPlugSurroundFx kPlugCategSpacializer VST3_CATEGORIES Spatial Surround AAX_CATEGORY SoundField) list (APPEND PLUGIN_TARGET SceneRotator) endif() foreach (TARGET IN LISTS PLUGIN_TARGET) juce_generate_juce_header(${TARGET}) target_sources(${TARGET} PRIVATE Source/PluginEditor.cpp Source/PluginEditor.h Source/PluginProcessor.cpp Source/PluginProcessor.h ../resources/OSC/OSCInputStream.h ../resources/OSC/OSCParameterInterface.cpp ../resources/OSC/OSCParameterInterface.h ../resources/OSC/OSCStatus.cpp ../resources/OSC/OSCStatus.h ../resources/OSC/OSCUtilities.h ../resources/efficientSHvanilla.cpp ) target_compile_definitions(${TARGET} PRIVATE JUCE_USE_CURL=0 JUCE_WEB_BROWSER=0 JUCE_USE_CUSTOM_PLUGIN_STANDALONE_APP=1 JUCE_USE_FLAC=0 JUCE_USE_OGGVORBIS=0 JUCE_USE_MP3AUDIOFORMAT=0 JUCE_USE_LAME_AUDIO_FORMAT=0 JUCE_USE_WINDOWS_MEDIA_FORMAT=0 JUCE_VST3_CAN_REPLACE_VST2=0) target_include_directories(${TARGET} PRIVATE Source) target_link_libraries(${TARGET} PRIVATE LAF_fonts IEM_logo juce::juce_audio_utils juce::juce_audio_plugin_client juce::juce_osc juce::juce_dsp juce::juce_opengl juce::juce_recommended_config_flags juce::juce_recommended_lto_flags) endforeach() IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/SimpleDecoder/0000775002537200253720000000000015257173642025346 5ustar zmoelnigzmoelnigIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/SimpleDecoder/Source/0000775002537200253720000000000015257173642026606 5ustar zmoelnigzmoelnig././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/SimpleDecoder/Source/PluginProcessor.cppIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/SimpleDecoder/Source/PluginProcessor0000664002537200253720000010335715257173642031700 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich, Felix Holzmüller Copyright (c) 2017/2026 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #include "PluginProcessor.h" #include "PluginEditor.h" #include const juce::StringArray SimpleDecoderAudioProcessor::weightsStrings = juce::StringArray ("basic", "maxrE", "inphase"); //============================================================================== SimpleDecoderAudioProcessor::SimpleDecoderAudioProcessor() : AudioProcessorBase ( #ifndef JucePlugin_PreferredChannelConfigurations BusesProperties() #if ! JucePlugin_IsMidiEffect #if ! JucePlugin_IsSynth .withInput ("Input", ((juce::PluginHostType::getPluginLoadedAs() == juce::AudioProcessor::wrapperType_VST3) ? juce::AudioChannelSet::ambisonic (1) : juce::AudioChannelSet::ambisonic (7)), true) #endif .withOutput ("Output", ((juce::PluginHostType::getPluginLoadedAs() == juce::AudioProcessor::wrapperType_VST3) ? juce::AudioChannelSet::ambisonic (1) : juce::AudioChannelSet::ambisonic (7)), true) #endif , #endif createParameterLayout()) { // get pointers to the parameters inputOrderSetting = parameters.getRawParameterValue ("inputOrderSetting"); useSN3D = parameters.getRawParameterValue ("useSN3D"); lowPassFrequency = parameters.getRawParameterValue ("lowPassFrequency"); lowPassGain = parameters.getRawParameterValue ("lowPassGain"); highPassFrequency = parameters.getRawParameterValue ("highPassFrequency"); swMode = parameters.getRawParameterValue ("swMode"); swChannel = parameters.getRawParameterValue ("swChannel"); weights = parameters.getRawParameterValue ("weights"); swWeights = parameters.getRawParameterValue ("swWeights"); swOrderSetting = parameters.getRawParameterValue ("swOrderSetting"); // add listeners to parameter changes parameters.addParameterListener ("inputOrderSetting", this); parameters.addParameterListener ("useSN3D", this); parameters.addParameterListener ("lowPassFrequency", this); parameters.addParameterListener ("lowPassQ", this); parameters.addParameterListener ("lowPassGain", this); parameters.addParameterListener ("highPassFrequency", this); parameters.addParameterListener ("highPassQ", this); parameters.addParameterListener ("swMode", this); parameters.addParameterListener ("weights", this); // global settings for all plug-in instances juce::PropertiesFile::Options options; options.applicationName = "Decoder"; options.filenameSuffix = "settings"; options.folderName = "IEM"; options.osxLibrarySubFolder = "Preferences"; properties.reset (new juce::PropertiesFile (options)); lastDir = juce::File (properties->getValue ("presetFolder")); } SimpleDecoderAudioProcessor::~SimpleDecoderAudioProcessor() { } void SimpleDecoderAudioProcessor::setLastDir (juce::File newLastDir) { lastDir = newLastDir; const juce::var v (lastDir.getFullPathName()); properties->setValue ("presetFolder", v); } //============================================================================== int SimpleDecoderAudioProcessor::getNumPrograms() { return 16; } int SimpleDecoderAudioProcessor::getCurrentProgram() { return 0; } void SimpleDecoderAudioProcessor::setCurrentProgram (int index) { juce::String preset; switch (index) { case 0: return; case 1: preset = juce::String (Presets::CUBE_json, Presets::CUBE_jsonSize); break; case 2: preset = juce::String (Presets::Produktionsstudio_json, Presets::Produktionsstudio_jsonSize); break; case 3: preset = juce::String (Presets::MSDecoder_json, Presets::MSDecoder_jsonSize); break; case 4: preset = juce::String (Presets::Quadraphonic_json, Presets::Quadraphonic_jsonSize); break; case 5: preset = juce::String (Presets::_5point1_json, Presets::_5point1_jsonSize); break; case 6: preset = juce::String (Presets::_7point1_json, Presets::_7point1_jsonSize); break; case 7: preset = juce::String (Presets::_5point1point4_json, Presets::_5point1point4_jsonSize); break; case 8: preset = juce::String (Presets::_7point1point4_json, Presets::_7point1point4_jsonSize); break; case 9: preset = juce::String (Presets::Cube_8ch_json, Presets::Cube_8ch_jsonSize); break; case 10: preset = juce::String (Presets::_22_2_NHK_json, Presets::_22_2_NHK_jsonSize); break; case 11: preset = juce::String (Presets::t_design_12ch_json, Presets::t_design_12ch_jsonSize); break; case 12: preset = juce::String (Presets::t_design_24ch_json, Presets::t_design_24ch_jsonSize); break; case 13: preset = juce::String (Presets::t_design_36ch_json, Presets::t_design_36ch_jsonSize); break; case 14: preset = juce::String (Presets::t_design_48ch_json, Presets::t_design_48ch_jsonSize); break; case 15: preset = juce::String (Presets::t_design_60ch_json, Presets::t_design_60ch_jsonSize); break; default: preset = ""; break; } loadConfigFromString (preset); } const juce::String SimpleDecoderAudioProcessor::getProgramName (int index) { switch (index) { case 0: return "---"; case 1: return "IEM CUBE"; case 2: return "IEM Produktionsstudio"; case 3: return "Stereo"; case 4: return "Quadraphonic"; case 5: return "5.1"; case 6: return "7.1"; case 7: return "5.1.4"; case 8: return "7.1.4"; case 9: return "8ch Cube"; case 10: return "22.2 NHK"; case 11: return "t-design (12 channels)"; case 12: return "t-design (24 channels)"; case 13: return "t-design (36 channels)"; case 14: return "t-design (48 channels)"; case 15: return "t-design (60 channels)"; default: return {}; } } void SimpleDecoderAudioProcessor::changeProgramName (int index, const juce::String& newName) { } //============================================================================== void SimpleDecoderAudioProcessor::prepareToPlay (double sampleRate, int samplesPerBlock) { checkInputAndOutput (this, *inputOrderSetting, 0, true); // holds the low-passed ambisonic signals and the decoded subwoofer array signals swBuffer.setSize (juce::jmax (numberOfInputChannels, numberOfOutputChannels), samplesPerBlock); swBuffer.clear(); juce::dsp::ProcessSpec specs; specs.sampleRate = sampleRate; specs.maximumBlockSize = samplesPerBlock; specs.numChannels = 64; decoder.prepare (specs); decoder.setInputNormalization (*useSN3D >= 0.5f ? ReferenceCountedDecoder::Normalization::sn3d : ReferenceCountedDecoder::Normalization::n3d); swDecoder.prepare (specs); swDecoder.setInputNormalization (*useSN3D >= 0.5f ? ReferenceCountedDecoder::Normalization::sn3d : ReferenceCountedDecoder::Normalization::n3d); ReferenceCountedDecoder::Ptr currentDecoder = decoder.getCurrentDecoder(); if (currentDecoder != nullptr) { // calculate mean omni-signal-gain juce::dsp::Matrix& decoderMatrix = currentDecoder->getMatrix(); const int nLsps = (int) decoderMatrix.getNumRows(); float sumGains = 0.0f; for (int i = 0; i < nLsps; ++i) sumGains += decoderMatrix (i, 0); omniGain = sumGains / nLsps; } // prepare filters filterParameters[0].type = FilterType::LinkwitzRileyLowPass; filterParameters[0].frequency = *lowPassFrequency; filterParameters[1].type = FilterType::LinkwitzRileyHighPass; filterParameters[1].frequency = *highPassFrequency; for (int ch = 0; ch < 2; ++ch) { filterParameters[ch].linearGain = 1.0f; filterParameters[ch].q = 0.707f; filterParameters[ch].enabled = true; MCFilter[ch].prepare (specs, &filterParameters[ch]); MCFilter[ch].updateGuiCoefficients(); } repaintFV = true; masterGain.setRampDurationSeconds (0.1f); masterGain.prepare ({ sampleRate, static_cast (samplesPerBlock), 1 }); decoder.setInputNormalization (*useSN3D >= 0.5f ? ReferenceCountedDecoder::Normalization::sn3d : ReferenceCountedDecoder::Normalization::n3d); } void SimpleDecoderAudioProcessor::releaseResources() { // When playback stops, you can use this as an opportunity to free up any // spare memory, etc. } void SimpleDecoderAudioProcessor::processBlock (juce::AudioSampleBuffer& buffer, juce::MidiBuffer& midiMessages) { checkInputAndOutput (this, *inputOrderSetting, 0, false); juce::ScopedNoDenormals noDenormals; const bool newDecoderWasAvailable = decoder.checkIfNewDecoderAvailable(); ReferenceCountedDecoder::Ptr retainedDecoder = decoder.getCurrentDecoder(); swDecoder.checkIfNewDecoderAvailable(); ReferenceCountedDecoder::Ptr retainedSwDecoder = swDecoder.getCurrentDecoder(); if (newDecoderWasAvailable && retainedDecoder != nullptr) { if (*swMode < 2.5f) // keep decoding to a subwoofer array untouched { if (retainedDecoder->getSettings().subwooferChannel != -1) { parameters.getParameter ("swChannel") ->setValueNotifyingHost ( parameters.getParameterRange ("swChannel") .convertTo0to1 (retainedDecoder->getSettings().subwooferChannel)); parameters.getParameter ("swMode")->setValueNotifyingHost ( parameters.getParameterRange ("swMode").convertTo0to1 (1)); //discrete } else parameters.getParameter ("swMode")->setValueNotifyingHost ( parameters.getParameterRange ("swMode").convertTo0to1 (0)); // off } // calculate mean omni-signal-gain juce::dsp::Matrix& decoderMatrix = retainedDecoder->getMatrix(); const int nLsps = (int) decoderMatrix.getNumRows(); float sumGains = 0.0f; for (int i = 0; i < nLsps; ++i) sumGains += decoderMatrix (i, 0); omniGain = sumGains / nLsps; } // ====== is a decoder loaded? stop processing if not =========== if (retainedDecoder == nullptr) { buffer.clear(); return; } // ============================================================== const int L = buffer.getNumSamples(); const int nChIn = juce::jmin (retainedDecoder->getNumInputChannels(), buffer.getNumChannels(), input.getNumberOfChannels()); const int nChOut = juce::jmin (retainedDecoder->getNumOutputChannels(), buffer.getNumChannels()); int nChOutTotal = nChOut; // including subwoofer channels outside of the main decoder const int swProcessing = *swMode; // the subwoofer array outputs stay muted without a valid subwoofer decoder const bool useSwDecoder = swProcessing == 3 && retainedSwDecoder != nullptr && (getOutputChannelMask (*retainedDecoder) & getOutputChannelMask (*retainedSwDecoder)) == 0; // Extract subwoofer signals int nChSw = 0; if (swProcessing > 0) { // TOOD: Fix correction for different orders of subwoofer and broadband decoding float gain = juce::Decibels::decibelsToGain (lowPassGain->load()); if (swProcessing == 3) // decoding to sub array, with a possibly reduced order { if (useSwDecoder) { // independent of the main decoder's order nChSw = juce::jmin (retainedSwDecoder->getNumInputChannels(), buffer.getNumChannels(), input.getNumberOfChannels()); // setting 0 is auto (highest possible order), otherwise it's the order + 1 const int swOrder = juce::roundToInt (swOrderSetting->load()) - 1; if (swOrder >= 0) nChSw = juce::jmin (nChSw, juce::square (swOrder + 1)); } } else // discrete subwoofer or virtual subwoofer { nChSw = 1; gain *= omniGain * std::sqrt (static_cast (retainedDecoder->getOrder()) + 1); // subwoofer-mode discrete: correction for only one subwoofer instead of nChOut loudspeakers if (swProcessing == 1) gain *= std::sqrt ((float) nChOut); } if (nChSw > 0) { for (int ch = 0; ch < nChSw; ++ch) swBuffer.copyFrom (ch, 0, buffer, ch, 0, L); juce::dsp::AudioBlock lowPassAudioBlock (swBuffer.getArrayOfWritePointers(), nChSw, L); lowPassAudioBlock.multiplyBy (gain); // low pass filtering juce::dsp::ProcessContextReplacing lowPassContext (lowPassAudioBlock); MCFilter[0].process (lowPassContext); } // high pass filtering juce::dsp::AudioBlock highPassAudioBlock = juce::dsp::AudioBlock (buffer.getArrayOfWritePointers(), nChIn, buffer.getNumSamples()); juce::dsp::ProcessContextReplacing highPassContext (highPassAudioBlock); MCFilter[1].process (highPassContext); } // after extracting the subwoofer signals, which might use more input channels for (int ch = juce::jmax (nChIn, nChOut); ch < buffer.getNumChannels(); ++ch) // clear all not needed channels buffer.clear (ch, 0, L); // update current weights setting auto settings = retainedDecoder->getSettings(); settings.weights = ReferenceCountedDecoder::Weights (juce::roundToInt (weights->load())); retainedDecoder->setSettings (settings); // ambisonic decoding auto inputAudioBlock = juce::dsp::AudioBlock (buffer.getArrayOfWritePointers(), nChIn, L); auto outputAudioBlock = juce::dsp::AudioBlock (buffer.getArrayOfWritePointers(), nChOut, L); decoder.process (inputAudioBlock, outputAudioBlock); for (int ch = nChOut; ch < nChIn; ++ch) // clear all not needed channels buffer.clear (ch, 0, L); // =================== subwoofer processing ================================== if (swProcessing == 1) { const int swCh = ((int) *swChannel) - 1; if (swCh < buffer.getNumChannels()) { buffer.copyFrom (swCh, 0, swBuffer, 0, 0, L); nChOutTotal = juce::jmax (nChOutTotal, swCh + 1); } } else if (swProcessing == 2) // virtual subwoofer { juce::Array& rArray = decoder.getCurrentDecoder()->getRoutingArrayReference(); for (int ch = rArray.size(); --ch >= 0;) { const int destCh = rArray.getUnchecked (ch); if (destCh < buffer.getNumChannels()) buffer.addFrom (destCh, 0, swBuffer, 0, 0, buffer.getNumSamples()); } } else if (useSwDecoder && nChSw > 0) // sub array { const int nChSwOut = juce::jmin (retainedSwDecoder->getNumOutputChannels(), buffer.getNumChannels(), swBuffer.getNumChannels()); // update current weights setting auto swSettings = retainedSwDecoder->getSettings(); swSettings.weights = ReferenceCountedDecoder::Weights (juce::roundToInt (swWeights->load())); retainedSwDecoder->setSettings (swSettings); // decoding in place, the AmbisonicDecoder takes care of buffering the input auto swInputBlock = juce::dsp::AudioBlock (swBuffer.getArrayOfWritePointers(), nChSw, L); auto swOutputBlock = juce::dsp::AudioBlock (swBuffer.getArrayOfWritePointers(), nChSwOut, L); swDecoder.process (swInputBlock, swOutputBlock); // no collisions with the main decoder, so these channels are still empty for (const int destCh : retainedSwDecoder->getRoutingArrayReference()) if (juce::isPositiveAndBelow (destCh, nChSwOut)) buffer.copyFrom (destCh, 0, swBuffer, destCh, 0, L); nChOutTotal = juce::jmax (nChOutTotal, nChSwOut); } // =================== Master Gain ========================================= const float overallGainInDecibels = *parameters.getRawParameterValue ("overallGain"); masterGain.setGainDecibels (overallGainInDecibels); juce::dsp::AudioBlock ab (buffer.getArrayOfWritePointers(), nChOutTotal, L); juce::dsp::ProcessContextReplacing masterContext (ab); masterGain.process (masterContext); } //============================================================================== bool SimpleDecoderAudioProcessor::hasEditor() const { return true; // (change this to false if you choose to not supply an editor) } juce::AudioProcessorEditor* SimpleDecoderAudioProcessor::createEditor() { return new SimpleDecoderAudioProcessorEditor (*this, parameters); } //============================================================================== void SimpleDecoderAudioProcessor::getStateInformation (juce::MemoryBlock& destData) { auto state = parameters.copyState(); state.setProperty ("configString", juce::var (lastConfigString), nullptr); state.setProperty ("swConfigString", juce::var (lastSwConfigString), nullptr); auto oscConfig = state.getOrCreateChildWithName ("OSCConfig", nullptr); oscConfig.copyPropertiesFrom (oscParameterInterface.getConfig(), nullptr); std::unique_ptr xml (state.createXml()); xml->setTagName ( juce::String (JucePlugin_Name)); // converts old "Decoder" state to "SimpleDecoder" state copyXmlToBinary (*xml, destData); } void SimpleDecoderAudioProcessor::setStateInformation (const void* data, int sizeInBytes) { // You should use this method to restore your parameters from this memory block, // whose contents will have been created by the getStateInformation() call. std::unique_ptr xmlState (getXmlFromBinary (data, sizeInBytes)); if (xmlState != nullptr) if (xmlState->hasTagName (parameters.state.getType()) || xmlState->hasTagName ("Decoder")) // compatibility for old "Decoder" state tagName parameters.state = juce::ValueTree::fromXml (*xmlState); auto* weightsParam = parameters.getParameter ("weights"); const auto savedWeights = weightsParam->getValue(); auto* swModeParam = parameters.getParameter ("swMode"); const auto savedSwMode = swModeParam->getValue(); auto* swChannelParam = parameters.getParameter ("swChannel"); const auto savedSwChannel = swChannelParam->getValue(); auto* swWeightsParam = parameters.getParameter ("swWeights"); const auto savedSwWeights = swWeightsParam->getValue(); auto* swOrderParam = parameters.getParameter ("swOrderSetting"); const auto savedSwOrder = swOrderParam->getValue(); if (parameters.state.hasProperty ("lastOpenedPresetFile")) { juce::Value val = parameters.state.getPropertyAsValue ("lastOpenedPresetFile", nullptr); if (val.getValue().toString() != "") { const juce::File f (val.getValue().toString()); loadConfiguration (f); weightsParam->setValueNotifyingHost (savedWeights); } parameters.state.removeProperty ("lastOpenedPresetFile", nullptr); } else if (parameters.state.hasProperty ("configString")) { juce::var configString = parameters.state.getProperty ("configString"); if (configString.isString()) loadConfigFromString (configString); } const juce::String swConfigString = parameters.state.getProperty ("swConfigString").toString(); if (swConfigString.isNotEmpty()) loadConfigFromString (swConfigString, true); else { swDecoder.setDecoder (nullptr); swDecoderConfig = nullptr; lastSwConfigString = ""; } weightsParam->setValueNotifyingHost (savedWeights); swModeParam->setValueNotifyingHost (savedSwMode); swChannelParam->setValueNotifyingHost (savedSwChannel); swWeightsParam->setValueNotifyingHost (savedSwWeights); swOrderParam->setValueNotifyingHost (savedSwOrder); if (parameters.state.hasProperty ("OSCPort")) // legacy { oscParameterInterface.getOSCReceiver().connect ( parameters.state.getProperty ("OSCPort", juce::var (-1))); parameters.state.removeProperty ("OSCPort", nullptr); } auto oscConfig = parameters.state.getChildWithName ("OSCConfig"); if (oscConfig.isValid()) oscParameterInterface.setConfig (oscConfig); } //============================================================================== void SimpleDecoderAudioProcessor::parameterChanged (const juce::String& parameterID, float newValue) { if (parameterID == "inputOrderSetting") userChangedIOSettings = true; else if (parameterID == "highPassFrequency") { filterParameters[1].frequency = *highPassFrequency; MCFilter[1].updateFilterParams (filterParameters[1], 0, true); repaintFV = true; } else if (parameterID == "lowPassFrequency") { filterParameters[0].frequency = *lowPassFrequency; MCFilter[0].updateFilterParams (filterParameters[0], 0, true); repaintFV = true; } else if (parameterID == "lowPassGain") { filterParameters[0].linearGain = juce::Decibels::decibelsToGain (lowPassGain->load()); MCFilter[0].updateFilterParams (filterParameters[0], 0, true); repaintFV = true; } else if (parameterID == "useSN3D") { const auto normalization = *useSN3D >= 0.5f ? ReferenceCountedDecoder::Normalization::sn3d : ReferenceCountedDecoder::Normalization::n3d; decoder.setInputNormalization (normalization); swDecoder.setInputNormalization (normalization); } } void SimpleDecoderAudioProcessor::updateBuffers() { DBG ("IOHelper: input size: " << input.getSize()); DBG ("IOHelper: output size: " << output.getSize()); } void SimpleDecoderAudioProcessor::loadConfiguration (const juce::File& presetFile, bool loadSwDecoder) { if (! presetFile.exists()) { messageForEditor = "File '" + presetFile.getFullPathName() + "' does not exist!"; messageChanged = true; return; } const juce::String jsonString = presetFile.loadFileAsString(); loadConfigFromString (jsonString, loadSwDecoder); } void SimpleDecoderAudioProcessor::loadConfigFromString (juce::String configString, bool loadSwDecoder) { if (configString.isEmpty()) return; juce::var parsedJson; juce::Result result = juce::JSON::parse (configString, parsedJson); if (result.failed()) { messageForEditor = result.getErrorMessage(); messageChanged = true; return; } ReferenceCountedDecoder::Ptr tempDecoder = nullptr; result = ConfigurationHelper::parseVarForDecoder (parsedJson, &tempDecoder); if (result.failed() || tempDecoder == nullptr) { messageForEditor = result.getErrorMessage(); messageChanged = true; return; } messageForEditor = ""; tempDecoder->removeAppliedWeights(); if (loadSwDecoder) { parameters.getParameterAsValue ("swWeights") .setValue (static_cast (tempDecoder->getSettings().weights)); parameters.getParameterAsValue ("swOrderSetting").setValue (0); // auto swDecoder.setDecoder (tempDecoder); swDecoderConfig = tempDecoder; lastSwConfigString = configString; } else { parameters.getParameterAsValue ("weights").setValue ( static_cast (tempDecoder->getSettings().weights)); decoder.setDecoder (tempDecoder); decoderConfig = tempDecoder; lastConfigString = configString; if (*swMode < 2.5f) // keep decoding to a subwoofer array untouched { if (decoderConfig->getSettings().subwooferChannel != -1) { parameters.getParameter ("swMode")->setValueNotifyingHost ( parameters.getParameterRange ("swMode").convertTo0to1 (1)); parameters.getParameter ("swChannel") ->setValueNotifyingHost ( parameters.getParameterRange ("swChannel") .convertTo0to1 (decoderConfig->getSettings().subwooferChannel)); } else parameters.getParameter ("swMode")->setValueNotifyingHost ( parameters.getParameterRange ("swMode").convertTo0to1 (0)); } updateDecoderInfo = true; } messageChanged = true; } juce::uint64 SimpleDecoderAudioProcessor::getOutputChannelMask (ReferenceCountedDecoder& decoderToCheck) { juce::uint64 mask = 0; for (const int ch : decoderToCheck.getRoutingArrayReference()) if (juce::isPositiveAndBelow (ch, 64)) mask |= juce::uint64 (1) << ch; return mask; } juce::String SimpleDecoderAudioProcessor::getSubwooferWarning() { ReferenceCountedDecoder::Ptr retainedDecoder = decoderConfig; ReferenceCountedDecoder::Ptr retainedSwDecoder = swDecoderConfig; const int mode = juce::roundToInt (swMode->load()); if (mode == 1) // discrete subwoofer { const int channel = juce::roundToInt (swChannel->load()); if (retainedDecoder != nullptr && retainedDecoder->getRoutingArrayReference().contains (channel - 1)) return "Channel " + juce::String (channel) + " already used by the main decoder.\nIts loudspeaker signal is replaced by the subwoofer signal."; return {}; } if (mode != 3) // no subwoofer array decoding return {}; if (retainedDecoder == nullptr || retainedSwDecoder == nullptr) return {}; const auto collisions = getOutputChannelMask (*retainedDecoder) & getOutputChannelMask (*retainedSwDecoder); if (collisions == 0) return {}; juce::StringArray channels; for (int ch = 0; ch < 64; ++ch) if ((collisions >> ch) & 1) channels.add (juce::String (ch + 1)); return "Channel(s) " + channels.joinIntoString (", ") + " already used by the main decoder.\nSubwoofer outputs are muted."; } //============================================================================== const bool SimpleDecoderAudioProcessor::processNotYetConsumedOSCMessage (const juce::OSCMessage& message) { if (message.getAddressPattern().toString().equalsIgnoreCase ( "/" + juce::String (JucePlugin_Name) + "/loadFile") && message.size() >= 1) { if (message[0].isString()) { juce::File fileToLoad (message[0].getString()); loadConfiguration (fileToLoad); return true; } } return false; } //============================================================================== std::vector> SimpleDecoderAudioProcessor::createParameterLayout() { // add your audio parameters here std::vector> params; params.push_back (OSCParameterInterface::createParameterTheOldWay ( "inputOrderSetting", "Ambisonic Order", "", juce::NormalisableRange (0.0f, 8.0f, 1.0f), 0.0f, [] (float value) { if (value >= 0.5f && value < 1.5f) return "0th"; else if (value >= 1.5f && value < 2.5f) return "1st"; else if (value >= 2.5f && value < 3.5f) return "2nd"; else if (value >= 3.5f && value < 4.5f) return "3rd"; else if (value >= 4.5f && value < 5.5f) return "4th"; else if (value >= 5.5f && value < 6.5f) return "5th"; else if (value >= 6.5f && value < 7.5f) return "6th"; else if (value >= 7.5f) return "7th"; else return "Auto"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "useSN3D", "Normalization", "", juce::NormalisableRange (0.0f, 1.0f, 1.0f), 1.0f, [] (float value) { if (value >= 0.5f) return "SN3D"; else return "N3D"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "lowPassFrequency", "LowPass Cutoff Frequency", "Hz", juce::NormalisableRange (20.f, 300.f, 1.0f), 100.f, [] (float value) { return juce::String ((int) value); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "lowPassGain", "LowPass Gain", "dB", juce::NormalisableRange (-20.0f, 10.0, 0.1f), 0.0f, [] (float value) { return juce::String (value, 1); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "highPassFrequency", "HighPass Cutoff Frequency", "Hz", juce::NormalisableRange (20.f, 300.f, 1.f), 100.f, [] (float value) { return juce::String ((int) value); }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "swMode", "Subwoofer Mode", "", juce::NormalisableRange (0.0f, 3.0f, 1.0f), 0.0f, [] (float value) { if (value < 0.5f) return "none"; else if (value >= 0.5f && value < 1.5f) return "Discrete SW"; else if (value >= 1.5f && value < 2.5f) return "Virtual SW"; else return "Decode SW"; }, nullptr)); params.push_back (OSCParameterInterface::createParameterTheOldWay ( "swChannel", "SW Channel Number", "", juce::NormalisableRange (1.0f, 64.0f, 1.0f), 1.0f, [] (float value) { return juce::String ((int) value); }, nullptr)); params.push_back (std::make_unique ("weights", "Ambisonic Weights", weightsStrings, 1)); params.push_back (std::make_unique ( "overallGain", "Overall Gain", juce::NormalisableRange (-20.0f, 20.0f, 0.01f), 0.0f, juce::AudioParameterFloatAttributes() .withLabel ("dB") .withCategory (juce::AudioProcessorParameter::outputGain) .withStringFromValueFunction ([] (float value, int maximumStringLength) { return juce::String (value, maximumStringLength); }))); // appended to keep the indices of the existing parameters params.push_back (std::make_unique ("swWeights", "Subwoofer Ambisonic Weights", weightsStrings, 1)); params.push_back (std::make_unique ( "swOrderSetting", "Subwoofer Ambisonic Order", juce::StringArray ("Auto", "0th", "1st", "2nd", "3rd", "4th", "5th", "6th", "7th"), 0)); return params; } //============================================================================== // This creates new instances of the plugin.. juce::AudioProcessor* JUCE_CALLTYPE createPluginFilter() { return new SimpleDecoderAudioProcessor(); } ././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/SimpleDecoder/Source/PluginEditor.cppIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/SimpleDecoder/Source/PluginEditor.cp0000664002537200253720000004073715257173642031552 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich, Felix Holzmüller Copyright (c) 2017/2026 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #include "PluginEditor.h" #include "PluginProcessor.h" //============================================================================== SimpleDecoderAudioProcessorEditor::SimpleDecoderAudioProcessorEditor ( SimpleDecoderAudioProcessor& p, juce::AudioProcessorValueTreeState& vts) : juce::AudioProcessorEditor (&p), processor (p), valueTreeState (vts), footer (p.getOSCParameterInterface()), dcSwInfoBox (vts, "swWeights", "swOrderSetting"), dcInfoBox (vts, "weights"), fv (20, 20000, -20, 10, 5) { // ============== BEGIN: essentials ====================== // set GUI size and lookAndFeel setResizeLimits (880, 315, 1260, 700); // use this to create a resizable GUI setResizable (true, true); setLookAndFeel (&globalLaF); // make title and footer visible, and set the PluginName addAndMakeVisible (&title); title.setTitle (juce::String ("Simple"), juce::String ("Decoder")); title.setFont (globalLaF.robotoBold, globalLaF.robotoLight); addAndMakeVisible (&footer); // ============= END: essentials ======================== valueTreeState.addParameterListener ("swChannel", this); valueTreeState.addParameterListener ("swMode", this); // create the connection between title component's comboBoxes and parameters cbOrderSettingAttachment.reset ( new ComboBoxAttachment (valueTreeState, "inputOrderSetting", *title.getInputWidgetPtr()->getOrderCbPointer())); cbNormalizationSettingAttachment.reset ( new ComboBoxAttachment (valueTreeState, "useSN3D", *title.getInputWidgetPtr()->getNormCbPointer())); addAndMakeVisible (gcFilter); gcFilter.setText ("Frequency Bands"); addAndMakeVisible (gcSw); gcSw.setText ("Subwoofer"); addAndMakeVisible (gcConfiguration); gcConfiguration.setText ("Decoder Configuration"); // ================= BEGIN: filter slider ================ addAndMakeVisible (slLowPassFrequency); slLowPassFrequencyAttachment.reset ( new SliderAttachment (valueTreeState, "lowPassFrequency", slLowPassFrequency)); slLowPassFrequency.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); slLowPassFrequency.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); slLowPassFrequency.setColour (juce::Slider::rotarySliderOutlineColourId, juce::Colours::orangered); addAndMakeVisible (lbLowPassFrequency); lbLowPassFrequency.setText ("Frequency"); addAndMakeVisible (slLowPassGain); slLowPassGainAttachment.reset ( new SliderAttachment (valueTreeState, "lowPassGain", slLowPassGain)); slLowPassGain.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); slLowPassGain.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); slLowPassGain.setColour (juce::Slider::rotarySliderOutlineColourId, juce::Colours::orangered); addAndMakeVisible (lbLowPassGain); lbLowPassGain.setText ("Gain"); addAndMakeVisible (slHighPassFrequency); slHighPassFrequencyAttachment.reset ( new SliderAttachment (valueTreeState, "highPassFrequency", slHighPassFrequency)); slHighPassFrequency.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); slHighPassFrequency.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); slHighPassFrequency.setColour (juce::Slider::rotarySliderOutlineColourId, juce::Colours::cyan); addAndMakeVisible (lbHighPassFrequency); lbHighPassFrequency.setText ("Frequency"); // ================= END: filter slider ================== // ================= BEGIN: Subwoofer mode ===================== addAndMakeVisible (cbSwMode); cbSwMode.setName ("Subwoofer"); cbSwMode.setJustificationType (juce::Justification::centred); cbSwMode.addItem ("none", 1); cbSwMode.addItem ("discrete", 2); cbSwMode.addItem ("virtual", 3); cbSwMode.addItem ("decode", 4); cbSwModeAttachment.reset (new ComboBoxAttachment (valueTreeState, "swMode", cbSwMode)); addAndMakeVisible (lbSwMode); lbSwMode.setText ("Subwoofer mode"); addAndMakeVisible (lbSwChannel); lbSwChannel.setText ("Subwoofer Channel"); addAndMakeVisible (slSwChannel); slSwChannelAttachment.reset (new SliderAttachment (valueTreeState, "swChannel", slSwChannel)); slSwChannel.setSliderStyle (juce::Slider::IncDecButtons); slSwChannel.setTextBoxStyle (juce::Slider::TextBoxLeft, false, 200, 20); addChildComponent (btLoadSwFile); btLoadSwFile.setButtonText ("Load configuration"); btLoadSwFile.onClick = [&]() { loadPresetFile (true); }; btLoadSwFile.setColour (juce::TextButton::buttonColourId, juce::Colours::orange); addChildComponent (lbSwDecoder); addChildComponent (dcSwInfoBox); addChildComponent (swAlert); updateSubwooferControls(); // ================= END: Subwoofer mode ======================= addAndMakeVisible (btLoadFile); btLoadFile.setButtonText ("Load configuration"); btLoadFile.onClick = [&]() { loadPresetFile(); }; btLoadFile.setColour (juce::TextButton::buttonColourId, juce::Colours::orange); dcInfoBox.setErrorMessage (processor.getMessageForEditor()); addAndMakeVisible (dcInfoBox); dcInfoBox.setTextHeights (13, 19); dcInfoBox.setDecoderConfig (processor.getCurrentDecoderConfig()); addAndMakeVisible (fv); fv.setParallel (true); auto coeffs = processor.getCoeffsForGui (0); if (coeffs != nullptr) { fv.addCoefficients (coeffs, juce::Colours::orangered, &slLowPassFrequency, &slLowPassGain); } coeffs = processor.getCoeffsForGui (1); if (coeffs != nullptr) { fv.addCoefficients (coeffs, juce::Colours::cyan, &slHighPassFrequency); } addAndMakeVisible (gcGain); gcGain.setText ("Overall Gain"); addAndMakeVisible (slGain); slGainAttachment.reset (new SliderAttachment (valueTreeState, "overallGain", slGain)); slGain.setSliderStyle (juce::Slider::RotaryHorizontalVerticalDrag); slGain.setTextBoxStyle (juce::Slider::TextBoxBelow, false, 50, 15); slGain.setColour (juce::Slider::rotarySliderOutlineColourId, globalLaF.ClWidgetColours[2]); tooltipWin.setLookAndFeel (&globalLaF); tooltipWin.setMillisecondsBeforeTipAppears (500); tooltipWin.setOpaque (false); // start timer after everything is set up properly updateFilterVisualizer(); startTimer (20); } SimpleDecoderAudioProcessorEditor::~SimpleDecoderAudioProcessorEditor() { valueTreeState.removeParameterListener ("swChannel", this); valueTreeState.removeParameterListener ("swMode", this); juce::ModalComponentManager::getInstance()->cancelAllModalComponents(); setLookAndFeel (nullptr); } //============================================================================== void SimpleDecoderAudioProcessorEditor::paint (juce::Graphics& g) { g.fillAll (globalLaF.ClBackground); } void SimpleDecoderAudioProcessorEditor::resized() { // ============ BEGIN: header and footer ============ const int leftRightMargin = 30; const int headerHeight = 60; const int footerHeight = 25; juce::Rectangle area (getLocalBounds()); juce::Rectangle footerArea (area.removeFromBottom (footerHeight)); footer.setBounds (footerArea); area.removeFromLeft (leftRightMargin); area.removeFromRight (leftRightMargin); juce::Rectangle headerArea = area.removeFromTop (headerHeight); title.setBounds (headerArea); area.removeFromTop (10); area.removeFromBottom (5); // =========== END: header and footer ================= const int rotSliderHeight = 55; const int rotSliderSpacing = 10; const int labelHeight = 12; juce::Rectangle swCol (area.removeFromRight (180)); area.removeFromRight (20); juce::Rectangle gainCol (area.removeFromRight (80)); area.removeFromRight (20); juce::Rectangle filterCol (area.removeFromRight (220)); area.removeFromRight (20); juce::Rectangle decoderCol (area); { //====================== CONFIGURATION GROUP ================================== juce::Rectangle configArea (decoderCol); juce::Rectangle buttonArea = configArea; gcConfiguration.setBounds (configArea); configArea.removeFromTop (25); buttonArea = configArea.removeFromTop (21).removeFromLeft (130); btLoadFile.setBounds (buttonArea); configArea.removeFromTop (5); dcInfoBox.setBounds (configArea); } { //====================== Subwoofer GROUP ================================== auto swArea = swCol; gcSw.setBounds (swArea); swArea.removeFromTop (25); cbSwMode.setBounds (swArea.removeFromTop (18)); lbSwMode.setBounds (swArea.removeFromTop (labelHeight)); swArea.removeFromTop (8); // channel selection and subwoofer array decoder share the same space const auto buttonRow = swArea.removeFromTop (20); slSwChannel.setBounds (buttonRow); btLoadSwFile.setBounds (buttonRow); // the info box is only visible when decoding to a subwoofer array, so it can use the label row dcSwInfoBox.setBounds (swArea.withTrimmedTop (5)); const auto labelRow = swArea.removeFromTop (labelHeight); lbSwChannel.setBounds (labelRow); lbSwDecoder.setBounds (labelRow); } { //====================== Gain GROUP ================================== // auto gainArea = gainCol.removeFromRight (85); gcGain.setBounds (gainCol); gainCol.removeFromTop (25); slGain.setBounds (gainCol.removeFromTop (60)); // subwoofer warning sign gainCol.removeFromTop (10); swAlert.setBounds (gainCol.removeFromTop (40).withSizeKeepingCentre (40, 40)); } { //====================== FILTER GROUP ================================== juce::Rectangle filterArea (filterCol); gcFilter.setBounds (filterArea); filterArea.removeFromTop (25); const int rotSliderWidth = 50; fv.setBounds (filterArea.removeFromTop (130)); juce::Rectangle sliderRow (filterArea.removeFromTop (rotSliderHeight - 10)); slLowPassGain.setBounds (sliderRow.removeFromLeft (rotSliderWidth)); sliderRow.removeFromLeft (rotSliderSpacing); slLowPassFrequency.setBounds (sliderRow.removeFromLeft (rotSliderWidth)); slHighPassFrequency.setBounds (sliderRow.removeFromRight (rotSliderWidth)); sliderRow = filterArea.removeFromTop (labelHeight); lbLowPassGain.setBounds (sliderRow.removeFromLeft (rotSliderWidth)); sliderRow.removeFromLeft (rotSliderSpacing); lbLowPassFrequency.setBounds (sliderRow.removeFromLeft (rotSliderWidth)); lbHighPassFrequency.setBounds (sliderRow.removeFromRight (rotSliderWidth)); } } void SimpleDecoderAudioProcessorEditor::timerCallback() { // === update titleBar widgets according to available input/output channel counts title.setMaxSize (processor.getMaxSize()); // ========================================== dcSwInfoBox.setAvailableInputOrder (processor.input.getOrder()); if (processor.messageChanged.get()) { dcInfoBox.setErrorMessage (processor.getMessageForEditor()); processor.messageChanged = false; } if (processor.updateDecoderInfo.get()) { dcInfoBox.setDecoderConfig (processor.getCurrentDecoderConfig()); processor.updateDecoderInfo = false; } ReferenceCountedDecoder::Ptr currentDecoder = processor.getCurrentDecoderConfig(); if (lastDecoder != currentDecoder) { lastDecoder = currentDecoder; title.getInputWidgetPtr()->setMaxOrder ( currentDecoder != nullptr ? currentDecoder->getOrder() : 0); updateChannelsInWidget = true; subwooferControlsChanged = true; // channel collisions with the subwoofer might change } ReferenceCountedDecoder::Ptr currentSwDecoder = processor.getCurrentSwDecoderConfig(); if (lastSwDecoder != currentSwDecoder) { lastSwDecoder = currentSwDecoder; updateChannelsInWidget = true; subwooferControlsChanged = true; } if (updateChannelsInWidget) { title.getOutputWidgetPtr()->setSizeIfUnselectable (getNumberOfNeededOutputChannels()); updateChannelsInWidget = false; } if (processor.repaintFV.get()) { processor.repaintFV = false; updateFilterVisualizer(); } if (subwooferControlsChanged) { updateSubwooferControls(); subwooferControlsChanged = false; } } void SimpleDecoderAudioProcessorEditor::updateSubwooferControls() { const int swMode = *valueTreeState.getRawParameterValue ("swMode"); const bool isDiscrete = swMode == 1; const bool isDecoding = swMode == 3; slSwChannel.setVisible (isDiscrete); lbSwChannel.setVisible (isDiscrete); btLoadSwFile.setVisible (isDecoding); dcSwInfoBox.setVisible (isDecoding); ReferenceCountedDecoder::Ptr currentSwDecoder = processor.getCurrentSwDecoderConfig(); lbSwDecoder.setText (currentSwDecoder != nullptr ? currentSwDecoder->getName() : "not loaded"); dcSwInfoBox.setDecoderConfig (currentSwDecoder); const auto warning = processor.getSubwooferWarning(); swAlert.setTooltip (warning); swAlert.setVisible (warning.isNotEmpty()); } int SimpleDecoderAudioProcessorEditor::getNumberOfNeededOutputChannels() { ReferenceCountedDecoder::Ptr currentDecoder = processor.getCurrentDecoderConfig(); if (currentDecoder == nullptr) return 0; const int swMode = *valueTreeState.getRawParameterValue ("swMode"); int neededChannels = currentDecoder->getNumOutputChannels(); if (swMode == 1) neededChannels = juce::jmax (neededChannels, (int) *valueTreeState.getRawParameterValue ("swChannel")); else if (swMode == 3) { ReferenceCountedDecoder::Ptr currentSwDecoder = processor.getCurrentSwDecoderConfig(); if (currentSwDecoder != nullptr) neededChannels = juce::jmax (neededChannels, currentSwDecoder->getNumOutputChannels()); } return neededChannels; } void SimpleDecoderAudioProcessorEditor::updateFilterVisualizer() { for (int i = 0; i < 2; ++i) { processor.updateGuiCoefficients (i); if (i == 0) fv.setSampleRate (processor.getSampleRate()); auto coeffs = processor.getCoeffsForGui (i); if (coeffs != nullptr) { fv.replaceCoefficients (i, coeffs); } } } void SimpleDecoderAudioProcessorEditor::loadPresetFile (bool loadSwDecoder) { juce::FileChooser myChooser ( loadSwDecoder ? "Please select the subwoofer preset you want to load..." : "Please select the preset you want to load...", processor.getLastDir().exists() ? processor.getLastDir() : juce::File::getSpecialLocation (juce::File::userHomeDirectory), "*.json"); if (myChooser.browseForFileToOpen()) { juce::File presetFile (myChooser.getResult()); processor.setLastDir (presetFile.getParentDirectory()); processor.loadConfiguration (presetFile, loadSwDecoder); dcInfoBox.setDecoderConfig (processor.getCurrentDecoderConfig()); } } void SimpleDecoderAudioProcessorEditor::parameterChanged (const juce::String& parameterID, float newValue) { if (parameterID == "swChannel" || parameterID == "swMode") { updateChannelsInWidget = true; subwooferControlsChanged = true; } } IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/SimpleDecoder/Source/Presets/0000775002537200253720000000000015257173642030233 5ustar zmoelnigzmoelnig././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/SimpleDecoder/Source/Presets/22_2_NHK.jsonIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/SimpleDecoder/Source/Presets/22_2_NH0000664002537200253720000013572415257173642031223 0ustar zmoelnigzmoelnig{ "Decoder": { "Name": "22.2 NHK", "Description": "AllRAD-decoder for a 22.2 loudspeaker layout with stereo subwoofers.", "ExpectedInputNormalization": "n3d", "Weights": "none", "WeightsAlreadyApplied": false, "Matrix": [ [ 0.03310225531458854675, 0.02213085815310478210, 0.00329327187500894070, 0.04935869947075843811, 0.04125791415572166443, 0.00255896523594856262, -0.02850615978240966797, 0.00575093459337949753, 0.03669725731015205383, 0.05019125342369079590, 0.00513867987319827080, -0.01335488446056842804, -0.00450558494776487350, -0.02932209335267543793, 0.00460679316893219948, 0.01573733240365982056, 0.04703781008720397949, 0.00646721711382269859, -0.01879251003265380859, -0.00215430627577006817, 0.01429620943963527679, -0.00470704445615410805, -0.01608021929860115051, 0.00204958114773035049, -0.00567290885373950005, 0.03457100316882133484, 0.00612456072121858597, -0.01729719899594783783, -0.00269874488003551960, 0.00501938676461577415, 0.00175738334655761719, 0.01036491803824901581, -0.00222560041584074497, -0.00459609273821115494, -0.00073744246037676930, -0.02093969471752643585, 0.01837057247757911682, 0.00447601685300469398, -0.01178452372550964355, -0.00180258171167224646, 0.00439758365973830223, 0.00009518604201730341, -0.00249111512675881386, -0.00006455284892581403, 0.00299044325947761536, -0.00030597543809562922, 0.00249541760422289371, -0.00274001993238925934, -0.02680098079144954681, 0.00422561680898070335, 0.00232662656344473362, -0.00560644594952464104, -0.00037271037581376731, 0.00138937833253294230, -0.00120641395915299654, 0.00010149936861125752, 0.00176326511427760124, 0.00104016705881804228, -0.00139844650402665138, -0.00056882231729105115, 0.00040503434138372540, 0.00485470378771424294, -0.00347903952933847904, -0.02393191121518611908 ], [ 0.03309301659464836121, -0.02212361618876457214, 0.00328899337910115719, 0.04934812337160110474, -0.04124686121940612793, -0.00255928095430135727, -0.02850653789937496185, 0.00574380299076437950, 0.03669396042823791504, -0.05018157139420509338, -0.00513959629461169243, 0.01335685979574918747, -0.00450403336435556412, -0.02933005802333354950, 0.00459884013980627060, 0.01574186049401760101, -0.04703379794955253601, -0.00646815355867147446, 0.01880022697150707245, 0.00215713935904204845, 0.01430578995496034622, -0.00470890058204531670, -0.01608968339860439301, 0.00204071169719099998, -0.00566331483423709869, -0.03457401320338249207, -0.00612479401752352715, 0.01730943657457828522, 0.00270431488752365112, -0.00502449972555041313, 0.00176314439158886671, 0.01037637051194906235, -0.00222897226922214031, -0.00460127880796790123, -0.00074678566306829453, -0.02092973515391349792, -0.01837885379791259766, -0.00447535607963800430, 0.01179682184010744095, 0.00180944753810763359, -0.00440491316840052605, -0.00009698337089503184, -0.00249536125920712948, -0.00005543903898796998, 0.00299534620717167854, -0.00030934464302845299, 0.00249732891097664833, -0.00274913990870118141, -0.02679499238729476929, -0.00423528999090194702, -0.00232533505186438560, 0.00561390444636344910, 0.00037955498555675149, -0.00139474088791757822, 0.00120588857680559158, -0.00010055641905637458, 0.00175938988104462624, 0.00104154692962765694, -0.00138959125615656376, -0.00057026813738048077, 0.00040225358679890633, 0.00486244214698672295, -0.00348754227161407471, -0.02393197081983089447 ], [ 0.01853341981768608093, 0.00000157802560352138, 0.00149224337656050920, 0.03110158629715442657, 0.00000327604311678442, 0.00000157362205754907, -0.01819522865116596222, 0.00306447059847414494, 0.03300305455923080444, 0.00000494017558594351, 0.00000388089893021970, -0.00000038127546986289, -0.00261855730786919594, -0.02337793260812759399, 0.00366533990018069744, 0.03311257064342498779, 0.00000651329173706472, 0.00000648836248728912, 0.00000012177025610072, -0.00000235419065575115, 0.01346801966428756714, -0.00382639002054929733, -0.02090241201221942902, 0.00398839497938752174, 0.03189145401120185852, 0.00000793791332398541, 0.00000902326064533554, 0.00000121429718547006, -0.00000477270123155904, -0.00000131080525989091, 0.00242834654636681080, 0.01552049722522497177, -0.00361467548646032810, -0.01809289865195751190, 0.00407429039478302002, 0.02964567206799983978, 0.00000910795370145934, 0.00001117921601689886, 0.00000249679033004213, -0.00000677494927003863, -0.00000371126316167647, 0.00000196014457287674, -0.00825008191168308258, 0.00278108986094594002, 0.01228373777121305466, -0.00316750677302479744, -0.01501799840480089188, 0.00395779125392436981, 0.02664165943861007690, 0.00000986565009952756, 0.00001272884946956765, 0.00000355492170456273, -0.00000810846995591419, -0.00000646405214865808, 0.00000283495023722935, 0.00000279332812169741, -0.00131282838992774487, -0.00856814533472061157, 0.00201104604639112949, 0.00925428885966539383, -0.00256119272671639919, -0.01180896814912557602, 0.00367458420805633068, 0.02313372865319252014 ], [ 0.12118127197027206421, 0.07807104289531707764, -0.08137162774801254272, -0.09684120118618011475, -0.09999740123748779297, -0.02849675342440605164, 0.00138857949059456587, 0.03787555545568466187, 0.00619027763605117798, 0.06057235971093177795, 0.02979528345167636871, -0.01885635964572429657, -0.00896285567432641983, 0.01268242113292217255, 0.01244819723069667816, 0.04712467268109321594, -0.01013410557061433792, -0.00688927294686436653, 0.01094559580087661743, 0.00147408689372241497, 0.01400792039930820465, 0.00317332241684198380, -0.00443966314196586609, -0.02453578449785709381, -0.04583415389060974121, -0.01059280335903167725, -0.01111993473023176193, -0.00007676894892938435, 0.00965042784810066223, 0.00733115710318088531, 0.00550902029499411583, -0.00002727697392401751, -0.00426260847598314285, -0.00091730413259938359, 0.00937419757246971130, 0.02081814594566822052, 0.00486718025058507919, 0.00961506366729736328, -0.00342602492310106754, -0.01249435357749462128, -0.00649188086390495300, 0.00302884262055158615, -0.00229972903616726398, -0.00932174175977706909, -0.00373574648983776569, -0.00362058868631720543, 0.00047208412433974445, 0.00371843390166759491, -0.00463593937456607819, 0.00270209251902997494, -0.00000847924911795417, 0.00171152956318110228, 0.00453044380992650986, -0.00030973431421443820, -0.00284763518720865250, -0.00130445451941341162, -0.00277726142667233944, -0.00137810886371880770, 0.00085899647092446685, 0.00646687019616365433, 0.00813213456422090530, 0.00435270648449659348, -0.00492006400600075722, 0.00442133285105228424 ], [ 0.12118364870548248291, -0.07807558029890060425, -0.08138324320316314697, -0.09683643281459808350, 0.09999712556600570679, 0.02849839255213737488, 0.00139313517138361931, 0.03788735717535018921, 0.00617882423102855682, -0.06056344881653785706, -0.02980021201074123383, 0.01885871030390262604, -0.00896942894905805588, 0.01268371939659118652, 0.01243626698851585388, 0.04713245108723640442, 0.01012587826699018478, 0.00689991191029548645, -0.01094727590680122375, -0.00146799674257636070, 0.01402355264872312546, 0.00317806960083544254, -0.00444233836606144905, -0.02452692948281764984, -0.04583295434713363647, 0.01059421896934509277, 0.01110695488750934601, 0.00007938260387163609, -0.00965782068669795990, -0.00733615597710013390, 0.00550429383292794228, -0.00003763919812627137, -0.00426531815901398659, -0.00090935698244720697, 0.00937287323176860809, 0.02081602811813354492, -0.00486803613603115082, -0.00960677675902843475, 0.00341564696282148361, 0.01250351872295141220, 0.00649224221706390381, -0.00302624935284256935, -0.00228945142589509487, -0.00932517368346452713, -0.00372885400429368019, -0.00362278008833527565, 0.00046583981020376086, 0.00371170276775956154, -0.00463876128196716309, -0.00269702752120792866, 0.00000987034400168341, -0.00170053949113935232, -0.00453664176166057587, 0.00030660282936878502, 0.00285009364597499371, 0.00129490485414862633, -0.00278982869349420071, -0.00138758076354861259, 0.00086694670608267188, 0.00646185036748647690, 0.00813829060643911362, 0.00434663658961653709, -0.00491241272538900375, 0.00442379293963313103 ], [ 0.03239376097917556763, 0.04422052577137947083, 0.00695387832820415497, 0.02880400605499744415, 0.04852158576250076294, 0.01235512923449277878, -0.02877842448651790619, 0.00605393154546618462, -0.02107596769928932190, 0.00884793326258659363, 0.01217826083302497864, -0.02754659019410610199, -0.01119821611791849136, -0.01899878308176994324, -0.00949344318360090256, -0.04788357391953468323, -0.02935169078409671783, -0.00328151672147214413, -0.02497593127191066742, -0.01356180850416421890, 0.01649706065654754639, -0.00663654366508126259, 0.00854114256799221039, -0.01498617418110370636, -0.02950791083276271820, -0.03257958218455314636, -0.01356818340718746185, -0.00681114383041858673, -0.01000530831515789032, 0.01236012764275074005, 0.00854095350950956345, 0.00976802408695220947, 0.00788411404937505722, 0.01856858655810356140, -0.00301538431085646152, 0.00516654085367918015, -0.01157952193170785904, -0.00684985844418406487, 0.00655257655307650566, 0.00227851769886910915, 0.01013792399317026138, 0.00739157525822520256, -0.00641359621658921242, 0.00353106344118714333, -0.00149057304952293634, 0.00935558881610631943, 0.01250044442713260651, 0.00937040429562330246, 0.02104253694415092468, 0.00525809125974774361, 0.00480114389210939407, 0.00918602850288152695, 0.00642223702743649483, 0.00428482471033930779, 0.00334119237959384918, -0.00359263876453042030, -0.00270127831026911736, -0.00369075755588710308, -0.00298791145905852318, -0.00499613955616950989, 0.00089805043535307050, 0.00303671881556510925, 0.00758116133511066437, 0.01491875015199184418 ], [ 0.03240429982542991638, -0.04423142597079277039, 0.00694913230836391449, 0.02881555259227752686, -0.04853393137454986572, -0.01235094293951988220, -0.02878836356103420258, 0.00604408653452992439, -0.02107239328324794769, -0.00886146072298288345, -0.01216388028115034103, 0.02755512297153472900, -0.01119278743863105774, -0.01900498569011688232, -0.00950185954570770264, -0.04788179695606231689, 0.02933120913803577423, 0.00330292084254324436, 0.02498103864490985870, 0.01356172561645507812, 0.01650167070329189301, -0.00662725232541561127, 0.00854433700442314148, -0.01498022116720676422, -0.02951555512845516205, 0.03256776556372642517, 0.01357894856482744217, 0.00680852355435490608, 0.00999787729233503342, -0.01236360520124435425, 0.00854001939296722412, 0.00976572558283805847, 0.00789691135287284851, 0.01857132092118263245, -0.00299264071509242058, 0.00513805216178297997, 0.01159810647368431091, 0.00684008374810218811, -0.00655629346147179604, -0.00229694764129817486, -0.01013209391385316849, -0.00739711336791515350, -0.00641156360507011414, 0.00352561310864984989, -0.00149835483171045780, 0.00936123821884393692, 0.01249741017818450928, 0.00939283799380064011, 0.02101179957389831543, -0.00522341299802064896, -0.00482024066150188446, -0.00918650440871715546, -0.00644074054434895515, -0.00427029794082045555, -0.00333912228234112263, 0.00359185691922903061, -0.00270316959358751774, -0.00368203083053231239, -0.00300179258920252323, -0.00499422615393996239, 0.00088821270037442446, 0.00303125986829400063, 0.00758860772475600243, 0.01491698529571294785 ], [ 0.11320815980434417725, -0.00000302678904517961, -0.08640217781066894531, -0.11564314365386962891, 0.00000764343712944537, -0.00000698986059433082, 0.00620642350986599922, 0.06042741239070892334, 0.08872661739587783813, -0.00001044098189595388, 0.00001114455335482489, 0.00000513300210513989, -0.00116868526674807072, 0.01712112128734588623, -0.03334476798772811890, -0.06916483491659164429, 0.00001024911853164667, -0.00001310186598857399, -0.00000440136500401422, 0.00000027210737130190, 0.01521136611700057983, -0.00855285022407770157, -0.01512971241027116776, 0.02247256971895694733, 0.04912601038813591003, -0.00000762519448471721, 0.00001328607322648168, -0.00000064649896103219, -0.00000072064295864038, 0.00000435168112744577, 0.00013261711865197867, -0.00789953954517841339, -0.00176238594576716423, 0.00449204863980412483, -0.01346852630376815796, -0.02715717256069183350, 0.00000382212601834908, -0.00001195802997244755, 0.00000739042206987506, 0.00000117436184154940, -0.00000833850754133891, -0.00000376336811314104, -0.00661393534392118454, -0.00551876751706004143, 0.01083910651504993439, 0.00942686107009649277, 0.00317075592465698719, 0.00073457823600620031, 0.01004129182547330856, -0.00000031512138320977, 0.00000954299866862129, -0.00001278098443435738, -0.00000115541365630634, 0.00001021342905005440, 0.00000264064919974771, 0.00000091356218945293, -0.00178405072074383497, 0.00560761149972677231, 0.00070212059654295444, -0.00814006663858890533, -0.01186436694115400314, -0.00236002868041396141, 0.00716022402048110962, -0.00024326800485141575 ], [ 0.12102497369050979614, 0.11477577686309814453, -0.08304928988218307495, -0.01723389700055122375, -0.01011852547526359558, -0.03914003074169158936, 0.00304927444085478783, 0.01004061009734869003, -0.10242468118667602539, -0.07510413229465484619, -0.00978098437190055847, -0.02546575665473937988, -0.00768516073003411293, -0.00548628438264131546, 0.03649863600730895996, 0.01407257094979286194, 0.01135615631937980652, 0.02211514115333557129, 0.00272454461082816124, -0.00089080724865198135, 0.01232680212706327438, 0.00326031143777072430, 0.00511698704212903976, 0.01070878840982913971, 0.04933306947350502014, 0.02400941587984561920, 0.01370012480765581131, 0.00110072700772434473, 0.00652111135423183441, 0.00743640633299946785, 0.00508429994806647301, 0.00591764692217111588, 0.01104772090911865234, 0.00037555117160081863, -0.01441853120923042297, -0.00860813260078430176, -0.00393183389678597450, -0.00432269228622317314, 0.00110732985194772482, 0.01104066334664821625, 0.00293282256461679935, 0.00565836951136589050, -0.00172208633739501238, -0.00564944976940751076, -0.00601623998954892159, -0.00642779469490051270, 0.00342666078358888626, -0.01123249158263206482, -0.00688037322834134102, 0.00368668627925217152, -0.00785307493060827255, 0.00047028998960740864, -0.00480525614693760872, -0.00510504143312573433, -0.00233471719548106194, 0.00068994209868833423, -0.00224527204409241676, -0.00148216297384351492, -0.00323048024438321590, -0.00544178532436490059, -0.01087999809533357620, -0.00252493144944310188, -0.00010722524893935770, 0.00047246369649656117 ], [ 0.12101804465055465698, -0.11476867645978927612, -0.08304852247238159180, -0.01722818799316883087, 0.01011285372078418732, 0.03913991153240203857, 0.00305179692804813385, 0.01004218123853206635, -0.10242519527673721313, 0.07511141896247863770, 0.00977601669728755951, 0.02546193078160285950, -0.00767989736050367355, -0.00548042915761470795, 0.03649460896849632263, 0.01407164894044399261, -0.01136145275086164474, -0.02210596576333045959, -0.00273149018175899982, 0.00088769494323059916, 0.01232782378792762756, 0.00324839726090431213, 0.00511136325076222420, 0.01070540584623813629, 0.04934294149279594421, -0.02401684038341045380, -0.01370403729379177094, -0.00109002331737428904, -0.00650728307664394379, -0.00744476728141307831, 0.00508039398118853569, 0.00591966090723872185, 0.01104756724089384079, 0.00037424592301249504, -0.01440785638988018036, -0.00861788168549537659, 0.00394269824028015137, 0.00431659119203686714, -0.00111479067709296942, -0.01104546803981065750, -0.00293217645958065987, -0.00565041461959481239, -0.00173149944748729467, -0.00565498322248458862, -0.00602011382579803467, -0.00641823327168822289, 0.00343794538639485836, -0.01124369353055953979, -0.00688273832201957703, -0.00368951121345162392, 0.00786620564758777618, -0.00047629678738303483, 0.00479673827067017555, 0.00510751921683549881, 0.00234134518541395664, -0.00068597594508901238, -0.00224431813694536686, -0.00146976823452860117, -0.00322874588891863823, -0.00543785886839032173, -0.01088554505258798599, -0.00254106777720153332, -0.00010471042332937941, 0.00048062860150821507 ], [ 0.03823474794626235962, 0.03187474980950355530, 0.04089117422699928284, 0.03427171707153320312, 0.03653768450021743774, 0.04081404581665992737, 0.01189336646348237991, 0.04275364056229591370, 0.00325565971434116364, 0.02218830399215221405, 0.04993490129709243774, 0.02536705508828163147, -0.01420121919363737106, 0.02482498250901699066, 0.00301166996359825134, -0.01602412201464176178, 0.00490671582520008087, 0.02999027818441390991, 0.03650078549981117249, 0.00373037299141287804, -0.01845825649797916412, 0.00175561464857310057, 0.00000049981491656581, -0.02379847690463066101, -0.01914730481803417206, -0.00574001949280500412, 0.00516914296895265579, 0.02142363972961902618, 0.01339192502200603485, -0.00648570014163851738, -0.00841861125081777573, -0.00743031501770019531, -0.00225081387907266617, -0.02044946886599063873, -0.02678047493100166321, -0.01271659694612026215, -0.00854636449366807938, -0.00868586171418428421, 0.00127533054910600185, 0.00764723354950547218, 0.00072201585862785578, -0.00486515415832400322, -0.00027963044703938067, -0.00406514061614871025, -0.00155360694043338299, -0.01120263524353504181, -0.02044701389968395233, -0.01618387550115585327, -0.00454626558348536491, -0.00652281939983367920, -0.01076653320342302322, -0.00749076716601848602, -0.00239693326875567436, 0.00137506844475865364, 0.00048401401727460325, -0.00102192722260951996, 0.00072872545570135117, 0.00012669610441662371, 0.00048412196338176727, -0.00444584200158715248, -0.00871635042130947113, -0.00963514018803834915, -0.00486033363267779350, 0.00103001715615391731 ], [ 0.03822791576385498047, -0.03186966478824615479, 0.04088449105620384216, 0.03426788374781608582, -0.03653265908360481262, -0.04080950468778610229, 0.01188989076763391495, 0.04275313764810562134, 0.00325486692599952221, -0.02218409255146980286, -0.04993303492665290833, -0.02536479942500591278, -0.01420719083398580551, 0.02483038790524005890, 0.00301250279881060123, -0.01602375134825706482, -0.00490302639082074165, -0.02998798340559005737, -0.03650434687733650208, -0.00372582348063588142, -0.01847072876989841461, 0.00176017137710005045, 0.00000587770318816183, -0.02380034886300563812, -0.01914648525416851044, 0.00574311986565589905, -0.00516308331862092018, -0.02142616547644138336, -0.01339503191411495209, 0.00649569928646087646, -0.00843247398734092712, -0.00743417441844940186, -0.00224194396287202835, -0.02044957503676414490, -0.02678380534052848816, -0.01271522045135498047, 0.00854803062975406647, 0.00869627017527818680, -0.00127208884805440903, -0.00765171553939580917, -0.00072013773024082184, 0.00487778894603252411, -0.00028629839653149247, -0.00407550763338804245, -0.00154729292262345552, -0.01119642145931720734, -0.02044899575412273407, -0.01618505455553531647, -0.00454480201005935669, 0.00652313837781548500, 0.01077846996486186981, 0.00749965710565447807, 0.00239360216073691845, -0.00137783808168023825, -0.00047965475823730230, 0.00103314779698848724, 0.00073176372097805142, 0.00011957731476286426, 0.00048437964869663119, -0.00443928549066185951, -0.00870899297297000885, -0.00963459815829992294, -0.00485669262707233429, 0.00102971738670021296 ], [ 0.04416621848940849304, -0.00000196840733224235, 0.04441894218325614929, 0.05566719919443130493, -0.00000332029890159902, -0.00000162266655934218, 0.00802783016115427017, 0.06569921970367431641, 0.04400639608502388000, -0.00000364653647011437, -0.00000282796668216179, -0.00000009451760973889, -0.01984800957143306732, 0.03262102603912353516, 0.05616516619920730591, 0.03198552876710891724, -0.00000311281064568902, -0.00000269574957201257, -0.00000079875667324814, 0.00000067332200615056, -0.01875725574791431427, -0.00337755866348743439, 0.03541867807507514954, 0.04231523722410202026, 0.02121961861848831177, -0.00000214405281440122, -0.00000121517462048359, -0.00000086875400029385, 0.00000022306319635845, 0.00000056103021961462, -0.00414814334362745285, -0.01206964347511529922, 0.00798735953867435455, 0.02917726151645183563, 0.02824143320322036743, 0.01239884924143552780, -0.00000123533948226395, 0.00000105947685824503, 0.00000018554118241809, -0.00000060809873048129, 0.00000069488305598497, 0.00000001441140540237, 0.00244903960265219212, -0.00228783464990556240, -0.00173095404170453548, 0.00994849111884832382, 0.01965933479368686676, 0.01611355692148208618, 0.00572343263775110245, -0.00000072502302828070, 0.00000314748376695206, 0.00000240639587900660, -0.00000136172241127497, 0.00000028975142640775, 0.00000066525188913147, -0.00000120427637284592, -0.00065475510200485587, 0.00315915746614336967, 0.00284748314879834652, 0.00251126196235418320, 0.00693463068455457687, 0.01041267439723014832, 0.00686440058052539825, 0.00109652744140475988 ], [ 0.07281720638275146484, 0.00000479510708828457, 0.11256048083305358887, 0.00000158623981860728, 0.00000262338312495558, 0.00000748489901525318, 0.11455319076776504517, 0.00000166379084021173, -0.00000170267958310433, 0.00000758178020987543, 0.00000451263395007118, 0.00000681224310028483, 0.09189040958881378174, -0.00000050595411948962, -0.00000308924268210831, -0.00000076674194815496, -0.00000292071240437508, 0.00001504963165643858, 0.00000436275331594516, 0.00000361774209522991, 0.05685766041278839111, -0.00000425718644692097, -0.00000344748195857392, -0.00000150183529967762, 0.00000384549684895319, -0.00000103230252079811, -0.00000655638314128737, 0.00001840779259509873, 0.00000157421288804471, 0.00000069087155907255, 0.02194879762828350067, -0.00000763839307182934, -0.00000242998362409708, -0.00000179261314769974, 0.00000840832399262581, 0.00000162672517944884, 0.00000109700692974002, -0.00000224292762140976, -0.00000952730351855280, 0.00001382416758133331, -0.00000273904629466415, 0.00000057070320735875, -0.00341858575120568275, -0.00000867986818775535, -0.00000061376175608530, -0.00000127483770029357, 0.00001176234582089819, 0.00000408288269682089, -0.00000074871593369608, -0.00000251556730290758, 0.00000284353677670879, -0.00000298471513815457, -0.00000977909439825453, 0.00000187434784493234, -0.00000629932992524118, 0.00000355144538843888, -0.01525186095386743546, -0.00000672792975819902, 0.00000085505195102087, -0.00000008109199001183, 0.00001135606271418510, 0.00000681638539390406, -0.00000182859673714120, -0.00000030995465749584 ], [ 0.04255681112408638000, 0.04173205420374870300, 0.04346428066492080688, -0.03260423988103866577, -0.03937913849949836731, 0.04838372394442558289, 0.00908870156854391098, -0.04135344177484512329, -0.01176848635077476501, 0.00809266697615385056, -0.05251901596784591675, 0.02256275899708271027, -0.01829426735639572144, -0.02511933818459510803, -0.01044798828661441803, 0.02822538092732429504, 0.01356768235564231873, 0.01632467471063137054, -0.03641969338059425354, -0.00429996335878968239, -0.01866151578724384308, -0.00311706238426268101, 0.00066450319718569517, 0.03606395423412322998, -0.01393706444650888443, -0.01132219750434160233, 0.01430916599929332733, 0.01998918130993843079, -0.01139316800981760025, -0.00946002360433340073, -0.00531163858249783516, 0.00666854996234178543, 0.00821592286229133606, 0.02238329127430915833, -0.02186447009444236755, -0.00355935981497168541, 0.00067853479413315654, -0.01525670103728771210, 0.00354918185621500015, 0.01601615920662879944, 0.00055392348440364003, -0.00086133641889318824, 0.00169973995070904493, 0.00450497027486562729, 0.00485236942768096924, 0.00415507657453417778, -0.02004948817193508148, -0.00128066120669245720, 0.00642480840906500816, 0.00256504514254629612, 0.00234015495516359806, -0.01016800384968519211, -0.00661959685385227203, 0.00773026188835501671, -0.00104010058566927910, 0.00334537657909095287, -0.00026996177621185780, 0.00068530446151271462, -0.00250769080594182014, -0.00163134676404297352, -0.01165615394711494446, 0.00466040754690766335, 0.00732497591525316238, -0.00113260210491716862 ], [ 0.04257141426205635071, -0.04174359142780303955, 0.04347521066665649414, -0.03262184560298919678, 0.03938955441117286682, -0.04839505255222320557, 0.00907947029918432236, -0.04137481003999710083, -0.01176173239946365356, -0.00809803884476423264, 0.05253594368696212769, -0.02256058901548385620, -0.01831789687275886536, -0.02512573823332786560, -0.01043687388300895691, 0.02821734733879566193, -0.01355526223778724670, -0.01633682288229465485, 0.03642925620079040527, 0.00431525940075516701, -0.01867849752306938171, -0.00310342013835906982, 0.00067347654839977622, 0.03605738654732704163, -0.01392675563693046570, 0.01130340341478586197, -0.01429543178528547287, -0.01999925449490547180, 0.01138660591095685959, 0.00947435852140188217, -0.00531075987964868546, 0.00668587349355220795, 0.00821567419916391373, 0.02238157205283641815, -0.02185708656907081604, -0.00355823175050318241, -0.00066876353230327368, 0.01523929182440042496, -0.00354460417293012142, -0.01601284556090831757, -0.00056559278164058924, 0.00086713751079514623, 0.00170818588230758905, 0.00450738565996289253, 0.00484438287094235420, 0.00415645306929945946, -0.02004782855510711670, -0.00128087343182414770, 0.00641181739047169685, -0.00256273522973060608, -0.00232900679111480713, 0.01016344223171472549, 0.00661271484568715096, -0.00771739613264799118, 0.00103950570337474346, -0.00333954370580613613, -0.00026695750420913100, 0.00067421921994537115, -0.00251012342050671577, -0.00162596325390040874, -0.01165342703461647034, 0.00465370528399944305, 0.00731671648100018501, -0.00112236768472939730 ], [ 0.04146321862936019897, 0.05115205422043800354, 0.04280475899577140808, 0.00543248094618320465, 0.01005687471479177475, 0.06237914413213729858, 0.00977543648332357407, 0.00422528292983770370, -0.03881517797708511353, -0.02622063457965850830, 0.00899330340325832367, 0.03412314504384994507, -0.01728373952209949493, -0.00146694970317184925, -0.05197246372699737549, -0.01252603624016046524, -0.01252782158553600311, -0.03745229542255401611, -0.00047491249279119074, 0.00029487765277735889, -0.01861651800572872162, -0.00442963140085339546, -0.03637790679931640625, -0.01230998057872056961, 0.01533244457095861435, 0.00714616989716887474, -0.01314484886825084686, -0.02982755005359649658, -0.00701938150450587273, -0.01100792922079563141, -0.00609066197648644447, -0.00175154802855104208, -0.01177202817052602768, -0.00153063470497727394, 0.02318283542990684509, 0.01049940939992666245, 0.00731982337310910225, 0.01162811648100614548, -0.00315893930383026600, -0.01388078741729259491, -0.00426121382042765617, -0.00438014091923832893, 0.00118607981130480766, 0.00211049313656985760, 0.00024263488012365997, 0.00737468153238296509, 0.02015557140111923218, 0.01149313244968652725, -0.00194662902504205704, 0.00055830151541158557, 0.00814121309667825699, 0.01093912869691848755, 0.00616821506991982460, -0.00422541471198201180, 0.00204135640524327755, 0.00125386530999094248, -0.00005853497350472026, 0.00244656740687787533, -0.00100075290538370609, 0.00586561812087893486, 0.01086379773914813995, 0.00358152389526367188, -0.00383815472014248371, -0.00397027423605322838 ], [ 0.04146879911422729492, -0.05115505680441856384, 0.04281285405158996582, 0.00542806135490536690, -0.01005000434815883636, -0.06238571181893348694, 0.00978205259889364243, 0.00421982677653431892, -0.03881289809942245483, 0.02621347270905971527, -0.00898331310600042343, -0.03413049504160881042, -0.01728084683418273926, -0.00146799080539494753, -0.05197319015860557556, -0.01251959241926670074, 0.01252331584692001343, 0.03744679316878318787, 0.00047967347200028598, -0.00029802307835780084, -0.01861553266644477844, -0.00442415662109851837, -0.03638226166367530823, -0.01230059936642646790, 0.01532245147973299026, -0.00713590672239661217, 0.01314011123031377792, 0.02982696518301963806, 0.00701426528394222260, 0.01100881770253181458, -0.00608609383925795555, -0.00174418662209063768, -0.01177495345473289490, -0.00152615038678050041, 0.02317313849925994873, 0.01049686968326568604, -0.00731882173568010330, -0.01161735318601131439, 0.00315957167185842991, 0.01388146635144948959, 0.00425209524109959602, 0.00437660422176122665, 0.00119645532686263323, 0.00211410527117550373, 0.00024265093088615686, 0.00737013574689626694, 0.02015086263418197632, 0.01149354781955480576, -0.00193792022764682770, -0.00056498055346310139, -0.00814465247094631195, -0.01093358825892210007, -0.00616080360487103462, 0.00422636093571782112, -0.00204605516046285629, -0.00126840907614678144, -0.00004962267848895863, 0.00244696461595594883, -0.00100462068803608418, 0.00585822062566876411, 0.01086187828332185745, 0.00358784082345664501, -0.00382868479937314987, -0.00397066259756684303 ], [ 0.05298346653580665588, 0.00000848548370413482, 0.04969559237360954285, -0.06773263961076736450, -0.00001280817923543509, 0.00000739041797714890, 0.00232456275261938572, -0.07484346628189086914, 0.05077829211950302124, 0.00001095926836569561, -0.00001211442395288032, -0.00000034558905781523, -0.02827247977256774902, -0.02899013645946979523, 0.06227054819464683533, -0.03125916421413421631, -0.00000452411268270225, 0.00001039404924085829, -0.00000168355029472878, -0.00000479839854961028, -0.01931094750761985779, 0.01323632895946502686, 0.03513285145163536072, -0.04206258431077003479, 0.01366549450904130936, -0.00000241708198700508, -0.00000222398398364021, 0.00000285380247078137, 0.00000584206600251491, -0.00000164754078468832, 0.00212561874650418758, 0.01545732095837593079, 0.00318697653710842133, -0.02978770248591899872, 0.02102696336805820465, -0.00089506176300346851, 0.00000593861386732897, -0.00000779416677687550, 0.00000024601811787761, -0.00000194711083167931, 0.00000392816127714468, 0.00000394288008465082, 0.00654366286471486092, -0.00288687227293848991, -0.00469856802374124527, -0.01050878595560789108, 0.01889660768210887909, -0.00408558826893568039, -0.00595616362988948822, -0.00000440360463471734, 0.00001370260360999964, -0.00000684525002725422, -0.00000230854175242712, -0.00000103199010936805, -0.00000220993888433441, 0.00000569973417441361, -0.00263694999739527702, -0.00844548083841800690, 0.00427753711119294167, -0.00219392520375549793, 0.01103174686431884766, -0.00735001778230071068, -0.00617626123130321503, 0.00750808184966444969 ], [ 0.08860497921705245972, -0.00000747947433410445, -0.09977780282497406006, 0.04842934012413024902, -0.00001293482728215167, 0.00000538772383151809, 0.04328290000557899475, -0.05197134613990783691, 0.04557596892118453979, -0.00001370072186546167, 0.00000957633892539889, 0.00000180435790753108, 0.00683208042755723000, 0.01767544820904731750, -0.05371300131082534790, 0.03699811547994613647, -0.00001022499054670334, 0.00000986349914455786, 0.00000326969097841356, -0.00000304119248539791, -0.01430520042777061462, 0.01165596395730972290, 0.02682796493172645569, -0.04622834920883178711, 0.02413720823824405670, -0.00000406403114538989, 0.00000627687859378057, 0.00000426427141064778, -0.00000792049377196236, -0.00000396203677155427, -0.00088764715474098921, -0.01052875909954309464, 0.00174345017876476049, 0.02753023430705070496, -0.03072325326502323151, 0.01232710387557744980, 0.00000190461673810205, -0.00000058965662219634, 0.00000399669670514413, -0.00001052573588822270, -0.00000150046832914086, 0.00001006257843982894, 0.00668386043980717659, -0.00419794535264372826, -0.00603555468842387199, -0.00458329962566494942, 0.01942573301494121552, -0.01488498784601688385, 0.00483621750026941299, 0.00000508786524733296, -0.00000780161190050421, 0.00000482265113532776, -0.00000688650425217929, 0.00000236881874116079, 0.00001211616290675011, -0.00000824065227789106, 0.00038853811565786600, 0.00730463443323969841, -0.00439881859347224236, -0.00122335250489413738, -0.00513854529708623886, 0.00827761180698871613, -0.00464855739846825600, 0.00082823954289779067 ], [ 0.08972264081239700317, 0.04567824304103851318, -0.09954756498336791992, 0.03031627275049686432, 0.04928301647305488586, -0.04801107570528984070, 0.04095518216490745544, -0.03178725019097328186, -0.00765838101506233215, 0.02013937197625637054, -0.05819375067949295044, 0.01464220322668552399, 0.00837755575776100159, 0.00964654795825481415, 0.00698326714336872101, -0.02661720104515552521, -0.00526029150933027267, -0.02792088873684406281, 0.02928539924323558807, 0.01271451357752084732, -0.01297695469111204147, 0.00813990551978349686, -0.00073583144694566727, 0.03071047551929950714, -0.01917571760714054108, -0.00897552911192178726, 0.00369363953359425068, 0.02053070999681949615, 0.00160265271551907063, -0.01051816251128911972, -0.00324103306047618389, -0.00594761734828352928, -0.00274786259979009628, -0.01475491095334291458, 0.02472115866839885712, -0.00479494687169790268, -0.00212221173569560051, 0.01087632123380899429, 0.00213136756792664528, -0.00720088230445981026, -0.00655756937339901924, -0.00370339886285364628, 0.00713589088991284370, -0.00407300284132361412, 0.00042535894317552447, -0.00073499255813658237, -0.01574602164328098297, 0.00771573791280388832, 0.00018010413623414934, -0.00004315430123824626, 0.00297173531726002693, -0.00573941646143794060, -0.00499340100213885307, 0.00026016548508778214, -0.00421499833464622498, 0.00602487241849303246, 0.00170039106160402298, 0.00541046401485800743, 0.00220571411773562431, 0.00107139104511588812, 0.00377531629055738449, -0.00708660529926419258, 0.00021930043294560164, -0.00196873885579407215 ], [ 0.08972083032131195068, -0.04567986726760864258, -0.09954183548688888550, 0.03031749650835990906, -0.04928637295961380005, 0.04801104962825775146, 0.04094434529542922974, -0.03178620710968971252, -0.00765990233048796654, -0.02013917639851570129, 0.05819743126630783081, -0.01463609561324119568, 0.00838930625468492508, 0.00964179541915655136, 0.00698654539883136749, -0.02661913819611072540, 0.00526091270148754120, 0.02792080491781234741, -0.02928473241627216339, -0.01272528991103172302, -0.01298376545310020447, 0.00814526341855525970, -0.00073598034214228392, 0.03071626834571361542, -0.01917336508631706238, 0.00897043012082576752, -0.00369631219655275345, -0.02053183317184448242, -0.00160801503807306290, 0.01052524428814649582, -0.00323860393837094307, -0.00595047883689403534, -0.00275407102890312672, -0.01475845556706190109, 0.02472428046166896820, -0.00479073682799935341, 0.00211225450038909912, -0.01087698154151439667, -0.00213006837293505669, 0.00720300106331706047, 0.00656223343685269356, 0.00370388152077794075, 0.00713067315518856049, -0.00407098513096570969, 0.00043130785343237221, -0.00073967204662039876, -0.01575363241136074066, 0.00771688064560294151, 0.00017789939010981470, 0.00003728080992004834, -0.00297193648293614388, 0.00574553618207573891, 0.00499623967334628105, -0.00025990590802393854, 0.00421429518610239029, -0.00602429592981934547, 0.00171170593239367008, 0.00540549727156758308, 0.00220836931839585304, 0.00107919692527502775, 0.00377938733436167240, -0.00709370849654078484, 0.00022295613598544151, -0.00197907793335616589 ], [ 0.02, 0.0115470054, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0.02, -0.0115470054, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ] ], "Routing": [ 1, 2, 3, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 4, 10 ] } } ././@LongLink0000644000000000000000000000016000000000000011600 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/SimpleDecoder/Source/Presets/t_design_60ch.jsonIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/SimpleDecoder/Source/Presets/t_desig0000664002537200253720000036076515257173642031615 0ustar zmoelnigzmoelnig{ "Name": "All-Round Ambisonic decoder (AllRAD) and loudspeaker layout", "Description": "This configuration file was created with the IEM AllRADecoder v0.9.5 plug-in. 8 Nov 2024 5:32:07pm", "Decoder": { "Name": "Decoder", "Description": "A 7th order Ambisonics decoder of a 10th order t-design (60 channels).", "ExpectedInputNormalization": "n3d", "Weights": "none", "WeightsAlreadyApplied": false, "Matrix": [ [ 0.025321915745735, 0.024354023858905, -0.014468868263066, -0.031525928527117, -0.037512756884098, -0.017617413774133, -0.016945086419582, 0.022465826943517, 0.009888051077724, 0.03219049051404, 0.031135074794292, -0.008146326057613, 0.022973721846938, 0.01086687669158, -0.007674310356379, 0.013359132222831, -0.014832083135843, -0.029155310243368, 0.004700199235231, 0.018993370234966, 0.000261083274381, -0.024265887215734, -0.001785690896213, -0.013040620833635, -0.025119123980403, -0.002228090772405, 0.013669042848051, 0.001068529789336, -0.025145826861262, -0.004939370322973, -0.017480475828052, 0.005795035045594, 0.006287601776421, 0.001486068824306, 0.02555282600224, 0.022559242323041, 0.010481086559594, 0.003884770674631, -0.001723543857224, 0.017819698899984, 0.011285858228803, -0.010571168735623, 0.00908606313169, 0.013621148653328, -0.00215199100785, 0.007773199118674, -0.005781866144389, -0.02376102656126, -0.012260201387107, -0.009734345600009, -0.01307881064713, -0.002730138599873, -0.006249454803765, -0.01066417619586, 0.009841688908637, 0.008524978533387, 0.006702217273414, -0.010412831790745, -0.00265088188462, -0.005725769791752, -0.011028629727662, 0.007696720771492, 0.012589512392879, 0.00306001980789 ], [ 0.0253174174577, -0.01445590890944, -0.031522620469332, 0.024353850632906, -0.017602702602744, 0.022449700161815, 0.0170380435884, -0.037516131997108, 0.009740959852934, -0.013455205596983, 0.031114725396037, -0.020127903670073, 0.00390275917016, 0.03321461006999, -0.016789417713881, -0.000144366218592, -0.00745873618871, 0.025820787996054, -0.033974315971136, 0.009578640572727, -0.017483035102487, -0.01554910838604, 0.017673335969448, 0.000821538909804, -0.004113736562431, -0.002911990042776, 0.014944734051824, -0.031387228518724, 0.024411410093307, 0.002005101181567, 0.017871962860227, -0.003060818416998, -0.01208346709609, -0.001908771810122, 0.008938632905483, -0.004154445137829, -0.000621399783995, 0.005737893749028, -0.019061187282205, 0.026666792109609, -0.009003737941384, -0.008154358714819, -0.009207783266902, 0.012202990241349, 0.00426459684968, 0.002652156865224, -0.012667170725763, 0.00917172152549, -0.002747338730842, 0.00005990461068, 0.000925243890379, -0.006985739804804, 0.017237050458789, -0.015116441994905, -0.003027308499441, 0.007412286940962, 0.000195044194697, -0.010400654748082, 0.000871881376952, -0.002197254449129, 0.013115428388119, -0.013185288757086, 0.006050447933376, -0.001460885861889 ], [ 0.025332055985928, -0.024367496371269, -0.014472763054073, 0.03153482452035, -0.037530396133661, 0.017623731866479, -0.016948079690337, -0.022467078641057, 0.009883299469948, -0.032201688736677, 0.031141925603151, 0.008146705105901, 0.02296943590045, -0.010867523960769, -0.007667461410165, -0.013374807313085, -0.01483357232064, 0.029156967997551, 0.004698536824435, -0.018985696136951, 0.000264337373665, 0.024254461750388, -0.001787892892025, 0.013053426519036, -0.025137407705188, 0.002232632599771, 0.01366289332509, -0.001069354009815, -0.025129403918982, 0.004931721836329, -0.017465343698859, -0.005786013789475, 0.00628468953073, -0.001493249204941, 0.025566613301635, -0.022575268521905, 0.010488911531866, -0.00389764062129, -0.00171762087848, -0.017806723713875, 0.011269995942712, 0.010558233596385, 0.009067478589714, -0.013606649823487, -0.002151636872441, -0.00776185002178, -0.005793372169137, 0.023770259693265, -0.01227518171072, 0.009748234413564, -0.013093505986035, 0.002747172955424, -0.006250768434256, 0.010654967278242, 0.009828268550336, -0.008501208387315, 0.006695625837892, 0.01039114408195, -0.002648564754054, 0.005712821613997, -0.011010522954166, -0.007704733870924, 0.012590501457453, -0.003074940992519 ], [ 0.025308201089501, -0.031511936336756, 0.024342598393559, -0.014456343837082, 0.022448047995567, -0.037501402199268, -0.000090949353762, -0.017604814842343, -0.019616413861513, 0.007190870121121, 0.03111581876874, -0.015650140121579, -0.020459739491343, -0.007998086512089, -0.026153778657317, 0.022848062217236, -0.018085539340973, 0.009654440917075, 0.020770847797394, 0.01221701875329, -0.019484056159854, 0.00503762671724, -0.015871170908213, 0.034412693232298, -0.001751477364451, 0.006025283131748, -0.028605809435248, 0.005912544205785, 0.00073720497312, 0.021778529509902, -0.003401286667213, 0.010337212122977, 0.0014189487556, 0.027534147724509, -0.004098495934159, -0.011528501287103, 0.0058220801875, 0.011187728494406, -0.025143107399344, -0.000314991048072, -0.012016709893942, 0.010724255815148, 0.009252702817321, 0.005941828712821, 0.010524064302444, 0.008273112587631, -0.005710295401514, -0.018469084054232, 0.006516369991004, -0.005002226214856, 0.008906675502658, 0.012636149302125, -0.010974396020174, -0.003166282782331, -0.010382557287812, -0.003869352629408, 0.008685725741088, -0.001065547810867, 0.00704292813316, -0.007072408683598, -0.004931575153023, -0.016615893691778, 0.011833845637739, 0.002183858305216 ], [ 0.025347381830215, -0.014478920958936, 0.031557962298393, -0.024376180022955, 0.017621371895075, -0.022482233121991, 0.01705314964056, -0.037548501044512, 0.009736557491124, -0.013454514555633, 0.03114452958107, -0.02015102095902, -0.003912407904863, -0.033239092677832, 0.016782792285085, 0.0001573155605, 0.007444065995514, -0.025819988921285, 0.034000027924776, -0.009581281803548, -0.017502697184682, -0.015555055812001, 0.017666958272457, 0.000843058049213, -0.004117339383811, -0.00289713870734, 0.01491950172931, -0.031385339796543, 0.024419249966741, 0.002017700579017, -0.017883107066154, 0.003067314857617, 0.012078533880413, 0.001930059981532, -0.008943630382419, 0.004144351463765, 0.000615091237705, -0.005713114980608, 0.019034702330828, -0.026660781353712, 0.008993430994451, 0.008167115971446, -0.009205650538206, 0.012205006554723, 0.004261856898665, 0.002665401436388, -0.012670188210905, 0.009150963276625, -0.002730284584686, 0.000057876008213, 0.000917967816349, -0.006962459068745, 0.017217559739947, -0.015104283578694, -0.003042379627004, 0.007414894644171, -0.000192497158423, 0.010387726128101, -0.000869890034664, 0.002201221184805, -0.01311462931335, 0.013158634305, -0.006017117295414, 0.001444889232516 ], [ 0.025331908836961, 0.031538348644972, -0.024364724755287, -0.014467922970653, -0.022463716566563, -0.037529967725277, -0.000089316687081, 0.01761475391686, -0.019627740606666, -0.007186584174633, 0.031130898743868, 0.015659483149648, 0.020467359572649, -0.00799707788974, 0.026170808821917, 0.022856343537569, 0.01807720027864, 0.009656648151577, -0.020771339535713, 0.012220963835716, -0.019478978589177, -0.005042768083513, -0.015884160995483, -0.034422934055328, -0.00176351936534, -0.006032777018845, -0.02860009111464, -0.005925538949668, 0.000728740880731, -0.021769607439637, 0.00338270701468, 0.010331588797271, -0.001414039055817, 0.027537945657969, 0.004105880856514, -0.011502219364047, -0.005785292480141, 0.011191848665476, 0.025147156789899, -0.00029955903301, 0.012012431398034, 0.010692375712097, 0.009260387159884, -0.005922983866185, 0.010518481954932, -0.008270224556327, -0.005701102782041, 0.018442844972014, 0.006509498693049, 0.004978913348168, 0.008866439573467, -0.012629479169846, -0.010984695516527, 0.003158600302413, -0.010354843921959, 0.003899470670149, -0.00866418145597, -0.001081789610907, -0.007026031147689, -0.007069466169924, 0.004912726115435, -0.016614481806755, -0.011821699328721, 0.002148309489712 ], [ 0.025318570435047, 0.014464274980128, -0.031520735472441, -0.024354781955481, -0.017610099166632, -0.022459616884589, 0.017028464004397, 0.037516504526138, 0.009732441976666, 0.013453237712383, 0.031125832349062, 0.020130194723606, 0.00391989806667, -0.033211454749107, -0.016776947304606, 0.000155984394951, -0.007450250908732, -0.025817146524787, -0.033982090651989, -0.009568355977535, -0.017501654103398, 0.01553959865123, 0.0176637545228, -0.000840544118546, -0.004119711462408, 0.00290449988097, 0.014928651042283, 0.031382892280817, 0.02440956607461, -0.002024486893788, 0.017883533611894, 0.003076063003391, -0.012081269174814, 0.001926571014337, 0.008947875350714, 0.004153816029429, -0.000618099234998, -0.005723955109715, -0.019042132422328, -0.026663159951568, -0.008991806767881, 0.008173517882824, -0.009207602590322, -0.012218749150634, 0.004269085358828, -0.002660754602402, -0.012675178237259, -0.009167639538646, -0.002744941972196, -0.000061324157286, 0.000921211554669, 0.006969337817281, 0.017221812158823, 0.015114769339561, -0.003043330507353, -0.007422951050103, 0.000186183751794, 0.010410720482469, 0.000864199537318, 0.00219476595521, 0.013119399547577, 0.01317601185292, 0.006043083500117, 0.001460269326344 ], [ 0.025327879935503, 0.031534858047962, 0.024357717484236, 0.014472152106464, 0.022474383935332, 0.037521678954363, -0.000095304574643, 0.017615634948015, -0.019623881205916, -0.007178573403507, 0.031137175858021, 0.015650928020477, -0.020467838272452, 0.00799114909023, -0.026163760572672, -0.022872935980558, -0.018096260726452, -0.009646537713706, 0.020764166489244, -0.012222971767187, -0.019476164132357, -0.005049739498645, -0.015879420563579, -0.034436751157045, -0.001778417965397, -0.00605450803414, -0.028619015589356, -0.005922817625105, 0.000715805275831, -0.021767677739263, -0.003384031588212, -0.01033263001591, 0.00141156942118, -0.027535054832697, -0.004123790655285, 0.011518849059939, 0.005795431323349, -0.011218900792301, -0.025150179862976, 0.000291235395707, -0.012017977423966, -0.0106978751719, 0.009254016913474, -0.005919526796788, 0.010514059104025, -0.008256727829576, -0.005706784781069, 0.018460854887962, 0.006534886080772, 0.005002856720239, 0.008877696469426, -0.012641448527575, -0.010975170880556, 0.003148530377075, -0.010352552868426, 0.003883730620146, 0.008662469685078, 0.001083044102415, 0.007031949236989, 0.007077830843627, -0.004902057349682, 0.01662022806704, 0.011854423210025, -0.002150583313778 ], [ 0.025317594408989, 0.014459769241512, 0.031520158052444, 0.024354269728065, 0.017607105895877, 0.022453553974628, 0.017031967639923, 0.037512730807066, 0.009738741442561, 0.013456831686199, 0.031119652092457, 0.020127831026912, -0.003907858394086, 0.033205401152372, 0.016782907769084, -0.00014753677533, 0.007458368316293, 0.025821253657341, 0.033975455909967, 0.009574386291206, -0.017480906099081, 0.015538989566267, 0.017662556841969, -0.000828928081319, -0.004115127958357, 0.002911965362728, 0.014941766858101, 0.031384225934744, 0.024408450350165, -0.002009761985391, -0.017861690372229, -0.003062929026783, 0.012073057703674, -0.001920115202665, -0.008941470645368, -0.00415423233062, 0.000621930754278, 0.00573692470789, 0.019054025411606, 0.026662087067962, 0.009001078084111, -0.008155511692166, -0.009195822291076, -0.012192761525512, 0.004261845257133, -0.002664488973096, -0.012672034092247, -0.009169956669211, -0.002747538033873, -0.000060804817622, 0.000927768764086, 0.006982197985053, 0.017227668315172, 0.015115761198103, -0.003025132231414, -0.007409433368593, -0.000189563332242, -0.010383504442871, -0.000862944929395, -0.002205522498116, -0.013123322278261, -0.01318199839443, -0.0060492628254, -0.001461960724555 ], [ 0.025323627516627, -0.031525354832411, -0.024359952658415, 0.014468696899712, -0.022464882582426, 0.037522800266743, -0.000085136511188, -0.017614925280213, -0.019612334668636, 0.00716927042231, 0.03113310597837, -0.015667088329792, 0.020464276894927, 0.007994363084435, 0.026161143556237, -0.022855579853058, 0.018072893843055, -0.009642984718084, -0.020770635455847, -0.012211686000228, -0.019485637545586, 0.005048701539636, -0.015893073752522, 0.034425657242537, -0.001780082355253, 0.0060452837497, -0.028600787743926, 0.005932037252933, 0.000721519812942, 0.021774508059025, 0.003393227467313, -0.01033722423017, -0.001397310406901, -0.027541641145945, 0.004122321028262, 0.011494935490191, -0.005777643527836, -0.011207619681954, 0.02515409886837, 0.000278851104667, 0.012022675015032, -0.010708084329963, 0.00925684068352, 0.005924683064222, 0.010513762943447, 0.0082673933357, -0.005700268317014, -0.01844041235745, 0.006515874527395, -0.004979304037988, 0.008862455375493, 0.012634830549359, -0.010988402180374, -0.003144687274471, -0.010360567830503, -0.003887862432748, -0.008668444119394, 0.001082346774638, -0.00703610572964, 0.007079469971359, 0.004894290585071, 0.016621589660645, -0.011833258904517, -0.002143396995962 ], [ 0.02531635388732, -0.024352030828595, 0.014464593492448, -0.031517513096333, 0.037508677691221, -0.017615005373955, -0.016942456364632, -0.022457869723439, 0.009880767203867, -0.032185297459364, 0.031130250543356, 0.008145046420395, -0.022966904565692, 0.010867465287447, 0.007667680736631, 0.01336426846683, 0.014827147126198, -0.029150649905205, -0.004700225312263, 0.018987355753779, 0.00026438065106, 0.024260398000479, -0.001790144015104, 0.013045171275735, -0.025122091174126, 0.002231831429526, 0.013665231876075, -0.001065784483217, -0.025140002369881, 0.004935227334499, 0.017476232722402, 0.005789796821773, -0.006292433012277, 0.001492958399467, -0.025557275861502, 0.022561078891158, -0.010483961552382, 0.00388973695226, 0.001716486061923, 0.017823612317443, -0.011280782520771, -0.010566771030426, 0.009079223498702, -0.013621469028294, -0.002154202898964, -0.007761462125927, -0.005790022201836, 0.023765789344907, -0.012262252159417, 0.009737736545503, -0.013085471466184, 0.00274343485944, -0.006265740841627, 0.010669112205505, 0.009839951060712, -0.008516295813024, -0.006703048478812, -0.010409178212285, 0.002656110096723, -0.005718025844544, 0.011020096950233, 0.007702316623181, -0.012591796927154, 0.003062552772462 ], [ 0.025343811139464, 0.024378124624491, 0.014477732591331, 0.031549528241158, 0.037546195089817, 0.017626641318202, -0.016956454142928, 0.022476186975837, 0.009888028725982, 0.032214064151049, 0.031146997585893, -0.008153779432178, -0.022976916283369, -0.010871183127165, 0.00767594575882, -0.013379641808569, 0.014838666655123, 0.029162900522351, -0.004705564118922, -0.018989346921444, 0.000264283531578, -0.024261113256216, -0.001781067578122, -0.013044843450189, -0.025145681574941, -0.002232851926237, 0.013671846129, 0.001068884273991, -0.025131760165095, -0.004930055700243, 0.017466496676207, -0.005790826398879, -0.006285298615694, -0.001478380057961, -0.025556575506926, -0.022581851109862, -0.010490950196981, -0.003882048418745, 0.001728100818582, -0.017803862690926, -0.011268892325461, 0.01055651716888, 0.009070211090147, 0.01360138040036, -0.002158301183954, 0.007763547357172, -0.005775819066912, -0.023761678487062, -0.012279151938856, -0.009750842116773, -0.01307238265872, -0.002724712481722, -0.006243559531868, -0.010653547942638, 0.009820406325161, 0.008499952964485, -0.006687060929835, 0.010390853509307, 0.002642452018335, 0.005704779643565, 0.011009883135557, -0.007692589890212, -0.012589935213327, -0.003077612956986 ], [ 0.020840169861913, -0.024228220805526, 0.002477955538779, 0.025302292779088, -0.036884509027004, -0.003542278660461, -0.021204935386777, 0.003844319609925, 0.001585666672327, -0.027373975142837, -0.006308718118817, 0.019371617585421, -0.00489853322506, -0.020162008702755, 0.000517275650054, -0.024089619517326, -0.00286786723882, -0.0054124109447, 0.025486402213573, 0.005256448872387, 0.017027128487825, -0.005733001511544, -0.000966730935033, -0.004231397993863, -0.034122098237276, 0.019353857263923, -0.001094994833693, 0.01669424213469, 0.007916138507426, -0.014325954951346, 0.005803164560348, 0.014797722920775, -0.000704159145243, 0.015006697736681, -0.006799126043916, -0.023823002353311, 0.026044361293316, 0.003593161934987, 0.001228195615113, 0.006007326301187, -0.017076699063182, -0.005313841626048, -0.011746874079108, 0.005860773846507, 0.000465789751615, 0.004565178416669, 0.018907830119133, -0.005341524723917, -0.003176752245054, 0.016980033367872, 0.005471634678543, -0.009978867135942, 0.001217296463437, -0.00989396777004, -0.00703804101795, 0.009116930887103, -0.005068760830909, -0.009268346242607, 0.000738717499189, -0.009300108999014, 0.006578005850315, 0.011515935882926, -0.001217787968926, 0.012832330539823 ], [ 0.020818341523409, 0.002480697352439, 0.025277899578214, -0.024202611297369, -0.003546689637005, 0.003848281223327, 0.011966821737587, -0.036850892007351, 0.017551932483912, 0.003560440381989, -0.006316624581814, 0.003411134937778, -0.006691984366626, -0.031327065080404, 0.030662985518575, -0.011900310404599, -0.003007603110746, 0.006974630057812, -0.006929522845894, 0.001499191625044, -0.018301662057638, -0.011692523956299, 0.032550029456615, -0.0228057410568, 0.007680705282837, 0.002249668817967, -0.006316280458122, 0.008670244365931, -0.004909941926599, -0.000626413675491, -0.017401160672307, 0.008971065282822, 0.021498497575521, -0.027462346479297, 0.015694554895163, -0.004765299614519, -0.001504880026914, 0.004979140125215, -0.008531039580703, 0.007487313356251, -0.001539183780551, -0.001766108092852, -0.0076441350393, 0.01900540292263, 0.004544945433736, -0.02251030690968, 0.020451283082366, -0.010168517939746, 0.002868167124689, 0.000880738371052, -0.003466673661023, 0.007123460527509, -0.008232340216637, 0.00413661962375, 0.001191730378196, -0.001588984276168, 0.002666601678357, 0.015920447185636, -0.008399087004364, -0.010957662016153, 0.018769701942801, -0.013903341256082, 0.006282712332904, -0.001697684405372 ], [ 0.020846137776971, 0.024233372882009, 0.002474105451256, -0.025310663506389, -0.036894131451845, 0.003536535426974, -0.02120928093791, -0.003838413627818, 0.001590647851117, 0.02738624997437, -0.006299073807895, -0.019374214112759, -0.004890020471066, 0.020165042951703, 0.000516989850439, 0.024090167135, -0.002880197949708, 0.005405258387327, 0.025488482788205, -0.005246382206678, 0.017027823254466, 0.005723032634705, -0.000966114923358, 0.004225056152791, -0.03413001075387, -0.019346119835973, -0.001093894825317, -0.016692914068699, 0.007901740260422, 0.014326895587146, 0.005791350733489, -0.014795446768403, -0.000704497972038, -0.015008565969765, -0.006791148800403, 0.023839527741075, 0.026048442348838, -0.00359089509584, 0.001224124222063, -0.005998809821904, -0.017074584960938, 0.005301394034177, -0.011745339259505, -0.005849225912243, 0.000459595612483, -0.004555684980005, 0.018906645476818, 0.005336433183402, -0.003199245082214, -0.017000889405608, 0.005469943396747, 0.009980983100832, 0.001218228018843, 0.009884337894619, -0.007023070938885, -0.009118730202317, -0.005056794267148, 0.009263340383768, 0.000740463554394, 0.009305750951171, 0.006568516138941, -0.011510065756738, -0.001214402262121, -0.012813813053071 ], [ 0.020848771557212, 0.025311740115285, -0.024238070473075, 0.002480214461684, 0.003846837906167, -0.036899294704199, 0.009231663309038, -0.003545330371708, -0.019159816205502, -0.013494997285306, -0.006312245968729, 0.028376124799252, 0.00978603772819, 0.002592977369204, 0.032086048275232, -0.004190515261143, -0.003865489736199, 0.024851968511939, 0.005987597629428, -0.006326180417091, -0.019400442019105, -0.000363390689017, -0.031616412103176, 0.007537361700088, 0.008955556899309, 0.005608045030385, 0.007400213740766, -0.028180113062263, -0.003010950284079, -0.013662729412317, 0.015376191586256, -0.001549846725538, 0.017621912062168, -0.008227725513279, -0.017648166045547, 0.003205928485841, 0.002454471774399, -0.011589611880481, -0.00879059638828, 0.020847572013736, -0.000560237502214, 0.020074268803, -0.003776629222557, 0.00206265039742, 0.000376738724299, 0.005659135524184, 0.02191180549562, -0.006390829570591, -0.00330021744594, -0.001809475710616, -0.00499953282997, 0.015270989388227, 0.007000582292676, -0.00771194929257, 0.002598812570795, -0.013162550516427, -0.005785529036075, -0.001310468069278, -0.011532828211784, -0.001584785524756, -0.018801676109433, 0.007967950776219, 0.007024256978184, -0.001758504775353 ], [ 0.020848145708442, 0.002485904144123, -0.025309087708592, 0.0242386367172, 0.003555033355951, -0.003854653332382, 0.011974759399891, -0.036894101649523, 0.017579836770892, 0.003569170134142, -0.006328451447189, 0.003413835074753, 0.006701683625579, 0.031347494572401, -0.030699335038662, 0.011919964104891, 0.003014118177816, -0.006988778710365, 0.00693702371791, -0.001496874843724, -0.018305888399482, -0.011687683872879, 0.032570920884609, -0.022832402959466, 0.007693382445723, 0.00225218385458, -0.006328492891043, 0.008682005107403, -0.00490833632648, -0.000630024122074, 0.017387324944139, -0.008974960073829, -0.021497359499335, 0.027478745207191, -0.015711227431893, 0.004773383494467, 0.00150285998825, -0.004985377192497, 0.008543992415071, -0.007489095907658, 0.001532130525447, 0.001765767927282, -0.007623959332705, 0.018984314054251, 0.004540408030152, -0.022510347887874, 0.020459936931729, -0.010177773423493, 0.00287435320206, 0.000874851015396, -0.003464568872005, 0.007132765837014, -0.008238623850048, 0.004128681030124, 0.001194509677589, -0.001583423931152, -0.002670953981578, -0.015879642218351, 0.008384021930397, 0.010954666882753, -0.018766853958368, 0.013904492370784, -0.006289025768638, 0.001704170601442 ], [ 0.020853355526924, -0.025316445156932, 0.024243257939816, 0.002481510164216, -0.003853347850963, -0.03690230101347, 0.009237075224519, 0.003542902646586, -0.019166443496943, 0.013504106551409, -0.006315559148788, -0.028377495706081, -0.009775093756616, 0.002583137014881, -0.032090716063976, -0.004202588461339, 0.003881288925186, 0.024860989302397, -0.005977461114526, -0.006336651276797, -0.019383082166314, 0.000348983943695, -0.031615901738405, -0.007550503592938, 0.008966257795691, -0.005619298201054, 0.007422064431012, 0.028182519599795, -0.002986695617437, 0.013635402545333, -0.0153629751876, -0.001560712000355, -0.017625477164984, -0.00822701305151, 0.017660992220044, 0.003223042236641, -0.002471005311236, -0.011604702100158, 0.008802344091237, 0.020848674699664, 0.000587149290368, 0.020040813833475, -0.003780564060435, -0.002063698135316, 0.00035713656689, -0.005637953057885, 0.021918173879385, 0.006417328026146, -0.003311286214739, 0.001819891971536, -0.005026375874877, -0.015280324965715, 0.006991419009864, 0.00772405648604, 0.002614522352815, 0.013145628385246, 0.005765127949417, -0.001302650081925, 0.011500655673444, -0.001552070025355, 0.018802717328072, 0.0079888086766, -0.007040313445032, -0.001773481606506 ], [ 0.020837722346187, -0.00247802073136, 0.025301337242126, 0.02422365359962, -0.003540843026713, -0.003845562692732, 0.011979395523667, 0.036880552768707, 0.017567366361618, -0.003552759531885, -0.006307966075838, -0.00341208348982, -0.006691535003483, 0.03134972602129, 0.030686743557453, 0.01191128231585, -0.002999291289598, -0.006961318198591, -0.006924126297235, -0.00150605966337, -0.018304515630007, 0.011701743118465, 0.032570526003838, 0.022823898121715, 0.007688169833273, -0.002241351874545, -0.006300779990852, -0.008657534606755, -0.004914016928524, 0.000614803517237, -0.017399288713932, -0.008967832662165, 0.021507998928428, 0.027479786425829, 0.015707328915596, 0.004770469386131, -0.001496973913163, -0.004963000304997, -0.008514090441167, -0.007483329158276, -0.001554688438773, 0.001754088909365, -0.007638711947948, -0.018996076658368, 0.004546412266791, 0.022520001977682, 0.020464355126023, 0.010176879353821, 0.002872494980693, -0.000873814802617, -0.003450675401837, -0.007104970049113, -0.008222427219152, -0.004146059975028, 0.001168752089143, 0.00158181914594, 0.002666687825695, -0.015901394188404, -0.008395574055612, 0.010959259234369, 0.018778394907713, 0.013910964131355, 0.006288920994848, 0.001702429843135 ], [ 0.020835051313043, -0.025297300890088, -0.024221122264862, -0.002479875227436, 0.00384764210321, 0.036874413490295, 0.009225006215274, 0.003544732229784, -0.019155969843268, 0.013502041809261, -0.006313397083431, -0.028353394940495, 0.009775722399354, -0.002592221135274, 0.032073207199574, 0.004193718079478, -0.003871828783303, -0.024856464937329, 0.005988566670567, 0.006321370135993, -0.019378967583179, 0.00036225511576, -0.031596142798662, -0.007542449980974, 0.008970652706921, -0.005627071484923, 0.007410692516714, 0.028173811733723, -0.003010996151716, 0.013645651750267, 0.015359068289399, 0.001552114146762, 0.017605867236853, 0.008232720196247, -0.017668411135674, -0.003215368138626, 0.002466231351718, 0.011619661934674, -0.008801115676761, -0.020832946524024, -0.000562614994124, -0.020049892365932, -0.003775256918743, -0.002066662767902, 0.000377379590645, -0.005662309937179, 0.021923238411546, 0.00640690792352, -0.003319238545373, 0.001825671410188, -0.005019977688789, -0.015296672470868, 0.007007584441453, 0.00770018575713, 0.002605489222333, 0.013150659389794, -0.005775560624897, 0.001315360656008, -0.011520884931087, 0.001584559446201, -0.018797611817718, -0.007984240539372, 0.007056647911668, 0.001771356211975 ], [ 0.020853508263826, -0.002482578158379, -0.025318928062916, -0.024240355938673, 0.003547477070242, 0.003851923160255, 0.011986706405878, 0.036900740116835, 0.017577948048711, -0.003559601027519, -0.006318237166852, -0.003416514024138, 0.006692341063172, -0.03136071190238, -0.03069812245667, -0.011917636729777, 0.003005388192832, 0.006972630973905, 0.006932620424777, 0.001506667933427, -0.018304087221622, 0.011703975498676, 0.032573129981756, 0.022828141227365, 0.007692460902035, -0.002246249001473, -0.006311581004411, -0.008667446672916, -0.004916631150991, 0.000616568548139, 0.017393719404936, 0.008963009342551, -0.021503178402781, -0.027473391965032, -0.015708535909653, -0.004774107132107, 0.001500334008597, 0.004972660448402, 0.008524085395038, 0.00748599646613, 0.001552626607008, -0.001755113597028, -0.007633422035724, -0.018981982022524, 0.004546602722257, 0.022504385560751, 0.020454060286283, 0.010178411379457, 0.002875948790461, -0.000875315337908, -0.00345859490335, -0.007115225307643, -0.008224450051785, -0.004141598008573, 0.001169929746538, 0.001580582000315, -0.002665724139661, 0.015884878113866, 0.008381041698158, -0.01094795204699, -0.018756387755275, -0.013902729377151, -0.006292110774666, -0.001705596921965 ], [ 0.020831305533648, 0.025290971621871, 0.024219263345003, -0.002481160219759, -0.003848769003525, 0.036871187388897, 0.009227871894836, -0.003547217231244, -0.019147424027324, -0.013491827063262, -0.006317192222923, 0.028359504416585, -0.009773728437722, -0.002594538731501, -0.032065905630589, 0.004193088971078, 0.003868301166221, -0.024844272062182, -0.00599390687421, 0.006331046577543, -0.019384874030948, -0.000362238206435, -0.031599540263414, 0.007545124273747, 0.008960589766502, 0.005619455128908, 0.007409519981593, -0.028170710429549, -0.003013205481693, -0.013644909486175, -0.01537196803838, 0.001554842339829, -0.017618894577026, 0.008239896036685, 0.017653385177255, -0.00320877158083, -0.002457513241097, 0.011605899780989, 0.008807121776044, -0.020843291655183, 0.000567035633139, -0.020062981173396, -0.003786641638726, 0.002069095382467, 0.000366515218047, 0.005668509285897, 0.021913174539804, -0.006400158628821, -0.003315997542813, -0.001827698200941, -0.005007961764932, 0.015282911248505, 0.007017420604825, -0.007716338615865, 0.002613033633679, -0.013169778510928, 0.005772053264081, 0.001313609653153, 0.011522327549756, 0.00158182461746, 0.018800681456923, -0.007985463365912, -0.007048793137074, 0.001762269064784 ], [ 0.020853195339441, 0.02424243465066, -0.002477968111634, 0.0253169182688, 0.03690180182457, -0.003540479810908, -0.021217344328761, -0.003845595987514, 0.001586007885635, 0.027381651103497, -0.006307419855148, -0.019383136183023, 0.004897858481854, -0.020171055570245, -0.000522259040736, -0.024096654728055, 0.002868842799217, -0.005415914114565, -0.025496382266283, 0.005253398325294, 0.01703573204577, 0.005733208265156, -0.000961935089435, 0.004224047064781, -0.034123346209526, -0.019346321001649, -0.001104704802856, -0.016691640019417, 0.007912673056126, 0.014334864914417, -0.005801188293844, 0.014801296405494, 0.000707879022229, 0.01501583866775, 0.006794741842896, -0.023818714544177, -0.026027716696262, 0.003581376047805, -0.001216826727614, 0.006006395909935, 0.017081754282117, -0.005310777574778, -0.011751621961594, -0.005858720745891, 0.000457645393908, -0.004558876156807, 0.018907366320491, 0.005344989243895, -0.003181443549693, -0.016970226541162, 0.005464875604957, 0.009985228069127, 0.001219814759679, 0.009886701591313, -0.007033622357994, -0.009122910909355, 0.005066453944892, -0.009268176741898, -0.00073832727503, -0.009309576824307, -0.006571339443326, 0.011503604240716, 0.001228609471582, 0.012810925021768 ], [ 0.020833199843764, -0.024220071732998, -0.002484736498445, -0.025293940678239, 0.036869321018457, 0.003551835892722, -0.021203359588981, 0.003855186980218, 0.001584789366461, -0.027357773855329, -0.006325248163193, 0.019375083968043, 0.004913837183267, 0.020162932574749, -0.000519200519193, 0.02407649345696, 0.00286410166882, 0.005425322335213, -0.025492116808891, -0.005274388473481, 0.017037017270923, -0.005751501303166, -0.000961743702646, -0.004240612499416, -0.034094702452421, 0.019333507865667, -0.001097753993236, 0.01669199578464, 0.007942346855998, -0.014342823065817, -0.005825732834637, -0.014809982851148, 0.000703922763932, -0.015017468482256, 0.006811248138547, 0.023795552551746, -0.026005987077951, -0.00359639339149, -0.001214242773131, -0.006022133864462, 0.01710013858974, 0.005338681861758, -0.011767700314522, 0.00588394748047, 0.000458651164081, 0.004582814872265, 0.018912553787231, -0.005347979720682, -0.00317168654874, 0.016949767246842, 0.005472733639181, -0.009993945248425, 0.001212578034028, -0.009902467951179, -0.007069458253682, 0.009142647497356, 0.005095219705254, 0.009289587847888, -0.000735026551411, 0.009324251674116, -0.006594627629966, -0.011504666879773, 0.001219011144713, -0.012806225568056 ], [ 0.025144482031465, 0.001822424819693, -0.040468450635672, 0.011477138847113, 0.000817708845716, -0.003770926967263, 0.044988393783569, -0.022901197895408, 0.00375143205747, 0.000246623705607, -0.001941601163708, 0.005610377993435, -0.042232230305672, 0.03218262270093, -0.008571121841669, 0.001173788448796, 0.000037778259866, -0.000646278902423, 0.003292124718428, -0.007006181403995, 0.034657318145037, -0.037043530493975, 0.013774367049336, -0.00294707599096, 0.000340485130437, -0.000018126604118, -0.000106869723822, 0.001200750586577, -0.004605325404555, 0.007749291136861, -0.024897888302803, 0.036623500287533, -0.017943354323506, 0.005181903485209, -0.000910888251383, 0.000091682835773, -0.00001744952533, 0.000057307632233, 0.000212913029827, -0.001819917350076, 0.005606410559267, -0.007777039892972, 0.015416163951159, -0.031518589705229, 0.019899785518646, -0.007330731488764, 0.001694452017546, -0.000251950987149, 0.000027786574719, -5.994831099087605e-6, 0.000058698158682, -0.0001291398803, -0.000342685554642, 0.002368288347498, -0.006082960870117, 0.007165537215769, -0.008017994463444, 0.023423375561833, -0.019097732380033, 0.00875992141664, -0.002511103637516, 0.000473330903333, -0.000076774100307, 0.000013050735106 ], [ 0.02511702477932, -0.040425904095173, 0.011470914818347, 0.00181463023182, -0.003755607409403, -0.022892160341144, -0.01922788657248, 0.000814274011645, -0.040796216577291, 0.038601089268923, -0.001934307510965, 0.019070684909821, -0.018779989331961, -0.001160522573628, -0.02615419216454, -0.005473060533404, 0.006758878938854, 0.026707410812378, 0.001868630060926, 0.025843646377325, 0.00554214976728, -0.001126507529989, 0.012253487482667, -0.003082481212914, 0.034755740314722, -0.029914757236838, 0.004029650241137, -0.006798128597438, 0.00220843590796, -0.000698549265508, 0.015101364813745, 0.000465458550025, 0.02259218506515, 0.002167936647311, 0.025116182863712, 0.007498661056161, -0.007659207563847, -0.02196623198688, -0.002153988927603, -0.018048143014312, -0.000466803612653, -0.015508715994656, 0.003383178729564, 0.001002575038001, 0.003291101194918, 0.003016648348421, -0.002859699772671, 0.004611537326127, -0.024614099413157, 0.019296368584037, -0.004742410965264, 0.000422313169111, -0.00343627599068, -0.004782948177308, -0.001662663416937, -0.006352840457112, -0.006155611481518, 0.000071459740866, -0.009839416481555, -0.000224054354476, -0.013168391771615, -0.001954056555405, -0.017853515222669, -0.007276854012161 ], [ 0.025123530998826, -0.00181820942089, -0.040439337491989, -0.011460418812931, 0.000812938960735, 0.003763530636206, 0.044966053217649, 0.022872870787978, 0.003743385430425, -0.000243288421188, -0.001931530539878, -0.005602267570794, -0.042224690318108, -0.032153207808733, -0.008555738255382, -0.00117001880426, 0.000035381206544, 0.000638544443063, 0.003277799813077, 0.007000731769949, 0.034664455801249, 0.037025094032288, 0.013756133615971, 0.002938714111224, 0.00033962589805, 0.000019694558432, -0.000100794211903, -0.001188630354591, -0.004589889198542, -0.007749472744763, -0.024912495166063, -0.036623127758503, -0.017930226400495, -0.005169671494514, -0.000908715941478, -0.000092443711765, -0.000018532828108, -0.000061487560743, 0.00020239247533, 0.001805471256375, 0.005594016984105, 0.007784309796989, 0.015428150072694, 0.031534425914288, 0.019899539649487, 0.00731776561588, 0.001690648961812, 0.000254100275924, 0.000028935535738, 6.736840987286996e-6, 0.000061749720771, 0.00013669548207, -0.000328518624883, -0.002355202566832, -0.006077142897993, -0.007179311010987, -0.008019829168916, -0.023445501923561, -0.019113808870316, -0.008750767447054, -0.002505759475753, -0.00047750066733, -0.000080241326941, -0.000014003930119 ], [ 0.025138078257442, 0.011472835205495, 0.001826130202971, -0.0404590703547, -0.022893669083714, 0.000824174087029, -0.025736594572663, -0.003776512807235, 0.037079446017742, 0.030859809368849, -0.001954364124686, -0.009177319705486, -0.003637418616563, 0.032630976289511, 0.00428423890844, -0.028137875720859, -0.033605348318815, 0.003080489812419, 0.015844769775867, -0.001206492888741, 0.02094428986311, 0.005689987447113, -0.026033122092485, -0.004138982389122, 0.01656393520534, 0.031005455181003, -0.003943820949644, -0.018994832411408, 0.002405390841886, 0.006755384616554, 0.004374151583761, -0.024441298097372, -0.005507448688149, 0.017790643498302, 0.003458699444309, -0.00536563526839, -0.024355694651604, 0.004371573217213, 0.018506921827793, -0.00331454561092, -0.010547760874033, 0.001188002759591, -0.014689008705318, -0.005919067189097, 0.017824739217758, 0.004765973426402, -0.009690151549876, -0.002441135235131, -0.003051799954847, 0.015805665403605, -0.004299924708903, -0.015177274122834, 0.003774709068239, 0.011297307908535, -0.002058390062302, -0.004185262601823, -0.003921187948436, 0.015670264139771, 0.005108824931085, -0.01114491187036, -0.003704170696437, 0.003286377992481, 0.0013221653644, 0.007424262352288 ], [ 0.025133136659861, -0.040451698005199, -0.011472377926111, -0.001827215659432, 0.003780051600188, 0.022894902154803, -0.019244262948632, 0.000820682267658, -0.040819328278303, 0.038616977632046, -0.001947620534338, 0.019091673195362, 0.018781697377563, 0.001164671266451, 0.02615724876523, 0.005505998153239, -0.006795688066632, -0.026710283011198, -0.001872180844657, -0.025845734402537, 0.005557604134083, -0.001130517339334, 0.012269355356693, -0.003100627101958, 0.034761141985655, -0.029908299446106, 0.004049154464155, -0.006806117016822, 0.002211974933743, -0.000718942610547, -0.015103812329471, -0.000464872427983, -0.022593094035983, -0.00216828007251, -0.025118306279182, -0.007534441538155, 0.007689635269344, 0.021967295557261, 0.002150379819795, 0.018046287819743, 0.000465377641376, 0.015513579361141, 0.003367984900251, 0.001000862452202, 0.003274847287685, 0.00301571493037, -0.002858279272914, 0.004628551192582, -0.024596426635981, 0.019270062446594, -0.00475357612595, 0.000411681015976, -0.003428546478972, -0.004772252868861, -0.001656307722442, -0.00633429037407, 0.006162584759295, -0.00007051529974, 0.009843904525042, 0.000223404058488, 0.013162342831492, 0.00194716011174, 0.017853694036603, 0.007298806682229 ], [ 0.025134304538369, -0.011473710648715, -0.001829955494031, -0.040452659130096, 0.022895636036992, 0.00082407228183, -0.025732681155205, 0.00378471496515, 0.037072479724884, -0.030862767249346, -0.001954346662387, 0.009179324842989, 0.003644545329735, 0.032625421881676, -0.004294889979064, -0.028130820021033, 0.033609192818403, 0.003080919617787, -0.015849441289902, -0.001206774380989, 0.020940719172359, -0.00570094678551, -0.026027055457234, 0.004151962697506, 0.016557417809963, -0.031010216102004, -0.00394524494186, 0.019002415239811, 0.002406301908195, -0.006758168805391, -0.00438135350123, -0.024436140432954, 0.005518413614482, 0.017783468589187, -0.003473888151348, -0.005360329058021, 0.024361534044147, 0.004374708514661, -0.018517231568694, -0.003316037822515, 0.010553378611803, 0.001189051312394, -0.014685426838696, 0.005927430465817, 0.017819259315729, -0.004776156507432, -0.009681126102805, 0.002458208473399, -0.003055480541661, -0.015812676399946, -0.004305517766625, 0.015189420431852, 0.003776378696784, -0.0113056441769, -0.002060554455966, 0.004187369253486, 0.003925061319023, 0.015665220096707, -0.005114094354212, -0.011139147914946, 0.003713174723089, 0.003274613525718, -0.001340332441032, 0.00742620555684 ], [ 0.02512377128005, 0.040436815470457, 0.011470844037831, -0.001817576703615, -0.003761743893847, 0.022891860455275, -0.019233612343669, -0.000814945960883, -0.040806964039803, -0.038610856980085, -0.001935717999004, -0.019076528027654, -0.01877998560667, 0.001162476837635, -0.026152988895774, 0.005482133012265, 0.006770435720682, -0.0267045609653, 0.001871944055893, -0.025842987000942, 0.005543262697756, 0.001127131399699, 0.012257234193385, 0.00308433896862, 0.034764021635056, 0.029921567067504, 0.004031653515995, 0.006800597999245, 0.002208908786997, 0.000696531729773, 0.015100367367268, -0.000465799705125, 0.022589858621359, -0.00217257719487, 0.025111179798841, -0.007512130308896, -0.007673898246139, 0.02195905148983, -0.002160454401746, 0.018043771386147, -0.000467013625894, 0.015505275689065, 0.003388249780983, -0.001001035096124, 0.003294779686257, -0.003016409929842, -0.002861911896616, -0.004613681696355, -0.024619599804282, -0.019300866872072, -0.00474511180073, -0.000425057514803, -0.003435677383095, 0.004785905592144, -0.001657481305301, 0.006362499669194, -0.006150893867016, -0.000071482849307, -0.009834192693233, 0.000224683972192, -0.013162365183234, 0.001963002840057, -0.017844501882792, 0.007291853427887 ], [ 0.025138156488538, -0.011474931612611, 0.001820084289648, 0.040458723902702, -0.022897711023688, -0.000815665058326, -0.025736209005117, 0.003766431706026, 0.037077885121107, -0.030864840373397, -0.001936736982316, 0.00917945895344, -0.003626617370173, -0.032629609107971, 0.004280122928321, 0.028134826570749, -0.033610109239817, -0.003058729227632, 0.015849025920033, 0.001195514807478, 0.020942479372025, -0.005677210632712, -0.026030944660306, 0.004146709106863, 0.016559721902013, -0.031008714810014, -0.003925926983356, 0.019001312553883, 0.002387582324445, -0.006757250055671, 0.004363736603409, 0.024437477812171, -0.005503943189979, -0.017787888646126, 0.003479500999674, 0.005361099261791, -0.024356601759791, -0.004364777822047, 0.018515799194574, 0.003297775518149, -0.010551427491009, -0.001179854152724, -0.014684631489217, 0.005909394938499, 0.017820553854108, -0.004773962777108, -0.009686823002994, 0.002470828592777, -0.003055578563362, -0.015803812071681, -0.004307364113629, 0.015188245102763, 0.003766443347558, -0.011303245089948, -0.002049060538411, 0.004186312668025, -0.003914902452379, -0.015662821009755, 0.005107183009386, 0.011141316965222, -0.003720285836607, -0.003282007528469, 0.001352933817543, -0.007426214404404 ], [ 0.025132022798061, 0.040450226515532, -0.011470743454993, 0.001827146974392, 0.003780040191486, -0.022892223671079, -0.019244439899921, -0.00081966642756, -0.040818050503731, -0.038616269826889, -0.001945003750734, -0.019091727212071, 0.018781796097755, -0.001165546476841, 0.026153609156609, -0.005506207700819, -0.006796282716095, 0.026704974472523, -0.001875119749457, 0.025846915319562, 0.005554358940572, 0.001128664123826, 0.012269679456949, 0.003096279688179, 0.03476157784462, 0.029910610988736, 0.004043660592288, 0.006808321457356, 0.002208155347034, 0.000709937768988, -0.015104060992599, 0.000467546284199, -0.022593835368752, 0.002174605848268, -0.025111105293036, 0.007535499054939, 0.007690953556448, -0.021958703175187, 0.002161035779864, -0.01804661937058, 0.000472624204122, -0.01550958212465, 0.003379737958312, -0.000998446019366, 0.003285305341706, -0.003011071588844, -0.002864016219974, -0.004623282700777, -0.024601086974144, -0.019277069717646, -0.00475047621876, -0.000421726785135, -0.003425405593589, 0.004780943971127, -0.001652406062931, 0.006352670490742, 0.006152641493827, 0.000064957544964, 0.009835844859481, -0.000236252279137, 0.013163525611162, -0.001962115056813, 0.017844643443823, -0.007299797609448 ], [ 0.025136269629002, 0.011469235643744, -0.001824934501201, 0.040457751601934, 0.022888496518135, -0.000819014268927, -0.025732908397913, -0.003775665536523, 0.037083771079779, 0.030857352539897, -0.001943758688867, -0.00917455740273, 0.003635641885921, -0.032625813037157, -0.004288342781365, 0.028149908408523, 0.033609677106142, -0.003067424753681, -0.015841834247112, 0.001200437312946, 0.020937327295542, 0.005689580459148, -0.026031190529466, -0.004151324275881, 0.016582069918513, 0.031017741188407, -0.003933102358133, -0.018995547667146, 0.002395996823907, 0.006753118243068, -0.004373232834041, 0.024430988356471, 0.005512013100088, -0.017792727798223, -0.003480028361082, 0.00538550876081, 0.024373145774007, -0.004367811605334, -0.018514333292842, 0.003305928548798, 0.010545649565756, -0.001184776541777, -0.014678684063256, -0.005919765215367, 0.017817230895162, 0.004775726702064, -0.009694010019302, -0.002469142433256, -0.003034786786884, 0.01582246273756, -0.004305724054575, -0.015191638842225, 0.003770147683099, 0.011298788711429, -0.00205599446781, -0.00418301159516, 0.003921746276319, -0.015656067058444, -0.005111283157021, 0.01114109531045, 0.003716768231243, -0.003287824336439, -0.001352217164822, -0.007412270642817 ], [ 0.025122353807092, -0.001821898738854, 0.040435634553432, 0.011466489173472, -0.000815425999463, -0.003770443610847, 0.044957831501961, 0.022884283214808, 0.003742275293916, -0.000245026487391, -0.0019364382606, -0.005611089989543, 0.042211063206196, 0.032167978584766, 0.008552584797144, 0.001168828457594, -0.000037010122469, -0.000642177416012, -0.00328402291052, -0.007009665481746, 0.034646552056074, 0.037040535360575, 0.013749568723142, 0.002936098026112, 0.000337945995852, 0.000018464992536, -0.000104814273072, -0.001193332835101, -0.004595295060426, -0.007757102139294, 0.02489335462451, 0.036637522280216, 0.017918782308698, 0.005165886599571, 0.000904747284949, 0.000090696928964, 0.000017640013539, 0.000058189194533, -0.000209100864595, -0.001809055567719, -0.005596419796348, -0.007790197618306, 0.01541159581393, 0.031548116356134, 0.019882082939148, 0.007313760463148, 0.001684552407824, 0.000249418575549, 0.000027680604035, 6.031909833836835e-6, 0.000059238118411, 0.000130636093672, -0.000337086356012, -0.00235473876819, -0.00607547769323, -0.007184043526649, 0.008008887991309, 0.023460688069463, 0.019090034067631, 0.008747803047299, 0.002499245805666, 0.000468972604722, 0.000076588985394, 0.000013335085896 ], [ 0.025124251842499, 0.001825838699006, 0.040437545627356, -0.011469224467874, -0.000820449786261, 0.003777477424592, 0.044957499951124, -0.02288824133575, 0.00374609301798, 0.000248077791184, -0.001947438693605, 0.005619142204523, 0.042207438498735, -0.032170124351978, 0.008561563678086, -0.001168524147943, -0.000036642581108, 0.000650229863822, -0.003300508484244, 0.007015901152045, 0.0346405133605, -0.037037197500467, 0.013764698989689, -0.002935400698334, 0.000336799217621, -0.000020103416318, -0.000104136241134, 0.001208391971886, -0.004614408127964, 0.007759197149426, 0.024887608364224, -0.036625791341066, 0.017940036952496, -0.005164898000658, 0.000901399936993, -0.000090383473434, 0.000019209515813, -0.000062724677264, -0.000208545403439, 0.001832004520111, -0.005613645073026, 0.007787416689098, 0.015409767627716, -0.031527075916529, 0.019908547401428, -0.007313006091863, 0.001677614403889, -0.000248406780884, 0.000027794076232, -7.160942459449871e-6, 0.000063881823735, -0.000139321084134, -0.000337550474796, 0.002384758554399, -0.006086078006774, 0.007177790161222, 0.008014217019081, -0.023431884124875, 0.019120246171951, -0.008748364634812, 0.002487498801202, -0.00046666758135, 0.000076941025327, -0.000013408301129 ], [ 0.025220043957233, -0.033341735601425, 0.017594672739506, 0.019056184217334, -0.031625494360924, -0.028820974752307, -0.011888668872416, 0.016606284305453, -0.018680218607187, 0.000593332631979, -0.031234633177519, 0.003128331387416, -0.023464117199183, -0.001693582278676, -0.018080793321133, -0.033001784235239, 0.024918306618929, 0.000062455976149, -0.004914780147374, 0.023465221747756, -0.007716889958829, -0.013640446588397, -0.002567866817117, -0.035108033567667, -0.01340413838625, 0.019555935636163, 0.027407834306359, -0.000418662180891, 0.016786815598607, 0.01420961972326, 0.010769075714052, -0.008471521548927, 0.00949168857187, -0.010859103873372, -0.015677567571402, 0.012586702592671, -0.001383830909617, 0.022861745208502, 0.010872803628445, 0.0001886668324, 0.014665492810309, -0.004727940540761, 0.011764370836318, 0.002774096792564, 0.007779797539115, 0.011859713122249, -0.006984867621213, 0.01348977163434, 0.018292084336281, -0.012727321125567, -0.00043038095464, 0.01114284619689, -0.005186299327761, 0.000970919732936, 0.000574803969357, -0.010323336347938, 0.00164259003941, 0.006425873376429, 0.000196657376364, 0.013544981367886, 0.003106564749032, 0.005555392708629, 0.020887052640319, 0.005491989199072 ], [ 0.025208353996277, 0.017584871500731, 0.019049476832151, -0.033326949924231, -0.028804186731577, 0.016599169000983, -0.010229640640318, -0.031617812812328, 0.019627435132861, 0.029602346941829, -0.031223660334945, 0.000072726790677, -0.025052824988961, -0.000211043137824, 0.021545365452766, -0.003177633974701, -0.02195450104773, 0.035340987145901, -0.00823578890413, -0.012996464036405, -0.011375878937542, 0.025049759075046, 0.005842510610819, -0.004214120097458, -0.009070687927306, 0.010946478694677, -0.028229890391231, 0.015197051689029, 0.015351844020188, -0.010051854886115, 0.010413071140647, 0.019671130925417, -0.010891703888774, -0.0021102798637, -0.010997584089637, 0.013899587094784, -0.001599067240022, 0.015137212350965, -0.015581687912345, -0.009931275621057, 0.0173305477947, 0.001556125585921, 0.015617581084371, -0.003025245154276, -0.01272286940366, 0.001433406723663, -0.005531928502023, 0.017989628016949, -0.012092068791389, -0.003334038192406, -0.002954957075417, 0.009980868548155, 0.003201179206371, -0.016874501481652, 0.002899899845943, 0.007338039577007, 0.004089232999831, -0.014876949600875, -0.002256982028484, 0.00303527712822, 0.001127563649788, 0.01077595539391, -0.016203826293349, 0.006886789575219 ], [ 0.02521157823503, 0.033330354839563, 0.01759179495275, -0.019049309194088, -0.03161534294486, 0.028817020356655, -0.011881361715496, -0.01660212688148, -0.018674094229937, -0.000591061834712, -0.031229421496391, -0.003121880115941, -0.023458024486899, 0.001690330449492, -0.018082184717059, 0.032992515712976, 0.024909440428019, -0.000067054395913, -0.004918222781271, -0.023460924625397, -0.007717268075794, 0.013633173890412, -0.00257325056009, 0.035108409821987, -0.013405699282885, -0.019556120038033, 0.027413729578257, 0.000412650522776, 0.01678086258471, -0.014209643006325, 0.01076596044004, 0.008464645594358, 0.00949587021023, 0.010866635479033, -0.015677584335208, -0.012575188651681, -0.001369610079564, -0.022869270294905, 0.010887145996094, -0.000182539544767, 0.014657849445939, 0.004729558713734, 0.011757384054363, -0.002775989472866, 0.007791022770107, -0.011860225349665, -0.006984568201005, -0.013492970727384, 0.0182866435498, 0.012713492847979, -0.000424361292971, -0.011155007407069, -0.005188811104745, -0.00095253175823, 0.000566217291635, 0.010319704189897, 0.001632477273233, -0.006416521966457, 0.00020020068041, -0.013551418669522, 0.003103205934167, -0.00556927639991, 0.020895019173622, -0.005504154134542 ], [ 0.025206252932549, 0.019047040492296, -0.033326659351587, 0.0175821185112, 0.016598159447312, -0.03161133825779, 0.022118428722024, -0.028805911540985, -0.000963153608609, 0.006602505221963, -0.031223645433784, 0.032363716512918, -0.002394956536591, 0.028658799827099, 0.002120337449014, -0.007481642998755, -0.000352510862285, -0.013394137844443, 0.037657584995031, -0.021561594679952, -0.014225636608899, -0.01765420101583, -0.003273047041148, 0.01548318285495, -0.005683248862624, -0.002334074815735, 0.000846630253363, 0.017521250993013, -0.032134581357241, 0.005935965571553, 0.020367303863168, 0.002538160886616, 0.004108504857868, -0.021022487431765, 0.012339444831014, -0.002041263040155, -0.001596759655513, 0.005254108458757, -0.001429968164302, -0.016336634755135, 0.018063483759761, 0.006394657772034, -0.016015596687794, 0.008738436736166, -0.004425941966474, 0.021157693117857, -0.017493942752481, 0.004591135308146, 0.000144785255543, -0.000455278583104, 0.003655610838905, -0.007703022100031, 0.001998408231884, 0.010288136079907, -0.003198612481356, -0.010999694466591, 0.006793824955821, -0.01200941670686, 0.004159583710134, -0.016094781458378, 0.018172528594732, -0.006687301211059, -0.000305976573145, 0.000625373679213 ], [ 0.025228813290596, 0.017604978755116, -0.019062556326389, 0.033350069075823, 0.028836250305176, -0.016614647582173, -0.010232870467007, -0.031630631536245, 0.019635388627648, 0.029636548832059, -0.031246254220605, 0.000074921808846, 0.025051733478904, 0.000211357692024, -0.021542888134718, 0.003169264877215, 0.02198332361877, -0.035360623151064, 0.00823936611414, 0.012994535267353, -0.011370791122317, 0.025034233927727, 0.005835665389895, -0.004199128132313, -0.009092255495489, 0.010964790359139, -0.028243519365788, 0.015193835832179, 0.015341870486736, -0.010047287680209, -0.010396540164948, -0.01964601315558, 0.010878399014473, 0.0020973442588, 0.011017156764865, -0.013929336331785, 0.001603925484233, -0.015147536061704, 0.015571027062833, 0.009922701865435, -0.017310325056314, -0.001548755681142, 0.01558315102011, -0.003015822498128, -0.012691929005086, 0.001431720447727, -0.00554077187553, 0.018008826300502, -0.012123499065638, -0.003342372830957, -0.002964524086565, 0.009972519241273, 0.00320339994505, -0.016844352707267, 0.00290087540634, 0.007318863645196, -0.004079380538315, 0.014826625585556, 0.002246364951134, -0.003016781294718, -0.001123609719798, -0.010774190537632, 0.016222383826971, -0.006912067066878 ], [ 0.025207199156284, -0.019044224172831, 0.03332482650876, 0.017590953037143, -0.016601206734776, -0.031606651842594, 0.022110348567367, 0.028815776109695, -0.000949219975155, -0.006613292265683, -0.031227739527822, -0.0323586165905, 0.002381755737588, 0.028659649193287, -0.002099182456732, -0.007471218705177, 0.000340108701494, -0.01341257430613, -0.037659551948309, -0.021557064726949, -0.014238636009395, 0.017641441896558, -0.003257026895881, -0.015465244650841, -0.005680839065462, 0.002325563691556, 0.000823679205496, -0.0175392460078, -0.032131999731064, -0.00593147194013, -0.020374478772283, 0.002516801236197, -0.004107948858291, -0.021005501970649, -0.012334557250142, -0.002044191816822, 0.001592578482814, 0.005236821249127, 0.001405250979587, -0.016345549374819, -0.018056334927678, 0.006400589831173, -0.016014920547605, -0.008757655508816, -0.004440205637366, -0.021151687949896, -0.017488483339548, -0.004596049431711, 0.000141266296851, 0.00045240810141, 0.003645820776001, 0.007682020310313, 0.001984213013202, -0.010286142118275, -0.003188668750226, 0.011007837019861, -0.006787689868361, -0.012018053792417, -0.004177255090326, -0.016103088855743, -0.018170721828938, -0.00669144326821, 0.000299085804727, 0.000623202475253 ], [ 0.025208866223693, -0.017585290595889, 0.019047217443585, 0.033329833298922, -0.028808465227485, -0.016599047929049, -0.010232042521238, 0.031614080071449, 0.019633900374174, -0.029614590108395, -0.031224803999066, -0.000074020077591, -0.025048920884728, 0.000204316253075, 0.021543361246586, 0.003184012370184, -0.02197384648025, -0.035346683114767, -0.008235939778388, 0.012992943637073, -0.011370320804417, -0.02504606731236, 0.005831348244101, 0.004213517066091, -0.009071892127395, -0.010965012945235, -0.028241520747542, -0.015193717554212, 0.015346577391028, 0.010051721706986, 0.010408620350063, -0.019659791141748, -0.010895594023168, 0.002097682794556, -0.011001018807292, -0.013913691975176, -0.001605860306881, -0.015150733292103, -0.015576145611703, 0.009930558502674, 0.017326606437564, -0.001548212952912, 0.015606138855219, 0.003024589270353, -0.012711669318378, -0.00144534825813, -0.00554156396538, -0.018000664189458, -0.012116556987166, 0.003345492761582, -0.002962267259136, -0.00997715163976, 0.003208592068404, 0.016868365928531, 0.002909834729508, -0.007329735439271, 0.004088532645255, 0.014860131777823, -0.002246202202514, -0.003030531108379, 0.001114150509238, -0.010780797339976, -0.016222104430199, -0.006910991854966 ], [ 0.025223646312952, -0.019056715071201, -0.033350363373756, -0.017592201009393, 0.016600398346782, 0.031630605459213, 0.022134827449918, 0.028821418061852, -0.00095835729735, -0.006604640744627, -0.031229583546519, -0.032388415187597, -0.002396073192358, -0.028671249747276, 0.002115777693689, 0.007472571916878, -0.000344001484336, 0.013396434485912, 0.037666577845812, 0.021582866087556, -0.014239371754229, 0.01765545271337, -0.003275505499914, -0.015469007194042, -0.005675697233528, 0.002323801163584, 0.000832372694276, -0.017520235851407, -0.03214193880558, -0.005945089273155, 0.02038704790175, -0.00252585997805, 0.004121028352529, 0.021010588854551, 0.01232429407537, 0.002041323110461, -0.001591270789504, -0.005233975593001, -0.001416867016815, 0.016329679638147, 0.018062880262733, -0.006399449892342, -0.016029391437769, -0.008758774958551, -0.004444415681064, -0.021153444424272, -0.017474208027124, -0.00458928802982, 0.000139554118505, 0.000454849912785, 0.003643355565146, 0.007678566034883, 0.001993013545871, -0.010276224464178, -0.003187416587025, 0.011011059395969, 0.006794720422477, 0.012027809396386, 0.004176072776318, 0.016096074134111, 0.018153434619308, 0.006680994294584, -0.000296593556413, -0.000620841165073 ], [ 0.02519834972918, -0.017579009756446, -0.019040457904339, -0.033315643668175, 0.028797525912523, 0.016594555228949, -0.010228352621198, 0.031604077666998, 0.019623886793852, -0.029601152986288, -0.03121774084866, -0.000074423456681, 0.025044040754437, -0.000204922500416, -0.021537212654948, -0.003179342253134, 0.021959634497762, 0.035340547561646, 0.008235979825258, -0.012991284020245, -0.011369154788554, -0.025045577436686, 0.005832124035805, 0.004211023915559, -0.009070564061403, -0.01095259282738, -0.028236811980605, -0.015197200700641, 0.015348081476986, 0.01004983484745, -0.010411901399493, 0.019663045182824, 0.010898623615503, -0.002099554054439, 0.011002591811121, 0.013905578292906, 0.001599331386387, 0.015145203098655, 0.015584389679134, -0.0099340621382, -0.01732992567122, 0.001552847330458, 0.01561136636883, 0.003028723876923, -0.012722733430564, -0.001446106820367, -0.005543570965528, -0.018001858144999, -0.012102500535548, 0.003342454088852, -0.002955275122076, -0.009984350763261, 0.003208627225831, 0.016882937401533, 0.002904299646616, -0.007333337794989, -0.004085505846888, -0.014873258769512, 0.002252535196021, 0.003041208488867, -0.001115666003898, 0.01079089846462, 0.016220293939114, 0.006895350292325 ], [ 0.025215344503522, 0.019045101478696, 0.033337965607643, -0.017596261575818, -0.01660237647593, 0.031609248369932, 0.022124983370304, -0.028825849294662, -0.000945671985392, 0.006616712547839, -0.031229350715876, 0.03236423060298, 0.002395135117695, -0.028673309832811, -0.00209283339791, 0.00746998609975, 0.00033675605664, 0.01341731660068, -0.037661124020815, 0.021566424518824, -0.014229350723326, -0.017657356336713, -0.003249608213082, 0.015461855567992, -0.005684318952262, -0.002326491754502, 0.000817959255073, 0.017541540786624, -0.032134402543306, 0.005943859461695, -0.02037214115262, -0.002533226739615, -0.004101222380996, 0.02099902741611, -0.01233967859298, 0.00205047079362, 0.001597944064997, -0.005239278078079, 0.001399665372446, 0.016342550516129, -0.01806166768074, -0.006387995555997, -0.016021121293306, 0.008743648417294, -0.00443488266319, 0.021142026409507, -0.017490340396762, 0.004607795272022, 0.000136802715133, -0.000459112488898, 0.003658147063106, -0.007685418240726, 0.001981208333746, 0.010278654284775, -0.003198062302545, -0.010999017395079, -0.006801042240113, 0.012010422535241, -0.004173179157078, 0.016091667115688, -0.018163228407502, 0.00670368457213, 0.000290892989142, -0.00062255008379 ], [ 0.025223195552826, 0.033346220850945, -0.017597656697035, 0.019057122990489, 0.031626626849174, -0.028828304260969, -0.0118906525895, -0.01660599000752, -0.018682505935431, -0.000592690950725, -0.031235098838806, -0.003126812633127, 0.023471577093005, -0.001695547136478, 0.018090443685651, -0.033000718802214, -0.02491239272058, 0.000073126575444, 0.004913385957479, 0.023476090282202, -0.007721940986812, 0.013642617501318, -0.002575550926849, 0.03510969504714, -0.013406157493591, -0.019555842503905, 0.027410129085183, 0.000405763654271, 0.016790950670838, -0.014222619123757, -0.010774719528854, -0.008472704328597, -0.009499832056463, -0.010861939750612, 0.015666892752051, 0.012574911117554, 0.001367766060866, 0.022850865498185, -0.010882166214287, 0.000184805190656, -0.014671024866402, -0.004730625543743, 0.011775598861277, -0.002774369437248, 0.007796342950314, -0.01186366379261, -0.00697034643963, -0.013491632416844, 0.018286103382707, 0.012713339179754, -0.000431728753028, -0.011131051927805, -0.00518736988306, -0.000954792136326, 0.000577013823204, 0.010339296422899, -0.001645216601901, 0.006427282467484, -0.00019831150712, 0.013556573539972, -0.00310617685318, 0.005570590961725, -0.020874693989754, 0.005508550442755 ], [ 0.025216154754162, -0.033335324376822, -0.017588831484318, -0.019058285281062, 0.031626153737307, 0.02881046757102, -0.011892647482455, 0.016606692224741, -0.0186707098037, 0.000582698208746, -0.03123289719224, 0.003138089319691, 0.023462252691388, 0.001695953076705, 0.018068116158247, 0.032996453344822, -0.024905931204557, -0.000049900609156, 0.004910366144031, -0.023468801751733, -0.007708881981671, -0.013641710393131, -0.002557785715908, -0.035100929439068, -0.013410189189017, 0.019552370533347, 0.027394700795412, -0.000427169143222, 0.016789706423879, 0.014204195700586, -0.010777960531414, 0.008467995561659, -0.009498346596956, 0.010853575542569, 0.015685016289353, -0.012571795843542, 0.00137389136944, -0.02285954169929, -0.010866910219193, -0.000181465307833, -0.014661881141365, 0.004740164149553, 0.011766657233238, 0.002779929898679, 0.007783531676978, 0.011863051913679, -0.006991116795689, 0.013474778272212, 0.018279008567333, -0.01271069701761, -0.000420983938966, 0.011146388947964, -0.00518867187202, 0.000960328208748, 0.000565409252886, -0.010334269143641, -0.00163548917044, -0.006427155341953, -0.000194364241906, -0.013545540161431, -0.003098917193711, -0.005549867637455, -0.020875519141555, -0.005491751246154 ], [ 0.025193300098181, -0.03865360096097, 0.004402971360832, -0.016288854181767, 0.031176339834929, -0.008247279562056, -0.024399204179645, -0.003933747764677, -0.030543299391866, 0.015773147344589, 0.00833828561008, 0.028430968523026, -0.008422168903053, 0.011691575869918, -0.006750779226422, 0.039394728839397, -0.039115492254496, 0.002569098491222, -0.018571073189378, 0.011715671978891, 0.017137814313173, 0.005536278709769, 0.019169293344021, 0.010804513469338, -0.000400833960157, 0.013278492726386, -0.010157262906432, -0.009415746666491, -0.009716456755996, -0.017438646405935, 0.00935482699424, -0.006730342749506, 0.008027575910091, -0.020249266177416, -0.00225609075278, -0.031654112040997, 0.020393935963511, 0.005568457767367, 0.017906002700329, -0.002786257769912, 0.008950153365731, -0.010981780476868, -0.008813888765872, -0.00508806668222, -0.010529384948313, -0.010781583376229, -0.001543373800814, -0.006873045582324, 0.020119942724705, -0.020674699917436, 0.002646639943123, -0.003342061070725, 0.008743917569518, 0.005345300771296, 0.007583644706756, 0.007223933935165, -0.00731385499239, 0.002249716315418, -0.006540678907186, 0.008198633790016, 0.001645657350309, 0.013505619950593, 0.006177150644362, 0.009192979894578 ], [ 0.025181841105223, 0.004401339683682, -0.016279794275761, -0.03863861784339, -0.008246420882642, -0.003928629681468, -0.014253979548812, 0.031164810061455, 0.036388337612152, 0.010792372748256, 0.008332134224474, -0.000188871781575, 0.023985208943486, 0.008173688314855, -0.033361312001944, -0.031457085162401, -0.01186615228653, -0.011762640438974, -0.001721014268696, 0.003001501085237, -0.004576453473419, -0.030036952346563, 0.000257609062828, 0.031199252232909, 0.025286346673965, 0.011607793159783, 0.013495526276529, 0.00421021413058, -0.003959212452173, -0.002067581051961, -0.014900390058756, 0.013658318668604, 0.023435086011887, -0.004988617263734, -0.026217542588711, -0.018894584849477, -0.01033494900912, -0.013391788117588, -0.006102364044636, 0.003204985288903, 0.003867194987833, -0.000293880293611, 0.012278101406991, 0.011985595338047, -0.015336131677032, -0.016680426895618, 0.006441395264119, 0.019885212182999, 0.01298851147294, 0.00843717250973, 0.011740560643375, 0.006743252743036, -0.001639880472794, -0.004340623505414, -0.000751502229832, 0.001219282508828, 0.002151199150831, -0.015497331507504, -0.005287317559123, 0.013633536174893, 0.011215608566999, -0.005540853831917, -0.013435328379273, -0.007997401989996 ], [ 0.025178762152791, 0.038631465286016, 0.004400447942317, 0.016284350305796, 0.03117105551064, 0.008244896307588, -0.024385161697865, 0.003927724901587, -0.030524855479598, -0.015758220106363, 0.008328232914209, -0.028413744643331, -0.008418352343142, -0.011690666899085, -0.006755948998034, -0.039394427090883, -0.039123740047216, -0.002584440633655, -0.01857160590589, -0.011713897809386, 0.017128687351942, -0.005530093796551, 0.019152881577611, -0.010797425173223, -0.000417202827521, -0.013303060084581, -0.010160401463509, 0.009397468529642, -0.009709320962429, 0.017428373917937, 0.00935391522944, 0.006733047310263, 0.008032619021833, 0.020250065252185, -0.002234105020761, 0.031669519841671, 0.020410150289536, -0.005547777749598, 0.017903326079249, 0.002795942127705, 0.008955038152635, 0.010985110886395, -0.008811024017632, 0.005087236408144, -0.010518034920096, 0.010778425261378, -0.001523167244159, 0.006889292504638, 0.020157171413302, 0.020723730325699, 0.002672602888197, 0.003360363887623, 0.00874547380954, -0.0053317588754, 0.007587133906782, -0.00722182309255, -0.007320192176849, -0.00225356942974, -0.006545689888299, -0.008202034980059, 0.001635736203752, -0.013496661558747, 0.006165749859065, -0.009201453998685 ], [ 0.025187140330672, -0.016286415979266, -0.038643311709166, 0.004408506676555, -0.003935940563679, 0.031173594295979, 0.038637917488813, -0.008257746696472, -0.00585126131773, 0.001463853637688, 0.00834291242063, -0.041066873818636, -0.02986410818994, 0.010508080944419, 0.012803602032363, -0.002523025497794, 0.001356891705655, -0.0035248498898, -0.012070868164301, 0.043160531669855, 0.016825500875711, -0.01050029695034, -0.019413830712438, 0.005819016136229, -0.000060650367232, 0.000417823408497, -0.003331199521199, 0.005881490185857, 0.01366285700351, -0.037722587585449, -0.004023221787065, 0.008559038862586, 0.023497607558966, -0.00913839135319, 0.000137179260491, 0.000620084174443, -0.000221552880248, -0.001110897981562, 0.005546448286623, -0.007812929339707, -0.012596923857927, 0.0274677593261, -0.005259794648737, -0.005698526278138, -0.023839015513659, 0.011147502809763, -0.000206795128179, -0.001596615999006, 0.000380773592042, -0.000257744133705, 0.000591713527683, 0.002030677860603, -0.007119230926037, 0.008676575496793, 0.009483712725341, -0.016108589246869, 0.009723505936563, 0.003073066240177, 0.020616091787815, -0.010945463553071, 0.000239935165155, 0.002773911226541, -0.001055961474776, -0.000032641168218 ], [ 0.025189623236656, 0.004402257036418, 0.016281470656395, 0.038650512695312, 0.008248344063759, 0.003927118144929, -0.014259959571064, 0.031166654080153, 0.036399118602276, 0.01079560816288, 0.00832758937031, -0.000190362639842, -0.023985778912902, -0.008180933073163, 0.033360961824656, 0.031465958803892, 0.011871177703142, 0.011754540726542, 0.001715729245916, -0.002998259384185, -0.004572933539748, -0.030035888776183, 0.000249405566137, 0.031196506693959, 0.025292944163084, 0.011614979244769, 0.013484563678503, 0.004199189599603, -0.003954148851335, -0.002062629908323, 0.014896995387971, -0.01365336868912, -0.023434262722731, 0.004978513345122, 0.026213049888611, 0.018898678943515, 0.010344421491027, 0.013379581272602, 0.00608532410115, -0.003201285609975, -0.003856470808387, 0.000293591758236, 0.012273857370019, 0.011978943832219, -0.015331909060478, -0.01668200083077, 0.006429786328226, 0.019879916682839, 0.01298984605819, 0.008448675274849, 0.011729025281966, 0.006721730809659, -0.001640127971768, -0.004326940048486, -0.00074875127757, 0.001214636024088, -0.002144312020391, 0.015490325167775, 0.005279715172946, -0.013631864450872, -0.011220482178032, 0.005528770852834, 0.013429968617857, 0.007995792664587 ], [ 0.025183785706758, 0.016284352168441, 0.038638144731522, 0.004410622641444, 0.003940605092794, 0.031166443601251, 0.038633983582258, 0.00826083496213, -0.005857803858817, -0.001472484669648, 0.00835217256099, 0.041051991283894, 0.029866065829992, 0.010510082356632, -0.01281428989023, -0.002527258591726, -0.001359789283015, -0.003542864695191, 0.012083297595382, 0.04313924536109, 0.016838435083628, 0.010498966090381, -0.019423061981797, -0.005827826447785, -0.000054055712098, -0.000414372101659, -0.003336747409776, -0.005905727855861, 0.013675892725587, 0.037701245397329, 0.004049608018249, 0.008552690967917, -0.023499049246311, -0.009150801226497, -0.000121499957459, 0.000621969753411, 0.000222597707761, -0.001101563335396, -0.005552661139518, -0.007835746742785, 0.012607976794243, 0.027455141767859, -0.005222692154348, 0.005686221644282, -0.023830024525523, -0.011161520145833, -0.000182003990631, 0.001599857816473, 0.00037992320722, 0.000258297688561, 0.000593280885369, -0.002013597870246, -0.007122809998691, -0.008689551614225, 0.009490428492427, 0.01611065492034, -0.009683198295534, 0.003054616739973, -0.02059986256063, -0.010959627106786, -0.000210836238693, 0.002776049310341, 0.001052955747582, -0.000032954721974 ], [ 0.025177361443639, -0.004402497317642, -0.016276955604553, 0.038631428033113, -0.008246975019574, 0.003933464642614, -0.014248205348849, -0.031156852841377, 0.0363839417696, -0.010792440734804, 0.008339235559106, 0.000180413742783, 0.023973369970918, -0.008170245215297, -0.033352840691805, 0.031457751989365, -0.011867018416524, 0.011770055629313, -0.001737238024361, -0.002995082875714, -0.004572228528559, 0.030019223690033, 0.000254082493484, -0.031194915995002, 0.025291837751865, -0.011610486544669, 0.013503315858543, -0.004229669459164, -0.003942308481783, 0.002069822978228, -0.014888361096382, -0.013643391430378, 0.023425960913301, 0.00498109171167, -0.026220126077533, 0.018902560696006, -0.010339360684156, 0.013401133939624, -0.006121226586401, -0.003181492909789, 0.003863433143124, 0.000283994566416, 0.012260635383427, -0.011979562230408, -0.015322230756283, 0.016683798283339, 0.006435183808208, -0.019894016906619, 0.012995627708733, -0.008441807702184, 0.01175210159272, -0.006759986281395, -0.001616747118533, 0.004329625051469, -0.000763770833146, -0.001210769987665, 0.002156124683097, 0.015476396307349, -0.005291042849422, -0.013630934990942, 0.011228136718273, 0.005539788398892, -0.013446753844619, 0.008000866509974 ], [ 0.025166235864162, 0.016269028186798, -0.038617119193077, -0.004397157113999, -0.003921547904611, -0.031146977096796, 0.038623671978712, 0.008241029456258, -0.005849093198776, -0.001470149261877, 0.008318554610014, 0.041044048964977, -0.029867649078369, -0.010495482943952, 0.012801388278604, 0.002511350205168, 0.001349774072878, 0.003539191791788, -0.012047566473484, -0.043151564896107, 0.016840975731611, 0.010499155148864, -0.019414681941271, -0.005797137971967, -0.000052362785937, -0.000410870736232, -0.003316813614219, -0.005903210956603, 0.013653517700732, 0.037727639079094, -0.004038895945996, -0.008569162338972, 0.02350309677422, 0.009113976731896, 0.000118276904686, -0.000616852485109, -0.000220808782615, 0.001094797626138, 0.005528565030545, 0.007837212644517, -0.01260724849999, -0.027477970346808, -0.005252759903669, 0.00571218226105, -0.023846821859479, -0.011132491752505, -0.000178508125828, 0.001589677645825, 0.000376004551072, 0.000254805752775, 0.000589978531934, -0.002006506081671, -0.007105221506208, -0.008695867843926, 0.009507670067251, 0.016113623976707, 0.009725575335324, -0.003080138936639, 0.020620739087462, 0.01094816531986, 0.000209166377317, -0.002764421747997, -0.00104491924867, 0.000033222098864 ], [ 0.025178829208016, -0.004404305014759, 0.016285605728626, -0.038630489259958, 0.008248748257756, -0.003937695175409, -0.014238187111914, -0.031170347705483, 0.036380536854267, -0.010792491957545, 0.008346405811608, 0.000176364759682, -0.023978853598237, 0.008148818276823, 0.033362969756126, -0.031454175710678, 0.011864839121699, -0.011776731349528, 0.00174690131098, 0.00299585913308, -0.004592633806169, 0.030017348006368, 0.000274733291008, -0.031200435012579, 0.025290815159678, -0.011606989428401, 0.013506334275007, -0.004242168273777, -0.003939473535866, 0.002075822092593, 0.014876529574394, 0.013668423518538, -0.023417852818966, -0.004994434770197, 0.026222836226225, -0.018906030803919, 0.010336455889046, -0.013399287126958, 0.006131475791335, 0.003173875389621, -0.0038716790732, -0.000278820545645, 0.0122722517699, -0.011955576948822, -0.015337152406573, 0.016676692292094, 0.006438866723329, -0.019897170364857, 0.013003908097744, -0.00844157114625, 0.011746647767723, -0.006763532757759, -0.001607251353562, 0.004335218574852, -0.00077472726116, -0.001212107599713, -0.002135190414265, -0.015479743480682, 0.00527069484815, 0.013636521063745, -0.01122824754566, -0.005535887554288, 0.013453069142997, -0.008012467063963 ], [ 0.025188902392983, -0.016283072531223, 0.038648638874292, -0.004405294544995, 0.003932679072022, -0.031168946996331, 0.038649123162031, -0.008252670988441, -0.005851360037923, 0.001466456102207, 0.008338096551597, -0.041063878685236, 0.029881358146667, -0.010503076016903, -0.012804135680199, 0.002519347937778, -0.001353218220174, 0.003530060173944, 0.012067740783095, -0.043161075562239, 0.016846410930157, -0.010496412403882, -0.019415026530623, 0.005812649615109, -0.000056704615417, 0.000413856032537, -0.003323117969558, 0.005887810606509, 0.013664187863469, -0.037725992500782, 0.004044505301863, -0.008555381558836, -0.023499123752117, 0.00913267582655, -0.000128616156871, -0.00061769480817, 0.0002207653597, 0.001101502100937, -0.005534819327295, 0.00781724229455, 0.012602328322828, -0.02747149579227, -0.005240174476057, -0.005693058483303, -0.023839907720685, 0.011147201992571, -0.000195090702618, -0.001590409316123, 0.000377867690986, -0.000256156024989, 0.000589159084484, 0.002016057958826, -0.007107026875019, 0.008675648830831, 0.009488987736404, -0.016110323369503, -0.009705328382552, -0.003064711112529, -0.020615417510271, 0.010953783988953, -0.000229546887567, -0.002762702992186, 0.001048751990311, 0.00003296227078 ], [ 0.025166716426611, 0.038614135235548, -0.004399238154292, -0.016278110444546, -0.031160362064838, -0.008243157528341, -0.024378631263971, 0.003927366808057, -0.030511321499944, -0.015749827027321, 0.008329849690199, -0.028410324826837, 0.008415075950325, 0.011691907420754, 0.006756174378097, 0.039381735026836, 0.039110623300076, 0.002585800597444, 0.018577270209789, 0.011708679609001, 0.017132906243205, -0.00552952196449, 0.019150422886014, -0.010805062949657, -0.000420282973209, -0.013300286605954, -0.01017632894218, 0.009391213767231, -0.009710461832583, 0.017437057569623, -0.009346763603389, -0.006740829907358, -0.008028398267925, -0.020258074626327, 0.002235974185169, -0.031657014042139, -0.020400019362569, 0.005558074917644, -0.017908878624439, -0.002791468286887, -0.008968845941126, -0.010972657240927, -0.008821782656014, 0.005085557699203, -0.010521104559302, 0.010783765465021, -0.001512306509539, 0.006911461707205, 0.020147457718849, 0.020706832408905, 0.002695333911106, 0.003372607985511, 0.008755063638091, -0.005326053127646, 0.007584104780108, -0.007233950775117, 0.007306922227144, 0.002262716880068, 0.00653251959011, 0.008214084431529, -0.00164337689057, 0.013496758416295, -0.006186638493091, 0.009197155945003 ], [ 0.025184407830238, -0.038643725216389, -0.004396392963827, 0.016278622671962, -0.031161708757281, 0.008237473666668, -0.024393390864134, -0.003925193566829, -0.03054385818541, 0.01578452065587, 0.008323785848916, 0.028427163138986, 0.008411917835474, -0.011689923703671, 0.006748789455742, -0.03938502818346, 0.039117321372032, -0.002577335573733, 0.018572265282273, -0.011705527082086, 0.017138913273811, 0.005528286565095, 0.019165601581335, 0.010792497545481, -0.000384918297641, 0.013266921043396, -0.010154830291867, -0.009406883269548, -0.009707792662084, -0.017440922558308, -0.009348998777568, 0.006736868526787, -0.008024816401303, 0.020250348374248, 0.00224295607768, 0.031668085604906, -0.020414885133505, -0.005559240933508, -0.017899876460433, 0.002786389552057, -0.008960950188339, 0.010979454964399, -0.008820152841508, -0.005088082514703, -0.010523403994739, -0.010777585208416, -0.001530102570541, -0.006880548782647, 0.020119639113545, -0.020687710493803, 0.00265775481239, -0.003352044848725, 0.008742966689169, 0.005328917875886, 0.007589612156153, 0.007229325827211, 0.007318094838411, -0.002259192755446, 0.00653839064762, -0.008203479461372, -0.001648659235798, -0.01348848734051, -0.006177697330713, -0.009212858974934 ] ], "Routing": [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60 ] }, "LoudspeakerLayout": { "Name": "A loudspeaker layout", "Loudspeakers": [ { "Azimuth": 144.08648681640625, "Elevation": -21.445816040039062, "Radius": 1.0, "IsImaginary": false, "Channel": 1, "Gain": 1.0 }, { "Azimuth": -33.810028076171875, "Elevation": -48.923126220703125, "Radius": 1.0, "IsImaginary": false, "Channel": 2, "Gain": 1.0 }, { "Azimuth": -35.91351318359375, "Elevation": -21.445816040039062, "Radius": 1.0, "IsImaginary": false, "Channel": 3, "Gain": 1.0 }, { "Azimuth": -115.874267578125, "Elevation": 33.089736938476562, "Radius": 1.0, "IsImaginary": false, "Channel": 4, "Gain": 1.0 }, { "Azimuth": -146.189987182617188, "Elevation": 48.923126220703125, "Radius": 1.0, "IsImaginary": false, "Channel": 5, "Gain": 1.0 }, { "Azimuth": 115.874267578125, "Elevation": -33.089736938476562, "Radius": 1.0, "IsImaginary": false, "Channel": 6, "Gain": 1.0 }, { "Azimuth": 146.189987182617188, "Elevation": -48.923126220703125, "Radius": 1.0, "IsImaginary": false, "Channel": 7, "Gain": 1.0 }, { "Azimuth": 64.125732421875, "Elevation": 33.089736938476562, "Radius": 1.0, "IsImaginary": false, "Channel": 8, "Gain": 1.0 }, { "Azimuth": 33.810016632080078, "Elevation": 48.923126220703125, "Radius": 1.0, "IsImaginary": false, "Channel": 9, "Gain": 1.0 }, { "Azimuth": -64.125732421875, "Elevation": -33.089736938476562, "Radius": 1.0, "IsImaginary": false, "Channel": 10, "Gain": 1.0 }, { "Azimuth": -144.08648681640625, "Elevation": 21.445816040039062, "Radius": 1.0, "IsImaginary": false, "Channel": 11, "Gain": 1.0 }, { "Azimuth": 35.913509368896484, "Elevation": 21.445816040039062, "Radius": 1.0, "IsImaginary": false, "Channel": 12, "Gain": 1.0 }, { "Azimuth": -45.525787353515625, "Elevation": 1.953565835952759, "Radius": 1.0, "IsImaginary": false, "Channel": 13, "Gain": 1.0 }, { "Azimuth": 177.263275146484375, "Elevation": 44.4415283203125, "Radius": 1.0, "IsImaginary": false, "Channel": 14, "Gain": 1.0 }, { "Azimuth": 134.474212646484375, "Elevation": 1.953565835952759, "Radius": 1.0, "IsImaginary": false, "Channel": 15, "Gain": 1.0 }, { "Azimuth": 87.212654113769531, "Elevation": -45.491874694824219, "Radius": 1.0, "IsImaginary": false, "Channel": 16, "Gain": 1.0 }, { "Azimuth": 2.736729621887207, "Elevation": -44.4415283203125, "Radius": 1.0, "IsImaginary": false, "Channel": 17, "Gain": 1.0 }, { "Azimuth": -87.212646484375, "Elevation": 45.491874694824219, "Radius": 1.0, "IsImaginary": false, "Channel": 18, "Gain": 1.0 }, { "Azimuth": -2.736724853515625, "Elevation": 44.4415283203125, "Radius": 1.0, "IsImaginary": false, "Channel": 19, "Gain": 1.0 }, { "Azimuth": -92.787353515625, "Elevation": -45.491874694824219, "Radius": 1.0, "IsImaginary": false, "Channel": 20, "Gain": 1.0 }, { "Azimuth": -177.263275146484375, "Elevation": -44.4415283203125, "Radius": 1.0, "IsImaginary": false, "Channel": 21, "Gain": 1.0 }, { "Azimuth": 92.787345886230469, "Elevation": 45.491874694824219, "Radius": 1.0, "IsImaginary": false, "Channel": 22, "Gain": 1.0 }, { "Azimuth": 45.525783538818359, "Elevation": -1.953565835952759, "Radius": 1.0, "IsImaginary": false, "Channel": 23, "Gain": 1.0 }, { "Azimuth": -134.474212646484375, "Elevation": -1.953565835952759, "Radius": 1.0, "IsImaginary": false, "Channel": 24, "Gain": 1.0 }, { "Azimuth": 15.585732460021973, "Elevation": -73.335014343261719, "Radius": 1.0, "IsImaginary": false, "Channel": 25, "Gain": 1.0 }, { "Azimuth": -85.40167236328125, "Elevation": 16.035341262817383, "Radius": 1.0, "IsImaginary": false, "Channel": 26, "Gain": 1.0 }, { "Azimuth": -164.414260864257812, "Elevation": -73.335014343261719, "Radius": 1.0, "IsImaginary": false, "Channel": 27, "Gain": 1.0 }, { "Azimuth": 163.915557861328125, "Elevation": 4.419061183929443, "Radius": 1.0, "IsImaginary": false, "Channel": 28, "Gain": 1.0 }, { "Azimuth": -94.59832763671875, "Elevation": -16.035341262817383, "Radius": 1.0, "IsImaginary": false, "Channel": 29, "Gain": 1.0 }, { "Azimuth": -163.915557861328125, "Elevation": -4.419061183929443, "Radius": 1.0, "IsImaginary": false, "Channel": 30, "Gain": 1.0 }, { "Azimuth": 94.598335266113281, "Elevation": 16.035341262817383, "Radius": 1.0, "IsImaginary": false, "Channel": 31, "Gain": 1.0 }, { "Azimuth": -16.084442138671875, "Elevation": 4.419061183929443, "Radius": 1.0, "IsImaginary": false, "Channel": 32, "Gain": 1.0 }, { "Azimuth": 85.401664733886719, "Elevation": -16.035341262817383, "Radius": 1.0, "IsImaginary": false, "Channel": 33, "Gain": 1.0 }, { "Azimuth": 16.084447860717773, "Elevation": -4.419061183929443, "Radius": 1.0, "IsImaginary": false, "Channel": 34, "Gain": 1.0 }, { "Azimuth": -15.585723876953125, "Elevation": 73.335014343261719, "Radius": 1.0, "IsImaginary": false, "Channel": 35, "Gain": 1.0 }, { "Azimuth": 164.414260864257812, "Elevation": 73.335014343261719, "Radius": 1.0, "IsImaginary": false, "Channel": 36, "Gain": 1.0 }, { "Azimuth": -60.0247802734375, "Elevation": 25.268712997436523, "Radius": 1.0, "IsImaginary": false, "Channel": 37, "Gain": 1.0 }, { "Azimuth": 151.41326904296875, "Elevation": 26.860456466674805, "Radius": 1.0, "IsImaginary": false, "Channel": 38, "Gain": 1.0 }, { "Azimuth": 119.9752197265625, "Elevation": 25.268712997436523, "Radius": 1.0, "IsImaginary": false, "Channel": 39, "Gain": 1.0 }, { "Azimuth": 46.626789093017578, "Elevation": -51.568878173828125, "Radius": 1.0, "IsImaginary": false, "Channel": 40, "Gain": 1.0 }, { "Azimuth": 28.586725234985352, "Elevation": -26.860456466674805, "Radius": 1.0, "IsImaginary": false, "Channel": 41, "Gain": 1.0 }, { "Azimuth": -46.626800537109375, "Elevation": 51.568878173828125, "Radius": 1.0, "IsImaginary": false, "Channel": 42, "Gain": 1.0 }, { "Azimuth": -28.58673095703125, "Elevation": 26.860456466674805, "Radius": 1.0, "IsImaginary": false, "Channel": 43, "Gain": 1.0 }, { "Azimuth": -133.373214721679688, "Elevation": -51.568878173828125, "Radius": 1.0, "IsImaginary": false, "Channel": 44, "Gain": 1.0 }, { "Azimuth": -151.41326904296875, "Elevation": -26.860456466674805, "Radius": 1.0, "IsImaginary": false, "Channel": 45, "Gain": 1.0 }, { "Azimuth": 133.373214721679688, "Elevation": 51.568878173828125, "Radius": 1.0, "IsImaginary": false, "Channel": 46, "Gain": 1.0 }, { "Azimuth": 60.024784088134766, "Elevation": -25.268712997436523, "Radius": 1.0, "IsImaginary": false, "Channel": 47, "Gain": 1.0 }, { "Azimuth": -119.9752197265625, "Elevation": -25.268712997436523, "Radius": 1.0, "IsImaginary": false, "Channel": 48, "Gain": 1.0 }, { "Azimuth": -109.941619873046875, "Elevation": 6.911231994628906, "Radius": 1.0, "IsImaginary": false, "Channel": 49, "Gain": 1.0 }, { "Azimuth": 172.652618408203125, "Elevation": -19.7906494140625, "Radius": 1.0, "IsImaginary": false, "Channel": 50, "Gain": 1.0 }, { "Azimuth": 70.058372497558594, "Elevation": 6.911231994628906, "Radius": 1.0, "IsImaginary": false, "Channel": 51, "Gain": 1.0 }, { "Azimuth": -70.43499755859375, "Elevation": -68.940864562988281, "Radius": 1.0, "IsImaginary": false, "Channel": 52, "Gain": 1.0 }, { "Azimuth": 7.347382068634033, "Elevation": 19.7906494140625, "Radius": 1.0, "IsImaginary": false, "Channel": 53, "Gain": 1.0 }, { "Azimuth": 70.435005187988281, "Elevation": 68.940864562988281, "Radius": 1.0, "IsImaginary": false, "Channel": 54, "Gain": 1.0 }, { "Azimuth": -7.347381591796875, "Elevation": -19.7906494140625, "Radius": 1.0, "IsImaginary": false, "Channel": 55, "Gain": 1.0 }, { "Azimuth": 109.564994812011719, "Elevation": -68.940864562988281, "Radius": 1.0, "IsImaginary": false, "Channel": 56, "Gain": 1.0 }, { "Azimuth": -172.652618408203125, "Elevation": 19.7906494140625, "Radius": 1.0, "IsImaginary": false, "Channel": 57, "Gain": 1.0 }, { "Azimuth": -109.56500244140625, "Elevation": 68.940864562988281, "Radius": 1.0, "IsImaginary": false, "Channel": 58, "Gain": 1.0 }, { "Azimuth": 109.941627502441406, "Elevation": -6.911231994628906, "Radius": 1.0, "IsImaginary": false, "Channel": 59, "Gain": 1.0 }, { "Azimuth": -70.058380126953125, "Elevation": -6.911231994628906, "Radius": 1.0, "IsImaginary": false, "Channel": 60, "Gain": 1.0 } ] } }././@LongLink0000644000000000000000000000016000000000000011600 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/SimpleDecoder/Source/Presets/7point1point4.jsonIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/SimpleDecoder/Source/Presets/7point10000664002537200253720000005247315257173642031472 0ustar zmoelnigzmoelnig{ "Decoder": { "Name": "7.1.4 Decoder", "Description": "Channel order: L R C LFE LRS RRS LS RS TL TR TRL TRR", "ExpectedInputNormalization": "n3d", "Weights": "none", "WeightsAlreadyApplied": false, "SubwooferChannel" : 4, "Matrix": [ [ 0.07602158188819885, 0.0729529932141304, -0.03254383429884911, 0.08391683548688889, 0.09641458839178085, -0.03169817104935646, -0.03714026138186455, -0.03727851063013077, 0.01422078907489777, 0.06404634565114975, -0.03950107842683792, -0.01754380576312542, 0.01850355044007301, -0.02011017128825188, -0.007169399876147509, -0.03884304314851761, 0.01810699515044689, -0.0234779566526413, -0.01145872659981251, 0.004681415855884552, 0.01166571583598852, 0.006182819604873657, -0.00161024066619575, 0.01146614551544189, -0.04643530026078224, -0.005146782379597425, -0.00770674692466855, -0.002584397327154875, -0.004428152926266193, 0.008993078954517841, 0.0004880805499851704, 0.01051362603902817, 0.0003166971437167376, 0.001664615701884031, 0.009405205026268959, -0.02709770761430264, -0.005370182916522026, -0.005631642416119576, 0.0003689444274641573, -0.0080417450517416, 0.01121861301362514, 0.001802101964130998, -0.007477368228137493, 0.001515639247372746, 0.002028647810220718, 0.006358061451464891, -0.0009661444346420467, 0.001849257503636181, -0.01113015692681074, -0.001170566654764116, -0.009534263052046299, -0.0008232159889303148, -0.002622353611513972, 0.007076071109622717, 0.001953020226210356, -0.00340651860460639, -0.001659130211919546, -0.004246472381055355, -0.0003077496658079326, -0.003357808571308851, 0.01074563898146152, -0.002376009244471788, 0.002130096079781651, -0.007647058460861444 ], [ 0.07602200657129288, -0.07295776158571243, -0.03254181891679764, 0.08391617238521576, -0.09641574323177338, 0.0316954180598259, -0.0371457040309906, -0.0372839979827404, 0.01421255990862846, -0.06403768807649612, 0.03950182721018791, 0.01754477247595787, 0.01851043850183487, -0.02010802924633026, -0.007180836983025074, -0.03885063901543617, -0.01809384115040302, 0.02348707802593708, 0.01145289558917284, -0.004680616781115532, 0.01165846455842257, 0.00618512649089098, -0.001609516446478665, 0.01145287323743105, -0.04643497616052628, 0.005158224608749151, 0.007724930066615343, 0.002579520456492901, 0.004432096611708403, -0.008987493813037872, 0.000494829670060426, 0.01051451824605465, 0.0003194555756635964, 0.00165610434487462, 0.009397850371897221, -0.02709135971963406, 0.005380101501941681, 0.005652063526213169, -0.0003632707812357694, 0.0080453185364604, -0.01121622044593096, -0.001802866347134113, -0.007486896123737097, 0.001516472431831062, 0.002039025770500302, 0.006364472210407257, -0.0009773465571925044, 0.001853989786468446, -0.01112054195255041, 0.001178347156383097, 0.00954708456993103, 0.0008350109565071762, 0.002621369436383247, -0.007082755211740732, -0.001949315308593214, 0.003407340496778488, -0.001645858166739345, -0.004255552776157856, -0.0003051633248105645, -0.003343725576996803, 0.01075461413711309, -0.002378283068537712, 0.002144113415852189, -0.007632825523614883 ], [ 0.06988571584224701, 1.445615112061205e-6, -0.007285496685653925, 0.1046555191278458, 8.914059321796231e-7, -3.210128625141806e-7, -0.03481035307049751, -0.007632039021700621, 0.09688157588243484, -1.343848111901025e-6, -2.8499101745183e-7, 4.657323188439477e-6, -0.007065853103995323, -0.02218718454241753, -0.006250624544918537, 0.08201749622821808, -4.054861165059265e-6, -3.684835974127054e-7, 9.905158549372572e-6, -1.986782081075944e-6, 0.002122925594449043, -0.01651777699589729, -0.005563803482800722, -0.007123568095266819, 0.06377921998500824, -5.986368705634959e-6, -1.447640670448891e-6, 0.00001195937147713266, -4.387044555187458e-6, -2.310701347596478e-6, 0.01026842370629311, -0.003566588507965207, -0.01641907542943954, 0.003223019884899259, -0.009331919252872467, 0.04502971470355988, -6.259508154471405e-6, -3.243950914111338e-6, 0.00001043567226588493, -3.661520395326079e-6, 9.091960464502336e-7, 2.735015186772216e-6, 0.005593786016106606, 0.007287046872079372, -0.003668767400085926, -0.01356131304055452, 0.006081522442400455, -0.01153850369155407, 0.02792242914438248, -4.656655619328376e-6, -4.572390480461763e-6, 6.584491529793013e-6, -4.626805036878068e-7, 5.335679361451184e-6, 7.76315914663428e-7, -2.660850441316143e-6, -0.0004414583381731063, 0.007810692768543959, 0.001176425372250378, -0.0007891626446507871, -0.01029638759791851, 0.005204993765801191, -0.01267385203391314, 0.01386342756450176 ], [ 0.1275509893894196, 0.07823073863983154, -0.04519945755600929, -0.1543653905391693, -0.09767741709947586, -0.03122458420693874, -0.06104816868901253, 0.05132931098341942, 0.06720191240310669, 0.05402782186865807, 0.03364762291312218, -0.01912866719067097, 0.01835272274911404, 0.03352182731032372, -0.01295501831918955, 0.0008297133608721197, -0.001066146534867585, -0.01003557071089745, 0.01188268885016441, 0.002408030442893505, 0.01473662164062262, 0.003683335147798061, -0.003516352735459805, -0.009624864906072617, -0.01451588328927755, -0.01844052039086819, -0.008810512721538544, -0.002144440077245235, 0.009294889867305756, 0.009183053858578205, 0.008023623377084732, -0.0108958687633276, -0.01183727197349072, -0.003908498678356409, 0.005741320084780455, -0.001685844152234495, 0.008993463590741158, 0.007301083765923977, -0.0002935647498816252, -0.0128490012139082, -0.009783502668142319, 0.003641401883214712, -0.005677232518792152, -0.008286934345960617, 0.0005911279004067183, 0.003223401261493564, 0.001584621844813228, 0.00442961510270834, 0.01056474074721336, 0.002154662972316146, 0.002551131183281541, -0.001705209841020405, 0.005117131397128105, 0.003067855490371585, -0.004734531044960022, -0.002614175202324986, -0.003484193934127688, -0.0006818380788899958, 0.002293536672368646, 0.004404782317578793, 0.003962473478168249, 0.000570247822906822, -0.003891312284395099, -0.003897017333656549 ], [ 0.1275629252195358, -0.0782419815659523, -0.04520237818360329, -0.1543713212013245, 0.09768784791231155, 0.0312149990350008, -0.06104164198040962, 0.05132667347788811, 0.06719599664211273, -0.05402814596891403, -0.03363681957125664, 0.01913542859256268, 0.01833560131490231, 0.03351403027772903, -0.01295784767717123, 0.0008358370396308601, 0.001062530209310353, 0.01003214344382286, -0.0118823004886508, -0.002405005507171154, 0.0147412046790123, 0.003695219056680799, -0.003511970629915595, -0.009617085568606853, -0.01451427210122347, 0.01844220049679279, 0.008804473094642162, 0.002140766242519021, -0.009298967197537422, -0.009177782572805882, 0.008017344400286674, -0.0108927683904767, -0.01184000167995691, -0.003899238305166364, 0.005735405255109072, -0.001688220421783626, -0.008996913209557533, -0.007292849477380514, 0.0002896864316426218, 0.01285100635141134, 0.009776187129318714, -0.003641193732619286, -0.005658653564751148, -0.008283414877951145, 0.0005931201740168035, 0.003218883648514748, 0.001569646876305342, 0.004428214859217405, 0.01056199427694082, -0.002149396343156695, -0.002551729558035731, 0.001712788129225373, -0.005115760024636984, -0.003066351870074868, 0.004731190856546164, 0.002611666219308972, -0.003490372793748975, -0.0006948147783987224, 0.002295984420925379, 0.004397716373205185, 0.003968425560742617, 0.0005737738101743162, -0.003885727841407061, -0.003893956774845719 ], [ 0.1089406460523605, 0.1553604155778885, -0.02423824183642864, 0.0121248522773385, 0.018740588799119, -0.03108053654432297, -0.05337629094719887, -0.005299608688801527, -0.1242311075329781, -0.07971992343664169, -0.008099082857370377, -0.03337014839053154, 0.002236034721136093, -0.00278517440892756, 0.02067289687693119, -0.01652029529213905, -0.007608437445014715, 0.01039987616240978, -0.001911081257276237, -0.0127909230068326, 0.007718504872173071, 0.0006928316433914006, 0.007559923455119133, 0.007058948744088411, 0.03750989586114883, 0.007785493973642588, 0.003566469298675656, -0.004486647434532642, -0.0007935830508358777, 0.002548934426158667, 0.01079329662024975, 0.001431425916962326, 0.01640216819941998, 0.0002362326922593638, -0.003910603001713753, -0.002588198287412524, -0.008895434439182281, -0.001659926725551486, -0.0005460103275254369, 0.01206788793206215, 0.002197521040216088, 0.008081566542387009, 0.001929723657667637, 0.0003389221092220396, -0.0001264361344510689, 0.001811394584365189, 0.006512111518532038, -0.00003510119131533429, 0.006694148294627666, 0.009308796375989914, 0.001796595519408584, 0.003550620283931494, 0.001224011648446321, -0.0002312766300747171, 0.0002292411954840645, 0.005286421626806259, -0.001341877388767898, -0.000529875629581511, -0.0005988302291370928, -0.00205945479683578, -0.00532134436070919, 0.0001452933502150699, 0.001922798692248762, 0.009190654382109642 ], [ 0.1089273542165756, -0.1553483307361603, -0.02424043975770473, 0.01212739292532206, -0.01874457485973835, 0.03108966536819935, -0.05338074266910553, -0.005300404038280249, -0.124229408800602, 0.079726442694664, 0.008098460733890533, 0.03337763994932175, 0.002248880686238408, -0.002786614233627915, 0.02067851833999157, -0.01652389764785767, 0.007609208580106497, -0.01039634831249714, 0.001914022141136229, 0.01278271060436964, 0.007723703049123287, 0.0006861266447231174, 0.00756035465747118, 0.007058383896946907, 0.03751910850405693, -0.007792357355356216, -0.003566610394045711, 0.004495353903621435, 0.000801704591140151, -0.002555542625486851, 0.01079191826283932, 0.001435554120689631, 0.01640841364860535, 0.0002356902987230569, -0.003900190582498908, -0.002590753138065338, 0.008899454958736897, 0.001650996971875429, 0.0005499146063812077, -0.01208259351551533, -0.002195677720010281, -0.008081897161900997, 0.00192294386215508, 0.0003381163405720145, -0.000126813116366975, 0.001818640273995697, 0.006524001248180866, -0.00003594649751903489, 0.006692460738122463, -0.009312329813838005, -0.001795429037883878, -0.003557827323675156, -0.001225239131599665, 0.0002269320102641359, -0.0002326056128367782, -0.005285784136503935, -0.001341705559752882, -0.0005169896176084876, -0.0005986144533380866, -0.00205698749050498, -0.005333185195922852, 0.0001491743169026449, 0.001922566676512361, 0.009193513542413712 ], [ 0.10899418592453, 0.07017328590154648, 0.1235116645693779, 0.07037607580423355, 0.05171019211411476, 0.08431491255760193, 0.05584463477134705, 0.08440995961427689, 0.0002745233941823244, 0.01178977079689503, 0.06254377961158752, 0.04483330994844437, -0.003594234585762024, 0.04469256103038788, 0.0001617757661733776, -0.01132090296596289, 0.0002858458901755512, 0.01191830821335316, 0.03377533331513405, 0.0004498490015976131, -0.01130446419119835, 0.0002996980038005859, -0.0001342060859315097, -0.01158929336816072, 0.001025213045068085, 0.004605520516633987, 0.0002396858617430553, 0.001971194287762046, 0.001125482725910842, -0.01149043720215559, 0.007544785737991333, -0.01143052987754345, -0.0001952982129296288, -0.002121173776686192, 0.003407289041206241, 0.004400265403091908, 0.005494734272360802, 0.005487891845405102, -0.00003868433486786671, -0.006823236588388681, -0.005586289335042238, -0.001017369912005961, 0.0138303879648447, -0.0008616368868388236, 0.00002911851333919913, 0.006496638990938663, 0.005788044538348913, 0.005242646671831608, 0.00005995020183036104, 0.002169177168980241, 0.005109293386340141, 0.00272314390167594, -0.0002046060399152339, -0.006164321210235357, 0.005269186105579138, 0.004445946309715509, 0.003803680650889874, 0.004461302887648344, 0.0001740230363793671, 0.006138116586953402, 0.005874241702258587, 0.002651386894285679, -0.00004053002339787781, -0.001763356034643948 ], [ 0.1089954823255539, -0.07017271965742111, 0.1235111132264137, 0.0703754648566246, -0.05170270428061485, -0.08431327342987061, 0.05584052577614784, 0.08440886437892914, 0.0002728359249886125, -0.01178464293479919, -0.06253291666507721, -0.04483170807361603, -0.003599943593144417, 0.04469205439090729, 0.0001580626849317923, -0.01131740584969521, -0.0002874349302146584, -0.01190664619207382, -0.03377103805541992, -0.0004500607028603554, -0.01130786631256342, 0.0003000920987688005, -0.000138132250867784, -0.01158605422824621, 0.001024456578306854, -0.004606435541063547, -0.000235427898587659, -0.001961722271516919, -0.001132600009441376, 0.01148819364607334, 0.007545873057097197, -0.01143060624599457, -0.0001976633939193562, -0.002122615464031696, 0.003407836658880115, 0.004395506344735622, -0.005498164333403111, -0.00548210134729743, 0.00004453880683286116, 0.006821842864155769, 0.005576013587415218, 0.001014040433801711, 0.01383409090340137, -0.0008623195462860167, 0.00002772232619463466, 0.006489625200629234, 0.005788958165794611, 0.005239825695753098, 0.00005550750938709825, -0.002176131587475538, -0.005105679389089346, -0.002717998344451189, 0.000203033778234385, 0.006157349329441786, -0.005271258763968945, -0.004449326545000076, 0.00380461965687573, 0.004461896140128374, 0.0001731276424834505, 0.006130354013293982, 0.005874007474631071, 0.002651121467351913, -0.00003931875107809901, -0.001773658790625632 ], [ 0.1106875613331795, 0.06746696680784225, 0.1250011324882507, -0.07285697013139725, -0.04619936645030975, 0.08287846297025681, 0.0552481897175312, -0.08726610243320465, 0.002585650188848376, 0.004268362186849117, -0.05913673713803291, 0.04655253142118454, -0.00583104370161891, -0.04504033550620079, 0.003207054454833269, 0.008931798860430717, 0.007627120707184076, 0.006668494082987309, -0.03645111620426178, 0.002633726224303246, -0.01263261679559946, 0.002449746010825038, 0.0009079234441742301, 0.008562059141695499, 0.003713981946930289, -0.002020001178607345, 0.00586598040536046, 0.004666512366384268, -0.005526028573513031, -0.01195696368813515, 0.008833968080580235, 0.01411772426217794, -0.002282909350469708, 0.001025443896651268, 0.006399159319698811, -0.007050176151096821, -0.0009963751072064042, -0.00009843026782618836, -0.001912718173116446, -0.0009523994522169232, 0.005607919301837683, -0.003165210830047727, 0.01615312695503235, 0.0001400343171553686, -0.002701760036870837, -0.004821540787816048, 0.006569572724401951, -0.007922700606286526, 0.001980604603886604, -0.0003917829017154872, -0.001012322492897511, 0.003662817878648639, -0.005856466479599476, -0.005227227695286274, -0.001584258046932518, 0.003774311626330018, 0.004163111094385386, -0.007565736304968596, 0.0001439017214579508, -0.003907716367393732, 0.004292430821806192, -0.003073602681979537, 0.001816111151129007, 0.00096976786153391 ], [ 0.1106883212924004, -0.06746820360422134, 0.1250046491622925, -0.07285060733556747, 0.04619225487112999, -0.08288215845823288, 0.05525192618370056, -0.08726175874471664, 0.002583838300779462, -0.004268737975507975, 0.05912910029292107, -0.0465548038482666, -0.005833076313138008, -0.04504081606864929, 0.003203485161066055, 0.008923515677452087, -0.007620780263096094, -0.006667317822575569, 0.03644744679331779, -0.002629996510222554, -0.01263726782053709, 0.002449385821819305, 0.0009053611429408193, 0.008554806001484394, 0.003716799663379788, 0.002020074753090739, -0.005860716104507446, -0.004664798732846975, 0.005527138710021973, 0.01196293346583843, 0.008836319670081139, 0.01411975175142288, -0.002281788969412446, 0.00102347310166806, 0.006396717857569456, -0.007053674198687077, 0.0009992747800424695, 0.0001051936196745373, 0.001915471744723618, 0.0009512846590951085, -0.00560272391885519, 0.003166009206324816, 0.01616258174180984, 0.0001405938965035602, -0.002698273165151477, -0.004820531234145164, 0.006561354734003544, -0.00792218279093504, 0.001988182542845607, 0.000389533000998199, 0.00101261236704886, -0.003653089748695493, 0.00585994403809309, 0.005222943611443043, 0.001590084983035922, -0.003778312122449279, 0.004169158171862364, -0.007567664608359337, 0.000146392485476099, -0.003905733115971088, 0.004286040551960468, -0.003066899022087455, 0.001826871070079505, 0.0009720409289002419 ] ], "Routing": [ 1, 2, 3, 5, 6, 7, 8, 9, 10, 11, 12 ] } } ././@LongLink0000644000000000000000000000016000000000000011600 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/SimpleDecoder/Source/Presets/t_design_12ch.jsonIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/SimpleDecoder/Source/Presets/t_desig0000664002537200253720000006253715257173642031611 0ustar zmoelnigzmoelnig{ "Name": "All-Round Ambisonic decoder (AllRAD) and loudspeaker layout", "Description": "This configuration file was created with the IEM AllRADecoder v0.9.5 plug-in. 8 Nov 2024 5:30:02pm", "Decoder": { "Name": "Decoder", "Description": "A 7th order Ambisonics decoder of a 4th order t-design (12 channels).", "ExpectedInputNormalization": "n3d", "Weights": "none", "WeightsAlreadyApplied": false, "Matrix": [ [ 0.12559087574482, 5.389694592849992e-7, -0.096067577600479, 0.155456572771072, -1.069890117832983e-6, -2.667371063580504e-6, -0.013878395780921, -0.125796839594841, 0.101780265569687, -2.221868498963886e-6, -1.793987394194119e-6, 2.109391289195628e-6, 0.042736500501633, 0.019990863278508, -0.074021853506565, 0.048897854983807, -2.067717559839366e-6, -1.0171889925914e-6, -9.47616598523382e-8, -5.850488946634869e-7, -0.011010559275746, 0.01266073808074, 0.012719512917101, -0.022766990587115, 0.01302039064467, -9.696095730760135e-7, -1.198015525005758e-6, -1.280712126572325e-6, 2.510770627850434e-6, 2.09349968827155e-6, 0.000822237867396, 0.005849194712937, -0.00090026849648, -0.004187593702227, 0.007118500769138, -0.002872004639357, 7.734612950116571e-8, -1.723915261209186e-6, -7.411837259496679e-7, 2.755270543275401e-6, -1.900881443361868e-7, -3.295057922514388e-6, -0.008845667354763, -0.005180145613849, 0.009570606052876, 0.000312287796987, -0.011510957963765, 0.014306652359664, -0.00470308214426, 6.842346920166165e-7, -1.055942902894458e-6, 7.930420338198019e-7, 1.223293793373159e-6, 6.728278094669804e-7, 6.429919352513025e-8, 2.477229600117425e-6, 0.006178115028888, -0.004209423437715, -0.004095892421901, 0.003466884838417, 0.001162215135992, -0.008060889318585, 0.008532497100532, -0.001134029938839 ], [ 0.125581786036491, -0.15544182062149, 1.810769731491746e-6, 0.096074797213078, -0.125805094838142, -6.923750106579973e-7, -0.081202559173107, 2.793979774651234e-6, -0.062896065413952, -0.007134013809264, -3.593297378756688e-6, 0.052340816706419, 2.888500148401363e-6, -0.032354339957237, 1.099584778785356e-6, -0.079122744500637, 0.019904533401132, 1.561771370006682e-7, 0.016823977231979, -6.958971880521858e-6, 0.012610125355422, -8.678640597281628e-7, 0.008405907079577, -3.366651981195901e-6, -0.01491979137063, -0.006883033551276, 4.200841885904083e-6, 0.000167611302459, 1.067610241989314e-6, 0.003569380613044, -5.347754722606624e-6, -0.003877811133862, -5.653808784700232e-6, -0.005508999805897, 2.773309915937716e-6, -0.002586947986856, -0.003154754173011, -3.74099090549862e-6, 0.010418778285384, 2.110163450197433e-6, 0.010636178776622, 4.358188562036958e-6, 0.007302965968847, 1.766871605468623e-6, 0.002382337348536, 2.710272156036808e-6, -0.005417014937848, 4.389341484056786e-6, -0.015378892421722, 0.006514461711049, -1.534881789666542e-6, 0.005342307500541, -4.179149073024746e-6, 0.002945517189801, -5.331422926246887e-6, -0.004078712780029, 1.427639517714852e-6, 0.004730554763228, 2.313382481133885e-7, 0.005948387552053, -3.07209802485886e-7, 0.005126494448632, -3.951354301534593e-6, -0.006702217273414 ], [ 0.125590682029724, -0.096077963709831, 0.155449971556664, -3.039737975996104e-6, 4.158865976933157e-6, -0.125806197524071, 0.095070630311966, -1.808746901588165e-6, -0.038871612399817, 0.011535690166056, 9.877694537863135e-7, -0.084692262113094, 0.026407169178128, 6.520585884572938e-7, -0.045745819807053, 4.678274308389518e-6, -6.799424227210693e-6, 0.008690999820828, -2.268101980007486e-6, -0.024556191638112, -0.001606374862604, 5.713808377549867e-7, -0.021122880280018, -1.423200615136011e-6, 0.001892460277304, 0.001362634589896, -8.326351235155016e-7, -0.004960585851222, 8.773367312642222e-7, 0.00506370794028, 0.003016925184056, -1.012159955848801e-7, 0.007121725473553, -7.295298473763978e-6, -0.000558725965675, -7.220322004286572e-6, 7.219353392429184e-6, 0.002084384206682, 4.251885457051685e-6, -0.01456895750016, 5.145551767782308e-6, 0.003832983551547, 0.00965478271246, 1.686777068243828e-6, 0.01433739438653, -4.008508312836057e-6, -0.004529258236289, -1.305429275788583e-8, 0.002349335700274, -0.001984701026231, 4.792085519511602e-7, 0.001068932237104, -1.565308934914356e-6, -0.011007042601705, 3.446725258982042e-6, -0.001627382356673, 0.006322665605694, 3.459141908024321e-6, 0.005268923938274, 8.175620109796e-7, -0.004728989675641, 6.72454643790843e-6, 0.002439617179334, 6.120740181358997e-6 ], [ 0.125581592321396, 7.338168416026747e-6, 0.096065528690815, 0.155447944998741, 4.927971076540416e-6, 6.731963821948739e-6, -0.013872266747057, 0.125797763466835, 0.101783074438572, 1.105956698665977e-6, -1.135436605181894e-6, 7.184523383330088e-6, -0.042738154530525, 0.019997537136078, 0.074025176465511, 0.048908434808254, -9.602310910850065e-7, -6.337726063065929e-6, -1.218675151903881e-6, 0.000010516424481, -0.011013912037015, -0.012665105983615, 0.012723940424621, 0.022764092311263, 0.013032393530011, -8.179650308193231e-7, -4.463845925783971e-6, -5.119542038301006e-6, 2.849368911483907e-6, 9.162774404103402e-6, -0.000813454214949, 0.00584382051602, 0.000902322761249, -0.004192964173853, -0.007127302698791, -0.002865219255909, 9.277064236812294e-7, -4.715364809726452e-7, 4.55474918226173e-7, -3.729581294464879e-6, 3.178687109084422e-7, 5.108426194055937e-6, -0.008837134577334, 0.005185797810555, 0.009575405158103, -0.000312963820761, -0.011518334969878, -0.014316854067147, -0.004704225342721, 2.137647470590309e-6, 2.458341668898356e-6, 4.107052518520504e-6, 1.303159592680458e-6, -0.000010108161405, -1.699533527244057e-6, 3.489813252599561e-6, -0.006178711075336, -0.004208435770124, 0.004101858008653, 0.003470730036497, -0.001165425521322, -0.008057412691414, -0.00854246225208, -0.001138989115134 ], [ 0.125579416751862, -0.15544156730175, -1.521976059848384e-6, -0.096072740852833, 0.125802129507065, 1.150578100350685e-6, -0.081212855875492, 2.272116034873761e-6, -0.062896728515625, -0.007133594248444, 2.362275353107179e-8, 0.052354745566845, 3.973459115513833e-6, 0.032356549054384, -2.327679567315499e-6, 0.079118981957436, -0.019902450963855, 2.935928762326512e-7, -0.016822095960379, -2.055714958260069e-6, 0.01261593401432, -4.557960892270785e-6, 0.008413191884756, 4.298890871723415e-6, -0.014921000227332, -0.006878510583192, -2.124653292412404e-6, 0.000162570984685, 2.322882664884673e-6, 0.003571053268388, -2.132100917151547e-6, 0.0038811347913, 2.543908749430557e-6, 0.005515897646546, -3.8483494790853e-6, 0.002587178256363, 0.003154799574986, 1.378133219986921e-6, -0.010424637235701, -9.584365443515708e-7, -0.010643617250025, -1.052945208357414e-6, 0.007306914310902, 1.213806513078453e-6, 0.0023860684596, -3.547410187820788e-7, -0.005420569796115, 2.501069957361324e-6, -0.015373075380921, 0.006511114537716, -7.248096380862989e-7, 0.005341545213014, -2.577948407633812e-6, 0.002937705023214, 3.74992964680132e-6, -0.004074503201991, 1.053427695296705e-6, -0.004740335512906, -2.390316694800276e-6, -0.005953144747764, -2.428171796964307e-7, -0.005128922406584, -3.267541615059599e-6, 0.006703782826662 ], [ 0.12558414041996, 0.096075177192688, -0.155444398522377, 1.121312948271225e-6, -4.195671863271855e-6, -0.125808790326118, 0.09507017582655, -3.809093868767377e-6, -0.038868993520737, -0.011540651321411, 1.641084168113593e-6, 0.084702551364899, -0.026407370343804, 4.278277629055083e-6, 0.045743405818939, 6.803923497500364e-6, 4.259614797774702e-6, 0.008693279698491, 1.685682036622893e-6, -0.024565670639277, -0.001607419457287, -2.76009672006694e-7, -0.021123580634594, -4.237515895511024e-6, 0.001903590164147, -0.001357168890536, 1.778287355591601e-6, 0.004965358879417, -3.539529700447019e-7, -0.00506303505972, -0.003020723816007, -3.870730779453879e-6, -0.007117214147002, 3.155976457946963e-7, 0.000547420524526, -3.34382866640226e-6, -7.599613127240445e-6, 0.002082945778966, -5.42968246008968e-6, -0.014577188529074, -1.885478127405804e-6, 0.003838556353003, 0.00966758467257, 3.472515345492866e-6, 0.014331017620862, -7.853344641262083e-7, -0.00452465750277, -5.929846338403877e-6, 0.002349730115384, 0.001981290290132, 1.473518523198436e-6, -0.00107218476478, -4.544717739918269e-7, 0.011012152768672, 6.300185191321361e-7, 0.001622370094992, -0.006336973980069, -1.554453632479635e-7, -0.005264078266919, 1.547246242239453e-8, 0.004728777799755, 0.000012172019524, -0.002449556486681, 9.746107025421225e-6 ], [ 0.125589102506638, 3.124557679257123e-7, -0.096073545515537, -0.155451327562332, 7.706136102569872e-7, -2.345471784792608e-6, -0.013874411582947, 0.125803634524345, 0.101774759590626, -2.576686483735102e-6, 3.401182311790762e-6, 9.26094287478918e-7, 0.042739972472191, -0.019991662353277, -0.074024334549904, -0.048894550651312, 4.897857252217364e-6, -5.221410901867785e-6, 1.297386347687279e-6, -1.13858436634473e-6, -0.011008257046342, -0.012665003538132, 0.012713690288365, 0.022767728194594, 0.01302011217922, -6.368629783537472e-6, 6.666658919129986e-6, -1.978686441361788e-6, -2.033127657341538e-6, 5.149854587216396e-6, 0.000818892091047, -0.005854031536728, -0.000896752055269, 0.004196545109153, 0.007116277236491, 0.002870921976864, 4.966114829585422e-6, -5.731509645556798e-6, 6.047778100537471e-8, 5.459921339934226e-6, -5.525064807443414e-6, -2.765715407804237e-6, -0.008847689256072, 0.005182152613997, 0.009573739022017, -0.000311188166961, -0.011519998311996, -0.014300597831607, -0.004704071208835, 2.984586444654269e-7, 1.391006549056328e-6, 3.229404001103831e-6, -6.978543751756661e-6, 4.140086275583599e-6, 7.414073479594663e-7, -1.187009502245928e-6, 0.006179828662425, 0.004208744969219, -0.004087039735168, -0.003474269993603, 0.001159989042208, 0.008065534755588, 0.008525141514838, 0.001138683175668 ], [ 0.125585779547691, 0.15544681251049, 1.778831574483775e-6, -0.096074901521206, -0.125801160931587, 1.27003920624702e-6, -0.08120996505022, -1.549099579278845e-6, -0.062897257506847, 0.007134319748729, -2.503011728549609e-6, -0.052350990474224, 2.407938154647127e-6, 0.032350953668356, 9.540444523281622e-8, 0.079114094376564, 0.019896131008863, 2.693005626497325e-6, 0.016820210963488, 2.24626342060219e-6, 0.012611723504961, -4.538344455795595e-6, 0.008416598662734, 2.39511768995726e-6, -0.014920039102435, 0.006880177650601, -1.309680214944819e-6, -0.000160628012964, -2.890260020649293e-6, -0.003569716587663, -3.557292529876577e-6, 0.003882298478857, 3.96121231460711e-6, 0.005509023088962, -3.79500852432102e-6, 0.002590482356027, -0.00315479724668, 5.16835257258208e-7, 0.010417112149298, 3.855615887005115e-6, 0.010643208399415, 8.038796295295469e-7, 0.007300619967282, 2.770881337710307e-6, 0.002385516418144, -3.004402287842822e-6, -0.005415648687631, 3.987379386671819e-6, -0.015371141023934, -0.006505659781396, 1.145894756859889e-7, -0.005335185676813, -3.022462124135927e-6, -0.002937344135717, -3.183652779625845e-6, 0.004069032613188, 1.22402923352638e-7, -0.004733558744192, -3.161574568366632e-6, -0.005960452836007, -1.195317196334145e-7, -0.005126804579049, -4.233871095493669e-6, 0.006702402606606 ], [ 0.125588595867157, 0.096077032387257, 0.155447855591774, 4.932795491185971e-6, -3.774615834117867e-6, 0.125804156064987, 0.095071591436863, 8.755421731621027e-6, -0.038875475525856, -0.011539590544999, 6.849363103356154e-7, 0.084692038595676, 0.02641193382442, 5.670119662681827e-6, -0.045750603079796, 0.000011381527656, 9.765681170392781e-6, -0.008693567477167, 2.934269559773384e-6, 0.024558836594224, -0.001601987751201, -3.569595037333784e-6, -0.021128149703145, 6.924305580469081e-6, 0.001896046567708, -0.001367473276332, 1.573445956637443e-6, 0.00496539240703, -2.704537564568454e-6, -0.005063348915428, 0.003017987823114, -8.185174920072313e-6, 0.007113902829587, 5.577676276402599e-8, -0.000550636206754, -6.108218713052338e-6, -5.791862804471748e-6, -0.002087615663186, -7.414837909891503e-6, 0.014581844210625, -5.370560757000931e-6, -0.003839470213279, 0.009656333364546, -2.913868001996889e-6, 0.014327440410852, 1.571010216139257e-6, -0.004521031863987, 4.085403816134203e-6, 0.002357700373977, 0.001982370857149, 9.496906017147921e-8, -0.001065675518475, -3.469291186775081e-6, 0.011020392179489, 2.064116870315047e-6, 0.001619353657588, 0.006327928043902, 3.252244141549454e-6, 0.005260834936053, 2.544344170019031e-6, -0.004727230872959, 0.000012644956769, 0.002454095287248, 4.624697339750128e-6 ], [ 0.125579804182053, 2.942494802482543e-6, 0.096070341765881, -0.155443012714386, -4.637531958451291e-7, 5.151972345629474e-6, -0.013866109773517, -0.125800669193268, 0.101780883967876, 5.788133421447128e-7, 1.272192662327143e-6, 8.606201845395844e-6, -0.042736042290926, -0.019997894763947, 0.074027463793755, -0.048908617347479, -3.008988642250188e-6, -4.931583589495858e-6, -2.209748345194384e-6, 9.287630746257491e-6, -0.011013272218406, 0.012663915753365, 0.012712772935629, -0.022772571071982, 0.013027754612267, 4.99342058901675e-6, 4.604583409673069e-6, -9.195870234179893e-7, -1.842610117819277e-6, 7.131841812224593e-6, -0.000818844651803, -0.005849299952388, 0.0008930862532, 0.004202429670841, -0.007116610184312, 0.002877684542909, -5.181727374292677e-6, -4.603795332513982e-6, -2.718870064200019e-6, -3.05336584460747e-6, 1.261613874703471e-6, 6.923522960278206e-6, -0.008842038922012, -0.005183327943087, 0.009575541131198, 0.000318066595355, -0.011523854918778, 0.014308627694845, -0.004718636162579, 3.083721139773843e-6, 4.396000349515816e-6, 3.612875161707052e-6, -3.27957945955859e-6, -0.000010128213034, -2.620484110593679e-6, 4.102586899534799e-6, -0.006177564151585, 0.00420711375773, 0.00409345747903, -0.00347758946009, -0.001162993139587, 0.008063345216215, -0.008535100147128, 0.001146764145233 ], [ 0.125582382082939, 0.155443906784058, 6.606633746741863e-7, 0.096072822809219, 0.125806108117104, 5.867739218956558e-7, -0.081199817359447, 7.672070410080778e-7, -0.062899276614189, 0.007135248277336, 2.31654780691315e-6, -0.052338358014822, 2.093776174660889e-6, -0.032352041453123, -4.946304557051917e-7, -0.079125568270683, -0.019903723150492, 2.435938313283259e-7, -0.016820304095745, 3.727452849489055e-6, 0.012612971477211, 3.123381020486704e-7, 0.008404528722167, -3.381433771210141e-6, -0.014924003742635, 0.006881470326334, -2.412333287793444e-6, -0.00016524863895, -9.605605555407237e-8, -0.003565041348338, -3.019888026756234e-6, -0.003872571745887, -2.564548367445241e-6, -0.005513267591596, -2.992882173202815e-7, -0.002589736599475, 0.003155126003549, 1.624223159524263e-6, -0.010416943579912, -9.04230773812742e-7, -0.01063446700573, -2.172198946936987e-6, 0.007294737268239, 7.335703458011267e-7, 0.002384473336861, 6.758666586392792e-7, -0.005420737434179, 9.849776461123838e-7, -0.015379217453301, -0.006512757390738, 8.392343602281471e-7, -0.005337659269571, 1.837573677221371e-6, -0.002943135099486, 8.875330195223796e-7, 0.004073354415596, -1.575281658006134e-6, 0.004729304462671, 1.525347329334181e-6, 0.005954571999609, -5.369748805605923e-7, 0.005120670888573, -3.598095418055891e-6, -0.006704779807478 ], [ 0.125580996274948, -0.096070550382137, -0.155443653464317, -1.883277718661702e-6, 7.820494829502422e-6, 0.125803709030151, 0.095074698328972, -2.225327989435755e-6, -0.038872562348843, 0.011545354500413, -2.85777059616521e-6, -0.084699921309948, -0.026412231847644, 5.626875008601928e-6, 0.045747138559818, 8.730357876629569e-6, -6.447284704336198e-6, -0.008699465543032, -2.905860583268804e-6, 0.024564437568188, -0.001608656486496, -1.941154096130049e-6, -0.021122528240085, -1.421736783413508e-6, 0.001901993062347, 0.001363426214084, -5.037030064158898e-7, -0.004963208455592, -1.816258077269595e-6, 0.005064587574452, -0.00301297288388, -2.958262939500855e-6, -0.00712388753891, -7.148704298742814e-6, 0.000548818323296, -1.831154690989933e-6, 1.380813159812533e-6, -0.002090630820021, 4.691320100391749e-6, 0.014581562951207, 8.569491001253482e-6, -0.003840091871098, 0.009658996015787, 1.078874333870772e-6, 0.014336965046823, 4.659589649236295e-6, -0.004524480551481, -6.439456683438038e-6, 0.002354640280828, -0.00198280881159, 4.224519216222689e-6, 0.001075653475709, 2.913435764639871e-6, -0.011018329299986, -5.178987066756235e-6, -0.001622248790227, -0.006333502475172, 3.545295840012841e-6, -0.005261995829642, -7.435122029164631e-7, 0.00472721690312, 9.054662768903654e-6, -0.002454198664054, 3.278905751358252e-6 ] ], "Routing": [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 ] }, "LoudspeakerLayout": { "Name": "A loudspeaker layout", "Loudspeakers": [ { "Azimuth": 0.0, "Elevation": -31.717473983764648, "Radius": 1.0, "IsImaginary": false, "Channel": 1, "Gain": 1.0 }, { "Azimuth": -58.28253173828125, "Elevation": 0.0, "Radius": 1.0, "IsImaginary": false, "Channel": 2, "Gain": 1.0 }, { "Azimuth": -90.0, "Elevation": 58.282524108886719, "Radius": 1.0, "IsImaginary": false, "Channel": 3, "Gain": 1.0 }, { "Azimuth": 0.0, "Elevation": 31.717473983764648, "Radius": 1.0, "IsImaginary": false, "Channel": 4, "Gain": 1.0 }, { "Azimuth": -121.71746826171875, "Elevation": 0.0, "Radius": 1.0, "IsImaginary": false, "Channel": 5, "Gain": 1.0 }, { "Azimuth": 90.0, "Elevation": -58.282524108886719, "Radius": 1.0, "IsImaginary": false, "Channel": 6, "Gain": 1.0 }, { "Azimuth": 180.0, "Elevation": -31.717473983764648, "Radius": 1.0, "IsImaginary": false, "Channel": 7, "Gain": 1.0 }, { "Azimuth": 121.717475891113281, "Elevation": 0.0, "Radius": 1.0, "IsImaginary": false, "Channel": 8, "Gain": 1.0 }, { "Azimuth": 90.0, "Elevation": 58.282524108886719, "Radius": 1.0, "IsImaginary": false, "Channel": 9, "Gain": 1.0 }, { "Azimuth": 180.0, "Elevation": 31.717473983764648, "Radius": 1.0, "IsImaginary": false, "Channel": 10, "Gain": 1.0 }, { "Azimuth": 58.282524108886719, "Elevation": 0.0, "Radius": 1.0, "IsImaginary": false, "Channel": 11, "Gain": 1.0 }, { "Azimuth": -90.0, "Elevation": -58.282524108886719, "Radius": 1.0, "IsImaginary": false, "Channel": 12, "Gain": 1.0 } ] } }././@LongLink0000644000000000000000000000016000000000000011600 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/SimpleDecoder/Source/Presets/5point1point4.jsonIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/SimpleDecoder/Source/Presets/5point10000664002537200253720000004267515257173642031473 0ustar zmoelnigzmoelnig{ "Decoder": { "Name": "5.1.4 Decoder", "Description": "Channel order: L R C LFE LRS RRS TL TR TRL TRR", "ExpectedInputNormalization": "n3d", "Weights": "none", "WeightsAlreadyApplied": false, "SubwooferChannel" : 4, "Matrix": [ [ 0.2131343632936478, 0.1674741059541702, -0.116998091340065, 0.1030930504202843, 0.09895569831132889, -0.05179676786065102, -0.02049557119607925, -0.01443309150636196, -0.04926532506942749, 0.004381249193102121, -0.02851440571248531, -0.03579326719045639, -0.01780759915709496, -0.02566001377999783, 0.02800518646836281, -0.03290984779596329, 0.009384578093886375, -0.005163434892892838, -0.01325422246009111, -0.007311674300581217, 0.01569737680256367, -0.01824660785496235, 0.003865944920107722, 0.02330395765602589, -0.006012026220560074, 0.00574416434392333, -0.004061505198478699, -0.005599016789346933, -0.01302408613264561, 0.01026901416480541, 0.02206166088581085, 0.002972666407003999, -0.003738107159733772, 0.003977301530539989, 0.01858540810644627, -0.01691609062254429, -0.004822124727070332, 0.001729590469039977, -0.0002825063420459628, -0.0001394564169459045, 0.008678832091391087, 0.01028678007423878, 0.003859091550111771, 0.01589048840105534, -0.007600294426083565, 0.002243288094177842, 0.002485617762431502, 0.01166260801255703, -0.009816505014896393, -3.651362021628302e-6, 0.0003401100111659616, -0.001081545022316277, 0.0004671092028729618, 0.002936662174761295, 0.007323960307985544, 0.00236745341680944, -0.01051582209765911, 0.007816862314939499, 0.004386984743177891, -0.009450918063521385, -0.0003131439734715968, -0.0004713792586699128, 0.003663951298221946, -0.0065753567032516 ], [ 0.2131378203630447, -0.1674749553203583, -0.1169960275292397, 0.1030998528003693, -0.09895913302898407, 0.05179562047123909, -0.02050137519836426, -0.01443195063620806, -0.04926136136054993, -0.004386078100651503, 0.0285143256187439, 0.03579915687441826, -0.01781081221997738, -0.02566314302384853, 0.02800740115344524, -0.03290968388319016, -0.009386975318193436, 0.005160728003829718, 0.01325224246829748, 0.007312167435884476, 0.01570453122258186, -0.01824441365897655, 0.00386469648219645, 0.02330319583415985, -0.006014125421643257, -0.00574782770127058, 0.004066440742462873, 0.005606212187558413, 0.01302505563944578, -0.01027174014598131, 0.02206327207386494, 0.002965877531096339, -0.003738689469173551, 0.003971731755882502, 0.01858300156891346, -0.01691387034952641, 0.0048108771443367, -0.001730288262479007, 0.0002871394972316921, 0.0001404949725838378, -0.008670942857861519, -0.01029145531356335, 0.003854754380881786, 0.0158957876265049, -0.007597245741635561, 0.002246623625978827, 0.002494432730600238, 0.01167117618024349, -0.009818447753787041, 3.673138962767553e-6, -0.0003433194651734084, 0.001080694724805653, -0.0004708112392108887, -0.002943152561783791, -0.007329343352466822, -0.002364087849855423, -0.010515958070755, 0.007813847623765469, 0.004383926279842854, -0.009444478899240494, -0.0003122979833278805, -0.0004742431920021772, 0.003661262802779675, -0.006581482011824846 ], [ 0.1385433822870255, -7.627794730069581e-6, -0.1096221208572388, 0.114499643445015, -0.00001127652285504155, 6.822429554631526e-7, 0.01869873329997063, -0.04773789271712303, 0.1013377010822296, -9.330385182693135e-6, -7.031072755125933e-7, 6.5787139647e-6, -0.003952054306864738, -0.02122083678841591, -0.04193402826786041, 0.07587461918592453, 7.839922773200669e-7, 6.294983734278503e-8, 0.0000116498522402253, 1.209421839121205e-6, 0.008502040058374405, 0.007139584515243769, -0.003518362529575825, -0.02618056535720825, 0.04913502559065819, 0.00001339830760116456, -5.782316634395102e-7, 8.298970897158142e-6, 3.908120902451628e-7, -9.82128858595388e-6, -0.0003188119444530457, 0.006940619554370642, -0.00403235899284482, 0.001273841597139835, -0.01139947865158319, 0.02714450284838676, 0.00002178584873036016, -9.88133933788049e-7, -1.396012521581724e-6, -1.120974047807977e-6, -0.00001333451473328751, 3.813029252341948e-6, -0.001505736610852182, -0.002404434373602271, 0.007142175454646349, -0.007360849063843489, 0.001383096328936517, -0.002559605985879898, 0.009687526151537895, 0.00002168364881072193, -1.023572622216307e-6, -0.00001368769062537467, -6.22471702627081e-7, -6.877625764900586e-6, 6.235582532099215e-6, 3.549399252733565e-6, 0.0008696673903614283, -0.002444526180624962, -0.003929803613573313, 0.006373327691107988, -0.00684571685269475, 0.00198239553719759, 0.004419095814228058, -0.0002968320623040199 ], [ 0.2410472482442856, 0.1583183109760284, -0.1339948326349258, -0.1522572338581085, -0.1029797121882439, -0.04666431248188019, -0.03140560537576675, 0.04206055030226707, 0.003014175919815898, 0.006844057701528072, 0.02853880077600479, -0.0336250327527523, -0.006387683097273111, 0.03662766888737679, -0.004001487977802753, -0.0001110766825149767, -0.005173773970454931, -0.005297730676829815, 0.012012779712677, -0.009282392449676991, 0.01866131275892258, 0.009005320258438587, 0.001171328942291439, -0.002936179051175714, 0.02375304326415062, 0.006415932439267635, 0.00241460744291544, -0.004663394764065742, 0.01502843294292688, 0.009005321189761162, 0.019215052947402, -0.01010269671678543, -0.001254963572137058, -0.00213824026286602, 0.003583651501685381, -0.006228093989193439, 0.005745604168623686, 0.002375342417508364, 0.0002512884384486824, -0.002185701625421643, -0.008133162744343281, 0.01109582372009754, 0.0001489237474743277, -0.01183168217539787, 0.0004152948968112469, -0.002018587663769722, 0.003481453750282526, -0.003693794598802924, 0.002700120210647583, -0.001251366687938571, -0.001804866245947778, 0.00008940707630245015, 0.0005599387804977596, 0.00323397433385253, -0.007459593936800957, 0.003251048969104886, -0.00873391330242157, -0.003473407821729779, 0.001041697338223457, 0.00296603818424046, -0.003083861898630857, -0.0007219695835374296, 0.001053665182553232, -0.003808183828368783 ], [ 0.2410495728254318, -0.1583219468593597, -0.1339981704950333, -0.1522519141435623, 0.1029736176133156, 0.04666051641106606, -0.03140822425484657, 0.04206659644842148, 0.003009303007274866, -0.006844535004347563, -0.0285347867757082, 0.03362725675106049, -0.006384389940649271, 0.03662717342376709, -0.004007285460829735, -0.0001115850682253949, 0.005173736251890659, 0.005293817725032568, -0.01200651284307241, 0.009285535663366318, 0.01866509206593037, 0.008998597040772438, 0.001168618095107377, -0.002934011863544583, 0.02374568767845631, -0.006410667672753334, -0.002415267983451486, 0.004664637614041567, -0.0150279039517045, -0.009010208770632744, 0.01921622455120087, -0.01009664684534073, -0.00125374342314899, -0.002125917468219995, 0.003584468504413962, -0.006230130326002836, -0.005737173371016979, -0.002372789429500699, -0.0002545110473874956, 0.002183031756430864, 0.00812670961022377, -0.01109185256063938, 0.0001450065901735798, -0.01184249669313431, 0.000416831549955532, -0.002016216283664107, 0.003478382946923375, -0.003702079644426703, 0.00270344945602119, 0.001248873537406325, 0.001807674183510244, -0.00009408187179360539, -0.0005604398902505636, -0.003235979937016964, 0.007456664927303791, -0.003249532310292125, -0.008738766424357891, -0.003470413386821747, 0.001048192963935435, 0.002957399236038327, -0.003087846795096993, -0.000720077776350081, 0.00106138875707984, -0.003801100421696901 ], [ 0.117279514670372, 0.07449584454298019, 0.1312312483787537, 0.07035288959741592, 0.03932807967066765, 0.09107264131307602, 0.05537265911698341, 0.08541097491979599, -0.00138741557020694, 0.0001816697040339932, 0.05415387451648712, 0.04953418299555779, -0.009774397127330303, 0.04548725113272667, -0.002027959330007434, 0.0006240854854695499, 0.001003771089017391, 0.001663930015638471, 0.03823327645659447, -0.0002013769262703136, -0.01477029733359814, -0.001610805164091289, -0.001198122394271195, -0.001145039917901158, 0.007443945854902267, 0.0002035427460214123, 0.001465356792323291, 0.002715294016525149, 0.009540459141135216, -0.01491845212876797, 0.01081611216068268, -0.01528681162744761, 0.0005884714191779494, -0.002869714051485062, 0.01044593378901482, 0.0004524742544163018, -0.003504063235595822, 0.002168773673474789, 0.001205459586344659, 0.001066681579686701, -0.006190451327711344, -0.001492234063334763, 0.0188657883554697, -0.00255616893991828, 0.00159897527191788, -0.001176108722575009, 0.007562165148556232, 0.001984996255487204, 0.0006965188076719642, -0.001015517511405051, -0.003156330203637481, 0.003927631769329309, 0.0006409672205336392, -0.002609690418466926, -0.002867696806788445, 0.008020411245524883, 0.003744025016203523, 0.006612040568143129, 0.0009362766286358237, 0.003057422116398811, 0.00221218541264534, 0.003279171884059906, 0.0006856560939922929, 0.001114946091547608 ], [ 0.1172831356525421, -0.07450202107429504, 0.1312324702739716, 0.07034012675285339, -0.03931686282157898, -0.09107699990272522, 0.05536960065364838, 0.08539476245641708, -0.001394179067574441, -0.0001834745489759371, -0.05414193123579025, -0.04953332245349884, -0.009777174331247807, 0.04547782242298126, -0.002033886732533574, 0.0006313277408480644, -0.001012332621030509, -0.001667905482463539, -0.03822833672165871, 0.0002028031449299306, -0.01477327104657888, -0.001611095969565213, -0.001198607846163213, -0.001135740429162979, 0.007434080820530653, -0.00019733706722036, -0.001474436023272574, -0.002721208380535245, -0.00954060535877943, 0.0149181243032217, 0.01080748625099659, -0.01528357993811369, 0.0005904767313040793, -0.002863140078261495, 0.01043628621846437, 0.0004478311166167259, 0.003499137004837394, -0.002164230681955814, -0.001209995592944324, -0.001072965678758919, 0.006190035026520491, 0.00149436411447823, 0.01885397918522358, -0.002552474848926067, 0.001598927774466574, -0.001171636045910418, 0.007553578820079565, 0.00198423070833087, 0.0007050136919133365, 0.001006168546155095, 0.003150321077555418, -0.003925491124391556, -0.0006436511175706983, 0.002605494810268283, 0.002864944515749812, -0.00801501702517271, 0.003739176550880075, 0.006619936786592007, 0.0009353681234642863, 0.003063006326556206, 0.002197836525738239, 0.003283013124018908, 0.0006924770423211157, 0.001111702411435544 ], [ 0.1142724975943565, 0.07219275832176208, 0.1271106600761414, -0.07254419475793839, -0.04206861555576324, 0.08791207522153854, 0.0521911047399044, -0.08749482035636902, 0.002059323480352759, 0.002643517684191465, -0.05781934410333633, 0.04715748503804207, -0.01105662994086742, -0.04552473872900009, 0.002020535059273243, -0.001675697625614703, -0.002144239377230406, 0.00522055895999074, -0.04093967378139496, -0.001194978016428649, -0.01410663221031427, 0.003065786324441433, 0.0004389339010231197, 0.0002088725450448692, 0.009581496007740498, 0.002301763975992799, -0.002708239480853081, 0.005659993272274733, -0.01090091653168201, -0.01504653412848711, 0.01273521222174168, 0.01596005260944366, -0.0005764058441855013, 0.00319921295158565, 0.01285108830779791, -0.001965663861483335, 0.003170138224959373, 0.00474468944594264, -0.001630060956813395, 0.002698080381378531, 0.005251675378531218, -0.001397814834490418, 0.02082083560526371, 0.001358179259113967, -6.080494586058194e-6, 0.00265667331404984, 0.008282425813376904, -0.004322445951402187, 0.0006700933445245028, -0.001809847657568753, 0.002449668245390058, 0.005313228815793991, -0.0003073486732318997, -0.001670917263254523, 0.00182314938865602, 0.008180703036487103, 0.004649169277399778, -0.0083226403221488, 0.0009004523744806647, -0.001861077616922557, 0.001090868026949465, -0.005125280003994703, 0.001092267222702503, -0.00189383898396045 ], [ 0.1142620146274567, -0.07219088822603226, 0.127106249332428, -0.07253754138946533, 0.04208158701658249, -0.08791543543338776, 0.05220003426074982, -0.08748643100261688, 0.002056184224784374, -0.002651892136782408, 0.05782745406031609, -0.04716665670275688, -0.0110476715490222, -0.045518659055233, 0.002015415579080582, -0.001663944683969021, 0.002145974198356271, -0.005226722918450832, 0.04093541204929352, 0.001188577967695892, -0.01410672161728144, 0.003069469472393394, 0.0004330530355218798, 0.0002135957474820316, 0.009582218714058399, -0.002314304001629353, 0.002712389919906855, -0.00565691152587533, 0.01089642476290464, 0.015049091540277, 0.01273586973547935, 0.01596160605549812, -0.0005820627557113767, 0.003187509952113032, 0.01285232231020927, -0.001968233846127987, -0.003163420828059316, -0.004753136076033115, 0.001636724337004125, -0.002691986737772822, -0.005244079977273941, 0.001404855633154511, 0.02083195745944977, 0.001354943378828466, -9.945854799298104e-6, 0.002641543745994568, 0.00828951969742775, -0.00432283990085125, 0.0006638308404944837, 0.00181074975989759, -0.00244504795409739, -0.005310703068971634, 0.0003152824356220663, 0.001668114680796862, -0.001811727415770292, -0.008176333270967007, 0.004661530256271362, -0.008332506753504276, 0.0009008821216411889, -0.00186099810525775, 0.001105490024201572, -0.005123547744005919, 0.001086531090550125, -0.001894972752779722 ] ], "Routing": [ 1, 2, 3, 5, 6, 7, 8, 9, 10 ] } } ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/SimpleDecoder/Source/Presets/Cube_8ch.jsonIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/SimpleDecoder/Source/Presets/Cube_8c0000664002537200253720000003703715257173642031440 0ustar zmoelnigzmoelnig{ "Decoder": { "Name": "8ch Cube", "Description": "Channel order: FL FR RL RR TFL TFR TRL TRR", "ExpectedInputNormalization": "n3d", "Weights": "none", "WeightsAlreadyApplied": false, "Matrix": [ [ 0.1903220266103745, 0.1390426158905029, 0.1396176815032959, 0.1390356570482254, 0.09134297072887421, 0.091666579246521, 0.0002020866959355772, 0.09166141599416733, -6.458687380472838e-7, 0.0046482696197927, 0.06480231136083603, 0.003540602279826999, -0.006226413883268833, 0.003536406671628356, 1.178809839075257e-6, -0.00464248051866889, 3.522307679304504e-6, 0.009140546433627605, 0.009753846563398838, -0.003837856696918607, 0.0244592297822237, -0.003840704448521137, 4.253649876773125e-8, -0.009136480279266834, 0.02061823755502701, 0.006874806247651577, -3.186675030519837e-6, -0.001230292138643563, -0.0002106773608829826, 0.00770453829318285, 0.008086193352937698, 0.007708031684160233, -9.515355259281932e-7, 0.00123294407967478, 0.006776362657546997, 0.006874260026961565, -0.004422304686158895, 0.00636694161221385, -4.368401732790517e-6, -0.006919262930750847, 0.008635330945253372, -0.002108218148350716, -0.00164728204254061, -0.002102528233081102, 1.734638658490439e-6, 0.006922717206180096, 0.003727983683347702, 0.006373971700668335, 2.769864295260049e-6, -0.003650592872872949, 0.005465771071612835, 0.001606671488843858, -1.257933718079585e-6, -0.001108874450437725, 0.006163589656352997, -0.003957131411880255, 0.003569969208911061, -0.003957345616072416, 1.112527002078423e-6, 0.001111574936658144, 0.004306755494326353, 0.001614200416952372, -1.48136928146414e-6, 0.003658403642475605 ], [ 0.1903227120637894, -0.1390424966812134, 0.1396161615848541, 0.1390381306409836, -0.09134392440319061, -0.09166771173477173, 0.0001992419420275837, 0.09165753424167633, -1.621399725593164e-8, -0.004647057503461838, -0.06479956209659576, -0.003539906116202474, -0.006227580830454826, 0.003534658113494515, -2.769907041511033e-6, -0.004643845837563276, -4.954192718287231e-7, -0.009142688475549221, -0.009750724770128727, 0.00384005787782371, 0.02445715665817261, -0.003836657153442502, 3.127881598175009e-7, -0.009134705178439617, 0.02061888016760349, -0.006875935476273298, -4.197630005364772e-6, 0.001228078384883702, 0.0002133824455086142, -0.007706201169639826, 0.008082401007413864, 0.007708220742642879, 2.224036734332913e-6, 0.001237571937963367, 0.006772977765649557, 0.006876233965158463, 0.004418523982167244, -0.006366255693137646, -2.339599632250611e-6, 0.006921566557139158, -0.008635101839900017, 0.002104903105646372, -0.001649357262067497, -0.002104066079482436, -1.107443381442863e-6, 0.006925979163497686, 0.003726805793121457, 0.006370059214532375, -2.101745849358849e-6, 0.003653611987829208, -0.005461440421640873, -0.001606898615136743, 1.392149556522781e-6, 0.001109890174120665, -0.006167046725749969, 0.003957553301006556, 0.003569245571270585, -0.003953917417675257, -6.555544018738146e-7, 0.001110700657591224, 0.004308267962187529, 0.001612310763448477, 5.880122898815898e-6, 0.003648169338703156 ], [ 0.1903221905231476, 0.1390326321125031, 0.1396197974681854, -0.1390391737222672, -0.09133708477020264, 0.09165957570075989, 0.000202195908059366, -0.0916687548160553, -1.139992605203588e-6, 0.004636254627257586, -0.06480943411588669, 0.0035304119810462, -0.006229536607861519, -0.003543570404872298, 7.104434871507692e-7, 0.00464370334520936, 1.223532080985024e-6, 0.009139541536569595, -0.009754673577845097, -0.003845134517177939, 0.02445535361766815, 0.003839306998997927, 5.408027845987817e-6, 0.00914567057043314, 0.02061938866972923, 0.00687565328553319, 1.307496404479025e-6, -0.001238880096934736, 0.0002160192816518247, 0.007712013088166714, 0.008081077598035336, -0.007702346425503492, 2.28218050324358e-6, -0.00123053090646863, 0.006768213585019112, -0.006869714241474867, 0.004425749648362398, 0.006368730682879686, 4.410488600115059e-6, -0.006932892370969057, -0.008638556115329266, -0.002098353812471032, -0.001650907099246979, 0.00210892828181386, -3.263628741478897e-6, -0.006922502070665359, 0.003725737798959017, -0.006369034294039011, -4.698949396697572e-6, -0.003654310014098883, -0.005461916793137789, 0.00161591125652194, 5.056732788943918e-6, -0.001111946068704128, -0.006167601328343153, -0.003953041508793831, 0.003569780150428414, 0.003957793116569519, -1.291419380322623e-6, -0.001107585267163813, 0.004302985034883022, -0.001610321225598454, 4.242242084728787e-6, -0.003651530249044299 ], [ 0.1903205215930939, -0.1390322297811508, 0.1396201252937317, -0.1390398293733597, 0.09133875370025635, -0.09166053682565689, 0.0002025805733865127, -0.09166773408651352, 2.656107199072721e-6, -0.004636927973479033, 0.06480672210454941, -0.003535576863214374, -0.006228275131434202, -0.003535352647304535, 3.556590115749714e-7, 0.004640784114599228, -6.647266673098784e-6, -0.009136793203651905, 0.00975485984236002, 0.003843093058094382, 0.0244621429592371, 0.003842965234071016, -5.54970665689325e-6, 0.009140004403889179, 0.02062555402517319, -0.00687072891741991, 4.466838163352804e-6, 0.001240501063875854, -0.0002115490206051618, -0.007706914097070694, 0.008086568675935268, -0.00771033763885498, -1.743732582326629e-6, -0.001230994006618857, 0.006770838983356953, -0.006883258931338787, -0.004421469755470753, -0.006370107643306255, 2.533367933210684e-6, 0.006931028794497252, 0.008639742620289326, 0.002102752914652228, -0.001652290113270283, 0.00210627494379878, 4.420239747560117e-6, -0.006922466680407524, 0.003729293355718255, -0.006358031183481216, 6.526061952172313e-6, 0.003653155639767647, 0.005456875544041395, -0.001614072942174971, -9.099091471398424e-7, 0.001110942335799336, 0.006164911203086376, 0.003955121152102947, 0.003569579450413585, 0.003961138427257538, 1.241510290128645e-6, -0.001110085984691978, 0.004309543874114752, -0.001607380225323141, -4.12939607485896e-6, -0.003651387989521027 ], [ 0.1903233528137207, 0.1390350013971329, -0.1396207958459854, 0.1390397846698761, 0.09134220331907272, -0.09166095405817032, 0.0002061197446892038, -0.09166312217712402, 7.016242307145149e-7, 0.004637517035007477, -0.06480719894170761, 0.003535188734531403, 0.006219170987606049, 0.003534988267347217, -9.410488246430759e-7, -0.004644445143640041, -5.453853646031348e-6, -0.009137518703937531, 0.009756015613675117, 0.003839315148070455, 0.02446798607707024, 0.003841976867988706, 2.921947839240602e-7, 0.009138154797255993, 0.02062293142080307, 0.006872354075312614, -1.831285430853313e-6, -0.001236132229678333, 0.0002120821445714682, 0.007710447534918785, -0.00808962807059288, 0.007705077063292265, 1.24097562093084e-6, 0.001232182839885354, -0.006778163369745016, 0.006874530110508204, -0.00442874850705266, -0.006371970288455486, -1.752751700223598e-6, 0.006925443187355995, 0.008631863631308079, 0.002104785526171327, -0.001646933029405773, 0.00210567400790751, -1.048545072990237e-6, -0.00692220451310277, 0.00373197253793478, -0.006368080154061317, -2.30151749747165e-6, -0.003657879075035453, -0.005459130741655827, 0.001613929867744446, -6.455443326558452e-7, -0.00110973184928298, -0.006157903000712395, -0.003957723267376423, -0.003572527784854174, -0.003954126499593258, -1.742822178130154e-6, 0.001113271224312484, -0.004306594841182232, 0.001612016232684255, 9.985208180296468e-7, 0.003653366351500154 ], [ 0.1903200149536133, -0.139036163687706, -0.1396147906780243, 0.1390404403209686, -0.09133744239807129, 0.09166537225246429, 0.0001963763788808137, -0.09166603535413742, 8.288764661301684e-7, -0.004637871868908405, 0.06480434536933899, -0.00353772914968431, 0.006234693340957165, 0.003540892153978348, 1.338792912974895e-6, -0.00463970610871911, 6.146391910988314e-7, 0.009138395078480244, -0.009754939004778862, -0.003842708189040422, 0.02445223368704319, 0.003838051343336701, -8.204373216358363e-7, 0.00913792010396719, 0.02062354795634747, -0.006872836034744978, 3.773962134800968e-6, 0.00123650161549449, -0.0002146030456060544, -0.007708541583269835, -0.008079518564045429, 0.007706867530941963, -9.221435561812541e-7, 0.001229651621542871, -0.006774442736059427, 0.006872935686260462, 0.004428821615874767, 0.006368701346218586, 2.422495981591055e-6, -0.006928037852048874, -0.008635217323899269, -0.002101030666381121, -0.001656155334785581, 0.002104758284986019, 2.968164665162476e-7, -0.006923729553818703, 0.003728135721758008, -0.006365177221596241, 1.876081114460249e-6, 0.003653967054560781, 0.005460156127810478, -0.001610215986147523, -1.194551714434056e-6, 0.001109344186261296, 0.006166077684611082, 0.003956143744289875, -0.003562397556379437, -0.003957416396588087, 1.580216576257953e-6, 0.001112123369239271, -0.004310747142881155, 0.001606481149792671, -1.882840024336474e-6, 0.003659181529656053 ], [ 0.1903187185525894, 0.1390408277511597, -0.1396111398935318, -0.1390382647514343, -0.09134466201066971, -0.09166941791772842, 0.000195418469957076, 0.09165694564580917, 2.592274313428788e-6, 0.004647223278880119, 0.06480830907821655, 0.003542357357218862, 0.006230214145034552, -0.003532330971211195, 4.552790869638557e-6, 0.004639362450689077, -2.25393523578532e-6, -0.009145386517047882, -0.009755173698067665, 0.003840406890958548, 0.02445471473038197, -0.003838030621409416, -5.078472895547748e-6, -0.009137861430644989, 0.0206233374774456, 0.006874480750411749, 5.491300271387445e-6, -0.001229588408023119, -0.0002159027353627607, 0.007704206742346287, -0.008078611455857754, -0.007711007725447416, -8.744179922359763e-7, -0.00123486144002527, -0.006774248089641333, -0.006878888234496117, 0.004422471858561039, -0.006366417277604342, -4.865235041506821e-6, 0.006922993343323469, -0.008631465956568718, 0.002106365747749805, -0.0016552759334445, -0.002101109130308032, 2.794319470922346e-6, 0.006928607355803251, 0.003729605581611395, 0.006370379589498043, 4.61463332612766e-6, -0.003652092069387436, 0.005458016879856586, 0.001609557890333235, 2.943889967355062e-6, -0.001108825556002557, 0.006163111422210932, -0.0039570527151227, -0.003563358681276441, 0.003954393789172173, -1.667374476710393e-6, -0.00111233931966126, -0.004310606047511101, -0.001611376996152103, -7.269812613230897e-6, -0.003654631320387125 ], [ 0.1903252005577087, -0.1390447914600372, -0.1396203935146332, -0.1390368193387985, 0.09134635329246521, 0.09166131168603897, 0.0002061007398879156, 0.09166301786899567, -6.086380381020717e-6, -0.004644419532269239, -0.06480132788419724, -0.003535301424562931, 0.006219398230314255, -0.003540849778801203, -3.31281603394018e-6, 0.004646716639399529, 3.434962991377688e-6, 0.009138556197285652, 0.00975639745593071, -0.003838134463876486, 0.02446427009999752, -0.003839238313958049, 4.891898697678698e-6, -0.009134018793702126, 0.02061770856380463, -0.006875107530504465, -8.132914217640064e-7, 0.001229123445227742, 0.0002126990293618292, -0.007705053314566612, -0.008089950308203697, -0.007704153191298246, 7.818258609404438e-7, -0.001232752809301019, -0.006778879556804895, -0.006867388729006052, -0.004429827909916639, 0.006371753755956888, -3.087917775701499e-6, -0.006922392174601555, 0.008627898059785366, -0.002105845371261239, -0.001642975490540266, -0.002103289822116494, -1.137669528361585e-6, 0.006924272514879704, 0.003728291485458612, 0.006369542796164751, -2.486666517143021e-6, 0.003653926542028785, -0.005463678389787674, -0.00160497275646776, -8.391010055674997e-7, 0.001112055033445358, -0.006162986624985933, 0.003955352585762739, -0.003571745939552784, 0.003954457119107246, 6.101179224060616e-7, -0.001112817088142037, -0.004308595322072506, -0.00161299598403275, 5.468999006552622e-6, -0.003659440670162439 ] ], "Routing": [ 5, 6, 7, 8, 1, 2, 3, 4 ] } } ././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/SimpleDecoder/Source/Presets/CUBE.jsonIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/SimpleDecoder/Source/Presets/CUBE.js0000664002537200253720000015461315257173642031321 0ustar zmoelnigzmoelnig{ "Name": "All-Round Ambisonic decoder (AllRAD) and loudspeaker layout", "Description": "This configuration file was created with the IEM AllRADecoder v0.9.4 plug-in. 13 Feb 2023 11:50:24am", "Decoder": { "Name": "IEM Cube", "Description": "A 7th order Ambisonics decoder for the IEM CUBE.", "ExpectedInputNormalization": "n3d", "Weights": "maxrE", "WeightsAlreadyApplied": false, "Matrix": [ [ 0.0400921106338501, -0.0004649758047889918, -0.01447265595197678, 0.06133442744612694, -0.0009151397971436381, 0.00008455116039840505, -0.02142279222607613, -0.02233448624610901, 0.06028260290622711, -0.001274486654438078, 0.000132141140056774, 0.0001558232761453837, 0.00667652441188693, -0.01762046664953232, -0.02114018797874451, 0.05628004297614098, -0.001501052989624441, 0.0001392372796544805, 0.0001872075808933005, 0.00007051341526675969, 0.007809330709278584, 0.0005337391048669815, -0.009787545539438725, -0.01879663951694965, 0.05034399032592773, -0.001574856112711132, 0.0001183144777314737, 0.0001443946093786508, 0.0002040963881881908, -0.00006187313556438312, 0.00321149779483676, 0.008873360231518745, -0.00509501900523901, -0.004441661760210991, -0.01605690643191338, 0.04315893724560738, -0.001496005686931312, 0.0000849607095005922, 0.00006141328776720911, 0.0003386398311704397, -0.00007821428880561143, -0.00009172206773655489, -0.004044767469167709, 0.005274512805044651, 0.007616837974637747, -0.008236916735768318, -0.0007863491191528738, -0.01330046728253365, 0.03531250730156898, -0.001282560522668064, 0.00005312886423780583, -0.00003161502172588371, 0.0004368892405182123, -0.00006572363781742752, -0.0001469678245484829, -0.00001483481264585862, -0.003767643822357059, -0.002409847220405936, 0.004345973022282124, 0.00659477012231946, -0.009509011171758175, 0.001554728602059186, -0.01073468942195177, 0.02733565494418144 ], [ 0.0342964231967926, -0.02107610553503036, -0.01776197925209999, 0.04735217988491058, -0.03769038245081902, 0.01178374607115984, -0.01619192585349083, -0.02646947279572487, 0.0339517816901207, -0.04517742991447449, 0.02136244438588619, 0.004786686506122351, 0.01252135634422302, -0.01075620763003826, -0.0192366112023592, 0.01469509303569794, -0.0427236296236515, 0.02516904659569263, 0.004177156370133162, -0.003779798746109009, 0.005534927360713482, 0.008487440645694733, -0.003765008179470897, -0.00817839615046978, -0.004473246168345213, -0.03253687918186188, 0.02286173962056637, 0.001852513407357037, -0.002432154724374413, -0.003220864338800311, -0.003015622263774276, 0.007236853707581758, 0.002186677185818553, -0.0006046468042768538, 0.002404545433819294, -0.01876596920192242, -0.01865138113498688, 0.01632423512637615, -0.0002211539976997301, 0.0008998116245493293, -0.006279496476054192, 0.001107018440961838, -0.005054538138210773, -0.002483401913195848, 0.005655615124851465, -0.0002970847417600453, -0.000024997498258017, 0.009430301375687122, -0.02564744278788567, -0.005365585442632437, 0.008493680506944656, -0.001212744973599911, 0.003736914368346334, -0.008211578242480755, 0.001667046803049743, 0.002212007995694876, 0.001004830119200051, -0.004969503730535507, -0.001497038756497204, 0.002669364446774125, 0.0003867200866807252, -0.0007006794330663979, 0.01170474290847778, -0.02519514597952366 ], [ 0.04065708816051483, -0.04603457823395729, -0.0149405337870121, 0.04173549637198448, -0.06068290024995804, 0.01725944690406322, -0.02162355184555054, -0.01536666043102741, -0.005942484829574823, -0.03387755528092384, 0.02172384597361088, 0.01308409497141838, 0.007093003019690514, -0.01194263249635696, 0.002591335447505116, -0.04557711258530617, 0.009800425730645657, 0.01100516971200705, 0.009756552986800671, -0.00082530512008816, 0.007882255129516125, 0.0005019389209337533, 0.0008538413094356656, 0.01597732864320278, -0.04967192187905312, 0.03701648488640785, -0.004043011460453272, 0.002724191173911095, 0.004840852692723274, -0.006701627746224403, 0.00298961834050715, 0.006054622586816549, 0.0001532086316728964, 0.003474733792245388, 0.01596337743103504, -0.02228324115276337, 0.03363923728466034, -0.01202586758881807, -0.00005013465488445945, 0.005145000293850899, -0.007764534093439579, -0.003629356855526567, -0.004190721083432436, 0.003487227018922567, -0.0008543009753338993, 0.006259799003601074, 0.0007601204561069608, 0.006109337788075209, 0.01012920495122671, 0.01156950835138559, -0.009926063939929008, 0.001380632515065372, -0.001426386996172369, -0.003881702898070216, -0.004164223559200764, 0.001987543189898133, -0.00364485033787787, -0.001702170819044113, -0.0001683160662651062, -0.005562486592680216, 0.009347911924123764, -0.0007561974343843758, -0.003994694445282221, 0.0243497509509325 ], [ 0.03868172690272331, -0.05592372640967369, -0.02001488395035267, 0.01621832139790058, -0.03020409494638443, 0.03127902373671532, -0.01824599504470825, -0.008789833635091782, -0.04754282161593437, 0.0340556912124157, 0.01651853322982788, 0.0126521959900856, 0.01406484935432673, -0.003800127655267715, 0.02716118842363358, -0.03891603276133537, 0.04130231216549873, -0.01953708566725254, 0.003573594382032752, -0.00998733751475811, 0.006232182960957289, 0.002642079954966903, 0.0051430594176054, 0.02083516679704189, 0.01892240345478058, -0.005150380078703165, -0.02116259932518005, -0.001168606569990516, -0.001482416992075741, -0.008528882637619972, -0.003337668254971504, 0.002541874535381794, -0.003177848644554615, 0.001877924310974777, -0.01111659500747919, 0.03784719482064247, -0.03019599057734013, 0.003987324889749289, -0.00006237863271962851, -0.000361187441740185, -0.005072973668575287, 0.002915265271440148, -0.005695758853107691, -0.0006114325951784849, -0.007906748913228512, 0.001343158888630569, 0.0004116399213671684, -0.01812397129833698, 0.005088566336780787, -0.01077246759086847, 0.01308810245245695, -0.0005417107604444027, -0.00418078014627099, 0.006231715902686119, 0.0009092795662581921, 0.005854085087776184, 0.001101893256418407, -0.001680649584159255, 0.002239867812022567, -0.007043378427624702, -0.001131851109676063, 0.001181589090265334, -0.000596799305640161, -0.02059685625135899 ], [ 0.05360725149512291, -0.07859019190073013, -0.02188160829246044, -0.01764381490647793, 0.03210865706205368, 0.03267200291156769, -0.02760136313736439, 0.009410236030817032, -0.06856434047222137, 0.05220147222280502, -0.0171909537166357, 0.02129197493195534, 0.01200048625469208, 0.004135215654969215, 0.0263910461217165, 0.03974507749080658, -0.03973206132650375, -0.01672441512346268, -0.003777400590479374, -0.004025108180940151, 0.009943107143044472, -0.002718302188441157, 0.01058670040220022, -0.02065645717084408, 0.03440065309405327, -0.01904647052288055, 0.01949615590274334, -0.0043368861079216, 0.001267799292691052, -0.0116523914039135, 0.001775852520950139, -0.002694260329008102, 0.004399876110255718, -0.001850032480433583, -0.007180697750300169, -0.03343243524432182, 0.02358265593647957, 0.000183564581675455, -0.00008996493852464482, -0.008280499838292599, 0.005206711124628782, -0.004129035864025354, -0.006216513458639383, 0.0005422745598480105, -0.009275522083044052, -0.001811117050237954, -0.001128136995248497, 0.01499559171497822, -0.008430219255387783, 0.003008639439940453, -0.009214076213538647, -0.0002101412828778848, 0.004558441694825888, 0.006159028504043818, -0.000768145255278796, 0.004522841889411211, -0.003264413215219975, 0.001709974836558104, -0.003925658762454987, 0.006862947717308998, -0.008540499024093151, -0.001325939781963825, -0.003246479667723179, 0.01323559693992138 ], [ 0.06033581122756004, -0.05874833464622498, -0.02607163414359093, -0.06793012470006943, 0.08160395920276642, 0.02605104073882103, -0.03050238080322742, 0.03075615130364895, 0.01176700554788113, -0.05761991441249847, -0.03541114553809166, 0.01544712390750647, 0.01523416023701429, 0.01763940416276455, -0.005997851956635714, 0.03725640475749969, 0.01400372479110956, 0.02396433241665363, -0.01163925882428885, -0.004321527201682329, 0.01099928375333548, -0.005550025030970573, -0.001427435432560742, -0.01402874942868948, -0.04966205358505249, 0.01508950628340244, -0.00627949321642518, 0.003700492205098271, -0.00267090811394155, -0.008919114246964455, 0.0006249365396797657, -0.01030099485069513, 0.0002326184621779248, -0.002704382641240954, 0.0173046812415123, 0.03070145845413208, -0.01755630970001221, -0.003198179882019758, 0.00002694220711418893, 0.006184149533510208, 0.01190141029655933, -0.002091648988425732, -0.007569880224764347, -0.001952432096004486, 0.001836291747167706, -0.004843107890337706, 0.0005916946101933718, -0.009178237058222294, -0.006560918875038624, 0.005935604218393564, 0.002444987185299397, 0.0005137053085491061, -0.001931098406203091, -0.008326086215674877, 0.002714887028560042, 0.004031463526189327, -0.002760314382612705, 0.004837954416871071, -0.0001193126227008179, 0.005025238264352083, 0.009250503033399582, 0.001184109481982887, 0.001672807731665671, -0.00331266107968986 ], [ 0.0638883113861084, -0.002522807801142335, -0.02730552293360233, -0.09469877928495407, 0.004447712562978268, 0.001921999617479742, -0.0323159284889698, 0.04190260544419289, 0.08577811717987061, -0.005237940233200788, -0.003616660600528121, 0.0003996653249487281, 0.01574189029633999, 0.02468938939273357, -0.03658609092235565, -0.06969219446182251, 0.0048050656914711, 0.004467743914574385, -0.000204379262868315, -0.0008773112203925848, 0.01149505283683538, -0.006858958397060633, -0.01213837787508965, 0.02723030000925064, 0.05043385550379753, -0.003418592968955636, -0.004314281977713108, -0.00008174937829608098, 0.0009995092405006289, -0.0004044169909320772, 0.0009707297431305051, -0.01405518408864737, -0.003259849268943071, 0.004578812047839165, -0.01684772223234177, -0.03140576928853989, 0.001579590723849833, 0.003342389594763517, 0.0002286278322571889, -0.0007092308951541781, 0.000945485255215317, 0.0004812858533114195, -0.007742642425000668, -0.003324433695524931, 0.01215132512152195, 0.008481393568217754, -0.0004601666587404907, 0.007657517213374376, 0.01523350272327662, 0.0001559334486955777, -0.001953627681359649, -0.0001836063311202452, 0.0003064257907681167, -0.001409482676535845, -0.0007634848007000983, 0.0004256729444023222, -0.002995523856952786, 0.006218802183866501, 0.003029624233022332, -0.009440922178328037, -0.009733675047755241, -0.00132844049949199, -0.001033663051202893, -0.003476094454526901 ], [ 0.06377174705266953, 0.05931947752833366, -0.02734849601984024, -0.07358040660619736, -0.08375293016433716, -0.02523521520197392, -0.03214968368411064, 0.03360660374164581, 0.01795360632240772, 0.06200052052736282, 0.03533487021923065, -0.0157442819327116, 0.0157819539308548, 0.0187640693038702, -0.01072999183088541, 0.03176231309771538, -0.01998839154839516, -0.02650430239737034, 0.01187502220273018, 0.003422392532229424, 0.01139780320227146, -0.006232398096472025, -0.00172084360383451, -0.008704156614840031, -0.04636263102293015, -0.009154106490314007, 0.01126158516854048, -0.003594930982217193, 0.003426518524065614, 0.008723102509975433, 0.0008096704841591418, -0.01086042262613773, 0.001410734141245484, -0.00277975364588201, 0.01388533692806959, 0.03015506081283092, 0.0131740802899003, -0.001982668647542596, -0.0003639102797023952, -0.006254884880036116, -0.01172470860183239, 0.00273272767663002, -0.007624309975653887, -0.001747063943184912, 0.003037488553673029, -0.005925519391894341, 0.0006258739158511162, -0.008875239640474319, -0.007935900241136551, -0.003464654088020325, 0.0008072789059951901, -0.0002022553817369044, 0.001747253118082881, 0.009001508355140686, -0.003070232225582004, -0.003503223415464163, -0.002846986521035433, 0.005051090382039547, -0.001066171680577099, 0.003286442253738642, 0.009679533541202545, 0.001263412064872682, 0.003343899501487613, -0.001533167320303619 ], [ 0.05857080966234207, 0.08523166179656982, -0.02383607439696789, -0.01964508928358555, -0.03497123718261719, -0.03515806421637535, -0.02999783121049404, 0.01099847909063101, -0.07279255986213684, -0.05349165201187134, 0.01975632272660732, -0.02280895411968231, 0.01299282629042864, 0.004407824482768774, 0.02725266478955746, 0.04170988872647285, 0.03941990807652473, 0.01569808833301067, 0.003805153537541628, 0.004094566218554974, 0.01053064037114382, -0.003451280063018203, 0.01104956213384867, -0.02294184267520905, 0.03356544673442841, 0.01761075668036938, -0.02046162262558937, 0.004380890168249607, -0.002023671288043261, 0.01217500492930412, 0.001949647441506386, -0.002986883977428079, 0.005180825013667345, -0.001679459121078253, -0.005001368466764688, -0.03051329590380192, -0.01886310242116451, 0.001939363428391516, 0.0001859830954344943, 0.009244109503924847, -0.005834530107676983, 0.004422067198902369, -0.006462727673351765, 0.0009479611762799323, -0.00936395488679409, -0.001290855230763555, -0.001080066431313753, 0.01437104493379593, -0.007779037579894066, -0.003734061494469643, 0.007548140361905098, 0.0003077113069593906, -0.004157561343163252, -0.005696957930922508, 0.001363591756671667, -0.004453228786587715, -0.003288572654128075, 0.002046831883490086, -0.004250225611031055, 0.007587614934891462, -0.009206480346620083, -0.001136707258410752, -0.004315278958529234, 0.008181641809642315 ], [ 0.04119852185249329, 0.05892916768789291, -0.02101467922329903, 0.01903056725859642, 0.03492486849427223, -0.03242522850632668, -0.0195431187748909, -0.0100824786350131, -0.04824317246675491, -0.03175269067287445, -0.01860299147665501, -0.01348249427974224, 0.01457453053444624, -0.004527440760284662, 0.02714103832840919, -0.04382402449846268, -0.04465126246213913, 0.01812735758721828, -0.004242739174515009, 0.01002488937228918, 0.006700060795992613, 0.00288495933637023, 0.005295144394040108, 0.02276026457548141, 0.0140722319483757, -0.0009033451788127422, 0.02209437265992165, 0.001058403635397553, 0.001334108412265778, 0.008956319652497768, -0.003198466962203383, 0.002973251976072788, -0.002905693603679538, 0.00222784886136651, -0.008769641630351543, 0.03851644322276115, 0.02804440818727016, -0.001556868315674365, 0.0001470076967962086, 0.0003973987186327577, 0.005788930226117373, -0.00264554307796061, -0.005966356955468655, -0.0005260347970761359, -0.007926395162940025, 0.001967699266970158, 0.00046712756738998, -0.01772490330040455, 0.01066854316741228, 0.01448914222419262, -0.01162959076464176, 0.0004103602550458163, 0.004958969075232744, -0.005734516773372889, -0.0007466941606253386, -0.005974228959530592, 0.000889916846062988, -0.001907422090880573, 0.002022594213485718, -0.007761122193187475, -0.000570580072235316, 0.001171414507552981, -0.002267721341922879, -0.0164255928248167 ], [ 0.03998342528939247, 0.04383183643221855, -0.0144846560433507, 0.04264950007200241, 0.06011423468589783, -0.01619805581867695, -0.02128399536013603, -0.01540724746882915, -0.001612151274457574, 0.03814445436000824, -0.02112281322479248, -0.0124380411580205, 0.006716351490467787, -0.01221231371164322, 0.001130687538534403, -0.04127835109829903, -0.002589700277894735, -0.01210586633533239, -0.009614097885787487, 0.0006114536081440747, 0.007678506895899773, 0.0002716518647503108, 0.0001174430799437687, 0.01435644179582596, -0.05029944330453873, -0.03246573731303215, 0.00188297510612756, -0.003032553009688854, -0.005009931046515703, 0.006232652347534895, 0.003083009738475084, 0.006057289429008961, -0.0002790053549688309, 0.003035268513485789, 0.01587438955903053, -0.02863731235265732, -0.0354582704603672, 0.01059840898960829, -0.0001267850311705843, -0.005934993270784616, 0.007444207090884447, 0.003495366778224707, -0.003920071758329868, 0.003677006345242262, -0.0002866915601771325, 0.005647765938192606, 0.0006558229215443134, 0.007794719189405441, 0.00257106265053153, -0.01793521270155907, 0.01033344399183989, -0.001349304569885135, -0.00007567561260657385, 0.00422132620587945, 0.004159634932875633, -0.001690534176304936, -0.003604243509471416, -0.001533393282443285, 0.0002301093481946737, -0.004870741162449121, 0.009519767016172409, -0.001016253489069641, -0.001894288579933345, 0.02106245048344135 ], [ 0.03212358057498932, 0.01869821734726429, -0.016640555113554, 0.04489235207438469, 0.03395848721265793, -0.01048643048852682, -0.01516707707196474, -0.02510136924684048, 0.03369604796171188, 0.04185178503394127, -0.01932729780673981, -0.004229992162436247, 0.01174193434417248, -0.01019573211669922, -0.01908177696168423, 0.01705110818147659, 0.04137633740901947, -0.02345203422009945, -0.003725746646523476, 0.003383103292435408, 0.005176013335585594, 0.008058964274823666, -0.003744894871488214, -0.009434276260435581, -0.0003242456004954875, 0.03385041654109955, -0.02232551760971546, -0.001662034424953163, 0.002249349374324083, 0.002845783717930317, -0.002830222947522998, 0.006858459208160639, 0.002171326661482453, -0.000731648993678391, 0.0003305081627331674, -0.0144199077039957, 0.02217271737754345, -0.01718314550817013, 0.0002741964417509735, -0.000743127369787544, 0.005650361999869347, -0.001006886013783514, -0.004742658697068691, -0.002367700450122356, 0.005617256741970778, -0.0003656664921436459, -0.00006480396405095235, 0.007535033859312534, -0.02273011580109596, 0.009781152009963989, -0.01024379674345255, 0.001311609870754182, -0.003500295570120215, 0.007610421162098646, -0.001564076985232532, -0.001969014061614871, 0.00096485874382779, -0.004720051772892475, -0.0014939378015697, 0.003096785861998796, -0.00004306623668526299, -0.0006344369612634182, 0.01084111258387566, -0.02466424182057381 ], [ 0.04289086163043976, -0.02623757161200047, 0.03724852949380875, 0.05238829925656319, -0.03759526461362839, -0.02899054624140263, -0.005900333635509014, 0.05416476354002953, 0.02957083471119404, -0.0337253175675869, -0.04478009045124054, -0.01059478428214788, -0.03249318897724152, 0.01268790476024151, 0.03193336352705956, 0.008446032181382179, -0.02219550870358944, -0.04076389595866203, -0.02259254828095436, 0.007480794563889503, -0.0218849740922451, -0.02349207550287247, 0.009801973588764668, 0.007692575454711914, -0.003610028885304928, -0.0105994688346982, -0.02594178356230259, -0.02164338901638985, 0.002683590166270733, 0.01039863284677267, 0.00136435788590461, -0.02337019145488739, -0.01162310875952244, -0.0009975397260859609, -0.005870029330253601, -0.006583455018699169, -0.003104091621935368, -0.01132938638329506, -0.0121534401550889, 0.0006510557723231614, 0.009334915317595005, 0.004152059555053711, 0.009206713177263737, -0.003880640491843224, -0.01322420034557581, -0.008671646006405354, -0.006357369944453239, -0.007847041822969913, -0.004189013503491879, -0.0002704318321775645, -0.002725197933614254, -0.003364530857652426, 0.002792745130136609, 0.0062412372790277, 0.003258663695305586, 0.0008868140866979957, 0.002801487455144525, 0.005274686496704817, -0.002500732662156224, -0.008397107012569904, -0.005787444766610861, -0.004308064468204975, -0.003633542452007532, -0.0004984693368896842 ], [ 0.03467783704400063, -0.04805746674537659, 0.02591678313910961, 0.01587888970971107, -0.02619772404432297, -0.04447304829955101, -0.01353526301681995, 0.01476225350052118, -0.03535037860274315, 0.01949580200016499, -0.02772052772343159, -0.0003527753578964621, -0.03192726150155067, 0.00001615425935597159, -0.03700121492147446, -0.02747626602649689, 0.02147665992379189, 0.02188304997980595, -0.007067941594868898, 0.0317632369697094, -0.01360577344894409, -0.01104742847383022, -0.009508619084954262, -0.03155797347426414, 0.006791805382817984, -0.00005514924123417586, 0.02588679268956184, 0.008909726515412331, 0.01258324272930622, 0.02278895117342472, 0.01184002682566643, -0.008193218149244785, 0.0153688658028841, -0.01298579107969999, 0.007697996683418751, 0.01248371414840221, -0.004539967514574528, 0.0002699531323742121, 0.01331230811774731, -0.003983615897595882, 0.01336317416280508, -0.003594628535211086, 0.01569772511720657, 0.00124276103451848, 0.01537587027996778, 0.007472281809896231, 0.003805990098044276, 0.01530420128256083, 0.00127677817363292, 0.0003687524585984647, -0.005411278922110796, 0.0002238628803752363, -0.001547412248328328, -0.005394404754042625, 0.00204862654209137, -0.01336235832422972, 0.003117255866527557, 0.005401243921369314, 0.001709586242213845, 0.01153753325343132, 0.0004947851994074881, 0.008838317357003689, 0.001586522092111409, 0.0002390537556493655 ], [ 0.03986787050962448, -0.04816174507141113, 0.03482485935091972, -0.02602669410407543, 0.03748776391148567, -0.05057234689593315, -0.005454362835735083, -0.02837776578962803, -0.02537079527974129, 0.004117676988244057, 0.04435797780752182, -0.01265353430062532, -0.03109019249677658, -0.009517168626189232, -0.02850175462663174, 0.03346513956785202, -0.02147095464169979, 0.004040754400193691, 0.02157235145568848, 0.02213591337203979, -0.0217405054718256, 0.008691659197211266, -0.01022744737565517, 0.04053935036063194, -0.00784187950193882, 0.01035816501826048, -0.02545762993395329, -0.0005980432033538818, -0.004272199235856533, 0.02378054149448872, 0.0009795710211619735, 0.01112406607717276, 0.009397760033607483, 0.02137746289372444, -0.009668066166341305, -0.009417006745934486, 0.001703388406895101, 0.01132721826434135, -0.012316576205194, -0.005935232155025005, -0.01087003480643034, 0.005341447424143553, 0.01009055785834789, 0.003991803620010614, 0.01289494056254625, -0.001346203032881021, -0.006400419864803553, -0.01044794451445341, 0.007337628398090601, -0.003091635415330529, 0.001715563703328371, 0.004563572350889444, 0.002583716297522187, -0.007237282581627369, -0.003933371044695377, -0.005568206775933504, 0.004523755982518196, 0.00006249493162613362, 0.00406732689589262, -0.007354205939918756, -0.003431145800277591, -0.003576639806851745, 0.006509474013000727, -0.001138546853326261 ], [ 0.03182400763034821, -0.01586386002600193, 0.02416213043034077, -0.04375974088907242, 0.02649985067546368, -0.01442114636301994, -0.01195355132222176, -0.04138116165995598, 0.03131433203816414, -0.02833416499197483, 0.02741854079067707, 0.0005607373896054924, -0.02968784235417843, -0.001563030760735273, 0.03404860198497772, -0.01575576514005661, 0.02287662401795387, -0.03181172162294388, 0.005973560269922018, 0.01126163080334663, -0.01361092086881399, 0.02912458218634129, 0.01048633642494678, -0.01924113556742668, 0.003209116635844111, -0.0142141729593277, 0.02690855972468853, -0.01192611828446388, -0.01345461327582598, 0.007702126167714596, 0.0104846153408289, 0.02266220189630985, -0.01303996052592993, -0.01005530636757612, 0.005144892726093531, 0.003447729628533125, 0.006356221623718739, -0.01689937897026539, 0.01278821285814047, 0.00885283574461937, -0.01302191894501448, -0.001960278023034334, 0.01550483237951994, -0.001910965540446341, -0.01550408266484737, 0.001525575877167284, 0.004975136835128069, 0.002961913822218776, -0.004637130070477724, -0.001510550733655691, 0.007201986387372017, -0.008910409174859524, -0.002923245308920741, 0.01177002675831318, -0.000886903319042176, -0.005581212230026722, 0.004131393507122993, -0.01316526997834444, -0.003738986561074853, 0.005502439569681883, 0.003162839449942112, -0.0006037915009073913, -0.004395957570523024, 0.002711812499910593 ], [ 0.04158375784754753, 0.0245619360357523, 0.03698739409446716, -0.05064587667584419, -0.0348806232213974, 0.02848155796527863, -0.004050817806273699, -0.05326847732067108, 0.02961624786257744, 0.03175800666213036, -0.04341639205813408, 0.01252598315477371, -0.03071864880621433, -0.01399222109466791, 0.03167177364230156, -0.01057704910635948, -0.02224604226648808, 0.03962982818484306, -0.0246381051838398, -0.005203527398407459, -0.02226497977972031, 0.02156641334295273, 0.009158198721706867, -0.008841083385050297, -0.0006613217992708087, 0.01250417809933424, -0.02622523345053196, 0.02275586873292923, -0.0003376398526597768, -0.01021137833595276, -0.0003142100758850574, 0.02292930334806442, -0.01222770567983389, 0.002543285489082336, -0.004009589552879333, 0.004531471990048885, -0.005573832429945469, 0.01303263939917088, -0.01248248387128115, 0.001091215410269797, 0.008705148473381996, -0.005514100193977356, 0.008364776149392128, 0.004723495803773403, -0.01332515850663185, 0.01121648773550987, -0.007877453230321407, 0.006675356533378363, -0.003984833136200905, 0.001872673048637807, -0.00474427780136466, 0.003277960233390331, 0.002878065686672926, -0.006131394300609827, 0.004685192368924618, -0.001558674965053797, 0.003117149695754051, -0.004778776317834854, -0.002170603023841977, 0.0092010498046875, -0.008650287054479122, 0.005539546720683575, -0.00395894143730402, 0.001877719070762396 ], [ 0.03215426951646805, 0.04298294708132744, 0.02506865933537483, -0.01789666526019573, -0.02931603975594044, 0.04198971763253212, -0.01079791504889727, -0.01593821495771408, -0.02804246917366982, -0.01023420877754688, -0.02989226765930653, 0.004172463901340961, -0.02942979149520397, 0.001078153378330171, -0.03257418796420097, 0.02998074144124985, 0.02213306538760662, -0.01547399256378412, -0.005982223898172379, -0.0268718060106039, -0.01487092766910791, 0.01257938705384731, -0.01343930326402187, 0.03368159383535385, -0.002948368666693568, -0.008318896405398846, 0.0269066970795393, -0.01247306820005178, 0.01483689621090889, -0.02324487641453743, 0.008659060113132, 0.007928334176540375, 0.008812825195491314, 0.01273824740201235, 0.0002829151053447276, -0.01134237367659807, -0.002795565873384476, -0.007141658570617437, 0.0140274902805686, -0.003744504880160093, 0.0134784234687686, -0.0008425145642831922, 0.01472835801541805, -0.002704396843910217, 0.01471614465117455, -0.009085068479180336, 0.0063670938834548, -0.01500397268682718, 0.007163939997553825, 0.003199423896148801, -0.004591755568981171, 0.001086150761693716, -0.001627125893719494, 0.003654757980257273, 0.0001693631638772786, 0.01111394725739956, 0.004908347502350807, -0.005839727818965912, 0.006466999650001526, -0.01207190006971359, 0.008074800483882427, -0.01008199527859688, 0.006729476153850555, -0.001142363296821713 ], [ 0.03511973097920418, 0.04780225455760956, 0.02643201500177383, 0.0180997084826231, 0.02927521057426929, 0.04447335749864578, -0.0133143151178956, 0.01704424247145653, -0.03320597112178802, -0.01587298326194286, 0.03136142715811729, 0.0009125583455897868, -0.03208169713616371, 0.0004744152538478374, -0.03481702879071236, -0.02970411814749241, -0.02202598936855793, -0.01762066595256329, 0.00875539518892765, -0.03101205453276634, -0.01401236467063427, -0.01222759112715721, -0.009192137978971004, -0.03456192463636398, 0.00306079420261085, -0.002471843035891652, -0.0269660409539938, -0.007035586982965469, -0.01320948358625174, -0.02254626899957657, 0.01138715166598558, -0.00941021554172039, 0.01393347699195147, -0.01507089473307133, 0.002950611291453242, 0.01171670015901327, 0.003494893200695515, -0.003692451398819685, -0.01463683228939772, 0.003026894526556134, -0.01469456125050783, 0.003081621369346976, 0.0154271274805069, 0.0009605410741642118, 0.01394980028271675, 0.006924115121364594, 0.0009633396985009313, 0.01470768917351961, 0.002106337575241923, -0.0008284589857794344, 0.004431779496371746, -0.002744849771261215, 0.0004146197170484811, 0.003659693291410804, -0.002760211238637567, 0.01256211381405592, 0.00319076026789844, 0.005710604600608349, 0.0015194226289168, 0.01185976527631283, 0.000274754362180829, 0.00911021139472723, 0.002883519046008587, 0.0006380248232744634 ], [ 0.04124921560287476, 0.02322817035019398, 0.03575244545936584, 0.05163040012121201, 0.03425799310207367, 0.0256817601621151, -0.00591109786182642, 0.05349626392126083, 0.03172514960169792, 0.03227860480546951, 0.04096727445721626, 0.009405293501913548, -0.03161437064409256, 0.01259873807430267, 0.03484049066901207, 0.0122050866484642, 0.02292068302631378, 0.03938479721546173, 0.02095174975693226, -0.006628003902733326, -0.02127172611653805, -0.02339161932468414, 0.01172061450779438, 0.01259431522339582, -0.0003288098378106952, 0.01235149148851633, 0.02726034447550774, 0.0215956661850214, -0.002075288444757462, -0.009272986091673374, 0.001514307572506368, -0.02358051761984825, -0.01141120865941048, 0.002114350907504559, -0.001849429565481842, -0.005024305079132318, 0.004501448944211006, 0.01358474139124155, 0.01369236502796412, 0.0004205247678328305, -0.008387734182178974, -0.00378061062656343, 0.009414555504918098, -0.004181916359812021, -0.01399476174265146, -0.008205422200262547, -0.004246926866471767, -0.006253041792660952, -0.004303560592234135, 0.0005653089610859752, 0.004079068079590797, 0.004824345465749502, -0.001462802640162408, -0.005305355414748192, -0.003153100144118071, -0.0008627732167951763, 0.003171906573697925, 0.005410648416727781, -0.003178449580445886, -0.009100507013499737, -0.006070619449019432, -0.004090069327503443, -0.004069122485816479, -0.001407040865160525 ], [ 0.03243759647011757, -0.0006730824243277311, 0.04679118096828461, 0.02576190605759621, -0.0005309366970323026, -0.001238754135556519, 0.04050477221608162, 0.04550430178642273, 0.01266632694751024, -0.0003089104138780385, -0.001070026773959398, -0.001539439312182367, 0.02297140657901764, 0.05258812010288239, 0.02481456100940704, 0.006134278606623411, -0.0001720560976536945, -0.0006389325717464089, -0.001445822766982019, -0.001500239945016801, 0.003966158721596003, 0.04528932273387909, 0.0319657064974308, 0.01281083654612303, 0.002933138748630881, -0.00008427481225226074, -0.0003638388880062848, -0.000854315294418484, -0.001501601771451533, -0.001201721373945475, -0.009017445147037506, 0.0291623417288065, 0.03055468574166298, 0.01744801364839077, 0.006465739104896784, 0.00126811268273741, -0.00002277626481372863, -0.0001836266746977344, -0.0004820054164156318, -0.0008100466802716255, -0.001253176480531693, -0.0008042973931878805, -0.01350347045809031, 0.01267109904438257, 0.0217981468886137, 0.01722489111125469, 0.00926143117249012, 0.002929342212155461, 0.0003992195415776223, 0.00001478043031966081, -0.00004561081004794687, -0.000247647607466206, -0.0004133611510042101, -0.0004958760691806674, -0.0008578035049140453, -0.0004509516584221274, -0.01175164338201284, 0.00203617149963975, 0.01054374035447836, 0.01187279913574457, 0.009515559300780296, 0.004391471389681101, 0.0009464834001846611, -0.00001673472252150532 ], [ 0.041213508695364, -0.03310692682862282, 0.05773992091417313, 0.005715538747608662, -0.005552811548113823, -0.05703411996364594, 0.0462062656879425, 0.00915385689586401, -0.01334547530859709, 0.003575626527890563, -0.01026145555078983, -0.06293129175901413, 0.0205884613096714, 0.008597122505307198, -0.02583595924079418, -0.002416717819869518, -0.000252073397859931, 0.007365405559539795, -0.01187591068446636, -0.04968048632144928, -0.004334892146289349, 0.00432377215474844, -0.03266197070479393, -0.004919991362839937, 0.000443348428234458, -0.00008667593647260219, -0.0005967823672108352, 0.009815228171646595, -0.009086016565561295, -0.02639413252472878, -0.01811661012470722, -0.001154979574494064, -0.03028744272887707, -0.006412569433450699, 0.0008341183420270681, -0.00119622191414237, 0.0009210146963596344, -0.0001109396471292712, -0.0009737487998791039, 0.00932653434574604, -0.003251827321946621, -0.005467289127409458, -0.01877945102751255, -0.004882670938968658, -0.02046932093799114, -0.005815043114125729, 0.000849363743327558, -0.002845421899110079, -0.0002191550011048093, 0.0001167306545539759, 0.002294196048751473, 0.00005096954919281416, -0.001271399785764515, 0.005894565489143133, 0.002548608230426908, 0.005099919158965349, -0.01164000667631626, -0.005317786242812872, -0.00873152818530798, -0.003215829376131296, 0.0001871437125373632, -0.00449675228446722, -0.0005135093233548105, 0.000363500788807869 ], [ 0.04158908501267433, -0.006499741226434708, 0.05820758640766144, -0.03328081220388412, 0.0067132324911654, -0.01023629494011402, 0.04651663079857826, -0.05718295648694038, 0.01328601967543364, -0.00334651255980134, 0.01225014496594667, -0.009253176860511303, 0.02079340629279613, -0.06284234672784805, 0.02567728795111179, -0.003386510536074638, 0.0002557987172622234, -0.006707462947815657, 0.01389864552766085, -0.004039369989186525, -0.003971589729189873, -0.04935307055711746, 0.0323706828057766, -0.007050652522593737, 0.0002365439140703529, 0.001002009841613472, 0.0004547110293060541, -0.008569963276386261, 0.01026076823472977, 0.002339619910344481, -0.01739379204809666, -0.02611399069428444, 0.02987205423414707, -0.009536013938486576, 0.000475406734040007, 0.00002603282337076962, -0.0008666430367156863, 0.002421036129817367, 0.000407957995776087, -0.00758732995018363, 0.003219442907720804, 0.006470272317528725, -0.01779754087328911, -0.00561286648735404, 0.01999113708734512, -0.009257561527192593, 0.0005327592953108251, 0.00010037738684332, 0.000229410215979442, 0.0003348947793710977, -0.002176824491471052, 0.003910014405846596, -0.0000168452643265482, -0.004098179750144482, -0.003451305674389005, 0.006760111544281244, -0.0107866432517767, 0.004367482848465443, 0.008280404843389988, -0.006073718890547752, 0.0001767471694620326, 0.000262481567915529, 0.0005453641642816365, -0.0001932774757733569 ], [ 0.04844989627599716, 0.03785368055105209, 0.06727448850870132, 0.0004724104073829949, 0.000385981664294377, 0.06490940600633621, 0.05239947885274887, 0.0007689296035096049, -0.01197219733148813, 0.00006645944813499227, 0.0008117200923152268, 0.07087887823581696, 0.02089113742113113, 0.0007207904709503055, -0.02336147800087929, 0.00003781972554861568, 0.0002850573509931564, 0.00009126183431362733, 0.001121128094382584, 0.05456586554646492, -0.008999542333185673, 0.0002971510111819953, -0.02987481281161308, -0.00004261404319549911, -0.002309285569936037, -0.0009386696619912982, 0.0005630162195302546, 0.00006865309114800766, 0.001107106450945139, 0.02678989060223103, -0.02443317510187626, -0.0003208919370081276, -0.0281655453145504, -0.0002987920888699591, -0.005235487595200539, -0.0002160971489502117, -0.00003484752960503101, -0.002259218599647284, 0.0006725942948833108, 0.00007651423220522702, 0.0006943020271137357, 0.002300131367519498, -0.02322613447904587, -0.0008366843103431165, -0.01953399926424026, -0.0006617260514758527, -0.007897082716226578, -0.0004992809845134616, -0.000273837911663577, -0.0004178730014245957, -0.0000981936973403208, -0.00362035003490746, 0.0004760505398735404, 0.0002535907260607928, 0.0000194127769646002, -0.009318987838923931, -0.01243343204259872, -0.001004647114314139, -0.008794869296252728, -0.000930147129110992, -0.009006024338304996, -0.000756672234274447, -0.0006913734250701964, -0.00005445935312309302 ], [ 0.01986081525683403, -0.0002531804493628442, 0.03336575999855995, -0.00003886735066771507, 0.0001265257014892995, -0.0005302104982547462, 0.0404994860291481, -0.00007842081686249003, 2.1415928586066e-6, -8.968908105089213e-7, 0.0003139014588668942, -0.0008024786948226392, 0.04361747577786446, -0.0001116453131544404, 5.280084678815911e-6, -0.00001927843004523311, -2.694494241950451e-6, -3.1939919153956e-6, 0.0005651707760989666, -0.001023247605189681, 0.04348870366811752, -0.0001295938272960484, 9.433848390472122e-6, -0.00005340178904589266, 0.00007402260962408036, -3.562396159395576e-6, -8.271743354271166e-6, -8.22166748548625e-6, 0.0008544905576854944, -0.001157045713625848, 0.04070602729916573, -0.0001267708867089823, 0.00001414235975971678, -0.0001067546036210842, 0.0002258154709124938, 1.282428030435767e-7, 2.153287368855672e-6, -0.00001163063552667154, -0.00001831086228776257, -0.00001752889693307225, 0.001146853086538613, -0.001183129264973104, 0.03589270263910294, -0.0001020346317091025, 0.00001882555443444289, -0.0001778113801265135, 0.000495997432153672, 5.352538323677436e-7, 1.589456388728649e-7, -2.773749763207434e-8, 7.575577456009341e-6, -0.00002721169403230306, -0.00003372737410245463, -0.00003266708154114895, 0.001403961214236915, -0.001097311615012586, 0.02972002327442169, -0.00005872577457921579, 0.00002289401891175658, -0.0002610918018035591, 0.000904988672118634, 1.583934817972477e-6, 5.583017923527223e-7, -3.586600598737277e-7 ] ], "Routing": [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25 ] }, "LoudspeakerLayout": { "Name": "A loudspeaker layout", "Loudspeakers": [ { "Azimuth": 0.0, "Elevation": 0.0, "Radius": 1.0, "IsImaginary": false, "Channel": 1, "Gain": 1.0 }, { "Azimuth": -24.0, "Elevation": 0.0, "Radius": 1.0, "IsImaginary": false, "Channel": 2, "Gain": 1.0 }, { "Azimuth": -48.0, "Elevation": 0.0, "Radius": 1.0, "IsImaginary": false, "Channel": 3, "Gain": 1.0 }, { "Azimuth": -72.0, "Elevation": 0.0, "Radius": 1.0, "IsImaginary": false, "Channel": 4, "Gain": 1.0 }, { "Azimuth": -102.0, "Elevation": 0.0, "Radius": 1.0, "IsImaginary": false, "Channel": 5, "Gain": 1.0 }, { "Azimuth": -138.0, "Elevation": 0.0, "Radius": 1.0, "IsImaginary": false, "Channel": 6, "Gain": 1.0 }, { "Azimuth": -178.0, "Elevation": 0.0, "Radius": 1.0, "IsImaginary": false, "Channel": 7, "Gain": 1.0 }, { "Azimuth": 142.0, "Elevation": 0.0, "Radius": 1.0, "IsImaginary": false, "Channel": 8, "Gain": 1.0 }, { "Azimuth": 102.0, "Elevation": 0.0, "Radius": 1.0, "IsImaginary": false, "Channel": 9, "Gain": 1.0 }, { "Azimuth": 70.0, "Elevation": 0.0, "Radius": 1.0, "IsImaginary": false, "Channel": 10, "Gain": 1.0 }, { "Azimuth": 45.0, "Elevation": 0.0, "Radius": 1.0, "IsImaginary": false, "Channel": 11, "Gain": 1.0 }, { "Azimuth": 23.0, "Elevation": 0.0, "Radius": 1.0, "IsImaginary": false, "Channel": 12, "Gain": 1.0 }, { "Azimuth": -24.0, "Elevation": 28.0, "Radius": 1.0, "IsImaginary": false, "Channel": 13, "Gain": 1.0 }, { "Azimuth": -69.0, "Elevation": 28.0, "Radius": 1.0, "IsImaginary": false, "Channel": 14, "Gain": 1.0 }, { "Azimuth": -115.0, "Elevation": 27.0, "Radius": 1.0, "IsImaginary": false, "Channel": 15, "Gain": 1.0 }, { "Azimuth": -159.0, "Elevation": 27.0, "Radius": 1.0, "IsImaginary": false, "Channel": 16, "Gain": 1.0 }, { "Azimuth": 155.0, "Elevation": 28.0, "Radius": 1.0, "IsImaginary": false, "Channel": 17, "Gain": 1.0 }, { "Azimuth": 112.0, "Elevation": 28.0, "Radius": 1.0, "IsImaginary": false, "Channel": 18, "Gain": 1.0 }, { "Azimuth": 66.0, "Elevation": 29.0, "Radius": 1.0, "IsImaginary": false, "Channel": 19, "Gain": 1.0 }, { "Azimuth": 22.0, "Elevation": 28.0, "Radius": 1.0, "IsImaginary": false, "Channel": 20, "Gain": 1.0 }, { "Azimuth": 0.0, "Elevation": 60.0, "Radius": 1.0, "IsImaginary": false, "Channel": 21, "Gain": 1.0 }, { "Azimuth": -91.0, "Elevation": 59.0, "Radius": 1.0, "IsImaginary": false, "Channel": 22, "Gain": 1.0 }, { "Azimuth": -178.0, "Elevation": 59.0, "Radius": 1.0, "IsImaginary": false, "Channel": 23, "Gain": 1.0 }, { "Azimuth": 86.0, "Elevation": 60.0, "Radius": 1.0, "IsImaginary": false, "Channel": 24, "Gain": 1.0 }, { "Azimuth": 0.0, "Elevation": 90.0, "Radius": 1.0, "IsImaginary": false, "Channel": 25, "Gain": 1.0 }, { "Azimuth": 0.0, "Elevation": -90.0, "Radius": 1.0, "IsImaginary": true, "Channel": 25, "Gain": 0.0 } ] } }././@LongLink0000644000000000000000000000016000000000000011600 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/SimpleDecoder/Source/Presets/t_design_36ch.jsonIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/SimpleDecoder/Source/Presets/t_desig0000664002537200253720000022076515257173642031610 0ustar zmoelnigzmoelnig{ "Name": "All-Round Ambisonic decoder (AllRAD) and loudspeaker layout", "Description": "This configuration file was created with the IEM AllRADecoder v0.9.5 plug-in. 8 Nov 2024 5:31:19pm", "Decoder": { "Name": "Decoder", "Description": "A 7th order Ambisonics decoder of a 8th order t-design (38 channels).", "ExpectedInputNormalization": "n3d", "Weights": "none", "WeightsAlreadyApplied": false, "Matrix": [ [ 0.03805036470294, -0.016301399096847, 0.049749348312616, 0.033416587859392, -0.018266109749675, -0.025658624246716, 0.033211402595043, 0.052482280880213, 0.014110165648162, -0.012845480814576, -0.032099340111017, -0.023995999246836, 0.007397706620395, 0.049440361559391, 0.024121094495058, 0.002973194932565, -0.006706080865115, -0.0239476300776, -0.035041842609644, -0.013629195280373, -0.010325714014471, 0.029891459271312, 0.025434402748942, 0.004688944201916, -0.000913625524845, -0.00286400411278, -0.012618395499885, -0.028001774102449, -0.025884529575706, -0.002102913567796, -0.013207667507231, 0.009265191853046, 0.018314845860004, 0.004078870639205, -0.00252006878145, -0.001016742433421, -0.001320378156379, -0.005105268675834, -0.014623523689806, -0.022609747946262, -0.011630488559604, 0.004156258888543, -0.006511847954243, -0.00071705278242, 0.009042649529874, 0.001732407603413, -0.004397252108902, -0.002288176678121, -0.000241075598751, -0.000917906756513, -0.002270228462294, -0.005164375528693, -0.011224750429392, -0.012028886005282, -0.001072464277968, 0.004029355943203, 0.000076193296991, 0.000375628616894, 0.003779186634347, -0.000112709763926, -0.005420773755759, -0.003293517278507, -0.000286883790977, 0.000159901697771 ], [ 0.038052078336477, 0.049743294715881, 0.033427394926548, -0.016304109245539, -0.025658242404461, 0.052485425025225, -0.00436614593491, -0.018275916576385, -0.035809382796288, -0.020618963986635, -0.032109782099724, 0.014557768590748, -0.027910482138395, -0.00645174831152, -0.040897991508245, 0.026441767811775, 0.021213822066784, -0.023278379812837, -0.017601415514946, -0.019295183941722, -0.018765304237604, 0.006111145485193, -0.01788217574358, 0.03515425696969, 0.009083588607609, 0.002794267144054, 0.028727917000651, -0.010492138564587, 0.002003286033869, -0.019939253106713, 0.001633466687053, 0.008492932654917, 0.005570962093771, 0.02311217226088, 0.008350224234164, -0.01382851600647, -0.00738968886435, 0.000320429826388, 0.020274873822927, 0.001316618057899, 0.009446743875742, -0.002631108742207, 0.008148925378919, 0.002884157700464, 0.008663414977491, 0.004086265806109, 0.001127422438003, -0.018060402944684, -0.000810686557088, -0.001077055581845, -0.008394866250455, -0.004117042757571, 0.006422442849725, 0.001219947356731, 0.004562105517834, 0.00493591139093, 0.001468954607844, -0.001707154908217, -0.000146866601426, -0.004922951571643, -0.002731339307502, -0.012272112071514, 0.001207896857522, 0.003297122893855 ], [ 0.038051828742027, 0.01630712300539, 0.049741871654987, -0.033429179340601, -0.018276950344443, 0.025663388893008, 0.033190086483955, -0.052489958703518, 0.014121930114925, 0.012854379601777, -0.032112620770931, 0.023994645103812, 0.007375209592283, -0.049429699778557, 0.02413616515696, -0.002976308809593, -0.006707035470754, 0.023960895836353, -0.035049002617598, 0.013624609448016, -0.010331615805626, -0.029869122430682, 0.025444945320487, -0.004693595692515, -0.000915900920518, 0.002857138868421, -0.012620163150132, 0.028014140203595, -0.025885809212923, 0.002103372011334, -0.013193691149354, -0.009250689297915, 0.018321739509702, -0.004084914457053, -0.002524390583858, 0.001017989357933, -0.001309714047238, 0.005094240419567, -0.014626991935074, 0.022621013224125, -0.011634945869446, -0.00414659595117, -0.006491422187537, 0.000714246416464, 0.009053200483322, -0.001742202439345, -0.004400829784572, 0.002291477750987, -0.000237485830439, 0.000908022746444, -0.00225260364823, 0.005155402701348, -0.011232303455472, 0.012044479139149, -0.00108619988896, -0.004015541169792, 0.000089664237748, -0.00038626458263, 0.00379561050795, 0.000097576987173, -0.00541967432946, 0.003297405550256, -0.000282965454971, -0.000168794838828 ], [ 0.038048345595598, 0.033414375036955, -0.016312144696712, 0.049743015319109, 0.052474081516266, -0.018278680741787, -0.028815347701311, -0.025671998038888, 0.021700909361243, 0.047114819288254, -0.032118432223797, -0.015225488692522, 0.024857832118869, -0.023588271811604, -0.011106380261481, -0.008922894485295, 0.026292255148292, -0.030423983931541, -0.014933484606445, 0.018665760755539, 0.009664241224527, 0.026066044345498, -0.007554376963526, 0.008954584598541, -0.024567740038037, 0.00661018723622, -0.01611677184701, -0.007479782681912, 0.023871643468738, 0.001881108153611, -0.017670730128884, 0.004283130168915, 0.008007240481675, -0.000728177314159, 0.020517967641354, -0.022296825423837, -0.001690865494311, -0.000910361879505, -0.002219530055299, 0.015945475548506, -0.001006237464026, -0.00978902541101, 0.000271268479992, -0.01340741943568, 0.00129092822317, -0.005143134389073, -0.001856010756455, 0.018679194152355, -0.011764958500862, -0.000131430628244, 0.005924679804593, -0.002354037482291, 0.004802149254829, -0.001923337113112, -0.008615656755865, 0.001333688618615, 0.006557543296367, 0.000826698145829, -0.002491453429684, 0.00243221083656, -0.007171461824328, -0.004453084431589, 0.009386556223035, -0.004183154553175 ], [ 0.038046833127737, 0.049738507717848, -0.033418990671635, 0.016310580074787, 0.025671768933535, -0.052479632198811, -0.004375748801976, -0.018273530527949, -0.035800889134407, -0.02060404792428, -0.0321114808321, 0.014550811611116, 0.027918387204409, 0.006436070427299, 0.040896736085415, -0.026455936953425, -0.021221928298473, 0.023274660110474, 0.017580714076757, 0.019306179136038, -0.018766820430756, 0.006123782601207, -0.017892405390739, 0.035160776227713, 0.009067500010133, 0.002785766264424, 0.028733503073454, -0.010511673986912, 0.002025971189141, -0.019951270893216, -0.001639189315028, -0.008486208505929, -0.005563568323851, -0.023101098835468, -0.008342454209924, 0.013830119743943, 0.007390505168587, -0.000314783654176, -0.020275449380279, -0.001291925436817, -0.009445679374039, 0.002637216821313, 0.008154868148267, 0.00286449235864, 0.008672310039401, 0.004072158131748, 0.001141448388807, -0.018061293289065, -0.000814768776763, -0.001091609243304, -0.00839458592236, -0.004114905837923, 0.006426533684134, 0.001216422766447, 0.004540366120636, 0.004935540724546, -0.001467726775445, 0.001719108084217, 0.000126957413158, 0.004921570420265, 0.002709262771532, 0.01227598823607, -0.001204802771099, -0.003303297795355 ], [ 0.038045212626457, -0.033416692167521, 0.016308976337314, 0.049735970795155, -0.052472230046988, -0.018278833478689, -0.028817484155297, 0.025664942339063, 0.021689634770155, -0.047104891389608, -0.032114244997501, 0.015229833312333, -0.024856543168426, -0.023593096062541, 0.011096046306193, -0.008930780924857, -0.026281572878361, -0.030411344021559, 0.014938428997993, 0.018668431788683, 0.009672841057181, -0.026065720245242, -0.007557407487184, -0.008962204679847, -0.024564744904637, -0.006609938107431, -0.016100352630019, 0.007482240907848, 0.023872207850218, -0.001886721584015, 0.017678212374449, 0.00429376354441, -0.008005374111235, -0.000731141946744, -0.020515101030469, -0.022287640720606, 0.00168033526279, -0.000900296901818, 0.002220335649326, 0.015939386561513, 0.000999622396193, -0.009795728139579, 0.000263387424638, 0.01341943256557, 0.001295250374824, 0.00514158513397, -0.001861596596427, -0.018667241558433, -0.011763206683099, 0.000123146019178, 0.005925823934376, 0.002355671487749, 0.004793690517545, 0.001920866081491, -0.008622137829661, -0.001329498132691, -0.006572955287993, 0.000822003465146, 0.002497832523659, 0.002430893946439, 0.007159705273807, -0.004461565054953, -0.00937591586262, -0.004195326939225 ], [ 0.038046915084124, -0.049738705158234, 0.033419117331505, 0.01630592904985, -0.025664085522294, -0.052477318793535, -0.004373440984637, 0.018271842971444, -0.035804308950901, 0.020610395818949, -0.032107777893543, -0.014549532905221, -0.02791291102767, 0.006440380122513, -0.040894232690334, -0.026448663324118, 0.021216839551926, 0.023272959515452, -0.017585830762982, 0.019301410764456, -0.018762504681945, -0.006119640544057, -0.017885169014335, -0.035156700760126, 0.009073624387383, -0.002789064543322, 0.028729967772961, 0.01050116494298, 0.00202036020346, 0.019944060593843, 0.001638824702241, -0.008488366380334, 0.00556625938043, -0.023103727027774, 0.008339788764715, 0.013825959526002, -0.007385414559394, -0.000309198861942, 0.020274816080928, -0.001299659488723, 0.009448227472603, 0.002633521333337, 0.008153554983437, -0.002870060969144, 0.008668100461364, -0.004073830787092, 0.0011307093082, 0.018056465312839, -0.000815527513623, 0.00109199504368, -0.008385478518903, 0.004124641884118, 0.006422790698707, -0.001215665368363, 0.004547189921141, -0.004937903489918, 0.001469459850341, 0.001717107836157, -0.000133021021611, 0.004926749970764, -0.002715356880799, 0.012272099032998, 0.001211946131662, -0.003297669114545 ], [ 0.038048043847084, -0.033419147133827, -0.016306933015585, -0.049740716814995, 0.05247750878334, 0.018273210152984, -0.028821479529142, 0.025665868073702, 0.021692235022783, -0.047110132873058, -0.032111134380102, 0.015237726271152, 0.024855133146048, 0.023593200370669, -0.0111053455621, 0.008931015618145, 0.026285532861948, 0.030418980866671, -0.014946425333619, -0.018666753545403, 0.009672568179667, -0.026065872982144, -0.007544924970716, -0.008951846510172, -0.024564811959863, -0.006615709513426, -0.016115035861731, 0.007479551713914, 0.023875007405877, -0.001892157364637, -0.017674002796412, -0.004284397233278, 0.00800456572324, 0.000712149718311, 0.020514916628599, 0.022285167127848, -0.001668828772381, 0.000909928989131, -0.002208453137428, -0.015945440158248, -0.001000460004434, 0.009795526042581, 0.000269336625934, 0.013407833874226, 0.001278509385884, 0.005149678327143, -0.001848894869909, -0.01867857016623, -0.011760515160859, 0.000106201463495, 0.005927768535912, 0.002346421126276, 0.004797095432878, 0.001930968021043, -0.008619530126452, -0.001330440514721, 0.006558737717569, -0.000830548873637, -0.002481050090864, -0.002418847754598, -0.007176044862717, 0.004458057228476, 0.009388467296958, 0.004197534639388 ], [ 0.038046542555094, -0.049742136150599, -0.033418785780668, -0.016297413036227, 0.025652157142758, 0.052481561899185, -0.004374607466161, 0.018265353515744, -0.035814970731735, 0.020627118647099, -0.032098531723022, -0.014550966210663, 0.02791703119874, -0.006441713310778, 0.040905244648457, 0.026440151035786, -0.021216435357928, -0.023289250209928, 0.017588324844837, -0.01930558681488, -0.018769297748804, -0.006116891745478, -0.017888812348247, -0.035149540752172, 0.009091052226722, -0.002800361718982, 0.028728561475873, 0.010505027137697, 0.002013837685809, 0.019953779876232, -0.00163457612507, 0.008492979221046, -0.005568665917963, 0.023105790838599, -0.008357042446733, -0.0138337649405, 0.007396908011287, 0.000321771833114, -0.020274763926864, 0.001303162775002, -0.009451768361032, -0.002643587300554, 0.008157749660313, -0.002879726700485, 0.0086715426296, -0.004081530962139, 0.001134628546424, 0.01806153357029, -0.000816156447399, 0.001082315575331, -0.008393994532526, 0.004119705408812, 0.006426566746086, -0.00121492263861, 0.004560980945826, -0.004935964476317, -0.001480451552197, -0.001712467405014, 0.00013005938672, -0.004924866370857, 0.002719663782045, -0.012270245701075, -0.001208397210576, 0.003306584665552 ], [ 0.038048081099987, 0.033422809094191, 0.016303453594446, -0.049740020185709, -0.052479803562164, 0.018272373825312, -0.028830025345087, -0.025661641731858, 0.021686390042305, 0.04710578545928, -0.032107047736645, -0.015244925394654, -0.024861650541425, 0.02360537275672, 0.011100810952485, 0.008938550949097, -0.026275940239429, 0.030409144237638, 0.014958491548896, -0.018674660474062, 0.009677426889539, 0.026079423725605, -0.007553385104984, 0.008952215313911, -0.024568377062678, 0.006605798844248, -0.016104556620121, -0.007495990488678, 0.023888111114502, 0.001888465252705, 0.017687747254968, -0.00428440887481, -0.008014758117497, 0.000714197230991, -0.020505733788013, 0.022284002974629, 0.00167730927933, 0.000907499226741, 0.002225124510005, -0.015960551798344, 0.001008304068819, 0.009798466227949, 0.000279270665487, -0.013421401381493, 0.001280979486182, -0.005144229158759, -0.00184005650226, 0.018662767484784, -0.011758051812649, -0.000115760201879, 0.005920491181314, -0.002354215830564, 0.004812562372535, -0.001935802283697, -0.008619133383036, 0.001340219983831, -0.006559304427356, -0.00084210629575, 0.002492787316442, -0.002425490645692, 0.007177100982517, 0.004439989104867, -0.009375827386975, 0.004195461049676 ], [ 0.038053203374147, 0.016308369114995, -0.049747444689274, 0.033422403037548, 0.01827746629715, -0.025664374232292, 0.033201910555363, -0.052482441067696, 0.014113415963948, 0.01285426132381, -0.032111998647451, 0.023993756622076, -0.007391110993922, 0.049428123980761, -0.024123817682266, 0.00296956137754, 0.006708012893796, -0.023959493264556, 0.035045091062784, -0.013621903024614, -0.010316977277398, -0.029874870553613, 0.025436224415898, -0.004682183265686, -0.000918882200494, 0.002861168934032, -0.012620775960386, 0.028010049834847, -0.02587771974504, 0.002101394580677, 0.013184193521738, 0.009258156642318, -0.018321618437767, 0.004073963966221, 0.002530381316319, -0.001018137438223, 0.001316810958087, -0.005100486800075, 0.014625549316406, -0.022613594308496, 0.011624615639448, 0.004144262522459, -0.006486546248198, 0.000712776207365, 0.009059583768249, -0.001737232669257, -0.004408652894199, 0.002292111748829, -0.000237530563027, 0.000916236545891, -0.002265026792884, 0.005160458851606, -0.011227991431952, 0.012034582905471, -0.001077967928723, -0.004006865434349, -0.000093891947472, 0.000378016702598, -0.003800811711699, -0.000095039576991, 0.005427117459476, -0.003299562493339, 0.000282414897811, 0.000166795216501 ], [ 0.038049731403589, -0.016305200755596, -0.04973902925849, -0.033425852656364, 0.018274629488587, 0.025661740452051, 0.03318989276886, 0.052480328828096, 0.014125097543001, -0.012854008004069, -0.032110154628754, -0.023995745927095, -0.007382679264992, -0.049414310604334, -0.024136289954185, -0.002983360318467, 0.0067094177939, 0.02396085485816, 0.035049457103014, 0.013628836721182, -0.010314001701772, 0.02985498867929, 0.025437472388148, 0.004700564779341, -0.000908141955733, -0.00286196032539, -0.012622949667275, -0.028016660362482, -0.025890238583088, -0.002108939457685, 0.013169369660318, -0.009245669469237, -0.018309947103262, -0.004084079060704, 0.002514918101951, 0.001012464170344, 0.001314701861702, 0.005100198555738, 0.014628933742642, 0.022628303617239, 0.011640443466604, -0.004141500685364, -0.006467542611063, -0.000709174957592, 0.009045881219208, 0.001733726705424, -0.004398644901812, -0.00228306860663, -0.000236279985984, -0.000909973343369, -0.002259884728119, -0.00515726627782, -0.011235234327614, -0.012055670842528, -0.001088158343919, 0.004010470118374, -0.000108234882646, -0.000394548464101, -0.003796790493652, 0.000103702826891, 0.005428666248918, 0.003292025998235, 0.000279762403807, -0.000166335536051 ], [ 0.031442999839783, -0.015120512805879, -0.037907537072897, 0.032114185392857, -0.018970230594277, 0.022448588162661, 0.018271554261446, -0.047493495047092, 0.015846349298954, -0.01535371132195, 0.031472124159336, -0.018593346700072, 0.007410272490233, 0.038949225097895, -0.026168648153543, 0.004202431067824, -0.009507364593446, 0.027094127610326, -0.031223358586431, 0.007450918201357, -0.021532153710723, -0.014926247298717, 0.02573237195611, -0.007328765466809, -0.001444247318432, -0.00463391141966, 0.017249315977097, -0.029148496687412, 0.019275380298495, 0.00265463325195, 0.019335469231009, -0.006765173282474, -0.015535421669483, 0.00771925970912, 0.002660169498995, -0.002846631454304, -0.001697502564639, 0.008448862470686, -0.018964152783155, 0.020538117736578, -0.004991840105504, -0.006337460130453, -0.008674712851644, 0.014744541607797, 0.003486898494884, -0.005201992113143, -0.003021669574082, 0.005129193421453, -0.002250907476991, -0.000387549196603, 0.003137297229841, -0.009079637005925, 0.013396857306361, -0.008291991427541, -0.00293933507055, 0.004428529180586, 0.000104078470031, -0.010910216718912, 0.00324759283103, 0.001803447376005, 0.002307554939762, -0.005430417601019, 0.003887024940923, -0.001189140486531 ], [ 0.03143522888422, -0.037897326052189, 0.032110255211592, -0.015116893686354, 0.022446680814028, -0.047487862408161, 0.004594587720931, -0.0189652107656, -0.023740695789456, 0.010163229890168, 0.031469464302063, -0.025235218927264, -0.020519718527794, -0.01021280977875, -0.033363539725542, 0.021844265982509, -0.016556344926357, 0.01536900550127, 0.022705916315317, 0.006330932956189, -0.023527856916189, 0.002151416847482, -0.023958185687661, 0.032572414726019, 0.000912688905373, 0.003461227519438, -0.025327729061246, 0.012760783545673, 0.005292561370879, 0.021154070273042, -0.009318763390183, 0.007947674021125, -0.004907908383757, 0.026703286916018, 0.001700195251033, -0.010115312412381, 0.004868232179433, 0.004920039325953, -0.021765921264887, 0.004967567510903, -0.006035394966602, 0.014912489801645, 0.004268985707313, 0.005736432503909, 0.007850239053369, 0.010958220809698, 0.00187914900016, -0.015321161597967, 0.004249962512404, -0.003264675382525, 0.006937429308891, 0.003537929151207, -0.010420624166727, -0.001507734064944, -0.006441681180149, 0.002368194051087, 0.007095221430063, 0.001375894295052, 0.008250414393842, -0.000776931701694, 0.001105834613554, -0.012878390960395, 0.005806858185679, 0.001670241588727 ], [ 0.031424757093191, 0.015116444788873, -0.037886336445808, -0.032097656279802, -0.01896377839148, -0.02244646474719, 0.018258424475789, 0.047474391758442, 0.015836920589209, 0.015346674248576, 0.031469251960516, 0.018596479669213, 0.007420310750604, -0.038937442004681, -0.026157895103097, -0.00419854465872, -0.00950167234987, -0.02709000185132, -0.031230943277478, -0.007454921957105, -0.021547244861722, 0.014916189014912, 0.02572631277144, 0.007323834113777, -0.001444695750251, 0.004630438052118, 0.017244722694159, 0.029155610129237, 0.019288443028927, -0.002656914992258, 0.019352568313479, 0.006784823723137, -0.015530810691416, -0.007715697865933, 0.002661379985511, 0.002846222836524, -0.001695833634585, -0.008444474078715, -0.018967630341649, -0.020553501322865, -0.00499850558117, 0.006346966605633, -0.008682999759912, -0.014772554859519, 0.00347556755878, 0.005198813509196, -0.003023470751941, -0.005129108671099, -0.002251866506413, 0.000386175961467, 0.003133369842544, 0.009078366681933, 0.013408546335995, 0.008303996175528, -0.002943441038951, -0.004439255688339, 0.000100410514278, 0.01093280967325, 0.003266553394496, -0.001796931377612, 0.002309184754267, 0.005430805962533, 0.00388779072091, 0.001192772528157 ], [ 0.031430587172508, 0.032101474702358, -0.015118107199669, -0.037894271314144, -0.047478660941124, -0.018966065719724, -0.02285061776638, 0.022448778152466, 0.007899167947471, 0.036654461175203, 0.031470071524382, -0.013801268301904, 0.023526411503553, 0.016142861917615, -0.005303904879838, 0.021879408508539, -0.011367852799594, -0.025850774720311, 0.012128752656281, 0.019933084025979, 0.005233156960458, -0.023517927154899, -0.001780095510185, -0.015385211445391, -0.03312461078167, -0.009549518115819, 0.008076171390712, -0.004722928628325, -0.024584218859673, -0.000303545297356, -0.017212709411979, 0.000623908475973, 0.004006691742688, -0.003244486171752, 0.023792590945959, 0.02473078854382, 0.015946473926306, 0.006926365662366, 0.000179427821422, 0.015020720660686, 0.004117993172258, -0.010690672323108, 0.004158288706094, 0.012510954402387, -0.001041425392032, 0.009254971519113, 0.0018330225721, -0.017071038484573, -0.008946402929723, -0.011034430935979, -0.010152995586395, 0.000407224084483, -0.002988317515701, -0.004082072991878, 0.009281228296459, 0.003876206930727, 0.006289102137089, -0.004949023481458, -0.001336619374342, -0.001903900876641, -0.010233888402581, -0.000043611853471, 0.005004733335227, -0.001750935800374 ], [ 0.031421609222889, -0.037877634167671, -0.032099910080433, 0.01511690672487, -0.022441918030381, 0.047469992190599, 0.004596464335918, -0.018972283229232, -0.023723002523184, 0.010150423273444, 0.031475313007832, -0.025229899212718, 0.020515898242593, 0.01022719964385, 0.033343270421028, -0.021834809333086, 0.016545135527849, -0.015350172296166, -0.022726276889443, -0.006333476863801, -0.023529790341854, 0.002139037009329, -0.023943779990077, 0.032573029398918, 0.00090623635333, 0.00346188317053, -0.02532404102385, 0.012741141021252, 0.005313900765032, 0.021161602810025, 0.009319795295596, -0.00794402975589, 0.004894840996712, -0.02672073058784, -0.00168588059023, 0.01010608766228, -0.004863874055445, -0.00492877047509, 0.021777069196105, -0.004948289133608, 0.006024812348187, -0.014915940351784, 0.004274069331586, 0.005737967323512, 0.007865618914366, 0.010979026556015, 0.001858896110207, -0.015316938981414, 0.004247245844454, -0.00326188467443, 0.006937065161765, 0.003555326489732, -0.010436064563692, -0.001525640138425, -0.006437360774726, 0.002360391197726, -0.007097872905433, -0.001377389766276, -0.008261185139418, 0.000765814387705, -0.001086062053218, 0.012884267605841, -0.005811703391373, -0.001671473728493 ], [ 0.031432304531336, -0.032102223485708, 0.015123472549021, -0.03789446502924, 0.047477643936872, -0.018972337245941, -0.02284567989409, -0.022453801706433, 0.007898391224444, -0.036652479320765, 0.031476527452469, 0.013795198872685, -0.023528436198831, 0.016135385259986, 0.005301476921886, 0.021878328174353, 0.011367931962013, -0.025851503014565, -0.012120171450078, 0.019934438169003, 0.005227655172348, 0.023514276370406, -0.001778805279173, 0.015390903688967, -0.033121924847364, 0.009546817280352, 0.008073108270764, 0.004718174226582, -0.024581344798207, 0.000306118075969, 0.017209410667419, 0.000624127627816, -0.003999228589237, -0.003241124330088, -0.023795533925295, 0.024729788303375, -0.015944207087159, 0.00692806346342, -0.000178485075594, 0.015012922696769, -0.004114993847907, -0.010692188516259, 0.004153735935688, -0.012507233768702, -0.001035951892845, -0.009261126630008, 0.001830318011343, 0.017071830108762, -0.00894860830158, 0.011035094968975, -0.010153669863939, -0.00040834362153, -0.002978397533298, 0.004072180017829, 0.009285413660109, -0.003872440429404, -0.006293626967818, -0.004938375670463, 0.001331546693109, -0.00190730986651, 0.010235703550279, -0.000041808449168, -0.005008107051253, -0.001747927861288 ], [ 0.031426712870598, 0.037881940603256, 0.032107029110193, 0.015117108821869, 0.022442478686571, 0.047477621585131, 0.00460230698809, 0.018970686942339, -0.023725133389235, -0.010150093585253, 0.031473781913519, 0.025236893445253, -0.020511016249657, 0.010223890654743, -0.033351588994265, -0.021834146231413, -0.016540054231882, -0.015358529053628, 0.022720351815224, -0.006328583694994, -0.023522751405835, -0.002139513613656, -0.0239541195333, -0.032574288547039, 0.000905069580767, -0.0034596004989, -0.025326415896416, -0.012756025418639, 0.00530721899122, -0.021153250709176, -0.009311906062067, -0.007936744950712, -0.004899087361991, -0.026720277965069, 0.00169247481972, 0.01009513437748, 0.004849426914006, -0.004922229796648, -0.021786389872432, -0.004956635180861, -0.006022998131812, -0.014901500195265, 0.00427450472489, -0.005725025199354, 0.007866313681006, -0.010972073301673, 0.001872607623227, 0.015316415578127, 0.004237401299179, 0.003243846353143, 0.006932336371392, -0.00354777276516, -0.010437606833875, 0.00152964098379, -0.006423295475543, -0.002350279130042, 0.007087382022291, -0.001367833116092, 0.008258246816695, 0.000774584768806, 0.001094991690479, 0.012899396941066, 0.005800419021398, -0.001658396446146 ], [ 0.031435191631317, -0.032109633088112, -0.015118345618248, 0.037897508591413, -0.047486793249846, 0.018969878554344, -0.022856947034597, -0.022446401417255, 0.007893145084381, -0.036653999239206, 0.031473018229008, 0.013807967305183, 0.023526987060905, -0.016150318086147, -0.00529495999217, -0.021888872608542, -0.011360834352672, 0.025846591219306, 0.012136205099523, -0.019939605146646, 0.00524370605126, 0.023515496402979, -0.001783812651411, 0.015395854599774, -0.033127669245005, 0.009554026648402, 0.008068507537246, 0.004728154279292, -0.024588340893388, 0.000298273807857, -0.017218295484781, -0.000607911264524, 0.00399651331827, 0.003241281723604, 0.023796455934644, -0.024725450202823, 0.015943506732583, -0.006927155889571, 0.000183531155926, -0.015014234930277, 0.004108561202884, 0.010700547136366, 0.004146452061832, -0.012518032453954, -0.001024838769808, -0.009263707324862, 0.001827977248468, 0.017070092260838, -0.008938928134739, 0.011026399210095, -0.010146367363632, -0.000403246493079, -0.00297847436741, 0.00406546657905, 0.009290795773268, -0.003875966882333, 0.006302994210273, 0.00493349833414, -0.001337621593848, 0.001917980844155, -0.010229326784611, 0.000035947385186, 0.00501137599349, 0.001755045494065 ], [ 0.031436108052731, 0.037899859249592, -0.032106507569551, -0.015122427605093, -0.02245413698256, -0.047485087066889, 0.004583802539855, 0.018969917669892, -0.02373881265521, -0.010156399570405, 0.031477198004723, 0.025222074240446, 0.020529944449663, -0.010211841203272, 0.033358410000801, 0.021848000586033, 0.01655382104218, 0.015359567478299, -0.022708037868142, 0.006348225288093, -0.023527471348643, -0.002156286034733, -0.023948619142175, -0.032576624304056, 0.000904840300791, -0.003466025693342, -0.025324681773782, -0.012751494534314, 0.005290551576763, -0.021162578836083, 0.009307286702096, 0.007951188832521, 0.004896534141153, 0.026705855503678, -0.0016907856334, -0.010108459740877, -0.00486101070419, 0.004924210719764, 0.021765202283859, 0.004959262441844, 0.006035791244358, 0.014907245524228, 0.004281726200134, -0.005736954975873, 0.007856504991651, -0.010961542837322, 0.001871395739727, 0.015313832089305, 0.004250586498529, 0.003262949408963, 0.006932181306183, -0.003540589706972, -0.010425467044115, 0.001512653660029, -0.006439574994147, -0.002357747172937, -0.007101487834007, 0.001376088592224, -0.00824755243957, -0.000768763129599, -0.001098109409213, -0.012876331806183, -0.005805151537061, 0.00166548800189 ], [ 0.031452566385269, 0.032128721475601, 0.015123135410249, 0.037914548069239, 0.047509662806988, 0.01897382363677, -0.022864188998938, 0.022450529038906, 0.007890282198787, 0.036664597690105, 0.031476017087698, -0.013813298195601, -0.023523941636086, -0.016149019822478, 0.005294301081449, -0.021903289481997, 0.011360302567482, 0.025845509022474, -0.01213559973985, -0.019932786002755, 0.005243285093457, -0.023503798991442, -0.001774502336048, -0.015397356823087, -0.033137958496809, -0.009552902542055, 0.008065755479038, -0.004718332085758, -0.024571700021625, -0.000293348013656, 0.017202058807015, -0.000609750917647, -0.00398827996105, 0.00324806664139, -0.023794509470463, -0.024728547781706, -0.015935881063342, -0.006926975212991, -0.000172233048943, -0.0149957370013, -0.004103389568627, 0.010688317939639, 0.004139543976635, 0.012497648596764, -0.001032252679579, 0.009261226281524, 0.001824591192417, -0.01706488057971, -0.008945362642407, -0.011022038757801, -0.010141156613827, 0.000405559083447, -0.002967400476336, -0.004067776724696, 0.009274984709918, 0.003864320926368, -0.00628971029073, 0.004926002118737, 0.001328075770289, 0.001908662728965, 0.01021932810545, 0.000026527195587, -0.005006582476199, 0.001738483668305 ], [ 0.031422533094883, 0.015107127837837, 0.037886131554842, 0.03209675475955, 0.018956884741783, 0.022433191537857, 0.018264938145876, 0.047474462538958, 0.015843339264393, 0.015348939225078, 0.031457781791687, 0.018586322665215, -0.007407488301396, 0.038943029940128, 0.026166383177042, 0.004207018297166, 0.009510383009911, 0.027093028649688, 0.031218903139234, 0.007451436948031, -0.021535458043218, 0.01493108458817, 0.025733876973391, 0.007334422320127, -0.001440601306967, 0.004638814367354, 0.017259916290641, 0.029155371710658, 0.019278997555375, -0.002656020224094, -0.019351620227098, -0.006763885729015, 0.015539525076747, 0.007722020149231, -0.002659570658579, -0.002846926916391, 0.001700257766061, 0.008459934964776, 0.018980646505952, 0.0205457508564, 0.004992119967937, -0.006346783135086, -0.008695614524186, -0.014757527038455, 0.003489425871521, 0.005201376974583, -0.003028678009287, -0.005137473810464, -0.002252689795569, 0.000388329179259, 0.003141367807984, 0.00909314211458, 0.013408119790256, 0.008288936689496, -0.002948112785816, -0.004442779812962, -0.000117009098176, -0.010934811085463, -0.003249511821195, 0.001802864368074, -0.002317565958947, -0.005449715536088, -0.003897232702002, -0.001189328846522 ], [ 0.031430251896381, -0.015115388669074, 0.037890996783972, -0.032105583697557, 0.018964247778058, -0.02244384214282, 0.018258636817336, -0.047481369227171, 0.015845419839025, -0.015349946916103, 0.031467478722334, -0.018593160435557, -0.007420287467539, -0.03893817961216, 0.026166012510657, -0.004206452518702, 0.009506851434708, -0.027092294767499, 0.031226122751832, -0.007453121244907, -0.02154328301549, -0.014916024170816, 0.025726912543178, -0.007332031149417, -0.001438617473468, -0.004636040888727, 0.017250649631023, -0.029153183102608, 0.0192831736058, 0.002656193915755, -0.019348436966538, 0.006777663249522, 0.01552679669112, -0.007716389838606, -0.002655253279954, 0.002841911744326, 0.001701029483229, -0.008451879955828, 0.018968718126416, -0.020547052845359, 0.004996017087251, 0.006345653906465, -0.008686304092407, 0.014759978279471, 0.003476428799331, -0.005192356649786, -0.003024502191693, 0.005125217139721, -0.002248567994684, -0.000390788452933, 0.003140929853544, -0.009081253781915, 0.013402923941612, -0.008297335356474, -0.002943760016933, 0.004440237302333, -0.000111900648335, 0.010925912298262, -0.003257452743128, -0.00179240538273, -0.002318390645087, 0.005433283280581, -0.003885163227096, 0.001189763424918 ], [ 0.037756834179163, 0.058479938656092, -0.004607163835317, -0.018648445606232, -0.034932285547256, -0.00947343558073, -0.035202670842409, 0.000273419514997, -0.048917207866907, -0.031364850699902, 0.000880282314029, -0.039938490837812, 0.007775353267789, 0.013509607873857, 0.011528222821653, 0.042420193552971, 0.039565268903971, 0.012618447653949, 0.02084126137197, 0.011242240667343, 0.022526970133185, 0.000035371183913, 0.026152178645134, -0.002026575850323, 0.013114685192704, 8.392460586037487e-6, -0.00352033902891, 0.012228817678988, -2.886694801418344e-6, 0.02110662125051, -0.006498142145574, -0.008128920570016, -0.011003851890564, -0.021101474761963, -0.012366623617709, -0.029166460037231, -0.016336124390364, -0.010637536644936, -0.015979511663318, -0.0102782510221, -0.010499035008252, -0.007117637898773, -0.009836327284575, -0.000720737793017, -0.010324784554541, 0.000451254833024, -0.001866969745606, 0.004720167256892, 0.005501106381416, 0.004579198081046, 0.004909371957183, 0.003202022518963, 0.001176145975478, -0.002275622449815, -0.001374482642859, -0.0065718726255, 0.002423260593787, 0.003402175847441, 0.005608617328107, 0.008430364541709, 0.008808354847133, 0.008732881397009, 0.007876059040427, 0.005830820649862 ], [ 0.037757690995932, -0.004611489363015, -0.018639517948031, 0.058485578745604, -0.009479207918048, 0.000277860788628, -0.02477952837944, -0.034922413527966, 0.054950572550297, -0.013210624456406, 0.000886145222466, 0.004348970483989, 0.025267869234085, -0.020412288606167, -0.036653231829405, 0.0465122833848, -0.014978024177253, 0.001499612117186, 0.007821524515748, -0.001364402472973, 0.003544805105776, 0.029660288244486, -0.009176487103105, -0.033483434468508, 0.035589937120676, -0.014533904381096, 0.001760347047821, 0.009801243431866, -0.003038760041818, -0.002950979862362, -0.013385893777013, -0.002296140650287, 0.021070251241326, -0.001394947641529, -0.027207294479012, 0.024231430143118, -0.012170567177236, 0.001463819760829, 0.010187227278948, -0.00423288019374, -0.004169491119683, 0.001674106926657, 0.003024138510227, -0.009548740461469, -0.004535650834441, 0.012610426172614, 0.002998663112521, -0.019565066322684, 0.014071556739509, -0.008572082035244, 0.000632914190646, 0.009279020130634, -0.004512252751738, -0.004025551956147, 0.00254604103975, 0.001085656927899, 0.001853210967965, 0.002457296242937, -0.0031409249641, -0.00387422228232, 0.005842093843967, 0.004497090354562, -0.012058443389833, 0.006187467835844 ], [ 0.037756789475679, -0.058482430875301, -0.004619889426976, 0.018639901652932, -0.034920617938042, 0.009494374506176, -0.035198524594307, -0.000282650260488, -0.048927288502455, 0.031380042433739, 0.000894956698176, 0.039931491017342, 0.007793564815074, -0.013504192233086, 0.011541088111699, -0.042413640767336, 0.039567183703184, -0.012620579451323, 0.020834252238274, -0.01126001495868, 0.022520706057549, -0.000025240986361, 0.026144502684474, 0.002035609912127, 0.013126782141626, -0.000010294503227, -0.003515602555126, -0.012217969633639, -0.000013254246369, -0.021099308505654, -0.006509098690003, 0.008127933368087, -0.011005943641067, 0.021093282848597, -0.012366133742034, 0.029172912240028, -0.016340117901564, 0.01064626686275, -0.015967272222042, 0.010268087498844, -0.010498346760869, 0.007123032584786, -0.009835926815867, 0.000715559348464, -0.0103166885674, -0.000450380524853, -0.001852936227806, -0.004704444669187, 0.005509755574167, -0.004592579323798, 0.004895072896034, -0.003214647294953, 0.001160959829576, 0.002266296418384, -0.001373755047098, 0.006574499886483, 0.002426448976621, -0.003405445953831, 0.005603925324976, -0.008426792919636, 0.008796744979918, -0.008715042844415, 0.007899099960923, -0.005829018075019 ], [ 0.037762962281704, -0.018645266070962, 0.058491483330727, -0.004611594136804, 0.000276803737506, -0.034930050373077, 0.059979755431414, -0.009480234235525, -0.006020234897733, 0.002470007399097, 0.00088502233848, -0.044453836977482, 0.049266744405031, -0.013881137594581, -0.012354323640466, -0.000910684117116, 0.000747460580897, 0.005495523568243, 0.00188537593931, -0.044387597590685, 0.03277088329196, -0.016780348494649, -0.016981597989798, -0.002025483874604, 0.00099942937959, -0.000338620913681, 0.001754302997142, 0.008194126188755, 0.003046076744795, -0.035989049822092, 0.016611721366644, -0.01750697568059, -0.017691936343908, -0.003070681123063, 0.00236308388412, 0.000527606287505, -0.000330353010213, -0.000830236705951, 0.002768580801785, 0.009258979931474, 0.003889920655638, -0.023362973704934, 0.004963362589478, -0.015941768884659, -0.014083869755268, -0.003682924667373, 0.003733305260539, 0.001305982121266, -0.000073767041613, -0.000044454689487, -0.000852268887684, -0.001339116948657, 0.003349555190653, 0.008049082010984, 0.003914864733815, -0.011220826767385, -0.000809832185041, -0.01256999373436, -0.007699893321842, -0.003770779119805, 0.004441478755325, 0.002170480322093, -0.000194526670384, -0.000187205441762 ], [ 0.03776753693819, -0.004609533119947, 0.018652094528079, -0.058495558798313, 0.009478309191763, -0.000272602454061, -0.024769490584731, -0.034938536584377, 0.054956201463938, -0.013213683851063, 0.000877776008565, 0.004354236181825, -0.025268079712987, 0.020389508455992, 0.036661736667156, -0.046515315771103, 0.014986552298069, -0.001491762464866, -0.007832420989871, 0.001364789437503, 0.003528404049575, 0.029646607115865, -0.009156444109976, -0.0334837064147, 0.035592276602983, -0.014547624625266, 0.001755601842888, 0.009813928976655, -0.003042558673769, -0.002954846946523, 0.013368648476899, 0.002308305818588, -0.021052692085505, 0.001382926711813, 0.027201600372791, -0.024234304204583, 0.012187602929771, -0.00146279996261, -0.010197008959949, 0.004237997345626, 0.004172792192549, -0.001677636289969, 0.003022335236892, -0.009529625996947, -0.004539861343801, 0.012597695924342, 0.003002811456099, -0.0195566508919, 0.014075530692935, -0.008589485660195, 0.000634570897091, 0.009282886050642, -0.004513929132372, -0.00402699643746, 0.002549847355112, 0.001084225601517, -0.00185021199286, -0.002451366744936, 0.003132214071229, 0.003879297524691, -0.005837391596287, -0.004496150184423, 0.012050110846758, -0.006192785687745 ], [ 0.037759825587273, 0.018643021583557, -0.0584871545434, -0.00460561690852, -0.000272746925475, -0.034925494343042, 0.059977300465107, 0.009469679556787, -0.006021189503372, -0.002473484026268, 0.000878403312527, 0.044448338449001, -0.049268767237663, -0.013868686743081, 0.012354585342109, -0.000912721618079, -0.000749470666051, 0.005502330139279, -0.001879631192423, -0.044384337961674, 0.032778576016426, 0.016768587753177, -0.016978781670332, 0.002028246875852, 0.001000907854177, 0.000339527934557, 0.001757133635692, -0.008202682249248, 0.003045086748898, 0.035991888493299, -0.016623368486762, -0.017496844753623, 0.017684554681182, -0.00307146157138, -0.002365796593949, 0.000531201367266, 0.000333566247718, -0.00083174899919, -0.002769176149741, 0.009266641922295, -0.003895403584465, -0.023373423144221, 0.004974668379873, 0.015932524576783, -0.014072568155825, 0.003679185174406, 0.003736274549738, -0.001313680666499, -0.000074791263614, 0.000044116175559, -0.000859573367052, 0.00134013290517, 0.0033442908898, -0.008053786121309, 0.00392530951649, 0.011236138641834, 0.000803714443464, -0.012560368515551, 0.007686838507652, -0.003762644715607, -0.004443590994924, 0.002180793788284, 0.000196855893591, -0.000189975791727 ], [ 0.037760313600302, 0.004615739919245, -0.018646573647857, -0.058486759662628, -0.009487068280578, -0.000282382563455, -0.024771044030786, 0.034931447356939, 0.054950423538685, 0.013220380991697, 0.000895575853065, -0.004350157920271, 0.025268515571952, 0.020395550876856, -0.036657389253378, -0.046513065695763, -0.014987703412771, -0.001511706970632, 0.007821995764971, 0.00136927026324, 0.003532155882567, -0.029652805998921, -0.009161800146103, 0.03348184376955, 0.035593848675489, 0.014541981741786, 0.001771300449036, -0.009800049476326, -0.003046120284125, 0.002950586145744, -0.01337550021708, 0.002307863673195, 0.021059226244688, 0.001385809271596, -0.027201445773244, -0.024239867925644, -0.012176465243101, -0.00146982492879, 0.010184438899159, 0.004239108413458, -0.004168876446784, -0.001677466090769, 0.003025805344805, 0.009534877724946, -0.00454220501706, -0.012601114809513, 0.003002109006047, 0.019557628780603, 0.014084665104747, 0.008576112799346, 0.000631609000266, -0.00927547365427, -0.00451418897137, 0.004025873262435, 0.002550626173615, -0.001085804426111, 0.001847913837992, -0.002455104142427, -0.003131526522338, 0.003880883334205, 0.005837651435286, -0.004496682435274, -0.01205197814852, -0.006204143632203 ], [ 0.037762716412544, 0.018649768084288, 0.058489039540291, 0.004615449346602, 0.000279668602161, 0.03493594378233, 0.059973351657391, 0.009487268514931, -0.006024907808751, -0.002473492641002, 0.000890840776265, 0.044457014650106, 0.049257408827543, 0.013889807276428, -0.012362110428512, 0.000909195747226, 0.000748520193156, -0.0055016502738, 0.001893233624287, 0.044385861605406, 0.032762490212917, 0.016788883134723, -0.016989033669233, 0.00202182168141, 0.001002343837172, 0.00034194329055, 0.001756874844432, -0.008200131356716, 0.003053939901292, 0.035984735935926, 0.016608448699117, 0.017514353618026, -0.01769551821053, 0.003064334858209, 0.002368568442762, -0.000529256882146, -0.000330898474203, 0.000837576109916, 0.002772686537355, -0.009261208586395, 0.003895443165675, 0.023361325263977, 0.004966514650732, 0.015948303043842, -0.014083062298596, 0.003674055216834, 0.003739175153896, -0.001310424529947, -0.000076469252235, 0.000043097057642, -0.000853607954923, 0.001349512604065, 0.003354345448315, -0.008045751601458, 0.003916318528354, 0.011226282455027, -0.000803149014246, 0.012576960027218, -0.007697680965066, 0.003760407213122, 0.004444230813533, -0.002178627764806, -0.000200858237804, 0.000187458033906 ], [ 0.037750564515591, 0.004610534757376, 0.018634563311934, 0.058476179838181, 0.009478013962507, 0.000280059030047, -0.024771498516202, 0.03491199016571, 0.054948721081018, 0.013210874050856, 0.000891045026947, -0.004346891772002, -0.025255586951971, -0.020403858274221, 0.036643087863922, 0.046521719545126, 0.014981060288846, 0.001507068402134, -0.007817896082997, -0.00136616686359, 0.003539992729202, -0.029640857130289, -0.009173752740026, 0.033477190881968, 0.035609874874353, 0.014539556577802, 0.001769255148247, -0.009796851314604, -0.003042116062716, 0.002950065070763, 0.013369299471378, -0.002298212610185, -0.021054683253169, -0.00139694637619, 0.027206378057599, 0.024257035925984, 0.012176886200905, 0.001472093164921, -0.010182638652623, -0.004236995242536, 0.004168602172285, 0.001677298452705, 0.003021659096703, 0.009528689086437, -0.004535643849522, -0.012602002359927, 0.002995083807036, 0.019568102434278, 0.014096272177994, 0.008575883693993, 0.000637971388642, -0.009274545125663, -0.004515591543168, 0.004025580827147, 0.002552984515205, -0.001083846786059, -0.001842237543315, 0.002451946027577, 0.003127549309283, -0.003876874921843, -0.005840320605785, 0.00449476018548, 0.012062101624906, 0.006205630954355 ], [ 0.03775654733181, -0.018647037446499, -0.058480314910412, 0.004610928241163, -0.000274313264526, 0.034930646419525, 0.059966556727886, -0.009480278939009, -0.006028898060322, 0.002479654503986, 0.000880208390299, -0.044450353831053, -0.049255508929491, 0.013884124346077, 0.0123690078035, 0.000910320843104, -0.000746850913856, -0.005514230113477, -0.001879534916952, 0.044380638748407, 0.032766029238701, -0.016788342967629, -0.016996216028929, -0.002024508081377, 0.001006262260489, -0.000344151689205, 0.001752557815053, 0.00821675453335, 0.003041533520445, -0.035984016954899, -0.016615113243461, 0.017520533874631, 0.017700163647532, 0.003068894380704, -0.002376574557275, -0.000528339820448, 0.000331427523633, 0.000841865432449, -0.002765195677057, -0.009277016855776, -0.003888835432008, 0.023366432636976, 0.004972172435373, -0.015959376469254, -0.014084221795201, -0.003680507419631, 0.003749212017283, 0.001307666650973, -0.000078367338574, -0.000041141247493, -0.000854647194501, -0.001353983883746, 0.00334460940212, 0.008056261576712, 0.003917975351214, -0.011235254816711, 0.000802085152827, 0.012588365934789, 0.007696900516748, 0.003768551163375, -0.004451940301806, -0.002173078246415, 0.000204967756872, 0.000188684702152 ], [ 0.037755869328976, -0.058480113744736, 0.004609599709511, -0.018643748015165, 0.034926496446133, -0.009477730840445, -0.035201136022806, -0.00027409021277, -0.048921316862106, 0.031370762735605, 0.000879474682733, 0.039936535060406, -0.007781615946442, 0.0135070187971, -0.011530467309058, 0.042418517172337, -0.039569884538651, 0.012618466280401, -0.020838113501668, 0.011251977644861, 0.022525101900101, -0.000034807188058, 0.026149617508054, 0.002020759042352, 0.013116935268044, -2.496174602129031e-6, -0.003508256049827, -0.012223951518536, -1.272751205760869e-6, -0.021103464066982, 0.006508336868137, -0.008129447698593, 0.011011687107384, -0.021096983924508, 0.012367651797831, -0.029175166040659, 0.016344737261534, -0.010643180459738, 0.015970498323441, -0.010284841060638, 0.010500523261726, -0.007132211700082, -0.009835164994001, 0.000720482843462, -0.010319206863642, -0.000444978184532, -0.001860836637206, -0.004704987630248, 0.005515500437468, -0.004598728381097, 0.004896992817521, -0.0032047634013, 0.001165997586213, 0.002268213313073, -0.001375504536554, 0.006569810211658, -0.002434794558212, 0.003405656432733, -0.005621323827654, 0.008430273272097, -0.008816292509437, 0.008717259392142, -0.00788676738739, 0.005837006960064 ], [ 0.037757098674774, 0.05848577991128, 0.004607169423252, 0.018631219863892, 0.034907229244709, 0.009473978541791, -0.03519919142127, 0.000266870774794, -0.04893759265542, -0.031396452337503, 0.000864778005052, -0.039934180676937, -0.007776259444654, -0.013498944230378, -0.011530531570315, -0.042403288185596, -0.039565328508615, -0.012624964118004, -0.020829314365983, -0.011244570836425, 0.022518999874592, 0.000041697898268, 0.026151318103075, -0.002002242254093, 0.013142704032362, 0.00001771638199, -0.003491340437904, 0.012227447703481, 8.362646440218668e-6, 0.021095560863614, 0.006502074655145, 0.008125367574394, 0.011006100103259, 0.021094342693686, 0.01238003000617, 0.029178619384766, 0.016346614807844, 0.010657692328095, 0.015976060181856, 0.010279602371156, 0.010497369803488, 0.007124535739422, -0.009828257374465, -0.00072209443897, -0.010314392857254, 0.000436906790128, -0.001860473887064, 0.004694387316704, 0.005514555145055, 0.004605869296938, 0.00489468453452, 0.003213214455172, 0.001161478459835, -0.002265200251713, -0.001374290906824, -0.006562244147062, -0.002431160304695, -0.003404367249459, -0.005613741464913, -0.008430430665612, -0.00880831386894, -0.008727481588721, -0.007897799834609, -0.005828758236021 ] ], "Routing": [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36 ] }, "LoudspeakerLayout": { "Name": "A loudspeaker layout", "Loudspeakers": [ { "Azimuth": -31.10589599609375, "Elevation": 53.6513671875, "Radius": 1.0, "IsImaginary": false, "Channel": 1, "Gain": 1.0 }, { "Azimuth": 110.815391540527344, "Elevation": 30.495817184448242, "Radius": 1.0, "IsImaginary": false, "Channel": 2, "Gain": 1.0 }, { "Azimuth": 148.89410400390625, "Elevation": 53.6513671875, "Radius": 1.0, "IsImaginary": false, "Channel": 3, "Gain": 1.0 }, { "Azimuth": 32.213851928710938, "Elevation": -17.830373764038086, "Radius": 1.0, "IsImaginary": false, "Channel": 4, "Gain": 1.0 }, { "Azimuth": 69.184608459472656, "Elevation": -30.495817184448242, "Radius": 1.0, "IsImaginary": false, "Channel": 5, "Gain": 1.0 }, { "Azimuth": -32.213836669921875, "Elevation": 17.830373764038086, "Radius": 1.0, "IsImaginary": false, "Channel": 6, "Gain": 1.0 }, { "Azimuth": -69.184600830078125, "Elevation": 30.495817184448242, "Radius": 1.0, "IsImaginary": false, "Channel": 7, "Gain": 1.0 }, { "Azimuth": -147.786148071289062, "Elevation": -17.830373764038086, "Radius": 1.0, "IsImaginary": false, "Channel": 8, "Gain": 1.0 }, { "Azimuth": -110.815383911132812, "Elevation": -30.495817184448242, "Radius": 1.0, "IsImaginary": false, "Channel": 9, "Gain": 1.0 }, { "Azimuth": 147.786148071289062, "Elevation": 17.830373764038086, "Radius": 1.0, "IsImaginary": false, "Channel": 10, "Gain": 1.0 }, { "Azimuth": 31.105897903442383, "Elevation": -53.6513671875, "Radius": 1.0, "IsImaginary": false, "Channel": 11, "Gain": 1.0 }, { "Azimuth": -148.89410400390625, "Elevation": -53.6513671875, "Radius": 1.0, "IsImaginary": false, "Channel": 12, "Gain": 1.0 }, { "Azimuth": -21.245880126953125, "Elevation": -47.775321960449219, "Radius": 1.0, "IsImaginary": false, "Channel": 13, "Gain": 1.0 }, { "Azimuth": -108.2041015625, "Elevation": 38.7823486328125, "Radius": 1.0, "IsImaginary": false, "Channel": 14, "Gain": 1.0 }, { "Azimuth": 158.754104614257812, "Elevation": -47.775321960449219, "Radius": 1.0, "IsImaginary": false, "Channel": 15, "Gain": 1.0 }, { "Azimuth": 139.773834228515625, "Elevation": -14.094846725463867, "Radius": 1.0, "IsImaginary": false, "Channel": 16, "Gain": 1.0 }, { "Azimuth": -71.7958984375, "Elevation": -38.7823486328125, "Radius": 1.0, "IsImaginary": false, "Channel": 17, "Gain": 1.0 }, { "Azimuth": -139.773834228515625, "Elevation": 14.094846725463867, "Radius": 1.0, "IsImaginary": false, "Channel": 18, "Gain": 1.0 }, { "Azimuth": 71.7958984375, "Elevation": 38.7823486328125, "Radius": 1.0, "IsImaginary": false, "Channel": 19, "Gain": 1.0 }, { "Azimuth": -40.226165771484375, "Elevation": -14.094846725463867, "Radius": 1.0, "IsImaginary": false, "Channel": 20, "Gain": 1.0 }, { "Azimuth": 108.2041015625, "Elevation": -38.7823486328125, "Radius": 1.0, "IsImaginary": false, "Channel": 21, "Gain": 1.0 }, { "Azimuth": 40.226161956787109, "Elevation": 14.094846725463867, "Radius": 1.0, "IsImaginary": false, "Channel": 22, "Gain": 1.0 }, { "Azimuth": 21.245889663696289, "Elevation": 47.775321960449219, "Radius": 1.0, "IsImaginary": false, "Channel": 23, "Gain": 1.0 }, { "Azimuth": -158.754104614257812, "Elevation": 47.775321960449219, "Radius": 1.0, "IsImaginary": false, "Channel": 24, "Gain": 1.0 }, { "Azimuth": 106.650497436523438, "Elevation": -2.55185604095459, "Radius": 1.0, "IsImaginary": false, "Channel": 25, "Gain": 1.0 }, { "Azimuth": -2.66339111328125, "Elevation": -16.633504867553711, "Radius": 1.0, "IsImaginary": false, "Channel": 26, "Gain": 1.0 }, { "Azimuth": -73.349517822265625, "Elevation": -2.55185604095459, "Radius": 1.0, "IsImaginary": false, "Channel": 27, "Gain": 1.0 }, { "Azimuth": -98.841033935546875, "Elevation": 73.160560607910156, "Radius": 1.0, "IsImaginary": false, "Channel": 28, "Gain": 1.0 }, { "Azimuth": -177.336624145507812, "Elevation": 16.633504867553711, "Radius": 1.0, "IsImaginary": false, "Channel": 29, "Gain": 1.0 }, { "Azimuth": 98.841026306152344, "Elevation": -73.160560607910156, "Radius": 1.0, "IsImaginary": false, "Channel": 30, "Gain": 1.0 }, { "Azimuth": 177.336624145507812, "Elevation": -16.633504867553711, "Radius": 1.0, "IsImaginary": false, "Channel": 31, "Gain": 1.0 }, { "Azimuth": 81.158973693847656, "Elevation": 73.160560607910156, "Radius": 1.0, "IsImaginary": false, "Channel": 32, "Gain": 1.0 }, { "Azimuth": 2.663379430770874, "Elevation": 16.633504867553711, "Radius": 1.0, "IsImaginary": false, "Channel": 33, "Gain": 1.0 }, { "Azimuth": -81.158966064453125, "Elevation": -73.160560607910156, "Radius": 1.0, "IsImaginary": false, "Channel": 34, "Gain": 1.0 }, { "Azimuth": -106.650497436523438, "Elevation": 2.55185604095459, "Radius": 1.0, "IsImaginary": false, "Channel": 35, "Gain": 1.0 }, { "Azimuth": 73.349502563476562, "Elevation": 2.55185604095459, "Radius": 1.0, "IsImaginary": false, "Channel": 36, "Gain": 1.0 } ] } }././@LongLink0000644000000000000000000000015200000000000011601 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/SimpleDecoder/Source/Presets/7point1.jsonIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/SimpleDecoder/Source/Presets/7point10000664002537200253720000003337015257173642031465 0ustar zmoelnigzmoelnig{ "Decoder": { "Name": "7.1 Decoder (SMPTE ST 429-2:2019 A.7)", "Description": "Channel order: L R C LFE LS RS LRS RRS", "ExpectedInputNormalization": "n3d", "Weights": "none", "WeightsAlreadyApplied": false, "SubwooferChannel" : 4, "Matrix": [ [ 0.1247100457549095, 0.1156333684921265, -0.00001732831697154325, 0.1220642551779747, 0.1349939107894897, 2.276328132211347e-6, -0.02509522438049316, -9.187912837660406e-6, 0.01104891113936901, 0.07653194665908813, 3.176553263983806e-6, 0.01142172608524561, -0.00001426382004865445, 0.0005167138879187405, -0.0000113395944936201, -0.0539543516933918, 0.01769397594034672, 4.023310793854762e-6, 0.0227437075227499, 1.835525836213492e-6, -0.00332503579556942, -9.756521421877551e-7, -0.008843930438160896, -0.00001205112857860513, -0.05033057183027267, -0.0005822542007081211, 1.639125798647001e-6, 0.011294218711555, -1.150469415733824e-6, 0.004953095223754644, -0.00001645842348807491, 0.001491092727519572, -9.249350114259869e-6, -0.01935980468988419, -0.00001273622001463082, -0.02312725223600864, 0.004541286733001471, 6.480582896983833e-7, -0.0008916010847315192, 2.891224539780524e-6, 0.009377460926771164, 2.541055664551095e-6, -0.0008882987895049155, 6.440585366362939e-6, -0.003331201616674662, -7.095425189618254e-6, -0.01371833030134439, -0.00001055760640156223, -0.01151451840996742, 0.005410703364759684, 6.624863431170525e-7, -0.001142910216003656, 2.936938471975736e-6, 0.005089737474918365, -6.108877641963772e-6, 0.004304434172809124, -0.00002504302028683014, 0.0001156914368038997, -0.00001010729920380982, -0.008191497996449471, -0.00001528158645669464, -0.005706622265279293, -0.00001051885828928789, -0.01375880744308233 ], [ 0.1247239336371422, -0.1156497895717621, -0.00001472433177696075, 0.1220667958259583, -0.1349934190511703, -1.288488874706673e-6, -0.0250899400562048, -0.00001314271685259882, 0.01103533338755369, -0.07651913911104202, 9.390388413521578e-7, -0.01142883859574795, -8.023525879252702e-6, 0.0005280375480651855, -0.00001549333319417201, -0.05395233258605003, -0.01769709587097168, 3.260402763771708e-6, -0.02274879813194275, 2.806157453960623e-6, -0.003316686255857348, -7.632826850567653e-7, -0.008842228911817074, -9.987480552808847e-6, -0.05031812936067581, 0.0005695740110240877, -1.467264155508019e-6, -0.01129832677543163, 1.60983208985499e-8, -0.004973653238266706, -4.330408501118654e-6, 0.001509967027232051, -7.766344424453564e-6, -0.01935970224440098, -7.266725333465729e-6, -0.02313168905675411, -0.004536372609436512, -2.411039076832822e-6, 0.0008906878647394478, 4.077669927937677e-6, -0.009391854517161846, 7.566279123238928e-7, -0.0008939043618738651, 0.00001073208932211855, -0.003336124354973435, -8.049911230045836e-6, -0.01372120156884193, -0.00001073491330316756, -0.01152807474136353, -0.005397038068622351, 1.610948061170348e-6, 0.001145445159636438, 4.340551242876245e-7, -0.005098059773445129, -6.180822310852818e-6, -0.004320260137319565, -9.368234714202117e-6, 0.0001332847023149952, 3.26376380144211e-6, -0.008194556459784508, -5.534343927138252e-6, -0.005707568489015102, -0.00001036150842992356, -0.01375462021678686 ], [ 0.08563337475061417, 8.251575309259351e-6, 0.00001536988202133216, 0.1181350871920586, 0.00001092253751266981, -4.321560936659807e-6, -0.01355725713074207, -1.915583652589703e-6, 0.1057471930980682, 0.0000117244399007177, -7.715326319157612e-6, 7.00113014318049e-6, 0.0000290704847429879, 0.009390074759721756, 2.847830728569534e-6, 0.0890895277261734, 9.796491212910041e-6, -6.778787792427465e-6, 1.095445441023912e-6, 1.842467582946483e-7, -0.0005482042324729264, 0.00001004472505883314, 0.02069449983537197, 7.669453225389589e-6, 0.07055775076150894, 5.017953753849724e-6, -3.366915052538388e-6, -3.410902763789636e-6, -7.26722873878316e-6, 0.00001901891300803982, 0.00001555768540129066, 0.005497606471180916, 0.00001382332629873417, 0.02318507805466652, 0.00001459747727494687, 0.05196196958422661, -1.61897253292409e-6, 6.179492828550792e-8, -3.788722096942365e-6, -0.00001127369796449784, 0.00001750391675159335, 9.975203283829615e-6, 0.0008986691827885807, -0.00001082826929632574, 0.009924123995006084, 6.31157945463201e-6, 0.02082111500203609, 0.00001946052543644328, 0.03478286787867546, -8.194431757146958e-6, 1.962929673027247e-6, -9.856350970949279e-7, -8.429123226960655e-6, 7.020343673502794e-6, 9.083039913093671e-6, 0.00001829881330195349, 0.00002259017128380947, 0.004058558493852615, 7.662692041776609e-6, 0.01140546053647995, 4.813074156118091e-6, 0.0160179752856493, 0.00002010132811847143, 0.020129369571805 ], [ 0.125044122338295, 0.1719053983688354, -6.644491350016324e-6, 0.01072375010699034, 0.01807435601949692, -7.394652129733004e-6, -0.03872308880090714, -7.358165703408304e-7, -0.1355278789997101, -0.08815377950668335, -2.47987395596283e-6, -0.005030196625739336, 1.428383825441415e-6, -0.009483424946665764, -3.46525348504656e-6, -0.01655526831746101, -0.007466370239853859, -7.933785127534065e-6, -0.01163783203810453, -9.55409268499352e-6, -0.00475060660392046, 9.409310223418288e-6, -0.01577771827578545, 1.028064502861525e-6, 0.04472066462039948, 0.01423724554479122, -3.32823151438788e-6, -0.01864507049322128, 0.00001211178096127696, -0.0005244587082415819, 0.00001050007631420158, -0.0009046233608387411, 1.742203494359273e-6, 0.009591965936124325, 4.192195319774328e-6, -0.003668332006782293, -0.01108239032328129, -2.373284360146499e-6, 0.006846482865512371, -6.579930868610973e-6, -0.002829453209415078, -3.138773308819509e-6, -0.002639853628352284, 2.013844778048224e-6, -0.004881116561591625, -5.234396212472348e-6, 0.0121299410238862, 5.115542080602609e-6, 0.001445311820134521, 0.005997776985168457, 2.258898575746571e-6, 0.003571235574781895, -9.253392363461899e-7, -0.006140760146081448, 0.00001151179549196968, -0.000776633620262146, 0.00001239711218659068, -0.001867997227236629, 3.052967258554418e-6, 0.003327178303152323, 7.228869890241185e-6, -0.005052681546658278, 5.297529696690617e-6, 0.01205192692577839 ], [ 0.1250298470258713, -0.1718924641609192, 9.119144124269951e-7, 0.01072252076119184, -0.01807441189885139, -8.45396073145821e-8, -0.03872854262590408, -1.321247623309318e-6, -0.1355290859937668, 0.08816170692443848, 1.491632588113134e-6, 0.005046742502599955, 3.996989562438102e-6, -0.009477246552705765, -2.870428090773203e-7, -0.01655827462673187, 0.007472996599972248, 1.018344278236327e-6, 0.01162177603691816, -5.178715582587756e-6, -0.004743746947497129, 1.138304241976584e-6, -0.01577440835535526, 3.450058372322928e-8, 0.04472515359520912, -0.01423386484384537, 2.209846115874825e-6, 0.01865271665155888, -3.193575139448512e-6, 0.0005389876896515489, -1.723405830489355e-6, -0.0009205946698784828, 1.499549284744717e-6, 0.009584235958755016, -4.86621559048217e-7, -0.003662407165393233, 0.01108276564627886, 4.20329752159887e-6, -0.006851442623883486, -5.18966453455505e-6, 0.002825404750183225, -6.489960469480138e-6, -0.002617415506392717, -0.00001033109401760157, -0.00487607391551137, -2.206682893302059e-6, 0.01213769149035215, 3.191495352439233e-6, 0.00145298580173403, -0.006002514157444239, -1.939052935995278e-6, -0.003572994843125343, -2.203834355896106e-6, 0.006156403105705976, 0.00001565591628605034, 0.0007751290686428547, -9.631459761294536e-6, -0.001902192598208785, -5.785118446510751e-6, 0.003316047601401806, -1.53309008510405e-6, -0.005061488598585129, 6.142880920378957e-6, 0.01205914933234453 ], [ 0.1601133197546005, 0.09381464868783951, 4.154684120294405e-6, -0.1915152966976166, -0.1137058585882187, 2.810961859722738e-6, -0.06652813404798508, -2.816786036419217e-6, 0.07919143885374069, 0.05572371184825897, -2.264338263557875e-6, -0.01467252429574728, 4.063506366946967e-6, 0.01789657399058342, 6.507551688628155e-7, 0.006722507998347282, 0.009436933323740959, 2.307628619746538e-6, -0.006130654364824295, 7.201795142464107e-6, -0.004792885854840279, -5.040197720518336e-6, 0.01549618411809206, 2.55257987191726e-7, -0.02118153311312199, -0.02749543264508247, -2.160195663236664e-6, 0.0188131108880043, -7.693028237554245e-6, -0.00183330150321126, 6.533618801540797e-8, 0.006793906912207603, 6.160473908778386e-9, -0.009421944618225098, -1.353331413156411e-6, -0.001853985828347504, 0.008630247786641121, 7.781019917274534e-7, -0.009264625608921051, 5.822322236781474e-6, -0.0003452128148637712, 6.558332188433269e-6, -0.001835503266192973, -4.864658876613248e-6, 0.000782845716457814, 1.696819140306616e-6, -0.004234346561133862, 1.510154788775253e-6, 0.01256418786942959, 0.007660035975277424, 1.234104843206296e-6, -0.005360366310924292, 2.375367245122106e-7, 0.004576594568789005, -2.789229483823874e-6, -0.001867634477093816, -0.00001518022691016085, 0.003439286490902305, -8.859688023221679e-6, -0.002762055490165949, -3.267068905188353e-6, 0.004756701178848743, 4.080802114003745e-7, -0.002132919849827886 ], [ 0.1601294726133347, -0.09383247792720795, -3.135952056254609e-6, -0.1915212273597717, 0.1137079373002052, -3.862960511469282e-6, -0.0665331706404686, 3.064033080590889e-6, 0.07917341589927673, -0.05570525676012039, 1.9700744360307e-6, 0.01467948779463768, -6.865258001198526e-6, 0.01788598299026489, -4.172739409114001e-6, 0.006727628409862518, -0.009440797381103039, 2.582000661277561e-6, 0.006129092071205378, 1.095011270990653e-6, -0.004805970471352339, 7.628702405781951e-6, 0.01550203189253807, 1.602959741831e-6, -0.02116462215781212, 0.02747705020010471, -9.660185469329008e-7, -0.01881385780870914, 3.107293196080718e-6, 0.001827841624617577, 1.882573883449368e-6, 0.006798884365707636, -4.945904379383137e-7, -0.009411458857357502, 2.567425099186949e-6, -0.001858227886259556, -0.008625457994639874, -3.635219627540209e-6, 0.009260739199817181, -2.604922656246345e-6, 0.000344663712894544, 5.937964488111902e-6, -0.001859159674495459, 4.234058906149585e-6, 0.0007765325717628002, -2.998630634465371e-6, -0.004249743651598692, -1.480958189858939e-6, 0.01254552416503429, -0.007640199735760689, 2.758805976554868e-6, 0.005362811498343945, -2.798956586502754e-7, -0.004571453668177128, -3.568385864127777e-6, 0.001863400684669614, 9.375492481922265e-6, 0.003461923915892839, 3.110063289568643e-6, -0.002748837228864431, 5.75082958675921e-6, 0.004763651173561811, -1.963136810445576e-6, -0.002125859726220369 ] ], "Routing": [ 1, 2, 3, 5, 6, 7, 8 ] } } ././@LongLink0000644000000000000000000000016000000000000011600 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/SimpleDecoder/Source/Presets/t_design_24ch.jsonIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/SimpleDecoder/Source/Presets/t_desig0000664002537200253720000014104015257173642031574 0ustar zmoelnigzmoelnig{ "Name": "All-Round Ambisonic decoder (AllRAD) and loudspeaker layout", "Description": "This configuration file was created with the IEM AllRADecoder v0.9.5 plug-in. 8 Nov 2024 5:30:54pm", "Decoder": { "Name": "Decoder", "Description": "A 7th order Ambisonics decoder of a 6th order t-design (24 channels).", "ExpectedInputNormalization": "n3d", "Weights": "none", "WeightsAlreadyApplied": false, "Matrix": [ [ 0.05807739123702, 0.036932535469532, 0.020945837721229, 0.081171721220016, 0.059116099029779, 0.018151339143515, -0.043044935911894, 0.033887837082148, 0.051894601434469, 0.055555194616318, 0.031799808144569, -0.015078926458955, -0.027692921459675, -0.037856388837099, 0.021199412643909, 0.017039714381099, 0.034020695835352, 0.031413245946169, -0.014028777368367, -0.014647899195552, 0.01539490185678, -0.027447240427136, -0.01785746589303, 0.003074393142015, -0.004478598944843, 0.010944524779916, 0.01987568475306, -0.005802682135254, -0.016307640820742, 0.001813350245357, 0.013460499234498, 0.010075566358864, -0.010959303937852, -0.007498329970986, -0.008233246393502, -0.007401487324387, -0.00166998768691, 0.007025806698948, 0.000954718561843, -0.008624431677163, 0.000026335881557, 0.0038121342659, -0.003740570275113, 0.006910413037986, 0.005112040787935, -0.000941727310419, -0.005341853946447, -0.008609623648226, 0.000536088016815, -0.002749617677182, 0.000400870776502, 0.003132229438052, -0.00062758824788, -0.000277704850305, 0.000547832751181, -0.000373832881451, -0.000026021207304, -0.004341368097812, -0.00001122400954, 0.003422082401812, 0.000108579843072, -0.005988266319036, -0.002723237266764, 0.00792432948947 ], [ 0.058080162853003, -0.036939118057489, -0.020950358361006, 0.081172525882721, -0.059126205742359, 0.018151164054871, -0.04304176568985, -0.033894501626492, 0.051889281719923, -0.055564038455486, 0.031798515468836, 0.015080435201526, 0.027693577110767, -0.037848342210054, -0.021205889061093, 0.017029611393809, -0.03402654081583, 0.031410079449415, 0.014026742428541, -0.01464609708637, 0.015392739325762, 0.027444453909993, -0.017847115173936, -0.003081888658926, -0.004489087965339, -0.010949264280498, 0.019872233271599, 0.005794655065984, -0.016301592811942, -0.001812796574086, -0.013459577225149, 0.010075790807605, 0.010953969322145, -0.007490199524909, 0.00822286028415, -0.007408848032355, 0.001663486473262, 0.007025544531643, -0.000965885818005, -0.008612155914307, -0.000023567476092, 0.003814295632765, -0.003742384724319, -0.006910245865583, 0.005116037558764, 0.000939121760894, -0.005339649505913, 0.00859734043479, 0.00053207523888, 0.002740696305409, 0.000404602789786, -0.003141697496176, -0.000613544660155, 0.000279636762571, 0.000550811470021, 0.000367116823327, 0.00002951436727, -0.004344224464148, 0.000011796476429, 0.00342895439826, -0.000102445861557, -0.005991266574711, 0.002713820198551, 0.00792209431529 ], [ 0.047842796891928, 0.021085627377033, -0.037146434187889, 0.063928708434105, 0.034182492643595, -0.018299011513591, -0.012833621352911, -0.059573210775852, 0.045024130493402, 0.035322673618793, -0.032164916396141, 0.000124019294162, 0.03512517362833, 0.007122061681002, -0.046500369906425, 0.022915821522474, 0.0273497402668, -0.033860005438328, 0.006714513991028, 0.010037845000625, -0.016366321593523, 0.027574364095926, 0.015756107866764, -0.02575789578259, 0.005720921326429, 0.016029180958867, -0.024904334917665, 0.010113479569554, 0.009612499736249, -0.005429027602077, -0.00606777658686, -0.019477052614093, 0.008804301731288, 0.012851399369538, -0.008420920930803, -0.003362274030223, 0.006388891022652, -0.012079084292054, 0.007298345211893, 0.00479294359684, -0.006090043578297, -0.001182489097118, 0.007650428451598, 0.000291897711577, -0.009150993078947, -0.000743276206776, 0.00666331127286, 0.000164824523381, -0.005526050459594, 0.000693236419465, -0.002010484458879, 0.001126188784838, 0.001406105235219, -0.002223423914984, -0.00083008868387, 0.001258491771296, -0.000064253916207, 0.002903922926635, 0.001133916433901, -0.001491607166827, -0.00281544495374, 0.003222633618861, 0.000985976541415, -0.004083325155079 ], [ 0.04786491394043, -0.021087061613798, 0.0371706597507, 0.063950523734093, -0.034178480505943, -0.01830205693841, -0.012827532365918, 0.059601720422506, 0.045031070709229, -0.035310424864292, -0.03216066211462, -0.000127046616399, -0.035136319696903, 0.007136971224099, 0.046509023755789, 0.02291408739984, -0.027333011850715, -0.03384243324399, -0.006712085101753, 0.010037150233984, -0.016379456967115, -0.027575498446822, 0.015755474567413, 0.025755008682609, 0.005717202089727, -0.016012869775295, -0.024881133809686, -0.010096177458763, 0.009612946771085, 0.005432247649878, 0.006059768609703, -0.019480543211102, -0.008811324834824, 0.012838289141655, 0.008419596590102, -0.003366332268342, -0.006374143995345, -0.012063727714121, -0.00727242231369, 0.004803573712707, 0.006092545110732, -0.001176651800051, 0.007644490804523, -0.00029448850546, -0.00914988014847, 0.000723752309568, 0.006653874181211, -0.000161412375746, -0.005531770177186, -0.000677862670273, -0.002009026939049, -0.001109861419536, 0.001426609931514, 0.002228660741821, -0.000821891473606, -0.001256111892872, 0.000061325925344, 0.002896500285715, -0.00112647539936, -0.00149860419333, 0.002794514643028, 0.003224190091714, -0.000984766869806, -0.004090487025678 ], [ 0.058078873902559, 0.036934286355972, -0.020949300378561, -0.081173703074455, -0.059118036180735, -0.018152477219701, -0.043047767132521, 0.033893790096045, 0.051895465701818, 0.055555868893862, 0.031799733638763, -0.015081302262843, 0.02770091407001, 0.037860095500946, -0.021202560514212, -0.017040830105543, -0.034021485596895, -0.0314080119133, 0.014030550606549, 0.014651728793979, 0.015399660915136, -0.027457758784294, -0.017858421429992, 0.00307524506934, -0.004475872498006, 0.01094754319638, 0.019866531714797, -0.005801070015877, -0.01630949229002, 0.001813937094994, -0.013473599217832, -0.010080948472023, 0.010962041094899, 0.007497071754187, 0.008230687119067, 0.007398988120258, 0.001665610470809, -0.007019056472927, -0.000960599863902, 0.0086171599105, -0.000026065037673, -0.00381810660474, -0.003741686465219, 0.006924365647137, 0.00511665455997, -0.000940005411394, -0.00533993029967, -0.008605010807514, 0.000534861930646, -0.002747420687228, 0.000400075368816, 0.003141812281683, -0.000613951764535, -0.000276309932815, 0.000552257348318, -0.000368252425687, 0.000035323035263, 0.004341786261648, 6.78317610436352e-6, -0.003424502909184, -0.000106254148704, 0.005987806245685, 0.002721633762121, -0.007918500341475 ], [ 0.05808873847127, -0.036943305283785, 0.020955814048648, -0.081179678440094, 0.059122212231159, -0.018163811415434, -0.043046701699495, -0.033897828310728, 0.051886845380068, -0.05554473400116, 0.031815569847822, 0.015082377940416, -0.027698056772351, 0.037850666791201, 0.021194951608777, -0.017029924318194, 0.034003812819719, -0.031419105827808, -0.014028678648174, 0.014655414968729, 0.015396028757095, 0.027443308383226, -0.017845680937171, -0.003060918767005, -0.004472937900573, -0.010943216271698, 0.01987038180232, 0.005797457415611, -0.016312083229423, -0.001821482670493, 0.013457768596709, -0.010079183615744, -0.010946453548968, 0.007486928720027, -0.008241629227996, 0.007383235730231, -0.001649387762882, -0.007019647862762, 0.000960939913057, 0.008622352033854, 0.000039667356759, -0.003816696582362, -0.003751005511731, -0.006905752699822, 0.005109283607453, 0.000930044101551, -0.005334545392543, 0.008606323972344, 0.000544776383322, 0.002726049162447, 0.000401602912461, -0.003135627834126, -0.000624401145615, 0.000268169824267, 0.000553988909815, 0.000385715509765, -0.000026712385079, 0.004351305775344, -0.00001551362584, -0.003410883015022, 0.000112712848932, 0.005983287934214, -0.002714255591854, -0.007908524014056 ], [ 0.047858998179436, 0.021091504022479, 0.037160396575928, -0.063945218920708, -0.034187912940979, 0.0183049980551, -0.012830127961934, -0.059586051851511, 0.045031234622002, 0.035324104130268, -0.032167848199606, 0.000128417799715, -0.035123981535435, -0.007128424476832, 0.046499721705914, -0.022917650640011, -0.027348592877388, 0.03385328873992, -0.006718029733747, -0.010035568848252, -0.01636703684926, 0.027564063668251, 0.015751065686345, -0.025751708075404, 0.005721669644117, 0.016028147190809, -0.02489179186523, 0.010107674635947, 0.009607235901058, -0.005432179197669, 0.006060406100005, 0.019467229023576, -0.008800083771348, -0.012838791124523, 0.008419395424426, 0.003362018149346, -0.006388083100319, 0.01207019854337, -0.007284533698112, -0.004791296552867, 0.006092580966651, 0.001176956342533, 0.007643079850823, 0.00029246401391, -0.009139654226601, -0.000737552589271, 0.006655151955783, 0.000159227012773, -0.005527393892407, 0.000690592569299, -0.002011012053117, 0.001114559359848, 0.001410470344126, -0.002226618351415, -0.000821259571239, 0.001260024262592, 0.000062627703301, -0.002900677500293, -0.00112818996422, 0.001486435183324, 0.002807324752212, -0.003224577987567, -0.000979234813713, 0.004085384774953 ], [ 0.047853495925665, -0.021087428554893, -0.037157129496336, -0.063939154148102, 0.034183692187071, 0.018301084637642, -0.012827960774302, 0.059582911431789, 0.045029252767563, -0.035322304815054, -0.032164931297302, -0.000126811122755, 0.035121724009514, -0.007129994686693, -0.046501290053129, -0.022917866706848, 0.027347756549716, 0.033855888992548, 0.006716840900481, -0.010036753490567, -0.016367403790355, -0.027563503012061, 0.01575368270278, 0.025755787268281, 0.005721176043153, -0.016024596989155, -0.024898493662477, -0.010111776180565, 0.009611999616027, 0.005432890262455, -0.006059951614588, 0.019468452781439, 0.008800992742181, -0.01284131873399, -0.008422245271504, 0.00336377741769, 0.006379540078342, 0.012075990438461, 0.007294009905308, -0.00479600019753, -0.006098943762481, 0.001180298626423, 0.007642037700862, -0.000292764016194, -0.009141210466623, 0.000735988258384, 0.0066540222615, -0.000157630929607, -0.005528698675334, -0.00067739241058, -0.002013169461861, -0.001124823349528, 0.001412352314219, 0.002237038686872, -0.000823318725452, -0.001266061561182, -0.000059899564803, -0.002897588070482, 0.001128955977038, 0.001485853572376, -0.002802698174492, -0.003219579812139, 0.000975010392722, 0.004084608517587 ], [ 0.047864280641079, 0.063952885568142, 0.037167485803366, 0.021081013604999, 0.034171596169472, 0.059597115963697, -0.012828318402171, 0.018297526985407, -0.045040186494589, -0.022926459088922, 0.032153964042664, 0.007132449187338, -0.035130355507135, 0.000130477899802, -0.046509031206369, -0.03530927747488, -0.027338989078999, -0.025758629664779, 0.006716149393469, -0.027570560574532, -0.016374574974179, -0.010031349025667, -0.015749054029584, -0.033838048577309, 0.005725333932787, -0.003366972086951, -0.024880575016141, -0.012832562439144, -0.009603816084564, -0.019473969936371, 0.00605862820521, -0.005434543825686, 0.00881115719676, -0.010098780505359, 0.008421594277024, 0.016021383926272, 0.006379561498761, -0.000165312114405, -0.007272382732481, -0.000722261902411, -0.006094897631556, -0.000292744720355, 0.007644225843251, 0.001169934286736, 0.009144091047347, 0.004794623237103, 0.006650644354522, 0.012064165435731, 0.005538559984416, 0.004095987416804, 0.002006726805121, 0.003223326988518, 0.001420806860551, 0.001493363175541, 0.000810822006315, 0.002899767365307, 0.000062358398282, 0.001258169882931, 0.001122094225138, 0.002227691467851, 0.002796698594466, 0.001107297372073, 0.000993716996163, -0.000679344986565 ], [ 0.04785742983222, 0.063944727182388, -0.037159193307161, -0.021086478605866, -0.034183233976364, -0.059585019946098, -0.012827913276851, 0.01829738356173, -0.045035623013973, -0.022924488410354, 0.032159492373466, 0.007129387930036, 0.035117786377668, -0.000123165125842, 0.046505685895681, 0.035322863608599, 0.0273491833359, 0.02576238848269, -0.006710619665682, 0.027559380978346, -0.016360567882657, -0.010035482235253, -0.01575537584722, -0.033851284533739, 0.005727422889322, -0.003358451649547, -0.024895418435335, -0.012846765108407, -0.009610675275326, -0.019459305331111, -0.006062768865377, 0.005428521893919, -0.00879948027432, 0.010106567293406, -0.008428401313722, -0.016026947647333, -0.006383123341948, 0.000154357912834, 0.007292054593563, 0.000737495080102, 0.006092013791203, 0.000284196954453, 0.007638843264431, 0.00117963028606, 0.009139485657215, 0.004794395994395, 0.006660210434347, 0.012072711251676, 0.005525243002921, 0.004084588494152, 0.002007318194956, 0.003222209634259, 0.001409035758115, 0.001490403315984, 0.00082341034431, 0.00290287239477, -0.000054651776736, -0.001258054748178, -0.001123590627685, -0.002231721067801, -0.002805219497532, -0.001124160480686, -0.000974916503765, 0.000682015728671 ], [ 0.058077923953533, 0.081170290708542, 0.020944630727172, -0.036937326192856, -0.059122677892447, 0.033884357661009, -0.043044712394476, -0.018152004107833, -0.051888037472963, -0.017029045149684, -0.031797509640455, -0.037855304777622, -0.027691153809428, 0.015078568831086, -0.021194232627749, 0.055560417473316, 0.034024033695459, -0.003073215018958, 0.014026871882379, -0.027443885803223, 0.015392473898828, 0.014648188836873, 0.017858045175672, 0.031404986977577, -0.004490396007895, -0.007412043400109, 0.019865011796355, 0.007500810083002, 0.016306195408106, 0.010073148645461, 0.01345728058368, -0.001808341126889, 0.010957791469991, -0.005801536142826, -0.008223946206272, -0.010947734117508, 0.001664811046794, -0.008590360172093, 0.000954662798904, 0.000945741368923, -0.000018267563064, 0.006905957590789, -0.003738299245015, -0.003810732858256, -0.005113010760397, -0.008623216301203, -0.00534353684634, -0.007020265329629, -0.000527348252945, -0.00791687797755, -0.000403616606491, -0.005987812299281, -0.000629914400633, -0.003425260772929, -0.000547201489098, -0.004340800456703, -0.000020935234716, 0.000371022062609, 0.000012273240827, -0.000287533359369, 0.000099757955468, -0.003133510705084, 0.002702587051317, -0.002741849748418 ], [ 0.058078780770302, 0.08116839081049, -0.020945420488715, 0.036947086453438, 0.05913595482707, -0.033886756747961, -0.043046128004789, -0.018148167058825, -0.051879584789276, -0.017018163576722, -0.031790740787983, -0.037856385111809, 0.02769211679697, -0.015083556063473, 0.021199766546488, -0.055568922311068, -0.034025482833385, 0.003080004360527, -0.014030718244612, 0.027448004111648, 0.015396556816995, 0.014640162698925, 0.017857380211353, 0.031400073319674, -0.004495796281844, -0.007408224511892, 0.019865546375513, 0.007501773536205, 0.016292609274387, 0.010078827850521, -0.013461663387716, 0.001810685847886, -0.010966196656227, 0.005800754297525, 0.008222338743508, 0.010946156457067, -0.001665528630838, 0.008600294589996, -0.000958386517595, -0.000956096104346, 0.000020346771635, -0.006915546022356, -0.00374121312052, -0.003803928149864, -0.005118566565216, -0.008609188720584, -0.005349245853722, -0.007024448830634, -0.000537261017598, -0.007927129045129, -0.000405955768656, -0.005997942760587, -0.000619378115516, -0.003430386073887, -0.000537980464287, -0.004343192093074, 0.000028220936656, -0.000366778258467, -1.262962314285687e-6, 0.000283641624264, -0.000092720467364, 0.003135913982987, -0.002723455894738, 0.002742209937423 ], [ 0.047856319695711, -0.063944876194, 0.037161067128181, -0.021076574921608, 0.034167408943176, -0.059591986238956, -0.012827653437853, -0.018291963264346, -0.045037463307381, 0.022926652804017, 0.032151430845261, -0.007134458050132, -0.035127107053995, -0.000124889920698, -0.046512175351381, 0.035306461155415, -0.027335548773408, 0.025762179866433, 0.006711489986628, 0.027568109333515, -0.016372561454773, 0.010034408420324, -0.015761306509376, 0.033844247460365, 0.005728533491492, 0.003357840003446, -0.024890229105949, 0.012846706435084, -0.009612353518605, 0.019475957378745, 0.006060379557312, 0.00542856566608, 0.00879988539964, 0.01010665576905, 0.00841819960624, -0.016017196699977, 0.006378252524883, 0.000172452855622, -0.007291410118341, 0.000741636089515, -0.006093601696193, 0.000295751844533, 0.007645668461919, -0.001183337764814, 0.009145143441856, -0.004798977635801, 0.006650460883975, -0.012068025767803, 0.005522815044969, -0.004078488796949, 0.002002761233598, -0.003204602980986, 0.001414401340298, -0.001485850778408, 0.000830444332678, -0.002898785052821, 0.000063791238063, -0.001263246056624, 0.001131241675466, -0.002234732266515, 0.002808872610331, -0.001122690970078, 0.000994496163912, 0.000684122904204 ], [ 0.047856405377388, -0.063949920237064, -0.037152651697397, 0.021078446879983, -0.034174464643002, 0.059582382440567, -0.012838490307331, -0.01828845590353, -0.045046605169773, 0.02293493039906, 0.032148562371731, -0.007116923574358, 0.035124372690916, 0.00011995062232, 0.046511106193066, -0.035318925976753, 0.027349032461643, -0.025769177824259, -0.006705545820296, -0.0275714751333, -0.016361370682716, 0.01003435999155, -0.015749843791127, 0.033845342695713, 0.005730663891882, 0.003363087540492, -0.024894108995795, 0.012845219112933, -0.009610429406166, 0.01946722343564, -0.006063527893275, -0.005429531913251, -0.008807138539851, -0.010103861801326, -0.008428435772657, 0.016025325283408, -0.006377422716469, -0.000163231045008, 0.007292135152966, -0.000734769972041, 0.006095126736909, -0.000292248296319, 0.007641723379493, -0.001176391728222, 0.009143725968897, -0.004792490508407, 0.006657734978944, -0.012070649303496, 0.005532008595765, -0.004086990375072, 0.002000874374062, -0.003217040328309, 0.001405229675584, -0.001488923095167, 0.000815305509605, -0.002896065125242, -0.000062204402639, 0.001260110992007, -0.001129477517679, 0.00223110569641, -0.002804797375575, 0.001124779926613, -0.000987626146525, -0.000675948220305 ], [ 0.058089390397072, -0.081183053553104, 0.020944414660335, 0.036946233361959, -0.059130169451237, -0.033882509917021, -0.043055415153503, 0.018152769654989, -0.051889184862375, 0.017023636028171, -0.031794011592865, 0.037866298109293, -0.027692949399352, -0.015078348107636, -0.021189644932747, -0.055557850748301, 0.034014549106359, 0.003071540268138, 0.014021587558091, 0.027446925640106, 0.015397402457893, -0.014647196978331, 0.017867365851998, -0.031394932419062, -0.004494337365031, 0.007414571009576, 0.019855853170156, -0.007509632967412, 0.016300303861499, -0.010078177787364, 0.013462598435581, 0.001798904268071, 0.010961260646582, 0.005794778000563, -0.008218344300985, 0.010939952917397, 0.001668038428761, 0.008583742193878, 0.000960092176683, -0.000951975933276, -2.808125827868935e-6, -0.006914456374943, -0.003735634963959, 0.00380727625452, -0.005123085342348, 0.008614334277809, -0.005346560850739, 0.007021408062428, -0.000520703091752, 0.007905201986432, -0.000413909147028, 0.005982074420899, -0.000623583153356, 0.003437344450504, -0.000539759173989, 0.004339675884694, -0.000027795913411, -0.000355556810973, 2.524297087802552e-6, 0.000299154373351, 0.000094160364824, 0.003141389461234, 0.002706221537665, 0.002744109602645 ], [ 0.058078989386559, -0.081172376871109, -0.020946230739355, -0.036938052624464, 0.059121713042259, 0.033888194710016, -0.043051153421402, 0.01815483905375, -0.051889564841986, 0.017034195363522, -0.031801711767912, 0.037862457334995, 0.027701355516911, 0.015085201710463, 0.021193508058786, 0.055556658655405, -0.034023199230433, -0.003066992852837, -0.014036055654287, -0.027456112205982, 0.015396687202156, -0.014657909050584, 0.0178592056036, -0.031404871493578, -0.004478852264583, 0.007400452625006, 0.019859671592712, -0.007498352322727, 0.016316434368491, -0.010074306279421, -0.013468945398927, -0.001812030444853, -0.010956548154354, -0.005809806287289, 0.008230865933001, -0.010956161655486, -0.001650643767789, -0.008595732972026, -0.000947357504629, 0.000935828953516, 0.000024312268579, 0.006911736913025, -0.00373766082339, 0.003816959215328, -0.005113491788507, 0.008622407913208, -0.005339937284589, 0.007015006616712, -0.000528233358636, 0.007904401049018, -0.000401957280701, 0.005984087008983, -0.000619632657617, 0.003424755064771, -0.000547281466424, 0.00434332061559, 0.000023136997697, 0.000372527429136, -0.000016779826183, -0.000275302183582, -0.00010632975318, -0.003127713687718, -0.002709418535233, -0.002734152367339 ], [ 0.047861486673355, 0.021092360839248, 0.063945896923542, 0.037166014313698, 0.018304506316781, 0.034187577664852, 0.045407835394144, 0.059595067054033, 0.011402384378016, 0.008948839269578, 0.032166622579098, 0.034167129546404, 0.013741672970355, 0.058278664946556, 0.019669225439429, 0.000700935430359, 0.002572187921032, 0.01594159938395, 0.035214450210333, 0.023201659321785, -0.010723343119025, 0.037710670381784, 0.020813819020987, 0.001074978034012, -0.000976271461695, 0.000310086761601, 0.004110510926694, 0.017120374366641, 0.026364058256149, 0.009737771004438, -0.018503399565816, 0.013577604666352, 0.014513563364744, 0.000833372410852, -0.001609676517546, -0.0001140633467, 0.000112495807116, 0.000057247289078, 0.003273173933849, 0.011367884464562, 0.012628429569304, 0.001253351569176, -0.01353984605521, -0.000701918674167, 0.005619331728667, 0.000098337201052, -0.001353018684313, 0.000387098640203, 0.000293247634545, 0.000148816194269, 0.000079555007687, -0.000991622451693, 0.000089559500339, 0.002639783080667, 0.002603308763355, -0.00055832642829, -0.00600453093648, -0.002630631672218, -0.000328987283865, -0.000559254782274, -0.000099875207525, 0.001686137984507, 0.001189575763419, 0.00003017740346 ], [ 0.047850824892521, -0.021081980317831, 0.063939206302166, -0.037152495235205, 0.018291592597961, -0.034179124981165, 0.04541552439332, -0.059581194072962, 0.011403835378587, -0.008947821334004, 0.032152235507965, -0.0341712012887, 0.013755227439106, -0.05827583745122, 0.019670940935612, -0.000711803673767, 0.002581471577287, -0.015943663194776, 0.035209219902754, -0.023215534165502, -0.01072009280324, -0.037715934216976, 0.020813636481762, -0.001088527729735, -0.000967522966675, -0.000321571889799, 0.004126983229071, -0.017126673832536, 0.026366485282779, -0.009749033488333, -0.018515061587095, -0.013577909208834, 0.014510235749185, -0.000838960579131, -0.001600305200554, 0.000110873377707, 0.000121115182992, -0.000075699601439, 0.00328859128058, -0.011373521760106, 0.012626780197024, -0.001255078357644, -0.013554941862822, 0.000713842164259, 0.005614571273327, -0.000092820337159, -0.001352976541966, -0.000388698128518, 0.000293518271064, -0.000154439054313, 0.000092667112767, 0.00097747053951, 0.000094214177807, -0.00263903150335, 0.00259133707732, 0.000559603096917, -0.006009411066771, 0.002648108638823, -0.000331493851263, 0.000566930917557, -0.0001113202743, -0.00168213667348, 0.001187963294797, -0.000030990144296 ], [ 0.058090023696423, -0.036943897604942, 0.081185296177864, 0.020945331081748, -0.018153972923756, -0.059127129614353, 0.06646953523159, 0.033884152770042, -0.011339481920004, 0.000714101246558, -0.031798023730516, -0.057561427354813, 0.036652352660894, 0.033710826188326, -0.01950347982347, -0.008917920291424, 0.002602375578135, 0.001097734784707, -0.034552868455648, -0.036775548011065, 0.012443961575627, 0.022612547501922, -0.020500600337982, -0.015853233635426, -0.000990204745904, 0.000113471287477, 0.004191264975816, 0.000860938685946, -0.025353200733662, -0.012483509257436, 0.003608486615121, 0.00904833432287, -0.014024352654815, -0.016937907785177, -0.001661175163463, 0.000316125224344, -0.000115657756396, -0.000389543769415, 0.003434400307015, 0.000131591572426, -0.011239373125136, 0.00187674339395, 0.00649250485003, 0.00050951592857, -0.004948131274432, -0.011054460890591, -0.001477058860473, 0.000064564803324, -0.000291587726679, 0.00002982539263, -0.000082663435023, -0.001695666229352, 0.000370030524209, -0.000510386365931, -0.000844520574901, 0.003798237768933, 0.01122972369194, -0.00129840860609, 0.001169092021883, -0.002166208345443, -0.000333389121806, -0.000991122797132, -0.00118762999773, -0.000151093874592 ], [ 0.058080073446035, 0.036927990615368, 0.081177592277527, -0.020950408652425, -0.018149739131331, 0.059112221002579, 0.06647215783596, -0.033895343542099, -0.011324357241392, -0.000708433508407, -0.031795755028725, 0.057561945170164, 0.036658089607954, -0.033725500106812, -0.019485315307975, 0.008910058066249, 0.00259805098176, -0.001089318655431, -0.034555416554213, 0.036787621676922, 0.012440988793969, -0.022624056786299, -0.020493604242802, 0.015846151858568, -0.00098471774254, -0.000104156897578, 0.004188749473542, -0.000854588579386, -0.025354621931911, 0.012490199878812, 0.003596002236009, -0.00905204936862, -0.014032432809472, 0.016939016059041, -0.00165353086777, -0.000319355487591, -0.000122340148664, 0.000403734418796, 0.003439057152718, -0.000130451429868, -0.011230980046093, -0.001884528901428, 0.006481699179858, -0.000508659752086, -0.004961733240634, 0.011060941033065, -0.001472447067499, -0.000073356422945, -0.000297557853628, -0.000031588289858, -0.000096694733656, 0.001705977600068, 0.000379877106752, 0.000508069992065, -0.000827627547551, -0.003812056733295, 0.011229512281716, 0.001296044094488, 0.001161442487501, 0.002166738733649, -0.000334447046043, 0.000977963907644, -0.001197315752506, 0.000154408975504 ], [ 0.047866839915514, -0.02109464071691, -0.0639533624053, 0.037167478352785, -0.018309252336621, 0.034188184887171, 0.045415200293064, -0.059595819562674, 0.011401598341763, -0.008952802047133, 0.032171864062548, -0.034162104129791, -0.013750230893493, 0.058277882635593, -0.019666336476803, 0.000700787000824, -0.002574734156951, 0.015947850421071, -0.035213749855757, 0.023191241547465, -0.010711863636971, -0.037710960954428, 0.020808771252632, -0.001072563813068, -0.00097249483224, -0.000313625409035, 0.004114876501262, -0.017124911770225, 0.026353858411312, -0.009727420285344, 0.018491096794605, 0.013582760468125, -0.014508672989905, 0.00082754844334, 0.001605341793038, -0.000107056126581, -0.000117279538244, 0.000063845938712, -0.003276493865997, 0.011367284692824, -0.01261194050312, 0.001249104971066, -0.013532902114093, 0.000692200963385, 0.00561714777723, -0.000090855457529, -0.001352011691779, -0.000397516763769, 0.000300903688185, -0.000154290915816, 0.000088019063696, 0.00098492950201, 0.000088591805252, -0.00263519375585, 0.002587579656392, 0.000555486243684, 0.006007839925587, -0.002622415544465, 0.000329596921802, -0.000565122289117, 0.000103398378997, 0.001694614882581, -0.001200672006235, 0.000037521960621 ], [ 0.047856811434031, 0.021088188514113, -0.063941024243832, -0.037163324654102, -0.018304105848074, -0.03418330475688, 0.045408062636852, 0.059589143842459, 0.011409657076001, 0.008954571560025, 0.032168071717024, 0.03416670486331, -0.013748727738857, -0.058270443230867, -0.019677791744471, -0.000709600863047, -0.002579882973805, -0.015952635556459, -0.035218294709921, -0.023205200210214, -0.01071172952652, 0.037703096866608, 0.020817304030061, 0.001084590097889, -0.000969631073531, 0.000317689555231, 0.004122388083488, 0.017133163288236, 0.026367159560323, 0.009742353111506, 0.018491918221116, -0.013573359698057, -0.014511677436531, -0.000835031154566, 0.001602911972441, 0.000109392523882, -0.00011948269821, -0.000067760644015, -0.003281712066382, -0.011377405375242, -0.012625812552869, -0.001257247058675, -0.013532850891352, -0.000703804718796, 0.00561850797385, 0.000090850335255, -0.001353457802907, 0.000392513000406, 0.000296661834, 0.000155491492478, 0.000089145738457, -0.000986638013273, 0.000088479071565, 0.002644079504535, 0.002592750359327, -0.000553049729206, 0.006003307178617, 0.002635058946908, 0.000323723128531, 0.000566982082091, 0.000108075641037, -0.001688290853053, -0.001194333075546, -0.000032839656342 ], [ 0.058083530515432, 0.036935579031706, -0.081179484724998, 0.020949771627784, 0.018154641613364, -0.059118900448084, 0.06646990031004, -0.033893536776304, -0.011332641355693, -0.000713023706339, -0.031802121549845, 0.057561755180359, -0.036656338721514, 0.03372310474515, 0.019493862986565, -0.008916553109884, -0.002602230524644, 0.001096586813219, 0.034560602158308, -0.036785501986742, 0.012445449829102, -0.02262264303863, -0.020493853837252, 0.015853395685554, -0.000987852108665, -0.000110324755951, 0.004193097352982, -0.000861433625687, -0.025359600782394, 0.01249697804451, -0.003605255158618, 0.009052108041942, 0.014023629948497, -0.016941215842962, 0.001656745444052, 0.000316989055136, 0.000116425660963, -0.000396845047362, -0.003439874155447, 0.00013514944294, 0.011238078586757, 0.001865124097094, 0.006488160695881, -0.000508209050167, -0.004952010698617, 0.011058192700148, -0.001471841125749, -0.000066926033469, -0.000292289216304, -0.000027824824429, -0.000084995495854, 0.001706650829874, 0.000378202938009, 0.000503818795551, -0.0008350519347, -0.003788573900238, -0.011228388175368, -0.001298887538724, -0.001164080109447, -0.002164968289435, 0.00032926700078, -0.000987478299066, 0.001191367162392, -0.000148995546624 ], [ 0.058071486651897, -0.036922469735146, -0.081167161464691, -0.020943880081177, 0.018146308138967, 0.05910274758935, 0.06646691262722, 0.033888887614012, -0.011331797577441, 0.000716467271559, -0.031794473528862, -0.057551499456167, -0.036659318953753, -0.033725783228874, 0.01949548907578, 0.008911360055208, -0.002602180466056, -0.001099162735045, 0.034561585634947, 0.036779835820198, 0.012445190921426, 0.022631425410509, -0.020500548183918, -0.015850160270929, -0.000980430166237, 0.00010426400695, 0.004194639623165, 0.000858177896589, -0.025367110967636, -0.012487594038248, -0.003598914016038, -0.009060565382242, 0.014034012332559, 0.016946103423834, 0.001648943638429, -0.000322887179209, 0.000124119091197, 0.000403570273193, -0.003442733548582, -0.000125324426335, 0.011241974309087, -0.00188135006465, 0.006481317803264, 0.000512827129569, -0.004961574915797, -0.011068924330175, -0.00147246546112, 0.000076305237599, -0.000293726974633, 0.000026145324227, -0.000097867494333, -0.001706800307147, 0.000378891563741, -0.000515318533871, -0.000829575990792, 0.003804210573435, -0.011226244270802, 0.00129571207799, -0.001158976694569, 0.002171723870561, 0.000339901918778, 0.000981328310445, 0.001192269846797, 0.000153142973431 ] ], "Routing": [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24 ] }, "LoudspeakerLayout": { "Name": "A loudspeaker layout", "Loudspeakers": [ { "Azimuth": 26.001167297363281, "Elevation": 15.464151382446289, "Radius": 1.0, "IsImaginary": false, "Channel": 1, "Gain": 1.0 }, { "Azimuth": -26.00115966796875, "Elevation": -15.464151382446289, "Radius": 1.0, "IsImaginary": false, "Channel": 2, "Gain": 1.0 }, { "Azimuth": 17.108644485473633, "Elevation": -24.993703842163086, "Radius": 1.0, "IsImaginary": false, "Channel": 3, "Gain": 1.0 }, { "Azimuth": -17.108642578125, "Elevation": 24.993703842163086, "Radius": 1.0, "IsImaginary": false, "Channel": 4, "Gain": 1.0 }, { "Azimuth": 153.998825073242188, "Elevation": -15.464151382446289, "Radius": 1.0, "IsImaginary": false, "Channel": 5, "Gain": 1.0 }, { "Azimuth": -153.998825073242188, "Elevation": 15.464151382446289, "Radius": 1.0, "IsImaginary": false, "Channel": 6, "Gain": 1.0 }, { "Azimuth": 162.891357421875, "Elevation": 24.993703842163086, "Radius": 1.0, "IsImaginary": false, "Channel": 7, "Gain": 1.0 }, { "Azimuth": -162.891357421875, "Elevation": -24.993703842163086, "Radius": 1.0, "IsImaginary": false, "Channel": 8, "Gain": 1.0 }, { "Azimuth": 72.891357421875, "Elevation": 24.993703842163086, "Radius": 1.0, "IsImaginary": false, "Channel": 9, "Gain": 1.0 }, { "Azimuth": 107.108642578125, "Elevation": -24.993703842163086, "Radius": 1.0, "IsImaginary": false, "Channel": 10, "Gain": 1.0 }, { "Azimuth": 116.001167297363281, "Elevation": 15.464151382446289, "Radius": 1.0, "IsImaginary": false, "Channel": 11, "Gain": 1.0 }, { "Azimuth": 63.998832702636719, "Elevation": -15.464151382446289, "Radius": 1.0, "IsImaginary": false, "Channel": 12, "Gain": 1.0 }, { "Azimuth": -107.108642578125, "Elevation": 24.993703842163086, "Radius": 1.0, "IsImaginary": false, "Channel": 13, "Gain": 1.0 }, { "Azimuth": -72.891357421875, "Elevation": -24.993703842163086, "Radius": 1.0, "IsImaginary": false, "Channel": 14, "Gain": 1.0 }, { "Azimuth": -63.99884033203125, "Elevation": 15.464151382446289, "Radius": 1.0, "IsImaginary": false, "Channel": 15, "Gain": 1.0 }, { "Azimuth": -116.001174926757812, "Elevation": -15.464151382446289, "Radius": 1.0, "IsImaginary": false, "Channel": 16, "Gain": 1.0 }, { "Azimuth": 32.254459381103516, "Elevation": 60.025382995605469, "Radius": 1.0, "IsImaginary": false, "Channel": 17, "Gain": 1.0 }, { "Azimuth": -147.74554443359375, "Elevation": 60.025382995605469, "Radius": 1.0, "IsImaginary": false, "Channel": 18, "Gain": 1.0 }, { "Azimuth": -57.74554443359375, "Elevation": 60.025382995605469, "Radius": 1.0, "IsImaginary": false, "Channel": 19, "Gain": 1.0 }, { "Azimuth": 122.254463195800781, "Elevation": 60.025382995605469, "Radius": 1.0, "IsImaginary": false, "Channel": 20, "Gain": 1.0 }, { "Azimuth": -32.25445556640625, "Elevation": -60.025382995605469, "Radius": 1.0, "IsImaginary": false, "Channel": 21, "Gain": 1.0 }, { "Azimuth": 147.74554443359375, "Elevation": -60.025382995605469, "Radius": 1.0, "IsImaginary": false, "Channel": 22, "Gain": 1.0 }, { "Azimuth": 57.745540618896484, "Elevation": -60.025382995605469, "Radius": 1.0, "IsImaginary": false, "Channel": 23, "Gain": 1.0 }, { "Azimuth": -122.25445556640625, "Elevation": -60.025382995605469, "Radius": 1.0, "IsImaginary": false, "Channel": 24, "Gain": 1.0 } ] } }././@LongLink0000644000000000000000000000016400000000000011604 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/SimpleDecoder/Source/Presets/Produktionsstudio.jsonIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/SimpleDecoder/Source/Presets/Produkt0000664002537200253720000006217215257173642031616 0ustar zmoelnigzmoelnig{ "Name": "IEM Produktionsstudio Decoder & Layout", "Description": "This configuration file was created with the IEM AllRADecoder v0.4.0 plug-in. 18 Jun 2018 1:35:14pm", "Decoder": { "Name": "IEM Produktionsstudio", "Description": "A 7th order Ambisonics decoder for the IEM Produktionsstudio.", "ExpectedInputNormalization": "n3d", "Weights": "none", "WeightsAlreadyApplied": false, "SubwooferChannel" : 4, "Matrix": [ [ 0.07179858535528182983, 0.06890045851469039917, -0.03073602356016635895, 0.07925526052713394165, 0.09105876088142395020, -0.02993733808398246765, -0.03507712110877037048, -0.03520768880844116211, 0.01343082450330257416, 0.06048857048153877258, -0.03730679303407669067, -0.01656924746930599213, 0.01747567951679229736, -0.01899305172264575958, -0.00677113933488726616, -0.03668531030416488647, 0.01710115000605583191, -0.02217375487089157104, -0.01082219369709491730, 0.00442136358469724655, 0.01101768482476472855, 0.00583936413750052452, -0.00152079178951680660, 0.01082920096814632416, -0.04385581985116004944, -0.00486087845638394356, -0.00727863702923059464, -0.00244083395227789879, -0.00418216921389102936, 0.00849351286888122559, 0.00046096765436232090, 0.00992959365248680115, 0.00029910463490523398, 0.00157214631326496601, 0.00888274610042572021, -0.02559242956340312958, -0.00507186958566308022, -0.00531880464404821396, 0.00034844956826418638, -0.00759502639994025230, 0.01059541944414377213, 0.00170199514832347631, -0.00706200022250413895, 0.00143144547473639250, 0.00191595626529306173, 0.00600487086921930313, -0.00091247510863468051, 0.00174653122667223215, -0.01051187701523303986, -0.00110554159618914127, -0.00900463480502367020, -0.00077748630428686738, -0.00247668195515871048, 0.00668299524113535881, 0.00184452987741678953, -0.00321728643029928207, -0.00156696559861302376, -0.00401058094576001167, -0.00029065419221296906, -0.00317128235474228859, 0.01014871802181005478, -0.00224402197636663914, 0.00201176921837031841, -0.00722226453945040703 ], [ 0.07179898768663406372, -0.06890495866537094116, -0.03073412179946899414, 0.07925462722778320312, -0.09105984866619110107, 0.02993473783135414124, -0.03508225828409194946, -0.03521287068724632263, 0.01342305261641740799, -0.06048038974404335022, 0.03730750083923339844, 0.01657016016542911530, 0.01748218387365341187, -0.01899102889001369476, -0.00678194127976894379, -0.03669248521327972412, -0.01708872802555561066, 0.02218237146735191345, 0.01081668678671121597, -0.00442060874775052071, 0.01101083680987358093, 0.00584154250100255013, -0.00152010773308575153, 0.01081666629761457443, -0.04385551437735557556, 0.00487168552353978157, 0.00729581015184521675, 0.00243622809648513794, 0.00418589357286691666, -0.00848823785781860352, 0.00046734185889363289, 0.00993043743073940277, 0.00030170983518473804, 0.00156410783529281616, 0.00887579936534166336, -0.02558643370866775513, 0.00508123682811856270, 0.00533809140324592590, -0.00034309108741581440, 0.00759840104728937149, -0.01059315912425518036, -0.00170271715614944696, -0.00707099866122007370, 0.00143223244231194258, 0.00192575785331428051, 0.00601092586293816566, -0.00092305493308231235, 0.00175100064370781183, -0.01050279568880796432, 0.00111288996413350105, 0.00901674386113882065, 0.00078862608643248677, 0.00247575249522924423, -0.00668930821120738983, -0.00184103089850395918, 0.00321806268766522408, -0.00155443081166595221, -0.00401915702968835831, -0.00028821150772273540, -0.00315798167139291763, 0.01015719491988420486, -0.00224616937339305878, 0.00202500796876847744, -0.00720882229506969452 ], [ 0.06600356847047805786, 0.00000136531116368133, -0.00688078720122575760, 0.09884190559387207031, 0.00000084188837945476, -0.00000030318059884848, -0.03287663683295249939, -0.00720807909965515137, 0.09149980545043945312, -0.00000126919735521369, -0.00000026915975581687, 0.00000439860878032050, -0.00667334487661719322, -0.02095468528568744659, -0.00590340234339237213, 0.07746142148971557617, -0.00000382961343348143, -0.00000034801433912435, 0.00000935492698772578, -0.00000187641626325785, 0.00200499710626900196, -0.01560021471232175827, -0.00525473430752754211, -0.00672785378992557526, 0.06023628264665603638, -0.00000565382606509957, -0.00000136722428578651, 0.00001129502834373852, -0.00000414334408560535, -0.00000218234185922483, 0.00969801191240549088, -0.00336846453137695789, -0.01550699584186077118, 0.00304398103617131710, -0.00881353113800287247, 0.04252831637859344482, -0.00000591179241382633, -0.00000306374954561761, 0.00000985597125691129, -0.00000345812281921098, 0.00000085869021404505, 0.00000258308500633575, 0.00528305117040872574, 0.00688225124031305313, -0.00346496747806668282, -0.01280798204243183136, 0.00574369402602314949, -0.01089753955602645874, 0.02637133747339248657, -0.00000439797850049217, -0.00000431839407610823, 0.00000621872277406510, -0.00000043697860974135, 0.00000503928231410100, 0.00000073319154125784, -0.00000251304027187871, -0.00041693533421494067, 0.00737680867314338684, 0.00111107493285089731, -0.00074532470898702741, -0.00972442328929901123, 0.00491585675626993179, -0.01196981966495513916, 0.01309331413358449936 ], [ 0.10288899391889572144, 0.14673013985157012939, -0.02289180643856525421, 0.01145131606608629227, 0.01769954897463321686, -0.02935401350259780884, -0.05041123926639556885, -0.00500521529465913773, -0.11733006685972213745, -0.07529147714376449585, -0.00764917861670255661, -0.03151643648743629456, 0.00211182306520640850, -0.00263045798055827618, 0.01952451653778553009, -0.01560259331017732620, -0.00718578882515430450, 0.00982216279953718185, -0.00180492061190307140, -0.01208038721233606339, 0.00728974211961030960, 0.00065434485441073775, 0.00713996961712837219, 0.00666682422161102295, 0.03542622178792953491, 0.00735300965607166290, 0.00336835207417607307, -0.00423741387203335762, -0.00074949947884306312, 0.00240734103135764599, 0.01019372884184122086, 0.00135191017761826515, 0.01549102831631898880, 0.00022310996428132057, -0.00369336898438632488, -0.00244442396797239780, -0.00840129237622022629, -0.00156771787442266941, -0.00051567942136898637, 0.01139751635491847992, 0.00207544886507093906, 0.00763263553380966187, 0.00182252749800682068, 0.00032009498681873083, -0.00011941260163439438, 0.00171077158302068710, 0.00615036394447088242, -0.00003315131834824570, 0.00632228842005133629, 0.00879169255495071411, 0.00169679464306682348, 0.00335338339209556580, 0.00115601788274943829, -0.00021842920978087932, 0.00021650684357155114, 0.00499276071786880493, -0.00126733619254082441, -0.00050044100498780608, -0.00056556524941697717, -0.00194505206309258938, -0.00502574350684881210, 0.00013722230505663902, 0.00181598716881126165, 0.00868011359125375748 ], [ 0.10287643969058990479, -0.14671874046325683594, -0.02289388328790664673, 0.01145371608436107635, -0.01770331524312496185, 0.02936263382434844971, -0.05041544511914253235, -0.00500596687197685242, -0.11732846498489379883, 0.07529763877391815186, 0.00764859141781926155, 0.03152351453900337219, 0.00212395540438592434, -0.00263181771151721478, 0.01952982507646083832, -0.01560599543154239655, 0.00718651711940765381, -0.00981883145868778229, 0.00180769816506654024, 0.01207263115793466568, 0.00729465158656239510, 0.00064801232656463981, 0.00714037707075476646, 0.00666629057377576828, 0.03543492034077644348, -0.00735949212685227394, -0.00336848525330424309, 0.00424563698470592499, 0.00075716990977525711, -0.00241358205676078796, 0.01019242778420448303, 0.00135580915957689285, 0.01549692638218402863, 0.00022259770776145160, -0.00368353514932096004, -0.00244683679193258286, 0.00840509030967950821, 0.00155928405001759529, 0.00051936687668785453, -0.01141140516847372055, -0.00207370775751769543, -0.00763294752687215805, 0.00181612442247569561, 0.00031933397985994816, -0.00011976864334428683, 0.00171761482488363981, 0.00616159290075302124, -0.00003394966915948316, 0.00632069446146488190, -0.00879502948373556137, -0.00169569300487637520, -0.00336018996313214302, -0.00115717703010886908, 0.00021432593348436058, -0.00021968437067698687, -0.00499215861782431602, -0.00126717379316687584, -0.00048827083082869649, -0.00056536146439611912, -0.00194272177759557962, -0.00503692682832479477, 0.00014088768512010574, 0.00181576807517558336, 0.00868281349539756775 ], [ 0.12046553194522857666, 0.07388502359390258789, -0.04268862679600715637, -0.14579038321971893311, -0.09225143492221832275, -0.02949005924165248871, -0.05765694379806518555, 0.04847796633839607239, 0.06346884369850158691, 0.05102657526731491089, 0.03177849575877189636, -0.01806606911122798920, 0.01733323000371456146, 0.03165968880057334900, -0.01223536673933267593, 0.00078362278873100877, -0.00100692210253328085, -0.00947809498757123947, 0.01122260559350252151, 0.00227426434867084026, 0.01391800213605165482, 0.00347872590646147728, -0.00332101946696639061, -0.00909020379185676575, -0.01370952557772397995, -0.01741614937782287598, -0.00832108873873949051, -0.00202531646937131882, 0.00877855811268091202, 0.00867293495684862137, 0.00757791101932525635, -0.01029060315340757370, -0.01117971166968345642, -0.00369138130918145180, 0.00542238960042595863, -0.00159219559282064438, 0.00849387701600790024, 0.00689550815150141716, -0.00027725723339244723, -0.01213523838669061661, -0.00924002937972545624, 0.00343912187963724136, -0.00536186248064041138, -0.00782659463584423065, 0.00055829074699431658, 0.00304434145800769329, 0.00149659602902829647, 0.00418354989960789680, 0.00997786875814199448, 0.00203497149050235748, 0.00240941601805388927, -0.00161048548761755228, 0.00483287451788783073, 0.00289743626490235329, -0.00447152787819504738, -0.00246895779855549335, -0.00329064694233238697, -0.00064396194647997618, 0.00216613058000802994, 0.00416009686887264252, 0.00374235794879496098, 0.00053857051534578204, -0.00367514998652040958, -0.00368053792044520378 ], [ 0.12047680467367172241, -0.07389564067125320435, -0.04269138723611831665, -0.14579600095748901367, 0.09226128458976745605, 0.02948100678622722626, -0.05765077844262123108, 0.04847547784447669983, 0.06346326321363449097, -0.05102688446640968323, -0.03176829591393470764, 0.01807245612144470215, 0.01731706038117408752, 0.03165232762694358826, -0.01223803870379924774, 0.00078940630191937089, 0.00100350670982152224, 0.00947485771030187607, -0.01122223865240812302, -0.00227140751667320728, 0.01392233092337846756, 0.00348994950763881207, -0.00331688066944479942, -0.00908285658806562424, -0.01370800472795963287, 0.01741773635149002075, 0.00831538438796997070, 0.00202184682711958885, -0.00878241006284952164, -0.00866795703768730164, 0.00757198035717010498, -0.01028767507523298264, -0.01118228957056999207, -0.00368263572454452515, 0.00541680352762341499, -0.00159443973097950220, -0.00849713478237390518, -0.00688773160800337791, 0.00027359434170648456, 0.01213713269680738449, 0.00923311989754438400, -0.00343892537057399750, -0.00534431543201208115, -0.00782327074557542801, 0.00056017236784100533, 0.00304007460363209248, 0.00148245308082550764, 0.00418222742155194283, 0.00997527502477169037, -0.00202999729663133621, -0.00240998086519539356, 0.00161764281801879406, -0.00483157951384782791, -0.00289601599797606468, 0.00446837302297353745, 0.00246658804826438427, -0.00329648237675428391, -0.00065621780231595039, 0.00216844258829951286, 0.00415342301130294800, 0.00374797964468598366, 0.00054190069204196334, -0.00366987567394971848, -0.00367764732800424099 ], [ 0.08719463646411895752, 0.06627514213323593140, 0.09104207158088684082, 0.06646539270877838135, 0.04883769154548645020, 0.07963126897811889648, 0.02364492602646350861, 0.07971866428852081299, 0.00025928925606422126, 0.01113488525152206421, 0.05906938016414642334, 0.04234284907579421997, -0.03167871758341789246, 0.04220714420080184937, 0.00015282425738405436, -0.01069153938442468643, 0.00026993424398824573, 0.01125631574541330338, 0.03189876303076744080, 0.00042500087874941528, -0.03509102016687393188, 0.00028075624140910804, -0.00012669961142819375, -0.01094436831772327423, 0.00116728211287409067, 0.00434967875480651855, 0.00022626946156378835, 0.00186178041622042656, 0.00106227269861847162, -0.01085180323570966721, -0.01167919114232063293, -0.01079667359590530396, -0.00018439276027493179, -0.00200145342387259007, 0.00376376230269670486, 0.00415606098249554634, 0.00518946535885334015, 0.00518305739387869835, -0.00003676239430205896, -0.00644415430724620819, -0.00527713680639863014, -0.00096027145627886057, 0.00031434136326424778, -0.00081340351607650518, 0.00002754210436251014, 0.00613821344450116158, 0.00651808734983205795, 0.00495206983759999275, 0.00005659750968334265, 0.00204864447005093098, 0.00482536572962999344, 0.00257196556776762009, -0.00019364316540304571, -0.00582191813737154007, 0.00497484253719449043, 0.00419980008155107498, -0.00371125154197216034, 0.00421512452885508537, 0.00016435571887996048, 0.00579978246241807938, 0.00718728406354784966, 0.00250536389648914337, -0.00003834538438240997, -0.00166549580171704292 ], [ 0.08719597756862640381, -0.06627465784549713135, 0.09104175120592117310, 0.06646483391523361206, -0.04883062094449996948, -0.07962969690561294556, 0.02364103496074676514, 0.07971761375665664673, 0.00025769573403522372, -0.01112996228039264679, -0.05905931815505027771, -0.04234127700328826904, -0.03168413043022155762, 0.04220667108893394470, 0.00014931496116332710, -0.01068824250251054764, -0.00027150046662427485, -0.01124515943229198456, -0.03189539164304733276, -0.00042492343345656991, -0.03509424999356269836, 0.00028112824657000601, -0.00013040893827565014, -0.01094129681587219238, 0.00116656743921339512, -0.00435055093839764595, -0.00022245207219384611, -0.00185266451444476843, -0.00107037473935633898, 0.01085036154836416245, -0.01167817227542400360, -0.01079675089567899704, -0.00018662944785319269, -0.00200281478464603424, 0.00376427872106432915, 0.00415157526731491089, -0.00519278179854154587, -0.00517755001783370972, 0.00004183806959190406, 0.00644293986260890961, 0.00526509946212172508, 0.00095829583005979657, 0.00031783714075572789, -0.00081405398668721318, 0.00002622264400997665, 0.00613158615306019783, 0.00651894835755228996, 0.00494939740747213364, 0.00005240435348241590, -0.00205527781508862972, -0.00482215872034430504, -0.00256692199036478996, 0.00019135221373289824, 0.00581528991460800171, -0.00498008448630571365, -0.00420134421437978745, -0.00371036329306662083, 0.00421568378806114197, 0.00016351007798220962, 0.00579245714470744133, 0.00718706194311380386, 0.00250511569902300835, -0.00003720127278938890, -0.00167522567790001631 ], [ 0.08879416435956954956, 0.06371914595365524292, 0.09244900196790695190, -0.06881105154752731323, -0.04363299533724784851, 0.07827461510896682739, 0.02308157272636890411, -0.08242080360651016235, 0.00244203140027821064, 0.00403129402548074722, -0.05585176125168800354, 0.04396658390760421753, -0.03379129990935325623, -0.04254111275076866150, 0.00302893598563969135, 0.00843612104654312134, 0.00720340851694345474, 0.00629813084378838539, -0.03442659229040145874, 0.00248756306245923042, -0.03634542599320411682, 0.00231137196533381939, 0.00085754011524841189, 0.00808758102357387543, 0.00370668782852590084, -0.00190779299009591341, 0.00554002448916435242, 0.00440737185999751091, -0.00521974824368953705, -0.01129242964088916779, -0.01046164520084857941, 0.01333236414939165115, -0.00215603644028306007, 0.00097036868100985885, 0.00658943364396691322, -0.00665830681100487709, -0.00094106403412297368, -0.00009294412302551791, -0.00180669024121016264, -0.00089944578940048814, 0.00529522821307182312, -0.00298879994079470634, 0.00250805215910077095, 0.00013262497668620199, -0.00255163782276213169, -0.00455124303698539734, 0.00725620379671454430, -0.00748194428160786629, 0.00187056011054664850, -0.00037005194462835789, -0.00095619430067017674, 0.00345944147557020187, -0.00553154340013861656, -0.00493688089773058891, -0.00149789755232632160, 0.00356547371484339237, -0.00337178679183125496, -0.00714381318539381027, 0.00013590768503490835, -0.00368800177238881588, 0.00569333927705883980, -0.00290159601718187332, 0.00171516032423824072, 0.00091580336447805166 ], [ 0.08879477530717849731, -0.06372036784887313843, 0.09245226532220840454, -0.06880509853363037109, 0.04362626001238822937, -0.07827806472778320312, 0.02308510057628154755, -0.08241673558950424194, 0.00244032684713602066, -0.00403156876564025879, 0.05584440007805824280, -0.04396861046552658081, -0.03379321098327636719, -0.04254157468676567078, 0.00302556436508893967, 0.00842829234898090363, -0.00719747738912701607, -0.00629687868058681488, 0.03442244976758956909, -0.00248376443050801754, -0.03634978085756301880, 0.00231102970428764820, 0.00085511937504634261, 0.00808073673397302628, 0.00370935071259737015, 0.00190785876475274563, -0.00553525658324360847, -0.00440558232367038727, 0.00521940970793366432, 0.01129872165620326996, -0.01045941468328237534, 0.01333429664373397827, -0.00215498055331408978, 0.00096850836416706443, 0.00658713607117533684, -0.00666160788387060165, 0.00094372616149485111, 0.00009936840797308832, 0.00180884217843413353, 0.00089848705101758242, -0.00529265962541103363, 0.00299072614870965481, 0.00251698214560747147, 0.00013314743409864604, -0.00254834070801734924, -0.00455029355362057686, 0.00724843796342611313, -0.00748145347461104393, 0.00187771581113338470, 0.00036786057171411812, 0.00095625605899840593, -0.00345006887800991535, 0.00553402351215481758, 0.00493278447538614273, 0.00150011398363858461, -0.00356760504655539989, -0.00336607941426336765, -0.00714562879875302315, 0.00013826113718096167, -0.00368612981401383877, 0.00568730384111404419, -0.00289526907727122307, 0.00172532175201922655, 0.00091794988838955760 ], [ 0.05659971013665199280, 0.00000282856717603863, 0.08960649371147155762, 0.00000773492411099141, 0.00000328664532389666, 0.00000503744422530872, 0.09609330445528030396, 0.00001244372560904594, 0.00000171108740687487, 0.00000011911063069192, 0.00000584412646276178, 0.00000570844485991984, 0.08464940637350082397, 0.00001170283212559298, 0.00000362244691132219, -0.00000451309051641147, 0.00000053774516572958, 0.00000037827280152669, 0.00000616364241068368, 0.00000425426696892828, 0.06218866258859634399, 0.00000571091095480369, 0.00000510941117681796, -0.00000906836066860706, -0.00109947985038161278, 0.00000180564404672623, 0.00000165294659382198, 0.00000081875498381123, 0.00000350068398802250, 0.00000097950817234960, 0.03612607344985008240, -0.00000214391025110672, 0.00000529139379068511, -0.00001138761763286311, -0.00284137134440243244, -0.00000192111770047632, -0.00000144711373195605, 0.00000479032496514264, 0.00000350121945302817, 0.00000136002267936419, -0.00000090739229108294, -0.00000297568840323947, 0.01299224793910980225, -0.00000755656674300553, 0.00000369752433471149, -0.00000925266067497432, -0.00506110256537795067, -0.00000473149793833727, 0.00000091010923597423, 0.00000055639668516960, -0.00000396994937545969, 0.00000859224473970244, 0.00000580227788304910, 0.00000177404353962629, -0.00000445172327090404, -0.00000602366299062851, -0.00299328891560435295, -0.00000800655016064411, 0.00000060345439578668, -0.00000298835857392987, -0.00710881780833005905, -0.00000776906381361187, 0.00000244926377490629, 0.00000243183467318886 ] ], "Routing": [ 1, 2, 3, 7, 8, 5, 6, 9, 10, 11, 12, 13 ] } } ././@LongLink0000644000000000000000000000015200000000000011601 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/SimpleDecoder/Source/Presets/5point1.jsonIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/SimpleDecoder/Source/Presets/5point10000664002537200253720000002361315257173642031462 0ustar zmoelnigzmoelnig{ "Decoder": { "Name": "5.1 Decoder", "Description": "Channel order: L R C LFE LRS RRS", "ExpectedInputNormalization": "n3d", "Weights": "none", "WeightsAlreadyApplied": false, "SubwooferChannel" : 4, "Matrix": [ [ 0.1835727840662003, 0.1962659507989883, -0.00002023239539994393, 0.1198548227548599, 0.1316904872655869, -8.54512791192974e-7, -0.03784657269716263, -7.525155979237752e-6, -0.05580505728721619, 0.0273569393903017, 3.906422534782905e-6, 0.01615919545292854, -0.00001529296241642442, -0.00261409068480134, -0.00001273954057978699, -0.04994162544608116, 0.02212232165038586, 1.541957772133173e-6, 0.01761613972485065, -5.089194473839598e-6, -0.008058404549956322, 4.304968115320662e-6, -0.02062506787478924, -0.00001127914038079325, -0.01847962848842144, 0.01706661097705364, 2.382405000389554e-6, 0.0003640245122369379, 6.664946340606548e-6, 0.004540919791907072, -0.00001087371947505744, 0.0004737972631119192, -9.429877536604181e-6, -0.01346032042056322, -0.00001190493185276864, -0.02747499756515026, 0.000919832440558821, -4.451489132861752e-7, 0.00493537774309516, -3.405028792258236e-6, 0.007272735703736544, -3.315939011372393e-6, -0.00263583566993475, 7.672621904930566e-6, -0.006797285284847021, -0.00001089116904040566, -0.006775482092052698, -0.00001068267192749772, -0.01935072802007198, 0.003072859020903707, 7.223592319860472e-7, 0.001727826194837689, 2.723112856983789e-6, 0.001049467013217509, 1.931930000864668e-6, 0.003818130120635033, -0.00001362185503239743, -0.0009156291489489377, -3.554236855052295e-6, -0.005798544734716415, -8.115895980154164e-6, -0.01082264352589846, -8.780921234574635e-6, -0.01140359882265329 ], [ 0.1835729330778122, -0.1962646245956421, -0.00001472742405894678, 0.119860514998436, -0.131694883108139, 2.104941110303571e-8, -0.03784090280532837, -0.00001309808067162521, -0.05580553784966469, -0.02735547348856926, 4.134601283567463e-7, -0.01616048254072666, -5.344629244063981e-6, -0.002600232837721705, -0.00001323065953329206, -0.04994357377290726, -0.02212202362716198, 6.809029287069279e-7, -0.01763027906417847, -3.045632865905645e-7, -0.008046111091971397, -2.080298372675315e-6, -0.02062703482806683, -0.00001065439209924079, -0.01847893372178078, -0.01706675998866558, -7.713370564488287e-7, -0.0003573736757971346, 2.474270672792045e-7, -0.004551108926534653, -3.396068223082693e-6, 0.00048462935956195, -7.979513611644506e-6, -0.01346558146178722, -0.00001001656437438214, -0.02747587114572525, -0.0009187821997329593, 6.79527488500753e-7, -0.004937799647450447, 2.851134922821075e-6, -0.007291384041309357, -5.359170245355926e-6, -0.00262620416469872, 5.242428414931055e-6, -0.00679755350574851, -9.384202712681144e-6, -0.006769374012947083, -9.5882987807272e-6, -0.0193515308201313, -0.003071634797379375, -4.67331688014383e-7, -0.001728275790810585, 1.330402596977365e-6, -0.001046934747137129, 3.636781684690504e-6, -0.003835727460682392, -0.00001604489989404101, -0.0009168845717795193, -5.037477421865333e-7, -0.005809118039906025, -5.356833298719721e-6, -0.01082766242325306, -7.381940122286323e-6, -0.01140323560684919 ], [ 0.08563540875911713, 8.251770850620233e-6, 0.00001537024581921287, 0.118137888610363, 0.00001092279671865981, -4.321663254813757e-6, -0.01355757843703032, -1.915629127324792e-6, 0.1057497039437294, 0.00001172471820609644, -7.715509127592668e-6, 7.001296125963563e-6, 0.00002907117413997184, 0.009390297345817089, 2.84789825855114e-6, 0.08909163624048233, 9.796723134058993e-6, -6.778948772989679e-6, 1.095471361622913e-6, 1.842511352379006e-7, -0.000548217270988971, 0.000010044963346445, 0.02069498971104622, 7.669635124329943e-6, 0.07055941969156265, 5.018072897655657e-6, -3.366994860698469e-6, -3.410983708818094e-6, -7.267401088029146e-6, 0.0000190193641174119, 0.00001555805283715017, 0.005497736856341362, 0.00001382365371682681, 0.02318562753498554, 0.00001459782379242824, 0.0519632026553154, -1.61901095907524e-6, 6.179639200354359e-8, -3.788811909544165e-6, -0.00001127396535594016, 0.00001750433148117736, 9.975439752452075e-6, 0.0008986905450001359, -0.00001082852577383164, 0.009924359619617462, 6.311729066510452e-6, 0.02082160860300064, 0.00001946098745975178, 0.03478369489312172, -8.194625479518436e-6, 1.962976284630713e-6, -9.856585165834986e-7, -8.429323315795045e-6, 7.020510111033218e-6, 9.083255463337991e-6, 0.00001829924804042093, 0.00002259070788568351, 0.004058654420077801, 7.662873940716963e-6, 0.01140573062002659, 4.813188297703164e-6, 0.01601835526525974, 0.00002010180469369516, 0.0201298464089632 ], [ 0.2463568150997162, 0.2106136083602905, -1.265691139451519e-6, -0.1790089905261993, -0.0920080840587616, -3.355299440954695e-6, -0.0864509716629982, -3.663813913590275e-6, -0.01308957301080227, -0.006432636175304651, -4.30720865551848e-6, -0.008451339788734913, 5.929731287324103e-6, 0.009141754359006882, -2.689918346732156e-6, -0.01552063971757889, -0.005542101338505745, -5.428022177511593e-6, -0.01645250059664249, 4.125318753267493e-7, -0.01149714458733797, 1.916391283884877e-6, -0.002771748695522547, 9.641499900681083e-7, 0.01462869811803102, -0.009205627255141735, -4.559931312542176e-6, 0.001082501257769763, 9.743206419443595e-7, -0.003045216901227832, 6.27105282546836e-6, 0.005616145208477974, 2.86411960814803e-7, -0.001053939806297421, 3.453312729106983e-6, 0.002713631372898817, 0.004755552858114243, -6.347908083625953e-7, -0.002977065509185195, -1.101715497497935e-6, -0.003363078692927957, -1.645071279199328e-6, -0.004143149126321077, -2.086441782012116e-6, -0.003387315897271037, -1.557899508952687e-6, 0.007169138174504042, 4.215041826682864e-6, 0.002800451125949621, 0.0006408127374015749, 4.234051402818295e-7, -0.0008467927691526711, -3.080729982229968e-7, -0.0005842077080160379, 8.743466423766222e-6, -0.002480375347658992, 3.093138332133094e-7, 0.002002612920477986, 2.907573559696175e-7, 0.0005663340562023222, 5.245200100034708e-6, -0.0006777937524020672, 5.81421500100987e-6, 0.005411919206380844 ], [ 0.2463529855012894, -0.210605800151825, -3.404144081287086e-6, -0.1790167093276978, 0.09201009571552277, -1.570191670907661e-6, -0.08645190298557281, 2.023775095949532e-6, -0.01309226546436548, 0.006440579425543547, 2.465732677592314e-6, 0.008462748490273952, -1.362760826850717e-6, 0.009133795276284218, -1.657321718084859e-6, -0.01551982294768095, 0.005547115579247475, 1.115929990191944e-6, 0.01644010841846466, -5.835501724504866e-6, -0.01150926761329174, 7.456210823875153e-6, -0.002768430626019835, -7.14153713943233e-8, 0.01463171653449535, 0.009208467788994312, 2.953185003207182e-6, -0.001074359635822475, 2.706489112824784e-6, 0.003055099863559008, -1.256817313333158e-6, 0.005606239661574364, 3.223242970307183e-7, -0.001049696584232152, 8.387576713175804e-7, 0.002718857955187559, -0.004756058100610971, 5.023804305892554e-7, 0.002971392590552568, -9.427669283468276e-6, 0.003362975316122174, 1.665609374867927e-6, -0.004150053020566702, -2.821948783093831e-6, -0.003387493314221501, -2.974672725031269e-6, 0.007162627764046192, 2.529405037421384e-6, 0.00280700926668942, -0.0006431671208702028, 1.136187506745046e-6, 0.0008438610821031034, -1.609714331607393e-6, 0.0005988735356368124, 7.544775598944398e-6, 0.002481003757566214, 2.96561370305426e-6, 0.00200005411170423, -2.538525677664438e-6, 0.0005741395289078355, 5.056566010352981e-7, -0.0006750605534762144, 4.01540955863311e-6, 0.005417934153228998 ] ], "Routing": [ 1, 2, 3, 5, 6 ] } } ././@LongLink0000644000000000000000000000016000000000000011600 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/SimpleDecoder/Source/Presets/t_design_48ch.jsonIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/SimpleDecoder/Source/Presets/t_desig0000664002537200253720000030102115257173642031571 0ustar zmoelnigzmoelnig{ "Name": "All-Round Ambisonic decoder (AllRAD) and loudspeaker layout", "Description": "This configuration file was created with the IEM AllRADecoder v0.9.5 plug-in. 8 Nov 2024 5:31:41pm", "Decoder": { "Name": "Decoder", "Description": "A 7th order Ambisonics decoder of a 9th order t-design (48 channels).", "ExpectedInputNormalization": "n3d", "Weights": "none", "WeightsAlreadyApplied": false, "Matrix": [ [ 0.024511452764273, 0.015108460560441, -0.004351584706455, 0.03783868253231, 0.029246577993035, -0.003275195136666, -0.023275157436728, -0.008297727443278, 0.030783718451858, 0.037668325006962, -0.00717491004616, -0.010764735750854, 0.007772712036967, -0.026826778426766, -0.007672251667827, 0.017338577657938, 0.038429606705904, -0.010022496804595, -0.017153717577457, 0.004198482725769, 0.015714481472969, 0.010633775964379, -0.017865559086204, -0.004753337707371, 0.002017734572291, 0.032266456633806, -0.010803999379277, -0.018628133460879, 0.007337998133153, 0.006338104605675, -0.00747297424823, 0.015573332086205, 0.007841180078685, -0.008321479894221, -0.000722055963706, -0.010879560373724, 0.021916685625911, -0.009408488869667, -0.016030572354794, 0.008363420143723, 0.008582136593759, -0.00321174133569, -0.00787266716361, -0.008119142614305, 0.008666628971696, 0.00395898707211, -0.000512974744197, 0.003009006846696, -0.018486374989152, 0.010907254181802, -0.006526705808938, -0.011164056137204, 0.007270254660398, 0.007761000655591, -0.00439917575568, -0.002707784064114, 0.004330138210207, -0.006364662200212, -0.004677874501795, 0.003137177787721, 0.000477650464745, 0.004193666856736, 0.005344732198864, -0.02004224434495 ], [ 0.024510122835636, -0.015109593048692, 0.004354331176728, 0.037835326045752, -0.029248440638185, -0.00327619840391, -0.023270335048437, 0.008301895111799, 0.030779203400016, -0.037670936435461, -0.007176507730037, 0.010762012563646, -0.007772758603096, -0.026819070801139, 0.007676406297833, 0.017333123832941, -0.038432862609625, -0.010024863295257, 0.017147855833173, 0.004195696674287, 0.015709156170487, -0.010630311444402, -0.017860446125269, 0.004757937975228, 0.002010998083279, -0.032269641757011, -0.010808025486767, 0.018621273338795, 0.007330530323088, -0.006334851495922, 0.00746579375118, 0.015570426359773, -0.007837845012546, -0.008321145549417, 0.000727170496248, -0.010888053104281, -0.021918492391706, -0.009414996951818, 0.01602547802031, 0.008352527394891, -0.008578898385167, -0.003205297049135, -0.007874524220824, 0.008108056150377, 0.008670659735799, -0.003959622699767, -0.000517090898938, -0.003004324156791, -0.018496444448829, -0.010906584560871, -0.006535481195897, 0.011162190698087, 0.007259303703904, -0.007762081455439, -0.004387835972011, 0.00270726531744, -0.004321414977312, -0.006373813375831, 0.004671600181609, 0.003146761795506, -0.000484000978759, 0.00418738136068, -0.005342125892639, -0.020052582025528 ], [ 0.029608059674501, -0.004330827854574, -0.01501227915287, 0.04655434563756, -0.008253378793597, 0.003259920747951, -0.020538359880447, -0.029039934277534, 0.045026663690805, -0.010774963535368, 0.007136334199458, 0.001292319153436, 0.022992955520749, -0.01779992133379, -0.031314425170422, 0.040116414427757, -0.011536723002791, 0.010227700695395, 0.000664388353471, -0.003453690791503, 0.002533584367484, 0.029560251161456, -0.009075582958758, -0.029322685673833, 0.033499829471111, -0.010642525739968, 0.011662469245493, -0.000959908647928, -0.005626364611089, 0.001160795451142, -0.015711879357696, -0.004365100059658, 0.02324416488409, -0.003232080023736, -0.024475689977407, 0.026460418477654, -0.00852002389729, 0.011165750212967, -0.002598464256153, -0.006071912590414, 0.003044033888727, 0.001786963781342, 0.006664185784757, -0.013651331886649, -0.007284781429917, 0.015919556841254, -0.000256606843323, -0.018274711444974, 0.019930372014642, -0.005757114384323, 0.009007178246975, -0.00349766551517, -0.005076797679067, 0.004392246715724, 0.0019037919119, -0.001805926673114, 0.003703697118908, 0.009062923491001, -0.006349371746182, -0.006606709212065, 0.009300832636654, 0.000421067757998, -0.012057921849191, 0.014467910863459 ], [ 0.029617862775922, 0.004338275175542, 0.01501187030226, 0.046569518744946, 0.008266497403383, 0.003265060018748, -0.020548125728965, 0.029038175940514, 0.045039165765047, 0.010790284723043, 0.007145934272557, -0.001292452798225, -0.022989587858319, -0.017812987789512, 0.031311761587858, 0.04012344405055, 0.011550509370863, 0.010239284485579, -0.00066158734262, -0.003453918034211, 0.002546013798565, -0.029554270207882, -0.009085244499147, 0.029319331049919, 0.033500339835882, 0.010652028955519, 0.011672944761813, 0.000967136817053, -0.005622388329357, -0.001159603591077, 0.01570993848145, -0.004346636589617, -0.023236643522978, -0.003236304502934, 0.024472299963236, 0.026455231010914, 0.00852438993752, 0.011172581464052, 0.002610284136608, -0.006060372572392, -0.003038838971406, 0.00178571860306, 0.006650313269347, 0.013651845045388, -0.007268727291375, -0.015909625217319, -0.000255185645074, 0.018272699788213, 0.019921571016312, 0.00575740262866, 0.009009428322315, 0.003512866329402, -0.005055701825768, -0.004380988422781, 0.001903277705424, 0.00180142687168, -0.003709047334269, 0.009048104286194, 0.006349863484502, -0.006593848112971, -0.00928917620331, 0.000426898186561, 0.012059301137924, 0.014457478187978 ], [ 0.029615931212902, 0.015018840320408, 0.004333811812103, -0.046565145254135, -0.0290517359972, 0.003260453697294, -0.028726574033499, -0.008258294314146, 0.040308278053999, 0.037367198616266, -0.00713658425957, -0.01067978516221, -0.007729536388069, 0.034387890249491, 0.00762402266264, -0.027269834652543, -0.038030192255974, 0.009953734464943, 0.016982803121209, -0.004173533525318, 0.020641637966037, 0.010557696223259, -0.025269536301494, -0.004702850244939, 0.012070586904883, 0.031783208250999, -0.010699436068535, -0.018375085666776, 0.007282390259206, 0.006255933549255, 0.00740495370701, -0.022093871608377, -0.00775849679485, 0.015475993975997, 0.000676248397212, 0.000934025680181, -0.021368799731135, 0.009263806045055, 0.015703793615103, -0.008274463936687, -0.008422043174505, 0.003184091299772, -0.012030274607241, -0.008012503385544, 0.014732973650098, 0.003879013704136, -0.00731845619157, 0.003043692791834, -0.008836397901177, 0.010317740961909, -0.006338070146739, -0.010776182636619, 0.007147365715355, 0.007529539521784, -0.004346039611846, -0.002630913397297, -0.004245496354997, 0.011656323447824, 0.004570133518428, -0.00870958622545, -0.000409641157603, 0.002173879882321, -0.005363143049181, 0.010840579867363 ], [ 0.029611444100738, -0.015010562725365, -0.004348593298346, -0.046558681875467, 0.029036860913038, 0.003270746208727, -0.028718376532197, 0.008285173214972, 0.040306709706783, -0.037351936101913, -0.007157509680837, 0.010668485425413, 0.007752351928502, 0.034377411007881, -0.007647415623069, -0.027274485677481, 0.038021147251129, 0.009979927912354, -0.016962707042694, -0.004183940123767, 0.020633596926928, -0.010585430078208, -0.025266218930483, 0.004716393537819, 0.012077750638127, -0.031783387064934, -0.010723007842898, 0.01835261285305, 0.007297747768462, -0.006245175842196, -0.007420981768519, -0.022089816629887, 0.007776279933751, 0.015481594018638, -0.000678884563968, 0.00093136925716, 0.021375956013799, 0.009278145618737, -0.015685088932514, -0.008288190700114, 0.008406908251345, 0.003189235460013, -0.012033149600029, 0.008025974966586, 0.014739364385605, -0.003886722726747, -0.00732957618311, -0.00304757989943, -0.008844415657222, -0.010326288640499, -0.006340932101011, 0.010763736441731, 0.007155049126595, -0.007516809739172, -0.004351241979748, 0.002626130124554, 0.004249827004969, 0.011671705171466, -0.004575225990266, -0.008722909726202, 0.000411057873862, 0.002184418495744, 0.005365806631744, 0.010860830545425 ], [ 0.024506794288754, -0.004361502360553, 0.015096554532647, -0.037834584712982, 0.008317833766341, -0.003277157666162, -0.015030609443784, -0.029227130115032, 0.035546462982893, -0.010870511643589, 0.007180022541434, 0.001314704539254, -0.023177187889814, 0.010101421736181, 0.031561408191919, -0.03030750900507, 0.011657627299428, -0.010301928035915, -0.000702241202816, 0.00348509196192, -0.002582044573501, 0.029877277091146, -0.001501006423496, -0.029623787850142, 0.023687222972512, -0.010782240889966, 0.011765981093049, -0.000914896139875, -0.005696958862245, 0.001148524577729, 0.015968970954418, 0.011253266595304, -0.023602893576026, -0.004099450074136, 0.02482583746314, -0.01690991781652, 0.008673108182847, -0.011292778886855, 0.00255390512757, 0.006182427983731, -0.003028908744454, -0.001831876114011, 0.011193732731044, -0.014040431007743, -0.013790390454233, 0.016306567937136, 0.006703271530569, -0.018669359385967, 0.010861824266613, -0.005920313764364, 0.009149168618023, -0.003458595834672, -0.005222248379141, 0.004381094593555, 0.001999901141971, -0.001805558800697, -0.003982176072896, -0.015002292580903, 0.00674602156505, 0.012657058425248, -0.009706314653158, -0.006891014054418, 0.012492942623794, -0.006057972554117 ], [ 0.024505890905857, 0.004351074807346, -0.015105472877622, -0.037830237299204, -0.008295620791614, -0.003276339732111, -0.015018773265183, 0.029241492971778, 0.035540975630283, 0.010838099755347, 0.007176989689469, -0.001304283039644, 0.023183492943645, 0.010079005733132, -0.031573675572872, -0.030303440988064, -0.011618937365711, -0.010295745916665, 0.000682954560034, 0.003481677733362, -0.00260024308227, -0.029879052191973, -0.001479357131757, 0.029632056131959, 0.023686842992902, 0.010742641985416, 0.011757013387978, 0.000939285324421, -0.005689057055861, -0.001156859099865, -0.015965491533279, 0.011274444870651, 0.023599106818438, -0.004115094896406, -0.024829745292664, -0.016914343461394, -0.008638069033623, -0.011282974854112, -0.002578806597739, 0.006171400193125, 0.003041991265491, -0.001827337080613, 0.011204962618649, 0.014034216292202, -0.013802686706185, -0.016300151124597, 0.006709904875606, 0.018669305369258, 0.010870652273297, 0.005893995054066, 0.009141496382654, 0.003480309387669, -0.00521159125492, -0.004395566880703, 0.001992537872866, 0.001810759422369, 0.003980334382504, -0.01501261536032, -0.006742689758539, 0.012659172527492, 0.009700031019747, -0.006888163741678, -0.012489416636527, -0.006069344934076 ], [ 0.024508176371455, 0.037833288311958, 0.015106070786715, -0.004358815960586, -0.008310231380165, 0.029242593795061, -0.015021729283035, -0.003280046163127, -0.035541474819183, -0.030300442129374, -0.007184232585132, -0.010082385502756, -0.02318648993969, 0.00130795117002, -0.03157301992178, 0.010856713168323, 0.011638079769909, -0.029628375545144, 0.00068826432107, -0.029883794486523, -0.002599727129564, 0.003484302666038, 0.00148219615221, 0.010304479859769, 0.023681027814746, 0.016907602548599, 0.011764507740736, -0.00411169230938, 0.005691954866052, -0.011276192963123, 0.015968736261129, 0.001154528348707, 0.023603271692991, 0.00093312037643, 0.024823259562254, -0.010759338736534, -0.008650606498122, 0.018661616370082, 0.00257166242227, 0.016304252669215, 0.003036530688405, 0.014036382548511, 0.011208114214242, -0.00182776665315, 0.013805907219648, -0.00617266818881, 0.006705132313073, -0.011286941356957, -0.010865341871977, -0.006067440845072, -0.009140934795141, 0.006882049608976, -0.005210497416556, 0.012663774192333, -0.001992813544348, 0.015017164871097, -0.003978729713708, -0.001806305954233, -0.00674265390262, -0.004385979380459, -0.009705285541713, -0.003471723990515, -0.012482704594731, 0.005902186501771 ], [ 0.024510743096471, 0.037837434560061, -0.01511113345623, 0.004343236330897, 0.00828114990145, -0.029251657426357, -0.015018454752862, -0.003273155307397, -0.03554879501462, -0.030311860144138, -0.007170455530286, -0.010075122117996, 0.023189917206764, -0.001299151103012, 0.031583782285452, -0.010820966213942, -0.011603842489421, 0.02964080683887, -0.000675295013934, 0.029885092750192, -0.002606965368614, 0.003477869788185, 0.0014764808584, 0.01028767041862, 0.023694517090917, 0.016918798908591, 0.011750226840377, -0.004114165902138, 0.005682831164449, -0.011282906867564, -0.015964306890965, -0.001160643412732, -0.023604495450854, -0.000946573331021, -0.024835785850883, 0.010733167640865, 0.0086355721578, -0.018670836463571, -0.002583533991128, -0.016308199614286, -0.003047996666282, -0.014029471203685, 0.011208255775273, -0.001822668593377, 0.013807174749672, -0.006165916100144, 0.006704908329993, -0.011279854923487, -0.010869546793401, -0.006061866879463, -0.009142707102001, 0.006880642846227, -0.005210360512137, 0.01266130618751, -0.001984303817153, 0.015010464005172, 0.003974069375545, 0.001812985050492, 0.006741584278643, 0.004402687773108, 0.009711694903672, 0.003481580642983, 0.012484516948462, -0.00589770404622 ], [ 0.029609521850944, 0.04655634239316, -0.004332969430834, -0.015013856813312, -0.029042301699519, -0.008257354609668, -0.028725950047374, 0.00326150120236, -0.040301468223333, -0.027265504002571, 0.007139535155147, -0.034392505884171, 0.007730837911367, 0.010678763501346, 0.007623340003192, 0.037354912608862, 0.038017172366381, 0.004702392034233, 0.016982523724437, 0.010561693459749, 0.020650302991271, -0.004177773837, 0.025276649743319, -0.009958812966943, 0.012068502604961, -0.000934854964726, -0.010706680826843, 0.015482371672988, -0.007292208727449, 0.022109299898148, -0.007410992402583, -0.006256923079491, -0.007762139197439, -0.018375566229224, -0.000676507712342, -0.031771622598171, -0.021360255777836, 0.003042035503313, -0.015703719109297, -0.003879897529259, -0.008423181250691, -0.008021631278098, -0.012043241411448, 0.003191265044734, -0.014747702516615, 0.008288809098303, -0.007321624550968, 0.009273808449507, 0.008837366476655, 0.010842951014638, 0.006351974792778, -0.00217295344919, 0.007163828238845, -0.008721398189664, 0.004359220620245, -0.011673527769744, 0.004252741113305, 0.002629982074723, 0.004575641360134, 0.007528983056545, 0.000406736682635, 0.010773651301861, -0.00536010414362, 0.010312831029296 ], [ 0.029624190181494, 0.046576466411352, 0.004333833698183, 0.01502447668463, 0.029060756787658, 0.00825862120837, -0.028733339160681, 0.00325962016359, -0.040313940495253, -0.027267737314105, 0.007135351188481, -0.034393779933453, -0.007728687487543, -0.010682546533644, -0.007625922560692, -0.037374723702669, -0.038031410425901, -0.004707134794444, -0.016984928399324, -0.010556287132204, 0.020644361153245, -0.004172154236585, 0.025270666927099, -0.009953702799976, 0.012062598019838, -0.000943014165387, -0.010702579282224, 0.015473490580916, -0.007280439138412, 0.022094916552305, 0.007402458693832, 0.00625519733876, 0.007758378051221, 0.018373835831881, 0.000682459038217, 0.031775925308466, 0.021354667842388, -0.003037326736376, 0.015698255971074, 0.003880801144987, 0.008418034762144, 0.008008810691535, -0.012029622681439, 0.003182694548741, -0.014732669107616, 0.008273581974208, -0.007314397487789, 0.009271376766264, 0.00884073972702, 0.010836409404874, 0.00634978339076, -0.0021699257195, 0.007149119861424, -0.008710173889995, 0.004344350658357, -0.01165459677577, -0.004241852555424, -0.002626478904858, -0.004567657597363, -0.007522309664637, -0.000412752880948, -0.010767268948257, 0.005358930211514, -0.010301842354238 ], [ 0.024520030245185, -0.037849385291338, 0.015115134418011, 0.004355757497251, -0.008303389884531, -0.029257424175739, -0.01502462849021, 0.003279526950791, -0.03555316105485, 0.03030614182353, -0.007182821631432, 0.010079359635711, -0.023194206878543, -0.00130614975933, -0.031585186719894, -0.010845714248717, 0.011623333208263, 0.029635176062584, 0.000684976694174, 0.029887529090047, -0.002604191889986, -0.003485057037324, 0.001475366763771, -0.010301419533789, 0.023680904880166, -0.016902999952435, 0.011759099550545, 0.004119429737329, 0.005694012157619, 0.011280292645097, 0.015966547653079, -0.001156714279205, 0.023599546402693, -0.000937424774747, 0.02482420578599, 0.010742432437837, -0.008634208701551, -0.018658205866814, 0.002576077589765, -0.016294751316309, 0.003041880205274, -0.014029940590262, 0.011206286028028, 0.001830050721765, 0.01380530744791, 0.00617567775771, 0.006711924448609, 0.011279281228781, -0.010857938788831, 0.006058497354388, -0.009132375009358, -0.006887492723763, -0.005213784985244, -0.012658419087529, -0.001996742095798, -0.015008785761893, -0.003976508975029, 0.00181135465391, -0.006735640112311, 0.004394600633532, -0.00969267077744, 0.003475182922557, -0.012477410957217, -0.005889423191547 ], [ 0.024528400972486, -0.037864480167627, -0.015113666653633, -0.004355976823717, 0.008303876034915, 0.029256982728839, -0.015039442107081, 0.003278197487816, -0.035567581653595, 0.030316352844238, -0.0071793012321, 0.010101843625307, 0.023200269788504, 0.001305931946263, 0.031585890799761, 0.010846416465938, -0.011623543687165, -0.029635241255164, -0.000685209059156, -0.029903002083302, -0.002590678166598, -0.003480514045805, 0.001496212091297, -0.010295871645212, 0.023684158921242, -0.016898075118661, 0.011752198450267, 0.00410170154646, 0.005684091243893, 0.011268683709204, -0.015982130542397, 0.0011536560487, -0.023618586361408, 0.0009365719161, -0.024821346625686, -0.010740574449301, 0.00862833019346, 0.018650561571121, -0.002575485501438, 0.016314286738634, -0.003033149288967, 0.014051676727831, 0.0112061239779, 0.001825085026212, 0.013801363296807, 0.006161299534142, 0.006697333883494, 0.011271420866251, -0.010845625773072, 0.006041602231562, -0.009123341180384, -0.006875035818666, -0.005196232814342, -0.012660325504839, -0.001989610493183, -0.015016179531813, 0.003987023606896, -0.001804027589969, 0.0067537156865, -0.004379967227578, 0.009710358455777, -0.003476392012089, 0.012464606203139, 0.005878144875169 ], [ 0.029613215476274, -0.046562351286411, -0.004336522892118, 0.015010801143944, -0.029037052765489, 0.008262509480119, -0.028724050149322, -0.003265631385148, -0.040310196578503, 0.027277577668428, 0.007147596217692, 0.034386239945889, 0.007734171114862, -0.010673454962671, 0.00762456189841, -0.037350289523602, 0.038015879690647, -0.00469663599506, 0.016972994431853, -0.010562358424067, 0.020640589296818, 0.004181009251624, 0.025271244347095, 0.0099679492414, 0.012082069180906, 0.000922947714571, -0.010712350718677, -0.015479962341487, -0.007295839488506, -0.022094709798694, -0.007408644538373, 0.006251499522477, -0.007757282815874, 0.018365405499935, -0.000663019658532, 0.031774334609509, -0.021365292370319, -0.003060802817345, -0.015696708112955, 0.003870184300467, -0.008415883406997, 0.008014090359211, -0.012032261118293, -0.003191258525476, -0.014735965058208, -0.008289963006973, -0.007321367971599, -0.009271364659071, 0.008829643949866, -0.010839803144336, 0.006338829640299, 0.002171736909077, 0.007160616107285, 0.008712457492948, 0.00435716053471, 0.011661680415273, 0.004245905205607, -0.002628460992128, 0.004565562587231, -0.00752366380766, 0.000394410773879, -0.010771841742098, -0.005378624424338, -0.010317580774426 ], [ 0.029602320864797, -0.046548116952181, 0.004337990190834, -0.015003675594926, 0.029026757925749, -0.008267260156572, -0.028716649860144, -0.003263942431659, -0.040304273366928, 0.027281600981951, 0.007145467679948, 0.034382089972496, -0.007739684078842, 0.010669966228306, -0.007633382454515, 0.037344194948673, -0.038019884377718, 0.004708533640951, -0.016970844939351, 0.010574762709439, 0.020639911293983, 0.004178958013654, 0.025274515151978, 0.00996848847717, 0.012091842480004, 0.000914425880183, -0.010717676952481, -0.015488440170884, -0.00729415519163, -0.022097771987319, 0.007419184781611, -0.006251351442188, 0.007775160949677, -0.018368694931269, 0.000673646689393, -0.031789053231478, 0.021385930478573, 0.00305723794736, 0.015706742182374, -0.003891395870596, 0.008418482728302, -0.008032255806029, -0.01203516125679, -0.00318879284896, -0.014741436578333, -0.008292232640088, -0.007330961059779, -0.009279834106565, 0.008827550336719, -0.010844288393855, 0.006344774737954, 0.002179060829803, 0.007168503943831, 0.00871720444411, 0.004354231525213, 0.011666225269437, -0.004257608670741, 0.002630779519677, -0.004587253555655, 0.0075295669958, -0.000413854140788, 0.010786931030452, 0.005385595373809, 0.010337009094656 ], [ 0.024502325803041, -0.004358087666333, 0.037824351340532, 0.015101718716323, -0.003277734387666, -0.008309533819556, 0.038281265646219, 0.029235763475299, 0.00475688232109, -0.001442671287805, -0.007181345950812, -0.01083910651505, 0.030119195580482, 0.039153195917606, 0.010575528256595, 0.00100127607584, -0.000377605319954, -0.003461295040324, -0.010870822705328, -0.01113061234355, 0.017354734241962, 0.042006950825453, 0.016364904120564, 0.002449915045872, 0.000056329448853, -0.000012544750462, -0.000938781246077, -0.005726565606892, -0.013040662743151, -0.009222297929227, 0.004237472545356, 0.037561930716038, 0.020283430814743, 0.004163704812527, 0.000151645785081, -0.000050443468353, 0.000035140616092, 7.25021254766034e-6, -0.001579832751304, -0.007474309299141, -0.01290831156075, -0.005889653693885, -0.00580265186727, 0.027915868908167, 0.02110475115478, 0.005636924877763, 0.00028199897497, -0.000129395746626, -0.00002751257307, 0.000013072150978, 0.000126714527141, 0.000121296019643, -0.002032989403233, -0.008017566055059, -0.010526789352298, -0.00227492977865, -0.011013896204531, 0.016454288735986, 0.018678609281778, 0.006362328771502, 0.00041158037493, -0.000222915667109, -0.000066604712629, -0.000023968263122 ], [ 0.024497928097844, 0.004354544449598, 0.03781908378005, -0.015098590403795, -0.00327507709153, 0.008303881622851, 0.038279324769974, -0.029230868443847, 0.004757839720696, 0.001445374335162, -0.007175099104643, 0.010834321379662, 0.030122322961688, -0.039149302989244, 0.010576857253909, -0.001003488316201, -0.000383462989703, 0.00346604315564, -0.010860700160265, 0.01113029755652, 0.017361545935273, -0.042007070034742, 0.016365526244044, -0.002453959779814, 0.000057258537709, 0.000017745836885, -0.000952214351855, 0.005730716511607, -0.013027909211814, 0.009229010902345, 0.004243883304298, -0.037567771971226, 0.020282505080104, -0.004167692735791, 0.000153398417751, 0.000051003473345, 0.000032176940294, 6.019420197844738e-6, -0.001599933486432, 0.007473617326468, -0.012895707972348, 0.005903523880988, -0.005801275838166, -0.027926161885262, 0.021102663129568, -0.005637671332806, 0.000283636647509, 0.000131036969833, -0.000028264903449, -0.000011781074136, 0.000118607924378, -0.000098517528386, -0.002054497599602, 0.008008491247892, -0.010517693124712, 0.002293371828273, -0.011020078323781, -0.01646500825882, 0.01867725327611, -0.006357095204294, 0.000411206041463, 0.000226275165915, -0.000068691559136, 0.000024093560569 ], [ 0.029623603448272, -0.015015517361462, 0.046577643603086, -0.004337935708463, 0.003264212748036, -0.029044378548861, 0.049285583198071, -0.008266067132354, -0.004724914673716, 0.001000465126708, 0.00714529491961, -0.038838673382998, 0.0426309928298, -0.010770400986075, -0.010488768108189, 0.001443143934011, -0.00038509190199, 0.002443340606987, 0.010800521820784, -0.041562061756849, 0.030805656686425, -0.011037731543183, -0.016192220151424, 0.00345921702683, 0.000062230566982, 0.000049261405366, -0.000957984186243, 0.004141481593251, 0.012925272807479, -0.036991771310568, 0.01814398355782, -0.009108886122704, -0.019993703812361, 0.005715469829738, 0.000167567239259, -0.000016871532353, -0.000032434996683, 0.000126574741444, -0.00161461357493, 0.005585278850049, 0.012740035541356, -0.027237072587013, 0.008134744130075, -0.00576109578833, -0.020672580227256, 0.007445085793734, 0.000312884309096, -3.482377678665216e-6, 0.000027226558814, -0.000023750906621, -0.000119500393339, 0.000218592671445, -0.002085369313136, 0.006267041899264, 0.010302076116204, -0.015691785141826, 0.002582096727565, -0.002137237461284, -0.018088551238179, 0.007961229421198, 0.000462234544102, 0.000103706144728, 0.000065905122028, -0.000011749487385 ], [ 0.029618680477142, 0.015017523430288, 0.046569805592299, 0.004334279336035, 0.00326321949251, 0.029049135744572, 0.049277022480965, 0.008258519694209, -0.004724426660687, -0.00099640886765, 0.007143100723624, 0.038846589624882, 0.042623221874237, 0.010759426280856, -0.010489676147699, -0.001442149747163, -0.000382656638976, -0.002435066737235, 0.010797180235386, 0.04157242551446, 0.030799888074398, 0.011024925857782, -0.016197614371777, -0.003457624698058, 0.000058325942518, -0.000051132687076, -0.000952445785515, -0.00413081375882, 0.012921336106956, 0.03700240328908, 0.018141455948353, 0.009096788242459, -0.020006356760859, -0.005714619997889, 0.000158108625328, 0.000014713388737, -0.000033393414924, -0.000131439373945, -0.001606428995728, -0.005576112773269, 0.012736399658024, 0.027245171368122, 0.008136766031384, 0.005752569064498, -0.020692782476544, -0.007447123527527, 0.000297318183584, -1.970559651454096e-6, 0.000027853327992, 0.000023981165214, -0.000121942124679, -0.000227186421398, -0.002076801145449, -0.006263176910579, 0.010299814864993, 0.015695443376899, 0.002589660929516, 0.002134594833478, -0.018113108351827, -0.007968133315444, 0.000442274351371, -0.000112989939225, 0.000067627064709, 0.000011883596926 ], [ 0.024508032947779, 0.004346796311438, -0.037835381925106, 0.015103954821825, 0.003274209331721, -0.00828767940402, 0.038297742605209, -0.029240693897009, 0.004761321935803, 0.001447240822017, -0.007172368001193, 0.010809983126819, -0.0301409419626, 0.039161249995232, -0.010584281757474, 0.001003989716992, 0.000385306135286, -0.003469898831099, 0.010854772292078, -0.011099858209491, 0.017379954457283, -0.042018067091703, 0.016376417130232, -0.002454860834405, 0.000056321521697, 0.000019356446501, -0.000956099363975, 0.005735839251429, -0.013017897494137, 0.009195920079947, -0.004263124428689, 0.037575230002403, -0.020295161753893, 0.004168580751866, -0.000150746258441, -0.000052336035878, -0.000030906383472, -9.664589924796019e-6, 0.001604862045497, -0.00747845787555, 0.012881921604276, -0.005872061941773, -0.005779569037259, -0.027929179370403, 0.021114833652973, -0.00563791487366, 0.000278413353954, 0.000134686400997, -0.000029603621442, -0.000010988957001, 0.000115341012133, -0.000093524286058, -0.002057902514935, 0.008011762984097, -0.010502133518457, 0.002267662202939, 0.010994581505656, 0.01646426320076, -0.018686901777983, 0.006356205791235, -0.000403012993047, -0.000233097496675, 0.00007251209172, -0.000025052071578 ], [ 0.024517100304365, -0.00435800338164, -0.037845466285944, -0.015113215893507, 0.003276683622971, 0.008309903554618, 0.038299519568682, 0.029254095628858, 0.00476620811969, -0.001444482360967, -0.007178019732237, -0.010841036215425, -0.030130682513118, -0.039169806987047, -0.010592910461128, -0.001007127109915, 0.000381921388907, 0.00346336979419, 0.010863918811083, 0.011135558597744, 0.017361322417855, 0.04201341047883, 0.016385063529015, 0.002461908152327, 0.000058527533838, -0.000016913671061, -0.000947655120399, -0.005725237075239, -0.013030065223575, -0.00923157017678, -0.004245189484209, -0.037555061280727, -0.02029837295413, -0.004179207608104, -0.000156448644702, 0.000050986327551, -0.000032433268643, 3.315521553304279e-6, 0.001590563333593, 0.007464967202395, 0.012895975261927, 0.005903630517423, -0.005787219386548, 0.027899447828531, 0.021108629181981, 0.005650140345097, 0.000288564158836, -0.000130940621602, -0.000029086973882, 0.000012065785086, 0.000119452437502, 0.000104637932964, -0.002039275830612, -0.007997669279575, -0.01051642652601, -0.002292445627972, 0.010987110435963, -0.016436997801065, -0.01867158152163, -0.00636732717976, -0.000417265458964, 0.000225973941269, 0.000071021786425, 0.000025076658858 ], [ 0.0296003613621, 0.015008001588285, -0.04654448106885, -0.00433009956032, -0.003255712334067, -0.029033260419965, 0.049257751554251, 0.008254388347268, -0.004727591294795, -0.001006065867841, 0.007128905970603, 0.03883084282279, -0.042616505175829, -0.010762036778033, 0.010494598187506, 0.001441944623366, 0.000387319625588, 0.002455780981109, -0.010780301876366, -0.041564345359802, 0.030804537236691, 0.011039772070944, -0.016200937330723, -0.003457156708464, 0.00006506396312, -0.000049279788072, -0.000963621947449, -0.004159811884165, 0.01290802937001, 0.037006836384535, -0.018149957060814, -0.009124148637056, 0.020003920421004, 0.005713751073927, -0.000174177752342, -0.000018893953893, 0.000032034527976, 0.000126907034428, 0.001624235534109, 0.00560524314642, -0.01273144222796, -0.027261652052402, 0.008139719255269, 0.005786110181361, -0.020682347938418, -0.007445463445038, 0.000323048705468, 8.824072210700251e-6, 0.000028138407288, 0.000024163458875, -0.00011846551206, -0.000219847730477, -0.002097784308717, -0.00628260569647, 0.010303179733455, 0.015718352049589, -0.002581076230854, -0.002163742203265, 0.01809617690742, 0.007964881137013, -0.000473665189929, 0.000094188442745, -0.000068635294156, -0.000012262395103 ], [ 0.029608741402626, -0.015009668655694, -0.046555161476135, 0.004333963617682, -0.003262986894697, 0.029034351930022, 0.049263872206211, -0.008258485235274, -0.004724704660475, 0.000996521674097, 0.007143342867494, -0.03882759809494, -0.042615372687578, 0.01076044794172, 0.010490832850337, -0.001441747532226, 0.000381644262234, -0.00243569794111, -0.010798996314406, 0.041553344577551, 0.030798492953181, -0.011027345433831, -0.01620064675808, 0.00345729617402, 0.000057656732679, 0.000052284867706, -0.000950617541093, 0.004132677335292, 0.012925543822348, -0.036987073719501, -0.018144959583879, 0.009099938906729, 0.02001222409308, -0.005715266801417, -0.000156773166964, 0.000012545606296, 0.000035933990148, -0.000134547808557, 0.001604862278327, -0.005579980555922, -0.012742752209306, 0.027235854417086, 0.008141945116222, -0.005754806566983, -0.020702058449388, 0.007449485361576, 0.000295947858831, 7.261920927703613e-6, 0.000028341279176, -0.000023881710149, -0.000128850660985, 0.000232960883295, -0.002077348763123, 0.006269426550716, 0.010306712239981, -0.015692373737693, -0.002593020210043, 0.002133892849088, 0.018125494942069, -0.007971807383001, -0.000442448217655, -0.00012146228255, -0.000068988876592, 0.000013980462427 ], [ 0.029454378411174, 0.030443850904703, 0.0141282081604, 0.0355832464993, 0.04553609713912, 0.01775630004704, -0.02164763584733, 0.021337114274502, 0.006992812734097, 0.035414423793554, 0.030265863984823, -0.013419882394373, -0.022427286952734, -0.01528649777174, 0.00558665394783, -0.022374629974365, 0.009971684776247, 0.026127908378839, -0.011874182149768, -0.019081175327301, 0.004918671678752, -0.023057818412781, -0.001115388004109, -0.014726526103914, -0.034237772226334, -0.012457900680602, 0.009240228682756, -0.004052692558616, -0.024463653564453, -0.000296140700812, 0.016904450953007, -0.001233675749972, -0.004703203681856, 0.004018252715468, -0.024677593261003, -0.025590151548386, -0.019828474149108, -0.007118195295334, 0.00122103234753, -0.016236875206232, -0.004772530402988, 0.01040225289762, 0.004765089135617, 0.012687595561147, -0.002043743152171, 0.008846493437886, 0.001953954342753, -0.019648989662528, -0.007487679831684, -0.013242431916296, -0.012855109758675, 0.001641479320824, -0.004513476975262, -0.005866582039744, 0.009306506253779, 0.004331049975008, -0.006052097305655, 0.00625934638083, 0.001878916053101, 0.001415042206645, 0.011194357648492, -0.001208847737871, -0.007099469192326, 0.006085501518101 ], [ 0.029480129480362, -0.030472030863166, -0.014130911789834, 0.035611052066088, -0.045569702982903, 0.01775991730392, -0.021669490262866, -0.02133747190237, 0.006991695147008, -0.035427834838629, 0.03026357293129, 0.013436045497656, 0.022427955642343, -0.015304518863559, -0.005580761935562, -0.022392466664314, -0.00996561255306, 0.02611331269145, 0.011891548521817, -0.019080083817244, 0.004931897390634, 0.023053087294102, -0.001118631334975, 0.014726800844073, -0.034246511757374, 0.012462007813156, 0.009225006215274, 0.004064935725182, -0.024452656507492, 0.000287610950181, -0.016899585723877, -0.001222168561071, 0.004697842523456, 0.004022645764053, 0.024659436196089, -0.025581493973732, 0.019816843792796, -0.007114326115698, -0.00121295300778, -0.016219068318605, 0.004761074203998, 0.010396421886981, 0.0047583184205, -0.012678474187851, -0.00203941273503, -0.008840074762702, 0.001961648464203, 0.019619358703494, -0.007476756349206, 0.013223488815129, -0.012829967774451, -0.001637458684854, -0.004503859672695, 0.005854456219822, 0.0092932311818, -0.004328130278736, 0.006043461617082, 0.006254262290895, -0.001873931265436, 0.001412615762092, -0.011174019426107, -0.001198553014547, 0.007081945892423, 0.006082248874009 ], [ 0.029465075582266, 0.014126458205283, -0.030457621440291, 0.035594295710325, 0.021331749856472, -0.017756400629878, 0.004776067100465, -0.045553188771009, 0.022251602262259, 0.021142594516277, -0.030262196436524, 0.009320605546236, 0.019779803231359, 0.025500720366836, -0.032307509332895, 0.009214959107339, 0.016352076083422, -0.032207060605288, 0.021930228918791, 0.002967389533296, -0.024103045463562, 0.005121731199324, 0.02484748326242, -0.014641187153757, 0.000104984654172, 0.010194052942097, -0.025792069733143, 0.027026509866118, -0.004235927946866, -0.009062072262168, 0.011006319895387, -0.021701132878661, -0.007098875939846, 0.0134969195351, -0.000602073967457, -0.004390025045723, 0.00492539210245, -0.016078984364867, 0.023059029132128, -0.010870594531298, -0.008286158554256, 0.006741141434759, 0.003495482029393, 0.017850151285529, -0.006604788359255, -0.00734103564173, 0.001475941971876, 0.006680525839329, -0.005340240895748, 0.001475553028286, -0.00741209089756, 0.014295281842351, -0.011387650854886, -0.002649892121553, 0.009343025274575, -0.001355371903628, -0.008520952425897, -0.005499050952494, 0.009389657527208, 0.001314705354162, -0.002283281413838, -0.005330210085958, 0.008046286180615, -0.004374929238111 ], [ 0.029459672048688, -0.014127851463854, 0.030446963384748, 0.035590998828411, -0.021336622536182, -0.017753956839442, 0.004764695186168, 0.045541636645794, 0.02225025370717, -0.021150182932615, -0.030261695384979, -0.009313973598182, -0.019782934337854, 0.025482820346951, 0.032302726060152, 0.00921172183007, -0.016358515247703, -0.03221233934164, -0.021920714527369, 0.002971174195409, -0.024095002561808, -0.005134994164109, 0.024838240817189, 0.014639865607023, 0.000097832533356, -0.010195140726864, -0.025801673531532, -0.027023404836655, -0.004226312041283, 0.009057677350938, -0.010995972901583, -0.021701330319047, 0.007087247911841, 0.013498034328222, 0.00059883686481, -0.004399481229484, -0.004919529426843, -0.016087137162685, -0.023067500442266, -0.010862961411476, 0.008285783231258, 0.006732832174748, 0.003496771678329, -0.017842190340161, -0.006614600773901, 0.007338251918554, 0.001480601495132, -0.006687650922686, -0.00534777995199, -0.001464747241698, -0.007413768675178, -0.014311754144728, -0.011391208507121, 0.00265454989858, 0.009334885515273, 0.001351609244011, 0.008512608706951, -0.005496129859239, -0.009395007975399, 0.001303468830884, 0.002286552917212, -0.005329723935574, -0.008054044097662, -0.004376519471407 ], [ 0.02946999296546, 0.030464045703411, -0.014116321690381, -0.035602174699306, -0.045562732964754, -0.017743511125445, -0.021673563867807, 0.021319661289454, 0.006991104222834, 0.035427179187536, 0.030241830274463, -0.013446158729494, 0.022416219115257, 0.015315301716328, -0.005579160060734, 0.022391272708774, -0.009967846795917, -0.026101402938366, 0.011909820139408, 0.019075712189078, 0.004943124484271, -0.023048741742969, -0.00111970002763, -0.014716811478138, -0.034250024706125, -0.012463202700019, 0.009224828332663, -0.00407793186605, -0.024456594139338, -0.000280657521216, -0.01690093614161, 0.001216106582433, 0.004698570817709, -0.004033736884594, 0.024651896208525, 0.02558907866478, 0.019823051989079, 0.00711315870285, -0.001211838680319, 0.016228878870606, 0.004761875141412, -0.010399214923382, 0.004759540315717, 0.01268067676574, -0.002041908213869, 0.008847447112203, 0.001973682083189, -0.019620271399617, -0.007483322173357, -0.013231582008302, -0.012834654189646, 0.001640593050979, -0.004506452009082, -0.005866450257599, 0.009294700808823, 0.004332969896495, 0.006040206644684, -0.006261699832976, -0.001871917396784, -0.001417454215698, -0.011191338300705, 0.00119482644368, 0.007084750570357, -0.006079421378672 ], [ 0.029472280293703, -0.030464321374893, 0.014125145040452, -0.035602599382401, 0.045560076832771, -0.017748476937413, -0.021666256710887, -0.021334245800972, 0.006988873705268, -0.035418886691332, 0.030252387747169, 0.013439247384667, -0.022422095760703, 0.015300212427974, 0.005592966917902, 0.022392924875021, 0.009954765439034, -0.026117354631424, -0.011894095689058, 0.019071916118264, 0.00493201194331, 0.023053033277392, -0.001105403760448, 0.014707677997649, -0.034245569258928, 0.012475076131523, 0.0092419879511, 0.004054374527186, -0.024449177086353, 0.000281392014585, 0.016897227615118, 0.001228696200997, -0.004706227220595, -0.00404117628932, -0.024651037529111, 0.02557497471571, -0.019826117902994, 0.007101178634912, 0.001237352844328, 0.016223710030317, -0.004761401563883, -0.01039298158139, 0.004760137759149, -0.012677755206823, -0.002056575845927, -0.008833982050419, 0.001969526521862, 0.019626308232546, -0.007462467998266, 0.013223433867097, -0.012830751016736, -0.001659754896536, -0.004508604761213, 0.005869694519788, 0.009290042333305, -0.004324159584939, -0.006040310487151, -0.00626168306917, 0.001874794368632, -0.0013978962088, 0.011175657622516, 0.001208942849189, -0.007091335952282, -0.006098536308855 ], [ 0.029478570446372, 0.014132669195533, 0.030469423159957, -0.035608608275652, -0.021342899650335, 0.017757209017873, 0.004778770264238, -0.045565579086542, 0.022257313132286, 0.021156074479222, -0.030262414366007, 0.009313838556409, -0.019776936620474, -0.025506181642413, 0.032312747091055, -0.009210696443915, -0.016363952308893, 0.032207645475864, -0.021914087235928, -0.002969612833112, -0.024096395820379, 0.005112123675644, 0.024851841852069, -0.014640008099377, 0.000090858033218, 0.010199889540672, -0.02579402551055, 0.027005527168512, -0.00422435766086, -0.009052043780684, -0.011007244698703, 0.021683599799871, 0.007107016164809, -0.013504398055375, 0.000593989971094, 0.004411513917148, -0.004922355525196, 0.016080079600215, -0.023042658343911, 0.010849250480533, 0.008275611326098, -0.006729126907885, 0.003480221377686, 0.017839677631855, -0.006593951955438, -0.007352211046964, 0.001486749737523, 0.006696398835629, -0.005363978911191, 0.001464368775487, -0.007407857570797, 0.014288750477135, -0.011367123574018, -0.002650005044416, 0.009322652593255, -0.001355263520963, 0.008503356948495, 0.005506902467459, -0.009383888915181, -0.001317597925663, 0.002301587723196, 0.005322305951267, -0.008067606016994, 0.004394971765578 ], [ 0.029474899172783, -0.014131116680801, -0.030462456867099, -0.035608734935522, 0.021340541541576, 0.017758080735803, 0.00476875109598, 0.045561533421278, 0.022262906655669, -0.021153656765819, -0.030266067013144, -0.009316192939878, 0.019787024706602, -0.025493388995528, -0.032314889132977, -0.00922167673707, 0.016363194212317, 0.032212875783443, 0.021923186257482, -0.002972473623231, -0.024099715054035, -0.005131156649441, 0.024842659011483, 0.014647025614977, 0.000106651765236, -0.010202744044363, -0.025799706578255, -0.027019226923585, -0.004226577933878, 0.009062845259905, 0.010999649763107, 0.021697340533137, -0.007090334780514, -0.01349613070488, -0.000605699897278, 0.004392902366817, 0.004929501097649, 0.016087006777525, 0.023055426776409, 0.010859061963856, -0.00828867778182, -0.006740689277649, 0.003492950927466, -0.017839023843408, -0.006604104302824, 0.007335753645748, 0.001479210681282, -0.006680272053927, -0.005345814395696, -0.001474276999943, -0.007417481392622, -0.014297467656434, -0.011378953233361, 0.002654968295246, 0.009343080222607, 0.00135880196467, -0.008510620333254, 0.005497406236827, 0.009380096569657, -0.001312482520007, -0.002283051377162, 0.005326015409082, 0.008049206808209, 0.004380345810205 ], [ 0.029469218105078, 0.035604149103165, 0.030456721782684, 0.014124083332717, 0.02133446931839, 0.045556470751762, 0.004768775310367, 0.017746103927493, -0.022264281287789, -0.009223864413798, 0.030252944678068, 0.025491906329989, -0.019780311733484, 0.009305069223046, -0.032321263104677, -0.021152375265956, -0.016364101320505, -0.0146589493379, 0.021907053887844, -0.005127398297191, -0.024089748039842, -0.002975922776386, -0.024853032082319, -0.032208390533924, 0.000104518578155, -0.004399757366627, -0.025802811607718, -0.013517344370484, 0.004216678906232, -0.021688973531127, -0.010992138646543, -0.009057382121682, -0.007098814472556, -0.027011515572667, 0.000612368516158, 0.010200862772763, 0.004922322463244, -0.006683605257422, -0.023059591650963, -0.007354601752013, -0.008286941796541, -0.017828887328506, 0.003493636613712, -0.006733238231391, 0.00660099927336, -0.010852794162929, 0.001498771132901, 0.016089085489511, 0.005353677086532, 0.004385058302432, 0.007411553524435, -0.005317991599441, -0.011382875032723, -0.001318219350651, -0.009336214512587, -0.005489709321409, 0.008505313657224, -0.001357538392767, 0.009378985501826, 0.002654790645465, 0.002305041998625, 0.014304678887129, 0.008058642037213, -0.001463481225073 ], [ 0.029469961300492, 0.035599898546934, -0.030460046604276, -0.014131372794509, -0.021337989717722, -0.045554962009192, 0.004772557411343, 0.01776110008359, -0.022253813222051, -0.009214890189469, 0.030266217887402, 0.025495210662484, 0.019783591851592, -0.009322662837803, 0.032305341213942, 0.021148629486561, 0.016357682645321, 0.014639821834862, -0.021929390728474, 0.005127075128257, -0.024103440344334, -0.00296610663645, -0.024837579578161, -0.032208379358053, 0.000102477613837, -0.00439570704475, -0.025794461369514, -0.013490686193109, 0.004236157983541, -0.021700130775571, 0.011008074507117, 0.009061964228749, 0.007086172234267, 0.027018832042813, -0.000603234802838, -0.010197452269495, -0.004923780448735, 0.006680749356747, 0.023052204400301, 0.007327378727496, 0.008282652124763, 0.017848316580057, 0.00348828942515, -0.006747734267265, 0.006611734163016, -0.010861121118069, 0.001480406732298, 0.01608394831419, 0.005347642116249, 0.00438011623919, 0.007415441330522, -0.005320317111909, -0.011373793706298, -0.00129795097746, -0.00934614893049, -0.005505065899342, -0.0085145579651, 0.001370583311655, -0.009387481026351, -0.002654216717929, -0.002282446715981, -0.014298301190138, -0.008050806820393, 0.001468093018048 ], [ 0.029462808743119, 0.035599544644356, 0.014122364111245, -0.030447997152805, -0.045549761503935, 0.021332072094083, -0.021660340949893, -0.017745254561305, -0.007008764892817, 0.022368444129825, -0.030251616612077, -0.015302108600736, -0.022420441731811, 0.013431152328849, -0.005594823975116, 0.035436283797026, 0.00999148003757, 0.014708771370351, 0.011893593706191, -0.023054331541061, 0.004929963499308, 0.019072182476521, 0.001118011423387, 0.026122853159904, -0.034245874732733, -0.025605635717511, 0.009246107190847, -0.004031176213175, 0.024456085637212, -0.001227359520271, 0.016898073256016, 0.000285640213406, 0.004707336891443, -0.004067739471793, -0.024662159383297, 0.012450004927814, 0.019831581041217, -0.019641023129225, 0.001218797755428, -0.00884301494807, 0.004763304721564, 0.012678262777627, 0.004761845804751, -0.010395561344922, 0.002050816081464, -0.016234874725342, 0.001972787547857, 0.007110131904483, 0.007498909253627, -0.006082675419748, 0.012850637547672, -0.001194574753754, -0.004510858561844, -0.001404457958415, -0.009295763447881, 0.006261380854994, -0.006037984509021, -0.004326356574893, -0.00187027384527, -0.005867801140994, 0.011196651495993, -0.001648007892072, 0.007093331310898, -0.013246774673462 ], [ 0.029468033462763, 0.035594809800386, -0.014120041392744, 0.030466580763459, 0.045560907572508, -0.021323142573237, -0.021667884662747, -0.017749670892954, -0.006977694574744, 0.022403882816434, -0.030250368639827, -0.015305116772652, 0.022418916225433, -0.013443231582642, 0.005575487855822, -0.035415805876255, -0.009951031766832, -0.01472695171833, -0.011901107616723, 0.023048376664519, 0.004936904180795, 0.019078344106674, 0.001110863871872, 0.026105672121048, -0.034253090620041, -0.02558209002018, 0.009221957065165, -0.00403619883582, 0.024457175284624, -0.001223294995725, -0.016899757087231, -0.000281283602817, -0.004694909323007, 0.004065128508955, 0.024662686511874, -0.012475117109716, -0.019824773073196, 0.019626723602414, -0.001222749240696, 0.00885015539825, -0.004763283301145, -0.012677254155278, 0.004759963601828, -0.010400494560599, 0.002050326438621, -0.016226062551141, 0.001968261785805, 0.007120044901967, 0.007475456222892, -0.006079495884478, 0.012840787880123, -0.001203434192576, -0.004503868054599, -0.001407577772625, -0.009295309893787, 0.006261905189604, 0.006040684878826, 0.004328385461122, 0.001864849939011, 0.005872072186321, -0.011190067976713, 0.001645004958846, -0.007087196223438, 0.013229021802545 ], [ 0.029470790177584, -0.03560484573245, 0.030460104346275, -0.014122853986919, 0.021329706534743, -0.045559074729681, 0.004772260785103, -0.017749009653926, -0.022265233099461, 0.009227840229869, 0.030252216383815, -0.025495750829577, -0.01978094317019, -0.009314117953181, -0.032319616526365, 0.021146377548575, -0.016360675916076, 0.014657071791589, 0.021915815770626, 0.00512625509873, -0.024096770212054, 0.002966105239466, -0.024847315624356, 0.032202795147896, 0.000111480585474, 0.004392222501338, -0.025796247646213, 0.013504758477211, 0.00422995723784, 0.021694565191865, -0.011001463979483, 0.009053518995643, -0.007090928964317, 0.027011694386601, 0.000613147218246, -0.010201990604401, 0.004927366506308, 0.00668097473681, -0.023051738739014, 0.007337090559304, -0.008278045803308, 0.017839508131146, 0.003489265451208, 0.00673527084291, 0.006608988624066, 0.010856987908483, 0.001486116903834, -0.016085343435407, 0.00534806214273, -0.004382441285998, 0.007411296479404, 0.005327301565558, -0.011374856345356, 0.0013045076048, -0.00933254044503, 0.005498548038304, 0.008508185856044, 0.001360337832011, 0.009386662393808, -0.002651716349646, 0.002286312403157, -0.014294215478003, 0.008056290447712, 0.001470490940847 ], [ 0.029475085437298, -0.035605020821095, -0.030468510463834, 0.014126959256828, -0.021332381293178, 0.04556655138731, 0.004780274350196, -0.017755001783371, -0.022257767617702, 0.009216277860105, 0.030258057639003, -0.025508891791105, 0.01978068985045, 0.009318264201283, 0.032317198812962, -0.021143354475498, 0.016351515427232, -0.014648431912065, -0.021921809762716, -0.005119303707033, -0.024104250594974, 0.002966350642964, -0.024854227900505, 0.032202307134867, 0.000100804238173, 0.004398840945214, -0.025788821280003, 0.013506268151104, 0.004231088329107, 0.021698664873838, 0.011007083579898, -0.009056604467332, 0.007097419351339, -0.027014706283808, -0.000605363864452, 0.010189041495323, -0.004913382232189, -0.006683594547212, 0.023051641881466, -0.007340846583247, 0.008282392285764, -0.017843736335635, 0.003491286654025, 0.006736672017723, 0.006610956974328, 0.010857686400414, 0.00148798734881, -0.016075124964118, 0.005350001621991, -0.004380483180285, 0.007402640301734, 0.005321734119207, -0.011375579051673, 0.00130118872039, -0.009336124174297, 0.005492703523487, -0.008510520681739, -0.001357400789857, -0.00938973762095, 0.002657748293132, -0.002289943629876, 0.014295713976026, -0.008054212667048, -0.001457077683881 ], [ 0.029467366635799, -0.035600073635578, 0.014127681963146, 0.030455945059657, -0.045554183423519, -0.02133727632463, -0.021660070866346, 0.017753016203642, -0.006998315453529, -0.022379403933883, -0.030260900035501, 0.015296101570129, -0.022425048053265, -0.013432295061648, -0.005590120796114, -0.035427898168564, 0.009977286681533, -0.014719221740961, 0.011888347566128, 0.023052558302879, 0.004927583038807, -0.019079307094216, 0.001110085751861, -0.026123896241188, -0.034243978559971, 0.02559245377779, 0.00923992972821, 0.004032643511891, 0.024458101019263, 0.001227842527442, 0.016899133101106, -0.000287076371023, 0.00469436077401, 0.004057040903717, -0.024667421355844, -0.012454343028367, 0.019821129739285, 0.01963915862143, 0.001227295957506, 0.008855121210217, 0.004763633478433, -0.012675499543548, 0.004759571515024, 0.010401715524495, 0.002044563414529, 0.016223400831223, 0.001965690637007, -0.007112701423466, 0.007489801384509, 0.006077005062252, 0.012845147401094, 0.00120530219283, -0.004494458902627, 0.001413767342456, -0.009299635887146, -0.006252632476389, -0.00604275520891, 0.004329296760261, -0.001862904522568, 0.005859423894435, 0.011194876395166, 0.001650019548833, 0.007094756234437, 0.013233548030257 ], [ 0.029470831155777, -0.03560359030962, -0.014123908244073, -0.030461871996522, 0.045561462640762, 0.021333588287234, -0.021666798740625, 0.017747238278389, -0.006994570605457, -0.022388108074665, -0.030254537239671, 0.015302280895412, 0.022420583292842, 0.013441703282297, 0.005593696609139, 0.03542846813798, -0.009969834238291, 0.014711600728333, -0.011898683384061, -0.023050917312503, 0.004936056677252, -0.019074466079473, 0.001104977331124, -0.026124263182282, -0.034248378127813, 0.025587012991309, 0.009247182868421, 0.004043345805258, 0.024455418810248, 0.001223302911967, -0.01689718477428, 0.000276953418506, -0.004698549862951, -0.004057019483298, 0.02466369792819, 0.012461174279451, -0.01981807500124, -0.019642982631922, -0.001236029434949, -0.008850223384798, -0.004756855778396, 0.012674777768552, 0.004753492306918, 0.010400047525764, 0.002052740426734, 0.016226395964622, 0.001969013828784, -0.007105026394129, 0.007480373140424, 0.006079065147787, 0.012842572294176, 0.001211878028698, -0.004501304589212, 0.001404260168783, -0.009297815151513, -0.006251393351704, 0.006041585002095, -0.004322266206145, 0.001862392760813, -0.005865845363587, -0.011194051243365, -0.00165461236611, -0.007102971430868, -0.013221827335656 ], [ 0.029480926692486, 0.014130366034806, 0.035614971071482, 0.030470460653305, 0.017758777365088, 0.021337551996112, 0.016897598281503, 0.045571759343147, 0.015267788432539, 0.01431121956557, 0.03026370704174, 0.018147753551602, -0.008322631008923, 0.037671007215977, 0.02581138163805, 0.004149599000812, 0.008611917495728, 0.026292424649, 0.031176302582026, 0.007550936657935, -0.022847209125757, 0.013539340347052, 0.025973407551646, 0.007599046919495, -0.001376195577905, 0.003760561114177, 0.016562398523092, 0.02989536523819, 0.02022204361856, -0.002836860716343, -0.02064329572022, -0.009665767662227, 0.015482729300857, 0.008414251729846, -0.002557030180469, -0.002745615085587, 0.000847699586302, 0.007400017697364, 0.019781388342381, 0.022722573950887, 0.005471768788993, -0.007283541373909, -0.008407510817051, -0.018887711688876, 0.001631329767406, 0.005680761765689, -0.003010435029864, -0.0052574807778, -0.002042287494987, -0.000323721120367, 0.001662351074629, 0.008921289816499, 0.015885166823864, 0.010160185396671, -0.004044115543365, -0.005691730417311, 0.002528332872316, -0.013814925216138, -0.007155600469559, 0.000981555553153, -0.002633077790961, -0.00614823307842, -0.003860151395202, -0.00084496877389 ], [ 0.029476711526513, -0.014128807000816, 0.035612415522337, -0.030464377254248, 0.017754264175892, -0.021339558064938, 0.016899686306715, -0.045566391199827, 0.015265002846718, -0.014307239092886, 0.030262727290392, -0.018155300989747, -0.00832106359303, -0.037670347839594, 0.025806615129113, -0.004151825793087, 0.008611794561148, -0.026290813460946, 0.031182870268822, -0.007558998186141, -0.022851722314954, -0.013539249077439, 0.025967897847295, -0.007598010823131, -0.001370542799123, -0.003765662899241, 0.016563357785344, -0.029899526387453, 0.020229801535606, 0.002834203885868, -0.020651573315263, 0.009672083891928, 0.015477005392313, -0.00840727891773, -0.002555128419772, 0.002739547286183, 0.000857484410517, -0.007404869422317, 0.019783699885011, -0.022727401927114, 0.00547149265185, 0.00728498538956, -0.008412272669375, 0.018900053575635, 0.001624402939342, -0.005672565195709, -0.003018511924893, 0.005254445131868, -0.002039092825726, 0.000311796698952, 0.001671863021329, -0.008920632302761, 0.015887223184109, -0.010157135315239, -0.004051171708852, 0.005690869875252, 0.002529580146074, 0.013826137408614, -0.007165271323174, -0.000979254255071, -0.002644725842401, 0.006155803799629, -0.003858101321384, 0.000847382296342 ], [ 0.029472507536411, -0.030462453141809, 0.035603642463684, 0.014130960218608, -0.017758114263415, -0.045558288693428, 0.016888858750463, 0.02134052850306, -0.015264203771949, 0.004152069799602, -0.030266553163528, -0.037656657397747, -0.008327398449183, 0.018152402713895, -0.025801256299019, -0.014310143887997, 0.008613081648946, 0.007595963776112, -0.031183445826173, -0.013528542593122, -0.02284980006516, 0.007552628405392, -0.025957502424717, -0.026294218376279, -0.001367999240756, 0.002734296955168, 0.016565894708037, 0.008400787599385, -0.020227270200849, 0.009671961888671, -0.020646141842008, -0.002842156449333, -0.01546795014292, -0.029901729896665, -0.00255133304745, 0.0037660098169, -0.000857589649968, 0.005244945641607, 0.01978724822402, 0.005663526710123, -0.005467006936669, 0.01889257133007, -0.008411519229412, -0.007293740753084, -0.001625264063478, -0.022729003801942, -0.003017257200554, 0.007408444769681, 0.002031384268776, -0.000837397819851, -0.001677067368291, 0.006146993488073, 0.015891123563051, 0.000974481226876, 0.00405914708972, 0.013823581859469, 0.002524570561945, -0.005699716508389, 0.007153306156397, -0.010158914141357, -0.00264941342175, 0.008928832598031, 0.003845261642709, 0.000311179202981 ], [ 0.029475940391421, 0.030466673895717, 0.035607352852821, -0.014129498973489, -0.017757328227162, 0.04556367918849, 0.016890186816454, -0.021337270736694, -0.015267205424607, -0.004151055589318, -0.030262343585491, 0.037659499794245, -0.008327739313245, -0.018148962408304, -0.025807222351432, 0.014310852624476, 0.008613114245236, -0.007598117459565, -0.031176138669252, 0.013527513481677, -0.022849032655358, -0.007552672643214, -0.025964055210352, 0.026292037218809, -0.001374770072289, -0.002745336387306, 0.016563847661018, -0.008408350870013, -0.020222553983331, -0.00967434886843, -0.020642582327127, 0.002836455358192, -0.015470831654966, 0.029894938692451, -0.002557792700827, -0.003762274980545, -0.000848918571137, -0.005259807221591, 0.019782077521086, -0.005672337021679, -0.005471523385495, -0.018892131745815, -0.008406245149672, 0.007285454310477, -0.00162219570484, 0.022721886634827, -0.003015482099727, -0.007401396520436, 0.002042821841314, 0.00084561156109, -0.001661973074079, -0.006154597736895, 0.015885466709733, -0.00097651372198, 0.004045954439789, -0.013818013481796, 0.002528941025957, 0.005695648957044, 0.007159082684666, 0.010159510187805, -0.002639293903485, -0.008921030908823, 0.003862736048177, -0.000323166401358 ], [ 0.02946150675416, -0.014130151830614, -0.035586968064308, 0.0304552949965, -0.017761167138815, 0.021335816010833, 0.016872894018888, -0.045545753091574, 0.015259455889463, -0.014313768595457, 0.030267937108874, -0.01814241334796, 0.008338139392436, 0.037641696631908, -0.025796215981245, 0.004144285339862, -0.008612956851721, 0.026299174875021, -0.031179271638393, 0.007540833204985, -0.022853031754494, -0.01351385563612, 0.025956520810723, -0.007587594445795, -0.001378211658448, -0.003761301981285, 0.016566056758165, -0.029906028881669, 0.020219001919031, 0.002849657321349, 0.020642215386033, -0.009684707038105, -0.015470480546355, 0.008399814367294, 0.002564267255366, -0.002743856050074, -0.000849950127304, 0.007401120848954, -0.019789347425103, 0.022733494639397, -0.005460635758936, -0.007293689996004, -0.00840309727937, 0.018901888281107, 0.001625901437365, -0.005670489743352, -0.003023736877367, 0.00525732897222, -0.002038385719061, 0.000319834973197, 0.001665052259341, -0.008923217654228, 0.015897596254945, -0.010166459716856, -0.004059360828251, 0.005694359540939, -0.002533474005759, -0.013827923685312, 0.007158741354942, 0.000980701530352, 0.002648088382557, -0.006153414957225, 0.003853792091832, -0.000841516593937 ], [ 0.029472731053829, 0.014129751361907, -0.035602536052465, -0.030464719980955, -0.01775810867548, -0.021338384598494, 0.016886085271835, 0.045558881014585, 0.015268500894308, 0.014313157647848, 0.030264424160123, 0.018151422962546, 0.008329131640494, -0.037652518600225, -0.02580650895834, -0.004155034199357, -0.008617873303592, -0.026295579969883, -0.031180173158646, -0.007555888965726, -0.022847251966596, 0.013521444052458, 0.025958484038711, 0.00760218128562, -0.001370063866489, 0.003768900642172, 0.016570806503296, 0.029898703098297, 0.02022866345942, -0.002834165468812, 0.0206393674016, 0.009676313959062, -0.015461530536413, -0.008407028391957, 0.002550545614213, 0.002742513781413, -0.000855278223753, -0.007412121165544, -0.01978719048202, -0.022725915536284, -0.005478280130774, 0.007285559549928, -0.008404123596847, -0.018889844417572, 0.001614155480638, 0.005663136951625, -0.00301055656746, -0.005253865383565, -0.002043218351901, -0.000318947917549, 0.001673110644333, 0.008930354379117, 0.015886437147856, 0.01016476098448, -0.004041144624352, -0.005697765387595, -0.002528920769691, 0.013814711011946, 0.007161700632423, -0.000963013502769, 0.002641543513164, 0.006146799307317, 0.003861958393827, 0.000848444760777 ], [ 0.029469264671206, 0.03046577423811, -0.03559547662735, 0.0141267394647, 0.017759755253792, -0.045558597892523, 0.016876913607121, -0.021329248324037, -0.015269736759365, -0.004151382483542, -0.030262023210526, 0.037650112062693, 0.008336361497641, 0.018135257065296, 0.025810446590185, -0.014316746033728, -0.008618376217782, 0.007599015254527, 0.031168987974524, -0.013519348576665, -0.022849420085549, -0.007537375669926, -0.025967204943299, 0.026299269869924, -0.001377135515213, -0.002747888676822, 0.016571490094066, -0.008410861715674, -0.020210839807987, -0.009675432927907, 0.020638037472963, -0.002847707830369, 0.015475883148611, -0.029898500069976, 0.002561742439866, 0.003765261499211, 0.000850970158353, 0.005264507606626, -0.019788168370724, 0.00567770935595, 0.005462379194796, 0.018887490034103, -0.008403928950429, 0.007290733512491, -0.001631420222111, 0.022721271961927, -0.003018958726898, -0.007405451033264, 0.002043543150648, 0.000844832335133, -0.001664371346124, -0.006159815471619, 0.015888504683971, -0.000984385143965, 0.004048054572195, -0.013815545476973, -0.002526087453589, -0.005698292516172, -0.007147120777518, -0.010159748606384, 0.002640417544171, 0.008923457935452, -0.003864001017064, 0.000319774931995 ], [ 0.029472196474671, -0.030463891103864, -0.035602208226919, -0.014129766263068, 0.017756137996912, 0.04556080698967, 0.01688520424068, 0.021338192746043, -0.015264494344592, 0.004149942658842, -0.030264200642705, -0.037657674401999, 0.008333027362823, -0.018149651587009, 0.025805499404669, 0.014304673299193, -0.00860308855772, -0.007597215939313, 0.031183393672109, 0.013524151407182, -0.022854007780552, 0.007550993002951, -0.02596639841795, -0.026287954300642, -0.001369951409288, 0.002733456902206, 0.016552286222577, 0.008409148082137, -0.020231656730175, 0.009681697003543, 0.020643582567573, 0.002841271925718, 0.015475964173675, 0.029901875182986, 0.002550862729549, -0.003753811353818, 0.000846507726237, -0.005241250619292, -0.01978094317019, -0.005674932617694, 0.005475988145918, -0.018900418654084, -0.008399826474488, -0.007290315348655, -0.001625272445381, -0.022740416228771, -0.003011100227013, 0.007390266750008, 0.002027517184615, -0.000832044286653, -0.001659747678787, 0.006139791104943, 0.01590009778738, 0.000979009550065, 0.004047692753375, 0.013819831423461, -0.00254048849456, 0.005695563741028, -0.007161162327975, 0.010180320590734, 0.002640824532136, -0.008916389197111, -0.003838002914563, -0.000319048267556 ] ], "Routing": [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48 ] }, "LoudspeakerLayout": { "Name": "A loudspeaker layout", "Loudspeakers": [ { "Azimuth": 20.745809555053711, "Elevation": -3.551964521408081, "Radius": 1.0, "IsImaginary": false, "Channel": 1, "Gain": 1.0 }, { "Azimuth": -20.745819091796875, "Elevation": 3.551964521408081, "Radius": 1.0, "IsImaginary": false, "Channel": 2, "Gain": 1.0 }, { "Azimuth": -3.79754638671875, "Elevation": -20.704124450683594, "Radius": 1.0, "IsImaginary": false, "Channel": 3, "Gain": 1.0 }, { "Azimuth": 3.797540664672852, "Elevation": 20.704124450683594, "Radius": 1.0, "IsImaginary": false, "Channel": 4, "Gain": 1.0 }, { "Azimuth": 159.254196166992188, "Elevation": 3.551964521408081, "Radius": 1.0, "IsImaginary": false, "Channel": 5, "Gain": 1.0 }, { "Azimuth": -159.254196166992188, "Elevation": -3.551964521408081, "Radius": 1.0, "IsImaginary": false, "Channel": 6, "Gain": 1.0 }, { "Azimuth": -176.20245361328125, "Elevation": 20.704124450683594, "Radius": 1.0, "IsImaginary": false, "Channel": 7, "Gain": 1.0 }, { "Azimuth": 176.20245361328125, "Elevation": -20.704124450683594, "Radius": 1.0, "IsImaginary": false, "Channel": 8, "Gain": 1.0 }, { "Azimuth": 93.797538757324219, "Elevation": 20.704124450683594, "Radius": 1.0, "IsImaginary": false, "Channel": 9, "Gain": 1.0 }, { "Azimuth": 86.202461242675781, "Elevation": -20.704124450683594, "Radius": 1.0, "IsImaginary": false, "Channel": 10, "Gain": 1.0 }, { "Azimuth": 110.745811462402344, "Elevation": -3.551964521408081, "Radius": 1.0, "IsImaginary": false, "Channel": 11, "Gain": 1.0 }, { "Azimuth": 69.254188537597656, "Elevation": 3.551964521408081, "Radius": 1.0, "IsImaginary": false, "Channel": 12, "Gain": 1.0 }, { "Azimuth": -86.20245361328125, "Elevation": 20.704124450683594, "Radius": 1.0, "IsImaginary": false, "Channel": 13, "Gain": 1.0 }, { "Azimuth": -93.79754638671875, "Elevation": -20.704124450683594, "Radius": 1.0, "IsImaginary": false, "Channel": 14, "Gain": 1.0 }, { "Azimuth": -69.254180908203125, "Elevation": -3.551964521408081, "Radius": 1.0, "IsImaginary": false, "Channel": 15, "Gain": 1.0 }, { "Azimuth": -110.745803833007812, "Elevation": 3.551964521408081, "Radius": 1.0, "IsImaginary": false, "Channel": 16, "Gain": 1.0 }, { "Azimuth": -9.939422607421875, "Elevation": 68.965538024902344, "Radius": 1.0, "IsImaginary": false, "Channel": 17, "Gain": 1.0 }, { "Azimuth": 170.060562133789062, "Elevation": 68.965538024902344, "Radius": 1.0, "IsImaginary": false, "Channel": 18, "Gain": 1.0 }, { "Azimuth": -99.939422607421875, "Elevation": 68.965538024902344, "Radius": 1.0, "IsImaginary": false, "Channel": 19, "Gain": 1.0 }, { "Azimuth": 80.060562133789062, "Elevation": 68.965538024902344, "Radius": 1.0, "IsImaginary": false, "Channel": 20, "Gain": 1.0 }, { "Azimuth": 9.939436912536621, "Elevation": -68.965538024902344, "Radius": 1.0, "IsImaginary": false, "Channel": 21, "Gain": 1.0 }, { "Azimuth": -170.060562133789062, "Elevation": -68.965538024902344, "Radius": 1.0, "IsImaginary": false, "Channel": 22, "Gain": 1.0 }, { "Azimuth": 99.939437866210938, "Elevation": -68.965538024902344, "Radius": 1.0, "IsImaginary": false, "Channel": 23, "Gain": 1.0 }, { "Azimuth": -80.060577392578125, "Elevation": -68.965538024902344, "Radius": 1.0, "IsImaginary": false, "Channel": 24, "Gain": 1.0 }, { "Azimuth": 42.147251129150391, "Elevation": 17.568155288696289, "Radius": 1.0, "IsImaginary": false, "Channel": 25, "Gain": 1.0 }, { "Azimuth": -42.147247314453125, "Elevation": -17.568155288696289, "Radius": 1.0, "IsImaginary": false, "Channel": 26, "Gain": 1.0 }, { "Azimuth": 23.123760223388672, "Elevation": -39.772441864013672, "Radius": 1.0, "IsImaginary": false, "Channel": 27, "Gain": 1.0 }, { "Azimuth": -23.123748779296875, "Elevation": 39.772441864013672, "Radius": 1.0, "IsImaginary": false, "Channel": 28, "Gain": 1.0 }, { "Azimuth": 137.852752685546875, "Elevation": -17.568155288696289, "Radius": 1.0, "IsImaginary": false, "Channel": 29, "Gain": 1.0 }, { "Azimuth": -137.852752685546875, "Elevation": 17.568155288696289, "Radius": 1.0, "IsImaginary": false, "Channel": 30, "Gain": 1.0 }, { "Azimuth": 156.876235961914062, "Elevation": 39.772441864013672, "Radius": 1.0, "IsImaginary": false, "Channel": 31, "Gain": 1.0 }, { "Azimuth": -156.876235961914062, "Elevation": -39.772441864013672, "Radius": 1.0, "IsImaginary": false, "Channel": 32, "Gain": 1.0 }, { "Azimuth": 66.876235961914062, "Elevation": 39.772441864013672, "Radius": 1.0, "IsImaginary": false, "Channel": 33, "Gain": 1.0 }, { "Azimuth": 113.123764038085938, "Elevation": -39.772441864013672, "Radius": 1.0, "IsImaginary": false, "Channel": 34, "Gain": 1.0 }, { "Azimuth": 132.147247314453125, "Elevation": 17.568155288696289, "Radius": 1.0, "IsImaginary": false, "Channel": 35, "Gain": 1.0 }, { "Azimuth": 47.852748870849609, "Elevation": -17.568155288696289, "Radius": 1.0, "IsImaginary": false, "Channel": 36, "Gain": 1.0 }, { "Azimuth": -113.123764038085938, "Elevation": 39.772441864013672, "Radius": 1.0, "IsImaginary": false, "Channel": 37, "Gain": 1.0 }, { "Azimuth": -66.876251220703125, "Elevation": -39.772441864013672, "Radius": 1.0, "IsImaginary": false, "Channel": 38, "Gain": 1.0 }, { "Azimuth": -47.852752685546875, "Elevation": 17.568155288696289, "Radius": 1.0, "IsImaginary": false, "Channel": 39, "Gain": 1.0 }, { "Azimuth": -132.147247314453125, "Elevation": -17.568155288696289, "Radius": 1.0, "IsImaginary": false, "Channel": 40, "Gain": 1.0 }, { "Azimuth": 25.258720397949219, "Elevation": 44.978523254394531, "Radius": 1.0, "IsImaginary": false, "Channel": 41, "Gain": 1.0 }, { "Azimuth": -154.74127197265625, "Elevation": 44.978523254394531, "Radius": 1.0, "IsImaginary": false, "Channel": 42, "Gain": 1.0 }, { "Azimuth": -64.74127197265625, "Elevation": 44.978523254394531, "Radius": 1.0, "IsImaginary": false, "Channel": 43, "Gain": 1.0 }, { "Azimuth": 115.258720397949219, "Elevation": 44.978523254394531, "Radius": 1.0, "IsImaginary": false, "Channel": 44, "Gain": 1.0 }, { "Azimuth": -25.25872802734375, "Elevation": -44.978523254394531, "Radius": 1.0, "IsImaginary": false, "Channel": 45, "Gain": 1.0 }, { "Azimuth": 154.74127197265625, "Elevation": -44.978523254394531, "Radius": 1.0, "IsImaginary": false, "Channel": 46, "Gain": 1.0 }, { "Azimuth": 64.741279602050781, "Elevation": -44.978523254394531, "Radius": 1.0, "IsImaginary": false, "Channel": 47, "Gain": 1.0 }, { "Azimuth": -115.25872802734375, "Elevation": -44.978523254394531, "Radius": 1.0, "IsImaginary": false, "Channel": 48, "Gain": 1.0 } ] } }././@LongLink0000644000000000000000000000015400000000000011603 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/SimpleDecoder/Source/Presets/MSDecoder.jsonIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/SimpleDecoder/Source/Presets/MSDecod0000664002537200253720000000077515257173642031445 0ustar zmoelnigzmoelnig{ "Decoder": { "Name": "Stereo M/S Decoder", "Description": "Uses Mid-Side-Decoding to create stereo signals", "ExpectedInputNormalization": "sn3d", "Weights": "none", "WeightsAlreadyApplied": false, "Matrix": [ [ 0.5, 0.5, 0, 0 ], [ 0.5, -0.5, 0, 0 ] ], "Routing": [ 1, 2 ] } } ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/SimpleDecoder/Source/Presets/Quadraphonic.jsonIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/SimpleDecoder/Source/Presets/Quadrap0000664002537200253720000001761615257173642031566 0ustar zmoelnigzmoelnig{ "Decoder": { "Name": "Quadraphonic", "Description": "Channel order: FL FR RL RR", "ExpectedInputNormalization": "n3d", "Weights": "none", "WeightsAlreadyApplied": false, "Matrix": [ [ 0.3782190978527069, 0.2006816565990448, -3.065219516429352e-6, 0.2006764858961105, 0.1189835369586945, 2.856433184206253e-6, 0.05456873401999474, -7.692250392210553e-7, 8.186520972230937e-8, 1.305635350945522e-6, -6.042028530828247e-7, 4.571683803078486e-6, -5.379617959988536e-6, -4.481257747102063e-6, 1.038325265767526e-7, 1.088635258383874e-6, 4.231683892186311e-9, 1.44090097364824e-6, 0.01717651635408401, 3.982030648330692e-6, -0.003299062140285969, -1.333375848844298e-6, 3.353285364937619e-7, -1.039341057662568e-7, 0.01970149576663971, -6.921745239196753e-7, -1.252576851129561e-7, 6.829958692833316e-6, 3.185080004186602e-6, -4.113027898711152e-6, -1.601617213964346e-6, 4.307922154112021e-6, -5.543785874806417e-8, 5.770537427451927e-6, -1.874349322861235e-6, -1.294887965741509e-7, -0.009296035394072533, 6.324862624751404e-7, -1.383468344329231e-7, 6.721677436871687e-6, 0.006273643579334021, -4.579153483064147e-6, 0.0004151816829107702, 3.705269818965462e-6, 4.717222168437729e-7, 3.138428382953862e-6, 0.001772351330146194, -3.07894651996321e-7, 4.690923205430408e-8, 6.851818739050941e-7, 1.903342422338028e-6, -6.530983682750957e-6, 1.147942185752981e-7, -1.45034869092342e-6, 1.107368348129967e-6, 1.013753262668615e-6, -4.103395440324675e-6, -1.541057827125769e-6, 6.042007072437627e-8, -2.559692120485124e-6, 3.797714043685119e-6, 7.259657650138251e-6, -3.63802286074133e-7, 2.264210650082532e-7 ], [ 0.3782088458538055, -0.2006832212209702, 2.336624675081111e-6, 0.2006765753030777, -0.1189926192164421, -2.010324351431336e-6, 0.05456367507576942, 5.604843167361651e-8, -1.227131747327803e-7, -4.48830951427226e-6, -2.541403773648199e-6, 4.118560639199131e-7, 5.720435638068011e-6, 3.072024583161692e-6, -1.294813358754254e-7, 2.916716312029166e-6, -5.62452768804178e-8, -3.36812924217611e-8, -0.01717177592217922, -5.010856511944439e-6, -0.003313837107270956, -4.10933807870606e-6, -2.68395183411485e-7, -1.466807248107216e-6, 0.01971237733960152, 4.345075922174146e-6, -2.313182818625137e-7, -6.621337433898589e-8, 2.607016540423501e-6, -1.028993665386224e-6, 7.67793380873627e-7, -2.060006863757735e-6, 3.771995693568897e-8, -2.635072178236442e-6, 3.166597934978199e-6, 3.331997731947922e-6, 0.009306267835199833, -1.690744056759286e-6, 5.895789634280391e-9, -7.089171049301513e-6, -0.006274993531405926, 4.579408141580643e-6, 0.0004047956317663193, 2.081123056996148e-6, -5.43258352081466e-7, 4.308838924771408e-6, 0.001768808229826391, -2.682480499061057e-6, 1.303090186866029e-7, 4.483317297854228e-6, 3.691024176077917e-6, 4.800587021236424e-7, 2.200212101399757e-8, -1.492491833232634e-6, -2.943049139503273e-6, 8.188637252715125e-7, 4.763872311741579e-6, 3.700499462411244e-7, 7.019624348458819e-8, 1.216145165017224e-6, -4.666268978326116e-6, -3.048084181500599e-6, 3.802798005381192e-7, -3.497754960335442e-6 ], [ 0.3782084286212921, 0.2006741017103195, 2.34060962611693e-6, -0.2006807774305344, -0.1189927980303764, -2.0056886569364e-6, 0.05456371977925301, 4.644031648126656e-8, -1.087685390643855e-7, -4.487787919060793e-6, -2.540412879170617e-6, 4.173857348632737e-7, 5.718829925172031e-6, 3.074162123084534e-6, -1.216918832369629e-7, 2.914467131631682e-6, -5.919665468923085e-8, -1.799966220517035e-8, -0.01717181876301765, -5.006985247746343e-6, -0.003313839435577393, -4.104460913367802e-6, -2.919820190072642e-7, -1.475629346714413e-6, 0.01971239782869816, 4.349428763816832e-6, -2.235391036720102e-7, -7.048871708548177e-8, 2.621429985083523e-6, -1.039501057675807e-6, 7.782574584780377e-7, -2.031923258982715e-6, 4.353151084046658e-8, -2.637996431076317e-6, 3.163757128277211e-6, 3.330453864691663e-6, 0.009306243620812893, -1.69581846876099e-6, 1.402947003015242e-8, -7.083389846229693e-6, -0.006275018211454153, 4.578593234327855e-6, 0.0004047936236020178, 2.07852826861199e-6, -5.300379939399136e-7, 4.304274170863209e-6, 0.001768807880580425, -2.675121550055337e-6, 1.275265759659305e-7, 4.486925263336161e-6, 3.698667569551617e-6, 4.848524213230121e-7, 1.608347055537251e-8, -1.486311816734087e-6, -2.943127583421301e-6, 8.367832151634502e-7, 4.756906946568051e-6, 3.452482815191615e-7, 6.681167263877796e-8, 1.21183666124125e-6, -4.660131253331201e-6, -3.040835736101144e-6, 3.662161134343478e-7, -3.500023012747988e-6 ], [ 0.3782190680503845, -0.2006760388612747, -3.055948809560505e-6, -0.2006811201572418, 0.1189836412668228, 2.856752871593926e-6, 0.05456861853599548, -7.616612833771796e-7, 9.846787918377231e-8, 1.306310650761588e-6, -6.025949232935091e-7, 4.579676897265017e-6, -5.361218427424319e-6, -4.481376890907995e-6, 9.497676956016221e-8, 1.101989141716331e-6, 8.842590659696725e-9, 1.444838630959566e-6, 0.01717655174434185, 3.981623194704298e-6, -0.003299057250842452, -1.327108293480705e-6, 3.351210295932106e-7, -1.053224991665047e-7, 0.01970144361257553, -6.826263074799499e-7, -1.271301357519405e-7, 6.847881650173804e-6, 3.206695282642613e-6, -4.090694346814416e-6, -1.591542741152807e-6, 4.323422217566986e-6, -5.364958610698523e-8, 5.762344244431006e-6, -1.883656409518153e-6, -1.220847991589835e-7, -0.009296022355556488, 6.356110588967567e-7, -1.345076725556282e-7, 6.715295967296697e-6, 0.006273627746850252, -4.56955694971839e-6, 0.0004151781904511154, 3.713055548359989e-6, 4.689770207733091e-7, 3.141445631626993e-6, 0.001772353309206665, -2.996575574343296e-7, 3.903720369180519e-8, 6.959218126212363e-7, 1.888961946860945e-6, -6.538328761962475e-6, 1.175306678646848e-7, -1.448547550353396e-6, 1.104869170376332e-6, 9.975902912628953e-7, -4.108834218641277e-6, -1.562280203870614e-6, 5.496808341831638e-8, -2.548826387283043e-6, 3.795710654230788e-6, 7.255721811816329e-6, -3.679119231492223e-7, 2.342244016517725e-7 ] ], "Routing": [ 1, 2, 3, 4 ] } } ././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/SimpleDecoder/Source/PluginProcessor.hIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/SimpleDecoder/Source/PluginProcessor0000664002537200253720000001422315257173642031671 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich, Felix Holzmüller Copyright (c) 2017/2026 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once #include "../../resources/AmbisonicDecoder.h" #include "../../resources/AudioProcessorBase.h" #include #define CONFIGURATIONHELPER_ENABLE_DECODER_METHODS 1 #include "../../resources/ConfigurationHelper.h" #include "../../resources/FilterVisualizerHelper.h" #include "../../resources/ReferenceCountedDecoder.h" #include "../../resources/MultiChannelFilter.h" #define ProcessorClass SimpleDecoderAudioProcessor using namespace juce::dsp; //============================================================================== class SimpleDecoderAudioProcessor : public AudioProcessorBase, IOTypes::AudioChannels<>> { public: constexpr static int numberOfInputChannels = 64; constexpr static int numberOfOutputChannels = 64; static const juce::StringArray weightsStrings; //============================================================================== SimpleDecoderAudioProcessor(); ~SimpleDecoderAudioProcessor() override; //============================================================================== void prepareToPlay (double sampleRate, int samplesPerBlock) override; void releaseResources() override; void processBlock (juce::AudioSampleBuffer&, juce::MidiBuffer&) override; //============================================================================== juce::AudioProcessorEditor* createEditor() override; bool hasEditor() const override; //============================================================================== int getNumPrograms() override; int getCurrentProgram() override; void setCurrentProgram (int index) override; const juce::String getProgramName (int index) override; void changeProgramName (int index, const juce::String& newName) override; //============================================================================== void getStateInformation (juce::MemoryBlock& destData) override; void setStateInformation (const void* data, int sizeInBytes) override; //============================================================================== void parameterChanged (const juce::String& parameterID, float newValue) override; void updateBuffers() override; // use this to implement a buffer update method //======= Parameters =========================================================== std::vector> createParameterLayout(); //======= OSC ================================================================== inline const bool processNotYetConsumedOSCMessage (const juce::OSCMessage& message) override; //============================================================================== juce::File getLastDir() { return lastDir; } void setLastDir (juce::File newLastDir); void loadConfiguration (const juce::File& presetFile, bool loadSwDecoder = false); juce::Atomic updateDecoderInfo = true; juce::Atomic messageChanged { true }; juce::String getMessageForEditor() { return messageForEditor; } ReferenceCountedDecoder::Ptr getCurrentDecoderConfig() { return decoderConfig; } ReferenceCountedDecoder::Ptr getCurrentSwDecoderConfig() { return swDecoderConfig; } /** Returns a description of a misconfiguration of the current subwoofer mode (discrete channel or subwoofer array decoder), or an empty string if it's valid. */ juce::String getSubwooferWarning(); juce::ReferenceCountedObjectPtr> getCoeffsForGui (const int band) { return MCFilter[band].getCoefficientsForGui (0); } void updateGuiCoefficients (int band) { MCFilter[band].updateGuiCoefficients(); } // FV repaint flag juce::Atomic repaintFV = true; private: //============================================================================== void loadConfigFromString (juce::String string, bool loadSwDecoder = false); /** Returns a bit mask of the output channels (0...63) the decoder is routed to. */ static juce::uint64 getOutputChannelMask (ReferenceCountedDecoder& decoderToCheck); // list of used audio parameters std::atomic* inputOrderSetting; std::atomic* useSN3D; std::atomic* lowPassFrequency; std::atomic* lowPassGain; std::atomic* highPassFrequency; std::atomic* swMode; std::atomic* swChannel; std::atomic* weights; std::atomic* swWeights; std::atomic* swOrderSetting; // ========================================= float omniGain = 0.0f; juce::File lastDir; juce::String lastConfigString, lastSwConfigString; std::unique_ptr properties; juce::AudioBuffer swBuffer; MultiChannelFilter<1, numberOfInputChannels> MCFilter[2]; FilterParameters filterParameters[2]; juce::dsp::Gain masterGain; AmbisonicDecoder decoder, swDecoder; ReferenceCountedDecoder::Ptr decoderConfig { nullptr }, swDecoderConfig { nullptr }; juce::String messageForEditor { "" }; //============================================================================== JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (SimpleDecoderAudioProcessor) }; IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/SimpleDecoder/Source/PluginEditor.h0000664002537200253720000001200315257173642031360 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich, Felix Holzmüller Copyright (c) 2017/2026 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once #include "../JuceLibraryCode/JuceHeader.h" #include "PluginProcessor.h" //Plugin Design Essentials #include "../../resources/customComponents/TitleBar.h" #include "../../resources/lookAndFeel/IEM_LaF.h" //Custom juce::Components #include "../../resources/customComponents/FilterVisualizer.h" #include "../../resources/customComponents/ReverseSlider.h" #include "../../resources/customComponents/SimpleLabel.h" #include "DecoderInfoBox.h" typedef ReverseSlider::SliderAttachment SliderAttachment; // all ReverseSliders will make use of the parameters' valueToText() function typedef juce::AudioProcessorValueTreeState::ComboBoxAttachment ComboBoxAttachment; typedef juce::AudioProcessorValueTreeState::ButtonAttachment ButtonAttachment; //============================================================================== /** */ class SimpleDecoderAudioProcessorEditor : public juce::AudioProcessorEditor, private juce::Timer, public juce::AudioProcessorValueTreeState::Listener { public: SimpleDecoderAudioProcessorEditor (SimpleDecoderAudioProcessor&, juce::AudioProcessorValueTreeState&); ~SimpleDecoderAudioProcessorEditor(); //============================================================================== void paint (juce::Graphics&) override; void resized() override; void timerCallback() override; void loadPresetFile (bool loadSwDecoder = false); void parameterChanged (const juce::String& parameterID, float newValue) override; void updateFilterVisualizer(); private: void updateSubwooferControls(); int getNumberOfNeededOutputChannels(); // ====================== beging essentials ================== // lookAndFeel class with the IEM plug-in suite design LaF globalLaF; juce::TooltipWindow tooltipWin; // stored references to the AudioProcessor and juce::ValueTreeState holding all the parameters SimpleDecoderAudioProcessor& processor; juce::AudioProcessorValueTreeState& valueTreeState; /* title and footer component title component can hold different widgets for in- and output: - NoIOWidget (if there's no need for an input or output widget) - AudioChannelsIOWidget - AmbisonicIOWidget - DirectivitiyIOWidget */ TitleBar, AudioChannelsIOWidget<0, false>> title; OSCFooter footer; // =============== end essentials ============ // Attachments to create a connection between IOWidgets comboboxes // and the associated parameters std::unique_ptr cbOrderSettingAttachment; std::unique_ptr cbNormalizationSettingAttachment; //std::unique_ptr cbOutputChannelsSettingAttachment; bool updateChannelsInWidget = false; bool subwooferControlsChanged = false; juce::GroupComponent gcFilter, gcSw, gcConfiguration, gcGain; // Filter slider ReverseSlider slLowPassFrequency, slHighPassFrequency, slLowPassGain; std::unique_ptr slLowPassFrequencyAttachment, slLowPassGainAttachment, slHighPassFrequencyAttachment; SimpleLabel lbLowPassFrequency, lbLowPassGain, lbHighPassFrequency; // Subwoofer mode juce::ComboBox cbSwMode; std::unique_ptr cbSwModeAttachment; SimpleLabel lbSwMode, lbSwChannel; ReverseSlider slSwChannel; std::unique_ptr slSwChannelAttachment; AlertSymbol swAlert { juce::Colours::red }; // Subwoofer array decoding juce::TextButton btLoadSwFile; SimpleLabel lbSwDecoder; DecoderInfoBox dcSwInfoBox; // juce::TextButton btLoadFile; DecoderInfoBox dcInfoBox; ReverseSlider slGain; std::unique_ptr slGainAttachment; ReferenceCountedDecoder::Ptr lastDecoder = nullptr, lastSwDecoder = nullptr; FilterVisualizer fv; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (SimpleDecoderAudioProcessorEditor) }; ././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/SimpleDecoder/Source/DecoderInfoBox.hIEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/SimpleDecoder/Source/DecoderInfoBox.0000664002537200253720000003171415257173642031447 0ustar zmoelnigzmoelnig/* ============================================================================== This file is part of the IEM plug-in suite. Author: Daniel Rudrich Copyright (c) 2017 - Institute of Electronic Music and Acoustics (IEM) https://iem.at The IEM plug-in suite is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The IEM plug-in suite is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this software. If not, see . ============================================================================== */ #pragma once #include "ReferenceCountedDecoder.h" #include "ambisonicTools.h" //============================================================================== /* */ class DecoderInfoBox : public juce::Component { static constexpr int spacing = 5; public: /** Creates an info box with a weights selector and, if an order parameter is given, an Ambisonic order selector. */ DecoderInfoBox (juce::AudioProcessorValueTreeState& parameters, const juce::String& weightsParameterID, const juce::String& orderParameterID = {}) { addAndMakeVisible (cbWeights); cbWeights.setJustificationType (juce::Justification::centred); cbWeights.addItemList ({ "basic", "maxrE", "inPhase" }, 1); cbWeightsAttachment.reset ( new juce::AudioProcessorValueTreeState::ComboBoxAttachment (parameters, weightsParameterID, cbWeights)); if (orderParameterID.isNotEmpty()) { addAndMakeVisible (cbOrder); cbOrder.setJustificationType (juce::Justification::centred); cbOrder.addItem ("Auto", 1); for (int order = 0; order <= 7; ++order) cbOrder.addItem (getOrderString (order), order + 2); cbOrderAttachment.reset ( new juce::AudioProcessorValueTreeState::ComboBoxAttachment (parameters, orderParameterID, cbOrder)); } } ~DecoderInfoBox() {} void setDecoderConfig (ReferenceCountedDecoder::Ptr newDecoderConfig) { decoder = newDecoderConfig; cbWeights.setVisible (decoder != nullptr); cbOrder.setVisible (decoder != nullptr && cbOrderAttachment != nullptr); updateOrderSelector(); resized(); repaint(); } /** Sets the Ambisonic order of the input signal, which limits the selectable decoding order. */ void setAvailableInputOrder (int newInputOrder) { if (availableInputOrder != newInputOrder) { availableInputOrder = newInputOrder; updateOrderSelector(); } } /** Sets the text heights of the attribute names and their values, which also define the row heights. */ void setTextHeights (int newAttributeHeight, int newValueHeight) { attributeHeight = newAttributeHeight; valueHeight = newValueHeight; resized(); repaint(); } const int getMaxAttributeWidth() { auto font = juce::FontOptions (getLookAndFeel().getTypefaceForFont ( juce::FontOptions (attributeHeight, 2))) .withHeight (attributeHeight); juce::AttributedString text ("LOUDSPEAKERS:"); text.setFont (font); juce::TextLayout layout; layout.createLayout (text, 999); return static_cast (std::ceil (layout.getWidth())); } void resized() override { auto retainedDecoder = decoder; juce::Rectangle bounds = getLocalBounds(); arr.clear(); if (retainedDecoder != nullptr) { const auto maxAttWidth = getMaxAttributeWidth(); const int valueStart = maxAttWidth + spacing; const int valueWidth = juce::jmax (bounds.getWidth() - valueStart, 0); auto font = juce::FontOptions (getLookAndFeel().getTypefaceForFont ( juce::FontOptions (valueHeight, 2))) .withHeight (valueHeight); arr.addFittedText (font, retainedDecoder->getDescription(), valueStart, valueHeight + 1, valueWidth, 3 * valueHeight, juce::Justification::topLeft, 4, 0.8f); const int descriptionEnd = arr.getBoundingBox (juce::jmax (0, arr.getNumGlyphs() - 1), 1, true).getBottom(); cbOrder.setBounds (valueStart, descriptionEnd + 1, 80, valueHeight); cbWeights.setBounds (valueStart, descriptionEnd + 3 * valueHeight + 2, 80, valueHeight); } } void paint (juce::Graphics& g) override { auto retainedDecoder = decoder; juce::Rectangle bounds = getLocalBounds(); const int width = bounds.getWidth(); g.setColour (juce::Colours::white); auto currentFont = juce::FontOptions (getLookAndFeel().getTypefaceForFont (juce::FontOptions (12.0f, 2))); g.setFont (currentFont); // regular font if (errorText.isNotEmpty()) { auto options = juce::MessageBoxOptions::makeOptionsOk (juce::MessageBoxIconType::WarningIcon, "Error", errorText); messageBox = juce::AlertWindow::showScopedAsync (options, nullptr); errorText.clear(); } if (retainedDecoder == nullptr) { g.setFont (valueHeight); g.drawText ("No configuration loaded.", 20, 1, width, valueHeight, juce::Justification::bottomLeft); g.drawMultiLineText (errorText, 20, 30, width - 20); } else { g.setFont (attributeHeight); const int maxAttributeWidth = getMaxAttributeWidth(); const int resStart = maxAttributeWidth + spacing; const int resWidth = juce::jmax (width - resStart, 0); g.drawText ("NAME:", 0, 0, maxAttributeWidth, valueHeight, juce::Justification::bottomRight); g.drawText ("DESCRIPTION:", 0, valueHeight, maxAttributeWidth, valueHeight, juce::Justification::bottomRight); auto currentFont = juce::FontOptions ( getLookAndFeel().getTypefaceForFont (juce::FontOptions (valueHeight, 1))); g.setFont (currentFont); g.setFont (valueHeight); g.drawText (retainedDecoder->getName(), resStart, 1, resWidth, valueHeight, juce::Justification::bottomLeft); juce::String descriptionText = retainedDecoder->getDescription(); arr.draw (g); const int descEnd = arr.getBoundingBox (juce::jmax (0, arr.getNumGlyphs() - 1), 1, true).getBottom(); currentFont = juce::FontOptions ( getLookAndFeel().getTypefaceForFont (juce::FontOptions (attributeHeight, 2))); g.setFont (currentFont); g.setFont (attributeHeight); g.drawText ("ORDER:", 0, descEnd, maxAttributeWidth, valueHeight, juce::Justification::bottomRight); g.drawText ("LOUDSPEAKERS:", 0, descEnd + valueHeight, maxAttributeWidth, valueHeight, juce::Justification::bottomRight); g.drawText ("CHANNELS:", 0, descEnd + 2 * valueHeight, maxAttributeWidth, valueHeight, juce::Justification::bottomRight); g.drawText ("WEIGHTS:", 0, descEnd + 3 * valueHeight, maxAttributeWidth, valueHeight, juce::Justification::bottomRight); g.setFont (valueHeight); if (cbOrderAttachment == nullptr) // order is not selectable, just display it g.drawText (getOrderString (retainedDecoder->getOrder()), resStart, descEnd + 1, resWidth, valueHeight, juce::Justification::bottomLeft); g.drawText (juce::String (retainedDecoder->getMatrix().getNumRows()), resStart, descEnd + valueHeight + 1, resWidth, valueHeight, juce::Justification::bottomLeft); g.drawFittedText (getChannelNumbersString (*retainedDecoder), resStart, descEnd + 2 * valueHeight + 1, resWidth, valueHeight, juce::Justification::bottomLeft, 1); } } void setErrorMessage (juce::String errorMessage) { errorText = errorMessage; repaint(); } private: /** Shows the order chosen in auto mode and disables orders higher than the input and the decoder provide. */ void updateOrderSelector() { auto retainedDecoder = decoder; if (cbOrderAttachment == nullptr || retainedDecoder == nullptr) return; const int maxOrder = juce::jmin (retainedDecoder->getOrder(), availableInputOrder); // has to be queried before changing the item texts, as the ComboBox only reports // a selection if the displayed text matches the selected item's text const int selectedId = cbOrder.getSelectedId(); cbOrder.changeItemText (1, maxOrder >= 0 ? "Auto (" + getOrderString (maxOrder) + ")" : "(Auto)"); for (int order = 0; order <= 7; ++order) cbOrder.setItemEnabled (order + 2, order <= maxOrder); // changing an item's text doesn't update the displayed text of the selected item if (selectedId != 0) cbOrder.setSelectedId (selectedId, juce::dontSendNotification); } /** Returns the output channel numbers of the loudspeakers, with three or more consecutive channels shortened to a range, e.g. '1-4, 7, 9'. */ static juce::String getChannelNumbersString (ReferenceCountedDecoder& decoderToDescribe) { auto& routing = decoderToDescribe.getRoutingArrayReference(); juce::StringArray channels; for (int start = 0; start < routing.size();) { int end = start; while (end + 1 < routing.size() && routing[end + 1] == routing[end] + 1) ++end; if (end - start >= 2) channels.add (juce::String (routing[start] + 1) + "-" + juce::String (routing[end] + 1)); else for (int i = start; i <= end; ++i) channels.add (juce::String (routing[i] + 1)); start = end + 1; } return channels.joinIntoString (", "); } int attributeHeight = 12; int valueHeight = 17; juce::ComboBox cbWeights; std::unique_ptr cbWeightsAttachment; juce::ComboBox cbOrder; std::unique_ptr cbOrderAttachment; int availableInputOrder = 7; juce::String errorText { "" }; ReferenceCountedDecoder::Ptr decoder { nullptr }; juce::GlyphArrangement arr; juce::ScopedMessageBox messageBox; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DecoderInfoBox) }; IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/SimpleDecoder/CMakeLists.txt0000664002537200253720000000515015257173642030107 0ustar zmoelnigzmoelnigset (PLUGIN_TARGET "") if (IEM_FORMATS) juce_add_plugin (SimpleDecoder PLUGIN_MANUFACTURER_CODE IEMA PLUGIN_CODE SiDe ICON_BIG "../resources/Standalone/IEMPluginSuiteSmall.png" ICON_SMALL "../resources/Standalone/IEMPluginSuiteSmall.png" COMPANY_NAME "IEM" PRODUCT_NAME "SimpleDecoder" FORMATS ${IEM_FORMATS} VERSION ${SimpleDecoder_VERSION} LV2URI "http://plugins.iem.at/SimpleDecoder" VST2_CATEGORY kPlugSurroundFx kPlugCategSpacializer VST3_CATEGORIES Spatial Surround Up-Downmix AAX_CATEGORY SoundField) list (APPEND PLUGIN_TARGET SimpleDecoder) endif() juce_add_binary_data (SimpleDecoderPresets HEADER_NAME "Presets.h" NAMESPACE Presets SOURCES Source/Presets/5point1.json Source/Presets/5point1point4.json Source/Presets/7point1.json Source/Presets/7point1point4.json Source/Presets/22_2_NHK.json Source/Presets/Cube_8ch.json Source/Presets/CUBE.json Source/Presets/MSDecoder.json Source/Presets/Produktionsstudio.json Source/Presets/Quadraphonic.json Source/Presets/t_design_12ch.json Source/Presets/t_design_24ch.json Source/Presets/t_design_36ch.json Source/Presets/t_design_48ch.json Source/Presets/t_design_60ch.json) foreach (TARGET IN LISTS PLUGIN_TARGET) juce_generate_juce_header(${TARGET}) target_sources(${TARGET} PRIVATE Source/PluginEditor.cpp Source/PluginEditor.h Source/PluginProcessor.cpp Source/PluginProcessor.h Source/DecoderInfoBox.h ../resources/OSC/OSCInputStream.h ../resources/OSC/OSCParameterInterface.cpp ../resources/OSC/OSCParameterInterface.h ../resources/OSC/OSCStatus.cpp ../resources/OSC/OSCStatus.h ../resources/OSC/OSCUtilities.h ../resources/efficientSHvanilla.cpp ) target_compile_definitions(${TARGET} PRIVATE JUCE_USE_CURL=0 JUCE_WEB_BROWSER=0 JUCE_USE_CUSTOM_PLUGIN_STANDALONE_APP=1 JUCE_USE_FLAC=0 JUCE_USE_OGGVORBIS=0 JUCE_USE_MP3AUDIOFORMAT=0 JUCE_USE_LAME_AUDIO_FORMAT=0 JUCE_USE_WINDOWS_MEDIA_FORMAT=0 JUCE_VST3_CAN_REPLACE_VST2=0) target_include_directories(${TARGET} PRIVATE Source) target_link_libraries(${TARGET} PRIVATE LAF_fonts IEM_logo SimpleDecoderPresets juce::juce_audio_utils juce::juce_audio_plugin_client juce::juce_osc juce::juce_dsp juce::juce_opengl juce::juce_recommended_config_flags juce::juce_recommended_lto_flags) endforeach() IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/.clang-format0000664002537200253720000000351715257173642025210 0ustar zmoelnigzmoelnigLanguage: Cpp AccessModifierOffset: -4 AlignAfterOpenBracket: Align AlignConsecutiveAssignments: false AlignConsecutiveDeclarations: false AlignEscapedNewlines: Left AlignOperands: Align AlignTrailingComments: false AllowAllParametersOfDeclarationOnNextLine: false AllowAllArgumentsOnNextLine: false AllowShortBlocksOnASingleLine: Never AllowShortCaseLabelsOnASingleLine: false AllowShortFunctionsOnASingleLine: InlineOnly AllowShortIfStatementsOnASingleLine: Never AllowShortLoopsOnASingleLine: false AlwaysBreakAfterDefinitionReturnType: None AlwaysBreakAfterReturnType: None AlwaysBreakBeforeMultilineStrings: false AlwaysBreakTemplateDeclarations: Yes BinPackArguments: false BinPackParameters: false BreakAfterAttributes: Never BreakAfterJavaFieldAnnotations: false BreakBeforeBinaryOperators: NonAssignment BreakBeforeBraces: Allman BreakBeforeTernaryOperators: true BreakConstructorInitializers: AfterColon BreakStringLiterals: false ColumnLimit: 100 ConstructorInitializerAllOnOneLineOrOnePerLine: true ConstructorInitializerIndentWidth: 4 ContinuationIndentWidth: 4 Cpp11BracedListStyle: false DerivePointerAlignment: false DisableFormat: false ExperimentalAutoDetectBinPacking: false IndentCaseLabels: true IndentPPDirectives: BeforeHash IndentWidth: 4 IndentWrappedFunctionNames: true KeepEmptyLinesAtTheStartOfBlocks: false MaxEmptyLinesToKeep: 1 NamespaceIndentation: Inner PointerAlignment: Left ReflowComments: false SortIncludes: true SpaceAfterCStyleCast: true SpaceAfterLogicalNot: true SpaceBeforeAssignmentOperators: true SpaceBeforeCpp11BracedList: true SpaceBeforeParens: NonEmptyParentheses SpaceInEmptyParentheses: false SpaceBeforeInheritanceColon: true SpacesInAngles: false SpacesInCStyleCastParentheses: false SpacesInContainerLiterals: true SpacesInParentheses: false SpacesInSquareBrackets: false Standard: "c++17" TabWidth: 4 UseTab: Never IEMPluginSuite-v1.16.0-d9e0a9aac011ab1a1edfea1d5920918f159a5851/windows_buildForRelease.ps10000664002537200253720000000244715257173642030104 0ustar zmoelnigzmoelnig## script for creating the release binaries on Windows $ErrorActionPreference = "Stop" Set-Location $PSScriptRoot $formats = @( @{ Dir = "VST"; Pattern = "*.dll" }, @{ Dir = "VST3"; Pattern = "*.vst3" }, @{ Dir = "LV2"; Pattern = "*.lv2" }, @{ Dir = "AAX"; Pattern = "*.aaxplugin" }, @{ Dir = "Standalone"; Pattern = "*.exe" } ) foreach ($dir in @("build") + $formats.Dir) { if (Test-Path $dir) { Remove-Item -Recurse -Force $dir } } # IEM_POST_BUILD_INSTALL=NO: otherwise JUCE copies the plug-ins to Program Files, which requires admin rights # CMAKE_POLICY_VERSION_MINIMUM=3.5: fftw requires a CMake version < 3.5, which is rejected by CMake >= 4.0 cmake -B build -DIEM_BUILD_VST3=ON -DIEM_BUILD_VST2=ON "-DVST2SDKPATH=src/VST_SDK/VST2_SDK/" -DIEM_BUILD_LV2=ON -DIEM_BUILD_STANDALONE=ON -DIEM_BUILD_AAX=ON -DIEM_POST_BUILD_INSTALL=NO "-DCMAKE_POLICY_VERSION_MINIMUM=3.5" if ($LASTEXITCODE -ne 0) { throw "CMake configuration failed" } cmake --build build --config Release --parallel 8 if ($LASTEXITCODE -ne 0) { throw "Build failed" } foreach ($format in $formats) { New-Item -ItemType Directory $format.Dir | Out-Null Get-ChildItem "build/*/*_artefacts/Release/$($format.Dir)/$($format.Pattern)" | Copy-Item -Destination $format.Dir -Recurse }