From eb63f04f55439673225fd37512d5101003e43bbf Mon Sep 17 00:00:00 2001 From: Vesa Date: Sat, 15 Mar 2014 21:14:55 +0200 Subject: [PATCH] Amplifier --- plugins/Amplifier/Amplifier.cpp | 125 +++++++++++++++++++ plugins/Amplifier/Amplifier.h | 54 ++++++++ plugins/Amplifier/AmplifierControlDialog.cpp | 69 ++++++++++ plugins/Amplifier/AmplifierControlDialog.h | 45 +++++++ plugins/Amplifier/AmplifierControls.cpp | 82 ++++++++++++ plugins/Amplifier/AmplifierControls.h | 79 ++++++++++++ plugins/Amplifier/CMakeLists.txt | 3 + plugins/Amplifier/artwork.png | Bin 0 -> 15755 bytes plugins/Amplifier/logo.png | Bin 0 -> 3225 bytes 9 files changed, 457 insertions(+) create mode 100644 plugins/Amplifier/Amplifier.cpp create mode 100644 plugins/Amplifier/Amplifier.h create mode 100644 plugins/Amplifier/AmplifierControlDialog.cpp create mode 100644 plugins/Amplifier/AmplifierControlDialog.h create mode 100644 plugins/Amplifier/AmplifierControls.cpp create mode 100644 plugins/Amplifier/AmplifierControls.h create mode 100644 plugins/Amplifier/CMakeLists.txt create mode 100644 plugins/Amplifier/artwork.png create mode 100644 plugins/Amplifier/logo.png diff --git a/plugins/Amplifier/Amplifier.cpp b/plugins/Amplifier/Amplifier.cpp new file mode 100644 index 000000000..380fde0ef --- /dev/null +++ b/plugins/Amplifier/Amplifier.cpp @@ -0,0 +1,125 @@ +/* + * Amplifier.cpp - A native amplifier effect plugin with sample-exact amplification + * + * Copyright (c) 2014 Vesa Kivimäki + * Copyright (c) 2006-2014 Tobias Doerffel + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program (see COPYING); if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA. + * + */ + +#include "Amplifier.h" + +#include "embed.cpp" + + +extern "C" +{ + +Plugin::Descriptor PLUGIN_EXPORT amplifier_plugin_descriptor = +{ + STRINGIFY( PLUGIN_NAME ), + "Amplifier", + QT_TRANSLATE_NOOP( "pluginBrowser", "A native amplifier plugin" ), + "Vesa Kivimäki ", + 0x0100, + Plugin::Effect, + new PluginPixmapLoader( "logo" ), + NULL, + NULL +} ; + +} + + + +AmplifierEffect::AmplifierEffect( Model* parent, const Descriptor::SubPluginFeatures::Key* key ) : + Effect( &lifier_plugin_descriptor, parent, key ), + m_ampControls( this ) +{ +} + + + + +AmplifierEffect::~AmplifierEffect() +{ +} + + + + +bool AmplifierEffect::processAudioBuffer( sampleFrame* buf, const fpp_t frames ) +{ + if( !isEnabled() || !isRunning () ) + { + return( false ); + } + + double outSum = 0.0; + const float d = dryLevel(); + const float w = wetLevel(); + for( fpp_t f = 0; f < frames; ++f ) + { +// qDebug( "offset %d, value %f", f, m_ampControls.m_volumeModel.value( f ) ); + + sample_t s[2] = { buf[f][0], buf[f][1] }; + + // convert vol/pan values to left/right values + const float left1 = m_ampControls.m_volumeModel.value( f ) * + ( m_ampControls.m_panModel.value( f ) <= 0 + ? 1.0 + : 1.0 - m_ampControls.m_panModel.value( f ) / 100.0 ); + const float right1 = m_ampControls.m_volumeModel.value( f ) * + ( m_ampControls.m_panModel.value( f ) >= 0 + ? 1.0 + : 1.0 + m_ampControls.m_panModel.value( f ) / 100.0 ); + + // first stage amplification + s[0] *= ( left1 / 100.0 ); + s[1] *= ( right1 / 100.0 ); + + // second stage amplification + s[0] *= ( m_ampControls.m_leftModel.value( f ) / 100.0 ); + s[1] *= ( m_ampControls.m_rightModel.value( f ) / 100.0 ); + + buf[f][0] = d * buf[f][0] + w * s[0]; + buf[f][1] = d * buf[f][1] + w * s[1]; + outSum += buf[f][0]*buf[f][0] + buf[f][1]*buf[f][1]; + } + + checkGate( outSum / frames ); + + return isRunning(); +} + + + + + +extern "C" +{ + +// necessary for getting instance out of shared lib +Plugin * PLUGIN_EXPORT lmms_plugin_main( Model* parent, void* data ) +{ + return new AmplifierEffect( parent, static_cast( data ) ); +} + +} + diff --git a/plugins/Amplifier/Amplifier.h b/plugins/Amplifier/Amplifier.h new file mode 100644 index 000000000..e9a78e9d5 --- /dev/null +++ b/plugins/Amplifier/Amplifier.h @@ -0,0 +1,54 @@ +/* + * Amplifier.h - amplifier-effect-plugin + * + * Copyright (c) 2014 Vesa Kivimäki + * Copyright (c) 2006-2014 Tobias Doerffel + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program (see COPYING); if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA. + * + */ + + +#ifndef AMPLIFIER_H +#define AMPLIFIER_H + +#include "Effect.h" +#include "AmplifierControls.h" + + +class AmplifierEffect : public Effect +{ +public: + AmplifierEffect( Model* parent, const Descriptor::SubPluginFeatures::Key* key ); + virtual ~AmplifierEffect(); + virtual bool processAudioBuffer( sampleFrame* buf, const fpp_t frames ); + + virtual EffectControls* controls() + { + return &m_ampControls; + } + + +private: + AmplifierControls m_ampControls; + + friend class AmplifierControls; + +} ; + +#endif diff --git a/plugins/Amplifier/AmplifierControlDialog.cpp b/plugins/Amplifier/AmplifierControlDialog.cpp new file mode 100644 index 000000000..752601765 --- /dev/null +++ b/plugins/Amplifier/AmplifierControlDialog.cpp @@ -0,0 +1,69 @@ +/* + * AmplifierControlDialog.cpp - control dialog for amplifier effect + * + * Copyright (c) 2014 Vesa Kivimäki + * Copyright (c) 2006-2014 Tobias Doerffel + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program (see COPYING); if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA. + * + */ + +#include + +#include "AmplifierControlDialog.h" +#include "AmplifierControls.h" +#include "embed.h" + + + +AmplifierControlDialog::AmplifierControlDialog( AmplifierControls* controls ) : + EffectControlDialog( controls ) +{ + setAutoFillBackground( true ); + QPalette pal; + pal.setBrush( backgroundRole(), PLUGIN_NAME::getIconPixmap( "artwork" ) ); + setPalette( pal ); + setFixedSize( 100, 125 ); + + knob * volumeKnob = new knob( knobBright_26, this); + volumeKnob -> move( 20, 30 ); + volumeKnob -> setVolumeKnob( true ); + volumeKnob->setModel( &controls->m_volumeModel ); + volumeKnob->setLabel( tr( "VOL" ) ); + volumeKnob->setHintText( tr( "Volume:" ) + " ", "%" ); + + knob * panKnob = new knob( knobBright_26, this); + panKnob -> move( 60, 30 ); + panKnob->setModel( &controls->m_panModel ); + panKnob->setLabel( tr( "PAN" ) ); + panKnob->setHintText( tr( "Panning:" ) + " ", "" ); + + knob * leftKnob = new knob( knobBright_26, this); + leftKnob -> move( 20, 80 ); + leftKnob -> setVolumeKnob( true ); + leftKnob->setModel( &controls->m_leftModel ); + leftKnob->setLabel( tr( "LEFT" ) ); + leftKnob->setHintText( tr( "Left gain:" ) + " ", "%" ); + + knob * rightKnob = new knob( knobBright_26, this); + rightKnob -> move( 60, 80 ); + rightKnob -> setVolumeKnob( true ); + rightKnob->setModel( &controls->m_rightModel ); + rightKnob->setLabel( tr( "RIGHT" ) ); + rightKnob->setHintText( tr( "Right gain:" ) + " ", "%" ); +} diff --git a/plugins/Amplifier/AmplifierControlDialog.h b/plugins/Amplifier/AmplifierControlDialog.h new file mode 100644 index 000000000..41409c674 --- /dev/null +++ b/plugins/Amplifier/AmplifierControlDialog.h @@ -0,0 +1,45 @@ +/* + * AmplifierControlDialog.h - control dialog for amplifier effect + * + * Copyright (c) 2014 Vesa Kivimäki + * Copyright (c) 2006-2014 Tobias Doerffel + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program (see COPYING); if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA. + * + */ + +#ifndef AMPLIFIER_CONTROL_DIALOG_H +#define AMPLIFIER_CONTROL_DIALOG_H + +#include "EffectControlDialog.h" + + +class AmplifierControls; + + +class AmplifierControlDialog : public EffectControlDialog +{ +public: + AmplifierControlDialog( AmplifierControls* controls ); + virtual ~AmplifierControlDialog() + { + } + +} ; + +#endif diff --git a/plugins/Amplifier/AmplifierControls.cpp b/plugins/Amplifier/AmplifierControls.cpp new file mode 100644 index 000000000..f06876e1e --- /dev/null +++ b/plugins/Amplifier/AmplifierControls.cpp @@ -0,0 +1,82 @@ +/* + * AmplifierControls.cpp - controls for amplifier effect + * + * Copyright (c) 2014 Vesa Kivimäki + * Copyright (c) 2008-2014 Tobias Doerffel + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program (see COPYING); if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA. + * + */ + + +#include + +#include "AmplifierControls.h" +#include "Amplifier.h" +#include "engine.h" +#include "song.h" + + +AmplifierControls::AmplifierControls( AmplifierEffect* effect ) : + EffectControls( effect ), + m_effect( effect ), + m_volumeModel( 100.0f, 0.0f, 200.0f, 0.1f, this, tr( "Volume" ) ), + m_panModel( 0.0f, -100.0f, 100.0f, 0.1f, this, tr( "Panning" ) ), + m_leftModel( 100.0f, 0.0f, 200.0f, 0.1f, this, tr( "Left gain" ) ), + m_rightModel( 100.0f, 0.0f, 200.0f, 0.1f, this, tr( "Right gain" ) ) +{ + connect( &m_volumeModel, SIGNAL( dataChanged() ), this, SLOT( changeControl() ) ); + connect( &m_panModel, SIGNAL( dataChanged() ), this, SLOT( changeControl() ) ); + connect( &m_leftModel, SIGNAL( dataChanged() ), this, SLOT( changeControl() ) ); + connect( &m_rightModel, SIGNAL( dataChanged() ), this, SLOT( changeControl() ) ); +} + + + + +void AmplifierControls::changeControl() +{ + engine::getSong()->setModified(); +} + + + + +void AmplifierControls::loadSettings( const QDomElement& _this ) +{ + m_volumeModel.loadSettings( _this, "volume" ); + m_panModel.loadSettings( _this, "pan" ); + m_leftModel.loadSettings( _this, "left" ); + m_rightModel.loadSettings( _this, "right" ); +} + + + + +void AmplifierControls::saveSettings( QDomDocument& doc, QDomElement& _this ) +{ + m_volumeModel.saveSettings( doc, _this, "volume" ); + m_panModel.saveSettings( doc, _this, "pan" ); + m_leftModel.saveSettings( doc, _this, "left" ); + m_rightModel.saveSettings( doc, _this, "right" ); +} + + + +#include "moc_AmplifierControls.cxx" + diff --git a/plugins/Amplifier/AmplifierControls.h b/plugins/Amplifier/AmplifierControls.h new file mode 100644 index 000000000..2640c8aca --- /dev/null +++ b/plugins/Amplifier/AmplifierControls.h @@ -0,0 +1,79 @@ +/* + * AmplifierControls.h - controls for bassboosterx -effect + * + * Copyright (c) 2014 Vesa Kivimäki + * Copyright (c) 2008-2014 Tobias Doerffel + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program (see COPYING); if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA. + * + */ + +#ifndef AMPLIFIER_CONTROLS_H +#define AMPLIFIER_CONTROLS_H + +#include "EffectControls.h" +#include "AmplifierControlDialog.h" +#include "knob.h" + + +class AmplifierEffect; + + +class AmplifierControls : public EffectControls +{ + Q_OBJECT +public: + AmplifierControls( AmplifierEffect* effect ); + virtual ~AmplifierControls() + { + } + + virtual void saveSettings( QDomDocument & _doc, QDomElement & _parent ); + virtual void loadSettings( const QDomElement & _this ); + inline virtual QString nodeName() const + { + return "AmplifierControls"; + } + + virtual int controlCount() + { + return 4; + } + + virtual EffectControlDialog* createView() + { + return new AmplifierControlDialog( this ); + } + + +private slots: + void changeControl(); + +private: + AmplifierEffect* m_effect; + FloatModel m_volumeModel; + FloatModel m_panModel; + FloatModel m_leftModel; + FloatModel m_rightModel; + + friend class AmplifierControlDialog; + friend class AmplifierEffect; + +} ; + +#endif diff --git a/plugins/Amplifier/CMakeLists.txt b/plugins/Amplifier/CMakeLists.txt new file mode 100644 index 000000000..8d9ac96c2 --- /dev/null +++ b/plugins/Amplifier/CMakeLists.txt @@ -0,0 +1,3 @@ +INCLUDE(BuildPlugin) + +BUILD_PLUGIN(amplifier Amplifier.cpp AmplifierControls.cpp AmplifierControlDialog.cpp MOCFILES AmplifierControls.h EMBEDDED_RESOURCES "${CMAKE_CURRENT_SOURCE_DIR}/*.png") diff --git a/plugins/Amplifier/artwork.png b/plugins/Amplifier/artwork.png new file mode 100644 index 0000000000000000000000000000000000000000..9750296a9d9c5c81e9454ca3c95d1eb081cfc574 GIT binary patch literal 15755 zcmV;6J#@l}P)VS{6^%V6V66}-fivR_i=2j?+y<;g{y2OffBWFr^Eu8NCG6~29edb)VZld;i~>bL3&p_5J_BCMNM?j;d6r&))y#`@Xg2Wy~?g;_F`j zgjojwfFuAwqyfUg9|eJT`6=1Bdm;cBIF7EJp_phnf3xdMEx3+oND__-HBWY%4wAPHIwY)hJpm6sw z9FjmY8m;w4K%_kKe-Z$hakD+j+fEt?NeBtyW4J57F@e@M1eP%(0+JL5cMl**Hd=2D z1Md?=W(=>^6OSwB7E;2p{*(&p-Rw z&+eARhXa7(+rItVPft$X_rCWDT9y%^h{&&Pq?z^2#*A-%^37MTUHx~z_J5i&5RI+1 zzU+2SJn@EW4_&)){l?vUcQ>2O?c2APF+TUZzx%`!Pn?{d{@VM0jU=GH+4%6sU-kGa zUjB+)EypJ(im=u{|M@@oqo<$w_P4%ev)KZ=cklkqn>WIvZ#H-D-o11C_QyZ*iQ#eo z{(Uo=Str;w{pe`3+4OJx#@GGGkNmYOr>6?tzH{41mwId4?e-Ub@fV+e{`t|H(cbi? zH~!EM{gta%uDbh|zx@2eH?RNE)6e{G|Kz6ti+|xSoZr9y>%abi2!+eXBISmMKr`EJ8fky_oqzW9_~@zM_>E29 zShJ&}qyO@|zx&m%dCl4Nvujtc9UUJn%W`~le0g#4bHDKOU;M%s-ucdV_SQfAp$}~~ zoA7wU6L0vwKmX@@@4ffqljF;a%ij9sp!N2fzx7+sJ@+hx z%gf8_XV?2?^ZM7n{`hEna(pCh-}J_B`GFt&i`(tdr#}7ZFMjchk3II-%|~uty?XT@ z{Ez>`Km3RPaJO47cbC8WyZ_gxKm8d>!$)h)%#M$bA9>`_H$VC0JO0c&PEJlg@aw;B zX7}#hyK;KfNEjpnq(ZqHYFo5MUOT-CYP;E-T)m_n6s-Kk}iczxed<=)GNBTyFa2 z;_~wO=f6A_|MwsI;22|!5sK|*8xdyQ_U-H6@cM_&&i?%OecyZD^Pb*1$!^Bp+x4@D z-u1ojx^?IFPyh5!zxd*d03u|@ljGx8zxvg0ed}9V+nk)9Y`2>q{7XM@d3o`Z|M(w& z^{ZboYXE-sXMXl?{>{JP9)I~S|D~V#+5cVAd*AnK;Vy+p0#et6`lVm`dw=im zeea)p*9SlRK`d;&!vsJ9AcPPhNs_??2ngtM*)_AxcJt8L^&k47AG&q>_CJ01Kl|!e zz5=5nBoPouqme%R;^LCPruRo~-u&+G`R=cM?Q8$!r+#YL?UpgzLkcP5aQJYK_|S(w zoT;d?0@TcU@4xl&kGB+zRm%n)L&fVRz z>~=dvY&V-`7U3r+r)FqoZ-4tcdhh?@U;O+FU;FCC{fjXMt!=iO|Knf%tH1rX|C?|4 zhHt!ncJ}=9&!3;)zua9)hzODf_H92tI@UG)%CG+0x4->uU;p*5`kmkY?6qsxE-o)b zh@qK>1b~^~_UY;L%IO%(JKy!rF_xeCnV-FN>%|c+*ZuqVjcmO`YOUoeCUA0c65(%u z``a7a&;8ub?JjorcbDNKLbYy5_W>w`F&2bEo(Yt+-aEkU_UQR9e`Q(5m8;ii2B5dr zB);lZUr)B*|GnSejm4J{!zDz|?`vZW(ssMu>%aM%@87@od!PH9he*qeN^G{9&2N18 zBWK_HuE$>TlIOqn)x2(Z7l2S0Ibw7l!(aH?*RGsgxq5mHfFi;J5>-1dQ#C^{2n>ic zYwhCVLcqoSi>p_!e*O9icr=} zY-S*PYmnalwzpkBJA3~5FK1lnAkA=ey!EkM?skBpQf{Vin31Bp1Gszl?#o{Kb;}q> zM@L6TN8kU$KYaW4?f1U-S6j2o-R|18YsbgOjn-Q48>g`<0kchO+s(F_z48^W1oYyq z7mSQhGb4!xin$3QLWIcx8DLUGG_$cRPrTs`UwZCKk~|zhZ?;>O+qZ86+-|un%dJ~? z5DE_hQkdEE&pwy64*?Rddi?QgXV-lAZdo>cb9}TR_;>!!e|vg*y4@aK?k>l&fVjB4 zym5B@|y*=Ez9eDc5ezz6<)F4{4C*$p!u9UZxQ-}Wq4Oa`KFx&g0!?Q8$cJKlch&fVYp z-0uT=`st@%^V-)u`pBbSd*Ov;vm0SU%3Dk_tDw0vA>jVSeHh(c3io*N#TWnCyZ`BK zS)?#)t+jjS_jZ?;F`ULt+kEj0UwGn)H(t4N_5Q{AZp6jK#gG3l|7g>@B!VDzm%EG0 zi$@=O?Aog__yQZqbsLZo7s>4=#NQp ze0;py?Y7&^SVrsZ>eZ`{J^ENkKlk%LM-t>`Kl|C2zU*cH^$+~TfBv3-e&zJktc_*y zh^+p5YrQvuy|tt5kz5z|FWm#gviNSdJ3qgF`_>&21ZixoZ8sZ9g0`C@H2d7|{r<_7 zD{p(-+ur}a_nCD2_TAgJ?r5#>Gb@<={lEX;lWeW^-dgJqKm72wfBRd$^~rA?yYbo2 zes(Nl*)3xk5$fT-T<(7PU;pdZfAcrJ^Ih+1y}$Q;?>#;`k^pME-I6>xIq92?nccm6 zH~R@mfmp__ng_~#+`eYU-uICI6B&1UhYm$PoI14xs#KV-~HU@e&ttw z<(X%m8$KHO;g5XeZEt_ut6urazxE@4?bqJ_YtKCU%yzqhw2VQ3kR^j~qeHyP` zz53O!eibf-#u&?3A|lrvjhnuS<6~@PU8-;;qc` z0YM%fK{H7a5fQuHLSt`jjPa|#`rc1`;uC-O@BZEIc-wb;?BgGI_fSCS5wTmA5&knj z`?G)jum8xCPd@pMcl?RXJ==M_?3VAD%}WquLL5fyhuqB z2q1E~C?Y}{9*d8z&3oSSo*(s> z{ont6uYK(|933CG*0$U2GR7Ewc6J@W{fqmdI6Hgj{QMk(Z$|HZd$hf{xY%sB5?X7U z?e_BW;^gFXcs%p$v#s^rvUB(0u8_M&L?)hLmXGu&e&Q#->$|?|+rI7FPEL;R-Mx3? z`k6JmbLY0Z?{-VLpPZgvy?Sl8yL{-Ohb}KK-Cb+fhl8G23YXx=C&yQ=Ts^;c?jz36 z&wu>K|Izn+_jkVOP2Un8t+zXO@A?=5BDCA>mN8;fbj-SN*^O)<{^*%!zxuTo0APHMs4) zZ~C3PcO{*jU4QY`iwbQwo6Fs9Sw@7bx?Y%(WNUr9*_@x>lW^tgl`%#FD7|l%-Ok+! znjruPW4IY1EfL{EQB6a>Q|}GL#l^+Z(H7$6<;62!{6oIxb#Hj(vmqeoVJs0wDqLh#@#1T$8#UPz`xM?C}zpv^@=De}jP30G^qo;8Ezhli1tRf6i9HE?klG4B)v!V*VLXeRR3 z*WItDy{1XP^1ak(^*{-OiD+4z)`)@m73cNm1&T&6msNlbAyS3*&n22T0xOd$1Oo^d zt%DHriNyN-v!!`p+bdZ0L@x7M#_LvB$c&+&_M;j?9{ZwU$q|bxmDh|%+J^`hRx_Ui z_LHN1W(TU-J_u#XRu5KXswC1FGX~U35#}7HfkLaNJHMcy`Mt=z#sCS?8jU?iTt-!C z0zx6q-M}@RlwUnZh#|Hp7T8(jn3gE{8BfJx~f!TZ~+{1J>9|N|FD>dB4_#v0rq2Aazmu z>7Pgl4jDk&I_BFCwbs=~){fK6`_>=?GXmshs_ibCLXfP@lmlz6^?+Q;t70t-H6p|V z2rw@-2#Tax+ibc+)JCBIt#n4ZYNjdem<U+Mw38WlkmP0IofW&_j}*D+wHQ%F|@8~*4I(@%!lhv zTnihbS$pcEzxCp++eb&oCnv`(2hJ29VU2ud z?Ln<^UI&r?aADR~2Tb8!!Kk3^`ed0AGEig|P}vL9GP*%PGc&WBH*Y@j$j!^$WnP&p zfavQcJD8_bFB`$$X2C}E);{{tkKMX;$E>~T@mHLjoMH`y0U$_95fGV;bd?kqnVOhT z2r*ZRMTP*-A{+-d5D;3c?-R}kvTxp`m=9NgC<}&aCo^JHt^xAy#9GcVbHaLA`LTr^ z0+Zv+>>+0c3bq51?s8K31C9Q%`;T*6mv)AAjY`Pft%2LD1!m z=B9$*M1vw^Gd(mh2m&6#1U4of5CcZb-DW{D101vXfeQ>*&czg&SJ!kE0t@`ehr|ey zONdE@AU*Q=X-I-Kz|10?W{S)RwJeCJn`aFXLrb^|2+N>p5uu2lL&unXfFi0{@Ou0d zT5rGkn;(1e&Mjkm)#Ij z5yi^HAtvvqil7FXHTP)TBp{rrCz$K6tvv|Ips1=!tNe}-WHc(f3{@SN-9U~!XL5}R zt7V}OGg<{@Xc?pt0n&w@c_Xj_XGmq26Y`R#_FIcRj3WCkD6Rr9xG;Y{68rW1Za$K8h}BzyiHY#W@|QcX=UN!d5IMVRU1l>)MhOi z@>m%VlE5CGd2vR0DhUC-_1}2vw{G3O-Dt0T{PE+HBUJZHMWD49G6RfqN97eXSRp)l zwH07GguudRh{cSgg<>t}8!aL#9l-#3-6OynBFH9*Lk9X< zIV&bAWDz4H_eAMp?S=`8A!fBD0c!l=m8xg5wZ(~$NP%L42as~iK#FLS*0_Yo zye3Kn+bk^t`=)zVbmZEs3&DeCb8R^lGVlPms31rLAtSrOqcARllm`rLvwim2=Z=q# zUjFizpKMOXq6tMEP871yV$t=2));fgu^@#^lOUQQFw4;uq-!)mM%Gp(C9p9ksk0|1 zNo#G4F>fArj4f^CDiXx1Cp`i*CN4A^JA;y8r@_d6K0JWB_0^8m_N@@_?hwc}Z&R%B3NYs6rBY%>My;(0L1ZaV z7?Pk;?+jbC~G>j6H!%Pw;DP z`FatPva_712J<lMCk4UQq+hL1K6ao>&T5 zq$4sPwM=kXwI;1;L_jb#8WT?qihCSk!kP^TM%J7`vqH*eAfGLv<$GA;h-HF?$_U$o z3Q3mHZ$)lri%>8yLPf6feOOQwvt!Lk`8WavAWi!G z0dT#C_hwTZCW4laXJqYdgn7X^rZGrkLF z^Kg(5vwq}?_E|3!ry5C6F*2fMy9W{x9)OH1s1t?oA&P?p`79Vr41=*FmH@XTBX%l0 zy|QRlDvZ5&LI@xPfk6n09&kip4w@u}pn!+up>SCy6wYwXLC;)f$~F*Hn4=(U%vnkn zGyu`)QTVgbLISdq%nOSZ&(xsyHP8qe5e6GnKw)ekdov`45vY*`0xC3g-ZV2yzO6Nr z7#^^i#?t^tBYlG2*_l{_aSlZa4bM(DvVDcak7}0!GO=EE-Vw@2e!BEIDbqYyj3j{sT z5K?2yRxY1oM?+ONq;*AvI^>nm<`A>+YDZWR@iWC&qLz{DitrI?SUYEd(vX}HtiqaN zWL=soCg4N^0J_mQXJh%1L1m|d2s4uhNI~w|`c^jghz1B=_q29}XiXXh?uIA^lMIx7 zsO7ALjWSBnt&=hjH$)60edZYlrEof=?2f_>@C+VREXD+;jf_IW8~dCcl9CK)5YcBN zSET1!fuymawXjV7k;Rdj0p;_^4L$fkHzW3u#1AwhDov+1P>f7$AKNAiEZX zeBKT=U_fk*tT}He5Yb3wJgctF6{>nu5@m%xM>HxajjWN3d=Av+T)8r@DWM1uzK*o0 ziO%c?(k@w+<}E9vs8NO@W_@pMwv5TdgoPlXySwj}UEdh;UI3(xNN(e@I2kJxOtQAI z5LvQ$DnU@Nfz3w-I%qU_$bh67LwPX}84$$ASgPntDO(H-x+JGK#uW7w5Rd_hlW(xr z)(AS#A)!zPC=6EjpfLxwp7kD4br@ofwhEliaIT7Xliyd3xB5CX8R0YSB3fImYIYcih~7=1 zh&g#AIfBiGoH7HKaLfB48KmH1ECD7V(DSJQ7}ew(2{c-Es+ISxF(MHTfQfC&7>^|iAgP)@5t*o5OSHyF*1QUJUnhTNkc0*~4V1x0K^*}%HMERh|E5{1*+ndgpeu#gvX2?1>+mtbs4)Csj5Lf)(aQ8(tNggKOQ^%fGFWff-tdktC(L9*~b|zO<%$WgNwJL?h2WZI*07TC$mtc%DEV6D%?gGH@8nwVO zO`?&Y67VJkhZGFtYT|_7XT??2Hv+KU`@=VH+_-V`?!CL07w1X1r9_|?Amgk5L^9hV zpwMJC0|m8JDHD>+IHGp7BeP|8Qh6g{mc&I#GFxfitVxn&#*Dy5R`Nj>1ByBLgc;<; zJ@W=st5NM@6!)-tXP~jk3oQ{MO)@6Zg+5tqwV7%=vpgy%%m;^)QCV{cCs##FtQSUD2Y~; zdE)woQA?4J$YU}5)~y%DSk}Q}QbaluRrZ+Ow?K3aDdf%&=mv{D^Rc#L z)cleo5tqplHc}24A|}kvoSd%kJH!C@l`&)>C;r%yzcrawkwPeujX6UZW=(PycOvm& zf~}|#RD{er*0EqP6f`FqG5H%nH*?8mTjYl7SR1q)Ue!+d2RbV#1K}46}k;`^U zsyvGy1t!Ib96IN5(O$r%Ag6jDE_{5jkS_SDQ}Vit+$6Ce)!QxACq+J z&I|5CB#m0R*EG@k+=7#^5!j1F-BZvQV`@}@WMi>t^UMh>SGOHU&^h_6S~p@b(zIuM z&=k(rnCWNc2D2xD5!!cA3pXVC&e?5(xUX4|$$v)qNG?e@ssfq=q?3JSu^cz_lp zw_;LC*?{n@vTK`0qFl()JPDILWqd#kSk5ejJ!cqz!ZbxEiIRrGOfmHu*;SdyR@jLs zLCxB%O(w8XWxA?T<3um^`YDli{rdHXAAJ;x7jL~VmVtV0-t~Mrv(oFo{h3ex(R0rl z+su2p26VhVx_b56dULYkN((B2;K)%ZNQI+WVeXn!Fj#^VEiZ=%4FJxGj&Mn92TtBB zDoc#y6p?g+5hUCNDB6Nh+jMz2iLs)?nJ*k6HbZXYtSy*DM1;f35sKE6i-^|R+4YAX zzWHbjzjOQ6@I@+LoSLFC;a+9B>!+uu*RMa^T8{|MxfIEhlPhO8Zscrqg+2ygVsXig zk!&TP0YjD1=J3n25L+Apn6)&HNm4KxDTytaWQ*X6x8- z4!Da17z7MPOa8V5xhJ`V#W&gojIG;^8#f+#^ifybx^-K=WS3jmA#&hamyD>(>rvw-edan^;!?5)RS)5u36xl`#}+Qb-MDf6#@LNJ zcVAp)l~DLxRD3Bl50fQ=zCAjA=D}u7|Vjv)iHgHrmT#hWVL^m@QCQG_v52Y z+cY#3H8wK@hyo-UeZd*PetA(Q=sLfs}cp!Bl(C0&6B`zIf0{;UmlX)_B><=w^o`(;X4b5;`Ch1Wf8Y-%j}2H~NI z9wB$NjwyebqonM6s{bfu!CniL_2%SO!d0t`mG6nd1VmX;9~iT&*n@?8VWMU!&AQ!0 z#9Sjap)}7>tcbMBAwrE5BzMBf>in zkxZ#%9p{MZK(1J$63yI{qk+OytLNdAJb9@jlDAmA&|T0V7NkY(v#a*&ZpA?`!C=iy zuu7tv7(pXuw~`&CY~Q}l2U-~_pGi=NAaWLzac^#Vd1;BwVk%)88rtMORP+eJyOi+4 zkg~ZKrxbS;rzs*T`sa(`%A~)}-u4y}NkW-fn~tc)BAaL&O37CZVKq`2zViy&UNUT@ zyiM6uuGYHQ#{8!#E~uqV6_B?Qd1*a$G5}~%jP6MAnE*U$Ws-rwC>B#1e5E*JLNvjE z&k4TVXT3XldPVD#R`J4~Z--SxLRB{u2g+#h(13N-Z$VrYjUvr5`%G@=>NYdAgDW*@ zA~%zPyA}1!nA< z4H#_}Cx>Li%mby(XJ))i4JOFbuQmj$7&?2o+$2)*;1v_*OH^?#>J;TfVxcIO8Od$m z?tNb7Mq`y7Jh(lqErxm}%6+CdtE=}*b>fxT)~z{9B-(#qp^+W=$|0XgBL!iWQXH=0 z3gg~hhx2~TVIfx|iPomtm?XHnyad=Pd!s92c$g(MLQ|R*6^U6mmB*BN_x71je(Y;s zeZEx1Q^ChWDf0s*<<#pWwU$WwcDucD zdL{W@QyOCgdy%mcCMrp2hA&|S3W3J{J9($bM_=;N?a}c{c&u5Pg6J?!olyumgRQ)Z z5ir_>ixsPaAZi|*=wB4uQ;MMXl+h+CX$^o^^Jr68Uc4D=Q{iPqz>*PA4P!PhQGhH{ z(%v&xHCh6%@(`@0XgLX7Wkk*tarUXj%I}-X166H0J_~D*SN04UQkpBJh-o+BM)Po>G+_IA zQHfuaa)3mRDy7!&&1Xswyqf%64x^;!t?EnCS$ZE;YRKhFB9?1<%Bw%vj646;D`Hbn2mzr0XZD>NUQacN5%FHzvq$MvpE3!63I6^>=HstbE zqzkwRbec7iZPSVo2$O@obUwX(_S2s@zkhDl9{IYLogN=oi|Ae+^i)nVlfXxmc8p0O zN}Sa51EVne3_t*zr3GfHnmiKE2{g2vKKNlJTdceSmwD(kwKuS%fDk)I&6_ehrve>p zWLPTpA~1kX?7$HFm@WiO>J3XGcGEgBk`WFCunFypOXS3cX8m_Q^Rav9cN^`ImwesP z_9V^mAb~xLE*ANE&lry!9H%wIh_YPCaBi7b8-kIOTo9(9C5+>mAzVYYsumGKvzEIy zQV)>2>twpZjjd!~NhKLEfv+6Bx-wXLp_nM$7Dp-D&0Cn7z%J8JIkAqsSO2k?liW?Uiz}*>f}%gqDJn2FUFF-HK!xvXL%AA`}FNlWrl zxiGBzh@prcIhsJYE25X$C&`_%#J z&M77pi)&sjjj9O?PjxktH&$%eX?vaYYYzdz2w!Ky5fnx$??5#c>uJutTSiJHT`QD; zyxbCK(u$cOBukl}fiPDFM$8$9VVDn>Fv64Z6tRTVA-RWj6)hztn`mGA>Q}bg?ajwt zy4{|rWc84o=$e9h%?!%5mrRwcqOeJ=wm++Xn51FWVuTTLv($Md&?gsi6dEW&Cv9)1 zk~*<~HAGH_V;VA~3TKAzP$DEohB&3i)ekDUG+5wf)2t*dO$xB~bPnWCJGNW^F)B{PduaAj3G=iRZ2MKmZz_BcQ*+D^fR z$dJf7Az~Iu>idaLEBRis?$(|qd-58CmDoag6vwN2m*E;{v+u}JgVH2khu~71kM#g+KEwqwFs)%?l?6?3nMu;dbOf9U zG)gX} zNeWjC7G*7C>!Pc9 zkggbCcy5YWtmLq4+45zV&P{`u$7>1E9W?6`l58?1IqHEK%Ypox#_&`P&6#5A-7^>3 zq_H(HQu1qga7Wn_Hex7^wdj>V%j~1>+GGm}%{W{^NZ2$>IUXBXgMOMi4RSfrX)4Wo zK8mR)&4`s^CTmiPn?p2%wPte7XOh~4ZV(z;@7-F+*jiR&W}U{KDFW50PWjPvU(&RZ zT1ksQN`3{mmKIs68AU*7203VfCWQsfk_MZ@J55ilw49vGiz@FT{jZQR#)Q6Fsc^D( ztr?MFLOkpfI<|B)(!R-v)%Y+=_^kMwWpqxjqD1PfwQwi%p}->8Y~I&A%x6e8)gyLbT}u1tn@coRathJG$2*=1~{zT z*t;2IN{`gFc@0v8qgm4=Vb#xkB3yI8RO8+oR8$^^;EGksozsoZXkH5X`Fv6d zoh}!WFCi=C&g7evAwP{v3}Z56qS4Ai4AUyA#2=R2BND7^wI>=R3cM68t*(S2_lQZq z*7UOOSyak%XkWHU>tNlz{D-Qxu2EGK&^rfT38f1M_N=6(LZv8Mf6P~0bL_v)^DP;q zStP_fHY`B+00e8vAWJ_wV@o!zwH9L}gze#>vXx04QSP`jS`cl*lVvN1)nR-+p)&EZ za<{`InIlQIJyGQcjyRaMNLp=oSNBhwrcgM^AmiE2%?!3-)BFIgU5}ZO?SKUmluX3(g4X6BIAPQ5tZvl90fgQOW| zls9V`ai>oq+>)U?_i(C*%jC#JGels)!Z2DE0LdY*lgi*#I2NRqEKX7mGXxq1Ho6>6 zOQ9|)gpo2=I^E24A)iOdXdMAeyQh_UD5wliYm8i_4-e@h`++nk-d0^w)X(WE#Rw0^ zhfxnG<(x>{;qa<%t>PhrUM^^*$VfbZq?H`gBa+v=x*s)?t|+vTNLWphH4Bf-42a08 zGJA6|`KSfEyCOGC6t%KYAq!=&CItKbqya0t*1|t)l1A8ixX#KzUv|G?i@ zhL)To5JD^4&O}g((-jy{`;KW zSR@>zvd!Y^6>g9t5H2H>rx-=#5_FG2YXwo6ZG^q?YC0|?6iS;zvSPrN%eR%Fku-pz zFiWm}l6+L27v;}4@2FJvqfPR1YcH)253DJsyB(*A9W7U4liS(}E4#B0KHyOpgC@+`InsKHjCFAHTF1Z$SeXqC!_`x*a?{1XZ< zRZsS$6M}*vYvbxFlpYJLV-}F#$m-bRl{r}5)=CymwJDsDO%|;@YF3%`>P$VyI*ofT z?$yCMqw}g0Q}W{sMvKKQ?^OCDZPv3=(?1JqVL`6^sl(%$7&0acDaT*hJChYy8uKIw zO$ykGEkv4LlxeJ&n4p9nNXuW&BP?3dj!g&_5}MR*CN4uJsU@9lBhX+g8|HuqWsPOD zbzmu5X`}UYlI0whu$cV}Iy+rx`KWC|Re9%fWf^I)Qj!j8X;@=RpoV#>MuM^3bkO>) zU}xg9QAG`6&d6Ob1I^^HJ)I`u706nyN3N<0040sHbYsE+@rJC%w}9I!+yQp347-G< zR1j*j9L~GJtfdczMR7xl@t+8HWxm#0Z$6?7P|JEEBYDYPQkCaP)z3Syt|lmzEM#KU zMsoT^K`YLgtKc9*Gb6cKm!dTmi)^p@W?Fs_ttzh7r#dBZIUk%SwyFdm4Mgj<+94g( z4f|q-m4hm1HEZSEU?4Raxgwfc(s~TEP3N_<>kpk>zkmOH+3iZ?Yyi_<#aNDnDMDR& zjWs4ryAcG;(j45>T9| zB5LJLk&JJ2t5Zk;Ym*yRXrYz6nN0(57PQS~E2Wp#N*+H4-Ap%nTC?`h+4bv>KB5r~ zRDu8%w`^|1Rc!QtjeaKKY@(Rw0i~M3BZTPavN~mGhIgYC#bxqxrvQFN({fR7M#)qC zj9x>?khLz0l~q(z4GI(Ilk$+$4d^f{Jy2H5={J$W#byvAyc)t(+9kOw&p4TaYyz}R zvQ5vf-?(}6(TKQve$PkH(zw(j(wPkz{43HldVsR%t1?4nhf^N0>&a-o zXWd4tBf5(0t{Ez(`_24L&XK+_KJ^`Ds}W&(ofNORSv$M_@Xd#B4%fZAw{y%fVe<-z zq*3gxS=(%S?-M&AiKESCI+Y`|AmAAkQ2252yRt#FCMjJGgY!O4-{r}lCCFyw->{xe z=XD@f`6I2zeVgiIN`z{dM|QfTMuTD|&^#@aMagNF)pn-NaIy|J@K8=JO8T6Sz=&&S z*RJ2VzQnk9=T03k7Y9XuMHqqTU-j)=+sn8|&ldcp_ zhB7qM43*gDXl6aJbYg@)Cc)RZo?hgb%#lK&v)&A1uTKas`CQtomY00G!qwp)$yBiL zGP-MK<&@{ESHGr>avAGwtY163ad!RTvBdekJMPOo3~GNk!k!T=^rPdGD-WGzt+rA~ zX|~xOUAubb9{Xc;(^M>H-Szy-y^^qSpV89hMW?S5XCra|Ci;H1n7mt4rMbjGs;r#u zg;k7H7Y0*Xt^B6*a2m3#u!EI*QsRbtxfJG1En4f>u3bO7ej{A>?%vKdHIIRsjcTrn zdE#Baa^>ochac^IJ6*GjJ*JSynBJqsSu2b@YtE4G3GY+*vL2;a4}bd1uO#hKK_-k- z)b0}88#l&? zi+i_+`}8E3=(wD##wXM0Yux$B9I>JhOlyLlSP0|WYL;F41n&s*QqGM<*SA<0aE^*oe` z!0w+oTYfA{)7@%TGzB48CFmv2V_H;ZK78PW#mX-!F&o4IYL>^*Wzbfvbf?s$`TlgL zy1eCLX)R58#~k6T)2EflHXyRgto!Hz}Z*uYmCdNVXFkWdRPMw&I!-b z$ww$@T-7D4u#Q4Wgq}7^lxfk~6;Mm3b)!nkJ zTHw`MaXmz5JpnZpr)fst9dN}41v^N^VxM4cogtBjfX^Gff0*-F6=^oKW=6B5Vy&24 zK~$cH{^^iF6Ng9A?eD4`xFc#JXoU#Yp%gPE9b9Swa`ViBSOKo-o3wKKD=x)6IuMb^ z?yScE&C)>gs5z)(_;R^Zk9lz9o(Lt9)-22YB!^^bnVah195-yNV+QUur>G_Y<+4|g z!nI04=BQwvT#5-T!uJZXGRI!ei9Ew$HCImN(X#MIkzF9=>OKPTO1Lc~fZCXA4~u|)ZeeXk^jgk=6_5ID!|A1zX9NE-%u)fJ+%M;002ov JPDHLkV1hQH`#WFm#_KhbhiGA@U*^o_ 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