From 62949338f945c145d407d287b546c4dce4fb1763 Mon Sep 17 00:00:00 2001 From: Sam Calisch <s.calisch@gmail.com> Date: Tue, 20 Jun 2017 10:26:13 -0400 Subject: [PATCH] update nrf24 ring --- radio/nrf24L01/nrf-ftdi-ring.c | 113 +++++++++++---------------------- radio/nrf24L01/ring.png | Bin 6668 -> 6795 bytes radio/nrf24L01/ring2.png | Bin 0 -> 7420 bytes 3 files changed, 37 insertions(+), 76 deletions(-) create mode 100755 radio/nrf24L01/ring2.png diff --git a/radio/nrf24L01/nrf-ftdi-ring.c b/radio/nrf24L01/nrf-ftdi-ring.c index b8d37f1..62b5f72 100644 --- a/radio/nrf24L01/nrf-ftdi-ring.c +++ b/radio/nrf24L01/nrf-ftdi-ring.c @@ -69,6 +69,7 @@ uint8_t read_register(uint8_t reg){ return temp; } void write_register(uint8_t reg, uint8_t val){ + //must be in standby mode before calling this function! PORTC.OUTCLR = SS_BM; //SS low _delay_us(1); SPIC.DATA = W_REGISTER | reg; while(!(SPIC.STATUS & SPI_IF_bm)) {}; @@ -77,18 +78,18 @@ void write_register(uint8_t reg, uint8_t val){ _delay_us(1); } - USART_data_t USART_data; uint8_t token = 0; //token to pass uint8_t tempval = 0; const int pll_delay_us = 130; +const int ce_delay_us = 10; void check_registers(uint8_t id){ - //debug only + //for debug only //enter standby so we can write to configuration register. PORTC.OUTCLR = CE_BM; - _delay_us(10); + _delay_us(ce_delay_us); PORTC.OUTCLR = SS_BM; //SS low _delay_us(10); @@ -104,63 +105,16 @@ void check_registers(uint8_t id){ usart_send_byte(&USART_data,config); usart_send_byte(&USART_data,token); usart_send_byte(&USART_data,10); - - //interrupts - /*if (!(PORTC.IN & IRQ_BM)){ - usart_send_byte(&USART_data,1); - } - //clear interrupt on MAX_RT - PORTC.OUTCLR = SS_BM; //SS low - _delay_ms(1); - SPIC.DATA = W_REGISTER | STATUS; while(!(SPIC.STATUS & SPI_IF_bm)) {}; - SPIC.DATA |= MAX_RT; while(!(SPIC.STATUS & SPI_IF_bm)) {}; //write 1 to MAX_RT bit - PORTC.OUTSET = SS_BM; //SS high - _delay_ms(1); - //interrupts - if (!(PORTC.IN & IRQ_BM)){ - usart_send_byte(&USART_data,2); - }*/ } -// nRF24L01+ must be in a standby or power down mode before writing to the configuration registers. - -//overview -// - turn off autoretransmit -// - MAX_RT interrupts on IRQ -// - set interrupt service routine on rising edge of IRQ (RX_DR) -// - set interrupt service routing on USART RX -// - enter RX mode PRIM_RX = 1 (SPI transaction), CE = 1 -// - When IRQ interupt, -// - enter standby (CE=0) -// - read payload (SPI transaction) -// - process data and put result in TX fifo -// - enter TX (PRIM_RX=0, CE=1 for more than 10 us) (130us) -// - clear IRQ by writing 1 to STATUS register RX_DR bit. (SPI transaction) -// - set CE=0 so we return to Standby when finished transmitting -// - set PRIM_RX=1 (SPI transaction). can we only do this from standby? (130us) -// - When USART interrupt, -// - enter standby (CE=0) -// - put token in TX fifo -// - enter TX (PRIM_RX=0, CE=1 for more than 10 us) -// - set CE=0 so we return to Standby when finished transmitting -// - set PRIM_RX=1 (SPI transaction) to enter RX can we only do this from standby? (130us) - -//experiments -// RF_SETUP, RF_DR_LOW, RF_DR_HIGH. Default RF data rate is 250kbps ( 4 us per byte ). -// It can also be 1 Mbps (1 us per byte) and 2 Mbps (.5 us per byte) -// increase SPI rate. right now its running at clkper/128 = sysclk/128 = 250 kHz (4 us per byte) - - void rx_from_standby(){ - //enter standby so we can write to configuration register. - PORTC.OUTCLR = CE_BM; - _delay_us(10); //should be 10? - //enter RX mode: set PRIM_RX = 1 - tempval = read_register(CONFIG); - write_register(CONFIG, tempval | PRIM_RX) + //call this from standby to enter rx mode + //tempval = read_register(CONFIG); + //write_register(CONFIG, tempval | PRIM_RX); + write_register(CONFIG, 0x13); //replaces the spi read, but doesn't really speed things up much... //set CE for at least 10 us PORTC.OUTSET = CE_BM; - _delay_us(10); //should be 10? + //_delay_us(ce_delay_us); //is this necessary? //wait for pll to settle _delay_us(pll_delay_us); } @@ -200,9 +154,9 @@ void setup(){ SPIC.INTCTRL = SPI_INTLVL_OFF_gc; PORTC.DIRSET = PIN5_bm | PIN7_bm; //mosi and sck as outputs PORTC.OUTSET = SS_BM; //SS high - _delay_ms(5); //warm up + //nrf config //turn off auto-retransmit write_register(SETUP_RETR,0); //turn off disable auto-acknowledge @@ -229,76 +183,83 @@ void setup(){ _delay_ms(1); //give time to start up // and mask MAX_RT interrupts on IRQ tempval = read_register(CONFIG); - write_register(CONFIG,tempval | MAX_RT) + write_register(CONFIG,tempval | MAX_RT); //clear all interrupts tempval = read_register(STATUS); - write_register(STATUS,tempval | MAX_RT | RX_DR | TX_DS) + write_register(STATUS,tempval | MAX_RT | RX_DR | TX_DS); _delay_ms(1); sei(); - rx_from_standby(); + //enter standby so we can write to configuration register. + PORTC.OUTCLR = CE_BM; + _delay_us(ce_delay_us); + rx_from_standby(); //enter rx mode } -void send_token(){ - //transition from RX to standby1 (CE=0) - PORTC.OUTCLR = CE_BM; - _delay_us(10); + +void send_token(){ + //call this from standby1 //put token in tx fifo PORTC.OUTCLR = SS_BM; //SS low _delay_us(1); SPIC.DATA = W_TX_PAYLOAD; while(!(SPIC.STATUS & SPI_IF_bm)) {}; - SPIC.DATA = token; while(!(SPIC.STATUS & SPI_IF_bm)) {}; + tempval = SPIC.DATA; //get status while we have it + SPIC.DATA = 0; while(!(SPIC.STATUS & SPI_IF_bm)) {}; PORTC.OUTSET = SS_BM; //SS high _delay_us(1); - tempval = read_register(CONFIG); - write_register(CONFIG, tempval & (~PRIM_RX)) - //pulse CE for at least 10 us - PORTC.OUTSET = CE_BM; _delay_us(10); PORTC.OUTCLR = CE_BM; + //tempval = read_register(CONFIG); + write_register(CONFIG, tempval & (~PRIM_RX)); + //pulse CE + PORTC.OUTSET = CE_BM; _delay_us(ce_delay_us); PORTC.OUTCLR = CE_BM; //wait for pll to settle _delay_us(pll_delay_us); //wait until transmit complete while( PORTC.IN & IRQ_BM ){} //clear IRQ -- need to be in standby. tempval = read_register(STATUS); - write_register(STATUS, tempval | TX_DS) + write_register(STATUS, tempval | TX_DS); + //enter standby so we can write to configuration register. rx_from_standby(); //return to RX mode } void read_token(){ + //call this from rx //get token from rx fifo PORTC.OUTCLR = SS_BM; //SS low _delay_us(1); SPIC.DATA = R_RX_PAYLOAD; while(!(SPIC.STATUS & SPI_IF_bm)) {}; - SPIC.DATA = 0; while(!(SPIC.STATUS & SPI_IF_bm)) {}; + tempval = SPIC.DATA; //get status while we have it + SPIC.DATA = 0; while(!(SPIC.STATUS & SPI_IF_bm)) {}; token = SPIC.DATA; PORTC.OUTSET = SS_BM; //SS high _delay_us(1); //transition from RX to standby1 (CE=0) PORTC.OUTCLR = CE_BM; - _delay_us(10); + _delay_us(ce_delay_us); //clear IRQ - tempval = read_register(STATUS); - write_register(STATUS, tempval | RX_DR) + write_register(STATUS, tempval | RX_DR); //check_registers(66); } int main(void) { setup(); while(1){ - //should be in rx mode here. if ( !(PORTC.IN & IRQ_BM)){ read_token(); //in standby - token = 1-token; //transform token + token += 1; //increment token //check_registers(65); send_token(); } - //when we get signal from usart, send a token on nrf + //we use a signal on the usart to start the oscillation. if (USART_RXBufferData_Available(&USART_data)) { USART_RXBuffer_GetByte(&USART_data); //clear usart buffer so we only fire once. + //transition from RX to standby1 (CE=0) + PORTC.OUTCLR = CE_BM; + _delay_us(ce_delay_us); send_token(); //check_registers(64); } diff --git a/radio/nrf24L01/ring.png b/radio/nrf24L01/ring.png index febd3532de00111619867f96363154ff7b43b7b9..5dead4cc1a597751dfbf060b850f6686fcac480e 100755 GIT binary patch literal 6795 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 SLWzNafx*+&&t;ucLK6V3d=!)b literal 6668 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 diff --git a/radio/nrf24L01/ring2.png b/radio/nrf24L01/ring2.png new file mode 100755 index 0000000000000000000000000000000000000000..c14e4aa21098978663438c43c5b15ee562bb06d3 GIT binary patch literal 7420 zcmeAS@N?(olHy`uVBq!ia0y~yV0^&9!0?KLiGhLPYZRjZ1B1+APZ!6KiaBrRzMZ<t zK%gzSNi~Oangi#Q1kPy?v_bWbkj_D&cl{e4Tl`c=nBnuG)~}D<^MK;aJ<>*vrH3nI zkG+2QVA09vpQfC20)bUC)aI%leEMj1P$Eak-!y~6UyDAjd}KNQe3!cRzl+f-S1pUX zPk+q0XeEDX&-*vlCx7V*-oI(&?{+x5dY|&9p!O*utMBuq-B|Q_d(al$D>qF=Gx|*% zpWRitmCE&d;)}I^ier!a-@FhueVS(T54|JiR(BQMZZ3?Ny{g-l&0)cJl?&&thNrVP z)}{XtK5~AyPu!i;p?38-#ja7ycpg=I)fnGaEmg_#Dz4G(;e5+kt`%+JuweU=bymBt zO@C}9_+rxBpC2bkxG(P$ecsu{|Nil;zq^`@I^K7)Seaf7RJw3c?WU5ew0?fuvdUoN zKOgt(QLSA!{q*OT6Li#@nPmU^y!9#F7|^;{HJCN+_wJ(Q>lX7os@6F2Q0Mp?uYPsq z_~imGR!Yt(_UkIrZd_M)F8#G)dhD!tzx_;SzjJqblpbEu_91zH?1IC|KR9+3@JTV* zUgps=%DUI<(7bC#)?&p8=W5)$S7j}ec4Mvjw&IN9Z;=;&wq1A;$5Q2S#`7h2iN)rN z1zn2|u5VJEk+pb(dFrp~IL2vQB_XfB>s<JGv*)Jm=F%xy`+YCxG`pVd;QHQn_Q5xu z3um9Ryt?$K=nPlMjr%|SE-o};RxS)VdGhnza&@M^t)9WH#b+PPDGp<)lILHQ<9_(` z!Dg-d(*pKyn>6EfMjpSAP|#r(P6sC^C!<+*LN9LbR~Hfz61wy}Q@HV*k6-WO53P|a zIlZjK>O8|vo}P3@D&D;N_Yz<3{Whm9*&D-7H96cqIjc4@sF=HSlfs2#n`49<uc_33 z%t~R2y4iD0%_9A9k8a$wEq!fU12rzpI>5uo62;76a=b%Q?8;5Y1@{{zo6fTC`Wao< zli;|3@xcN0x0|Or^glM}bN)QtL*l1*hoH&vCdqsDy%CpQEjMiPOFYQ)e!g_yg5Et( z*%=tDQneemeV!)I!0<w(SI~szR^mSX8_G{7w>#HJzu25RL4e6OL@?uj*?}wJ3}S&A z7Ya7F<w&cPtPL-WnDM53J}YPCcY(dBna?){ORx2Hm~dfd$%F}Wy7oIquygA^%9*jT za)Lm}!bJ|u0Zz`1Y)l+mN`tz3&M})Y*`={_Y!RC8U)XW4=^V42iZQ#d-M7!o^4TZb znD&~8#YD`DS^npYw!re<Ul|Yme<y{q{Cb}L%HZMk{It@`5eXAlwnjx(oLk}lY5%W# z2N&6er7mr6O<R@cysG!w-wSPyPIgC5tNaq4d-BwjhgPC;9%(M;9oV0pk59^q=n-Eh zq$1Mw=kw#f<4+jWf3crww>u^4T5{-x<<81I`Q5fQQ-2>@mdR}#R&hefIL-QyQuciR z@*mkcT-_g;jz6B=FPT53$U5D7+KhwJhNXx2SLYp8c=+{|o_P7*UANE1>RmSTpHjVd z*X2yD$K{uvKQ)ql*Zs3(_tQ&1|7acN{{8lMt(Bs_^X-4_D-8ahQMWRfT#+8ZV*2^x zi?)YX6Wb2<CZDs<_+dP|?|67+ecgV?+gt8SKiGa!&g<W6gFR-)3U67=y<@TO(o2)K zmh<oaw5i=2bLXW=?bo+2Y7b0*IPY+5levcIhub9z-!<x;tk&ND7QdJGj-1vT{_kxQ zjej5h`M%2~>}S%Qr#n{OIlIVDZ(VqW>HjDDWTy%4llpq{u;aEvKmS~7+E-M=HT!)1 zuW5T@;-u^TzciUUL2L51m0qq-`yWTQ1|R*Ed;jTA{{Y(n#{KR4md$c735aN4D0S!k z<RusC{)f)#nk|@X;dN*CGG=q37xn+=c=Wed+dT0LbeQtwX{FwMf#*-G7qh<jb4c#r z;)i7sc6(O5xEk1amC3d*-_QBq^#9clV%udra{m0=x3B9^qUZcW>$lAH{QqySS&dij z@;M7tQfE0-I9*vB_CIFT+Sc$hdF}gVm0w)(c<CI=svZA-)$Dp4`0Muh{@wSxZ)r@P zs=0r~s^D<(zh93pzOtm|@^Yz-F6KecJv*B%>Srufyx=`MCGd8zXQ4-ly?A%zLjl%l zQL0?)#a`Ujz4s?EnVX$!Z&vK8(p4**m$PV>++V7<MenI~(8GUw7K=?&RQIV2d9~$_ zfAYWQ^ZdVmR{s08U<OOnA4Y*ZgWIzbMRjxC<19qJzbO0ZKgFC~KDXtn_P6CJ%m1u8 zsu<0=WxxN&a<_kB*Xut;tL%IGKJ}1vV*UOz`{nwB4d=Ud{%85`Wq$WxgqFg-U%b0Q zpYK26f8xB_IpsGG+kf<yGS%AoAHM2j-lb;vfOr3;4YMZwkdn>*Y}>8Y^kWUvS<xT2 z6L;-jw*HCep4f`lA9VJg%|HAyB+1S7kIM`v<{wXZ?!Wgxm#b{N!@f9O?f&O~GP`>H zpS-%G`|`;jfx5bnlD2ndONnOKuXea>^!@i0pOV#n!kQ*~9p;;GA9=33vOn1WyYOt2 z(~f)&%O9O`5cNB2&XfN;^RT=}xHwlw!PJ1_LtRgOmD4`7Y-mw+-uiHo(_87kU!>nQ zw_JR3NpV>X<M(}Mnhzz_EU)G-z9?5X&p>;tZT3S8zPfqktbg*^EQL+C&2Rh0`h&-4 z{?27TpBBm-;(YNUr__XPlb)04yZ&Eo8OuVZeoC78Y(}oEQM2_K^}NW8`W@}=c}FW3 zE$@oUtPqu~&glOx#?LPlG^aUc^^&4hOQz(Bm|b}F%$h|uEM&nCk+Vlm{tsIfxwyUN z@#L0^R(EI3pZ_&j#->Nl=~Y}!<?7-e*H=tW@u-x$!Q1X!)YbgwRm0LbYkyib<{f&@ z^mb0jlf#GFIW8P$NDo_Zw@9A(YNJDTfcJvRe8=aE^8++4JS~q+;8wUGbs_4pXbaO@ zkZ3{0{ARJ=iWl5&d@Egi(cCI6?&<c&Yo<7ypErTqq*PSSdu8gw?<s}PeMB>|7dl;2 zlva7d<a;qBm3zNgx3#+41*t2u9(AzQFh(#gv)IMJwAL}U@!Nvu4gL)d<&e5y!!e~s zwzUlo*$j<r*E9q(rq{_Zzu55eze-LwtMr`Wf2E7%xwdduoet{V1}dg2jwVJ)Us_|< z;*j3dGK(p9q3ax8V*!;bi%)UfI@)F|akrr~f#oi%KnCxsHO*xck^}lDm0nn2DUiXN z#c9H@6=H33RIm)gl|=<z%v)F;op`fYIql6CpX;<c+$6~%G>wJx>&6R8=h`GWgkCiY znrvWmyAaFJc#Wa>!U3rn&F`2vwy+6gB=B;Sh&wDWJs`rqfeqv}M<-qZl_wDf%#Kbh zoW@|<)}V>)+5wJTpdfWv&}gavF^7qF4Pzs+F$x|l9G}$-ooiBf=w?>4vs;eqpZY>O zv8W?AL8jSm;FF4Ae!XBf1Jhc@Wfl#l21hS~{HJi?fRsSSW}BHcP76#M9GJ5m7UX`a zS;b+(nt15tw=*n%`Zfpo*;gN0;c$EBI=Rg|ikES1*&3j@+QuW}!jHXam8Erd@p@f? zTi7^+n6ec-GI)d1=P6u}O6X#aU=EgHQ;bzpxF7{_wppWtIRn_)X5DcUHr!PGmw1q^ z{d(`d<bymmo*mbF(>5fqHMLYFu<)*F6a<G0#6e&;PrJ#OoiH;N6k0G*tbxVOyQb0d zg&s61Kw^sdj3aY)0v~b^HYhA);}9y+nbD}A*wi8kq8G}|XlA>1KnC4r7O4nkCU9Z^ z2i6NchY119ES#2NXB;L7I3D5w(E<EAo0+d2FxpMf;tjbI45Zpm`W$#~p{;shvw9EL zmbtHA8FpKzuX2dy7Tt8JxrMFwez{n=U(W*512QHX*q%Wm4dDy}Oh3+3xx(NN_KrH| zN0mf2?lc9D73^*o4oFEj!m<b(3vvK3G+t}a-yHqwmq5k_)|#2J-#t0DXbPxYNswWG z|7FT4#|Z_>();eXwmMWB?<rRD$T-Nu!ufT9X5Uh#xmB|m8u%A#^1YjImQ{)a8ow<L zm;Xq!+!7JU-~|PfX5+snTUi!Z31sk|cp1*|#lT^KW9^Il{o<({TYLpnt~4~Y*xRo^ zXV9%5AGqM{6}N0*0hJogE#WC#LUR3i5&|kRQL`Hq7An<s9sb^OCLn6f;l=lw1Wi`( z`4&!4`fb9a%PPe&iD@qfM~R&Nh3l(#-@OBFfLQG;ta+)gy6$e=g5!cryssX!{wgWj zK704wI~KbV3!ZPbo`3fx%k<4oehcQGzx3pusT7m$2d2O8=U3ar&7V?NfA{_R-S_YQ zwfj2lcJ3>!xC{NquZc61wTovwoc!-|nYLKQMmPQ|X^jr;)j?9cjbbwW!RbH#&UN|u zQN#E9Zs|6VVs=gwRVnj3?^%<ypS=vTX=3Hl5Xx9oAk(X`@WB4OFEwSy7hBK2Yq6_v zPMT$&dHGJC#m|1%O8NeN!uq#vy;&2ucygHV!StwM-#zvA!kV-Db%kG)o<DJH1GqFX zc68caz;f19O8Lcv=fzyJx)l^vqdpvAdObscCHf)jEdARHHn?9j+MUZH#i7N$MW3y) z?~rn%<-eM{?N>Hxh~}{L^8A>+C!_GopNSV0*;btDW3hTB^Le}0#i@BOh1VIk?e9!W zn{!ai`}~(_1%Yw581meF(^hMwU7aoIt-UjhIoIpTh6|sTZVe2&&HdWNBl~4gZCu~! zJv*)o>uG&EzDex&u|==XMohXt|9$q%HA~+~O}UxV)f_hA<JAu}j*@G+p8ft=_T`-Y z<P`?x;(2VU_Igh{Z#y5q^!^i5-AoPrGp8>s|MBbdXCIqae?NKb>biV#uHU<gn%BCA z4SZvNe+{VPyM12aQq8veA9ki_sqQM+r(X3o@#%--IftzLRim6V&b<le`{keCzhA@1 zQ^H5pHM{FHr@mK=)b<u@&y%8^3zJqk9nyMw)r0Nw*}#m59h37vXr219CPV+RXoba( zcRDpi$6PDFeSERE<X7kCo3VPqGg@sX$OM@PlqX+&l=!{#T5d%66_b^0bHA2-a*GRJ zbm*sQhwTy`r#P3q8)X+?|N0#jyx?y21cR-5ij%&IyUHDZxb?`x+MS0>M9!a`6OdB* zJ1A0B?BCR$^obucjni0u6%>5`oqhA}{lN8~-j~|;Ij@pbimW&NFzsvI+tatQOQ)@H zPCWMcZtjeymjgFXkGT<-q8PvXLxpZ#jjX6n?-X^PpNi&f@!_ZVliByB?$!T0Q?D|1 z@tya1GOZ5jd7tjF{HmIpbo2keo%io|e0&{aGHdG<*W}fU)A}CSO*3?^2)R-*@93Xz zZ(BC6m8rOrcKS_*@5~RMZcZuK9m8dH<91nz>cyOgS0t0_6_viRus&n`b$@^O;(x!N z%k^*nRI|}!?dK1-w*;?YTDVnV%QdTF*OhNYHKT5?oc1W2e{pqC+H-w_s~4;^L(faH zbMJ54H^n|Q;`T+mPZewL#OPc&{GhI0`IPH({=5CwSz1f~81K=$_nS-FB-AK)X-d$l zL&4#Wkqg_OTR+&pWL3_$1zf%hmgVgZ`rh`aPQA)|(k_0kbju@hh2|o6J%9JVe?RHu z9b4CY{}(Ft+sy*s*Z2DVslETvV(m`pw(XxD>Fu`Zv@WTOo!QMbTffR#c5g7Z{b%!q z7f(HBb6>9-rMUT@*j^1oPK7@Pp+=>3fqM^W)g7N}IO8|JzNU>?am5wCJjLR@dmQ%v z_*r=Pf#33%hO16Ly&C%e+0#e7)4%%!8ok<Rqir87=+&}9<DRqY-LyZwT-?FN(ic~I zf8BTC)8mUzms^~=`6TfDj{Xv#b6@$}UlvX|oPGDQPkx}=O^(0WV*4`|T{3SFdB|V4 z@H3O`>Q!qaeqDb0^sDXsze;h_mbC0YZ}Fobo<sbFef)OS3kmWDjdg5yOZGY(4&KhV zUi#_*cFwuUPC5^m{!TyfFnj0TxwkTM4~g4*&Jf5jJZe~+llJJ5vCfu`&53Mr=BvC` zI_$n~>sQ*yreNPx_H*l%z{Y3o2ZOVj8^e-X9d>{5s%HpeYJA7Vu|?=Li&Vp@Gn^$4 zH(v5qyl|VLF^q|c*N36;9Ty9yX+^czYL^Au%@%8d>b-(q$wxOX1PZFG$zpD5c{PQ@ zgyHr?ffr}{SywkWXm3pDVs3c5!t^L(NP~kmV<VedgF`thOB5%Ei2)<aE^SbC6FDK^ zV9zp8OXrYjT8{n&XoKaDSON?0txuH`1hQX>G&*QEYVsvConLODaG}d#!PEu^W?_c~ zyP25Qvam?aU|_l{$|01s;X&zQ>De2<`cFv!RaUWYN*B8x&(nmN=oG5MVZtEc_#Mds z3Kw=cEO3n8aAuu0l&Nqbb|X>^ZF<yDR#Z5{`q+CNXbo+CCQ44FCY6;b_r<QVDM#lD zD`%)0u=DyfSiV??;z@B1lML=>U`KMZNNr(dx+_{SDS+9=^Tfskws|Tg6_X5lS&ao$ zLXI{$FgIAf*oUGU7DNgcyc`xZaw=SiZA7$K7CKLW=*?ktyRbkvBJH}UKt`;>g$23- zU`He-b}=)YLGh`8$`uAjr#_H{B^*M_HiBAOx(7I<wy+joh-GZN#>&Kd3mW}m%PbfU z$dtq*g)>r1t6d>c3f#KrVr^t&P{!$Oc))Js6>@uQFq8Ag-*i?do7AH$x8{7TKKba} zOsxyo4)JalVu~#}<gkD@_Ilr@9mPp3Ygv|AG;kUmy(lV>p{j7<01L!RhWZzdFJ9&N zz`7Bfg1~{>)DqjM&S`prg){#5cJYkjtrxGf>6c!7>gZIdGf(BpCPqgmTZ5yFJ`I|E zpr|oazF==Jkg?$4Lx#q892{GO1TqqsI7-4%{rN23e3jCLvaH2hIpbwid^k*+T4d1t z`<khdEjN*AuLQ>yE0k~tB~m7z!V=b|7AXY}P&_xa@Hrkb0p*kcQEnz)2Db~f(7<j2 zrx&nM5HE516fy`WbS(zu3XG^)6(Nwpu*5;0kDEnYIipnJf|p0*v$%J^d03=09GGe? z_S9?=0J}!@9?LEM=o1$eFF5cjUU;gUQTE`NT9Y^;EN_^3Nc0{~QG4)xz9`2R3%<#( z*^4hf>$&eOR(>v|ahq7)jH9JtKNA177&e-f#9E(vbgolyi=N7bI~V`jtMst(Gp^u% zsWbiMC+2?lo&~0j4%#2hjy{x~`^@Ce2T3Mg5rsxOIdT8OABjhHwZ|OLdd7OoR&FyV zlkI8m1;;PW^?O%Udj0j4&|??pp3jq!p3Sk3asB4yldb2^_kZrU+_N~-L^sV|L$*Ip z=B|a)0#i-l7m=Vgn(QZ`7x&}8*X%le*miz!mCc>~_3uiuvK4=D@v)chul`<bH@C!T z9;o^DeoNtg|M_(xj9Vh~F4SF-Ib<T`FT{1Pspa1FlfN}{?VHTPrG0aM1c}?q-1#YE z_0WQEeRYyy!vm$d-48vTOr^V;TJnp0Zb$YW<FIPq-)%F0c}4g9smBhmWH<#1*e`q- zJF$%K@a^UP)4O-yHDF(R=9XsPl|9EFGdA{p`j#XWbz1N**MVy?d>>0MXsR!nx}aN* zmt8(MdcoY{es&fs7p{^WXZY&)uXu2lY_r)DGC!1QF2A(Xf@F_IzWFLGubEA!acyay zzAZ6yg2CbYBFCq@B?#?_Gk?X&8uj$tMZerFW)HiYTjcaEw5F}7SlKF8Xm;j@j)w%R z;~^8lMzMH9Gsdh54*E7MajVW0H7--Bh)-Ky&N_F(Yo3DI1!o>UnD)<Iv?7!H!vZhm zU-FLj4oo2-;wCSQPaj--kL|;yJ5wFLKf3SxU}|%hk+-;S^MB73jXXlzj2EA(-1Xtj zwjWwfu9E6k9mGnQ*Gq>UZF0EIw9A;AWf%7wa{-p9PFe0RpWok_cmBEYj&m>kWan+a z&X(IA?|sUJ|D*s{$&a+|j7edJLDfbrM~^)0KDW(Y;X*?Dp4aDAuf8ldPx{@JMwO|j zOMZmrOqZYJ&Qapk?QQbwJ<rZrXWsX0^EfG4#?K=4Mqrt>|HqeHELL|SYgvxBmMS;$ zm46B}6MxaeBHp(+_Tc<oFA^+mmbly(l{&$3U;6@wP|-Ijl{HEiqQCqJh!FQJtXcGO z-X4eN?iXIO%qnsXJ^zmL{K^XsZVnR!eBPWq`M*T{UT-+Z7qP?X(<fZ-b-Up7C7QEj zi_cFM50mWmhtt2GReo{px@qD={e`z*a#-=0|Ge`oSSC(;`@H6VDP7LFEORZF#4HG2 zewT5Y`vp0UEo{3*GL*C~tPb6+q?#2S*Oq_g-4*c{H!WX;bWh<Zc~-ugjY(Fq_@nhX zubtavxleEQns#$3Tl~Y=&t;1@PqKV*sPff^?2379!7{3==H?523|-zhYqQe=)6Ft0 zQM%d3nPSh`{i-~fWc@U?Z0iko=Bc0eGWBkGoMOM_(wyUu6}7ZXBlH5(#n1d`*7}iV zH18F+$)$I~CRT@=_uBD@rcQJJFl~FE5Q|i%nk^(1ymy?h!hWBL=>^{n;kj0yy%)&u zux9RIe|P6#pF;h+(=+$pT&KUdk?)@61L*|$ABLIP+G3w8Y!ogiFtJFz>72{)rCqy) zCDF66qQY!q_JqfuBPV(Ji~pX#C*S(;|J%|3&R@4z5P7k5-^N3U+Z2-B?tOoeeM)`% zj&)b3+Em}Vy7Os@mcj1?zq#?}H?ueXtLe2B)K#<D=gIzKLXVjKwHGh!eV4DVbFMj? zAMVQWh3me-r5eq^4y_Ig7mKX4-P2aC*8VA+Y`1^HC$1j36%67pJ}{oX*=`n`Zzsr~ z7#6?xpU{g*`!98y+*<0cF_){vYwpown+i+#nf9JDKXgsJNn&0K_or6^f2B&VOo_N| z^zX1&-?iK=H_A-+hb%Cz{~yG*zKtcyX2r}ZY0p;|E92Cv=IwgIGHd&~Sq|+x%Vx~I z93b?<pq%*=Q|u$@L;h*i@5`9x7G0lG-?jKix|ehI&7E5&?PQ!^^LLI9tJ~~^um#$? zToyW{t61EbZ?!>5;03G0g6o;>?dIifN!yfF1vaxTs!xl_Jslpt$sm7gP5921Kl5(h z;?`Z08tt{<?(Ygq)e9>bOIP{mDqP@>SanVy!*Act!+)>dT<tJDW}<H+-&7TomDAkP zS*(7UMj5Tzzxnx37S+bMSMqFEZ!TrEns4eHH!+w=_HM8!YvVl+HI|k0qq7oUedu}> zws%rAXUW6&ZTsa+Ihp<zXfgRNf5f`z`Ad%l!N0?~wrEGBsh`R}T*mZPC~rgT;?I+( zbCi6U(BlwpxX(+~UAMegcEc`*<#if5Vp5u3*EX#^C1avL+1_6_j_IvX-GrO}Tc4;_ zY_yVo_Bpl8`{kZPS|85J7QEKhib)d}eGxMAOr_SWzd{+)|3&Z3e;(nIwr7uYX_={9 zNTk>Q(lEx71HBKJ?h5uFXV&*-n#3MAjiv0!;@8tvOTUZRZ7{94s{u-~o6UdNua*^I U<$kaWG`Gp%>FVdQ&MBb@0Au4*QUCw| literal 0 HcmV?d00001 -- GitLab