From 926392e5b9bd09e86899301b22ee8ab78da8b47b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20K=C3=A4berich?= Date: Sat, 26 Sep 2020 23:34:31 +0200 Subject: [PATCH] Bugfixes and speed improvements --- Documentation/DeveloperInfo/FPGA_protocol.pdf | Bin 144278 -> 144061 bytes Documentation/DeveloperInfo/FPGA_protocol.tex | 14 +- FPGA/VNA/DFT.vhd | 2 +- FPGA/VNA/SPIConfig.vhd | 4 +- FPGA/VNA/Sampling.vhd | 36 +- FPGA/VNA/Sweep.vhd | 20 +- FPGA/VNA/Test_SPI.vhd | 6 +- FPGA/VNA/VNA.gise | 247 +++++--- FPGA/VNA/VNA.xise | 14 +- FPGA/VNA/spi_slave.vhd | 26 +- FPGA/VNA/top.bin | Bin 341160 -> 341160 bytes FPGA/VNA/top.ucf | 1 + FPGA/VNA/top.vhd | 12 +- Software/PC_Application/Device/device.cpp | 22 + Software/PC_Application/Device/device.h | 5 +- .../Generator/signalgenwidget.cpp | 9 +- .../SpectrumAnalyzer/spectrumanalyzer.cpp | 17 +- Software/PC_Application/VNA/vna.cpp | 29 +- Software/VNA_embedded/.cproject | 554 +++++++++--------- Software/VNA_embedded/.mxproject | 2 +- Software/VNA_embedded/Application/App.cpp | 7 + .../Application/Communication/Protocol.cpp | 37 ++ .../Application/Communication/Protocol.hpp | 15 + .../VNA_embedded/Application/Drivers/Exti.cpp | 14 +- .../Application/Drivers/FPGA/FPGA.cpp | 35 +- .../Application/Drivers/FPGA/FPGA.hpp | 10 +- .../VNA_embedded/Application/Drivers/Log.cpp | 2 +- .../Application/Drivers/USB/usb.c | 4 +- .../VNA_embedded/Application/Drivers/stm.cpp | 50 ++ .../VNA_embedded/Application/Drivers/stm.hpp | 7 + .../VNA_embedded/Application/Hardware.cpp | 6 +- .../VNA_embedded/Application/Hardware.hpp | 16 +- .../Application/SpectrumAnalyzer.cpp | 12 +- Software/VNA_embedded/Application/VNA.cpp | 30 +- Software/VNA_embedded/Src/main.c | 48 +- Software/VNA_embedded/Src/stm32g4xx_hal_msp.c | 8 +- Software/VNA_embedded/VNA_embedded.ioc | 118 ++-- 37 files changed, 873 insertions(+), 566 deletions(-) create mode 100644 Software/VNA_embedded/Application/Drivers/stm.cpp diff --git a/Documentation/DeveloperInfo/FPGA_protocol.pdf b/Documentation/DeveloperInfo/FPGA_protocol.pdf index 09d1ea479be4ce14156f4c4b086adcd82d068688..a1c6201a9b64fbcbf2a0fd5523039b24c9b5791f 100644 GIT binary patch delta 28206 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 TPa#MVc-XiRsHvq@Wf1-k!K*EU delta 28417 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 Bx?%tT diff --git a/Documentation/DeveloperInfo/FPGA_protocol.tex b/Documentation/DeveloperInfo/FPGA_protocol.tex index c1241f6..c8cd222 100644 --- a/Documentation/DeveloperInfo/FPGA_protocol.tex +++ b/Documentation/DeveloperInfo/FPGA_protocol.tex @@ -248,11 +248,11 @@ The register contains the number of points per sweep negative one, e.g. set to 1 \begin{tikzpicture} \bitrect{16}{16-\bit} \robits{0}{6}{reserved} -\rwbits{6}{10}{SPP[9:0]} +\rwbits{3}{13}{SPP[12:0]} \end{tikzpicture} \end{center} \begin{itemize} -\item \textbf{SPP[9:0]:} The register contains the number of samples per point in increments of 128 samples (e.g. SPP=0b0000001000=0x08 uses 1024 samples per point). The value of this register is only used if SweepConfig[92:90] is set to 000. Otherwise it is overwritten for the sweep point with one of seven preselected values. +\item \textbf{SPP[12:0]:} The register contains the number of samples per point in increments of 16 samples (e.g. SPP=0b0000001000=0x08 uses 128 samples per point). The value of this register is only used if SweepConfig[92:90] is set to 000. Otherwise it is overwritten for the sweep point with one of seven preselected values. \end{itemize} \subsection{System Control Register: 0x03} @@ -432,11 +432,11 @@ Setting & Time\\ Setting & Samples & Equivalent IF bandwidth\\ \hline 000 & Defined by SPP register & \SI{914}{\kilo\hertz}/SPP\\ -001 & 128 & \SI{10}{\kilo\hertz}\\ -010 & 384 & \SI{3}{\kilo\hertz}\\ -011 & 896 & \SI{1}{\kilo\hertz}\\ -100 & 3072 & \SI{300}{\hertz}\\ -101 & 9088 & \SI{100}{\hertz}\\ +001 & 96 & \SI{10}{\kilo\hertz}\\ +010 & 304 & \SI{3}{\kilo\hertz}\\ +011 & 912 & \SI{1}{\kilo\hertz}\\ +100 & 3040 & \SI{300}{\hertz}\\ +101 & 9136 & \SI{100}{\hertz}\\ 110 & 30464 & \SI{30}{\hertz}\\ 111 & 91392 & \SI{10}{\hertz}\\ \end{tabular} diff --git a/FPGA/VNA/DFT.vhd b/FPGA/VNA/DFT.vhd index ec333d4..a251320 100644 --- a/FPGA/VNA/DFT.vhd +++ b/FPGA/VNA/DFT.vhd @@ -86,7 +86,7 @@ END COMPONENT; signal port2_latch : std_logic_vector(15 downto 0); signal window_index : std_logic_vector(6 downto 0); - signal window_cnt : unsigned( + signal window_value : std_logic_vector(15 downto 0); signal phase : std_logic_vector(31 downto 0); diff --git a/FPGA/VNA/SPIConfig.vhd b/FPGA/VNA/SPIConfig.vhd index 48a0d19..1cb3ae8 100644 --- a/FPGA/VNA/SPIConfig.vhd +++ b/FPGA/VNA/SPIConfig.vhd @@ -49,7 +49,7 @@ entity SPICommands is SWEEP_ADDRESS : out STD_LOGIC_VECTOR (12 downto 0); SWEEP_WRITE : out STD_LOGIC_VECTOR (0 downto 0); SWEEP_POINTS : out STD_LOGIC_VECTOR (12 downto 0); - NSAMPLES : out STD_LOGIC_VECTOR (9 downto 0); + NSAMPLES : out STD_LOGIC_VECTOR (12 downto 0); EXCITE_PORT1 : out STD_LOGIC; EXCITE_PORT2 : out STD_LOGIC; PORT1_EN : out STD_LOGIC; @@ -196,7 +196,7 @@ begin case selected_register is when 0 => interrupt_mask <= spi_buf_out; when 1 => SWEEP_POINTS <= spi_buf_out(12 downto 0); - when 2 => NSAMPLES <= spi_buf_out(9 downto 0); + when 2 => NSAMPLES <= spi_buf_out(12 downto 0); when 3 => PORTSWITCH_EN <= spi_buf_out(0); PORT1_EN <= spi_buf_out(15); PORT2_EN <= spi_buf_out(14); diff --git a/FPGA/VNA/Sampling.vhd b/FPGA/VNA/Sampling.vhd index 3199960..44535c4 100644 --- a/FPGA/VNA/Sampling.vhd +++ b/FPGA/VNA/Sampling.vhd @@ -43,7 +43,7 @@ entity Sampling is DONE : out STD_LOGIC; PRE_DONE : out STD_LOGIC; START : in STD_LOGIC; - SAMPLES : in STD_LOGIC_VECTOR (9 downto 0); + SAMPLES : in STD_LOGIC_VECTOR (12 downto 0); WINDOW_TYPE : in STD_LOGIC_VECTOR (1 downto 0); PORT1_I : out STD_LOGIC_VECTOR (47 downto 0); PORT1_Q : out STD_LOGIC_VECTOR (47 downto 0); @@ -99,7 +99,10 @@ END COMPONENT; signal window_index : std_logic_vector(6 downto 0); signal window_value : std_logic_vector(15 downto 0); - signal window_sample_cnt : integer range 0 to 1023; + signal window_sample_cnt : integer range 0 to 8191; + signal window_index_inc : integer range 0 to 8; + signal window_sample_compare : integer range 0 to 8191; + signal window_sample_cnt_inc : integer range 0 to 8; signal mult1_I : std_logic_vector(31 downto 0); signal mult1_Q : std_logic_vector(31 downto 0); @@ -232,7 +235,26 @@ begin phase <= (others => '0'); if START = '1' then state <= Sampling; - samples_to_take <= to_integer(unsigned(SAMPLES & "0000000") - 1); + samples_to_take <= to_integer(unsigned(SAMPLES & "0000") - 1); + window_sample_compare <= to_integer(unsigned(SAMPLES) - 1); + case SAMPLES is + when "0000000000001" => + -- 16 samples, increment on every sample by 8 + window_sample_cnt_inc <= 1; + window_index_inc <= 8; + when "0000000000010" | "0000000000011" => + -- 32-48 samples, increment by 4 + window_sample_cnt_inc <= 2; + window_index_inc <= 4; + when "0000000000100" | "0000000000101" | "0000000000110" | "0000000000111"=> + -- 64-112 samples, increment by 2 + window_sample_cnt_inc <= 4; + window_index_inc <= 2; + when others => + -- 128 or more samples, increment by 1 + window_sample_cnt_inc <= 8; + window_index_inc <= 1; + end case; end if; when Sampling => DONE <= '0'; @@ -266,11 +288,11 @@ begin state <= Ready; end if; -- keep track of window index - if window_sample_cnt < unsigned(SAMPLES) - 1 then - window_sample_cnt <= window_sample_cnt + 1; + if window_sample_cnt < window_sample_compare then + window_sample_cnt <= window_sample_cnt + window_sample_cnt_inc; else - window_sample_cnt <= 0; - window_index <= std_logic_vector( unsigned(window_index) + 1 ); + window_sample_cnt <= window_sample_cnt - window_sample_compare; + window_index <= std_logic_vector( unsigned(window_index) + window_index_inc ); end if; when Ready => ACTIVE <= '1'; diff --git a/FPGA/VNA/Sweep.vhd b/FPGA/VNA/Sweep.vhd index 5ea40f1..0becdbb 100644 --- a/FPGA/VNA/Sweep.vhd +++ b/FPGA/VNA/Sweep.vhd @@ -35,8 +35,8 @@ entity Sweep is NPOINTS : in STD_LOGIC_VECTOR (12 downto 0); CONFIG_ADDRESS : out STD_LOGIC_VECTOR (12 downto 0); CONFIG_DATA : in STD_LOGIC_VECTOR (95 downto 0); - USER_NSAMPLES : in STD_LOGIC_VECTOR (9 downto 0); - NSAMPLES : out STD_LOGIC_VECTOR (9 downto 0); + USER_NSAMPLES : in STD_LOGIC_VECTOR (12 downto 0); + NSAMPLES : out STD_LOGIC_VECTOR (12 downto 0); SAMPLING_BUSY : in STD_LOGIC; SAMPLING_DONE : in STD_LOGIC; START_SAMPLING : out STD_LOGIC; @@ -114,13 +114,13 @@ begin to_unsigned(55296, 16); -- 540us NSAMPLES <= USER_NSAMPLES when CONFIG_DATA(92 downto 90) = "000" else - std_logic_vector(to_unsigned(1, 10)) when CONFIG_DATA(92 downto 90) = "001" else - std_logic_vector(to_unsigned(3, 10)) when CONFIG_DATA(92 downto 90) = "010" else - std_logic_vector(to_unsigned(7, 10)) when CONFIG_DATA(92 downto 90) = "011" else - std_logic_vector(to_unsigned(24, 10)) when CONFIG_DATA(92 downto 90) = "100" else - std_logic_vector(to_unsigned(71, 10)) when CONFIG_DATA(92 downto 90) = "101" else - std_logic_vector(to_unsigned(238, 10)) when CONFIG_DATA(92 downto 90) = "110" else - std_logic_vector(to_unsigned(714, 10)); + std_logic_vector(to_unsigned(6, 13)) when CONFIG_DATA(92 downto 90) = "001" else + std_logic_vector(to_unsigned(19, 13)) when CONFIG_DATA(92 downto 90) = "010" else + std_logic_vector(to_unsigned(57, 13)) when CONFIG_DATA(92 downto 90) = "011" else + std_logic_vector(to_unsigned(190, 13)) when CONFIG_DATA(92 downto 90) = "100" else + std_logic_vector(to_unsigned(571, 13)) when CONFIG_DATA(92 downto 90) = "101" else + std_logic_vector(to_unsigned(1904, 13)) when CONFIG_DATA(92 downto 90) = "110" else + std_logic_vector(to_unsigned(5712, 13)); DEBUG_STATUS(10 downto 8) <= "000" when state = TriggerSetup else "001" when state = SettingUp else @@ -133,7 +133,7 @@ begin DEBUG_STATUS(7) <= PLL_RELOAD_DONE; DEBUG_STATUS(6) <= PLL_RELOAD_DONE and PLL_LOCKED; DEBUG_STATUS(5) <= SAMPLING_BUSY; - DEBUG_STATUS(4 downto 0) <= (others => '0'); + DEBUG_STATUS(4 downto 0) <= (others => '1'); process(CLK, RESET) begin diff --git a/FPGA/VNA/Test_SPI.vhd b/FPGA/VNA/Test_SPI.vhd index 7bef600..dd18fa3 100644 --- a/FPGA/VNA/Test_SPI.vhd +++ b/FPGA/VNA/Test_SPI.vhd @@ -216,7 +216,11 @@ BEGIN wait for CLK_period*10; BUF_IN <= "0000111100001111"; - + wait for CLK_period*10; + CS <= '0'; + SPI("0101010101010101"); + CS <= '1'; + wait; end process; diff --git a/FPGA/VNA/VNA.gise b/FPGA/VNA/VNA.gise index 5c340cb..ae038b9 100644 --- a/FPGA/VNA/VNA.gise +++ b/FPGA/VNA/VNA.gise @@ -45,7 +45,9 @@ + + @@ -62,6 +64,7 @@ + @@ -125,70 +128,112 @@ - + - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + - - - + + + + + + + + + + + + + + + + + + + + + + + + + - + - - - - + + + + + + - + - - - - + + + @@ -198,15 +243,16 @@ - + - - - - - - + + + + + + + @@ -219,77 +265,88 @@ - - - + - - - - - - + + + + + + + + + + + - + - - + - - - - - - - + + + + + - + - - - - - - - + + + + + + + + + + - + - - - - - - + + + + + + + + + + + - + - - - - - - + + + + + + + + + + - + - @@ -298,9 +355,8 @@ - + - @@ -310,9 +366,8 @@ - + - @@ -320,14 +375,12 @@ - + - - - - - - + + + + diff --git a/FPGA/VNA/VNA.xise b/FPGA/VNA/VNA.xise index 4141bd4..b3331c2 100644 --- a/FPGA/VNA/VNA.xise +++ b/FPGA/VNA/VNA.xise @@ -59,7 +59,7 @@ - + @@ -107,7 +107,7 @@ - + @@ -128,7 +128,7 @@ - + @@ -392,8 +392,8 @@ - - + + @@ -411,7 +411,7 @@ - + @@ -463,7 +463,7 @@ - + diff --git a/FPGA/VNA/spi_slave.vhd b/FPGA/VNA/spi_slave.vhd index 5b185f0..4906509 100644 --- a/FPGA/VNA/spi_slave.vhd +++ b/FPGA/VNA/spi_slave.vhd @@ -46,14 +46,14 @@ entity spi_slave is end spi_slave; architecture Behavioral of spi_slave is - signal miso_buffer : STD_LOGIC_VECTOR (W-1 downto 0); + --signal miso_buffer : STD_LOGIC_VECTOR (W-1 downto 0); signal mosi_buffer : STD_LOGIC_VECTOR (W-2 downto 0); signal data_valid : STD_LOGIC_VECTOR(2 downto 0); signal data_synced : STD_LOGIC_VECTOR(2 downto 0); signal data : STD_LOGIC_VECTOR(W-1 downto 0); - signal bit_cnt : STD_LOGIC_VECTOR(W-2 downto 0); + signal bit_cnt : integer range 0 to W-1; begin process(CLK) @@ -75,14 +75,14 @@ begin end if; end process; - MISO <= miso_buffer(W-1) when CS = '0' else 'Z'; + MISO <= BUF_IN(W - 1 - bit_cnt);-- when bit_cnt = 0 else miso_buffer(W-2); slave_in: process(SPI_CLK) begin if rising_edge(SPI_CLK) then -- FALLING_TOGGLE <= not FALLING_TOGGLE; data_synced(2 downto 1) <= data_synced(1 downto 0); - if bit_cnt(W-2) = '1' then + if bit_cnt = W-1 then -- this was the last bit data_valid(0) <= '1'; data <= mosi_buffer(W-2 downto 0) & MOSI; @@ -98,15 +98,19 @@ begin slave_out: process(SPI_CLK, CS, BUF_IN, bit_cnt) begin if CS = '1' then - bit_cnt <= (others => '0'); - miso_buffer <= BUF_IN; + bit_cnt <= 0; + --miso_buffer <= BUF_IN; elsif falling_edge(SPI_CLK) then - if bit_cnt(W-2) = '0' then - bit_cnt <= bit_cnt(W-3 downto 0) & '1'; - miso_buffer <= miso_buffer(W-2 downto 0) & '0'; + if bit_cnt < W-1 then + bit_cnt <= bit_cnt + 1; + if bit_cnt = 0 then + --miso_buffer <= BUF_IN; + else + --miso_buffer <= miso_buffer(W-2 downto 0) & '0'; + end if; else - bit_cnt <= (others => '0'); - miso_buffer <= BUF_IN; + bit_cnt <= 0; + --miso_buffer <= BUF_IN; end if; end if; end process; diff --git a/FPGA/VNA/top.bin b/FPGA/VNA/top.bin index 527a2597edfb67a79da26f86cc43c7303eda7e74..0cfcb44d52fd2c0e771c2d3465924ec1c774f0cf 100644 GIT binary patch literal 341160 zcmeFaZ;T|#bte{?l{Hf}?A@*+M!*7=z(`?%8w=QDuV~8hy2XjyJp(jg>IMflUf?Wrqb>h_FETQ-{#Q>|ckhb*sxtn(_u|Ei7m=9}8Ic*2$uvBC>)^rOiMpxP zizhAnV)9F!7hmiCe=oipsosCT_m}Fuy+XaI)wEw5 zOg_NNjReJTjl&%Xxzn>bEz6gd7;sZX8!2mkM<-cDPT~LQcEmU-k@{GBoANf2wIxGrl-Ea<$&`wF|MJUW%PhTr`5Ij3cx{1e z3pfjOt_^W*0b0N}gv-Bed;9;S_v5@BuKjBZTw6dXQyRhhW%R|;zxIAIEMUuGdjC>O z9hSLy|57tAGwbwR!244==&2YZ4&z+Lr(q<~pyWbi>0MV(C){%EVx@0c*((rtZJ+HM z-FI=fFZrV^aa&f|mYj`ksW;}lX57dEOK$}mr9Ll{fq+YIL+4d`b^7jV@NqBQdK_fx&W=Rjb*ND z66@$2XEejONbVwBGub+NllQ{H`obh{QSdTLt;Q$NfE;YE4A)Sn^Py>a&3PUAC|ST> zxw6+Q*{-|_t`)epz_kUgEii3?z)r_6KlY)xHJHmUca>v370>MH!#ydQX+NHb#V1(%SD$^teUEH%DQP|Car^J zFioH4MLW?`iMJc^L!(tvgKf0~WY%}j4?6BzAnlJBrv_cuNIMQA?PC)aSE>JDqOmM2 zTV1A}${P=SJBT^D=OE@1z-M>jKBY8B%ou}PART2>z>r~<1H@3br)BP^g>Pd|6=5Rj-|!eS=LAW=y>=@*O-fJe@S z?X011Weqr934{iyfFVX;nnx4$jw_yZ>njSboMVbwGK`3w#ayn)W zojm6Q)Oe{uQWT2jr%#C4BGfv%u%5>$#x}9YG0`?LMXM+ZG&9DLyR|Ldq_-E)&y%-H zYYH8thT$mCMNpV_m>X!oD}I=(@j5zFZUa91vXk=Jm*4!jdVEvWagX=@V){08_(_)W z`fsf&{a<`#9eq{m&1kQEvzl>u@o|}C$0yBy?RVGFJ?qo^vC{IR1TBXtLpgju>t`hF z9Nh>b*qVt0HID&uDO}v#%F-;am=LbZzq53*)umkDZ&}Cjp)~q*AJH4hFIbCa`jE49 zA3vWTNOEVs?HkF-)n=8BHE~@fu9C8vW>=F*l~KyYX|P-Y=7~=@2!n4CiHsctrybqZ z4Z}{yI^-ogypKJFzwk6Yx6~zy%*#!rKQhbS8v7E@QnnlqkH=}IklRIqJKJV+h#bNW zIR3D+)a}L>pW`mmL(H${t>S_;P-d<~9@A=}0y1@c!L`7CuLqyCc8FkvD?xTNI`;G{ z@yE8e_2+_f1(`nsD;A825O$ZO3VEr4(M6w$>q?XMIYPNeNHvg|#s-o;Vl3q()2!BPiCekm&kCN8cd^uB0cbqj>1|li z3zBb+ifw57Dybf@S1GN8OclSlKra}<-1GK!t#TfJ5t>ke%gJe(_MvL`lX+ri#X_8U z?x)9e(F)qCCC@XPQhK4ru--IL7ZjFOu;6LlrJaiE-Uegq3o87z*lPjtSACVE|bo`b120kiP#qt_)}%dk#BO~1tER%g1Eklu6*chCkrjcSRL6==E%Ec|z;G7^{Ziu_K z9rx9sh0NjSrsh3=h&CQqVun&Y7ndqP5HI-!d;!zFjp_UrE`L)7*2>0 z7ichRY8kZ93OGa8LVR0bX=?r|DEkTyV{snD-546Q2koSNjJFV5-B$ZJuh`EWK;|gs zGO%hKvsvoS$)Md$Y&Xem-?VIZ`GsqlsHJ$Uo6fSO)JPRaAdW^s9-=OWXbw3p48ve) zil-yYu9%&Tmr@@qb^iv!@ZT&^+we{&r|RzB-Mv{^j|3)@M~^0xT`XwDI=abQZ#Dhd z6i*wc2A}Bd&LyAKfO~^d1Mklz_y{8&ojy9fapU)YzgdKxohMJ6{U@+J?LS=y4%19= zp72|fx72D4oaLK!aGv}&NL$YKnb0bwzZ9Bp*c<8v@s*0b|3!Dj+(6vU%UPP{L~`hHzzmM-d+94 zXD839-Y53%F5=k^Zh;1t*WmV~t@J1LCwC@z8+La)8fa13-Ig*JQ5ruFb;x7rSJD?zWMHi)(nUKE_ocoEM9 z;Yu6UMP;X_-FUf(GaoJd;tNt>&gzX3>gHM2`nxo)N;glxEzanv1r3oh=g{1$1#h>p zJTi)(>r1c8aMm&<|MKeW;k@cCmx>W3epBPh<;-WI_Oz?pn-o(dpP0A5$!b zOrfQsPclQrAaXsdo=x>l+*)glH7l0j*cd#s*{x{1v#iVFd^*EV!}Y>cjiSzi^UwqIC!Hr~8BQD1ws-B$ojbp>YW{~}&TfYGtg?VTJ1N@zKDKS-eM&R*NM#1yK$u|Q&ry2BI zbamtE$XseqwQQi;^~_Z`C*}eXT4ZOD!I_}PWkws>V7p3jyr{Btn|zyFp-63z3gQ5To>T`ER8a2A2wY;_7Is(i?!3yOO44>td4Pc#@o(% z{aIG#SPq?8HNJYbt;?Les~I57sX@e1kd3h(eIe~qkUBAm&1M_srDR=ZqLq$2c!Y3u zfU8lCh3HqOfYQu8$gWZaqhqCUVZ1sRN!C}X!3nR>`PEr~IX}MI?5{reJ-`)fv1llF zsVW`xF7xxk3yb#J-VNVbTu8qZY_H(j94M;e78UNT>R8e0wlwdWbj!q2jEFUXR^GtBvGueqFO;Y`R9 zK^NGEc4Ox`jn^T}I)<~-)0qU9-@rMnYuX<}wq|rjzwJiZK(bOK*UYX2vyys#;`r&F zpPWDAT0+$t)|jGBv8@nBY$GGWbdS$c@YV)efolkD!Jo^~XG@*tW34h%nd5A!x58~L zCZh5C2?o9~GLp7%RYuSuROn@wel|49YZ(@YfvbV+sujScIl7vn*ST(I2E3Mc_Rt^y z(jQ&zPC@FeZnOJ!_7Z&5Q|v#O?1t}N#=PS)OYJ{U&>(zw8T~Tw`qKJmmritZQ72OAEh&v}Lf6$73nPq@*~c#I-rrsl7zt@>*Y%Kr$~0*ds`^ zVBI%iJ~oYM@-7LRCHM-R=VPO?aT?`nY_h3_SMgkIfQ!{pQFw=Q0JmMJ8qT7|ZID-wAIa>U49$s3qm%4p zyVgI6cuC$^u&wyP1`9+*;;T`01w@m!@tV^Y4_ z#9xVBnBwe6FKtm15NQ~#-(ujVdYRtiEsx%BQ1W^>1^DseJ0HyNQL|pcc{#93cjCv3 z>9?;!gWbu&{$%n>xVw9Bu&aLOjq{dhar#wrs=Ml7|CR8SkY6F&RsS$qEaAM^MH;l# ztq!gUSr1=W5c!FIX6ySh{URi1rS|^3D5LY<3olF#zVl;s!Sm0)3*4JmK)vw7L$&vZ z7py_#uEWgUF3>@#Cm&p>26A08E4z*Pzq?QkW=f5|fc!>yqCUdyQG?Dy-tKV$i7j*@ zm@_CT2wnhq>B~f~qc2Oh9lS*&;_srN>eoq;@(Xvk$hGhgm8q zX6ab>u1s`s&~!QvnF^FHsVQR44&;AYsO?-!Fp^IlZ-lmIfrileU;$efsr!0&(akxC z%W|j+e~^KFiryCbxJd`g`5-A0)hY%_Vw2=>Jh1vG!G*|T=#sQ~b(*6ePSekqJ2OzN zgvCsfQKAx^qy^&xprBcS0aQgt&Pg~+UtWV}(JY__Do6qhn(-a;Of-o2P5T0s!Sg}r zh$r~I`7}K^OGZn04Qd((p-3Zq#k`JVA-j_JK**rut9DJgL!Z~RsA;DHd^Yzc+vrOhg6S%gaZU0!Q`}8jvo;>;f4bClH9qjCU|HkR*g9lfq z!PV#d+rPc@o|?F?5?zfpFTcF=-h&6bOTTV?@mgV?kvkBw8*q7N;#BAKd*A!?r_*=x zC;JEcyQh;UPcFX9$Uzpu`JCGAS_8GaQw>@@{epaBD#5S5diU;Ezxti;Ob#adr;{K3 zs3KfgV5$>{T<+c5+xzNQ@y`2!+E=@`WF^FfWxiIhUc<4Du2h3#T^Dy9eT^<#AYa~@ zw@g{PjBsiA*#>!O8DD2~ZGpuW=nP{J{N;h+%YgZOFwcA`XNNE8Wt8$dk82BDTj1IP z*A}?8z_kTFQWjXZQ0yaBn2)BiWp~hAnf9YA%h_jKEjI9o51qfRJH3w1msPLf+5*=W zxVFHx1+Fb{ZGmeGTwCCyY=QMXzAcyT%Et*?F3+{NYYUvi0t=s9xc#kvvfXpo)Fh)zC_VDK-NGGWG)-O_ zGbQEHdo4>f+CD*VU*z9$iEIt-+3Ur%iw|e5_$SU6SMHTf=R)2aTbW~%ctwS7s&K_& z>+)}v{`R+Tn|)ouzcW+e%Q^_QUl+X1EP`?Z;_CZ#i=kO~K#$bOiB^A)xuo{@lwkpguf$8(1 z8Jn}tilRIn$;ty8+eqvmWjIt*n+DT{!D(5G6ZJ4^#+UsU6CD$TlLu-kZ8PbcaGkEm<@5olKLPLn zyMwJN=I*223;sw1z5uaW1GRgRJIKAJZs6xt2E0b6ks_7MFZQwO^Gk<0+moQBB zCU={hwz%~D+V<3p2Ku^ZYr*0E1 z&nzh=VI5*rhq&_qMx_K`su1zEJQ%JZs6yKato!EC2>pR!k9TNWXE)PlYIKo|yOB0{ zC1o@2#W5Bn`I`VT#5^rY!BM@l98xTRW(kzW zCtXzsxhqSJ1IaxAj%f|zeg-IXl5}(B4I<>=_g*Cg0TmFl8CY(JQ-SN^Q-5p{qik;R zYD(Nw@WTKjJp3d}#~+Eu#?DZwq9eI8O!!O0l$SSSBBt3{g%Z?Xmp|c6!cGtc$VBte zCmaD=x-O%ULyF6`jE-V+y+m0p4W=@P;+jCKR-h9WBSuw3kv4f`3|a`g&VlaP47r-f zD1v-vHwHrFM+W@r5Z9H8hDv1^T0~6m`oT1-hh|u$AS+j76)0t08`6$DMob6%$|CTf z3V2^478I+%Fb!IwQ=BzJlRJtHdE2TxgatY%R~94QEwzlDkJ6yE(6Sy(^^D8cex`Dx zyd}V86Ke)!niH~EFA{{Jzw>f91U7sESn_t_!yJC7wTnSM_8KFm zUzjxL_GqiX(-!&t;wZ-#<9aBHnb1FX2U z=X_N*#+rp;-7hB2E)RDDEN$U-&;nRRjtq3-a+O4;6L|J7y(!P&K&P zF+NuPqo4!2>SJF)`hbzhgJ|&NWthIf>65EqJXVn|Ml14`G^7XPZh^D6qsGVz@!oL@ z384VuD$F%Fa#SzkL7`f?O2>%TAg4&L!eF<#NSQRpQ-MH@1{JpBTuWTY$Emc%_u)JJ5keiD zx%eWPBQ9`@Oa(E7!^~j9Ntdw0fICsp2@Ux3K;v#ORz-;BmK#+B8fPd7WD>|JU%N0} zR9rg3Ww|KE{n2m)#oc(=5GIIA5GFb72~SFKJw@9wA>-gX}}m%Qc5(Sj?{oa-X`qs??0^elxk{_d@Z@% zWLy;f6&3)+XzlDOh9BayWegL?_@^55QyAh?%zW2&mb>IrJQjc7PA2cS z?@dl`jGz6J_O14-i*jw^mKl;I;74)IzXwJ(YWKQ-Ti~z$=$oR~1GKn{wyLUhRY1nA;-p;|n-rel&25DIkXYHd$InH1FRsb|mw{A^q z@JHDnWwS|MdTDPD8mO~rfGgx$4cwSkBSS5tTa89V7~#kn0G>bZyQ?Mf#AM}qQgSc_ z{U+#$F^-xYhoh6zflK9M7vcwJlqwpR+ST*93rC+2-I0PV&%*XbJ-69Zlc!xpIxvo9 zETUoE+3Z{h77SxNNOwm=m);mVqXak>1D7>$6Xsa@h~tG!_^!2z(C(W=j(-&z0Qgp`XLaRe&S`)k4y;$~+bHsDd0G$jD_uew_ONbdSWzfntwVuT4=wv{WOf}H|bv7vD?%4_=K0gGd zt|-XC6s1n>$c0WUhv!p{p2Tj8PX2}U4WzIu< zB)r1itZPSyOK`HP;t&)9*;L9#+`K=?PL`g9c?f2vtml>EP6s>TsA09*+&7K$|HB zZl^E|VuKvT&Y^a$f&t4vP0va1IlAhOB##9gUP7Y5v4HOPB5T1`ZYQv@>=c%bTB*(x zWv#_9DdC*-EZt7gA$~o_Ob%8bCa7Y`p)){o)x*AA@RI>{r)nqtB9?u+3b#{Ocb48Q z$j_~+3jD2JBq3~awAM&KZ3Y1~P=VnLbTBT)*r;rPc87SuHq@Y>klqq{=I8+!njA?j zq2!pRi-e>pL7EdX6e!Ygpfu{uxOh&_Al{@ij)Ra({;N5_Vww`NslCPuia~vpIn3@9 z7PG!q(33%n0#b< zI03CSxLhseFiJy0yQbU3$X;W04j7GhOo5%i42u#4T6PKx-A-WvE|<9))pRpWXUoY0 zoJ=*xXqLn6HMSxLo%0qn4#)g z<{&@ADI?C84RA#0<#*BD>8hcp14nSK>(eqEsj-bLQrJ+n@e6P;J%1%=A8=*yG4T!N z?hHa{q$BuI-(ZHvD3fy8Abr)-s?+PF5uW@ysWRF@5++m1YNM=BkQxjY^F9`Mm;w|6 z8(7s~B~_&v3LoLegs6fRMj^PrqC&c2c3v`_aVW;s6GPL`iAL;^x|S4JWurk*M9dIj zv7foZvVl29R3mU0UKZBEZoZWwc@^g;;0KRB8O!ZUea3 zRc6?ZVpM{TFdQOSI=Q$Gp@g4U0Uc}jI5}ATD%FtG(?DhD4r^u{N1!va2)pKhGlt`! zUHSuM5y~J0IjLbgL)Jr-UgHJ}9z!=aAQD7vOGap00_JW)j&WnDXBDy5StRt(=_6Yc zU_e0&gv3x^>cXRfHZ;f(Lk1R})vDdbj!POv8U!X%xds+`4Z{q+ma9e%iFq3`hv+B_ zsaofd5^TiztoFzan~k!0j1<67x@%6T)y@zR0b(5oQfoX(hh|AMfuYKE~YrcpRz?InitFyHqBfG30gE7z7}rmlI+t-Jj$aXPc{{(ZvRA`Ag7=m z7_FgN`8z?jks<4j)8{-O7Sc-Cp0piqQerb-_?hd_!BCZ{mSGbu#) zi+lh=4PAR|#}<}7j>nMKLr0ibSIn}vtcVBAkR3if&i)yMQpT;IfYmtqy*RcQP4XJT zG3ycNeQrmr{_1SL!42TNI)o4u|!#e?XwA)0GPq zlrsucAbi-DcuQFr4YPeig`L83cB47VhXJw7=5;Xf zp2J)rvY^jrA@Bq8=VJr8#Q>g-F5l09^1t26$4+k4> z5B0=7-@qg-0eH+93o9xT47}57knlXN-WsmxV|LG)?uqKPd#c|@<2eK`YdvG4M!a3d z#Rmzk6|T!19yS>2<9fsgGHi%!C1`S1p{cXIprw>>DCzp3NT6uPD(D@lJW60_&Dp)2 z%sIv*Mtq$!IpVlg6OZa(J)@nfNPO?40Zdz4H-|Lb$Z*}&Y6#gCgwmvN=0?&CfPZ|` z5#irw2)<-7>#LeCO~_crm3qt=;IX*yZ>pCiezUy$RGh%RS@S94A7Q%W_U*krO!;B{ z2vdBg6ZPEl`|6({{AV~w-`U&SBaQLh)6>)Eo`3#%W-yt&Yw0hBeVJHz@L+EbQ*#S8 z!TOtty5UoL4g6$ZQv>o)1JbAg!E5lYU9EvIV+My)gVWQ4qh+_=$IyEqW8KXC5>Q}X2yS3YXMrFO%^sf3G`q;1OXX%4a==5`U5k(@UKKD5k2J?%5JNftO z&aF4Zs=K%DeulL0-D%qqw;bO7y-)6W%LS z{?>k}LHMrcTkk*IaGITxvh3U6Zc4nX{^a50NlWdY?$6D&Hu+YE_xJy{^DmdR&6(Ny z_y6z7*PGJz)E_?l!FO*)(BRHKW+|Jr&BIQEf4MNht-%HoHih)K~wLYE&u3#`UL z&_W%<&%-u4SP|kw&Tt5qWj3iAlT#oqea-HdiURaew1!~~lA>FIemD>OSk5jEuV=uX zqH1f6ocMD#8H%q}08F4_3#<(kNB;pR)Pl!i&`5(}-6&G=xUV_n3^5>T1={E#I}9Ap z7+@8`UG(E4r45Etx~0)d%8L?Zgd)Dj2_A%XAkhGQ77{h{7qiQKUubj;6+^kz7+ohM zF~Fg(J!Dr=6QA)w=0kELOxakS#HhtDhc77t*B&Vj9O!4tOdV8brsNz2BngyC`zUqj zsR1e?Yoo?6#z96p?R9j@BvcrSn^HbOu|uE8rq&0&IHO!KQKeC6@EFD_jnyIe!3b6n zoGZb3M+>Tr8dlwyZNin8_RlbOM7`qB&WfN>a03z-=0Jr-M*XAIY(F7>oDqwJ!MVQP zT$<9==-?tBw6so=!owIH+Z-dx76F@T9PB!K(9{7(>c+CLdyc4^e;kJ?GK_FCVDO0c zljFTWr?4(H0BZ#$Dja7(g+_G}JV~eB6-Eu2QN5@;G>BLn&?HBzkgOS}R)9=gNz><& zQi8F{=1c`QKs-kXo-N?a0F(p32@{w;g@EV;Vss}oI>q+iX`;}X)oAyo&jyM*=eQDJ z=rkY)sR>4*X`%ORjDg|`3z~HVpIeHvu4Z6}c!V0~cqc*aVSuj_gk#_-*y5m?ghX5? z1TK;?+{|7$#@$iZs4-}VY6urHZ6HY(I(c!#%7e-oJMfr#G@~}-#mN|Bn2`cK9fX`z z7y7u!#wP>BBpy;GMsje|Fds*3EBgPuH4IabjKI$%^k z#F>b-ygVaumW@@Of)o6Vmuq%;(z>b`!Vj{OAjDcu=H#X_!ypS;X=rh2PV^My3j2KH z8BVW{Q94A9a*WcE1yY;iC_oY5;}L1z10E`yALU06lp=QulTOl%)<Ac5{jNC$s3a6aNA7s`1P0|k%asADUmD!2>;e1M&+ zNUMkyh;vj^#vDAZ$J*)^sEAW?(|2h&)&_unuk_Iz1(+fc3ZgfLk8i%o>(?ufVN`_F zV_{n6oM!hhB>ojymn*~Lz1$6x#m6Yo`=`p`;mhE@#A6W8)xCQ=vWoX%cI#9=RE&oJ zB~0E(@7&(Medq80{pX*j@9~viX#n~28UQCbkyg^-*BU?_0ct=H4WP?ut--wQn>%2~gn_Ey`iq*WNqVufS7-6oYQnI~9v ziZ!%|5GIqI*8Ze@uYK?jMo<3LKT+>gwsCY0$Y*~FRpM3*d*5@c*MLK#-Q8LPR>)qy z_vBXg>Vz8L(abwOXYXT;t{XF_SgX5(G4cR$uG#%xS|8i#$e7u!<*mog-JLG*<=7f` zkeaglXWcaK{U`cARiA6KPaEW|pTD8Lp)j`o5-*~F`AYcJ{a@YB)Z4HP9yZ`n%cnm* z*|h_#d!F3>#FxMP_S?Jr2a}gxs%!Ow{b%=2dy_x$C7AXp;q~vmF6(S3um#pJ&slvs zg;KBX-`mgj-o9IFaH{OU4sL(<_U$i!Im@7ddg&!rv4ijKNBgR`yF!D#(>-C`RD-{r z{7{`vdXVUBz%{;DI{t7MyKYbR{%{W)kWY3eU;eV!;MK`3Tx(VV_U+!|lLxeh{U=Xq z>n%(3%%p?nIIY3XSDt*Zi(R+(oCdfK)EaQ*^lA<6-J=HKyPImDaoNJv)#55>hrPIs z&X?7AO5U?axT?jVq8p}_!J!Rr!%Pq=r9q&NE`S3Rgf~YBBalM^(@u@!@KQkdkuB3} z&iDa(D#8mJy%2YF5i6H?h0A>7M;!P?hI3q)V=4lv%VE5L#BNj*jC8DkaYa%VKUhgz zgU~FH!e3hYi}ILF`9-teh55BZg*SBa79Vwr76N%dp$~!CMmz3wvC%cKUObV_Fj6tPT#x zLzf4~kq$$qY0wfKIiz*oA~%{sCT1!+6Pe0uI^hhbM4KE_Nf$9YTwz=pGs^)yErIKS zDs-C6rLn}gdCsDpm3A<&81V!#I<67uuqP^%m?JEAhcLB)+Av!;geqv`e3%ht687o9 zrO*^Z4G$TIT4zQnjUVGk8{vREjxxwYYj95?%(%W}k&bD8dQ*ULe>X$ssD6~4fZ1pq z3eNzVC!CN-G<4|ZK&2=xVwDAessUIiP=fJ+1wM20FneM0_&GnA!^|UA^PqeVupp3} zDa#b3!AZbjl2Iv#MS)7v9KG-c{Yb`PpdSjoFX^Tv9C-({GCc zZj+8y4w|P!g*lE0DViLsRWO=48IvPTFbMJj@nDQKxf<5b@GQc#6+#XA5YHwKL!sxO zlpIY7;K+lh<^ah*3IbpC0`=Tqy{^;I1i9VkF#hDBPKaL;I-r zJ+Hq3`nU@4BXDtw03O_K11g1@!m3=G$Yx))!dtllRneyi`2PF`NvQ$tiVnuGO@2O? zB$B3}oFS2*%I8D`>*CIuZd~E=b8cSp;C4>N(ye_#HXRn1KLGQLBjk>^swkgvOuA4% zjUeLG!kf3OEVdP2wPXU1#hr|y5+Wa1;s=y(wWoFlXc)X1IN;o*MfcCgOZ1F~C)ZSj zK)nnDGoWYUji`ont1U5MMi&s#0a|_x&wwdQJyrISClJ3hkWXh8Y9& zEh4N9`7s-Rkcll~CWDfLR9JK~@Y+X8aaibPUp$f;IWf{SS4#A0$Ye$JmFy(?;_%eu zg9s14E@Rcz(5m8dbPh>fW*89yVuzk`x#F5529-BHewjNK-+Y@1EFw*%$0Rnb%W*o- z4BA2CkW8Hxh*jV;Bc9i`n98pOCk2&kS<&kt1d9ff=C8-lGGOx9i97$3f^s5>%x}&jRc_`g}5ENSA zrmDbXXVe*Mr~!CJK(7P~lPEmJbU+H?8@6z8VyVEUz*c6Fgm5z|0n)l1-3U71HQi#u~T$?M{ z@BhO8dE>!vKKRWQ`D~5ENe>>=z`2m${>_)KP=jfGt|T`3_6K+W-rZ_8=K^(rwHMAl zO~Pkef3I~(8Z0c|YnaV)>s|f2*PH5R7IMxbZz?zAy3r-)BInGsU$AQU&L#g`TUB=FJVa8Uw5rinz_&Xcf+x6gLHMltP$*lT?19O4oASlz>YB zS4;Pr{0?Fh`5^uB29?w}QwQfmP&h5IWy*P;8pELvI|dDIRBrI@@gQn-fYVnVYXw;wiAmhR$dg^}K^2{9A{F*r0lP4@D@LX=HN;VYMaTwp9auDf z95swlO<1m0BbJ1wT9skhF?qS%bhQ*33{ToBgvOb)z$*Blq6rOHan!K1YHAi2vdT=O zTr_vcDdiPep#hucocvl(mvYLT5rYM9!&(N2(@n`p+Qoff>qZA+2gf0@hc1mI+{9t_ zQ|)hvTA7{QOGOfzWGn$6<7F@@F>_`>Q8oa7ejxb<{00)+UTVgoYaDgf@)@OaDWGRt z<+JtGsaJ6F8!?1HJQo%O7Nv`S;SMemnibsFEfXo@^P~1N7b;J>7{3)7ys+5TwRFob z|0Wwx&ejPVq1n@-L23kjGtAiZ8+J$PsdyvFwu3%b!=~UPk_pb5sra^Y_VTnmPC=zd zx?_yT(zjTr+KeMS8=oORO_YsKE3T16tz$~o%Q&`NY~$V)@VK-27A3G7B%$G*@o8{( zN;28;2ou4ob&gudaZd`XPSr|P9+y<_OLUlUrR>$hlPBlPe}8g539Z(`QRf+y+E;k@ z^BOj@02gvK$I?F4ef1yb=QtBovj^y9F7$8T{=_Fp_}u5-NU-AfJD%zEp1OD5mf&Tr z_HSdcE;*=yQndzq=+|G42CtSSeQ)yKBmHx)|4viigM){%9=M6ye)!dU?kmna`#Wk@ z1AI^VTw~?!YkO{qjr*DwVZ0~tWA$Sk>`WLOqw>h`npkKxW=kVXS8CiQK@iYzHTt`t z$&WGOI3UGKFbMJBjXlO8x2H9?C<|^LbAVeTa2*>Zn@m`_mXAWKY|gr43rVK!U5ZAP#32UCbYEgXLS(r6nXIoTmsHkfs4c?Qfbz@ zmc{|~N=U?auE(wM(~`~tHdQl$BQP75%3?AVkkN54qQ}n%`4Tv^bA3sCNt?8(aM^hI z3K1Z~L`x5u=q%;hUM)x{z#`Vgbmsz4R>g-Z$kCh?)DQ-|xRijBI1A^>ga&wnh35)} zOhJNt;mi?EO&2dGbZlT1X103FQ3DOI909m)8Ir5WBFaPRKZDOhM$OSk9*d<~5OnY% z9eSk=$`TR-RL@AjISh9-Ky`31H~eyW_CS)x;lKMz%?0FIks+vY7|>B*-Rlg|g_SY_ zo8th85-!+uoy5HC7ji9r1~LzqGMA8ZY$IF-hZU*{neh+?ECIV*_~1G}TFzi(Vq52~ znAEN#1xAW$aD^ITR(Q)SWL3ej;3_XIAS?xE7$=8eiMOQO;__C^F`9 z&=u(Byj-B!B4cRKW2ywJ^h&b#T$Vlt?imoe6fw|FABDG5jWQ69_gV35Mw*e+*&yD4 z46C4{aZjIMlam(K=%0*rFq?maeLmRXd$3uU&Q_hZmdsWaqocNb$|>=Qh2SILKpf14 z9pGK!QEOxe?dqPUE4CE@W@V2ozEu^Q2AhRNL4eoAYnFxO6$pc>ytWYx@pdYA3q9-X%@Lh!fRTZRx290&WV-4UUqnHzThhV2<;}6tq&hT+7Dd39|^xOwZWS0Xa&6FvdP{`zph7p?_jSl%k?QF#)ctG{>Q)PX0 zNpSgW!Hd;ltAB=;U;&iIinF*QiqA0La)w_V9~ocb(6oqyl7;{uK23=l2lt2zcqmkf40YlZs$0*EE ztgvioz42Z0rW=%1(7@ev;m0>!!+Y#W&6)B0Z8_q{{g1>|+g-0y&>zo`1<9xI8 z#{K*E$M^Xr=V>D;JLGkz94z+{EfGQR0MKCGFvv}BW`QrSdJPz^VO9gYt_cNn$?)L6 zdm0U%e1HEb^saTfn9$A+zD~8jv#0i-$L>FPZ`cD&&>SD~%$4}>Pk!IAlojIn*ZO!- z67MPAy*tY|r9qRpAOq3h>yxkN!nc5-nSL(3&w2d?8dUGe%I-L6uJ|n}^auP5xfhhZ zraqIiC-)z!Uy$bt_fOR=W{9 z-;?&b%=xDe(-L=U@^$_7Ir;_&2wx#a=e)vf;_Y#?vX}?JY=f(3H!I$%DjP zVNZow3}{OeYa9tt^6npWWf-n@9P}MfI+ClPj8g|0Jj?e!iR1@-jj|DP63~d97^C?0 zDqKGJA!i7Pm@`6CkV?$Cbp}%`GZ7R+Ngsz47-DG?RJ7# zS*W!P^fE$;Z;9`+hZqV9eUcmjzHUk1DPt4|G$~y4<*15O6xBvo4lW^=!erzT6y8-$ zgg^&2gXw58htq=7Wvq+#n*qbaLscaTLwtp@TDYzennn$>92Cov@SsjC42qPx5F&&C zFDm-^Q|<|QRAR*w2QOHsaoHdtC&##JWBYea&a4;Qg73IKa z`9mtgE?p(i1;9{4oKtTHt-O`1jIZ6#LRccK8$$$$YBhv)N_^#!GLLoS2$sqjjL9`* zr~>O7WdjqJ;ba&OVOSBJ;Jxo8H7r|z{yqoYggngQ^0acxS%{O;cgaa`evXh!L3ixV zaaXvqQ3CB@4r5B4k4qsTzJOF-CL~SUrxagK@vz3BDs#Sn5T~7-qN6G9=?I%LXXC(x z!8QYd(qswb$wh#V%Z+1xdI^PaB_okA&f$O`HHilV+8|beD|r=N88}k0r&|PYFf#x? zC}=f^cp<)h%=WCU;48->-o|lkl{FQXPhLc^>dbABW`Z2aCCn1wUA%5-@il@l#_P9y z@)5@d#lz>j90OTPK(36g2MN}A|x(iYp)DCMC}H0_VAfHo9&P--;j#UW}|?9 zU`!DlkB%}#co-aVOU+StBQWHM@zdZr2~(gEGY-R(ZT^IFG#adh@qK})L2J#4rapuS zIpFmhKuUE~HoY9fqT9+L!`8?Rgr;GHRv>kF2;T#P#z!F1aa4%uKqb+-I#rRyMF68}J&KU2?iBF| zCB*DMz9U{Hja;)q3b`jpdvK_dVa8*LHUK_W3CU+1bCAIN3YYk9e2ixMzjyzBE${51-#Qt%ELf zP7NlnPTrmsDRF}f5CfLAZ%lbU60>Dks=-t~#=LavoJF0Im)i*4jmWZm_CJ zWJt6@)Q_HMLa{{2!tSn1ivCPnkPW?=j%NxFf^?2u=^a8l4-~mPkHEp?QzFDRIqtZa z(}AEKIt0)_gKY`ONQPr8f{5w{v#j$U{~@~}8#3UyLBfoC;E>WX0$~Go0375{J}V1` z+r9(ITlNQ4E{*8Hj;PzsiL<}_5mQ0nG_K+c0%2An-50jXh@=Z$gkfkez&Ym>?Vble zo(0hOu9eB8a0b!Hg4Z%`#0AO$mlb2H4@6Kg5phv3VlwM<7No-dDT_hsvnnHPnmEQF zLiZKl&y^U?Uaetk9A!2*VN1>!DB_)MHB>~9TqfWLD0+&`je;H9lqpdqLdaAIKhtbE zVFYm$3c$Jy`66i#SqCbzSUo^XpiCOtu%>fWUsn zciTLxEq8z!vP1x+_O{c?;)%sLs^wVl5};6J7Y0kvSOCEbUj$Q8SsJYb1K-J&v{fFS zK8kY$v0^BUx+#p4Ax6V!mCAtxuqnp4P!tlJeZf-$r6)l;O!(YrF_Z-}C6$|Har9=; zpyUU7hIoua3y;OHSL025@&GiRJPuhTizCL-$9K$Go@fLI+CjBkJ|?_CKXNR9oLObr zQ7;$|jr7~|F)WBIF&CF2!7v}1AWKaWwIh?drz*^dW7rJtEO63U1{$-3C2>r7T9S@z z7a@xF+D244p`!L zVzB9tP~aSzz8bU-eYEn?jts6YWqnuZrGcT+xXKMl#~w?0#(Vf!^-{q^z-m60?c|7O zDhO}@N9h`;PjswMW3$j3>d46HI!jp?A9IkdIa#kpNxwu3hv@L~bp=m!tm z+@WgQNFQoR(NdbU*r54O10Ir;P0@nDV>N)=kj?h7T!L8zIE;jhikQ~Ni~b-vfkl`v z@gNLvxUe9clLu%x^6ft+Uw=~OD(q!oGl4$pus}hMrV#Pd&LtoohPdMw@d+++iAVF~ z=c`w=*(^N1sXjZ4TN&rb_x{VA`S$q|quz8oHr-P)C!PWWj{AyVjVArxt;SqA;$em%C3H=7JpX*f zFcWyCV^ELr@6Mn<#L-9CHtUsFUJ(<(0vNjd!Y|zT{$Mbu1~HQd`@8w0Z~oiwE+{uf zkP>#fJ&E%ML!eVOuSfKSvj_~CMJ>le`n$w0sRe_-FH4Kvz^?RyiRa!uI3 z`_7;E_~hV)7iM>O`oje_@cd8X-@+ws26i7-qwj}`8iemQIq}-k@<~(P$_cl4u-5ad9Jtp9@YS)CTED zGc+Ux&%qgvtLrlu0orP~yls;PKFH>ci&yc~I=a82gD?eg6`LZY4vl;<7a9eL=#+5& zQ6Lmoy9iyJBRmTTT3nmUP>EsQ{@kdZu^NV$;U2CXPYn)A}f7L?ijN0ndiv1oq!nM*Z#4QSMS#*W&ZO{r>t;FNOKHRp1+b9h` z3rkf@5W`m*ZUCRh5LORao+-;`7yl3?W(-+ZI`EVLF7l909#!2*;{L z_$NX~?%J;a$2#p!AZcADPDT!1_PQyL2dfwmO%)yp###QDQ~?Wjh|%d`~-fLRQ4pso*ke|7C4P^sDn&>UhE(M62?=f3`4|~OiW09c}qfTvr1!#3teUH zv{Dv7BsS!T46td0)WiaES_1caVoNx}%VVeu42 zlU#zOFB}CP%1DeDgu0r3H^vDOsz4)*e4tp2SC;UsV;m+etxtg72(VcGWOO_}KH_@! zFh`+UMRYPwFby7zc##Z7MKI2=-%=MG*qIm4m<&rBBt?+6%vi-mK2TX2`0Om+CeE=P zE#tJqI*2k1MzqaRYgOCAQAb4XvWzX-=3be%RB*08)rg{Z# zH(d;)`~Aj9VJ1*#fSg8<|DWZW7R2Ja$(4JybZx4>W+I}Tcf$pUkfWh0-R z?MK7jVT+OgTHKWmX2M&?Xgvg*S-5z-SZJGJPCUegiqq61n;#A>9v9dImnYrl8neXq zu&Gx2xWGAtLNH+oZDVn68y{WgqxNI+VDz3VYY|FES(5d$FlmRjjrY;9qf;JR6BcP7 z#m-D}6dRn2*gyZ4$I92B^5wnKaX-dz@hVl=?b4(m7ac7CF(Q-PU2rUQ5^?goyG)xi({hOi^_ zGDq*k5a1`J@8h%neL>JUeQEO2&Xb*u-z4Y!?#`qA@4WNQBkY01aU%xqr!T!!uY`X8 z{r$CLy-G4ZF_^off|Ng^$;jMe^FYUf`>(-BcRH?K!aB!gB+nc1R z+JE?vE8#J4hX#9lKH;4^>Jc^A2mSM(N34W>>~!<3Z{4}`5IfC$>s#NdH2B~v-~Fdt zrR(|D`MbZqd+^?){k0qmsC{mngFSGV@&Fs^?C$RG-)+6|1}4vU-`jcbJumTK zafGTXrr+Nb8TO|4eQwFEUjx z&|TTnIML70$Jn{s#!1&Rz#G-cV(>$P2R@28o&4~JKE8?nLvVc-}V~ZzJ2EoGz%Y8>B;L=%WTq? zg!5_qtGDocZTHrXXoJ1G+)WA_D3z~+y!-CE6XKsddFP$4eeL$`?|dhJ^2VK4U;Qdg zUqXAot+aaGN1wuf^%l>FX$|iD@ckcC6rb);gFH`DYOuFQ4Q}1~>R0QGh6rl>IL_tm zO5@1!)3|?NNMuPN-Tf4NcG^GzULM!BJWZ=1usoEc;dr{FS#7b#4L6hoG>uNSP;h6^ zk%qe%w6gd)x&{j`?(PClDGpqZmElnGEzzY{o$%~@A!2bNu)K*I@Zv^}h!0OE-C~TH zECdUzKQbvBD_|CI?lw`*0uG~{H$`vqdV85@8e7Gfl1Jz<+6OA1r#P=P_cvjuoS1zReR^fP2cJf8bujNTa_Xe6c3!GWeFBLbgPd`o^cTZ9%6oaOF- zCya98jN$U2BtO_=%nm!~p+Kjh8lGh6%qfc>9)Ymj0XkX3ma(veK{S)ZeAJL4hRzjS zEK-yZ$G?m_TB zIk3Q3FxP+*5~gqt1s9rln6{_uP@=#fTO2Xj3>^TKk|yIc@nsd7Xe%M~3wu)A)LYR8 zG$`~ZmKZ`VuH!%uqeoCW=)?2L8QM-q6v4jH7+8RQ2%@Z~KspQ`T0`{nMj`@Eqc9#d z<#V`=tcUJBk`tlDj$>GscSzM@6dEn56KhBGE~=dm9Ng7_fq+?-wIZimSt{;BTtO%9 zv{`R3VNCi6i%a;_0!vK5l`A|v;!gw{lnw}$fi{E>Boxf4Qp-pM@p?EmJ?54mZ`K2k zDS(Itz_O!sC0OS#X7x<;gJ#4H4x1Q;3vd-_06hbfcX?010`OGICR^4v=|wjWK+kgF zS8ap=GaOSAXmFupK#-%fM@R#oIY3g-9>Wp^9+DLUY=@I1hZ%M=K1|SREyg%WcYx$m z^n74LM+bi#lfIOL62gJ?^fbh~yPY=nOKuHZ4%#Lf5)x(P;cSuspR|*_Xd%uWs-Rh6 zu}n)((X)zvB6LWInF4;2iiDa&Bw(V$(RFl!`fd%|1@QyaXw+6ii;4{brbiV7I7=|H z%#i&6jRWxlmC>XZLYMTB(s+DFIyk7X!83{g1)_wK!%I+-gRJx(2Zbr36Xsx88_dDL zbJj!@xigM~kkc_uI=1g(90$RO+r$(p>n<4NrZ8vO)PRuu-B3)S_N{Ky_XV6i;-}) zl#Yj41}TfeBCt#X#>^!>YT3l}O}9v_&mlrWybORZ?jyazqYgaqC`{YrluPquc@VCo z^D(Y6s7td%LX@klqNC*`$iyVt=MZEm9wi8T_GRy5w$t~ze}?{Xhv&{tOE@b0 zYPy&6lj*+(c7Lv5qsy$5$rlXXu7x973PP3xV>qh`#MGrjw|57)m08r1kBZL@(`vx&zl2(n$9TVua&ZWX ze(RtUL|T55Q%IbOST#^5p{v<1<4?dVpcyM4%XpkHz{z|-d{9M`G^zXbAVeyY)*9$c z2UdQ}vOEH<_*3Fq_yVa9ct1hF=k9$+6WJMx;8|y^(N$)Ho>Hx4cX_$wT0WDl&=g;ADgafDny`Ff&*p$L7+b zJ}?A|Vx(CNwI0l?j;rlb;!f!^Q*#54{JX5$R1D2@^!2(E;DeBdA%6DMU81lqGNQ^^7S z(aObi9)kk;xc8BX(wYnbuiixGn0y;!rlv@Ou#FXuInH2C_bOz0E(j&{%&7<*I(yb= zIsae?AnZ^fiq}<7V#~#~R#}N7V2FQeu**{7p$3d)Exth|CWbj}i`*x@et(4CB@{YB zTmwbka{v=tI@7?JShNPza}HnQP}n#W17vJ^jLAtn1OOFrg+>!VhjRcfzWhqn3}8Gt z3LzRZaasA;?exd`M4l^(n!#IaFYXOTY}kurLhIOxg!+JF*%B zx}n0RuI+KZ)c6QUkfoaFKNZ-;sendnL+&jbH#tU!nbMfM1DyxCrszbS8Aei!nPfTQ z`EZ2#jXVXXB}aDA2*YZ&2)t?|C{KTS|47=}eEL8Cn5&$}-Y3hONs`$GqqZJ~|%RUp;}7Ew;#n!NSkz4!jXKX_}>z47}$litRQw;Rs} zt}fs116goA%~a0!)EeBqOAY?1-CG?-5E^s(Is^K+|sV|JHs%z9t_H)FgP z`z5?LtHM0^lDs#oo=MeK_H*JjoyQbB1WX|iu{b7^pRR_Fv-Iu87ir*g_=9J$Nd3Zr zbMy-{`4}&fx7rJ7TSYF_z?J?IY|t!@mI(Wg6*PhhcPfHz(s9S)J!2$y6+Sg*BZAui z7c1SlcGzHS1S7{z%!*n-B@qJWRj#Q*Qvt_~zQ=jMo+mNVo;Q8t_WhKalt$YmHTrCa z(Ad?P#q$InEQ3bB*(%E+27f&pxN^y`A=Kb0>sgG=xWUnYtP!3H=8;6>5@|RI7-A(Z z;(d*L`BOLor7gld_~Rod;7hO^7zZvQeMyGPc*#Kp1P84QHqEd?Los1oNYzJ~C}X&D$o-64Yga zzB7}-uzcoV5LU6q(+&oROS=*LTnPzJHyY*#AygXF&=`Yd?UQ2+38|@rlNer#R6Df0F91VWE2eJw-hSo zq6CbAnHyX%u-K1Zsp1KXwZSMe*63o)A8?3)6lUCM6#-r%;#ZSP2##1n%!D1A6Fz?U z|Ji&0Sjm#>zOU}>+q2!{S-x&z3=s(}RSSz`5Gc?~WID9)tf{;5uKI2qDmclI%c~ zO(#OaXD*kbm$TdXd{5omzutTEW|pF)SUlbLR@FJDs!sj5_tvSOE0EG06TpS*DnUmW$9}2NQJuJ-={(y4U z4PJA0kNSBP4W%147BR;dSyROokNeZn(a{J>?HDNcSOOG<>MBg0iNN4q%%kg|;F2s! zroI(+Jr0K~y95)&xL^;XF$r5iWNpE)bPQaD>ezf5Ny{gSF7u{&307IJ(1uJWbNtO! z6^}CoH>D_YT!+%V8Nob6wMLy|^5sIMz>9#)W#ZY1JESNAKHRu=xvR3{azg^pSw;sy z9o*q$EdlJsfUT|Sx}VPqmk0L7qC<=DUGg9i+C%Z?IRR!RGvduW?qrI9P$fd$!!qwK z^f)6%9sKP0C_5BK1BuV**+%9>vXP7Qat&mSF_6ceLg1Ak3L6xFmKiH*0Go%zg>$|> z(w@{jCPUVD^FkjpCwF|LVu%F8THHllF*jEp4f;&1?hdIn?oe}fTQscv3@Tahtd-Q0 z&bZqdv1VF@Cn`d8R4$8t(J3_}_mFM-Vo^}RYWRd19@azY`yti@<0f$&-0>urZ$Zf% zLGyWZ9J+3-zzq2M1ZKF)e&TB9>N+pSbf&pOl^J=Nn0dmPVs-p{fIPpg&O`q{PR8MjeMB|t1!&+#p`9MdAbC+x4(bu7DAIH=SaYu-7N`T zY<6sZ@yGW5mpxxqFNSC8ze12&$J!gz>;V0dYwj=AoiBBM-{(6&C-?6)x0(N-w#co% zGd5v!aWxBx>eXWouepsQ-4b6jXLkdS+?waP1`a>EpUUB#RYps@vwUKH^#0A8H#PJ2 zop-dEm}Y@iuf6)J%uO9otFm8zy?)e&tC`iB%llgQ_1E8i`^IWEx#+5aEuTzDAoCwQ zxJZKi{d?v0>+BUpP27|~^-w+ql3+aEmOyiPU+Z4KURB!?i2wiiyMOn;l-a=Dg9qAo z{GHcYgiKAawUjR3c}ID0@80#-6ZRC0DD|T;m;^U(e)0M{@9f`f-L221)~z3$p6RvN zlpq9W5>!{um%!~^y{bI8aYGVN_t+i!>eXEdI-M_)OWP8NPZBWQekB1dWqywXe-Tkt z#j4AN92fa~9G>RZQ^6DQ`=<)>*PS^&L5S(WON^JL=`#9RJxTA`O}IRS4eoJce=1KK z{$<@v-VSNoS#LX=kL(We{W#;w)0q#%iqcqEDE#)1HAI1L~YHB#J-Gvk-y9ER$)R@ zaWF4}mhU3^w}fw-Nv(NNV3*O)_*=F7&QLZG>b>~w4jb9=eywV?{N}e@nit^vO~iNn zy}ul|?8yx8FWBF%zN9duadhQ?hOO5ie4@A5?G7EyWVY|gMu*@w$Ju_Rr=_o@c>>#I zb>o~MM(5!ERYjq14mQ*F8=7`T+!~M!x=OCiS@#Y3TQP=hv-FZcdU?2n<6klI?qk;^ zuPu}nxkbFM;CIxoof?y+0Tywn=ZaJ--9L5jhZ3B>l$xO=!!sMZNV#`i)5X zcjEX?4tysEzLNvr$${UhInee%wdQZMoc1*gm-keCTjiQJp||GwkHbXLQ@{HTFEbQMK+K`FvvCx*JYOY}%S; z+qh|%ERoaPKfl43t@yxhguaSt)pB;ooPH}WvOKy~%?x<9-_-Vh ziw=|RYCC>{Af0AE59Z^Vm|bmlEl_lVs)E~dIiFWfCLos7VZ#(xe)4MIn=%}!tOeo} zeQvIlM;t#8m>uo$8(F=8*Ba`eJ0>2_B6?@D1aoieq!e^M&!=7i;3#rgwjd&veg@eV zsd22RxT9TTnHl&3%!VH@(48>sZ6T}K&7vE0d>PpG5VcvA!WHP0VV#3FT4AtA>e8No zlm}e`I`$LhqZcy{N%9qu4VZfD+=R=I*xkVAUYlOAsyp&?Q(I=AYr=5g+5v(~7-e|2 zLo{dPP8jA}_KM8(nV(V*%1PE?Yrz3wkm=5|RRrOY{z&v81c|Q%SOBrWJST>uBR4;u za&TQ%ZZuG|jHj=Lwlahwd}#KjnQsE*XJq=Dc1MRNpOhphvcx!&!vK7q~GI%SMUL)Zcr zlPkm?*@1e*TyfT^u!5U2)nYv4^$|tef&r7_=WNhT)#!F(8MlZy6r9#M7$F!nU?-Xm zD;7LENe4X(OsS9EIEr&=uN~cvMRJ{#_7#6D; zLc44PuegXG-~h4Fywd5V+Yo1y$$T7-<1ueFs=_uE*AYJsJu5kXE2a$##YBmR4u;kz z9CvZDJ|PN!Xm?on959)GP_nT@VDm$klho`gKyr6u7>x&uLC(5`BdY|%T{@{zXj=WE zDhaUO!EyVO+R}jSX{a--3rCZur3c3N_VX&PFoDe;!=hzy93aKj{2h z7p%E{z!2%$-~Rq7=XI?S-#5JZyQ=D!fBCr&E`O=&{_>aIU3YNhist)o!|CbWyN|AY z{p;J<O^^iL?w7y({3{P$d7K2=rTfvfD_1uC{uZ$x z6d&pLuk@GN&;0`U_{YD=k{3?svV9BO0XtjUP7<1fe|q}no7b|4;61dsOX zeVfmJo&+p9`NStS*P$o`;6?X)`TY0X9ad00n^0T#wBn-2ZUi6DxnR6(U-Y)`dD_+d zyZ$F$+q|Ry(rVuVTF)P`$9lb=x;>Sxzpc=5+*_9JesB4%@H*Ffmu~L5#qPHj%xl+J zx^Vx-jR!j6;=zM6KHvPpn_plR&8c=nKUm(Uv_AA9@@%!ZW)&Ou`jUV!%)G z*Q2$eUkg&7Hh9}iY{|HZgb$DdcuFNt_3?s|^B&FO5s@Bq)5?j8+ z810A3f(u=u0@I64EfEL#-_ycfSC}h30op`!YVOeFMUj&zgP3^>x^O-rF1{N>>9w-8 zMD_q@IWDPYVO&M!d@_3;ERJ5Ud#hbC!vNE^)ihMRn|HACWGiE<)z>1+StqbCvH?s*CPoH0Fy>BVA8}>zyo=UDOrgJe0Iv9x8?Wl<(c8R+C@1A=%A z1UhK40V)SaQ_a{u39)Ooxa(ED@xo;lb%4e3+S-1MnbV~(&KI*{Lgxm%6Xa}*FFkHf zuTu{}V(xTLB5~xG+(5AVMYo8b#KCg^X_u~-NC<(eSPXlF(09kNIvSELG{7<1UR+cY zwD!YcJsI_mEWT)o?X$5;+Ohy|go0G)YeaAv#2$w|C8nZgKLV_zCsM_GVL0#g21k?r z5beCzKkme0GOk?R*M0?qqsTFG<8iNd*c)`E-jkWyRe}+^Jl?!8tTPaxV-EQjwy9c ztICc$JO%~*dEke>51r`9If?<(Y~1*hr-f6u+F8xk7`d&F&NwDs&k10`1@Ly3AAJY( zF}Pu8PR4U|+Tjd$FHAT~ZQ-V@{6E62*Z7!iFNRGmU`9{009+#uj>iDCXOzf`BgBnG z5p$xa9KOPt2i8!MecZbJdSATi{p8(a$y$Pe*cKxhDi7B3He=TWT)~n8}tJF zH9LFAybNldZtqkL=&z~Vl-&lf`$CU(hOKhPW6Bn&k9rpJ;z;`+P)nvA-lu5q!=5&T z7xTks#0WGd?lC0yP`HcW4?|D@R?}-;E;?h=LM$J!&4U1+qGY_ zYJ2Yn%ZM$6$K2RuZJExMUfy#bKe%!I#-IMvckYbuk8f!9^Xsp3_P6x7(-fjR*uQ2m z+^?<@1B!tAd>bR?#&5q?q)#G&PV=VJi3I`N^7V3j?_R(EtIP7b_CPQRr2Zp;LTn^B zbx42TA=KcD{bq-V7<9wy=p8GMf;{NTW>qz&w1g>9Sel4wp@7{X*R`=HO^z-h~ z{x$YHOt81t;UK9WV*`L6BszuuaqRnOcKhHJqhe8vl0eW(Ap4U^@V(cQ1Xru&>DB6; z%6_hG1z_v7W0Ksh|pQyd>p+7s0a6M-hA|k zh5i6%h&_^y?AQb2?d9922i3uA%Y!dcH}>B;xV^W$kFI=k|K|R|{R4U$PEQX`*{kBQ zkixx)<$MW}j(l*?-Rn9@@PPd(8VT6QP7Q1lVM@*pNV7H56<-xm>s;a%Qk;>-ukKZ%WLpep z9KkT+SEFVHJ84xQ7SI}Btaw`*BO1cd%(X^2Ch8B(4sk}Z=A;-i4AuHe=H?SlLmCiX zf=scg-6$K{F`L*=3%P|!mqNxCv=x}>=|Cc=p%UavQnbU#wXSmDwrxsxXzxI1U?CYFH439C+=irmmmsWp~{@Kl3`zibVU)`M6CNW z5)UO0LkdM=j4HX>7`wD{6WzJ?@uQsQj@`M~`OQkAQ~R146;$>GA`hw5cARr?Fi~7% zW6Rx`_HL4X_y`RYuly@$sw$7b9BF zj+4SrmTGdU9&=0SLAhZh6{UBBKHH>g5KUvP;&9X9qRueWNnlyl!M+NC*g`!wIw2VU zan0#krOt%n{8dg0n;&sf*ilIpiw^h3IbX9Cy|Y6na~7rREav4f4jK0D#DPwhim}&= z-p(m(>BLi3$D_zB0nrI@)b9|HHo_wjWr_Mw_R8U+z|G!#>7+1-8}xyFq(S0nbsGBixgk+~17CsvX2^_M)B3p#vxDNPN_MrO?*YsIKpKa2q zM=OqOkR5q^bo`2ATDZ=N?()nlhHl={vuUuG0nvTy=X|~I5XMUVZ+G}s&-wbTa8lT1 zCxKmdl9+Q|)qo8!?LKsE{~4b-pJ<}UZZ~aH& z(@$T)0Fqv-Tp+Uk^~{U%~6=EQ}gd*dp=t%bj^7^RDF)>M?NU6JI@s zc}0q@La<6Xr(QcHpPwMwEV?mz#dyl*zE%!uC8eKD;&bDbYv!i-X{iiOkYF`|g_Ga* zR}^Y8CQRNRGxw+{G_KGMEk~wuahhINm~U?KO_QyY%bsAA(-I5PU=k$XsxJby;^Zq` z!U*5Xg6?Xyy28^#TDa+`h@{zh&%Jj2Il%%$X5#3GST{NJ`V5;$A{exiZiZhWaSMsA zJg8P}W+L?!8k=+`@`i2Cx}(~W$Z!WdU`-$T2VOMb`VZXih#5l}w^Gd$L4Sujf2t$R!^ z)r1CU{#GQt3QERc-IyiaxI5BhhaS6!tPOLcn`$6NdEBMsRGNW{XS`Br8~F6Z2NSH6 z+!sR9T$K%)14)!qFWzo%9{kAly&ErZ<}{nV>kf`j-1yiM}Y)zEiOB`Cpm`x-sS{4_5rOH471Y*tKO!a2#O=QG=mly`e6iV3yz5C@SK^HmFqhO?l$=6&J*A`LU3_J z1NoR&^N@3V2M9##b=V)XMI)Pt`{ZVhD9v01u7W#JsRb@H7VcZnL-FrB(y{}c84m^{ z$ZK?k_xZG*R}?fa2p;*#Y?Lkd^x9}2qiSOpC_HngQ9c)XH64*zcO2Xhe-w^#Ya2qH z^%kMZx3LJEyK362R&OFOys4|X1`Fv_>rJbgX&21>UN9yY=6MdDF1KKAgy`U|<)$_i zGjxSx*CiJi8{LhG+$2jGPTK)EM~vi><1LV%_NUTfV_0|Gn={Htz6U;We)(l7CnAgo2e3|!3UUQWE3W$b4H7P{Be#AM<$Kzp_ z@kGnP2}8l;F{6CZvKmfr!UW2mYcZ*KGn~n6O;Z>|bx z5@=viaGnH4_|3UpTfVh-x_A0lmYVN+7BnmN!GkY6*rgmW)pq~%lV4xsUwY}{ zgZ!%>c<=7PU3OmIOJlir8EUj`%dd5;7&hIEi8@IDT>FXhB}g+h2kVF$+X02T?>@Ov z5ANKN1TIP7nn~Py#Az{N?wJJJZno)mFFN~1(qHu~zq2s%zvEnd>38{G^dE3PN*nma zt9zQo%Xnk|TDBfnT#anD> z1iTDr=;X3vH~eY^X1_dWxSyD@x>@i6bc^wu6b#Jk(4Z|~B7;0JEp*u}}c2lrL? z!)L-<^D?^Us{PkiGOAjz75_@2mh;|Tx%cSRM;6kxy-&Z^;#>2DTQ_f>zV+3ww(f0n zJ;s;t2M6o9w>OtRFL=#(A?Z>uWGV0ru+1nEPvtF{=R!KKKG?~ zaQgbrT;2oDI&5S7@N(Z>`~HuuBzWW68`sX0K#fXI^A~?T^tKMp_Uq8gK+@{yKzDrZ z`FwUQc(1$Ww$adXOs^XIjKwW#`sJcv<3koX3)U6B@ZNB0nvR^G4+k@0dNZaijp46c zY<`4CqbVA9dm|jc!!I+!UCFWoBU%>cH873Mp0knb;!rBwh*oEYL+wWck0qfRL_$B^ zU5QwOUL6QDEx<-a+5osLHukA2>Y`xAV(neekCBa1E~be}YjH+7$dz70a3gWj)eEJi zfmUb1t0Nq~efo~e59!M@*Uvq8pj1Bq;T74yn@z<*A9h5wMypXw3SU3j3>0Kz@4_ue zci9q8!zo0eo9?oRkGW5B1y>ZssEA&EMm3E`qN}Fj8Tp<^4rJ80b{lgmMN<(~HJuA~ z=VqD)yeVJOy`e?r);Ly1R4Cq6wP@6;SVdBbox#6jHy9&jP|M0j_=1>N1xVluLJ6Q9 z#_gCN-5ScEMI1|#&m_XJ->rLmaVR8g9*y>jY%C7~2_ z|I^o<1n|Mr0`}-Fv5`pCJpmXXPR*FQ98*^U!@@ar(+)EL4XHtY7tt6Z4;&HrP&%vzdWy!)4Q5G{5UTWf>;A4_SX*fzzRGL)_!YJ868;~2yv5}`=3W&N1IGo85tw1kT ziQn}jITsvY;$)LgF1;6dCMupqqcg_i0&hgkY=%phz+2#?U}cwW10s=A;gllF506Ec zWgzuTuke{Tys)X56P0|)CV3oAGX__La%E_R&((Y;Hnll%>{BVz3AF+#MT&^GCmwHzZS=v0$s?3vhdSe8=h4?N| zDQhc9Q+QninZ;kX&P{3XlDSz{bCKDM>APN^HLkf;4kcSzgi=>e7p^9F-h!GoO_u;M z(%a=Sj|lJ>SgNL>rUodexH7N*e!RV37{Y(3IlDuwx@8~glxHA7j;k)rNtBS zV3>vD!YzCXxa@8Q9)k)Xg3@K6zDIl3TSPt>=2pt83eoZL?G>Yhk>?}UOLqq2{*Xm2 z3A{q+bR*o*nWT-Fb5`vt*S$lI24a8_h&lYpnkZW$I(%tb4yThTkL?xHJ09|}?G;f( zpv%}d6|=-@bm!BmTIjsAcqE3${Ug`Sv$3A5EEA5*RJQvNa&+wh&Q^XAcc4mMHn0m} zw4}Ni_4p!yKd@#`dhbC z->+-5MHG2hPMI-#2L8w&aqee6-bnC+XUI>0ST29+)=%xU;~Q^R4_XPN$m_Qu0c%ws zaMsb!IQJL+0y+_t1C|v(L4-Rj?|y?*oWA?!N>|z>@7>&cLGy5x1=6Q~Q05Bu_C8OF z@00qU{7JG0`}>pN*`6d|o#%Ogt|tlFpCstsx$1b(s^97UEp(>u(wtpPG+r~ut5DF0 zucURY4eCW|xz+PlSH|pjGgmog@jA5d*3J6Yo?^h<>s~XRI?WFLQqryeb@~qe$v^oS z^8V>Sn(@J4`OUSjoBP|CkA3XmV4H&?-6&Osuz%|&Gn?O^1k#M%;K7CjAO7$*=7n3# zQr+U%mOvrwyPL1kfwQ-Kr{&3PNF0*wAe9Z^3;2SlV1y@83O3x}@ znb8_vy!dkwdA)mH)0+0i&+0mD96M!Otpzwjpb?Ur2)vc~KERhQ-9hO4AtFgNY(hYB=c zp~w<-1DX(%gL~5o!{!?vzoN;)V`g9iI40HLl6@D*I{__OSC~!ea8CRUL8Js?vDS@Y zS_Wa$DS(*PpN_WB1f(X9Yu-$V8 zy>X$zU?~%wFlB{O`j&f4Db#r;+a~mrgS>1KM?t{KubF!(deQozhb9~8gPeiMv=Oal z@-`4PjjkWN5mL0qA`K-;4|I};J}t1awB|-Id~+lJq5?#k()AQ#kjK*T{;OO?L5`6~ z=|oPin^}>|^RpTXawVtK^cn8T1)%}-YMzu4QPBQ{uZ{{M@SDOVy8Nj6stAgx98eq; zeI&9J%xUlT`mujFVT`A!XaV{0c*1bdA|89ibp|Bs7EoHuu102huA-CNH2ufATScYS z*>kZbW_-pXGQPv3+60XVwTG6YOrc$BbXNJ*4S|62K(c^Nfp$ldXlZiZbm$QkLK6u& zAv=(Dm2SyUVLF%%yzUgd>NI7buAE*jj+(0?uG)(mQ^eA;gmITT(Gf>{PX>9*mSo1& zym$=n6@Epkr*76iL{peC&}h*jn#2>-Tq-tSC{>1IrbOypAbo<`I^DvkCRa!WIt;&* z*-(?L6skRZ6#-7=2?%xXk&1Z8J)aHh>8w|3G+8khPWZel9-&V5P;+RZXDAMjtSUWGm&A)!7B#ww;>#63Zc{Ql;ow& z+2t;Jl&U;}-|&Y?v+htxyY!eis!kAR;=orEf@T4WgL(7>dp3r0ambEQl-cBXIG@G1 zn3PN&pQ$=_a8bUMD|6L^abA~IL!Y#CSmu(K*Ca^_)xtL%b;D7EU%0Y!NDPxujk^t< z3eiyvRjdv*cR0ACNpN-9tA~>;V^wfao-v!Yr}YI{R=PYe#$9*o5%m6=o)>}gc6wt^ zCe+;NVuz!yx)b%T1UH(5Y*AK5FBQVVV({I=F|PpAn*Z?g)9-Q*9dmYPjr)}y6TWll zy!9H+U5+-S*4&Mu#ZyYZH9+r-$H8Uv=3DcaATA5R-+7E@NSDzs=eRtCMgp~PHeuII z6P2#rDW6ribaet%O}`e@i1qvg@bRhEhpK7X^1+mA#vlMZ>T(v#(?Xs+Shm)P(YOuU zh6nxv$O~R-9%4kla9JE(!1q{m_E_o$F_JaWsoiUBUnryIw`TGyt2IzNa*|U!cUP#n zqU;kCg>zMM73=iVE=pwXtqn#Bm6Y0#6@esQjS}JIqA`FH!mSP3UWUTLV zrA8MbPrHOOLf7 z)&@4~b}@Ny>c1uj5TXH}%xF@JKXRcAXM8BQw!xd|YGEbHnvSflt@pAgXas7Vm~94o z>=~bA`9cLdtjOE}2@waX4aHOpRGVXwP`th}n zzFUmuql^`S9{&~uBYTWG^282i+~r+kX(BRE!6G~?1r4(7Bs+mNLa>p7_qshXMA8=V zUivtW1n%(})3cPq$iNhxg8K?ey$JwsnBamBUWL*^Y%Nb3&8_D? zH-AMn=R+|Z)EZ-(4+bo(%h`qm*-{2e1SLNe)HZOA|c0TXe70K7@#lvbsi4A@I{GAu+xAhg(`*UQ5p^|EVw8bd%*Mc<9GJ`wan zo=rRXoPx+0Njr9mTN&(fUbNHcU_Qk*WuM{RJa>nkWA(+MdGJUdi;pz2f5F)BX^j0)Lk*N&`}wz9u!&F ztPFteDj(9kB67J0u2 z!~P&LW3`JAEy&}O*M$7|xIAJ`^-&yRvaK$KPq`LEODB^>PsNfs86NXZ<=vkbO~vz6 ziH^Eu2V`Vuq`UoE9|4Y_Vx1j{ucx7Eb@uvHTU;VpF91;Cy?OzKl%Kc z<6_&V+y^fv{+6R096bB(v+wqoZh7aWo6p?*-nD?Ad*j#GjOXsn{Js3WD}U83@4j*O z%X_`$duxu1ZAGyxE~ai%4i1X16<>2-cgs(FqVr5=LxRHn?tSO(?lVVv`P|=s?(g5d zcK12gJAEPvwuZj8BRuPRk;h+8(%Q85oMCKq4@zqqXFIwF{+VX<&t}lBf_~Bcd+v9w zT$ftf(LIf*?q7dvX=8PmXFZDJpr>&_?V#)&h4(D`n$4%gE-V3Ob)y>Ij+!9}~+o(9(|AE5aj$opJv?f9+SD{OtH-hl9>-1u z=VCzWZErB;Yg^>9dUNZhNYYK8DLEPlxLXL$McKtH|7unK#zRC16L%+SrO!9G^-4wQ zxcY6wW|nDKbGl7#8bv~`V@d_9@{xA8*;wE5Y#EEc;PgwSqv$rHlm~N16AUj~0w#wy zqZBXc8sSQ^Fm3=?3)-`Bo&^-Dk&x#>I1dSKO7bySJ*Oe6sv;qxIDk2jfw;{^!JNMlZ z*dd>FPMwQf2_i(aPL5nl0F z<9-cC$U}eLo3WJgNL?&3t0=bU47zqND1V<2PjXL%Hifl`^W0LD&{VXM8npAWCW1Nz zj>1hg#Ad!?>2hC^e}wTqM*G@ysF8jK;(AYG6EwCQ87m*Mh~{xW^ABFF^wykyG!8@(Jmc*2|T0G zqu&qRI6RXjwU-lRI~PoI=&r&!kyEpKJVvXE8uyB709itcc#on58z zWz(}EJQ=2@Cg(+ca+W)<-5h1r>R?MHnv7-C6}>wge3F&N)0$RnMo$B`_Y1X~#KWc` zvlT`(*Ksni7v25{-Fj#UI=^^JR7V~9T~O{j-HmA~@IDR1I;v`&2g6u8h%I!FhXn%A z$3XO;7tY%-WN<96PIIkW)~7Nc3^$qt@U-7)!U07`M>`2wR>e-Ui~3{=Sbjg_I{puf`jix0{1OT5UXZ=W1 zd35a@3D8^KWTN7){qD~d?CQEXIrnTJPlCDQuDCPlY&>qg>)V;KE1f#yi_8lX*%@AOxc_J z-L53~${+Z2QN7K!%-;gA>JyFhGLUw?|JHiu?7i}hH*`wSd!J?!@zxC5%R+j;bZOW7 zZ{1k+Fx)FyQH=zDtU!V&7(qI=%+m7+cTO7Kv!A5zjX-V$k3%r6;%U4W&qSO#>A!VUyj;B&1Z(5H;GA z@o!Ppk0Bfo?9Oe92YuJo36r=3aviQ*W^vBvzOg;dnC}u#vSwtC2D-7>ZVSGN;JOxH#>*8o5gmqY{^J~-n zB=*R1G99gGL6Y}g53U~H2}s$cBu>DzDKV-IojytMXL<59s!4`QKh=OD$Tq2|li8>q z6eR-Xo@{W8cxeVRTKmYM*Y- zeN`WjJ4M;VaMs(lF6>$7Cl5t2RrLcZX5{gXAWBVP@TH2R@a}y<-MnvPrn*oQ&R{m9 zSizvRVKU>O)*?#kp37^V-!OG-ki%w0vpm$u6C7Lb9<#1bwx@*X^dm>@F3-3aX_b1$ zJ#ruFhC7}Nz)ZMA;ardt);}`m7PlZy=<+bzQ{M0tEfj(`lj!5rP@{xVuu$^YIc5|V zSHg2B3~Ro5p+;6?L^=~_45O^)T>}SW@R)gn zPfP!WSJv0_UZ(0*A3tUE4$lnmGvGdOfxv70hXSoIH=AM9Cgv=fUY-ZU5}raAJ(QeM zw7|tEK5lI`mzLg$BiczaV;%mqJ+xt&Er{Ngvfc%BC4S{p$2)tPVl z0I*TEJd6#dW;zf>MfPi%uNOX>&gef_R9QgQIty7SQV6O!?+02%r#08wc#CPwhiBcT zMYv0U8YzC3&4xDjp3;6#9PjdZ&OkY3WhEovI&4O3SRb&sPIdV1a1*IjdEU3NGht@az!E+yEIp?XlQ*pqj^v$X6qQ{Jt*<*ghzop3|J7L!+bJb!vUC&Ig)vcJ{7avo*UL=k08`$DEo2 z-O}>wf8$M{k?*zUtP^uMljy!4j23i?QEUJ9nA;M({dTv@vvB*{6W95nZcFgO$NuQ8 z-8@jm{dU5+5^P1dDM1!lJJ>B^CXUGKya8U|KyAN-;uXJws%@V;<1^nyoW_C>jtHml zgr%0yp+C%H9`vi7z9O??6rJ26H|*d)tdWsyE>qA-G2 zdp+}+Z#a8C;-f&&=nTf(Z9APb-b0&0x+fedO=@GLACm!@frnl5e*N69=*)pr%H*~y zjFgMaUH4#Up3+`NpDmcB?5AW{uVx}UIvXJ=3@+LFn1{yCtuwU#lD|XTE zQrl7*#7zQw((N0V;d!8Fs7l(LnplCAfDKnNRy4mx_xQ>ZcyF3e@>p`AwT2Fx5h=Vt zhFboK*lph=jYObaL`{*vwUG0X2#hm#!O+QLkW#iHjf_%Z_nO6f0D+fr%XsvOVgM z4MZP{NNvI-DuvzAbn6xxhZSKNqqLemDqo$~q*K5N-}i5_h`GwgJ7tc0CZuwDF)5 zYZv4{@n?0R(w$YRXIcN)0#@K$;5Wbzx@=L{>UdIpmhwL^!M6^M-OrF+KEZi}Uz7EnE#Z){&JOoK^%~?SA z)-0byuwq(k@slCl8v*y$tExP%`oVdX*2H{ut{Xu(a1t?k>{ALuHBl>bnNlP!;*~-{(Qr+HWk8E_xwt$f7rxkA>VRt z<=&B^mfMbd-DyLQ#}6Lt@VW4^7ifP*XemU zGn1m_yWG@?viI+wZq;T^RlToq=Xc&|_D>qLo4u{WYb9W2_qQm4PLw?>fkT38*REbo z5>Rh=D7QfpxPu!v*fotOM?F;E3g|@HUH`Y)82h!?u07htx9(N~bAP)ea8-4&1YVyq zA4~x6a5W%JMy+UJrd%_9Dgb*Q2R>ctYa1Bpj=~+$GzyqCKIG211m5o4B8>)@8HO+R z8V>=q2%9iB5Aq}|fq9wsIg2%J?K7PO%iuA*apVK>nXhQJjhjT>*j;mja;|j>R@atj zWW#yjqqEevH1ng=7!r&cGdID?hP7ik__YQ}kyINNBA%G+&r)<=rfV zz}SxDvk9;P+fdx5k~SaZn#2rLl&eI|oMcmBX?rDQv+gTU!AN^dkU6!*YaF?Jw7i}$ z0`H{M>I;N`fGG+^h+ARG2SZ>%hOlglWmY2I0!W+SiN>!G-VO$pGw$%Ao09%*Fu8NP zi$I@0kY@8%M4oEhI=xLM&A_Ck4WXgUhu!4>&@T9r-m(Tku~VlYT?wsVdf2}EftlgUvTuWn-n3|KCAT{ZUL zI`m)#@UhmU+2|_Ih)DXudORj6Ls!Kl0x2pKf|4D$MKUJJv4)D(XX$nI)-9e5PbyKu;_J@b+S=v zKDNATQ@t@jtn99vU>Z|+SR=pDbX0Tj7|{uMkF-!lY;jh%ktsJ_N{wx~PT;7z!m2p+ zEV7X=)k*xT63TGkr-Uy7`>2va@tovr!_XbE(4NV;OMjq&5p&(FTi*@Wx z0I@MQ4Aoiv3_SNTS@mWZ%S{fn5{)V3TpWYi6%(G@x~|!lCk*J3AM~qHuRjdXU8V=v zPn*2fl3==6G))3!w}}Y>Yr>sZoU0Q!q_v_SjuXAC+UuMh2HYe;r7jb+qQZr-%kV4j zh&v5TNj^danT5G&ZwO=*i@xS<0)NrT{H(9lw+V(tXGD5duZKx=u>`>+-wFHc6fSn` z-N8IxDE2cqT23T{7~PPBDKmy)sCmlqh+Tg2I*#=y%Y$m6?&4=(UxxpB-NB(%;Jyg_ zxkN}doLD1;-$ls96xUo86F^b}^Cw%>71ie%C;=9yyMnFNHB))WR$rQiG8-+RNe1rJ z2Ipn4T3#oZ>Tw6H>Smg+2}KFI3W{>C%Er~A3!mzuK%I^Ws$`I(=%}(=mElNNv|zb2 zc2GW^;jzQEM=eaztf#!*3nqS3i4SK+7$Xuxp=mXHi=hXAeUaz}8x+|>qUvRmTdf>q zfyoSmLC6g~vytr#yHWckYZZ#Xl8yO%wm`fI-fC!~Qw6FS1Ml^qpH;I#ol>QI4E-=X zhPQ^ADO|iApLZHEcE^2$&6*hON`VBLBtxngjIS~j@j{IdUPyJc0NB+2377T z9O6Gvg54;O&PNt+PbaL9$A2S*!ok%5{>{Dc)Pfiq5~#K!4p!0U(zdBFtWKb?NXViy zjlL%DTV~KV@4I5Xe|mJONvUbBz@{t ziS(LRJ<&VMVJm`g*)drROf%0acfJAL5dj`)4}vbNE2!zCAIvD#W2Y51D=5b+P1kUc z9?CLp%*L%9sSGdk8Ey$0+r!40C>A0zQZCR(4NXSt)6DOrLmc@ls<#1``Ksj zT=|#FkGq#%+P`*i?U#P(=YL)V77;&?d6$EC9{jv?>g53%&IT+Q-`4p|Z!SH=pS>#* zI}NWw#_uPSjt(JPzP$IJyztB75pbxI@yjj==KcB4x{qIZsqQRq{?eOC0)(`%4i3<& zd*YM?%!rrOpp_tLvkbZeoz6OKI0xuZ#w!VuyI z_Ms1NniyUwZi`enN8Yy|nj|%)2jX%-L*MbmUPB&wuLqPmwdrKlP`IZ?00F zFW+tHl#%<=g9i`ZefD2uAN}Z?AANQ2-~LZq8aZZ}BMBaK>dt3BJ03q;A^_J*FC__< zdv99I2R9!lf%Z&RXe$Y@wz0^&=UVP9_dfdOn{PU|pGYsdf46=%l`LD8UvXb@&(!^& z=P6P0nkQ`-k0MG4qOh*17ni z-vgh4e|GgQN;2rqL$`*5WvVdr;#mDZ_-_-fs3to$z*G8}5)5NSe0 zl3>|Luv~6P&^;hCuU&0}SYBThREsk6fu7|j0+n>egSUM9ozv6nr?2ZYr2F?%F5W*# zk1La7R?*zMce8W*_PSq5-EHTAB(P`yJmMCP%^BqG>~*g?NuU#<*t^=Y3ki&OQ-ZR* z*e@9C0NOHz$~ye#Xo}`-!X9w0LS`D?IyJN!CH~;V*N zve^i>x%z0P9<7BA1>6NQBQeO0wv8h{v_NRw>fEK0pGL!|orK12<9SKO(@wI&>}15j zxRW%ZB!OgT(}cB+-mL9y7HL;ltaw+veu`P7G;Q8n50(x&P&KS0BbYoa6WEoYdKVnVNg+rwIV%{3%` zf)q^2JJ~8ZxT_Xa4ZZLZyQ_F~5j|sK-~{G76%E_KDe6K8a79_^@$toIit6d3=P4a@ z@i3%nc~!|I_HI2;nCC%~k~SB@43MCe+jysFVR{AupOKeSB1(Fx@51T9m-R?St!T@D z|1s@$3)CclR=bMeS1?j8Y{N{>euV;O>5fUJhNqrJ*%;CDXwKMNBuqb@VaBGe#;Nd! zy5&a&OLoJo!mj!lxGPk`^i8hfZo%~NOfKkIB$`Ma9u~gzz9xh*d(KrPc-r-4<$wygB^KJSx17M%rmiwN6C(ULXAX-WQ?f8o z03MNxD67&v@KZPUgWIDp7H*q_52IljYR9Y@i+U z2P%m|^KI$zQrr>u6F?!Js0`MK z>q%_nITRV+#^gFj{X)$zs{ulu?GhAr4bY=p=~iGVWUV7pT9}4i9OY$xl#im6tFENz zkGjJJPLFJeLWu;I2uSNPS0WfRb<_@M;)N(dGfwk=YOTgwj z@0KWYRRc$0*^I799y(-4fc$7)sXv{1G+WSlPOng>hKYR#@`~qTHtVvXF~QQ$pv>qM z{b@PRs412wijTma5KxenYh_~BheE}8LI^RZOvgiJ54lL0M^_A|j9DWe+k$t8bf#G$ zw8 zVn|>R^N6`P4)Ku3DSflj!>ES9MWBbZ7phINPy)3Aa(A>CoOnK*Xctv)&b)`?1*KF` z78!ivq?iPiE7%c&eu3kDQC3Gy_D>U0ZJ#HAXA+O;-ezrWn9q;EY`Vp;;WmC}AzV%P zpZU@c{!?K)o$vXN6ZQPN-+#2zsuf>5B7XaiGg1qkskqYAP*+g=uxr#>d^FlmWeUFW z?l;~Q*E{c|G089d!rTA5@ZbINH-B2@g|PqV%>HA8!56;J@aM#GpR-blQEhw9jU`4V zXs;w#_c5Hl{m$~$>ebiUG0Fez&wS;_70UN~_SgRAg|S0;_{$H!TGx7*66`H+qXT@E znD_Q>-$oTi7DlK~PydCh&HeND7?wsqNNUK^FJEW|Ip2Hl_x--*^22W{AHMj-o1Gu~ z#ZUf2g?at@5B-}>;O80-zxvBx-6ZTeNuaDvJAzTq_BCd%_l21~NwC(Kz1xwXyF|CY ze*Gp7$$k@XYi`D~X*YV8HRB(!bDE?9qX`4e>Bn|DGCHwo)zXdi-sp;M?~e?hdtJU( z?!^y$Kt2aAh987W9N!{X&J)IK-Fx@OKpWh_ZMXLqaa$f~xdd=}FXhSu>4CBcmi3Ec9Y`{&Dlz6#}iTV8nK=Dr$wf@{DkAkJ&P z`p%Yyk~qB!V_9<-MUE?Nojlaj0D%%QS$cf4GB)$ zV3+J%_|>nTnq)1`Ilr|F)cVJ`=^zn+5yA4vfHHYw}gt2Z2Tt==A1o z-@m(Iw*fxhjJxEy5M^P}W@o6o+^agWOL(licLCL3fPXr)LRY(3V@7L`YaOpXo{35e zm>=!a9UmI!7Kc)pYzkG`l0so~*->jxv9t}ML{~XU8;8kWXsO*;+M9ymI!p#aAn{(A zQsZ;y6NkM?*yon#njuNHEONYVpw(b#C)yHQI5DL|GdU8xz{<@QoUPq$`pF9$O-mHJ z#|^uz3@E3{nDAr8)1j}1(KBqp#esIy1z6^W*ziVPhyYY&HGoE+SUe6AI1+Lf>ZTsI z_!>(ReLch!!0Br5Er+4-FXdu}Lyfk%aRwKP)HtUx2c{yssw7qNlTya)K8%k&_ieBKY6&B3SjXAli))G!}^?b^Qkw=TmRa&E!6lU=qGE13gB~M^k)DW@T8*fsry1_HxQ~e^1W3Ap#DI$8`54i@_2)39}G2PG)f_jqrbIVame$ewsN)D;-VqOw8 zz6qrP6H0c{aWUY@=nSKai2_Nry7dudsdQ_B2v$M2xDC^$wbO2Q*>Ew@xOc`WH8pNm z)MFkemLk-!L+5mxO?n1hd+sH=I9wl&4DO>Qgp-=k@fqOK#9>aQNg>pPiMv;ieH%i# zD8pniDNBw=s%ET%rH8GE(UsG(oJ3cgLl4knLq|k7Itrl|2OZypFo>M0v?$9(bh%&n zFqt$l)G3A|#ZX%eC3997*zT7lb$1blbAsYLowz6#3x+yTy+yA%Dh_-Z2IECvbRB|& z8F}3#j=%tBRq{&g9P}IJV+4nm!@vO{qsn0@hQq1R zPoNjn)x|h-fpVM_R$mt5T0^U31rgVnQ%vm8aba>;xoWV{D@=RgCXRY6j%+Zu4n^bO zp)e8Q%qC;*_$Ub>Z$gk+fTTRg)Csl{{;?y6$Q^s;7Gg;Bj?ovfhI3Skj{b~4LE?}E z!{QLh7flF!5-lW0@6kk(D+WSn=|_pasAGAw=!HcQ7e@&v8E>}KX(U%_0%7njXdBwaOmuV} z8>{eLeLH<3%fsWqg7B{5rw=o|cX;-Cb2Shf)0->`*Ebj$<0hFgcT=3xn9=n94FSIy z3k?+IoU?0_fL$#mwUu`|{kilPZw9~Q56 zRQpT$rdF7Kl%4@2v4TqoEl_fiA~L zO)yAO>zgP{lCe%CuflHWpzwogOjHeBRe_FoOEXs9`6(Y)US!c_Rd)n+sCM3zs!bMv zH<+~+Gu!GVQ&mut7-i3`1ikUJo<(<7Kb;E=rEPH5B)N$C`Ph${*)q%!gA*{~V5Z&b zRryy=vKh1{jw;zb))t~!(mmle?MaKN80whuaf$`t5B-FD;iHG26Jl1XP=`|2Q=4xj z0t8rl+1SonBjrH?6h-*GvPX3V3sBm9byL0w!oV9t#jaew7#FFKA#^=AHm`|R>e$JU zDff)aba$ejS{9{xQlrfXW1!Yyr;f}ZHK+V2Mf^rqH}Knwwc%W}pS`%qe!^EcGXxP- zPRkwB3r=^Xr)b>iSs*|F8HhUB4Pmv4$m?Zqu)YRdiwn|6a{IGnJ0;wZqxB5pV^T-pXzDX_>|OK zwN*6RnEB2WM~np>{B z$uS4lG1llJc3qngR}K>6ipheNqLd)x7gfibzZHX7tSl1ByF)C)m^x67Bl|0hfLr(6 zoivdR8T9L_H0-5<*@n@YbA+V=RfD3Cb~=S+!LaJoGt?+Y1F1lBLgiP+*r4N}I~ol8 z1i_AFj)BPZf?v4cju?vKd^K{EcdqiTOW@|VyWWc?EUd_q1qSk%1f9)}TtHu1ka09p zkD7Qe6ojKO9~|9TOtCd5%S(^VvPe!IFFg<_KW-Yd`2jEKEXxkrWDpqv6}mtbAejk| z8@?&W7UEY^d!+PJ0<-5+Mnl#crolcOl2&( zAcsABMmkgl`)G2PEj^5SEYl;Y+N_evQBismA7+$eH9iUiL@CH9xHg~$(Ueae624a6 zQ>b-~VBlC=O*v-bdboPsCf1AY@HzL2`;mw4`x?^=1Ij&vF&(ARJE4AubI*f*DEziL z7Wp6RtSM}w5C7=@@F)I}kU#g`|Lfn88Gr9*Uy}LWTho1+-?(!62W9@+yB{~t-#7d> zUcOO&|I2r--1)jpP2GJUhR48?Ifm-}UoL<4XE7P!YDWX)=?nk#&-_)HFMsCm{rfVj zn;(VFSj3;Lz05nh0l)e)tXcqC3FiIN<&#OEF*QjbXeE$cp?w=6`us^l|M1`Z@BUx$ zzWKNR&VL|t_T^8SbieffJRjx$1wF{X>_7a=#~MRrqo?Oyx^m~r!(Xeqf9MbW{@-uJ z)onLrDZe%P`he-!mID;R1Bxwie)8)tFTdyi{;&U@0{FS_{z)@?|IJsvF84RT{9RNb z=RRNmV;Sy$`y0RbcO}8{Q?ER~+?)3$!5eR&er&9thD7xOS65egyPPe-TGNp;IfO==bvSFsrtUfihLHtd?x6E9A z=}R(~oSMYeUQZ>#!GR>uc=8iT&_w&FkzlpNmy!sKSUV(m{q^hD?`zEb61dG)>D7L9 zlL^GPUw{3bca}&XbM1}MZ_0OF#%qe|-6{_Zy?i4T?*04sKivgDwt2MaZOg8?yzgIv z_jV;{;zNS_ThX}oA8F2~HFluS-$Amfm zE(uJE^U1r|l*$IH2-8m!VpqQyh+V%Yg6R`+t(g=}g37tL`V}i1I9jV~4=Yl`Q(Fo~A z`Pz74WnP(Z+|bhVuF-U1^e(A-D(@C#3tTcO=cqeoa+#@{FSx}++V_d-gYuy}N9lr4 zb4l_xr8se?`rg_$>4}#5HQN3ziA^Ly1KR4P(zC$5R>YQ*o)MvWG3$pJ3&<2saFbP^}>jrCE z+Ow^Y{?d<7r&?Zo`qH1&rImQh@f{PfVKP_q;z*hxUfZ>%$4x*TO!;cv$5iO#1}Sw+ z6`(v(LAn*tzBW|9^dz+I z;F6ZVRkPtv2H0&gpW`~TYe7C1SIYVYcK?9PTwb_N0od2J65iCoYP0g1Yjo)D7g z$7ACq7y(TdFn}T?yyTIP%Is`1>qVJWR8YiT1j&aHf}-M2#2z*fxJDkr6;v)H7q0RU z*+3u&8|MB`Ro6_eT5|)jd^R)m16nNK@#U0XOvqaM==Vh3V$$ z7!D+9TQ5>gmzunMso1?VW&sOYJ$a^xGO2J4?BO+R?Dbmksu!Nh%p0srNQCiy=U~d z@zyQ~)P!D?5rXJ}3xEoI@uOodoKIJdk6?AOn0WIG55*YG%N0O3J=|wFo@7S-CQDeL z;XuyPW+cscZ-fUqShm5c`m*;p}? zmO+F2i8lItajOUQAYd}fBH1Cp99KqRZ;}O!Z6&%8GYB_Q#2nE}-@8L%wje^i_Z-Zc zbi{!~-F5R_uMl28f0t;zHXnJuSlMRDs~6ls{C9S)75&S~9+!KfV9Sn-1*jCM`F8>jR?yGvOyYMJar0;11#KmPf7;K6rB1s%J@Vao?Nb zz2|keexPXmA&SodQ&oG()l1thg)*hqT2C8p7V$7DZpc6#Soxo&3 zCu?wk(D=owRp>iM{U2{OfII!Ow@_dD*wj7T_=Y^QBv`S|BdVn*fu;Lpb3f!#sh9!blW0Dj~?F(c-xlq)7$&E z%p{Ei{@fhg`dcvibJ(*Q{;!*(4P3=TV~~N}qX7IpWpuu zjnnbidBA#anWL@Q zGale0%T_%fDu;)rb>x2}BBdo}or&i}h4j$!C#meKze7)=B-Q_7IjrRBf-CqAh2jC4 zh?&pvMAj+D^Yn5?pZ5}&Fvi4ZgpeFzI!`i=a9OX=*1NR@=rgGA;pu;XcHecVZC2&A z71lztyy&Q7NHV7S<%GZQ~`%+p{{tOvaL zc>B2?kx>MrNJ~FI))iCN7SRNF|6B%k=W+M-nGJb@MkH*d{Gqs-9Zp+AV3+TdcaC-1h|REuuHQK zi*3iEJrSS00gxWNFT;~Os}WmRv8IsEr%Y5PWCcbZaF7)55s)K7y|f;<1iV6Ggo3GD zMi%(qYr&Nhs2txbQz?vD^33r0SS%ItXT9p9o#sM0i=cq=DV>*cOr>1P#f4c@EYyVc z3z^SM#d~_QHIY*aPODnF;EVcw*wssswZr&h#pZqfurFe#dw7?p?&I|d_g+Q0`H~T< zNxb(^yS!aZN%Ab#`uCe%AqP8`xPXf>70T8-Fw-I`8?WR>j$`h74A8KZURofGRR+M$ z0_Z&0TD#Y}^7OjIYAhl!F!=nSiu=e%+S`|1xa>kj*B>vpV1e_zqjGw)p}qa83+L=c z3slZ~4xe}4(hJ@kd{eyrAgsuoc|kL)#hTJXJ}11s(a_wG6VEI?ueo7RtZk5E%8s_+t*ITvlxig>T1uR_0o<|(i+4{%VAuzGFX7#B zcvU5wdFS-gB`&9Ac3XzEjek8OTZC4w=ZggN_RGkCEZ7min*`zhcb0TWTu#$bN5KO2 z`pf0wN6sH?Zf_qPd|`mjv0ZJ@RYD!fZ5Z6pULtCgtT%$~?T+)p0G%V&qaP@zj^s8p zSF-?Bqav8uNyiA4gmQc(TrFP7RmZ%#$dDwgAxV`JGI8PFYo_R zE|hcA)e^ngevASE~om&nRn ziAzLF7RPCF3ifi&!+4KeVwVO%@nJ}a5D?xvha3QWd<3Q!!zl<5QNY7^wjva9q=CUa z&FMaeevrgs?La&kzykx4KrX~bFh(>eqAA{wH{nUZ3(6KRuVgrmEFJPM3Joq#od6u*_AC~KD`-fFhcvFFl%rH4C6O|ojRcU~haUh{j8@U7 z-Rk2K(`NJFMtB^V(Fbc!;D{#*5Th8X0rc^KJz}5=ATCC%CxH#Y;WWnx#VyoEqQymL zm?#!nMFIvfk&t@pg*YjayOJuN z(b|DhUPO=R(AMTS*rKWhi3jWsb{ks+>QviCcmQv-3mO=_Hi#0&ZwngFkQek8!EXm| zgy32Lg{}p+6<7eelm(Egkp=$d7APYZU?+5T+oDB_h(o8YFfGV-D(LCsu@yNMQOKqc ze53@H8b;;>(nlX@0qG#lBG&@K6ss&y@iGnZRfsec0QG>!7Vt`texEkL+l)G1i7;`ON#jQm4RamqyRuz%_=m72#E{9|1xx#hi z@`Z;&4buYg*JQc9_o3*oF4NL7inD+zqlZyhFof(aSH{Oo+*he{LjS*|0DpoEMO*<) z=omh5H;MRfshGUFM8)J~BW1%A`zzy92`ILL2e9lIz^tsJwEh5mOD!(3$#(fHaBZ8} zYs}S@$ZAB37A1%Umdh*1%2FVfqe|H9=?ls`i)6TUgXYGHx{^SafZSYJEMy5s6H$RpK8RQ`1{@ZR)UvXDkfE!^@klrrQBmd? zXqc<8N2F@d2Z;pM#Fp8cuB+XPGA}iX8bdl<@RaAolLc3bmS{uMNk!$QCBpr$5SV0h zfL^JnJ|?(Uenk@6L`sCjdQ!BJEJebR{ zL+2;Lj%0Y;O*bnE4v<4x!TqM!T+?Edn!0_Jq1Z>r)}%Dtz=2Mu5E8O})2f(A?a=vR zZErgmCpzbKTJIZAv$8{Rg=)&vXz+5x#w-h2kjJr!5kBN#1>Rs$r0={Vra7|aIAEbL(z^Cr}M|~Hzd6Aj*L$_kjEy#ac>P1 z%1R%w9GZxr{obhLIH(vG`+QL-jreqLj5w)em)+EZQ|6o`LS2RN-Cf;&86SgdLTOS} z4MgVLU9b{tC0CSX#yAPO4F39p#sQg}IGD*33rC;Mx9;mj@*XVZ&E0wF4w{+T> zmZW_%wz?6`iu1r_4H)G8YxW||Nw|{CIeTrjcqKYqY$Ac!rwa={69mN36xR#(dl8t4 zqg)`E1p?w?rrr&G049BL7$I<^Uc7W;6xUh&EfF)UJ=%oO4Q9O;(_2`?ojd<=^`<0sliIAR#581PnNrWA?NNtN0B3_I$ z;D2-E1%ZEokma7GTu3?0qR1dF$~w*{Gx{SB!3;BG0)yhjp_O5&JVp!9YnUP*lX0Pp zi*_q~Wt+kP+UkhTkfRkq68Ht=k2BuIQE8*-P1FYxQZ23v*om+MOX3#8!tq3<@S}o= z`^-q39z7RAQV2*vZyYB4y5QbWh@$%8)-9Z26OAc`1WoRSCe9KGqB%+&h(=jtJoDKs z3Cg>6IRu6VIRofy6sU06EeksT2(Ec55CY)f~etvXLWJpZJIb~ z{KyL&8^MOK#&8TJQ0CS}f|Z5?#GVn5wz>6#*7RCNS3XfN`(b| zF?axTb@7Y_TynUH+%3BLe5@OtoE~oBu95JCIX0P#(8gz@g1AU+<0wPq`viUlGjWuF zKOkF}LMEq^z7Van?NGN7e{V*&5*t27Ng^ZpBZtTfjMBU z#?Z!O4yplsB2Ls7VN%rEy}4O^Us!+mI3_!W!d%DUr+I3{qZ8fx-oJV zw6M&wWt7j%EvMcx>inXp-ObFVJM9?!5V8aZ-8funbS=`XU;1AlOidZO9a!K*Ek8Sf zg@T=9nt}#t7&#Qq0L3UHX3C2BshF!vdQUlJkyz0i%e?o~FmDUq7C7eKG2%KHY;SJ2 z*&QRDlq<|GZ2`?srMbG&f>Xs>`O1QU%;4ZL?Q$vhH`;^kcH14Zg{l!9N*WL5l8y`; z+%Q-?>Y7<%&z!kz=8}%tv*YpCUfZ?HFb19**g2xiMWS*RoPK(SHE+Oxd;w&by=2)k zvY@Sv^$)zhYx`JZz#KTTKunObB9)3M!Sgh<#Q2i@qlRFjP#6uyygv)HX3%sk338;W zWK;#F`jabvqvy=5kiH&KS$7mG$K_i?Aa~QuTf#C^cZF}B%H~q|PYhYG(0eJ2$focH zqT;?n&PD$tPXDLW@60+IWfl!k2h~FT!Ow~!48_zGH%O0(j|>q-5EZGTA|x1<4AmDpJ@DU_4o@ESF`J&+KN zHC5?yaYiPUKP(|>7lfA(>!26!s^lhiaB>*TLC2Z8G8Mo*54Hc9@;Oon>r4dbM-WAq z1XqM4h^BfFfLo|05^W(%v0WWxpqH+Ns7)~yfg@3A5PSo1^mCzDnj?mOqE?E>NJOwi zv83R84`et^>XWG)oQQiWc|sH~!ST@q&~P}A^5J1YTuEVIQKU3*!f2ov*zY@p$9W8z zp%1e&tAR3=mlotIUYuwcR2LJxth`AQps>TXnG|o{hWi3Ns4Q8D(wc=rk(9$yC9JSY zLo_;PA|7(|Ay%04Y!Z?%IT%f-#pun)0zBS?X`Ha7+D(8)?a9UDCI>%;VOEI+LA2nj zc=5Q@z}nhnRgSp~=9>*-%st=!_gh(l%9O3d9Aiug9jXH08Me(r35%s|W}?32Y0M_^1USO-M@JbJ0ndSZ z`948$E>d}gPz+&9zIhw#^7YUTVLZr~Me-Fvsp4g%R6O)432fR;<*tAvh@?jeIO%ZQ zre3`j%K+MozTJe3bZ0-+X|$&e$%k{?Q@P+sz_5?qY_E(#lvx20~9 zDh+O5oE2gvUBp+taY_+WQiNSeir*Wg7kkA@gj)u{L}QrnBJ?k2iv50+-~c*-BAUtG z0JWOI$u#4Ax)&&=0GcP7ciR+i3~uQc6I83dJxDo|-bxmbfV6-@WWk0FFE}p@%KRC- zEi(YV=f;iswAis47Lfh)D-GCG3p<+0ytiO3v9zUNM<+6lauw%G{-GxW@9w~U&uo8b9j4i7B<&i2T4%EN~5=>AnDE!8m%eGT4kO%>^44EXi4bt*o(W8ui=} zPm_7ef*)OC%(RW?aA9MvneCm8N2~BTe`E7l?m%H)6%YFwS&*86ohS<0DeO7F(QJr0 zybaCGLcXjGwT)1HY3fgk_gbO8u+LlD91FFnzBKhG)qAbG*8+OySH1VTd^H@g+kxKs zRqwr;A7*#d&H&Ugg4}JGQOnXN#_<9&j*hB!dN9QX&|JbNh~C!lz@vJ230-NAy)Gw_ zucufbKfVf8d_KXjOu|_b16vN`IB||o3N1@cf0-=VCwPbTJeQRB`xi<-AKp9Ippzy zrMRXFh(2^6M~O;F?L`;RX))-d=vv^yTI6vsSNaXI8ZY9}$6`2+4D5=@WHUQogp3gr zZmm9qx=|lY(fBg+#p*~!g>D~O^VDdUHu?q68bPj3VH)XuQ*=rT;!qEeDSd2umV&w< zx@+VTMC~TX)(%uX%F=Q_6f{O^gN+`KT{5wJB47(Y=PF_%E9<6;(RGL>oRy8JXTYKH zRnf?C(8o5g*|I~9Knp01OS36n&%C8>9*bKDafZ3O_;$s@@hB)BW9euN9K_WdIOdFE z!Y+pa3}%fa2*=rWu%4SR+$r`JU3;PGDl0mbh#kdcGw zrfD=?eZXC)8y2u7?o0Kz!5{GpXVaWs)CaNv{a23JzUlgB4nOyx^b-*$iMOJ=Fk2T> zd}IC?UUW`#%=0CC>JAp`?y@k2Jmo~X3@i=#0&!HO?3pwFLUh%?I3Z@u3Mf)I!YtKM5&S@eH1y$fW`$ zxx;13_CT>NVTk1L&c(J=Nh71xiBJcF!XpGc<}7o?+pflf zQYx8G6nza@+A$FyEt1OPAWx!07H<6XK}`^}NJamNF>oSg8N-Tn51)}LN@56(oC_I8 zIKh03adesh799$}Wb#wMcDX9nq>_=UO%74;CB;||r4-J0ITSyfyMd~Jq{j=2?_$oV zeh4t}7!zEVl3WmEqj(68cws?)iIcCA_zeYwyM$n@KwLa40MC^m8%VK{wEdWecRuJV6@(L)v7J>{d zUVwW)G@`BwWQ2cT2D)3si?L^-ji|#RW8#y$PZr-z5jk`qk1LR2yuWG6I|s)85TbJr zPz7*ICmbdQTpv_vDqsgiNlR=H#%ebLQ%x595RIASR<*$Zn;R3xL_Y`FQK_cQUVjti zOqGK8ST{#3)j_lafhxcmeV9CQMM;{wbT&RG>83!8)f-JF>6&--(0Vu#5|lIqs{sje zE)r0Vpg>Am@MR1GaF-TglCX#qX6X=`gUlSUKATVcJU<4~c9IkZWFJM~j z1~}|u$#>j%ceNX#id+pz%!zeUMk;PJ8EK3s#o=@CX*d)(fB}|7nB)Xhx)#K$HITw; zHc(-)a7v7r$<=HGU(w;DBec;}afby+!sjrh} zE;@2}ii0aLLI~t&NqT9BLf+*-G8|6Y2?su)gy2Uw=ElZQ7l_kMa)7WzC5{}`7eBdr z4FX6gR0nlpK*c03 zM#Ges5FR~QxW*jNnDj+r(ONC3rLK`TDd%h*VX#1mN(-=%j<5{aV}aBqEm&4y0W`oy0<{Q_2t!L1P%G|Wv`?<5 zQw5`uP$==7ze$Yh<@jo)o^j1%;|@muj$vb&Eer`)F=s^4@3!w~w;k^cSgh>2TPxtW z_5jVnot-m(cU!O|)4|?e{`PAg3r4#tAZz+4jq=3$j1wt|8T0cCyE6}%)wc4VFU~bWVL{+F3~KnrU8pta4-gR zqrE1a9Gm7%%U2$8KwjuIKxVgz{ z2alkxBns{xBQz-Grn7*lpNtIg60hlJ=(8m-7cxcfuh48mD*q-N!}%2zT&j(u1XcIR z2PWwP)*u~0b!q=Vu2)9eKEvK{Z3fW$#mLC1#DVUr{2Kf1Y~2I5!39&q(qly zcCXoIcW3Vb^)#c2hr2P36yYX^0bS_TiMK0L+(hBa$A|UI9^GOaz4xX7deMf7oX}^E z8>!wvDu}rmX&Pm#J2*be=LCDi<&i)a-oaRZD&R|@>zMAc`{=5uGoY)^nJ>nhOn)dH zvFPCq7%9%XzzFp^bF&QQ6Zv?7_N`IWF#KkaV*CxwAvZtj@IC?b(@cq0p{fpvA1w zKxSMWTFZqeWwJ}&@UBD}TK~CSY7dG)VBEMu`P$Q&jyu>LE$!$iOL#W?Z20h&Ov@vW zJUM>%JUDpwHVb0)=9g40emKMChV8K9UK;<-H0$H$itD@_P@st2Qcs3Kp4DMX- zJ@e|q*v8+6e_PL-m2TI9{xF_c*lmh?@9k)uweB7ZRGy>7CZmslK(VeOmY*7;)EpJV zSzM$*Yl$%N0g~d>mPKk{1ttYbbR;MNr?`^9i?~u6`~dU^L~}5E3PPADn@&nd0#^p3 za`bRxX${Tt0F#TMB(qqIdK`FxDH~C(Y3^ht^8+~z`TRnvnts^=iz1m@^rRqQQMrp^ zrk08YZ>W}9HGPHo50O??N}U#mlWe$3fGGl&+d~?W1#~|2F)=_QtCpmT%?mIZ9H;G5 z12MUNm5|{Dl4b!t3^I3)9M1KCjWAA`Q{FgxE@KBY`+qgR_WjCRj8Wh=%)wG0ch!oFECKht{OZ zftd@I4XIhhu7EgGW-^-M8sGs=w2dEt;}Qtsw4>;(1P$UuAV#;Qpc7;q7i|!4i_@I} zQX)x|gj^U=t%Md6=LHq?Bb|1_bkC72%ma+iB_UG4%@fHdjC`^zMRM}uH&`#t#V{g1 zBNfI|+K7YqT~PqQc*d5aMejKkhbVy~j-?LdJaywJ6|Z>MsxulEf{~^)h5Ws~P+zKt zg?l;b1jlMr0*k$B1kJz$$fH7nRdAr4uLA|Ve3FAi$J||uN_5hjBGfbUSv?U9f`&MT zJUP|&D5vpSqJzMU=RR^Q9*Rl;xwoeTKgS9nNI#2-*{*mtgpgs;BZ5#5EWlVhCQzi3 z5J|XW??h9n0b3S|D1nV(5M2fm;8(5pSbL2>*nUoa}xqB5+es6U(vVw>K8-`^vyLWsmk2)M_^DNZQ? zoIV_5@q#LGK%cu>MZ~$nqrDMqOpM!{(bOGGA{6%Z_NIDxQ-Hfe`_Lpxn@1QX<|2vA zT?Fv7kIO*uF=UubWKkTI&q*7ys4yFw3_&&UM;*E>F@c62vWtf~Vgd|iAX!o+P12I! zRJ=i;?_C+(c*rf4g4A255HR*sp5p_?X#{@ig8}1HLqpKU7#sosMCGw184xHD}HoN>4e`hk$U_0+iQ#1QJnIBWhs~ zPFk$|l<~JLyaFSU?~x z!jlcM;DYLfta|-Yd(jbVQiX7Dv9nJJ*uI^IHU(pBJ;v0D+_2>)V8+QUl(uEPOrxf zv87Lme9(;3cUPs_I=Exk_A;wel~yonZZHT7n#lq>cW0}!W2{knb*kZIRqY}*i`5k* zF{MbTK+yeTWUPdS0?|>EmH%0DmgPdD&a$EcI(Lr*{87Nj`A2_+~zU|TG%`eb++qyI!gylqd3+P zraVpe2Q*>`B}GzsR9dL7Y$yUb(RyB(VTxk6LO2kREmRMRx>O=|)CZ16ADU;CfILt? z;2zb|5V1m2mdj0Mn4t1oCzWlg91CSG_yne0DP-f)g|hKT&0S-p!BA@7lwLn-ZVoFn;{e3BvioN4%Bf&K>(!;L-ykGYzP~@ zeU^`AB-9Hcfp8S74_WB1g|JR<(f>ksq|5B}Q6HvWKo>d2)*X6gfc{EPVLljt4fir% z9esct9n?REw#(_pgN#B8lF2^SZTpJ&g>s{!4U6glzWEhj>I~bgkNNB(-;659yu`sk z(BeMowbN_NB_M2>F%e%Pt|qL28NphRmKE!XglN)5A(#;d51st=yiDmDL~jJI&-Ta_ zsq$^;i{AwNh)XnI_n(VokX9cLSR17N*n?4=!uNTMEiZdk)3$XUnJF>M}RNyog zzhOi3V6E~i)}t&CZpJkILWyTF77sU#xD;}aL7};*m1oH|YA(|d?u=O|Xq0$TI}D>f zCG=&JjwayAXEbU?oR(KiS?XG?m|z5v)H_p<3n>o01Df+b?IX#;-eOa7!^Xu~k&2Ym zlZ(uSs0N^VdaRYQqdBTG@#YdQQ0R^Gh6}{1khzq(kW7LywkQ;4s0_{xWwvD1$CbOyh(Wb4kws9`OP(z~UrR)EG!5l;(Uu)uDzEHKS&UzH?y?vI@#$jV&+?+pr7sE2h~VYO=&(my?J`oUiz}0gFj1WFnj#hC)E5*G8loZYQfsrGdEMtC;ZE*slUX0K z>!-Yu=7K-N0utkXSr9Eq&%ZG@@yArY5s^(d)PQWEhIl3UMBaa40I~ryRVl#`<7D3X z!qhCFJ{$Gib}!_5?;&&rDEB5mQ!Jkc7SoEeF69uLp0rgn0TAU$y zMA1x8xtg4msO7Oj<#OwxJntHpPom%)#GA)V)paM^eiWIH-1Ahs?1HSQgh`{+nh<3V ziYH7G4B#l@Z7GBJ81WU1#+Fs)KT%S;~e?l)I0@F((?Q8bS4=P>*1b z;y?wBSKo8s4HMU;sn9$(CyE&oNPkzdT9pWSH*8WkAqkHAoe2zwV~R4kcz$QP8aQbHjP_xY)Z!j< zz48#|uhXLedPWmRzT#<(5i~+QvcFDu0_;3&G}-c<{5&- zFlw|=b%{9iyhARBSvxCSP3Xl7*y_?ib11l#u{DGhYz2RBMT{Od9Mmh`=e^?&%wJ`X z^nb*@a5ZT?VqnZMgcnVoKaa4l@6@e?|J3>Wn+Vqq4ms~1+en*j)5uXzTOwYY4X=GIf8#7wwvvCVcr> zpBI?IwSqRGC>%qNnflC~ZEoLL@|n?Q$iB2ocLE!=%G;}_Wl^R*#D3TBWzeCNd)*Oa}}v=fa8uy0F#Al}5K2mZc@%<$^E;W4M3Lx%7qlB#on`LRH~pg&2~b#4BRmGY=|ZFu#*rNo!kiY*LRSrBj%$N*@EZ~2)X3!V zA}z@*2U&~ZBsD$XwNKAK z2FUQv4Ci>PEM8T28Hni3^1*s?5wNJH`Tq4cr`4OBbeQk6pp z-84y!@|dO}Y-bb0=0Ph#2?&9eHRzOR03mFKBL{lu* z3yG#sQyS}x=OmhP@#r6=t#B_+N5=P&h9MM`VW1m^KBozc?r++c#y&eC%WpNYblf1* zg#?g=?bH)SAdQ!g(_LX#B9Ry0-PILJhg=ONX&?oa!9qE91;mXb9mgB?2&KV8A+j{I z11zsZvJ2O_D}mMLNy3Vg1_vSVosf{XKsZ?qASwXL6J?Bg1RUoMsulLR0@XyjD+MT_ zSAu3hpe%$$lt;Tr0!5z2s%?;rrhCwJRq;6uq@^sR9UkjRhn%#Jr+d==R5}KYDVPI2 zocnRtbtSB{kEPADzgI}WM&JPFp_q)11hFxb)15}0Ez(dna}i;sO(Sj@O%@BKtu%I3 z>Tw*)!K|}jGGd7f&z0!5n4J!iL^_EdF4#)Ibqa2r6Dfk$)7`j1#_^= z5_-f7=3rMPfn}lvb5vrv|5AC0T*`79lqQXfJ#fjD#k?HnncEqwCQ&Uur>%5o=>v2b z320M+>~OJjW&>khiKVVcPU7sf-uTiQ6t_MYx2HV}+?zkOB2-Jl%YXlby=RAeB_P*! zl9XWL;J5+m%hVFYzn4%*tuFv>-Z{vP>`_ZMYVR}e;s9Mmjd4lYo+h|xYAsZ?lyA)l_NC0tZ}F0;T> zvpgDHN!QZ?u{9MkP&g?p%F&8nKO2&6O(g#lpcgH$8fjJWf?4~6yhY?j_mUzDIR;3V zqKdD5&PpQ}0aetJ$`ySfU!|%ord+)_m86MTC!oS7U(1V+E=hSQ=F@md`h5(~Z@6JG zo!-XCUj=^gR}YJku9yFC<3EXi=V3p5iE#bkm(M(Hk@f@6*eKSQjvjd3H;7JsaGUru znD_I`pCgvf@#B~G5Ki2@*MWrFu73Ui!ppz&`_l;55B~7o$)6UpPt`I%Ie_Z%+jL9;#?z$h^!L>MG?2&fT^G&3!j_6nv2)vKD<%!^|M1g$&!;Y>B&<-WQG|5;#ro8 zuagCi(3|U}=RZ2g_3G=CJ=AicS{6J}k}l>8vAP^&j+8TnjziZkN=9aA8_i9?-A~wJ!U!K;4P~@ zMEK+3&8kC5WE~)J&0p7(+MeaN{Dbh0JDU3mAD0{>+6Hr{?<;&lyn2B;#cH@-`D?w} z1KI=H1KI=H1KI=H1KI=H1KI=H1KI=H1KI=H1MeRX(C%UX*WvwBn)*z%2eb#Y2eb#Y z2eb#Y2eb#Y2eb#Y2eb#Y2eb#Y2eb#Y2eb#Y2eb#Y2eb#Y2eb#Y2eb#Y2eb#Y2eb#Y z2eb#Y2eb#Y2eb#Y2eb#Y2eb#Y2eb#Y2eb#Y2eb#Y2eb#Y2eb#Y2eb#Y2eb#Y2eb#Y z2eb#Y2eb#Y2eb#Y2eb#Y2eb#Y2eb#Y2eb#Y2eb#Y2eb#Y2eb#Y2eb#Y2eb#Y2eb#Y z2eb#Y2eb#Y2eb#Y2eb#Y2eb#Y2eb#Y2eb#Y2eb#Y2eb#Y2eb#Y2eb#Y2eb#Y2eb#Y z2eb#Y2eb#Y2eb#Y2eb#Y2eb#Y2eb#Y2eb#Y2eb#Y2eb#Y2eb#Y2eb#Y2eb#Y2eb#Y z2eb#Y2eb#Y2eb#Y2eb#Y2eb#Y2eb#Y2eb#Y2eb#Y2eb#Y2eb#Y2eb#Y2eb#Y2eb#Y z2eb#Y2eb#Y2eb#Y2eb#Y2eb#Y2eb#Y2eb#Y2eb#Y2eb#Y2eb#Y2eb#Y2eb#Y2eb#Y z2eb#Y2eb#Y2eb#Y2eb#Y2eb#Y2eb#Y2eb#Y2eb#Y2eb#Y2eb#Y2eb#Y2eb#Y2eb#Y z2eb#Y2eb#Y2eb#Y2eb#Y2eb#Y2eb#Y2eb#Y2eb#Y2eb#Y2eb#Y2ebz&dcbcQ*Rt=h zBdnH?}UTYJA%FLH2ED`lEX>-)rn4cGS{w2l;=^-mzi>kp+Q-aX3Gbk3T1P zg0aLoEj;1shW(6hu(Rz+8ylW6Hdz<9O?{&AR^v^JZ#3TuE%#05U$YLH*fh&`D!=~G zL)ym}zN?)dbsT#7n1_7#IzN5%@RfV@`UafeE^V`$PxT+jez$d|Gxh-gBKFkMk8B(ZT(jTCc^5|>3Gmo~ zZJ$i-{q4X{jSr`e->}c;0?(z}*+~zMKPb3wY{BwRZyos9t?DByn))xIegN> z27Aqq+rD(|&q_aSedUR12RD9e z%?rz~*gEaS#s^|M>{Wkn-O#wx#~$TxndgTNxo<2>u;`4?;yL@9>q61jL&^INw!RuZ z;I7cG=FI5$+V}%64ZRru#M0EngN|<6|GrNy|K^l~b~b(TzD4}o=D~M2UE%BG*P9=> ztm!u2mzUo#<&dMB{&e5v%YQKCkT=IP#k-f@G=BQe$9!~7uXRiKgBOoE=f3Z^tq&b~ z#F*>m{D1aicIc~PHs5#G)}QS7mkncf`kaj$UpVaCy*}XEvixUH9sYs67R`Ce`o)8X zZ`&*3dv4%YcYo;nd;QG!s(sJRA6~rIw)@`c_-(3f@8(^0Ks z|Ml3<*nhN-`r}yMe`fekmwn{wv9}+4{_>|gj*gA}OaJB0vj-i$b6k_ZJG||!Sw9~4 z5r3-V`3FC`WZaql@1_2B-N*JGcTN9~oR`k}*!|<~>AG{^mBT)M*|-<|zX`v(qy2*| z`*uBOzIJ!}Us_`QkGH+C@)Q5o^5y<#+TLnE=Ho5b_rKWo_TVuux7^>g!`yZE?CV>$ zADc1Qa%+Bg%BH4m{^`~m;RS*5>EP3`o5B~(ZCw+(dd`XA8|NMx+pB%f+u?`i9=Uz& z3&-9P-VvDH7ru7xNs(!ZPsR3WpZm|qf=wrH+jr}6H$^TAEa{xc=Y1;j{lK}~CY$qK zi);>D+&T50`PWAVHeHoA7cZE-_oTT!(E|n+{P*6+Cce4i;KV1ty7zgTzMq~x{!<^? z`&*mV8;9QfsmJ!dH}TUMhqwK|i}(K9+^ z;(e9|{=DXB>x8%VNd}%@^U-@w{LVgiZ2CuM`>d0W+ULo+Z^e$;c+%thyxZ-I#186M zKK|hQ_u6*swF{faAAkS8z4O?@TgPA2-5OhP-lt>ZzZ;ys?Nd*D`Y+?1G_x+l`a1JGpt^=I-OxEZlMO5BELdxD&UX+_C7R`+nyB#j#V?FM4F(Rl&}_#e=7u zweL;GeR11q$Di`nzMGG`IP$scKJ#z;zI^|x*plZLPu(wk+}h4FrZ2vIza#IzX2n_O zeRlSKi|@Z~#j*{bePq9t-F=ZQ+;9Q(xY%|NfsvzkKp(m+$wt;IFq| zkUTv&VN7sS--^3VPfa-N{@*XWXzS-DO*rYe|JZ(M=yNwuSke8=n#-nt{_qLky#H^; z6$?Ip*My&Uzq)4SSxY`X;mPB6Zo6vblJtbP*0LG=+NJX*?*Bk&P5kDi|32|!4}{Z+ zjh!b0jXP-&U^Ag+o zHk^~3^uc*oM}N5ToWV)+8os&kmbvGiKk1CM-(7KQ^SN6mt#0UBv;NU9c1-$S!}>M1 zrM~#vNxyjDjujggeCb1z{xI(s3vXv%`rf2h*8V1X$6e=zCWqGcKX&KR^Ddfv;M#v* z^Rwpj{&Vs%4Ua|d+W6&plNUEUdFL-q{_^dUFKl=w`pbdy_nZ804?N%dtK|7BC*Lyf zrER~Sa{ji-_paSOwVe^mgeEgh?U!7`gUby0kjh9$c7d4);=0655NliVs@w63B z9(KvIQ&+BA+WFL3mmWSf)%b-Of4c6{%cuUZ@!aiye(=)!r~Z8N`F(%c@s*aT53ai? z_Ma2KvUuvB*L@}Z%&f22Q~$nhW$f9-U-{eAcjxoIt;;Vvd|J!8Zev^GvJ0n~n|osa zmAdTb(`KyuTIX{&T()!CoW|ZY&)b*Jn)d1W-|GGEn=ij?+8K@4ulcKe`7fuf*!=y@ zzg>6v8`IV__RV-9dBu!rsm7bPzj)ad=S{nD^ZLG*mR@n|w4co1FyrO9S3EoI*YoeV z^X~^;IbqsE^M5wu6?Wx`)Bd>m7i(U5>dLNZ&o}<+v45<;@|V-LH~uE_>cv;SG;P;r zXU0JL$|UXV|H2&wdoj0r+XuWFw*2r7auiB?|UE_bn-n#3mqgt<-|9s~^XI*tl>vz`uwez2M zUv+8g59YtH@a?v%u5JC%=9gx?z5c2@TW@cCdHXvPuljxK&l_L4^PR+1FSP!8-Kz`V z`TJ_4^}fb|ZG#=FC$&D<_}aq34XbCg{(jx->0N=<^IIQpd?T`J@#@oBpK5$_;jZ#oMk!pu{vcecLUnCZ>Du=<_WOk*aU*|B<8Yi53CTjs6R?^bLX=}7GX z?E&op?E&op?E&op?E&op?E&op?E&op?E&op?E&op?E&op?E&op?E&op?E&op?E&op z?E&op?E&op?E&op?E&op?E&op?E&op?E&op?E&op?SWc*z;G41xRLNdY%hgbK|CjV z9BU|ySNuX;n7$gV^eR1NPuJoh7B7xf=@qV)-*DrVUDa^8{E==8`A?;11^!j(RD2;_ zC_h?St1SARJ@ieFq}l{qS1Im`%CRSk3LVB0p9X-l&;Z9X>k@DGDKR!Nk?{{y&zXLA4m literal 341160 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 diff --git a/FPGA/VNA/top.ucf b/FPGA/VNA/top.ucf index a697971..f544d67 100644 --- a/FPGA/VNA/top.ucf +++ b/FPGA/VNA/top.ucf @@ -1,5 +1,6 @@ CONFIG VCCAUX = 3.3; NET "CLK" PERIOD = 62.5 ns; +NET "MCU_SCK" PERIOD = 31.25ns; NET "ATTENUATION[6]" IOSTANDARD = LVCMOS33; NET "ATTENUATION[5]" IOSTANDARD = LVCMOS33; diff --git a/FPGA/VNA/top.vhd b/FPGA/VNA/top.vhd index f50f8dd..614a294 100644 --- a/FPGA/VNA/top.vhd +++ b/FPGA/VNA/top.vhd @@ -112,8 +112,8 @@ architecture Behavioral of top is RESET : IN std_logic; NPOINTS : IN std_logic_vector(12 downto 0); CONFIG_DATA : IN std_logic_vector(95 downto 0); - USER_NSAMPLES : in STD_LOGIC_VECTOR (9 downto 0); - NSAMPLES : out STD_LOGIC_VECTOR (9 downto 0); + USER_NSAMPLES : in STD_LOGIC_VECTOR (12 downto 0); + NSAMPLES : out STD_LOGIC_VECTOR (12 downto 0); SAMPLING_BUSY : in STD_LOGIC; SAMPLING_DONE : IN std_logic; MAX2871_DEF_4 : IN std_logic_vector(31 downto 0); @@ -156,7 +156,7 @@ architecture Behavioral of top is REF : IN std_logic_vector(15 downto 0); NEW_SAMPLE : IN std_logic; START : IN std_logic; - SAMPLES : IN std_logic_vector(9 downto 0); + SAMPLES : IN std_logic_vector(12 downto 0); WINDOW_TYPE : in STD_LOGIC_VECTOR (1 downto 0); ADC_START : OUT std_logic; DONE : OUT std_logic; @@ -224,7 +224,7 @@ architecture Behavioral of top is SWEEP_ADDRESS : OUT std_logic_vector(12 downto 0); SWEEP_WRITE : OUT std_logic_vector(0 to 0); SWEEP_POINTS : OUT std_logic_vector(12 downto 0); - NSAMPLES : OUT std_logic_vector(9 downto 0); + NSAMPLES : OUT std_logic_vector(12 downto 0); EXCITE_PORT1 : out STD_LOGIC; EXCITE_PORT2 : out STD_LOGIC; PORT1_EN : out STD_LOGIC; @@ -305,8 +305,8 @@ architecture Behavioral of top is signal sampling_busy : std_logic; signal sampling_done : std_logic; signal sampling_start : std_logic; - signal sampling_samples : std_logic_vector(9 downto 0); - signal sampling_user_samples : std_logic_vector(9 downto 0); + signal sampling_samples : std_logic_vector(12 downto 0); + signal sampling_user_samples : std_logic_vector(12 downto 0); signal sampling_result : std_logic_vector(287 downto 0); signal sampling_window : std_logic_vector(1 downto 0); signal sampling_prescaler : std_logic_vector(7 downto 0); diff --git a/Software/PC_Application/Device/device.cpp b/Software/PC_Application/Device/device.cpp index 2bcca34..47188fa 100644 --- a/Software/PC_Application/Device/device.cpp +++ b/Software/PC_Application/Device/device.cpp @@ -105,6 +105,18 @@ uint8_t *USBInBuffer::getBuffer() const return buffer; } +static Protocol::DeviceLimits limits = { + .minFreq = 1000000, + .maxFreq = 6000000000, + .minIFBW = 10, + .maxIFBW = 10000, + .maxPoints = 4501, + .cdbm_min = -4000, + .cdbm_max = -1000, + .minRBW = 10, + .maxRBW = 10000, +}; + Device::Device(QString serial) { qDebug() << "Starting device connection..."; @@ -162,6 +174,8 @@ Device::Device(QString serial) connect(&transmissionTimer, &QTimer::timeout, this, &Device::transmissionTimeout); transmissionTimer.setSingleShot(true); transmissionActive = false; + // got a new connection, request limits + SendCommandWithoutPayload(Protocol::PacketType::RequestDeviceLimits); } Device::~Device() @@ -251,6 +265,11 @@ std::set Device::GetDevices() return serials; } +Protocol::DeviceLimits Device::Limits() +{ + return limits; +} + void Device::USBHandleThread() { qInfo() << "Receive thread started" << flush; @@ -388,6 +407,9 @@ void Device::ReceivedData() emit NackReceived(); // transmissionFinished(TransmissionResult::Nack); break; + case Protocol::PacketType::DeviceLimits: + limits = packet.limits; + break; default: break; } diff --git a/Software/PC_Application/Device/device.h b/Software/PC_Application/Device/device.h index ed64f30..28f0cb0 100644 --- a/Software/PC_Application/Device/device.h +++ b/Software/PC_Application/Device/device.h @@ -62,12 +62,13 @@ public: bool SetManual(Protocol::ManualControl manual); bool SendFirmwareChunk(Protocol::FirmwarePacket &fw); bool SendCommandWithoutPayload(Protocol::PacketType type); - // Returns serial numbers of all connected devices - static std::set GetDevices(); QString serial() const; Protocol::DeviceInfo getLastInfo() const; QString getLastDeviceInfoString(); + // Returns serial numbers of all connected devices + static std::set GetDevices(); + static Protocol::DeviceLimits Limits(); signals: void DatapointReceived(Protocol::Datapoint); void ManualStatusReceived(Protocol::ManualStatus); diff --git a/Software/PC_Application/Generator/signalgenwidget.cpp b/Software/PC_Application/Generator/signalgenwidget.cpp index 1d8876f..25ce633 100644 --- a/Software/PC_Application/Generator/signalgenwidget.cpp +++ b/Software/PC_Application/Generator/signalgenwidget.cpp @@ -10,11 +10,10 @@ SignalgeneratorWidget::SignalgeneratorWidget(QWidget *parent) : ui->frequency->setPrefixes(" kMG"); connect(ui->frequency, &SIUnitEdit::valueChanged, [=](double newval) { - // TODO centralize min/max values - if(newval < 9000) { - newval = 9000; - } else if (newval > 6000000000) { - newval = 6000000000; + if(newval < Device::Limits().minFreq) { + newval = Device::Limits().minFreq; + } else if (newval > Device::Limits().maxFreq) { + newval = Device::Limits().maxFreq; } ui->frequency->setValueQuiet(newval); emit SettingsChanged(); diff --git a/Software/PC_Application/SpectrumAnalyzer/spectrumanalyzer.cpp b/Software/PC_Application/SpectrumAnalyzer/spectrumanalyzer.cpp index 1d8e3c3..5da1b4c 100644 --- a/Software/PC_Application/SpectrumAnalyzer/spectrumanalyzer.cpp +++ b/Software/PC_Application/SpectrumAnalyzer/spectrumanalyzer.cpp @@ -295,8 +295,8 @@ void SpectrumAnalyzer::SetSpan(double span) void SpectrumAnalyzer::SetFullSpan() { - settings.f_start = 0; - settings.f_stop = 6000000000; + settings.f_start = Device::Limits().minFreq; + settings.f_stop = Device::Limits().maxFreq; ConstrainAndUpdateFrequencies(); } @@ -324,6 +324,11 @@ void SpectrumAnalyzer::SpanZoomOut() void SpectrumAnalyzer::SetRBW(double bandwidth) { + if(bandwidth > Device::Limits().maxRBW) { + bandwidth = Device::Limits().maxRBW; + } else if(bandwidth < Device::Limits().minRBW) { + bandwidth = Device::Limits().minRBW; + } settings.RBW = bandwidth; emit RBWChanged(settings.RBW); SettingsChanged(); @@ -339,13 +344,15 @@ void SpectrumAnalyzer::SetAveraging(unsigned int averages) void SpectrumAnalyzer::ConstrainAndUpdateFrequencies() { - // TODO central hardware limits - if(settings.f_stop > 6000000000) { - settings.f_stop = 6000000000; + if(settings.f_stop > Device::Limits().maxFreq) { + settings.f_stop = Device::Limits().maxFreq; } if(settings.f_start > settings.f_stop) { settings.f_start = settings.f_stop; } + if(settings.f_start < Device::Limits().minFreq) { + settings.f_start = Device::Limits().minFreq; + } emit startFreqChanged(settings.f_start); emit stopFreqChanged(settings.f_stop); emit spanChanged(settings.f_stop - settings.f_start); diff --git a/Software/PC_Application/VNA/vna.cpp b/Software/PC_Application/VNA/vna.cpp index 8eed8ab..c24ee7b 100644 --- a/Software/PC_Application/VNA/vna.cpp +++ b/Software/PC_Application/VNA/vna.cpp @@ -600,8 +600,8 @@ void VNA::SetSpan(double span) void VNA::SetFullSpan() { - settings.f_start = 0; - settings.f_stop = 6000000000; + settings.f_start = Device::Limits().minFreq; + settings.f_stop = Device::Limits().maxFreq; ConstrainAndUpdateFrequencies(); } @@ -630,10 +630,10 @@ void VNA::SpanZoomOut() void VNA::SetSourceLevel(double level) { // TODO remove hardcoded limits - if(level > -10.0) { - level = -10.0; - } else if(level < -42.0) { - level = -42.0; + if(level > Device::Limits().cdbm_max / 100.0) { + level = Device::Limits().cdbm_max / 100.0; + } else if(level < Device::Limits().cdbm_min / 100.0) { + level = Device::Limits().cdbm_min / 100.0; } emit sourceLevelChanged(level); settings.cdbm_excitation = level * 100; @@ -645,8 +645,8 @@ void VNA::SetPoints(unsigned int points) // TODO remove hardcoded limits if (points < 1) { points = 1; - } else if(points > 4501) { - points = 4501; + } else if(points > Device::Limits().maxPoints) { + points = Device::Limits().maxPoints; } emit pointsChanged(points); settings.points = points; @@ -655,6 +655,11 @@ void VNA::SetPoints(unsigned int points) void VNA::SetIFBandwidth(double bandwidth) { + if(bandwidth > Device::Limits().maxIFBW) { + bandwidth = Device::Limits().maxIFBW; + } else if(bandwidth < Device::Limits().minIFBW) { + bandwidth = Device::Limits().minIFBW; + } settings.if_bandwidth = bandwidth; emit IFBandwidthChanged(bandwidth); SettingsChanged(); @@ -747,13 +752,15 @@ void VNA::StartCalibrationMeasurement(Calibration::Measurement m) void VNA::ConstrainAndUpdateFrequencies() { - // TODO central hardware limits - if(settings.f_stop > 6000000000) { - settings.f_stop = 6000000000; + if(settings.f_stop > Device::Limits().maxFreq) { + settings.f_stop = Device::Limits().maxFreq; } if(settings.f_start > settings.f_stop) { settings.f_start = settings.f_stop; } + if(settings.f_start < Device::Limits().minFreq) { + settings.f_start = Device::Limits().minFreq; + } emit startFreqChanged(settings.f_start); emit stopFreqChanged(settings.f_stop); emit spanChanged(settings.f_stop - settings.f_start); diff --git a/Software/VNA_embedded/.cproject b/Software/VNA_embedded/.cproject index af2efed..d5177c1 100644 --- a/Software/VNA_embedded/.cproject +++ b/Software/VNA_embedded/.cproject @@ -1,4 +1,4 @@ - + @@ -7,21 +7,21 @@ - + - + - + - + - + - + - + @@ -29,41 +29,41 @@ - + - - - - + @@ -451,21 +451,21 @@ - + - + - + - + - + - + - + @@ -479,33 +479,33 @@ - - - + @@ -775,51 +775,51 @@ - + - + - + - + - + - + - + - + - + - + diff --git a/Software/VNA_embedded/.mxproject b/Software/VNA_embedded/.mxproject index b8e2eb0..02712cc 100644 --- a/Software/VNA_embedded/.mxproject +++ b/Software/VNA_embedded/.mxproject @@ -10,5 +10,5 @@ LibFiles=Drivers/STM32G4xx_HAL_Driver/Inc/stm32g4xx_hal_gpio.h;Drivers/STM32G4xx [PreviousUsedSW4STM32Files] SourceFiles=../Src/main.c;../Src/app_freertos.c;../Src/usbpd.c;../Src/usbpd_dpm_user.c;../Src/usbpd_pwr_user.c;../Src/usbpd_pwr_if.c;../Src/usbpd_vdm_user.c;../Src/usbpd_dpm_core.c;../Src/stm32g4xx_it.c;../Src/stm32g4xx_hal_msp.c;../Src/stm32g4xx_hal_timebase_tim.c;../Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_ll_utils.c;../Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_ll_exti.c;../Middlewares/ST/STM32_USBPD_Library/Core/lib/USBPDCORE_PD3_FULL_CM4_wc32.a;../Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_hal_gpio.c;../Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_hal_adc.c;../Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_hal_adc_ex.c;../Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_ll_adc.c;../Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_hal_i2c.c;../Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_hal_i2c_ex.c;../Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_hal_spi.c;../Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_hal_spi_ex.c;../Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_hal_tim.c;../Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_hal_tim_ex.c;../Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_ll_ucpd.c;../Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_ll_gpio.c;../Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_ll_dma.c;../Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_hal_uart.c;../Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_hal_uart_ex.c;../Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_hal_pcd.c;../Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_hal_pcd_ex.c;../Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_ll_usb.c;../Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_hal.c;../Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_hal_rcc.c;../Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_hal_rcc_ex.c;../Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_hal_flash.c;../Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_hal_flash_ex.c;../Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_hal_flash_ramfunc.c;../Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_hal_exti.c;../Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_hal_dma.c;../Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_hal_dma_ex.c;../Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_hal_pwr.c;../Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_hal_pwr_ex.c;../Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_hal_cortex.c;../Middlewares/Third_Party/FreeRTOS/Source/croutine.c;../Middlewares/Third_Party/FreeRTOS/Source/event_groups.c;../Middlewares/Third_Party/FreeRTOS/Source/list.c;../Middlewares/Third_Party/FreeRTOS/Source/queue.c;../Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.c;../Middlewares/Third_Party/FreeRTOS/Source/tasks.c;../Middlewares/Third_Party/FreeRTOS/Source/timers.c;../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c;../Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.c;../Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.c;../Middlewares/ST/STM32_USBPD_Library/Core/src/usbpd_trace.c;../Middlewares/ST/STM32_USBPD_Library/Devices/STM32G4XX/src/usbpd_cad_hw_if.c;../Middlewares/ST/STM32_USBPD_Library/Devices/STM32G4XX/src/usbpd_hw.c;../Middlewares/ST/STM32_USBPD_Library/Devices/STM32G4XX/src/usbpd_hw_if_it.c;../Middlewares/ST/STM32_USBPD_Library/Devices/STM32G4XX/src/usbpd_phy.c;../Middlewares/ST/STM32_USBPD_Library/Devices/STM32G4XX/src/usbpd_phy_hw_if.c;../Middlewares/ST/STM32_USBPD_Library/Devices/STM32G4XX/src/usbpd_pwr_hw_if.c;../Middlewares/ST/STM32_USBPD_Library/Devices/STM32G4XX/src/usbpd_timersserver.c;../Middlewares/ST/STM32_USBPD_Library/../../../Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_ll_tim.c;../Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_ll_utils.c;../Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_ll_exti.c;../Middlewares/ST/STM32_USBPD_Library/Core/lib/USBPDCORE_PD3_FULL_CM4_wc32.a;..//Src/system_stm32g4xx.c;../Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_ll_utils.c;../Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_ll_exti.c;../Middlewares/ST/STM32_USBPD_Library/Core/lib/USBPDCORE_PD3_FULL_CM4_wc32.a;../Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_hal_gpio.c;../Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_hal_adc.c;../Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_hal_adc_ex.c;../Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_ll_adc.c;../Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_hal_i2c.c;../Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_hal_i2c_ex.c;../Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_hal_spi.c;../Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_hal_spi_ex.c;../Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_hal_tim.c;../Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_hal_tim_ex.c;../Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_ll_ucpd.c;../Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_ll_gpio.c;../Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_ll_dma.c;../Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_hal_uart.c;../Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_hal_uart_ex.c;../Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_hal_pcd.c;../Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_hal_pcd_ex.c;../Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_ll_usb.c;../Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_hal.c;../Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_hal_rcc.c;../Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_hal_rcc_ex.c;../Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_hal_flash.c;../Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_hal_flash_ex.c;../Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_hal_flash_ramfunc.c;../Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_hal_exti.c;../Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_hal_dma.c;../Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_hal_dma_ex.c;../Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_hal_pwr.c;../Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_hal_pwr_ex.c;../Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_hal_cortex.c;../Middlewares/Third_Party/FreeRTOS/Source/croutine.c;../Middlewares/Third_Party/FreeRTOS/Source/event_groups.c;../Middlewares/Third_Party/FreeRTOS/Source/list.c;../Middlewares/Third_Party/FreeRTOS/Source/queue.c;../Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.c;../Middlewares/Third_Party/FreeRTOS/Source/tasks.c;../Middlewares/Third_Party/FreeRTOS/Source/timers.c;../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c;../Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.c;../Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.c;../Middlewares/ST/STM32_USBPD_Library/Core/src/usbpd_trace.c;../Middlewares/ST/STM32_USBPD_Library/Devices/STM32G4XX/src/usbpd_cad_hw_if.c;../Middlewares/ST/STM32_USBPD_Library/Devices/STM32G4XX/src/usbpd_hw.c;../Middlewares/ST/STM32_USBPD_Library/Devices/STM32G4XX/src/usbpd_hw_if_it.c;../Middlewares/ST/STM32_USBPD_Library/Devices/STM32G4XX/src/usbpd_phy.c;../Middlewares/ST/STM32_USBPD_Library/Devices/STM32G4XX/src/usbpd_phy_hw_if.c;../Middlewares/ST/STM32_USBPD_Library/Devices/STM32G4XX/src/usbpd_pwr_hw_if.c;../Middlewares/ST/STM32_USBPD_Library/Devices/STM32G4XX/src/usbpd_timersserver.c;../Middlewares/ST/STM32_USBPD_Library/../../../Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_ll_tim.c;../Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_ll_utils.c;../Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_ll_exti.c;../Middlewares/ST/STM32_USBPD_Library/Core/lib/USBPDCORE_PD3_FULL_CM4_wc32.a;..//Src/system_stm32g4xx.c;../Drivers/CMSIS/Device/ST/STM32G4xx/Source/Templates/system_stm32g4xx.c;null;../Middlewares/Third_Party/FreeRTOS/Source/croutine.c;../Middlewares/Third_Party/FreeRTOS/Source/event_groups.c;../Middlewares/Third_Party/FreeRTOS/Source/list.c;../Middlewares/Third_Party/FreeRTOS/Source/queue.c;../Middlewares/Third_Party/FreeRTOS/Source/stream_buffer.c;../Middlewares/Third_Party/FreeRTOS/Source/tasks.c;../Middlewares/Third_Party/FreeRTOS/Source/timers.c;../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/cmsis_os.c;../Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.c;../Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F/port.c;../Middlewares/ST/STM32_USBPD_Library/Core/lib/USBPDCORE_PD3_FULL_CM4_wc32.a;../Middlewares/ST/STM32_USBPD_Library/Core/src/usbpd_trace.c;../Middlewares/ST/STM32_USBPD_Library/Devices/STM32G4XX/src/usbpd_cad_hw_if.c;../Middlewares/ST/STM32_USBPD_Library/Devices/STM32G4XX/src/usbpd_hw.c;../Middlewares/ST/STM32_USBPD_Library/Devices/STM32G4XX/src/usbpd_hw_if_it.c;../Middlewares/ST/STM32_USBPD_Library/Devices/STM32G4XX/src/usbpd_phy.c;../Middlewares/ST/STM32_USBPD_Library/Devices/STM32G4XX/src/usbpd_phy_hw_if.c;../Middlewares/ST/STM32_USBPD_Library/Devices/STM32G4XX/src/usbpd_pwr_hw_if.c;../Middlewares/ST/STM32_USBPD_Library/Devices/STM32G4XX/src/usbpd_timersserver.c;../Middlewares/ST/STM32_USBPD_Library/../../../Drivers/STM32G4xx_HAL_Driver/Src/stm32g4xx_ll_tim.c; HeaderPath=../Drivers/STM32G4xx_HAL_Driver/Inc;../Drivers/STM32G4xx_HAL_Driver/Inc/Legacy;../Middlewares/Third_Party/FreeRTOS/Source/include;../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS;../Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM4F;../Middlewares/ST/STM32_USBPD_Library/Core/inc;../Middlewares/ST/STM32_USBPD_Library/Devices/STM32G4XX/inc;../Middlewares/ST/STM32_USBPD_Library/../../../Drivers/STM32G4xx_HAL_Driver/Inc;../Drivers/CMSIS/Device/ST/STM32G4xx/Include;../Drivers/CMSIS/Include;../Inc; -CDefines=USE_FULL_LL_DRIVER;__weak:"__attribute__((weak))";__packed:"__attribute__((__packed__))";USBPD_PORT_COUNT:1;USBPDCORE_LIB_PD3_FULL;_RTOS;_SNK;USE_FULL_LL_DRIVER;__weak:"__attribute__((weak))";__packed:"__attribute__((__packed__))";USE_HAL_DRIVER;STM32G431xx;USE_HAL_DRIVER;STM32G431xx; +CDefines=USE_FULL_LL_DRIVER;__weak:"__attribute__((weak))";__packed:"__attribute__((__packed__))";USBPD_PORT_COUNT:1;USBPDCORE_LIB_PD3_FULL;_RTOS;_SNK;USE_FULL_LL_DRIVER;__weak:"__attribute__((weak))";__packed:"__attribute__((__packed__))";USE_HAL_DRIVER;STM32G431xx;USE_FULL_LL_DRIVER;USE_HAL_DRIVER;USE_HAL_DRIVER;STM32G431xx; diff --git a/Software/VNA_embedded/Application/App.cpp b/Software/VNA_embedded/Application/App.cpp index aaebc67..352161f 100644 --- a/Software/VNA_embedded/Application/App.cpp +++ b/Software/VNA_embedded/Application/App.cpp @@ -61,6 +61,7 @@ static void HardwareWorkRequired() { } void App_Start() { + STM::Init(); HAL_ADCEx_Calibration_Start(&hadc1, ADC_SINGLE_ENDED); handle = xTaskGetCurrentTaskHandle(); usb_init(communication_usb_input); @@ -162,6 +163,12 @@ void App_Start() { SA::Setup(packet.spectrumSettings); Communication::SendWithoutPayload(Protocol::PacketType::Ack); break; + case Protocol::PacketType::RequestDeviceLimits: + Protocol::PacketInfo p; + p.type = Protocol::PacketType::DeviceLimits; + p.limits = HW::Limits; + Communication::Send(p); + break; #ifdef HAS_FLASH case Protocol::PacketType::ClearFlash: HW::SetMode(HW::Mode::Idle); diff --git a/Software/VNA_embedded/Application/Communication/Protocol.cpp b/Software/VNA_embedded/Application/Communication/Protocol.cpp index 0bb812d..27fed0c 100644 --- a/Software/VNA_embedded/Application/Communication/Protocol.cpp +++ b/Software/VNA_embedded/Application/Communication/Protocol.cpp @@ -404,6 +404,35 @@ static int16_t EncodeSpectrumAnalyzerResult(Protocol::SpectrumAnalyzerResult d, return e.getSize(); } +static Protocol::DeviceLimits DecodeDeviceLimits(uint8_t *buf) { + Protocol::DeviceLimits d; + Decoder e(buf); + e.get(d.minFreq); + e.get(d.maxFreq); + e.get(d.minIFBW); + e.get(d.maxIFBW); + e.get(d.maxPoints); + e.get(d.cdbm_min); + e.get(d.cdbm_max); + e.get(d.minRBW); + e.get(d.maxRBW); + return d; +} +static int16_t EncodeDeviceLimits(Protocol::DeviceLimits d, uint8_t *buf, + uint16_t bufSize) { + Encoder e(buf, bufSize); + e.add(d.minFreq); + e.add(d.maxFreq); + e.add(d.minIFBW); + e.add(d.maxIFBW); + e.add(d.maxPoints); + e.add(d.cdbm_min); + e.add(d.cdbm_max); + e.add(d.minRBW); + e.add(d.maxRBW); + return e.getSize(); +} + static Protocol::FirmwarePacket DecodeFirmwarePacket(uint8_t *buf) { Protocol::FirmwarePacket d; // simple packet format, memcpy is faster than using the decoder @@ -498,10 +527,14 @@ uint16_t Protocol::DecodeBuffer(uint8_t *buf, uint16_t len, PacketInfo *info) { case PacketType::SpectrumAnalyzerResult: info->spectrumResult = DecodeSpectrumAnalyzerResult(&data[4]); break; + case PacketType::DeviceLimits: + info->limits = DecodeDeviceLimits(&data[4]); + break; case PacketType::Ack: case PacketType::PerformFirmwareUpdate: case PacketType::ClearFlash: case PacketType::Nack: + case PacketType::RequestDeviceLimits: // no payload, nothing to do break; case PacketType::None: @@ -544,10 +577,14 @@ uint16_t Protocol::EncodePacket(PacketInfo packet, uint8_t *dest, uint16_t dests case PacketType::SpectrumAnalyzerResult: payload_size = EncodeSpectrumAnalyzerResult(packet.spectrumResult, &dest[4], destsize - 8); break; + case PacketType::DeviceLimits: + payload_size = EncodeDeviceLimits(packet.limits, &dest[4], destsize - 8); + break; case PacketType::Ack: case PacketType::PerformFirmwareUpdate: case PacketType::ClearFlash: case PacketType::Nack: + case PacketType::RequestDeviceLimits: // no payload, nothing to do break; case PacketType::None: diff --git a/Software/VNA_embedded/Application/Communication/Protocol.hpp b/Software/VNA_embedded/Application/Communication/Protocol.hpp index 1b4c5b9..2898339 100644 --- a/Software/VNA_embedded/Application/Communication/Protocol.hpp +++ b/Software/VNA_embedded/Application/Communication/Protocol.hpp @@ -116,6 +116,18 @@ using SpectrumAnalyzerResult = struct _spectrumAnalyzerResult { uint16_t pointNum; }; +using DeviceLimits = struct _deviceLimits { + uint64_t minFreq; + uint64_t maxFreq; + uint32_t minIFBW; + uint32_t maxIFBW; + uint16_t maxPoints; + int16_t cdbm_min; + int16_t cdbm_max; + uint32_t minRBW; + uint32_t maxRBW; +}; + static constexpr uint16_t FirmwareChunkSize = 256; using FirmwarePacket = struct _firmwarePacket { uint32_t address; @@ -138,6 +150,8 @@ enum class PacketType : uint8_t { Generator = 12, SpectrumAnalyzerSettings = 13, SpectrumAnalyzerResult = 14, + RequestDeviceLimits = 15, + DeviceLimits = 16, }; using PacketInfo = struct _packetinfo { @@ -153,6 +167,7 @@ using PacketInfo = struct _packetinfo { ManualStatus status; SpectrumAnalyzerSettings spectrumSettings; SpectrumAnalyzerResult spectrumResult; + DeviceLimits limits; }; }; diff --git a/Software/VNA_embedded/Application/Drivers/Exti.cpp b/Software/VNA_embedded/Application/Drivers/Exti.cpp index 204713f..5f57e90 100644 --- a/Software/VNA_embedded/Application/Drivers/Exti.cpp +++ b/Software/VNA_embedded/Application/Drivers/Exti.cpp @@ -11,13 +11,13 @@ static constexpr uint8_t MaxEntries = 16; static Entry entries[MaxEntries]; void Exti::Init() { - HAL_NVIC_SetPriority(EXTI0_IRQn, 5, 0); - HAL_NVIC_SetPriority(EXTI1_IRQn, 5, 0); - HAL_NVIC_SetPriority(EXTI2_IRQn, 5, 0); - HAL_NVIC_SetPriority(EXTI3_IRQn, 5, 0); - HAL_NVIC_SetPriority(EXTI4_IRQn, 5, 0); - HAL_NVIC_SetPriority(EXTI9_5_IRQn, 5, 0); - HAL_NVIC_SetPriority(EXTI15_10_IRQn, 5, 0); + HAL_NVIC_SetPriority(EXTI0_IRQn, 1, 0); + HAL_NVIC_SetPriority(EXTI1_IRQn, 1, 0); + HAL_NVIC_SetPriority(EXTI2_IRQn, 1, 0); + HAL_NVIC_SetPriority(EXTI3_IRQn, 1, 0); + HAL_NVIC_SetPriority(EXTI4_IRQn, 1, 0); + HAL_NVIC_SetPriority(EXTI9_5_IRQn, 1, 0); + HAL_NVIC_SetPriority(EXTI15_10_IRQn, 1, 0); HAL_NVIC_EnableIRQ(EXTI0_IRQn); HAL_NVIC_EnableIRQ(EXTI1_IRQn); HAL_NVIC_EnableIRQ(EXTI2_IRQn); diff --git a/Software/VNA_embedded/Application/Drivers/FPGA/FPGA.cpp b/Software/VNA_embedded/Application/Drivers/FPGA/FPGA.cpp index 654d545..bbba3f6 100644 --- a/Software/VNA_embedded/Application/Drivers/FPGA/FPGA.cpp +++ b/Software/VNA_embedded/Application/Drivers/FPGA/FPGA.cpp @@ -85,6 +85,7 @@ bool FPGA::Init(HaltedCallback cb) { // Reset FPGA High(FPGA_RESET); SetMode(Mode::FPGA); + AbortSweep(); Delay::us(1); Low(FPGA_RESET); Delay::ms(10); @@ -114,11 +115,11 @@ void FPGA::SetNumberOfPoints(uint16_t npoints) { } void FPGA::SetSamplesPerPoint(uint32_t nsamples) { - // register is in multiples of 128 - nsamples /= 128; + // register is in multiples of 16 + nsamples /= 16; // constrain to maximum value - if(nsamples >= 1024) { - nsamples = 1023; + if(nsamples >= 8192) { + nsamples = 8192; } WriteRegister(Reg::SamplesPerPoint, nsamples); } @@ -238,8 +239,15 @@ static inline int64_t sign_extend_64(int64_t x, uint16_t bits) { static FPGA::ReadCallback callback; static uint8_t raw[36]; static bool halted; +static bool new_sample; +static FPGA::SamplingResult result; +static bool busy_reading = false; bool FPGA::InitiateSampleRead(ReadCallback cb) { + if(busy_reading) { + LOG_ERR("ISR while still reading old data"); + return false; + } callback = cb; uint8_t cmd[2] = {0xC0, 0x00}; uint16_t status; @@ -260,8 +268,9 @@ bool FPGA::InitiateSampleRead(ReadCallback cb) { High(CS); if (halted) { - if (halted_cb) { + if (halted && halted_cb) { halted_cb(); + halted = false; } } else { LOG_WARN("ISR without new data, status: 0x%04x", status); @@ -270,6 +279,7 @@ bool FPGA::InitiateSampleRead(ReadCallback cb) { } // Start data read + busy_reading = true; HAL_SPI_Receive_DMA(&FPGA_SPI, raw, 36); return true; } @@ -283,8 +293,6 @@ static int64_t assembleSampleResultValue(uint8_t *raw) { extern "C" { void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi) { - FPGA::SamplingResult result; - High(CS); // Assemble data from words result.P1I = assembleSampleResultValue(&raw[30]); result.P1Q = assembleSampleResultValue(&raw[24]); @@ -292,11 +300,16 @@ void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi) { result.P2Q = assembleSampleResultValue(&raw[12]); result.RefI = assembleSampleResultValue(&raw[6]); result.RefQ = assembleSampleResultValue(&raw[0]); - if (callback) { + High(CS); + busy_reading = false; + new_sample = true; + if (new_sample && callback) { callback(result); + new_sample = false; } if (halted && halted_cb) { halted_cb(); + halted = false; } } } @@ -319,18 +332,24 @@ void FPGA::SetMode(Mode mode) { Low(AUX2); Delay::us(1); High(CS); + // Configure SPI to use faster speed of 32MHz + FPGA_SPI.Instance->CR1 = (FPGA_SPI.Instance->CR1 & ~SPI_CR1_BR_Msk) | SPI_BAUDRATEPRESCALER_4; break; case Mode::SourcePLL: Low(CS); Low(AUX2); Delay::us(1); High(AUX1); + // Configure SPI to use slower speed of 16MHz (MAX2871 is limited to 20MHz) + FPGA_SPI.Instance->CR1 = (FPGA_SPI.Instance->CR1 & ~SPI_CR1_BR_Msk) | SPI_BAUDRATEPRESCALER_8; break; case Mode::LOPLL: Low(CS); Low(AUX1); Delay::us(1); High(AUX2); + // Configure SPI to use slower speed of 16MHz (MAX2871 is limited to 20MHz) + FPGA_SPI.Instance->CR1 = (FPGA_SPI.Instance->CR1 & ~SPI_CR1_BR_Msk) | SPI_BAUDRATEPRESCALER_8; break; } Delay::us(1); diff --git a/Software/VNA_embedded/Application/Drivers/FPGA/FPGA.hpp b/Software/VNA_embedded/Application/Drivers/FPGA/FPGA.hpp index ce6aa34..0b2f326 100644 --- a/Software/VNA_embedded/Application/Drivers/FPGA/FPGA.hpp +++ b/Software/VNA_embedded/Application/Drivers/FPGA/FPGA.hpp @@ -78,11 +78,11 @@ enum class SettlingTime { enum class Samples { SPPRegister = 0x00, - S128 = 0x01, - S384 = 0x02, - S896 = 0x03, - S3072 = 0x04, - S9088 = 0x05, + S96 = 0x01, + S304 = 0x02, + S912 = 0x03, + S3040 = 0x04, + S9136 = 0x05, S30464 = 0x06, S91392 = 0x07, }; diff --git a/Software/VNA_embedded/Application/Drivers/Log.cpp b/Software/VNA_embedded/Application/Drivers/Log.cpp index 1f368bd..858a070 100644 --- a/Software/VNA_embedded/Application/Drivers/Log.cpp +++ b/Software/VNA_embedded/Application/Drivers/Log.cpp @@ -79,7 +79,7 @@ void Log_Init() { #endif /* USART interrupt Init */ - HAL_NVIC_SetPriority(NVIC_ISR, 5, 0); + HAL_NVIC_SetPriority(NVIC_ISR, 0, 0); HAL_NVIC_EnableIRQ(NVIC_ISR); } diff --git a/Software/VNA_embedded/Application/Drivers/USB/usb.c b/Software/VNA_embedded/Application/Drivers/USB/usb.c index 52f9270..adcad8f 100644 --- a/Software/VNA_embedded/Application/Drivers/USB/usb.c +++ b/Software/VNA_embedded/Application/Drivers/USB/usb.c @@ -187,9 +187,9 @@ void usb_init(usbd_callback_t callback) { USBD_Init(&hUsbDeviceFS, &FS_Desc, 0); USBD_RegisterClass(&hUsbDeviceFS, &USBD_ClassDriver); USBD_Start(&hUsbDeviceFS); - HAL_NVIC_SetPriority(USB_HP_IRQn, 6, 0); + HAL_NVIC_SetPriority(USB_HP_IRQn, 7, 0); HAL_NVIC_EnableIRQ(USB_HP_IRQn); - HAL_NVIC_SetPriority(USB_LP_IRQn, 6, 0); + HAL_NVIC_SetPriority(USB_LP_IRQn, 7, 0); HAL_NVIC_EnableIRQ(USB_LP_IRQn); } diff --git a/Software/VNA_embedded/Application/Drivers/stm.cpp b/Software/VNA_embedded/Application/Drivers/stm.cpp new file mode 100644 index 0000000..def6d9c --- /dev/null +++ b/Software/VNA_embedded/Application/Drivers/stm.cpp @@ -0,0 +1,50 @@ +#include "stm.hpp" + +using Callback = void(*)(void); +static constexpr uint8_t numCallbacks = 10; +static Callback callbacks[numCallbacks]; +uint8_t read_index, write_index; + +static void increment(uint8_t &index) { + if(index < numCallbacks - 1) { + index++; + } else { + index = 0; + } +} +static uint8_t callbackFifoLevel() { + int8_t level = (int8_t) write_index - (int8_t) read_index; + if(level < 0) { + level += numCallbacks; + } + return (uint8_t) level; +} + +void STM::Init() { + read_index = write_index = 0; + HAL_NVIC_SetPriority(COMP4_IRQn, 6, 0); + HAL_NVIC_EnableIRQ(COMP4_IRQn); +} + +bool STM::DispatchToInterrupt(void (*cb)(void)) { + if(callbackFifoLevel() < numCallbacks - 1) { + callbacks[write_index] = cb; + increment(write_index); + HAL_NVIC_SetPendingIRQ(COMP4_IRQn); + return true; + } else { + // already at limit + return false; + } +} + +extern "C" { +void COMP4_IRQHandler() { + while(callbackFifoLevel() > 0) { + if (callbacks[read_index]) { + callbacks[read_index](); + } + increment(read_index); + } +} +} diff --git a/Software/VNA_embedded/Application/Drivers/stm.hpp b/Software/VNA_embedded/Application/Drivers/stm.hpp index 9feb2e7..769407f 100644 --- a/Software/VNA_embedded/Application/Drivers/stm.hpp +++ b/Software/VNA_embedded/Application/Drivers/stm.hpp @@ -7,6 +7,13 @@ extern ADC_HandleTypeDef hadc1; namespace STM { +void Init(); +// No FreeRTOS function calls are allowed from interrupts with higher priorities than 5. +// Certain parts of the data acquisition need higher priorities (so they don't get interrupted by FreeRTOS) +// but they also need to trigger FreeRTOS functions. This can be achieved by dispatching a function-pointer +// to a lower priority interrupt. The passed function can then handle the FreeRTOS function call +bool DispatchToInterrupt(void (*cb)(void)); + static inline bool InInterrupt() { return (SCB->ICSR & SCB_ICSR_VECTACTIVE_Msk) != 0; } diff --git a/Software/VNA_embedded/Application/Hardware.cpp b/Software/VNA_embedded/Application/Hardware.cpp index 4f7e4bc..56937b2 100644 --- a/Software/VNA_embedded/Application/Hardware.cpp +++ b/Software/VNA_embedded/Application/Hardware.cpp @@ -48,7 +48,7 @@ static void ReadComplete(FPGA::SamplingResult result) { break; } if(needs_work && requestWork) { - requestWork(); + STM::DispatchToInterrupt(requestWork); } } @@ -120,8 +120,8 @@ bool HW::Init(WorkRequest wr) { } // Set default ADC samplerate - FPGA::WriteRegister(FPGA::Reg::ADCPrescaler, 112); - FPGA::WriteRegister(FPGA::Reg::PhaseIncrement, 1120); + FPGA::WriteRegister(FPGA::Reg::ADCPrescaler, 128); + FPGA::WriteRegister(FPGA::Reg::PhaseIncrement, 1280); // Enable new data and sweep halt interrupt FPGA::EnableInterrupt(FPGA::Interrupt::NewData); diff --git a/Software/VNA_embedded/Application/Hardware.hpp b/Software/VNA_embedded/Application/Hardware.hpp index 68bddac..28657ae 100644 --- a/Software/VNA_embedded/Application/Hardware.hpp +++ b/Software/VNA_embedded/Application/Hardware.hpp @@ -5,12 +5,26 @@ namespace HW { -static constexpr uint32_t ADCSamplerate = 914000; +static constexpr uint32_t ADCSamplerate = 800000; static constexpr uint32_t IF1 = 60000000; static constexpr uint32_t IF2 = 250000; static constexpr uint32_t LO1_minFreq = 25000000; static constexpr uint32_t MaxSamples = 130944; +static constexpr uint32_t MinSamples = 16; static constexpr uint32_t PLLRef = 100000000; +static constexpr uint16_t MaxPoints = 4501; + +static constexpr Protocol::DeviceLimits Limits = { + .minFreq = 1000000, + .maxFreq = 6000000000, + .minIFBW = ADCSamplerate / MaxSamples, + .maxIFBW = ADCSamplerate / MinSamples, + .maxPoints = MaxPoints, + .cdbm_min = -4000, + .cdbm_max = -1000, + .minRBW = (uint32_t) (ADCSamplerate * 2.23f / MaxSamples), + .maxRBW = (uint32_t) (ADCSamplerate * 2.23f / MinSamples), +}; enum class Mode { Idle, diff --git a/Software/VNA_embedded/Application/SpectrumAnalyzer.cpp b/Software/VNA_embedded/Application/SpectrumAnalyzer.cpp index e79db7d..48f6527 100644 --- a/Software/VNA_embedded/Application/SpectrumAnalyzer.cpp +++ b/Software/VNA_embedded/Application/SpectrumAnalyzer.cpp @@ -4,6 +4,8 @@ #include #include #include "Communication.h" +#include "FreeRTOS.h" +#include "task.h" #define LOG_LEVEL LOG_LEVEL_DEBUG #define LOG_MODULE "SA" @@ -104,9 +106,10 @@ static void StartNextSample() { void SA::Setup(Protocol::SpectrumAnalyzerSettings settings) { LOG_DEBUG("Setting up..."); + SA::Stop(); + vTaskDelay(5); s = settings; HW::SetMode(HW::Mode::SA); - FPGA::AbortSweep(); FPGA::SetMode(FPGA::Mode::FPGA); // in almost all cases a full sweep requires more points than the FPGA can handle at a time // individually start each point and do the sweep in the uC @@ -115,8 +118,10 @@ void SA::Setup(Protocol::SpectrumAnalyzerSettings settings) { // see https://www.tek.com/blog/window-functions-spectrum-analyzers for window factors constexpr float window_factors[4] = {0.89f, 2.23f, 1.44f, 3.77f}; sampleNum = HW::ADCSamplerate * window_factors[s.WindowType] / s.RBW; - // round up to next multiple of 128 - sampleNum += 128 - sampleNum%128; + // round up to next multiple of 16 + if(sampleNum%16) { + sampleNum += 16 - sampleNum%16; + } if(sampleNum >= HW::MaxSamples) { sampleNum = HW::MaxSamples; } @@ -148,6 +153,7 @@ bool SA::MeasurementDone(FPGA::SamplingResult result) { if(!active) { return false; } + FPGA::AbortSweep(); float port1 = abs(std::complex(result.P1I, result.P1Q))/sampleNum; float port2 = abs(std::complex(result.P2I, result.P2Q))/sampleNum; if(port1 < port1Measurement) { diff --git a/Software/VNA_embedded/Application/VNA.cpp b/Software/VNA_embedded/Application/VNA.cpp index ee1e7ce..686eae5 100644 --- a/Software/VNA_embedded/Application/VNA.cpp +++ b/Software/VNA_embedded/Application/VNA.cpp @@ -9,6 +9,8 @@ #include "Exti.hpp" #include "Hardware.hpp" #include "Communication.h" +#include "FreeRTOS.h" +#include "task.h" #define LOG_LEVEL LOG_LEVEL_INFO #define LOG_MODULE "VNA" @@ -35,6 +37,8 @@ static constexpr uint32_t BandSwitchFrequency = 25000000; using namespace HWHAL; bool VNA::Setup(Protocol::SweepSettings s, SweepCallback cb) { + VNA::Stop(); + vTaskDelay(5); HW::SetMode(HW::Mode::VNA); if(s.excitePort1 == 0 && s.excitePort2 == 0) { // both ports disabled, nothing to do @@ -45,14 +49,15 @@ bool VNA::Setup(Protocol::SweepSettings s, SweepCallback cb) { sweepCallback = cb; settings = s; // Abort possible active sweep first - FPGA::AbortSweep(); FPGA::SetMode(FPGA::Mode::FPGA); uint16_t points = settings.points <= FPGA::MaxPoints ? settings.points : FPGA::MaxPoints; // Configure sweep FPGA::SetNumberOfPoints(points); uint32_t samplesPerPoint = (HW::ADCSamplerate / s.if_bandwidth); - // round up to next multiple of 128 (128 samples are spread across 35 IF2 periods) - samplesPerPoint = ((uint32_t) ((samplesPerPoint + 127) / 128)) * 128; + // round up to next multiple of 16 (16 samples are spread across 5 IF2 periods) + if(samplesPerPoint%16) { + samplesPerPoint += 16 - samplesPerPoint%16; + } uint32_t actualBandwidth = HW::ADCSamplerate / samplesPerPoint; // has to be one less than actual number of samples FPGA::SetSamplesPerPoint(samplesPerPoint); @@ -76,10 +81,8 @@ bool VNA::Setup(Protocol::SweepSettings s, SweepCallback cb) { bool last_lowband = false; - if(!s.suppressPeaks) { - // invalidate first entry of IFTable, preventing switing of 2.LO in halted callback - IFTable[0].pointCnt = 0xFFFF; - } + // invalidate first entry of IFTable, preventing switing of 2.LO in halted callback + IFTable[0].pointCnt = 0xFFFF; // Transfer PLL configuration to FPGA for (uint16_t i = 0; i < points; i++) { @@ -122,7 +125,7 @@ bool VNA::Setup(Protocol::SweepSettings s, SweepCallback cb) { Si5351.SetCLK(SiChannel::RefLO2, last_LO2, Si5351C::PLL::B, Si5351C::DriveStrength::mA2); // store calculated clock configuration for later change - Si5351.ReadRawCLKConfig(1, IFTable[IFTableIndexCnt].clkconfig); + Si5351.ReadRawCLKConfig(SiChannel::RefLO2, IFTable[IFTableIndexCnt].clkconfig); IFTableIndexCnt++; needs_LO2_shift = false; } @@ -165,6 +168,12 @@ bool VNA::Setup(Protocol::SweepSettings s, SweepCallback cb) { return true; } +static void PassOnData() { + if (sweepCallback) { + sweepCallback(data); + } +} + bool VNA::MeasurementDone(FPGA::SamplingResult result) { if(!active) { return false; @@ -200,9 +209,7 @@ bool VNA::MeasurementDone(FPGA::SamplingResult result) { pointComplete = true; } if(pointComplete) { - if (sweepCallback) { - sweepCallback(data); - } + STM::DispatchToInterrupt(PassOnData); pointCnt++; if (pointCnt >= settings.points) { // reached end of sweep, start again @@ -258,6 +265,7 @@ void VNA::SweepHalted() { // First point in sweep, enable CLK Si5351.Enable(SiChannel::LowbandSource); FPGA::Disable(FPGA::Periphery::SourceRF); + Delay::us(1300); } } else if(!FPGA::IsEnabled(FPGA::Periphery::SourceRF)){ // first sweep point in highband is also halted, disable lowband source diff --git a/Software/VNA_embedded/Src/main.c b/Software/VNA_embedded/Src/main.c index dd56029..5b0292e 100644 --- a/Software/VNA_embedded/Src/main.c +++ b/Software/VNA_embedded/Src/main.c @@ -189,18 +189,19 @@ void SystemClock_Config(void) /** Configure the main internal regulator output voltage */ - HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1); + HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1_BOOST); /** Initializes the CPU, AHB and APB busses clocks */ - RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_HSI48; RCC_OscInitStruct.HSIState = RCC_HSI_ON; RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; + RCC_OscInitStruct.HSI48State = RCC_HSI48_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; - RCC_OscInitStruct.PLL.PLLM = RCC_PLLM_DIV2; - RCC_OscInitStruct.PLL.PLLN = 36; + RCC_OscInitStruct.PLL.PLLM = RCC_PLLM_DIV4; + RCC_OscInitStruct.PLL.PLLN = 80; RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; - RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV6; + RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV4; RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { @@ -225,7 +226,7 @@ void SystemClock_Config(void) |RCC_PERIPHCLK_USB|RCC_PERIPHCLK_ADC12; PeriphClkInit.Usart3ClockSelection = RCC_USART3CLKSOURCE_PCLK1; PeriphClkInit.I2c2ClockSelection = RCC_I2C2CLKSOURCE_PCLK1; - PeriphClkInit.UsbClockSelection = RCC_USBCLKSOURCE_PLL; + PeriphClkInit.UsbClockSelection = RCC_USBCLKSOURCE_HSI48; PeriphClkInit.Adc12ClockSelection = RCC_ADC12CLKSOURCE_SYSCLK; if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) { @@ -314,7 +315,7 @@ static void MX_I2C2_Init(void) /* USER CODE END I2C2_Init 1 */ hi2c2.Instance = I2C2; - hi2c2.Init.Timing = 0x00E057FD; + hi2c2.Init.Timing = 0x00F07BFF; hi2c2.Init.OwnAddress1 = 0; hi2c2.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; hi2c2.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; @@ -367,7 +368,7 @@ static void MX_SPI1_Init(void) hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; hspi1.Init.NSS = SPI_NSS_SOFT; - hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16; + hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4; hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; hspi1.Init.TIMode = SPI_TIMODE_DISABLE; hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; @@ -407,7 +408,7 @@ static void MX_SPI2_Init(void) hspi2.Init.CLKPolarity = SPI_POLARITY_LOW; hspi2.Init.CLKPhase = SPI_PHASE_1EDGE; hspi2.Init.NSS = SPI_NSS_SOFT; - hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16; + hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4; hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB; hspi2.Init.TIMode = SPI_TIMODE_DISABLE; hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; @@ -444,7 +445,7 @@ static void MX_TIM1_Init(void) /* USER CODE END TIM1_Init 1 */ htim1.Instance = TIM1; - htim1.Init.Prescaler = 143; + htim1.Init.Prescaler = 159; htim1.Init.CounterMode = TIM_COUNTERMODE_UP; htim1.Init.Period = 65535; htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; @@ -589,7 +590,7 @@ static void MX_UCPD1_Init(void) LL_DMA_SetMemorySize(DMA1, LL_DMA_CHANNEL_2, LL_DMA_MDATAALIGN_BYTE); /* UCPD1 interrupt Init */ - NVIC_SetPriority(UCPD1_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),6, 0)); + NVIC_SetPriority(UCPD1_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),7, 0)); NVIC_EnableIRQ(UCPD1_IRQn); /* USER CODE BEGIN UCPD1_Init 1 */ @@ -693,16 +694,16 @@ static void MX_DMA_Init(void) /* DMA interrupt init */ /* DMA1_Channel1_IRQn interrupt configuration */ - NVIC_SetPriority(DMA1_Channel1_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),6, 0)); + NVIC_SetPriority(DMA1_Channel1_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),7, 0)); NVIC_EnableIRQ(DMA1_Channel1_IRQn); /* DMA1_Channel2_IRQn interrupt configuration */ - NVIC_SetPriority(DMA1_Channel2_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),6, 0)); + NVIC_SetPriority(DMA1_Channel2_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),7, 0)); NVIC_EnableIRQ(DMA1_Channel2_IRQn); /* DMA1_Channel3_IRQn interrupt configuration */ - HAL_NVIC_SetPriority(DMA1_Channel3_IRQn, 6, 0); + HAL_NVIC_SetPriority(DMA1_Channel3_IRQn, 2, 0); HAL_NVIC_EnableIRQ(DMA1_Channel3_IRQn); /* DMA1_Channel4_IRQn interrupt configuration */ - HAL_NVIC_SetPriority(DMA1_Channel4_IRQn, 6, 0); + HAL_NVIC_SetPriority(DMA1_Channel4_IRQn, 2, 0); HAL_NVIC_EnableIRQ(DMA1_Channel4_IRQn); } @@ -744,15 +745,15 @@ static void MX_GPIO_Init(void) GPIO_InitStruct.Pin = FPGA_AUX1_Pin|FPGA_AUX3_Pin|FPGA_AUX2_Pin|FPGA_CS_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); - /*Configure GPIO pins : FLASH_CS_Pin FPGA_PROGRAM_B_Pin EN_6V_Pin FPGA_RESET_Pin */ - GPIO_InitStruct.Pin = FLASH_CS_Pin|FPGA_PROGRAM_B_Pin|EN_6V_Pin|FPGA_RESET_Pin; + /*Configure GPIO pin : FLASH_CS_Pin */ + GPIO_InitStruct.Pin = FLASH_CS_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + HAL_GPIO_Init(FLASH_CS_GPIO_Port, &GPIO_InitStruct); /*Configure GPIO pin : FPGA_INTR_Pin */ GPIO_InitStruct.Pin = FPGA_INTR_Pin; @@ -760,6 +761,13 @@ static void MX_GPIO_Init(void) GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(FPGA_INTR_GPIO_Port, &GPIO_InitStruct); + /*Configure GPIO pins : FPGA_PROGRAM_B_Pin EN_6V_Pin FPGA_RESET_Pin */ + GPIO_InitStruct.Pin = FPGA_PROGRAM_B_Pin|EN_6V_Pin|FPGA_RESET_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + /*Configure GPIO pin : FPGA_DONE_Pin */ GPIO_InitStruct.Pin = FPGA_DONE_Pin; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; diff --git a/Software/VNA_embedded/Src/stm32g4xx_hal_msp.c b/Software/VNA_embedded/Src/stm32g4xx_hal_msp.c index 4b539b6..6461839 100644 --- a/Software/VNA_embedded/Src/stm32g4xx_hal_msp.c +++ b/Software/VNA_embedded/Src/stm32g4xx_hal_msp.c @@ -229,7 +229,7 @@ void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi) GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF5_SPI1; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); @@ -243,7 +243,7 @@ void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi) hdma_spi1_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; hdma_spi1_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; hdma_spi1_rx.Init.Mode = DMA_NORMAL; - hdma_spi1_rx.Init.Priority = DMA_PRIORITY_LOW; + hdma_spi1_rx.Init.Priority = DMA_PRIORITY_VERY_HIGH; if (HAL_DMA_Init(&hdma_spi1_rx) != HAL_OK) { Error_Handler(); @@ -260,7 +260,7 @@ void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi) hdma_spi1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; hdma_spi1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; hdma_spi1_tx.Init.Mode = DMA_NORMAL; - hdma_spi1_tx.Init.Priority = DMA_PRIORITY_LOW; + hdma_spi1_tx.Init.Priority = DMA_PRIORITY_VERY_HIGH; if (HAL_DMA_Init(&hdma_spi1_tx) != HAL_OK) { Error_Handler(); @@ -288,7 +288,7 @@ void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi) GPIO_InitStruct.Pin = GPIO_PIN_13|GPIO_PIN_15; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF5_SPI2; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); diff --git a/Software/VNA_embedded/VNA_embedded.ioc b/Software/VNA_embedded/VNA_embedded.ioc index a7fffbb..216ce98 100644 --- a/Software/VNA_embedded/VNA_embedded.ioc +++ b/Software/VNA_embedded/VNA_embedded.ioc @@ -20,7 +20,7 @@ Dma.SPI1_RX.2.Mode=DMA_NORMAL Dma.SPI1_RX.2.PeriphDataAlignment=DMA_PDATAALIGN_BYTE Dma.SPI1_RX.2.PeriphInc=DMA_PINC_DISABLE Dma.SPI1_RX.2.Polarity=HAL_DMAMUX_REQ_GEN_RISING -Dma.SPI1_RX.2.Priority=DMA_PRIORITY_LOW +Dma.SPI1_RX.2.Priority=DMA_PRIORITY_VERY_HIGH Dma.SPI1_RX.2.RequestNumber=1 Dma.SPI1_RX.2.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority,SignalID,Polarity,RequestNumber,SyncSignalID,SyncPolarity,SyncEnable,EventEnable,SyncRequestNumber Dma.SPI1_RX.2.SignalID=NONE @@ -37,7 +37,7 @@ Dma.SPI1_TX.3.Mode=DMA_NORMAL Dma.SPI1_TX.3.PeriphDataAlignment=DMA_PDATAALIGN_BYTE Dma.SPI1_TX.3.PeriphInc=DMA_PINC_DISABLE Dma.SPI1_TX.3.Polarity=HAL_DMAMUX_REQ_GEN_RISING -Dma.SPI1_TX.3.Priority=DMA_PRIORITY_LOW +Dma.SPI1_TX.3.Priority=DMA_PRIORITY_VERY_HIGH Dma.SPI1_TX.3.RequestNumber=1 Dma.SPI1_TX.3.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority,SignalID,Polarity,RequestNumber,SyncSignalID,SyncPolarity,SyncEnable,EventEnable,SyncRequestNumber Dma.SPI1_TX.3.SignalID=NONE @@ -94,7 +94,7 @@ FREERTOS.configUSE_MUTEXES=1 File.Version=6 I2C2.I2C_Speed_Mode=I2C_Fast I2C2.IPParameters=Timing,I2C_Speed_Mode -I2C2.Timing=0x00E057FD +I2C2.Timing=0x00F07BFF KeepUserPlacement=false Mcu.Family=STM32G4 Mcu.IP0=ADC1 @@ -158,10 +158,10 @@ Mcu.UserName=STM32G431CBUx MxCube.Version=5.2.1 MxDb.Version=DB.5.0.21 NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false -NVIC.DMA1_Channel1_IRQn=true\:6\:0\:true\:false\:true\:true\:false\:true -NVIC.DMA1_Channel2_IRQn=true\:6\:0\:true\:false\:true\:true\:false\:true -NVIC.DMA1_Channel3_IRQn=true\:6\:0\:true\:false\:true\:true\:false\:true -NVIC.DMA1_Channel4_IRQn=true\:6\:0\:true\:false\:true\:true\:false\:true +NVIC.DMA1_Channel1_IRQn=true\:7\:0\:true\:false\:true\:true\:false\:true +NVIC.DMA1_Channel2_IRQn=true\:7\:0\:true\:false\:true\:true\:false\:true +NVIC.DMA1_Channel3_IRQn=true\:2\:0\:true\:false\:true\:false\:false\:true +NVIC.DMA1_Channel4_IRQn=true\:2\:0\:true\:false\:true\:false\:false\:true NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false NVIC.MemoryManagement_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false @@ -173,10 +173,11 @@ NVIC.SysTick_IRQn=true\:15\:0\:false\:false\:false\:true\:false\:true NVIC.TIM1_TRG_COM_TIM17_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:true NVIC.TimeBase=TIM1_TRG_COM_TIM17_IRQn NVIC.TimeBaseIP=TIM17 -NVIC.UCPD1_IRQn=true\:6\:0\:true\:false\:true\:true\:true\:false +NVIC.UCPD1_IRQn=true\:7\:0\:true\:false\:true\:true\:true\:false NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false -PA1.GPIOParameters=GPIO_Label +PA1.GPIOParameters=GPIO_Speed,GPIO_Label PA1.GPIO_Label=FPGA_AUX1 +PA1.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH PA1.Locked=true PA1.Signal=GPIO_Output PA10.Locked=true @@ -196,25 +197,34 @@ PA14.Mode=Serial_Wire PA14.Signal=SYS_JTCK-SWCLK PA15.Locked=true PA15.Signal=S_TIM2_CH1 -PA2.GPIOParameters=GPIO_Label +PA2.GPIOParameters=GPIO_Speed,GPIO_Label PA2.GPIO_Label=FPGA_AUX3 +PA2.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH PA2.Locked=true PA2.Signal=GPIO_Output -PA3.GPIOParameters=GPIO_Label +PA3.GPIOParameters=GPIO_Speed,GPIO_Label PA3.GPIO_Label=FPGA_AUX2 +PA3.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH PA3.Locked=true PA3.Signal=GPIO_Output -PA4.GPIOParameters=PinState,GPIO_Label +PA4.GPIOParameters=GPIO_Speed,PinState,GPIO_Label PA4.GPIO_Label=FPGA_CS +PA4.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH PA4.Locked=true PA4.PinState=GPIO_PIN_SET PA4.Signal=GPIO_Output +PA5.GPIOParameters=GPIO_Speed +PA5.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH PA5.Locked=true PA5.Mode=Full_Duplex_Master PA5.Signal=SPI1_SCK +PA6.GPIOParameters=GPIO_Speed +PA6.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH PA6.Locked=true PA6.Mode=Full_Duplex_Master PA6.Signal=SPI1_MISO +PA7.GPIOParameters=GPIO_Speed +PA7.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH PA7.Locked=true PA7.Mode=Full_Duplex_Master PA7.Signal=SPI1_MOSI @@ -224,8 +234,9 @@ PA8.Signal=I2C2_SDA PA9.Locked=true PA9.Mode=EnableDeadBattery PA9.Signal=UCPD1_DBCC1 -PB0.GPIOParameters=PinState,GPIO_Label +PB0.GPIOParameters=GPIO_Speed,PinState,GPIO_Label PB0.GPIO_Label=FLASH_CS +PB0.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH PB0.Locked=true PB0.PinState=GPIO_PIN_SET PB0.Signal=GPIO_Output @@ -239,9 +250,13 @@ PB12.GPIOParameters=GPIO_Label PB12.GPIO_Label=EN_6V PB12.Locked=true PB12.Signal=GPIO_Output +PB13.GPIOParameters=GPIO_Speed +PB13.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH PB13.Locked=true PB13.Mode=TX_Only_Simplex_Unidirect_Master PB13.Signal=SPI2_SCK +PB15.GPIOParameters=GPIO_Speed +PB15.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH PB15.Locked=true PB15.Mode=TX_Only_Simplex_Unidirect_Master PB15.Signal=SPI2_MOSI @@ -308,65 +323,66 @@ ProjectManager.StackSize=0x400 ProjectManager.TargetToolchain=SW4STM32 ProjectManager.ToolChainLocation= ProjectManager.UnderRoot=true -ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-MX_DMA_Init-DMA-false-HAL-true,3-SystemClock_Config-RCC-false-HAL-false,4-MX_I2C2_Init-I2C2-false-HAL-true,5-MX_SPI1_Init-SPI1-false-HAL-true,6-MX_SPI2_Init-SPI2-false-HAL-true,7-MX_UCPD1_Init-UCPD1-false-LL-true,8-MX_USART3_UART_Init-USART3-false-HAL-true,9-MX_USB_PCD_Init-USB-false-HAL-true,10-MX_USBPD_Init-USBPD-false-HAL-true,11-MX_TIM1_Init-TIM1-false-HAL-true,12-MX_TIM2_Init-TIM2-false-HAL-true -RCC.ADC12Freq_Value=144000000 -RCC.AHBFreq_Value=144000000 -RCC.APB1Freq_Value=144000000 -RCC.APB1TimFreq_Value=144000000 -RCC.APB2Freq_Value=144000000 -RCC.APB2TimFreq_Value=144000000 +ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-MX_DMA_Init-DMA-false-HAL-true,3-SystemClock_Config-RCC-false-HAL-false,4-MX_I2C2_Init-I2C2-false-HAL-true,5-MX_SPI1_Init-SPI1-false-HAL-true,6-MX_SPI2_Init-SPI2-false-HAL-true,7-MX_UCPD1_Init-UCPD1-false-LL-true,8-MX_USART3_UART_Init-USART3-false-HAL-true,9-MX_USB_PCD_Init-USB-false-HAL-true,10-MX_USBPD_Init-USBPD-false-HAL-true,11-MX_TIM1_Init-TIM1-false-HAL-true,12-MX_TIM2_Init-TIM2-false-HAL-true,13-MX_ADC1_Init-ADC1-false-HAL-true +RCC.ADC12Freq_Value=160000000 +RCC.AHBFreq_Value=160000000 +RCC.APB1Freq_Value=160000000 +RCC.APB1TimFreq_Value=160000000 +RCC.APB2Freq_Value=160000000 +RCC.APB2TimFreq_Value=160000000 +RCC.CK48CLockSelection=RCC_USBCLKSOURCE_HSI48 RCC.CRSFreq_Value=48000000 -RCC.CortexFreq_Value=144000000 +RCC.CortexFreq_Value=160000000 RCC.EXTERNAL_CLOCK_VALUE=12288000 -RCC.FCLKCortexFreq_Value=144000000 -RCC.FDCANFreq_Value=144000000 +RCC.FCLKCortexFreq_Value=160000000 +RCC.FDCANFreq_Value=160000000 RCC.FamilyName=M -RCC.HCLKFreq_Value=144000000 +RCC.HCLKFreq_Value=160000000 RCC.HSE_VALUE=8000000 RCC.HSI48_VALUE=48000000 RCC.HSI_VALUE=16000000 -RCC.I2C1Freq_Value=144000000 -RCC.I2C2Freq_Value=144000000 -RCC.I2C3Freq_Value=144000000 -RCC.I2SFreq_Value=144000000 -RCC.IPParameters=ADC12Freq_Value,AHBFreq_Value,APB1Freq_Value,APB1TimFreq_Value,APB2Freq_Value,APB2TimFreq_Value,CRSFreq_Value,CortexFreq_Value,EXTERNAL_CLOCK_VALUE,FCLKCortexFreq_Value,FDCANFreq_Value,FamilyName,HCLKFreq_Value,HSE_VALUE,HSI48_VALUE,HSI_VALUE,I2C1Freq_Value,I2C2Freq_Value,I2C3Freq_Value,I2SFreq_Value,LPTIM1Freq_Value,LPUART1Freq_Value,LSCOPinFreq_Value,LSE_VALUE,LSI_VALUE,MCO1PinFreq_Value,PLLM,PLLN,PLLPoutputFreq_Value,PLLQ,PLLQoutputFreq_Value,PLLRCLKFreq_Value,PWRFreq_Value,RNGFreq_Value,SAI1Freq_Value,SYSCLKFreq_VALUE,SYSCLKSource,UART4Freq_Value,USART1Freq_Value,USART2Freq_Value,USART3Freq_Value,USBFreq_Value,VCOInputFreq_Value,VCOOutputFreq_Value -RCC.LPTIM1Freq_Value=144000000 -RCC.LPUART1Freq_Value=144000000 +RCC.I2C1Freq_Value=160000000 +RCC.I2C2Freq_Value=160000000 +RCC.I2C3Freq_Value=160000000 +RCC.I2SFreq_Value=160000000 +RCC.IPParameters=ADC12Freq_Value,AHBFreq_Value,APB1Freq_Value,APB1TimFreq_Value,APB2Freq_Value,APB2TimFreq_Value,CK48CLockSelection,CRSFreq_Value,CortexFreq_Value,EXTERNAL_CLOCK_VALUE,FCLKCortexFreq_Value,FDCANFreq_Value,FamilyName,HCLKFreq_Value,HSE_VALUE,HSI48_VALUE,HSI_VALUE,I2C1Freq_Value,I2C2Freq_Value,I2C3Freq_Value,I2SFreq_Value,LPTIM1Freq_Value,LPUART1Freq_Value,LSCOPinFreq_Value,LSE_VALUE,LSI_VALUE,MCO1PinFreq_Value,PLLM,PLLN,PLLPoutputFreq_Value,PLLQ,PLLQoutputFreq_Value,PLLRCLKFreq_Value,PWRFreq_Value,RNGFreq_Value,SAI1Freq_Value,SYSCLKFreq_VALUE,SYSCLKSource,UART4Freq_Value,USART1Freq_Value,USART2Freq_Value,USART3Freq_Value,USBFreq_Value,VCOInputFreq_Value,VCOOutputFreq_Value +RCC.LPTIM1Freq_Value=160000000 +RCC.LPUART1Freq_Value=160000000 RCC.LSCOPinFreq_Value=32000 RCC.LSE_VALUE=32768 RCC.LSI_VALUE=32000 RCC.MCO1PinFreq_Value=16000000 -RCC.PLLM=RCC_PLLM_DIV2 -RCC.PLLN=36 -RCC.PLLPoutputFreq_Value=144000000 -RCC.PLLQ=RCC_PLLQ_DIV6 -RCC.PLLQoutputFreq_Value=48000000 -RCC.PLLRCLKFreq_Value=144000000 -RCC.PWRFreq_Value=144000000 +RCC.PLLM=RCC_PLLM_DIV4 +RCC.PLLN=80 +RCC.PLLPoutputFreq_Value=160000000 +RCC.PLLQ=RCC_PLLQ_DIV4 +RCC.PLLQoutputFreq_Value=80000000 +RCC.PLLRCLKFreq_Value=160000000 +RCC.PWRFreq_Value=160000000 RCC.RNGFreq_Value=48000000 -RCC.SAI1Freq_Value=144000000 -RCC.SYSCLKFreq_VALUE=144000000 +RCC.SAI1Freq_Value=160000000 +RCC.SYSCLKFreq_VALUE=160000000 RCC.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK -RCC.UART4Freq_Value=144000000 -RCC.USART1Freq_Value=144000000 -RCC.USART2Freq_Value=144000000 -RCC.USART3Freq_Value=144000000 +RCC.UART4Freq_Value=160000000 +RCC.USART1Freq_Value=160000000 +RCC.USART2Freq_Value=160000000 +RCC.USART3Freq_Value=160000000 RCC.USBFreq_Value=48000000 -RCC.VCOInputFreq_Value=8000000 -RCC.VCOOutputFreq_Value=288000000 +RCC.VCOInputFreq_Value=4000000 +RCC.VCOOutputFreq_Value=320000000 SH.GPXTI1.0=GPIO_EXTI1 SH.GPXTI1.ConfNb=1 SH.S_TIM2_CH1.0=TIM2_CH1,PWM Generation1 CH1 SH.S_TIM2_CH1.ConfNb=1 -SPI1.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_16 -SPI1.CalculateBaudRate=9.0 MBits/s +SPI1.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_4 +SPI1.CalculateBaudRate=40.0 MBits/s SPI1.DataSize=SPI_DATASIZE_8BIT SPI1.Direction=SPI_DIRECTION_2LINES SPI1.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate,BaudRatePrescaler,DataSize SPI1.Mode=SPI_MODE_MASTER SPI1.VirtualType=VM_MASTER -SPI2.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_16 -SPI2.CalculateBaudRate=9.0 MBits/s +SPI2.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_4 +SPI2.CalculateBaudRate=40.0 MBits/s SPI2.DataSize=SPI_DATASIZE_8BIT SPI2.Direction=SPI_DIRECTION_2LINES SPI2.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate,BaudRatePrescaler,DataSize @@ -374,7 +390,7 @@ SPI2.Mode=SPI_MODE_MASTER SPI2.VirtualType=VM_MASTER TIM1.IPParameters=Prescaler,PeriodNoDither TIM1.PeriodNoDither=65535 -TIM1.Prescaler=143 +TIM1.Prescaler=159 TIM2.Channel-PWM\ Generation1\ CH1=TIM_CHANNEL_1 TIM2.IPParameters=Channel-PWM Generation1 CH1,Prescaler,PeriodNoDither,OCMode_PWM-PWM Generation1 CH1 TIM2.OCMode_PWM-PWM\ Generation1\ CH1=TIM_OCMODE_PWM2