From ca551d4c5ea8f1088bbe1eff40f6424beb706540 Mon Sep 17 00:00:00 2001 From: Tom St Denis Date: Tue, 1 Mar 2005 23:00:09 +0000 Subject: [PATCH] added tomsfastmath-0.03 --- TODO | 14 + changes.txt | 5 + comba_sqr_gen.c | 43 +- demo/test.c | 28 +- doc/tfm.pdf | Bin 123313 -> 125198 bytes fp_exptmod.c | 13 +- fp_mul.c | 4 +- fp_sqr.c | 6 +- fp_sqr_comba.c | 1040 ++++++++++++++--- fp_sqr_comba_generic.c | 75 ++ makefile | 2 +- pre_gen/mpi.c | 2136 ++++++++++++++++++++++++----------- random_txt_files/newsqr.txt | 36 + tfm.h | 11 +- tfm.tex | 33 +- 15 files changed, 2587 insertions(+), 859 deletions(-) create mode 100644 fp_sqr_comba_generic.c create mode 100644 random_txt_files/newsqr.txt diff --git a/TODO b/TODO index 096f7ff..c67a55b 100644 --- a/TODO +++ b/TODO @@ -1,6 +1,20 @@ +--- +0. IMPORTANT... why are you doubling the "even" terms individually? STUPID! + - make it so you have four new macros that use an additional 3 carry variables + - SQRADDSC - store first mult [ simple store, no carry ] + - SQRADDAC - add subsequent mults [ 3n word add ] + - SQRADDDB - double the carry [ 3n word add ] + - SQRADDFC - forward the doubles into the main [ 3n word add, note, x86_32 may need "g" instead of "r" ] + - only use the four macro pattern for rows with >= 3 "doubles" + - otherwise use the existing SQRADD + + 1. Write more documentation ;-) 2. Ports to PPC and MIPS 3. Fix any lingering bugs, add additional requested functionality. +4. Unrolled copies of montgomery will speed it up a bit +5. + NOTE: The library is still fairly new. I've tested it quite a bit but that doesn't mean surprises can't happen. Please test the results you get for correctness. diff --git a/changes.txt b/changes.txt index 809fc76..1b5f216 100644 --- a/changes.txt +++ b/changes.txt @@ -1,3 +1,8 @@ +March 1st, 2005 +0.03 -- Optimized squaring + -- + + September 18th, 2004 0.02 -- Added TFM_LARGE to turn on/off 16x combas to save even more space. This also helps prevent killing the cache on smaller cpus. diff --git a/comba_sqr_gen.c b/comba_sqr_gen.c index eb5949c..bae9051 100644 --- a/comba_sqr_gen.c +++ b/comba_sqr_gen.c @@ -3,13 +3,16 @@ int main(int argc, char **argv) { - int x, y, z, N; + int x, y, z, N, f; N = atoi(argv[1]); +if (N >= 16 && N < 32) printf("#ifdef TFM_LARGE\n"); +if (N >= 32) printf("#ifdef TFM_HUGE\n"); + printf( "void fp_sqr_comba%d(fp_int *A, fp_int *B)\n" "{\n" -" fp_digit *a, b[%d], c0, c1, c2;\n" +" fp_digit *a, b[%d], c0, c1, c2, sc0, sc1, sc2;\n" "\n" " a = A->dp;\n" " COMBA_START; \n" @@ -25,6 +28,16 @@ printf( printf( "\n /* output %d */\n" " CARRY_FORWARD;\n ", x); + + for (f = y = 0; y < N; y++) { + for (z = 0; z < N; z++) { + if (z != y && z + y == x && y <= z) { + ++f; + } + } + } + + if (f <= 2) { for (y = 0; y < N; y++) { for (z = 0; z < N; z++) { if (y<=z && (y+z)==x) { @@ -36,6 +49,30 @@ printf( } } } + } else { + // new method + /* do evens first */ + f = 0; + for (y = 0; y < N; y++) { + for (z = 0; z < N; z++) { + if (z != y && z + y == x && y <= z) { + if (f == 0) { + // first double + printf("SQRADDSC(a[%d], a[%d]); ", y, z); + f = 1; + } else { + printf("SQRADDAC(a[%d], a[%d]); ", y, z); + } + } + } + } + // forward the carry + printf("SQRADDDB; "); + if ((x&1) == 0) { + // add the square + printf("SQRADD(a[%d], a[%d]); ", x/2, x/2); + } + } printf("\n COMBA_STORE(b[%d]);\n", x); } printf(" COMBA_STORE2(b[%d]);\n", N+N-1); @@ -49,5 +86,7 @@ printf( " fp_clamp(B);\n" "}\n\n\n", N+N, N+N); +if (N >= 16) printf("#endif\n"); + return 0; } diff --git a/demo/test.c b/demo/test.c index 947aeb6..184cc85 100644 --- a/demo/test.c +++ b/demo/test.c @@ -23,7 +23,7 @@ static ulong64 TIMFUNC (void) { #if defined __GNUC__ #if defined(__i386__) || defined(__x86_64__) - unsigned long long a; + ulong64 a; __asm__ __volatile__ ("rdtsc\nmovl %%eax,%0\nmovl %%edx,4+%0\n"::"m"(a):"%eax","%edx"); return a; #else /* gcc-IA64 version */ @@ -60,7 +60,7 @@ int main(void) div2_n, mul2_n, add_d_n, sub_d_n, mul_d_n, t, cnt, rr, ix; ulong64 t1, t2; - + srand(time(NULL)); printf("TFM Ident string:\n%s\n\n", fp_ident()); fp_zero(&b); fp_zero(&c); fp_zero(&d); fp_zero(&e); fp_zero(&f); fp_zero(&a); draw(&a); @@ -135,6 +135,8 @@ int main(void) printf("Testing read_radix\n"); fp_read_radix(&a, "123456789012345678901234567890", 16); draw(&a); +goto testing; + #if 1 /* test mont */ printf("Montgomery test #1\n"); @@ -143,7 +145,7 @@ int main(void) fp_montgomery_calc_normalization(&b, &a); fp_read_radix(&d, "123456789123", 16); - for (n = 0; n < 100000; n++) { + for (n = 0; n < 1000000; n++) { fp_add_d(&d, 1, &d); fp_sqrmod(&d, &a, &d); fp_mul(&d, &b, &c); fp_montgomery_reduce(&c, &a, fp); @@ -165,7 +167,7 @@ int main(void) fp_montgomery_calc_normalization(&b, &a); fp_read_radix(&d, "123456789123", 16); - for (n = 0; n < 100000; n++) { + for (n = 0; n < 1000000; n++) { fp_add_d(&d, 1, &d); fp_sqrmod(&d, &a, &d); fp_mul(&d, &b, &c); fp_montgomery_reduce(&c, &a, fp); @@ -194,8 +196,8 @@ int main(void) } printf("\n\n"); #endif - -#if 0 + +#if 1 /* do some timings... */ printf("Addition:\n"); for (t = 2; t <= FP_SIZE/2; t += 2) { @@ -242,6 +244,7 @@ int main(void) printf("%5lu-bit: %9llu\n", t * DIGIT_BIT, t2); } //#else +sqrtime: printf("Squaring:\n"); for (t = 2; t <= FP_SIZE/2; t += 2) { fp_zero(&a); @@ -260,6 +263,7 @@ int main(void) } printf("%5lu-bit: %9llu\n", t * DIGIT_BIT, t2); } +return; //#else printf("Montgomery:\n"); for (t = 2; t <= (FP_SIZE/2)-2; t += 2) { @@ -288,7 +292,9 @@ int main(void) printf("%5lu-bit: %9llu\n", t * DIGIT_BIT, t2); } //#else +expttime: printf("Exptmod:\n"); + for (t = 512/DIGIT_BIT; t <= (FP_SIZE/2)-2; t += t) { fp_zero(&a); fp_zero(&b); @@ -303,7 +309,7 @@ int main(void) c.used = t; t2 = -1; - for (ix = 0; ix < 1024; ++ix) { + for (ix = 0; ix < 256; ++ix) { t1 = TIMFUNC(); fp_exptmod(&c, &b, &a, &d); fp_exptmod(&c, &b, &a, &d); @@ -311,11 +317,15 @@ int main(void) fp_copy(&b, &c); fp_copy(&b, &d); if (t1LA|_6pza2urt_vU>U^FeXh$))Rl=G8>q{<@7_g-v2&!CV% zmDBEV60^8_W%yjg3{<6ljT1biEaoS9)MOdbhxq?TK*pg8VA-ODG>J{RNne6;;pmGe z?ZoD1TAmBdR<_DFIxOpUSPw;T8f~O5yf6Fn)qX9q9ZnT04CK3i^)h@HD5J&T*?`o9 z!Ngd_UxmsPInQo@2&1*S%r0{d#UR;W)YV#t_Q*zOM<2QdiD)_6#@^P-xHNN(J?>A( zr4C^oM(-R*y4GED^mSJp_s5||^|_!@z2F7Mq5gGweIaA112VV3=doxyXN#t{JGAw( ziG2xlTbV)SVrWbb=N^SVC3q3#`~l61aGaBB0U820GqZ*P83=#PZo)7OfbV^Z9Jd1| zjuR)jZrXN2+MqAc0b@**4k()T_G?PY&p_LRI1CBp5b3jHIqg?>CM2McVa2_lC$nTG zux8EH&&5rew7Xgg51tikk-j9W11LO#SHenHl}PjCN?)gM32N}(=_(-|Bv+3CSVC^ot?QUCy z7SK7-LRF_}sPmKpFR|(BVOXx)VlZq>4D`xuUJeH_ptWxTu(}#s&w3YG@0or@e>-@} ztVR16Fp+IJIwFXE`ay?~~6E(Gq{0ufC;K-*#j~WRWcz|Q*7lE?fcZ5EwgzXVH&|IbF@$Bf$-wf zIX3Z=Pqgu=vSu@!^nu}2Orr=|apO@rD)QmH9$4hSk>R5SbD-#Cf}Q_c`+rS*`>&b6 z?o#oTg!Li?)o?ASWo~41baG{3Z3<;>WN%_>3N$nzFd%PYY6>$sFta}k-fe$dPa8)R zez*D~tn{H=%4F^r(IAnKCP+<_fFCVI&Uy)(*evWWrKswE@7cN8>m7_qNgk@oNVd+- zocny=ndNGT5gFq4?~&*2~B@t%V;{-dhz=3-RR{>yHGI16_Ne{N3DzqkYVj*@7~&l zlpt)B^1{*a@2{-XAf_k}(zkC;e{ID~AWV4BdU!f|bLhodELOjEo-(}b=^mpRX-S8B zRDsm4e7fV^QW%HbXJus_z@QQbx9Y3wNmX2YYM*ck+ldKJ%6V?rOGJMt4$|_huedqS z`-+>qn%6c2f|wy8k&`O1c3NJ4oaIx5Y%+yH0#oLn?L2K|dsGN0n;GtbrdIspG(RgY ztS(NFCb1x=?@tboj_7!+_}MFCIx71--nQ;Dj8v%BcP3k#(bAOg52cxYwN9Fp`>C8C*<1bpfmq7%P%eTF^V)7pdq1Z~c7*kJ7| zqzoY;gtO}k@>ThK8zqC?`Q(ewBI8j(?i4^sOvY@3+qHk6D+I=|H!f_$AbxQ;5pg z4CApI0_rE$JD8_f?BDTLo#(E2FpMbLfy8+~&|4=Gz}&&+Z?=3uurhYl=#6&`LJr60 zqg$qgiTrHb1!$2v z_F`6*HA;@2@QpZh9sB^U+GH|2eGyKR1mhz1iXVT?TI`Q?_jF*OQ@B_z`n2qW^Iv@! z_CuC;MVjbJbpLx^5+&2Xp+M5FJ8XdzF*g`*6tnU=(GCEbK zs5nW8OGLcicdAaYSyE5aPxrw=U$(?}`~3>n8QsVncJpxCg#AXqtOMPD_qW55ndOPu zVhewJuX=n7cLWaOe~NJ7;A*viy_P3(`-C%qd>L;w0ht%jei!96UN2vqJ2<5t>?t+z zV%C(EGX=LgilYk0#O>i<+zTDr+e?OC~p~#seUUfX$w#*Gi z-P5(<8zC1sm2iFH-N*&B3ZV}LrIirK*G0bRw$uxt^n0Dhm{X%Qz)^8uN{MV=Ft4VR zz--W=I0uaPmMJb?b#dPeU9Zs-FKsyYbGVvO1$)Eaq?)icd7P-`6 zA_KbU0e)xqeB$m2dyKX~ya2n6u)e+UsA%*gpUh^rZkB}6O2)GTq&O?GNs~|Qu9u_X z`$7Bp2aQZ%o@H)ib98cLVQrH-f)WHVH#akrP=Z5$B8^;ySGk-vz3HPB^RE>7- zGj$Wdc5H`0Y`F>pqcshKCRY|?l1r1z+Cu+)&)m-JYF7jU$UuQYfCS9W%(;K(GWt9$ z2ptygC;pwS2A>C?ht#j7KeN^F$#`&nsnpOCtC$kQ@zo$4phLxnnk!PM;dnK8D2N~@ z6^)<%>6U0glxAt^&1n3yTji7(%SBv$ zdhznfW4C;MNll9pYY1nF6qR9*v_mQg7mB$(XPk4Qj2WIW4JZ9hVAWGm#IV97POCMN zw&~9LW3?)`H=cP;q>wy*__C<4(;bCP{6DRKR(_EYMOC`^!?ch0GgeTd;N%$tilWH^ zwL~!BzQckjNWrCwAGYOuKdTqvjF6xSJhRyOdnjxdiH-fPoJad;p%cf8K#>tmjg4!o z%CCXEvPk>p`{i`&k845;k@Qo3-T1wdfV$K9YF+wUSplBF(+%}vnwSOs*lhIadLDOw z%fjjd60E9S?RNsTY`58TxeSt>acYPv^ze)_|LJPKMg?(0z*z-~vt6t|Mtk#ur_1W= zX&?csf+l9FO>|Xli*!S|_2PJ!=bA`#!%_X0z&j{PsHBs{D%_#q4vmW1*3)&g3FR#L zmgfNcic6U|sH>~B*8!hW2lsyU8#gfC>OqOrxAp{k!O|Mi_m| zTwue3p}DGHD)0cq(1qt!kF)Mj(r(HpJ5IoD^RG?3rHFv!& z%m2h!RD?qsNG>p6d|ZUk0&rA+h@-RVHuww#HB~a{dv~*|%N2w zB&HC9DDm|)?&B2q^*J%xn(LNaD1v}MfUgY^7SU*cR~TaD*IBsE+0?g!LupxEj4{Lze zKi6L%0E0@Lvh(oBd;(5GPtU-dQm1mK#M=8&bm zvqwEKi;SE%u-!p>{*MZY6gkSD%&Qv7t|{B?rIy06$>bcc1369 z)-;NZ7zf7H4^1Q8!Lg5EP-pfn5{#pP1CH)m#)Ji6mE2-7nH3LzVtHV)w;Z6OJstF_ z-C~Y95ZUZOuJcRNF0&n=p`5e6A`;46%1yfFZP9lP6qCBp$wU5@q_m}K{4$q>I>I-4P2#;(BkLbefr>_N&RLYcz` zZY8z%8DuJ|=!zD9f=g{p%}j^*aRf-F)B%)QTgy&lj6N(yzz?b}+S??~7L`e=^@IAOy2 zu|OPG{CQqp#VSw$uu-fT-Eigouj9v;<34(4PG|~EY`6-?A58STHZ=mDB2Ayh|XvMOtb#Ja>XfB<1 z^)%9g!dbGs7aM$`s5(NZM!mT%%lREvQ&8|xbG+4_k6w+AFxvl>$;t@%2BMO6?Iq1U z+Dl4etv#xf2uUp!+hK4sbrLUd5@8n;6QDH#CSg8&0K;YB&vHyl9P=p_{f0(@^vg;SM)? z$aq$ND4e0}rdQ?iCc3>TvfHP|vQs56Vr-tw?fVo4;#n&tM$o+PBIskFXUKhH7#sFn z)rgzE4mJ*LSYv3Dnpz*Bpnh$V{uaJrvxHKEDmXI4dIn>C*iiR}A$2Azjtj%lt5?r1 zU;g%s{{j>hwe29(JWMPb9bg(3HDakJ4kz$`bG3Q@rP|IXC#(JB#3y~%S@64KvUTYD zdbL^k(#Qx92$gsm?s6wtku2|H*%;Tju(kxuXg5tm{o zLt&-5_qvul-5c!PK0RqslYrJ72W)@u6CZ^41F^|T9i?;?JWjt(Ps4rm-J__^!m=KJ zzJk1Hv2^G-ktYx9AAkI5^kOuA|70|toS+6Y7hO_NH6Nt{`o~oe8R>e!i&57BfZ0e~ z0Y)eH9(Omwy(bZ|tU)%DX4$*`tN?fi5o&w00*8zGvjQ;F$qF76djJ{A=G=U3wpHX& z3w)b$FH@=bQi#*}rAG_w>8A5};7ve(h8Or=5<(YJM=m7l^e!d3g+zOrh?v2)yA>8*#y?wLmh;ow@Uy@u0ByK$#H1p4YCS(+7 zr&-!n#fct(gT}-iQJ0(wLx36nZ9_l<6j>pFF09FkI=qvyH^U!}^= z`{^>Fd*kJ+3T^^8s#psJCzBb9j1Lf}5w)qr_xZ06g7yID0CqKipjS43cWAGN(1H40 zv_HI{Hb^_}6j{=#MWM_f7GCc%o zS#(}uKxT<=QSlXqLoJW_zUOc%BcNI+nj@rH!ZV2w{wZtT{rneQ?t+q&F@h5eIUq0~ zZ(?c+GB-3hlVpfPf2~tZYa2lfz3;CW=p|uUb)@;y(&XTTxalFayV*;rLvj3(Y{8A~ zxRm_+&dkoZi35c|*~7rolk}ce+6W0KWcboMTNRsPBQRq5nXSZGTfA?OMGdtjt3|sk z`UDg;LQTRc3(|^qRUDx`Zhv^XwJ+$3!7%xhc3vEvUk=9Ye?=3BMuB!{Q$Rz&(0EL8 z!p5UWBm`MIm%#SZ=Z_JsK{?VH9bH`y1FQ^4)Vb>5y1g1Cn9X1IWv^7p=SnL@3~WhM zLXi$b;b|7}3mDzXbmanT!4*FUGYbd)oi3!qIk#x{@ zavWl;z?i+WvP{u3$wDuyHtMx3V)nB9#Q1s9H+rZ4aviHNgsL&~p#!K=G z%er5*`|dGX@SUy8rPkYr_4IDKTf~_05-gb%+ug@yP(uf(Ige;I-EN;^9RpTp>aTTj z;A+mMen+3-pU9j%-OeA=8Tr}d+q#Xdfn1$=v4Ou;lzYz){pKSBk;<9#?ylR#YrSa2 zmm++B00gl4T$A368x1rzGYVyHWN%_>3Nba4L0}UCH8Yc;3?zTOm~U^}HW0@5TAxDi zngR{OJ08j7+q4C0paZtSKwmeunq`Qc#BqXdpMFPCR3xv?qyi=aRDhy}zvp;=9`d2q z3ThpHy60+BJyZ`hwD0m`wW%+c)x{r%Y9!^^L%sY~rT+l6Gqtl?1+JHy>TI!HH{ahb z|B}yv>!5-|NAZ7i3QE5CT%CQpfBUBTxU7Gdbxc~|oaA>NL20g?2B(N4$>pNDSo~V= zcTY`q@ui09;#2(R^0)W$SbV5|sXi{+Kl5YU@%kCpTZM)puA?9^f4zEq7m-mbt1ZfB z%XM|;o;;@3D8dxfZA1#n13KUF?~hPQdPKTYQwCIqrP&QAZy&GPI0K6S z<418O*>iuKp0)&KLQIh1*Ei1zJ}66^lcZ}KAZ^}->G&AR;A0rz|4%-gn5oSNk3%L* z0hN%LgQ}BGK;Xlyssq;XdGeTomjsv?(-SlGF@0geG~C1#SgTBc5ON@lm>^cGKoGH$57?qxl_QBf8q9}h(nF69nGN2Q6y;^6#6xbXX4xEH1cDKZ+fv1bCoTyc;;ei`G$jrmB+G?P)cx*e)3hRtxJ{?CGSEqd9JvF} zXk?(vNYJ5|@K3Y5OA5pxk+BU0-Da#QO^A!BfJ zl1L61RKiEgI!fm=%%9yfmuj(Q?68cKdjOce0iMe6d&>M>|20E+2+$6`K zxrAGmb(BeN`LWse*P3{EI2N1cT9K%ff(H8hh!oEDQToD-81swoCnSVv4nL$gAv76Ovl5Pz+D2Y6J~*7gZQ<{Xfk z@kj!C1`wrp5KxgSO_1J`Kzbm(4C%?FOs1@vN$+K5(wT%L5JK;QD99BN6;KhBb`?cY z?mBVj>bFl4Q2*=o-sk(j%=6@VX0p$mz1Mo*cfD(!I56G2F%Aw6z1MG8xb*dTqvtJK zHF1LU!C-NagMavJH}N@{7cu{=X-jcze0D^TlQ_OVn)~ATevHh)VZj@l=7ogDgm3fn zj~qN=-pIidXUv#3cutT{_%<((;K9p0BK>`WJR<3vz`?6Sytes7#*7<0CopjED(Q-d z!K-{Ce8PA5cz4`%UPw@=D$*x>@UjqZpYULYQLk7!Cx0f`Ys0d+u_4|Y-<%ifvuXMK zFy9rghx@Hu5aGXSVdS>ei&Wd!EZz~YHY(5~I>>YV)KNn>zcjknv@yNirjL!AG4AE@ z6DH1_G~9Lah*?ucKGmmtqeIUoCa9SS-tF)d!;EEyGMkv?%zS1BGmd$l+03k9UT0or z#xuj1m4D0v<`rfF^8&MqS;$OeUSw7?iFsVAe8Am?_LiW*zeeGnE;| ztY?-oFEJaKWz1Y=Bl9LRkD1Oq!#u@AF|RTMm|jc}=gXeV6wArr(r)8T}Xb|H^5u zQ=Q^DMTp||)0(IM$?xNTdp|1@6MmDI!$^4 z@oN9tIc9@b{8|GS$W|ElnVP^3$My9F&dzQOuc|g1^Nc3tK^)+SAU{FI8nq@3XkCI< zL#PnQHkm(w-LMZ18d~+7J%(Kl3EAofj@ZOJ9v#V5N1~GV`L$c$v;ByNt?Ua?Wq)^o zFJ$6myv0|aJ7z2adY4Fjupts+z}2KO(mmJ>C9x0=$p(FT(u>64Ok`-&=IJva!=<_z z$^|~C`g;4M^2ASvuhoKyb{BcyfgL8Uf!gfufYE8(3Hy|A%A-c?-kz<1rt~$CT zGD?*g-V{&?xF^XKx{t`bPXzgfASp24t_!__R@1bbjpLg{wPN|+0- zTSJy{ipxK-WQf`^ko_PhZIiOkuMS7TPN=J};cj!416;@TcV$S#XLwJYCVvPLxv;XR z+G>M0>s#AYJg@q1x-47nVT`T2Ff7UoROW6L($h6Cy`W>)~p4c3nZyxw@N5%G+(Bm zYV875G!5mB%pG>F&#$svyS4Km4{OEB&t#}+8_B2Gbab~InHg9q?|&qKjtvFZVI3(s zLT}yxNA!(SN`}Fq8l~7|WKr|aZkdUhDS6^C>EU%ebARrG z0SXbr#cn(r*alPfA%6k;$?rG5wC;^f(}+xYCxyRXe(^kf#CH>>>3=Q>*_2p#U0#aI9mC}* zr00$;grhO-Deoid)K%gHn}o`p*JWY=Zs+mo;g3jf(ti|jpvuJmI2wCk@9)1wg+RiH zE58-CSVIqn?}vAwiH7iG<^Gz3hpa8IANHxLw^nb3l@vLCuvWE2<-R3&BXFHmRNGXo zqKgfETb<~=%6~5mP{fPrJXJ1dvKB5$VWXZ56v>}14;z(2Q*6Ou`NY9}o z2~QN?jzIbO1H0<0lxXcvJXk6#dUb5jW_Q(Aa0kEYh}~g(b*Eu3G@H)W9kAMWH=Kk< zXpOhK=f~1W#Bfijf|qZ~#D9oi@XhbMol!68RG{9=5PwP`ztR*Y>D1nm=qR-&QL9ms z8N^B!QBtZblEvkTUjt$WfPsp)dK`nXG>-(eftqr4FE7 z>flEt`nr7v-z&d#`SPaF63Z2ma(Oi4^Un0Jg z%}h5MGJiDUnD+b5xk*MtHgH9dU9J?5ur+Y#A>FLMVUvD4Y==!If9Y%w!8KIbK8vN9 zxitNT%HB4XYR5w{bf>IsY}-t}6tdM?EhME18|U~oZ8$m_T*z`Vl}sjEi5I>^CgPho z?ORkLmj~I2YS1Jbl&R$T!83>haBq?gyYLtu$A9&^-a&_36Ud7er6~b)MZlGS*{bYB z16gOsF*ebqHN48{>P0NMK0xsq&coY$-LWHe$AG*1&Sc_9dcQtxj+c*RZ>TcC3P!MS zYr1E~wXXey;`^x|zeOGuqrM~EXL@W=MJW~cFLZ(DQnqG`vfcl&aPKl6H&sIo9P5l( zr+>u1%03b0AS=%8z<S8Vr!?5}OHDLG+-!wNT!s5@qyQ zvWy~RIxV`g9%uWhs@tYlNtxU7P}b&ycX`}OM$-f>Aq&Y^GKF{&4;)7(-~wENqj562 z3*-j*iXTk|euYI?fG@s({Y!j)KFK9z)Lp>5DJmYw8rx>^f8sp4$$#-x z6mSHtz*S@rP9(FGah};Kz z_tn{yW(?%X5EcSrLR1ln2?3$5z<m)^;*l7>!IOU5Ro5QsW zcfXY30&y6Ray#jPocyc9hxeO{A+1xKw~eKqhJ zx$=0gdyI!nwa@~GpoMaM2Rlb9D)gXr(v5I;HJ+2Aibo&HFbXg7I8%!-S9Cq{#K`SSjuBXXN+&jaWV|qvQ1zx2|7bm5`=Lf z)_7Z4RY84yVBOZaev7sy2#PD%jU~$8B;Wei!4!4GvjSJ0`Jw`$!U>K?eT;KIZah9f z@ed5g+58lEP*G#7FRoJN6jao<0QV&fj|?>g#D^Qn5;I%C_ zpQ;_o#Q2!);Lj=AAh6KK9<@9+U@LfW^S)byeX!?`$F4Re9NSPUtgBrKZ&Itc71E3W z89VGy4;fHVYT-~pet+d(TyX5f!QIXK&C0jsH?ccRT|0l{NM$Ft$-0LZtFW(4tfLHn zKxu;eAIQYwY#w`_xPeatj^_S_?d~|5OvWYl#;n{rp?FNu_wFg@*rQGVo0Sr zty$|4v=v+-d{@MIj%>)~*IG#T%Yd;Q7UJN~?%u~|r;?nRNq=O>kePz&t$?E|fZGtb z)ibm(+Nf9J_&k1FbbyvdVngb|;yP=?o|86@mH86#jA#2%Mlx`TkQSpP z&TK5Ci9O1g5g`{T>GlRw};i!M}ZYB4}q)fpUAjcaBF6r?|2@e^KF?fsNIB zZ(_I1iGe1;n37Ae!WBYhx$=8fDwXMaNJRve87H zu;FoPW^bYa9cMlKrh0%P79;Tyj|D7L&_2MNXQ~4WaJR9$mb|ba;$<>I`5=+MUwQQ% zxXOJ)5z+El< zyfzE+shvnkqcENC9}^CnAoWlLFzmj6XaJ%?|-HDdImu>~r zOJ4H!IlfTU;*}3vF60y|aW1)V zq=YOXn;JX(%EpGX|F|=e47Uisw=0;;{@xA+)UQ1`g4&@s$xCDs@u2l}3T51?%b!-i zy-O-8XM=C4N+sX5|G+b_&5j1$DmQ&pzbu8(7FRAHL z?SG~7!s+le?3^GU-$ihzls2ypyu>D|s@VIHQ|qJGsa?K@uZwT;WUvH__i{B%015YWXJAIze^Vd3^u; zI-2{-_=D)olc(*=ioH+58J7=EzH=2{v44^2?pcCS1DgCU#G_kBIMNJ;q%^^QRZyMh z-bpkZvT2itOg}OAYN#?_do1aLSWa=TCT(Y0t*FLJf@ftOStqPKsXK3I zGUTO#?lB)-JNTGwH05UtU^JT>PT04d_q#>;*yGc0vD<^ipHH)N_PF@29d~uiPk)Zz zl8J5N4}4d{CimCPpMnTgd~#Vn8^O+n*UU6u^5k&;=f+=y9URx)#+;Iq#;@y zbd8_L;;<*(4K0kwlHtDr(b z5)&1+{;iPHAHRG4j-Y678`r%qqB1x*A|g1rGNP`ovQoN>)C*9|&9LH}W(TOkoLiVf z?ZddX8GJj+qdSah5l$^`z|pkFuZBFmRSRl}OD|K#UseDS|9n_Eb1I&XbJ;y z7(wT(1XFq;6hcOBMqZblrNLwCFpR4E1sS$r32!i^XMq_qE}hNGId`npWR><1tV@It z+8{48B}jWHH{_`y5uy^3Qq#x~(#KhhWdBtA8>l0ygPqV~Xwg5`{(pz;`BPVhw62C2 zm*`k+G+k9|eA{G&I;b<$NvnK81wJRFwwF?VKnHc&?9%8ljweG$y)wp?^sK^Fg4q8* zu%tIjh9E~A@L6PU-$Qw+V75Rmv~YNtZGZz(kLhRFtltLyu-WAIq{r+8RaZ8o`Q)#7 zi!VEBFKm<|p`zJPL4Po~o1&#FnhdrW`c4D-^u!4y*LeiiYYPlg%U!bvEc6b+h7I}% z2!i0wWHdvGJ})s-lOL2FJ(Z+8k3ma%fix3&yuLGeT3BcFlhz-F0$o7>I+1@kXC|0a zrR15iGK;>)Cg&eWbB0>_$fXd>oeAw!;5LWOY`)&Mg#R~LIe%fQf-2gPH$SP!(on?~ zYsUa<&F#ZBC%CftE>636xoUtSPK`G|;WNByJPrY8eW&O%*!nOaWb4 zS|0cKHGA*bSh5+o84Fw&2U%jPYs)Ov1?dfLMrBRok^Fk#j-2+Mr1Yf~RlPy?x^8LE z>}}!eVGH;2{eSRt7Y?=@Di_jlIzOBpGjE&wCeOyBr&_P$j4a^^N*z1jMteGrJPvxIf)Plamk74nq@PcXMUd|4MDP8ptv~K(y`vK zSRV&Fz||Nk#rOj-8V)W0j_}T|%R%qDYV*n!`W-<3P=9T*8>=ZUTlJMvoK)ttLMR4X zUBf#c)_Lcs_iW5j7sk=tr=-M(N<+e(#&?BaPzzFxBml z+s6N^!S4U>2w1Xku|5f3&dGOwG7kRu{}~5&mJ78-9M&-pyLti3uMbch!P#PO9zXa4 z{qI$=Mt@^YQOzMv5g%FHy78kyk4GOPza#RQTU}$~lx9-GqbEzH)tFzh=dDvYm2d!> z!YX~LJVA&!5f|Pu)i5B+o@J+bg6m`8GqI8=}e}GiG~b)7Uk#8Gf>?z5?k0I z9a~MF(iNw{3I%?)*PV&7eGZu_stsmCHkkj->W?8Ky}%b;+uNMYDdyxtC<0SkiT{=JID8*E@*zH?fYQq87o#4C8c8tD7`#^Cmy7Bnbj0c3-yfx0>Pr&u8 zMSs(fMoEKxKe$tvrOQk+=s}mRj7r%QwTSvcw`^Bys#yB(=CqIMZQ00~rQ{rp#hK-!!XDV{bBRnF!eZ$;nidUV8ecMcrMlDi9X;o!qY}NJz z|1`I$7e`@tiJSs1g=VoL>flHyfI4(^O(P2VF%rdv| zm|}d*xi~Q|F;1P7m|RE%lS&}{ZYSjHDLY)^)bWYxjMUOpB@S6kl#8QNv}us!qKB{s z0SA8{PhNA3FH9~h$uB6(OGH6$6OQ_QygE~tsWaF3i{F#O6p_5|vh*{eQ^e zTN}={$#ATAlRq1AV5@&jXjoWjXp^NVFN=CVlhJ4d&IAeCfV6o_mnoByXrOdlTBbHL z|N1A`Q^0l4{BJJn6j)+z`FTu>1GLC6hnV@6Q9qBl-$I`IC7$g_usF2h`kj_4C%BE? zcbD8AplC;D{EV+;F$?=O9jk2BY=5%}@m}B_SQ&3C*_pfN?3TmR$}3qtTG?M#!66T$LIPJ)yP(I0e_PA$vYzuYcELtd$gG<>dW7 zo~X5`JEG}FV|iax&{+QUA;n)BJ{KKWIK)e zy-yB)lv@KSwL*$EE*ZigCMUjB!~Fr~_bJRLx25ppIj{S_j2Y#H&&fMr-qx2w{AlEU ztll4abb#UtP7~dDw||}5T~Nxs^Iq$v%jeh6TjjlZxxZkG=Ra&davUyjcPE{mF#P2? z<6=zit*%0TQge6}?YeHQ44%4r#K0jxEcyu@zrOyDCiMZIRw3FNm-j{sH{64-jXe}} zIIuSQP!PPy&6&M^#?*Q5UO!WR{>CARkjvJtz~yHg0Lx@phkwiYGo);#1Om*F9y@7e zq84*_Tf0`($_BAL=0kC^^wa*!L%`*%afxRq%9=^nlqM>HpP8?EcQ))-x4U^IqfQzzqV= z#WcfFI07f(kbkwg=IHLiM%rIAY%6sy2*_9pZrt>3qb5J@m>)U7BN?ta!T(8n)42dc zy4Hw&{&f+#`X_yns3T_U&#NWv9v~B!w7K$`)Fgt5%TLKwCuozCbprYOFLToqX-BJf zQRk-Q7iHw-nWYO=wl?REM+-UEW#U%6%)_VYpZb5~_J7Tc5)W7obHhBx1uRIP39rEH zjEQ?^?R)uhlyuHdtoy&NznFOyu5rYVT;{!DMODl<>a%bc-iGsVA?IW{KJ{^K6*Rzw znDP;Mt6>%_rG|Z>`i=N8tAgA?Dvy*9&G!A2xdT3u;i0yt`ARTF3d`P@3;~iKv(T?P zUd^@B)_+!)G*JkU+Nm$0g}%P*Xr}_$iMsseu303ywBR@@(`{pAZS(L`zWA}~wSOb; zQn_NK_%&I_cj;lgvi($&*vk)F#d-S;(?)l^G0@_%z#2g@!Yhr=qc z=YRL_Ql??|mwv!k?#_BRKtUMXhd=S3*PQu);^gzmZ;gI&*78}~ZP9ghi>>acE5r-- zBNqyrfZKaYH8DxQGHi=7X!AB*xFOXLp-+QULz)4SIYql#oeibJe);Fk3rCV?7X)wF zI=l33e`RC3-3Gh4rcg_8L_orp3HKJG1Aq3pbLWT8mtK9|Ds;}e9y8;N48I_0yhMxG zQqmut0&peZSirfvaW3}7{)Js<)S5NP6BiQ23Sk53mPBOKF3-#-y-yLxv!w6MC3(PQ zWtg+2N!pd^H{j7{R=jxUecD3ZwLV%>b)TAKf=OuN0iEt&YOJoYSeu}gJL7eQjDIA| zvV}{wRU}kM&C&r6ND%BN&J?%OQse*&y;sD=#Kb5U&r^-3!skv6o~ED>a?1q8KU>Ju zKT!*bKRD1XdRUyW{L1`G0~Fua;tU?kr%3-pFh|%SjXI9gW~~)Ybc{N>o=|-GfK}YH z4;MF6f@Q^}=%lG3IorO?5v!gdI)6Fp#2$`+2p!I)v1>&$4_DRLdks1+$G%hFO9oD( z)oQ4ql*cH)9dVjW2I2!`mM@u4`VptZPNZrwv{`w#-$%vU!ZGYtfHL?(nnWz@?2zo3 zDLvLg-wXG?l!-+H_be{{E@tD<*V zq+@FF$N$uP9;CwmpEMV^{xX ztA{POSFekfUcDLSe*jxm)Yy}t*AxsjATS_rVrmLEIWjnteakThMnq9eP+F6;%cLM_ zc4aSNbT33NO)pa~R4-vKV=rVcWiMziX)kRrZZB_>fXrNzjp7i0wN`mh6jvJWre(Ut zD^c50<90(1SB#3_dRtL}h#+7DaTSpJ4h#d#z#tNi;TYzd;XdS=VL)Iw1QicF2%sT~ z!5kVx))?dF+GvPLOg68{BkT4kIV!dJXKS~*s%yGy-s|uCUGF1_DHa4tk~6kB?{a_1 z_jxA|FM9{`3v1zjDNCkTopx9#wCikGD( zMn^`;t(Q32THCK*zt(zdTzF!1Xt31UBUm049v3VZA7ZV&<3ppv<*6&Ix5ma=dzn`x zS$l;ig(oJ5hduhJQ+%9EArDWq_J|J)Pm~e_F<%;L{_UK9m=qk38w`-@Z6JT)o$m!x?|@&wY>xnl@(UL$YW2 zK$a1iJ{&ZXFp2_hQ|MoUgw2S6kfgc;O^y0$)0;1Up4)(@u6PE|#&f^4MV4rO8=78T zo&)M^jXFckE1Z4ee1P%XFo2e!4R=oT9lLNatdXDjkjh%K1x(|XCh}gBP`{#aVvVgZ@VLfhaJGdPPHAbB`;%2sW}&JA7LoNM%@QuZzlKv8pV|;_7^{>APjJETiCHFt^+`N(q4|hDEIH1I*y*%WTYze*HX>Agi&j&}*=~0(| zs$oi)gATGr9q7ODxr=9D$*O1Z6L|i&OA&>p^&+C7B(Eq}Rgjlgz$dKTE)NDKcyTM* z%Ij&Zo-IT6pVYU)4^V<_w9)3~zPvIp$?Z*H-sjXwb7KbjF{7>YBr)iL1Z_kM(Ng4r zeDG7q4sYP`yq}(C0}Dz!dEq48sVhBy&3!Mq4Oc@?xb`~3Vh9Cq&2q1;F~K`S)|ycy z4_>-6X^|^G+@!?q(%G?|&)+Z8fu@L4<)`I>jFC2G)*1|lTH0i-L2IOT%3Mx^C<$Kp zA1u?Vy8vy_0@o&`;#g4GEozm_URNxVwWgkgUXR1%t5q~7-O!kG$L+ZmR^#>0rAf5?I^jqcXckF8gmtPNBjkcgDAJo8P zLS8D57tyJZS5d6hHq>#&rJ$>+J?1|Mb-;YzKXh|2rX#zYk8GEfxK_oLI99_YroG|J zXNW9W5v$|0s!}KfrV@(l`QK!JhFMmB5F4u@)Ga-h(V%Z7nEwTYiH84SZiuvq7FuXR z>kQXrYkz8NW+qF4j2;~)B?NS8fP$PT3sT0kHyQ&T#;xMY8 zr0Dx(VU*0p0!gt&Z??uU1l1rYQpjjb-|(W&LD)0g>U2G@H_e2tf+jn3z>d|X1)+h> znKdlG-$}t^9GYpB08FVQUrKV57!KDgoEnYCOw>S63D zdQPNnF6ROOx{KwM%Hb!OMcjKx+oW2$s+8&~D-KOnCEQO^PrCtv%68kr=&8ru4RZgb z#q*e|4pz%NF3g4It^Xa;bM6b(LOJX-@ZDbh3FRxOk4~ReRN%hzpoGIiTt{C_av(ZX zRg}hc7&5V{;sx(pTMYXp6^t_oIX+kbpRXT6LT(1^7L3@Au-Bm&C#YnZSSG0uhd$UH z{dp!@H3b82W&=5z3JQ-2anYtzqB@`BMNGWm@PWW3T8VF>Rl(l}LxBr*J#H2?=IzV!bW&EV#lhyNrI~CX}|9Q-69c2I6;y`jWuITubBQ zlTYmRchm7x|L>Gh7l(w1Lxx}-+pZ)7krOCDHI_hW=w8>5-+Ia7Sf^>oeyNZLFU?$y z4rB2vd^Q!}em*sSL)POXuRpYOuFP=4i7mu5J`CsMX=J`J!uQ(8mB~V2oM%PY38sKwP!D{lSKX4} zQ(Iw!7J3?O$56i5-I7YwTtlx{S64+LOIzX3`+ApqLM|7OPXBHm%_JoaBD;}FT;|9j z-@I14s!@WPszWvT4BK-$1o&OE{WOA_&R0>{@mJ?FfeA%Vb9^?LUzP&=bGqv1~Edw>!VF% z7olPXk$e<)m5mJ}Ta#0w$KMeQKCaBkAt)1euhig8&sHLFVLNV2UqcKIY2uaPPIJ#c zWCoVy#;uR{)Ar=ggQIh+_E;Bw@~>#Hj2w`=2KwNwUZh0K^!*fFAov5(8>^Q)KF!}r z93`;h&y@(C{bUXS*L9qW%Hgzttz<<8$*{91yhTfp@RJ_de3V0)O~?&YI>{FL15JY> z7viV>U^BCVoER1Jssp3q1oZ8{E)lD#b3|6GDSE{%y>0btY!RM)WF~sRcOvf*jyG!%y^4m)a zRm)>%(Z|)CKU%?Oqy9LT?ylQK->TK(8kHQFOp*i?nUk?c+1vF^vr_a3{R^bFOk5sg znX#JC8hk1bc{pDbwi-P>uQ+ANK{a2OWG98)kw5gDjcLv9cT z4(b&52Z)tGT%uPb#sQQmfPh6zMP*1-l<}Wd40>_Op$GouSrzL|e)F+Uwx!!PJ)U-B zv-q;w^~$TdyYFrH?RU(p#K3MWfuxhm!bPyO+DNF#@JJ{i_|tFft(@ey1^+jOLV4|e z5ZPW*;C0h}Sxz8xv~bvXe#$W@jHJ+5O}u;w+;)VlSnfq{Y1Y&b32DC}cpcg{gojof zJ+nlas$tRPjaWJ*FTtF`B}8F;po&Jbi=Idwy>?91;t}KNxio-A{$yt}AMKZdy* zh5h*N>(Um}p=(M|?Bn_kBO#qm~oUiCm zsOWAcDT%!?g(olAAo@)Sq$)LrML|mgJ3R5K2`>cR2YygaKS6?Hh45Hji^Ak<@~r~d zx*ZNsveu`itQsrTl}M&7b`!peA=#bn3n79f< ziPT!KM|!o8SBVqU*I~^ofqS8&)qM8P%}XAjMR&a!Jw*t;D3f2kRN{AwUY*a!8Rh zN&~7qZlmUA63f5QA*zK%+G@V((i^^Clmp8c>C2auZ4ADv#PyFNhUghanZ`rW>-;L9 zx!J~)7UY9T)=v6A;ii3E!<(tijBY}wk|Log5&`z1pWus%auyPxP9TQK7-p>ZR-F?> zDH4do)g0Ny8ikxq)U)~-Z&Gvw=lfZ{O4C*?JO|c2htSOtkfUW#vr8}P8e2B%n!c|@ z-he%{zsW3|&agzYV_wZSL=gTrxDNwRFFSy`K{@hmqjgQ?dgq)eu@)Qg8abEx#S@;` zoRq2I78zg8VoU$u+iBfV3OgoFsMSDvp_$dC$aO-Ib|sfj8?6e znnG;YKoKSH;
NawoPf=imZUXx+U-XjUNBI#jkl@JT_fJ>8Q*sC{vdeGhJt4mGKu8c} z4|Q|Ci;Nu_j2t~9+O`~&`0Okm&q~?!UPr7L=~Y`!BWBQ%qyMFmr4&$bqQ-WW`oN3Y zBv{xuVdi)!!2*)ud^OOep5f{7Wmz7XI}zVk8u?a!R$o*z?RXZ2cBs~8wGKQMC^Oc& zfK@TLWdaIk1L6Fx)-QjSK?6!8-;VoPZzc7qXJN)cwVDO2rC`i{>5Bx>4;HO?W==eG zltGK`jJp&tthE?beF|{rh@m*>YNL4>LP-td_lHH^CvQCM`n`0`4pp5x@moxtlYLCo zMLIK1UIa>stvZ>8MS|#-{ zxRgHIY-MWY0zG}btrcUtXIfuz+jeq6V?oQJ(P&e;X7e9kfqx7cNVTy9M=;aV$&URb zFVsP!K8?mc<@5*CEZRn~nx=LkSfrMom$-}}%G0W++HL+J|4ch_8^2mh8d5!nh`DL; zp1Cso;D)Gt(Eu>U5&iCI@@vWR33{Cx31_eQ$wPj*Tz8Ow3`Rt|A7nu>;Iq-}5|#e) zPhRvg9!O)|#5sruojgl%J>Yu2dx~n=TE|x|ADg0T*6GxSB>;?|gJTJHm^!Wd?MrlbH$cSqodD9e?w$0i+aa|Ugo15U;XuQC zE7rs2`>hP1tNZ`Hbtb?I(@a*4Vi3~ACunr$UnQ8>yonGH2TKT&}OIq{p z*=w#z+OZ`(WrJAOa1gxteu@!M8|_3NLbqI-n>KXdmIYe5akI4TXX%%c?6Te|E;y05 z0e4rg@qpA_`#3#kA6KNFV*4q6TsCSZLZ$KKOUVnq$%!Ao2b*vC*NV(-{0g7%yj zf&X}3^5#MB**80rJ^!cT_WuW3CDyHi!m|IrVu68?BlQgjh!I>+Q(9b6wUr(h=nE(j z^#>`H2OkIya0gv>t5@k-rgiz1q;+W{SPxHth6ZYyLlPAbiy z)owiaL7UU4*6Hmrm1*t6ESW}tOa_niLo_oCy+8K|h;Fe(@znMKnsskVEefB%n5(+x$AC`*V5Rx#X>* z>*ZtX$no`lgHuO-th+^$?%hPy;&#o8Q% zB}ZE*reLo?TzzO9YRBmCmr9O{$A@~k3=^)X32y--c5iW%fHWVC8-w!7iiyp%Q za9W$Zmc0UCznoRfTSWOx@p_kkD~2A!r;dt6ePd_x*d4XCjwDBS-dJ3= z4KViI7af|*fyr&l?Q-=V;avOJeSO@c9rmU(_zInixE1^k)r9*B4N~L-J^d4+|CsV` zfHP{6`If13AhUbm?=DN`$h;%CNliHp`pFq^Crcb3jq}t;%S99 zmzH_)TP7alMS{#XGC{nl#|%ZQa0m-B8H4O2{%n$i4hz2eYPz~|kuW6E%1il7udyc5 zCKEv1eXFF^l3|ythm#`EW);N!W!BvUwpHbXP>OuN8sLZn2~>w+yb^yi*1i$}B+@z- z=y4QbEc2nlRDx#M7A{W@X~B{_dQi}&3W<22EZuQ=vBFD2O{JIyb5oyZeZbnPed8n@ zFMWj`2jaCXS}^(PCBeVvxrF$fFQ8f$i7WKzKvf(tl^JE2x-NW6Hdyoudwb{Ph{&Od zW{rEhsNUwc{!aMwz{bGm5@HwvXf}Z^y0@sfG^J!(1y}*d`p?Zg`Cu-rj&-_H@OzOf z3-IK*eqL`|?-ymQoLP19Mq2K3Z8xfyu1+7N?lJVg47*ygVFbV~505{&HLpbYx(dB^?~S-6R?sTh+amydI>GNxXVZb@ipgO>Ee zs$lpYc|xejTZ98&XPZO9D2xKtgoy3cdT~W5O&e7KM>R<^Q#Dc*L03&pSHp4jvZ4o` z!i&ff{WsI#B4LEi1nJGMASdb_*cP>9YJ^#y2 zl4uC`0=PQFS`ZA`2jq2#oZ^vSoU;h%g0nxyjsgg-EFFRLc}_qBHMb9J4?NtJFEjj` z09B4B;}O9o(Dr1i&$w>Ty>T9q<*4&Eo;URSj>xU}bDMm3tL=XL`qIw%w5?WSJX6Nw zY+jbPVR;jUo0J5==JfQb$p(ok-p1`B%M4}CLg9g*A7nSnhxj1wKU0e9r6v4r{UXy> zpxIatg7Vh+ZC#9zqRJbz ztF}#-xJ|&kf;8?JmAA_iHuHR&nF@s|&084j>!~_KH-KerQo$fR3Q0DaI1EdtP|a;& z6tmc+m0(QBytjFZ(vU#sHnPs)5KcFnv3-{l9j;u zP#ORidhOuN8m}KeUrem!E3tc1{XPNLh#^2{gzir{+q2CDrw1g)KGjwghpKCP_XFQn za1Cs;_%YqVD49bjt7VSmX2IcU;BbI7xQaQVJ`&<4zA)?VTxnP#L~a~^G)}Kr;v7+v z15!qKwkORw_cV0GE$P?`vfBtOUPthdf(;<~P+nHto<#f=k*wZqHvzcqyZVP#8!E%5 zB%|&1T88E5r2IyVHg>S9I_$m!Y5HM>@5}rStjho^}w!U7pSz*GAF;*6_q+ z5CLJhET~C>WuoFdnoAb&!`S55e*D?N63yB{T`T->Iq6P+)FRLBj!%r_H=tfR?*uTO zXKCLMsnq@u9bjQ5oEPJrSd8Rj%<~~4(NXBBha^6kDI}Ly;~PN68`bLBSt$*xi@>&K zL>GjC&fGn_jji46@ty6^42m#2bo4r^Y$YGTg(HXSge3I)6`a*tM|=a~WeSUR)gX2} z6LuU^JU|%N4b98X@m~0KY~T;YjR(+A?8+ew+{6s2fPaQ)Whb^+om&(ERePVEIUq~U zlf7(C?iR*pQI)XeW2S-2P7BIj)RW%Y#MwUW;lhSamE0jp19gPfc4*`%G!L87uvz|H zM{9Zrj8vbyp?h0{bs4lU z{5semFvQ+&-PlfA$S&M(Oq3K*sgD1QRDtv@v8lDNk+pc2cv1_yJ&vRGKX(Rrx=u$7 zds_)Fhj)RLEF>@=5RC{sG&k|M79&)JvY5>`%39E1eO_ItZ#OjF;v6YSePf*fHKxo2 zp^nioFflcARcn<808>zv(E+&n^7h}bxP6E3QCyF4aj|;ZOK@)fEJoTG#@|NpF3M`0 zHvcx6onNMzFE=abC*0X-f#hnEawn;}{+E=k{L&i-d;2TL2qM;7pmS zoT`lk7ZnfxB_qisu{mL_vYo6WKlko~dye_Y-NW-pZPsi!{H@3^4i+!j6%ounPq{+G zG*333Ya*0;(0jJ_8ydmtzJmKb-`Z;^Py@~%7&6C=IZcXuzy|n!8#>9};nO~OsI)vn z8u44wtqm=l3S_@MG{n)f-Y%7F#rOFrG=eO~o$-@f6~=ZEVI302c?-Z6SqfbiJ4-+S za;`ov9KEOkcs%Gd|E50DMp;SfmNxh!cbyd0OsW~5VVh;cmiXPi6x5_ zq2SRLyfJ#FVgoqrw&rG_vnPU<6|eQXpFGuFHDXkq#2`s7YI! zw&G8iLZUx}T0^t{LgOyn$H%d@Ub=Jq@Ai;~$WQYSA*73XrzLqFDaaiBkSXLwC(kkhQJg1Ho@bz|yp$uH_C%;HAQm+z4? znB4m5cm;UP)h|)){Eq!BuwVQQ&DFX1q5|pIYkF+YVb0AnyigyMZX0Neu$dNU%AQ&p zmy8%Y`s(DN_LXQFrcR;tyG*)FW%P-E2wl72F%w|b$Hm!0p1;MdqLP7e?bC=fbNK}; z;0&6wd(=@HOc6AP2*vuH!qAbMWg6Pz^m_8I$pm2I=txfGxAI@if@b!Y&6YwuhK@XU zO9>-`ia^{VK$1T?lN6zk!HkV5{wa>4YhmMKqoaJ7#^0yN_@Kjb%yvc$($`CaY)l~} zaAPAN2hMLCu^c}KTeca1aY=X19hj8ztNLnfSmFQE#bl7uVC58AO(612$zb~Ivu1^B z$^uCGb2jNBE@6-so*|^Z-8El=G_?N2^Vj%!C^E?NMmOYh6gjIv_oN&Gm zN!dLHFKN?RCC4~=u@g8Fd2gfrG=+n~KKaAz3vFMSVyAl4eLJu3BZYNneWDGk3?8aE z75XZVYSx})Rz*glV+(Re^x3F}1qzUscLF>=Y}~y3@N+)dW(K8s&Q}2D)^7H#<#YLb zqW%kQ%`6urgOjj@Fv`+gv4zZY2#)$kjVWoN3-_!+KKmeagXA`yga_)c3Sk4lUeSlqCu02{ktk?t7uf;T6#zOL z0~MEgb#^?hB+Yach~zoAU{+B$bjs+IOoE4d`~W*EqC-eFjmpzcwRBu@1VopdpK`~F z?ZwC~D9eLjLR=f+H_T&01D9{%Vtp@1L$cTb(p--p+}67BkJgUeYMza~}x{ZjkxT zqHD~p_Lvrn%i$GihF`#~du@h|%I=S(Fs=7hGkO`mj?iE<|A?g`iHzyvCIDFgTqX^Z zRLdiERGn1t{#)C}cEp$m^xmR-D8Kae?7T2~S<((iO#&IB<9YkPXkxCk6A6~U(--7# zlCNUcmx78eMUY?+5m`-dgB23fwzv}+E)CRB?%d~snxt82w=ltDq4v~1j$Yn7Stv^*(A^RK5$A_Q*VO8oHX0l7vn)K z#e`)<2%Jy=xCjOKYM|3;3koPtLo?U4UpmdiSF>#@iw-yGk?O-Ow}hiDTwuE$hs8la zS;Gsc7!{XLgyNyy-?ZXO$r2_hVKy_bZSrrlxRxQ0<&ktvSnx9NFhDIuEm??H8MNA) zlgGB(u0E%9ce~3_>T5QITZ#b;aTkC0rwkhka z@fe+u&B|!rq@w|*qvIc8@@V2bY6o)1zd%Bc-6G^If<~A5APZmu1d}YG6NSYd! z6T9#i&#Dj-yOzJvzCT!*&IFBY@M)l)2{erq-3*!HfZx@R1He;55xB!jnf2v_6T(sQ z)9hc1zgWZ{?;U?#(Hfjyb;rxw&pjJ(Bn*x&iZ)_$>GKFbd~e@xqN5>UERx+)k}9C3 z+68-~BQSJ*ev|-`PR&$TjlZm5vn^h3tg#tKm1XDXoEJLvbxCbD_pc~kbNq)y$l1sT z3+}JID1{RHTmWqkt|FS?q_wdopHh)b1b*o}ynuU9m&5ft(9+P}Vj z$=5L!P%v>Jp%5*i?l^XK_Ux>lv>84yvYo+X*uv+u=plK%4S+_Iq2wCjMVna-J6Oig0{|}<=B6MW1*WEJLQ8jDbAx}S zV4)4bv)`Ks-gofFsNt>wNu&|Ni1U*_B;hSe2f`P_=I4s1$L6uXUqgZPji=RE+FIq0 zsZ4ek8zG%^PQvs){ckfJwI)>DIgK*8C6?5(Drpv&YKbiCujAshFPlw-xj+FAGq-#^ z*f?1qE5HW;wC;mCkA#Sdi-xRs}Pqh#WrxCpmw*M zme{H(VMZ-gIUzx7EmI{kGp1}t!Qq2{J3S^h9wcHeK`G507mT;}r}QF9i1fUd^*K5E z8E|Av85>KWuH7j1xA-?5HL(}5wdQrVnar%TsfF){i6eF)7`H>TsqVtgM( zCwEdO-1LpQ0ky1M%z&^~`!#y)0TJfrj8c1DvJXu{geP7mLIAi%&KTD##Jq8N`zTR? z_{y(TS$Ld$y9gs4L8J(4{>&=y?GRx-3NUqrqrfoo%eyyc?96C!-it30b>IN*`@Z$+ z9*f`ZcE05L_D_(wWP7;quFg~%1L9)AsyVv3VNZYCbtqU|^6S5gJu9O9~t?N$v@2$}m2n=el;kW^4G~Ns!uqNn*kV2^dg* zlr1MUukwA%KFP^YPwvy4V~iys3BPc+-cij}WKCyWKrfU!HCFME5d0|yOrEGM4Wy+0 zZG=)yM>{Wm1A=x?N;)lP@|Tp8iIyd?mqg$a5>tD~Ofi*mwDGl)^~|s6+JJm3-Z*8% zQdV|+HWAELC8-=L{O!T!1ZfB;1%x8SjsTRE6}3REN@&DUaKm2>$aP{ub2C<(1G#%I zZrGg0QjBCV`7K~PRWwB;q)J%~yikf-7i0o&Z;m_sIIekAG7tV*H5>ZU*aLOIGDf3&g zsF^o!7V}I}0^liA#xA-o{J!d+*JN3IyaL;-MY(!7Eb#u7&fzTH*ZGE zTT4$)K5GeAp4G9jHCax>&6w3U_opM#ZfI#2s=DO($XQ!h&aar@UT$>1zWHuy= zX;*d+QgSt!X(ygp2tzW4G$btOas{;%5H(?<<dRuO3cSjLtZFX?T`#6; z8{02kj&pqC9ILCY;wg&hY!5oczd^|NK;L|~OUKHamx%R7J42-d8tat5=l4)`0!41U z`^K*fGf^>NLuTMCd-^;%IYxX$BZPUs`OYXCmIHL_>K5~d6;KcE0s(FRby~0Z?%=Y+ z9Zcjf0Vj@xn&X7G%qWjmCzVdDOQZvDd- zKN(GkG|uhAnZkimk6i(a&I1AY%cEM8pw5jI@L3CIa-8s$F0x;0xA>Oo!pDyZxe+u` z0Z8a^Z)nsH%4ERbUjbhu-diUNLnp%-^899O18(c%&(TyfY3+Zn%z&`uKV1HFH-)}A zY^-cT9{BX6KD@odyYrZJ>jllm{GvLU?VKNr_AoL$w{9EVmz5`xARJ%4bnCgdoShq< z#5k&>|LAZy{=ZI*!)>;Z0I;7wxC#ET5tV{^=Ff#cu8>R*z0tKapS_9!H%2XmI?(bKoBCrD? z12o)qRLoa;4*RyKsakZBWxGJIyy@#n7|~IwBMSZ*rRPIRD0?Yp2&Z#0?6q!=~I@;p~ho1X$k=SUWd>6n8T~m>1^&zKf^frvffm#wH-~|n^Tk`_)>h} zYhB^4FW&)UvQ2te*d~4QZ=xx`Z22^Ki=tTf*_jwZ!A_z9U!m)4;VxgHK+KSIK#!H7 zOkL_@!5ZT2a!jYs%70kvK~u@HTIICe1qZ-t*z+WDA@K6NV2+*rbOx{aL(@6)$*jqL zxG_kx|3-&2r)12;nDC-t8iUdYy2h(a|D!5SQJCR2CZ&%=ndzjPPW?6GZOp=)v@uX) zU`~&o(w_1diFP#4N*A3XGh;m*156o)FbJm`M&T~zVh+KY=^0;P=A;XPjB3nF;*X(E zz`tH>PLiA+X&;eSk7#Gt>lxW9a!^D?*snL+@Qym_>1f|R?Eso3>piz1K6I`>#dev$ zLtY-w)lDZiR@QcIZs&hXff)8~L0kjH;JA3!?Ec%kK+tRSqD{e{I=w>}2Jp4;zgE1( z14XVG#`BIEKFGmOdNvCkqKcO!n)aNPnsCA&35*j7QFspfCRIxAPYI`)Pr3d3ScAQW#NS*@{d%cgvX>4U{&d7 zrC4=BX9M;jAfYFQfDM^)1K=>h%0@(*R6LU;7tG87!6`uef+f2gh@@_D?tVrI0S6FERdpScZwC0UBSu8)U#x(4T`h@%8K}(QLS@Est!b8mK7-Z5J@%4?TapXI~}h#m#%ce*VFGQ;v1{u28)s z(%h*fRLW7cY~7LKloXzR$eqm+IX8YUFeiTY#S7Q6J- z1cKyRxoO3)iz9*Pbc!k1eU^QUW9gQ5XD}neuxz52)lZpqKs-gD6)UOsVvP{YZ*kk5ADThuk<(4}oq&qQ1 ztqD=YyLWFu0I#~W&NPNiwfA0G4N^FUrAXf?CdAW;VbucOK$b!;ZHeOon<%_XhVDvMq4)3YFEx-4y1wpnNI#mORc>1{yX)?r(<}oC~V{_t(4p=iiuYVz+07C*R4f|A`0Rrf=J zFj;{gy2FIUJ$vAITR3^)hooD@Y3CDd`PJTz#KCxc@dFRY=9_C_3D?VVsHntZvji_D zM~9jg?j_AbK04=OOG@)b` z;f(gF045}*7iumgtz(PxtYPxw^C!h8^UhxogEUP?{nb`aD6egxy2?Ms?Mhw4Lg{({ zipRWs6#!zJQzVfNcPzREWEaeSlfdLURYpq0(*;X6JW*SXCi1V0j0rN$nOX$3%o!zP zKwz1DiaVL>%+Vwvv5>~znU|I3un_dFuL%<-K-3LU9!Gp6A3ZxxRJ(~%ZvIwM>Yqq9 zQ@RXE*CvYw5Hoy--jg*X2M9%9Z1AeqtX{`G$t&vCpR3Xu!brGr&Nz7l$Pj4KX|Q#R zenqo#AyPbs1(`!drU3VW=ZJ~0lsTBb{X2}^JquJaeuCQ0HgPZyO8G{UefqAs^$)z}wu0E-KJ*)9APv`d_O%3&+d2NIBYq5`s5NFw7< z>RSP?W1p_eS|P{>bWxIcW6+~O&%dT$jELhIhY3a`!j=Jy!} z@DZ|^^&`}aUOiTXqVE=3KQLw-njXQ*?)_D(+{ptk9BEAhaO zD4)nE0^;1M0Yf<3_1oN%;3xYxkD{Wu+m4}IP`l%d$2YE+ALq;WTDh+7t)mWDKoMrStPSKG@*iqMo5q$D8MhnY38-0${ z5nm9B7_Evf`S01zEBJPEMo8tq8*XJ_?!tB?`=cO;-y$y7ZzC>&lckJAeB#8y&!3&|k=`j0i&>Sw_{=G9oiKw&1r=TcCf!jec4XfzKOukZ8eV+g)-wvOM#UVkYuO7ycu9&tsPB1&Zs zwoFGw;A7ro?kv{|U|y!OwmP=w9QCO~_kwczNE+8nE($a59n|zBB5UO(F%M5{`b)rs zHx`G)K~TV^s+nx{pWQHWG@_v3d@CC)@v16{ODH5&E{6}JLsAq<4K*niSi&&*N3?h# zKLN!Le?YK~I}qe?{$|O}c}cMN6bWz`vX$&<{ji7ndJe(>$lq!sSt2+)Y$W|*5fp2G zNDfVCx{779dO8^vM8@$``AVVV|A@6&ntiwnRxeZY&=?Zr6=Kw7>XQ6B2_W?p^oI0b zuESANE*A_{qqliVk*}59WQ{;b@P#{k4;W;DrmmXuWa5Y zq{w{(uHGMSv+$8MiyKBE9ear&aw97Nj)FH=U$&K}v=Ws(#Cr%djvvYL32Th0f%+;s zq1xzzzb(KRKNn$DBzbEec!hag0IiTwk}!|OmXlm#R7H~TjXsT{yBtvPG%IPEHx!DhPYh4Lh^`~Y2$G1K{Ggg9itd;RK4=sHda|RrD8sS zj#cu)(FrP6yalUZ*M@G)}| zld}6;^p8!qP&!wB1)dl-MWS)gay>u&R)SBh3h`_x#6M`VX1o)iZHcrx-&Tdk=Fn+=t3ZQT^w^ z&sn}e?hN6&mUhkNS7gdl`+{FA{ve6ir%{xQ>2QGaB{}qN;^3n|e%;Xa$ zu&LHG$sL#Y4Y#JLp`O73$Us30l5nJDEVi;}ty-oskHL=ouFBLOri5g3nSJ{=T>hUu zf-ypJwQOR{z#u@YI%vj0!#Y17|JnGIH#?!mCup6NxLUnTB^tcXRDF&`g|(1H zid<*iG5FSCyuI_7;=WVt@;L_hWU0sMHnkMULUebx+?PuGV>c6zxAof?oV?BDd#|B6 z)CHLA{yhbKX~msRHcun>w7A_heJ?d@X)9_gDr>SmOdk@H+{oSSSLExAqY&h4|Fx;P71)&P5?Hbyy9qXjS?D{GG}I8Us?x@5`BtSzcJ^! z&KYzO2l%4MPH<%;i6WAblK%2tEeEjCYD(^0Yl){s1gz|8qXKP=?|}p`^ms4ewuCd7 zcwh);ogLoNL>OFiXfXgWAPIHi8$a-K8ry_`+Cv}H7$eakFAvVuOWQ_W{lqM0;K(mG)OJ;Q8P3$tmjV6VBW!=Y25?7K@)degW`*RV^qOT zzml&ZuqH3u)vqBpFdI!zRvYUPxmE(}v@`k7tpA z$8C_m!^+yfI?mVxGCZncizQH&ioY6${Z|6~Jy7?JY?p)bgRI&Y zMCc4&U~OBevQ}8s8f^~0pYU?V#CtuYa0Q^WL=q$ zioPf-=ivlK_GsSzPY~>nN;$b<@+(XIXf=S9^&wh-VS7_-yAnsI5`yatn9>{s&VR>3zY z9&fWRfFXX8Ip)8dCTDQ7!XPV{x_3oj;IeX#O`h%ER_*W0(f8c#coNmV-|}c~-|80J zXrzc_)k#NJ_qoSb{zV}v`D9{@%{X#KCLaW`1417q1%)lOX~gzVXEWahsBRLSY-R#H zmIUC?C|ZF^)b$RS@@`ee1JWBmHE8feeMucb$;1Z)pRt1)y%bJ&gCjAAGYn5sf(>zJ}fp|RW1{@urCzG08Y{~jux}zo6HnD zeU=@3$Awne`_@ZG%DTx6JH7QnE2+kELgjNl&M&Y{@ia#KKVip8!|K zibmz#Uq!_9h-x;T65SmnkF9V14Ud$uA;cUXLH}miv0I%a`35Hk@A7{((?+yx6qm$n z8q;*wo1YSLyFC=tx0~|2t0{&**nYH`WGU)EsIdRDL-4U*hvY^;=4hlbBBo-N^WFkjnB{Tb|g_@{2 z3Fh?qe>F2zbFArc0Ov;^K{=%nU46hDq83rYnurME&QRr$%s-|B#5R?=|fHz>h%P-({ zpZlUUGMGucWI$*eX1}jWd;3}v`C*A3eDydxYlNc+2Xx367G5`}&M8vT5qAd9hk;z( zCl-c&AU=Ml1O9$-y(o{?E}v`tmuILoXL<;npU|7*+Vd?n(SSN`rDViw(D3H9x~)oE zNr}85>gq!&J4V` zo$d$3w-rL&7F#?GXQ5Gm>AfuA{@k~BLXBsF=nC7Si$Ug-+RR=Kl*FGdwE#(mi|@mF zk2*k4p4e)dI<2)-4yr&rrTXi9j>6+D`E?YWzQ`y=MmiG{{4*D zixi{4;vyb|$OZIo*Tc&-wi3@6>C?V^v8Vv5@(LFXx#x8piyZh*ZES?6!#Md3U=L9& zae@L{jjbpd-ZA|6jQH0jrHKMg=jbQ=$)f^i!#-=@1YoC%hO{J1pCc~1BGL*Pc+n;mg=*998+V>`>%*iOak3m0ua`SV=ZMs^4_D)h0c*e*P5`(F)C zCjZeNgAW=oDoDS5`vTl&;nL18NIM0<=l7)hF&qNHIK7w+u^)y-^p19JK=mwaE`+kD z1Ud%us4gx8j}5#-Zv_egQK0Jpfi*`n&{P|uuG#-18eotd9*zUOC_cnztp zfTg~6@R>rdp)C=t#BwX^ihx4SzoA@5(nj|;bSJ9nM+^Cu*fb1%hTx2$j8dUk?7DejSa@7ya9~ih&BTS1 zY^KkdGuvkVj)2Huf4@+hm44Ad0XzJn>5J_)>%#nl1ES;Jw3)wsyN#Rq9Z@!J0Z{>w zu>srqu3Z?mBRnQLAkt=K*tUSkP=;ZD>|N)F`qNjNR)q(6u3qC38MtzBE2_uI9@Y1Ztw_Dr8K(~)5un6b=iW)bryvxaeD-e#sUYnjE&JIpj@I%CVMW0o>A z7&~S?vy7R^Ok~`d<%}b z@VLP-gPSa7S%g@~L$Zg?9C~Zm)?qg+*INc#)~d&=FTMW8OT|9-H5M=X)mIdOBtMiC z$lzGKDk;0I@TB0yCN17gW{@R+z>k+7;wXvrNhJ#K1Rt=4fHd9^Hc1M2PB7k>SX^B$XG}nF-r8q?6{TcsV*exn3SpuK;`<7vL}@_Q>`^+#X#l zB=SBryG~YA7B$`{e8yUTvSdEt2v4lPn}ToRtkcM6=Iw?3ae7@siWuR#d6x(9L<4Bo z`XS(O6l#v8rXJB)yzIa5_foXWztAh>CLAG<19F+RR0}a+O(M;>Uu7XiuMbO&O4U(# z`A9QRmuN1HZ~+=9P?205>^8(1L(}vIDCT9!z+q|6v+SLRQ*yz7x)8FC9?Hf_nT#;> zmXI~2J%R@M_zq0;-Grg_W+W29#ef#Hk-UX`n9$X)aPV2d28AP zVoioVu)}xo-LIeH5RqgNSAnPjnXg;m{IP1y@iUD@Z8W&XJ;gyq!LS}S^Nv6mq89r~ zm~7f1$x0Kh?XWa|-;hoV%phZ>-Yq|qgp~)NP9wkIh|BNg*vP5d>Nai6_+S*V9XpeZ zAtU}e1t(rRd!n>L8^{KM5p_ONiULo-&SD01m!+7A}_6X-+jtITdgT>O+b{ z`B&8K#r%65t?Z7GUkcfISx}sI%vfMJ27Hmk`s=-QVXzH<*1`Lf_*@B`gtGm*gP==E zCaX#L2;zh1R9{K#*3`+c1^i(;1krQPI5hSsRAeWGm@}n4qX;y?6R0&qtiYX|#Xm;; zUhISIO1#+ZBxn!o4Y4%fxc^U`3pqKZ=ZllZjeM7bVuPVP?L?Xp%7HJH z*nm_wnu;HPY=o^e$WpEVj_C_@r&0}ih~axCaeXx*8zdZKk`*2P^|ZAZS`d~N=5;Ie zT@1(11vqXn6fCBYIXaFf!^p_*C!-V2X!_|`!7fPItxMUHtcl(17P6e47^6q) z^O~yu#yUe|QB_%e{ozx91HeeE3_<3*&R@O(=jE>?MZP45P#qlDJxs_tOq0pwY5T>B zJ-O_EK9a1G*etZZehqDCPQ%%r@jYKA?SoX%T1VtSu_%|b1$ah9^^+*~5)0x-FSem# zrS!S~mA0{)HS33iJRcpD-Szla0k@M0IF>|`IHDmF$@|0~ZOAy>iMvt63Fs&G^e5MZ zHL#$3>n9&{Cf$Pj@NwE#&3|dQcD?ipd<-{#!s?gRt~fLomVnE_8GehmEO3c&2Q#rP zM?R=4j}rRCsn;{fb8@hkGSrpM`(s8gOjqhxJ@ zXMJ>KIQ0vPeVaf=VjGTPaWXhBTm*B8JyorKe@~l6FRGC+r@e26I8p2ZduK=t5yNJG zkd+jIDOl6NKFRT&uaU6Yi=Ch7J6T+hIXHzyCn#HxPX_Z6yB(8NzbMR6d_kk=wxqBr zy7JTMrys#_>pRR${0S|rs6JmDE;-^t?q(@kd@t(taeE+?-&(oz)Tzp%`gZqI8(sW2 zxkiiX7F2QM?LP=PWmt`&#n=k96g#Sac2wJlw+W{_xn;uW221$P1(mo6mGHpjzLolC zEoPycFcYq~w7~TT4`At*EwFT^hFI(uTBFYEN+|=zcXZv9BCF!_HK+57jJXC~iY^h7 z`N(5&Wo5^XpD5W~;~npn8ssC!9ri1lPmvhE{ymqig6_ zOhW2{Sl5vr9rMr&UAnH^Je~B>(rR&C`D(C-2=Im!gHNWm778He(9w)6zLU5MIDoA{ z6|4;0=1zu_L7uIxS3iP0O&{IJ26Q-G|BXr3n@MMfLrhqMc1rnSfq-v)+=LSW75qOD z(3euh7UPSn3|aMJIZ+k9`v~}dA8K&mU$USeE?$>#K(9#-SgGF)(Xa!yUExVql|Y7E zNyRD9MThm{Gq)~0xqq|;E<)GNv$JZKra8eHs-0w#{j!*f1vX4$y3Lx%B!`mg=SveK58a#iG;L zLo>9|T%g%Z)=^k;j(d{*8`F{~(>7r-+L)PEGWRGMK$%8~bvZvh*(8suw1h^#Tey$@ zG7~EhCE@+d<+&j7osZ!7-P+Lg>7pUtkWvKv2}m!|e8wGz?6`wE*tJcJI1-fM5Bv`D zCJ-zC!tlb~n);yHNTvH|nz1$H0u%yYfo}rZHtnnlD%Wf~6_WAZ5&o6W`E^9TQsZ8;^Fk)We>X24 zYXf3LJw9UpFf7$id(Qm}yYoN$AxfVuT1IP%l(52t6@B`Fi8$GR1|7aVXQkeQCj3Rf z3LMCxlkvS(>)ee>trS><+a!6QWNDVy$vD=t%}O2LJ*Hi#2)`PU349(LIjTYL&m=A= z)sarXweTjmn|qjCBT;%jAa@O>7_%WPIn+lT()Mx<%KyLsZG;=lc~gx_>;{zflS5RsvnJ= z=P0EW7iQm})9j^$&V`E4X%PoXO57oj5vX;hJ-5z_)!TVaoS4c7eojtuHebiw`lRL3 z9kJcZgIf|36}A>WE}@=D;T+N4YkME!G|LK{Mh2SQ(j$zPHwa{bx$;+j6T1pSo3Rm2 z!+D*F)_o;^r+%IzUl*DKtNna~f_!~zf|?pl)y=;eF|8#3dy^%!dOyV*Pv^E+sqe_P z@(h7YsPNBTR}I&!o60-C|Ll1%8C@bCiUQrMmcSLgASCJa`?ca0pS7*avo})^rYy7{ zyS&P~C`QxfS$zN%QM~%mgI&i`i(`+*mr_0BH%Bag9_LJ^6yl^LQC|S*F|XQVd2f4U z8;zM+Vr%Q4Js%}EfHltPMAdUtzI|`nam_2|7}!p6cxC?kY-6;%{I>8Ohb|c^iR-nG z>K2*$`4zv9fpy#*j|~gvrj}k5@w@-@pS_&Ty_mn1-G;7K(W1M7c3szH1qJ&6m7gT4 zJ<;8NvxQ%r*w|hhkd3OGdpI8WPkXwEgBN=-jSh}0^g*94nn~^;cYVU)ILLV?hp>IB z(=h6l#b5*xeKbfGa@$4OM+yzb@-H(S=9h5wt&8_ZFqS9lTyS*Sy+4@KF3ks5w3fX3iUACq3~cT+fGP1Qz${^<4< zwFyIhBcJ@RLqUZ|iP7E5g+HiGuhvx3<<4v#T6NWCtuZ^wsj4$(myfGYql1Zd=zzI6 z3?0o17Ap_@RM-yQe;3cPg@@rpNdhEjRvF+3l<>5<9xnP5ndC++4$geFVV$N7GK%GY z8I^{^z~8O$bJhgY{#}$xG84&!k@h$=?#5?QLu0YH8>b6XIQyvykskgv%@nN}dFRs1 zOyBZ+4Xx;pk^wB;-`}5*wj+)rCL^Y%zX758dK_XcxK?D`K~MS0GUCQ`{ES!Ay6dG|Gc+-Uv!eyr4O|Ls=$bz5h3 z@y@ybdaM0k4;%I|WGB+aB^CI+pxvV(Ep(enC_Z95l$9ygwO-7jBj6#-d`F}H#{#e;gQ8s1 zFZqck9ch?ycZipGO4EId~)Q- zA!BaFJ)pZMzQ@MJ?23(xu_yf(l2Je=@-81jM!uB(XR(!ovuS5DrR?iPS85vg-t6Uj zH1YfHck$R=_xolyvssRR682<=9fNBA<~N!3U!L2##4{q;Csb^X6mFU-n&C44!?YH{ z5{=8d_C5u!T|T1v;q3Q)+~$uYgOTx|aXa37fc=n}EqRuU#CeHO6DNgtY;TS{6HE8_ z*$#W$Cb^yO>S}MQDKuw{*>p{lZz<(lm@SxkZUvfIL-itAYNjZEOvcxg_;a^XD2AK} ztqu+(igVq@Qwz-R^eSZYp~GDrCR>Sc1nqa^wDuj3I*^R!(1YHvU9q zeet;qe);i-#8W4KYI9A%-)~(qZ*jm9mqi-lP5ct}fev+}b)@;@3^eOuNdfk4yDyVz3aXC;RHnY@!!cOw=f(hdyHXb^?SyPo= zT1v^@5>nyg7ZmO>{po62k0p1$|F$FaJ{`(pFSMwTWS2rqY`|fJHA}^Fc`Z&8o=TJD zIqXSYdRVMpAHPo|KlCh9d0_+9{Qh2CZQ8fJU#xxo>lbV4NA$hZ1OhAqex$O{=5{a0 zB^lYcrHCaW-kF><5ZTwnf&FI}4jNFOIcN~F<%0$r23au7e*jC5$F`PN0Th?MT>%J} zKM(;m22n~&OH4zzdJq8>0hcLX0TGv=5djTki6$=NGD+0LV|2`dn$e@Tn8%#VE6^k- zneEJZ-9M`P*1Owxzwfe)qXWaTtZQ(a-XttrTaYfjU@MZQAtsT)TqdAxBdxni7ClZ2KS(Z z$S6ZR!!QE_r^GL#PyUHfbC%CFL~E0OVx}j@hNR4&sb3SvFt0F!nK{fF^ibl%pjUG<47MqV27}I4g($1 z9KP4YX})rt>3GzspHrgKIc_WWfG^;Quub@?$A}&moQFCaoDcQ%?b+s{S9-dC{^U@7 zp8>nlZfBohe@%ygRid6VYSYOWG6Mv6r5)Yu+*_tGun?95;UL~B=$>@8d+3zYyz5Vz zV3Rx8(Z{X?l(Wi`j)|gimuX897{HWkOe2=gr~QrTU`og{kP`s%Ktk%sf*tb7_R&ZyDkJBqUZlARs8et#&4Qi<2NS@qQ(nSMPzXavKnPCwu#?IyiXkbgJRx{mCWeCkx3h!bo?g;5Gj*OS{+|yy$pNl z>2|HfSRR?{E$0qYBu$pcp5Ghru1a1`gVL{o1$4pb=&VseAa_w%45|{9lj_Mqw-#MMK+{@8;PYgKhHsm*}UrAG}CHx8VJcc zuFCpFSGZqxg`3PLf(ep;HpOo?TcA=3q5+Ge2u5xb1}ety_w*uEU|fMQtCq z$NCud)AJbi(3d@w_9u1{%cnv%WTy%g7h^IRn)^$(uG~w|MWgJ&1Q7>}en5Q5_;Eu> zU()a1E9i^kZ$H3360wqCk@N-Zaq}2_P}U$<9y+qi4j(~7;?9JB@@NQ!aA5+_)wDben!1lHp=y_ZTVHu1c%dXOKCQmk(tZ}JBF5HKm|tF zsap@l(yZyo>KG?~R>7te=}rHT<1?zK&{A(CqsTC_oJ8OVG6GGgMIK$zd1sDgT~-!k zn&oUVl8B+c5CCI$g`ACPTyY9eg8QXcjWtSGACvXXA=`p!;e1{lM*0xE^tQ9C=m1%+zpdG0cnuTIE_t zYm?<*MMK$tzV|Ba@Dz%Oi)E2o-oSfXHZ*qhZs;m(0D5RTs_f=pcH(fY<>2ggQ+<-H>+9d~qOM<`? zyfP;&(i&pt>m~v9$A-30(!#&nG0DbWeS8N64aO;d!$jolq~{~<@n<`1#a6Q^Us{)y zy%ti1W&6^0S2mO$Zi;T6>O(Y9M39C}(Oo5f?<(juTFzSPuA0ulIF-~G<3)OVX(P6% ztoR}xqX}Uxo)+;94*&G+tw+d=yhSF;og=%ckgK&mg$8<_LajPWJier~i#Qr4PM-$k@Wsu+Obee8yUjAE_}%Vv1-hz_HjvTAyiL3u!`xZEa1BZD-So(7oZW$7=QK zDUoS7GU2yG_S=}%aV3lQ;h1~Z_F=|;7H(qFll+?+?27^7@l~x*O5r7)`ux&~_=XKz z<=P$9n|E6Caw#ik2&voG?B2b-tfD$?pI#S#k(!n&MN~%?h0(4{^WT`Za%)6$th{zj zS`0*ku4;KjdQwhMGRza^emVmK@wKl%y!K6St)WB;ubu^CDf2IdT#K$?LnD+yp{2BV zn}9v@#c^=)=ux50u-1d)dZ9I1tN>$jlj?ARhuce=V zL)j2ou2dCxYS#kPy025 z!?94~x1ID7n$_wbZ(%6!xYx080n;yNlwQhYu?z~<<(MFQo%C*ArZG1!VaM`(N+ogR zWgvYAWABvuTzOBfEoU~t?wIHNIUb0MhehnB)3#_oC zT-sfBB<4fd1#YMCg%Wf-zRI?GmmIM_Hh;m^S;cdT;kfYW9jHJ}{xpMCvSbvhBvApI zs^sUQrV``tb#3@tQ{z-P+~|7ER z^%XE1X2NW$_UJK;ry`WF%&{G9L-d^4E8NQ~Pk84B zspmazCSSgKxb>>kq7UU~#>KCHoCD{psH(CPGF6gLPW*^N>A-0)sY4?+y;C0qpsl`1B2&psDm-n!nyrg;JJ}28x@Id#@#bk;HrPA(LoD3ID|amZPKqo+LQ|BvS*FNxx5N2W1cxHThhH{s91FHWt#es$-abtozd|2_Vx0~ z(7id2lOLv(m?~4ZWz;4>n4n92oj8sqavcueD4BP`rq$2EHMbjF7E94qskpdkTTRXB z#Wyol!SMO)$&>Gb?h>{}?p9Ud7v$g*W%kdK8pcmvGJDdS@7A1>@CTk~f8moX-t&C? z)9R~m!!B7~<8aC^^6IF60>w4@00reYCs{n8LL`#zc>nO^R+B8JX08a?!do~Lgd3gT z5N{oK-TH`b6d%K1;JP}P-pV)EdHQ$Z_#)!aJ%d$Lq`Nj9bfmZ8-j04EI@-BtlPBou z@q}mmyyy1`@dzQ# zx#RWw()QHVRy39wcdad!Y(>?SiG&MHQ4{55JY8$YE+rZt6jopS{Qc&`JE?ev6Knv`EDuJ-A;w$6RR=gEqJNj2->hEu%ka7rqraLU&MWD+lx)pCLD*OuE z?0ksH1hEhgI!K^@Dez?#xkkDJn@sY!5nkBKsoBmYo2Ek|#KD3ti$C+|L*~&f%5%ed zqj3Vb>G(5NE7Vh3Z-%|iMbV3ao;H1}a)z>XNI?-UE$7JM0^aV7Y){GAaeTQ;kNrh1F3487^s>0PGR!{#I@GwtmRA83 z3^X7xAa7!73Nko1GnXJ&0Wk(lNls5tPnTC$0rLShmrGay8Gr7*!14&@icGY-Xemu< zktU%ADGyV@MYNID2NG;*0=u$2LLpXp#O}8&4^q8q;>W_2hoIBt7ec$){{m#b_nHOOg#xH5<3QdaUg}CI!Y0;h^ z;o{Sb80IBD!+)-%wlG=SlUTWj7Jx4W5|&{SmuutnhT^;}n>OdGBjTP{ zM@C0SsTbww^0s7VpGV-NEwtAI5bBiv&c(!^`cD6dzbHk`k)fshpg}SWq zta17rLqWbSPo1pK(&gn6LVR;GJ^PeAV`>f|8WK-tlYbPFKoUtLSw&WpIb;PvZg4kbsp!BGEqC2!2N!g~Uihk-cQ3&V4rOzOJN4{u#hY ziTv)9%71RryPE+F#RQzpiYDZRLnUA;0!wkZvS{rFeG2e&D&VudgH{a0kcNwvDvP<= zVo~ifeXs*c`L|CPPo6m0)O(MrA&ag~r2dqlLARg7`JL|imeb1qcKZde@&0473_Ah0 zIP7MS^gr>%U{)N!5P_P-ma>*oD1=a&uSGKYsec>_EEavWvDyp<;J0bzpW9lY8+yPA zSES0faRxAh(WbXqtl;3q(^d|TkKU`@wR^h*LO+CtLv?$xLwr2NIyyv&R^D#AFZJz$ z2hc9vrbHY@;-*Hf5Z;HfJgG1*&9RLV4GPyd4R#D=#Y>ngV91M)Xbg>?>*-tT(yz zwsrg0O0-7JjGzJyy*CqQUOv~{(x!Tg!{qu&ZcbAUAFITlIO;umLnzq1HgmZY9SEqn zGGOg)=~T72&f44I9CQ_&$nrFx6u+qK#(%^PoHx;f`FmD0;8vl@4y_LJcgrrSHgszC zXeE%?C`zb;hWs!CV=(&k&xaa|pt9IpSz4*eU$erHx_@Bg zcLg{M6Nd$y1+no75JP9HXgHpc`;Req!-ggJ2mO-qSqVOvMS~;+TyrA-z-BU4ZHFCv zdV5i8Tbtwb`86Mw1z0k`K z-USEBYEuj~N^9u>=?(Hnt#!?kU)aK4Qs&aT(dj~`J7}ELUW^P0E)lQd9e-iC`9>cM z@gvmd8@f_C8u}-v9kz$#oc;(M8=Eu}jxsw!=EksdTqK3I0sbiLwYL?=&QZWd@DIx$F&QMMROs(AsO@2T+X zDSdy9qfHZw{UyLNl6>Nwb5W+HC1t;-EVw@Pj!fvh~pK_0AF zPIe7)jO|Q!svp#Ie^p=H{SpTC#=rDo6fCRq4fcuNm>8oA3y*Uj=`+gR)7yKp`^?DD z7~MKel)IlME<7|+6GwkUxCcb9(}l(*j&q+G5#heXz9QCrNoZ_nOhRbL^PPR7BR9s! zg~qu1MTdmOL@`Y2VBf^3b+eM9Lwq)dF7l5Fi;dF-#LtV+e?+>D^PD(|wK93}J#9e`Yo_lv&KEm{Cfs$a=VRvimxa-c{B?eWrk`inMmdW?=H8an@zbgXCf?z^+1#m zmB*`}cC~w`<#QZey||Sjt1R**8wZe@^S9r>(Nrq->U5&Vcd@Wnki|9jGaSY?;gR-T;^5;KK0_xO z&_PM2?Ql|aALT=cM6RmToH_3r9H!$sm~(iW3UwSZU$kC4Zi<~QlFC0%;CjjWOshP= zN~?6me>v!)ki*egC`yI2tp-C%mYA_+Dnl`P)zXbo5xOem ze@cuNaNzjI#FI?+8bbP$0S{kCPn>-3G4>Tn9$74q{(#Q6o8i3@t5jBh;-C#a0PDsB z(WPM!2*Lampdbl$jx#Ov%ebti`{PDRGj`ZvdBN!#F1}=Km5LJZ+VDxloeX*W2D+VT zF0s@}fgGxgPBzXj1L`DM<_O#MK+r4JLAO}J^`oZmd^w?vV)8x!^nD~#ZhDw=Aa5W z?1e4|GIO`3r9rAeN+)B95aVbZ~X3*ogJ&H#$=eew0?vlnl6>^TKD0efnyf5}^U z=><>(yczP!C0a9CZo^>~yXx%PHc~|K7#Sm|aH+B)zA5HB@HqI{mpB~7arenU|Deqq z)=8&1GV@ohckTY8lvQ$raQsy3{yN|YG>rj!e-~5WCcH6>^d;_3Cg2zxbK>cN;%$(*)u2z#ls3(u zmk>;63^U-svr?5~UPEr3$y##cSeXr;K>=~iU15jU_u)G!wVi#e-N4RA4@IXLzY#E; zh&Y_YkXSO9j38ko4Bd$bZluE;>swmXhdb{ye_U?5daa@j zZozqV)tcjri~L{&j7*)fLKUN1s-6b+{g{j^w6Th7vDMyKFJm*^607i>fNv`CuixB# zg3Q>v#9Qhb`@GeZRe8_AO2;#(q7LA};j41HfaAe?&ODe*#!E!PR;qgT;`WU%{O89f z$SW`e;{{7TPC{pKdum1!eGA;NjrE=~SBS)RGiRGUbn!bd!=)MT;n> z`+0HC8;Yzxf)gL!Jc7wbS-6d{PmQ+~*dON$r#791Vk!Xf%x70yqO2)$5>t8N5sg}#keDE9%R>r+C@{ES{d5F?$s<@#;unXa!+}> zPy+eeGIJn(o0zRnf6d6!NAF*6q&*o)Mg!^p8up2=$&xCwESbBYKD|B$H2j+rAR)+i ze|xl;S!&2l0zLusaT4LUEs#;1p9lL(#X}`0!rzC3;C2RIDnhqYn=G3TO4_43fck$Kd++I~m=6{w{2U+gB|Paeb3_D`{Oa`h}c!0Qhb zm@oSZBg^#He_$WqVrgq{zqg7EFo`=8z)-Dv7gL#BHY zcCK~RzU|WKz{8n8#&yIO<&-7tO|FWDAYPsDH{v*nNYyxehiEtmJ2(FVtN(LYb8`#! zh=qj(dn+o=t-hUX_nZkIKYjYG-vh!{NY9O#Z~67|f5oTr!e3oEh?~A<;j|gq6=y{J zjw7ny1fRx@_$2CC`3<;b6LY63aprFh?MRi+nyE8)XA*Rzp#%?i4iM1MrVPs&0UA0+ zKp4#m=-Aax9MzmPuLBzC=m0APk92>an+CbPrJIAu&iTUcUGZEu;-6B)E8){$F8H4v zUb{<0e~Q{l^s>930=4!qp~lm~!&x5@j{xG5HCb~cv9h|#R9lj9FsV?q6qM73;4e3X zdQ0m#8ki=nC5j2iZ@%)`yNyky(t1$;Ahsw?yP?dK4%;Q)T-Xn0p0H@87ZC{MFqjevxC=K7SOQcWIV+7;>68e-2+YXTw%;>)koU3t$Wc`XvPO|7Wma zZ=Jqyyexj&e+@SOa{||$ukfeS*U{BvVQ>71Ar#RLd8v?1hIVl1gf4sP3$3uZT8v0b zj)hJ9`pVd&mc!=SGi%NbCrUC_M|z6GXR2?IpZ*Lx{)Dr+3Zo%hA~*m1uRQJ-Drqy( ze@B5^u5~w4$lDQGttFzayP2LFCB<&1t*MlyVaiE?k2^V`DhD=*GZzpA!~?%YU7|b& zt;YJjd{-Hf)LdiUzo40pr_g8@&EOY)3+RFu(XGXP;k%(f_EX4txPc~OeL{x+wzM4? z(_kAl(ecXKBVYf$xDXXzUT%T!cyw|9f0SCD)93|bm)o|PYpkY|jS;4ZU1I&o)?Fsx zA2!YKnYP?VtCmP4*_@V6qg0|>l04WikzpDK3Blw)ZYUy)< zNW{_Gf9i_5t%s_Pm7FxE9bJ_#Ha1)aBk=b@6&abmdV^Nlq}!Aenv-JKY{<^Z)I$bj z^GQY;@p`2cbkKl~;LGQ&%2-G3NPH zL~D&Et&?D<7MHQ0VqMT$#R`hJZ*>$zjDmt75OxS8A$c#qmk$KY%s2g} z#mDo|;4jP_I*g)KF?P^#(PD@~6g9!>Ax?I5mzM zLA^yypaxQXss7Z<)Bs9K4JP$cJt(!Phv-bV7%?TT?EY5wEs}wfdODbX)I-ZG>*>?; z<6c{P`}MYe`1tue>{HRF!}k^6vc7?Rcl;!ZSTf(&B>|^PeXsdHQ8vtuSz80p!dW%WN=9;uj9sNm}K26VQ zO*-XRx5KcJ(@X-nn&t{j`CI`bRMWmLEjZD8PGMGmtq5E*#e&^6OUl-min1XGj7D8H zKH>g{OdTD&ISjn3>iGA~d!ZIS;dYpccgeI1iuT#ST+yhkZLdFEwSz%GZ^y%Vme&F+ z-w+PT3NM&e%V)3$_CtqhAIFzkDtQ}|O@{ziR@lPeaG_Xw9AA)NHSPP8xYSwql!71U zi_s&0m%r4o&BP}GgM;Z`sBFBOHKynyhl1RTu$4b-ZUzUO=A5Qtrz~YA{HerT%G(HG zO%k3)zx$WSqA?fPL0$&MrB)ky?DCcI^a%GC&j~Wbw^`0XJILGNQ`pTu#hXUY$t!kP z_+s*|8^SJYQ<41}kUI$Z58EhP+gCSlfyhZ?B&?BM|pg;$ir@^k;!|pauzwpdV}<6B96h zJpgxCc6GapSXZLhwM@7o?Kp9)xSh8;W$|2$DG3r_fq64e5VTh1WaMh|^;#ufhaGqz z+Fw`!R^a73K7dAr)fvl90~N^QA%b6LCeL30yKze#`UAct%MIXivH~~_tIjZ}4e_wS zQ&Ah~eml87gEp4zmPpi5Wr3T>GY~>91+Y-{v&n8?|J6)p)wtHfi!!=uKE3_1U8d;9z z6r71QaNLpznN9~L6OfD7mqdQFuy!6nz6M9*WjGUuBRTd#NRO&zJ1`22?L8CemrTpuI?^;g*bLIX#Jbh9M9yC8d89pL-%}gMBbi>#4 zz0Gm;|6YuS{}wG%G+KmaqHwecjrB);ai9`Mgi5{gW$w^-ZZF0GSwFpXY81HMPyE>F9NUsd8qzhn(Bnw}xP z)$$dwATraR6BYi#OkWe)p5gkAzIZZeN-i5$uvVEiAuKkKG;=Wh9Lz~4YHlGyogj9F zcRBP@JZ;4iJeoW;@CERH2T_gW8vW@m&C+x>hs{zp&<9YpB$>_~nV1#?%vgFaGFY3e z#fQiozeFR&&S)&kgG`f#JXwm=68A}hTH>J3leXw1mqQGw9a&$YapxYP ziGU_D|4TM|+e?dU6nL~l8n$C`C!m3Fqzw6eiMk*9;^L`mz+8Gb7tan##wt8=m@?;d z^8N+D{BhOlC3$>aNr4gt+NGOv6SQ%_Y)Y?eX>V@Z`%&4dB^FO}`IG$!pNE{N!^7tY zF=|2=q~FqKcWIV?WwKdp=5x++0@F7K05hK6hiuO{V~CkIL=DM-*t4?D06!MtZWw=CG1>Re9iC9h{_g5I}!&pbwq>g_zrLf6&XRf(G4^-gP|r1ioi( z4)4T+75J=YoBu5}uiwd^8{UgDBLzraK8SkINCE*m0~qpu=O_zRoDQ;?apyO7UTb(z zVKtWM3QT$ptH@gx7e{!DV&DI|p5F%bO4tka$*ma;v9&2SW>|$3iwHqmit6~X+9G+W zxrrRj%$Gj^7Gv3@MYs7 z>*N4R?ZM}lK*>{c>Ol3fE~7M=H2I1-)8qH9=m-QkUW-@b_i#E6MN%TJ;BPOs9BotD z)lD&WvJ5PiDv#rgv;-2%4csBR+KEa!#lqF6u3Kn-;_|hM$c1T5tM(AGaUZ|eaBsCa zx-ClST-R85DeYpK?9Aq(S&+p{4h#Il8$m}9T~SmG5&o7ORNEk(?Gd5>N^) z23rZwm)R5@Cmg8#I%AD^! ze+`L$4^JJEWh#ekMFHr_Emq!aQF!CjDJN?29%HU3;fd6n6BtiUh-KgL9Ghz)Tpsd5=JF3V1iED^M&Hk-EH^D>d(c zY9fH1ZCUFc_o)&d7!$vl5 z2rw!FqQQIs8bE%V?|=vJJ}W1&N=3hwZFBHYWVRCwqPW3H&$97&F}f%`Cfu6KzXhhg zD*#V{wH}(LKdFk`4pyF1V;vf~m%?baR6&B#TDfl%k4ju{en1C82D~C!;wenM8 z_zOw#*P0pOmav(S2l;Y5;NAqppn-@+y^yp{;rml}@yR-Mook3E7-xuo)CrfQ<@I&@ zFYx9v-fk{au}ew(SO;^=nY?kc42(Q~;k(lGk)F_^W%ULv&Tz-b-WIYrJ6K4RYdH?%5I9Sa`d1n6v*jZb4k*+)pwB(hB!h9U<9!r*Hko;r@>;GAL7Al}5^0xb- z%$#G^RgizyGHV&K2v*reH&`-wk|X8bn~bl(s&}AnchMXN8g#`@zCa$Jv@2qNlrEf- z?$&JQYCXZ{`pwExJp z&9)Ln>%ODgj{$SY8S`$s4)<6WuH3w8#kwW15azYye`DoJO;%vuuWGHU)i^dTfbg6# zr$YaZ1|TV6-T&^qOT(5&W^P=6=h2;%98yn2@PinwIw@^Ru1t$dN=QiEn!0PJv#~`% z${>@m+j)Q#fG&%Lp{|#u=2F6wg{jbjMlmCNG{iqms*P|2jyDFmYh;FaE^ibt@m4pJZrNgjW`>}*ht z0{QMf`~Z$Ir)MAc$1hDAH$S61rFm~nbHn}^$Wwf9{F|aGU=FmVEJ`T|i&?5vEsy1* z*bGu(Ay;T(jZnxGlt7J_cJzu?W=aUraJKUt!R^-#%s!ZID385ThXig_*$Qyj#3{ViuyN#PD}fiR{<24V1xk( z1T!=-F_(^p0WtX9G&BH-$p4UL{2{~iLzX%3U&yZyKWDQp`LRyu zd!gX>4F2!Y0t{@7jBY;BX(i2<_lE&P0bZ9ohyfXY)Wp2>q@u*+?9`H+)U*-=4{R|5 zLjwzgU`8g>LWX5q7`qr4mN9lQb~E-cumb(Yz{H@%(9Lj?|LA_*!@$N`KR*_8_`*C#jjzC zXUYG6c=bmDW=xIzpO^@3()(h)$T^ zJ)ygYV_MUchPw8qhIYB%E`O5R>bu*zyCl22y4xnye|P?qATgo7uW@EK$FwO^ruB4B zXqzto+vP_RE2fc4zt=#G>;|j*?ffG_qHTIU$JE+xj)tbD2C#|p-+^`@+0!tkY1)kb zDbxDp_(~W4v|q^fTVMkFX08X^a$GFt^LaQo&*I@>U;qG5N%EKBfdLf@I3O?}Z(?c+ zG&eby3yA?T21!jQa(O&baG{3 zZ3=jtot9~MQ|Fb(uPhK33WlVQQoG6AYbIgqKx+4yh5{)D91=EzF~qTPurXfnf@N8j zEy+%5}=9P2Z$-J^@Gc!*+)0q$Y zAnCsEJ-d%^YGyW+pJ$-LVa_pC+=##AIQ*qIMU{^4fug}aX z7xz82a@XUi@iBC8B}!REuvx4Z59Fp*@g;(?Q>DVB^=TWDQnqZ_oV2sDSWs42z)MOm z5SA8K76|c|(@96F3d@Rxl4p~4o<5zF89Pyvlv!L;EU14gE?RhNT2&>#R#+@ZO0Oy^ z7Vro{{yj-y5&zhsjNLERlpU!p-&;{2t~|MI>l3W=gpVMO5ibzCiNnM;BAG}b))MQ8 zqr^VqpNTADKk)6PhL!$uM*KIduU_h83Ib>Eoee}c1y~2WOR7n}Ms?$1&x?0WG@bj2GZCwXEmfidBvC58Ql@bwI z&mOjT?7e41MfM6=PuZKYva%(zWzUR|nXQPjiR{Su-`;+|_y4|+-|geW=RD^+*LA+v zyr28r=a3361y6cB>yC@0PPOy8AR?kU$Wv z_Uc#O-6|lv_oSsHdEa*~e%?^&H6zr#_K zQ|%Y}BslX(6oHqScQlVg<=W*~_Yc-0(#G%EWbgg1)+c4m+S!*;L27~$2GNLvgLC@h zk6*3fJWSmvI#!PPn8PK^hCWqsaRr-{9t^bayGWN!nX7;|47Cy@QmC^OsZ3*)7AW@g z(*i{aX^zfCA+I~T(e=M1q>A6;oxrVL7!bXyvUEk9jaDRJB;&F1!ztOGP7y6lWu7VF z0X>2b5{6kZvR#Q(&t4fWmU5fC*0*ytyh>0yTy&d$d9KF&ATfF6LZHV);`!emECu2b z#0oHIR|3Zi(;916+b5(^9!YBxJth@y4zmtN&6h3)AA5*dRam&NjNV6lZc?tnm9u8d zS2$WWSque5nocs6OCuO%*}3ZY%UVoxr29)hqEw*~t}yepu2g!$LiWW=u~ZhB83GPI zCeZQEcA3jW(Zk=)@jMzFkCo3XR92dUsm$d-K0mv!jzK>y`l?*`%}kj}321sNGi;p}z06isKg0b+`SH zI8F*;KNfH5C(U9XQRfI!$V=<7tw>mfA9y?atT4k3dO`a_y_0gsq1cS;3@I5-n^bR# z!7qnP4#ni2fB*IHU?Aaw74izgu?J}gh6O+7*I+Jg&GqU&cp;*ATeLWC@B&HyOFGVa z(qt1*S-}tUT%noBWMjz`aU3P|F-N#i_6M>7eFXpOwh`;>9JN8y+L4_0_|9!jqdci! zlB_6)hf(bai_!>5HvJxn4X-*rgh~I#qyA}SE4c#fkIiZN#5YvsgR~<)=V%wYuRbS` za%3o{-g_!_o}|FyO0s%IH@8YMefP zwI$F?GG(06HX3!iws(z0At^lZPAoljKpMw@wLLeTw2f~>-tRZ6n^&VcldU>77G7RL zyD@&OB$s%-Fc`pTNPlD;S-rF##Dpr}iy(I2aGn}Y1$~M7fTnk+xx6i(09ERf67B6$_{TP!MwHyvThW-^#+8QhouanxCk}YPE7x zQ`xI8o^X3p_roLcXmxp{8CtuVk92cde*m(4L)Wl8@<-(&s!D_utuln+TIQn z+#Hr&Y7++5QN(c_8R@c8sE+OwpU8Y zlYQ?PugVt;jB#Z;!f^Qlb+i+KONT}eF=c*wC670MT~R;ynimkOp+5HFW$A;#fFlZ_ zr`p6e645D8J*6DRoMFy_k*Bwwe_DzFn|`sN%n9zfzv=NtVQ_)!>dqibA%e%?XkzYGc7C#K^AGd5 zi{?IYxs>@^r|MO-@9@I$NQH$koA;Y@9fJPricKEP7}?r@FOr2f6v{kWC#+W-BTf9; zwW}&7baOIVYc~_%dU0wxRW=M!MO>T#McbZ3UeUX|N7+m#Hco+}Oib6BZ(BpOhdQ1x za~qX5@UuibzhXx=g{ye{YPatv z{c)E7T1sVA;a@2}VUkBjbhuwHO|LoqzY z+7ZsW-$(LH54QIVXZtEW_&rs@$I;cz3GO5-g6z+dG)G0uCIYz-H9C?62@*%B+1sCv z##Il{;{NR-8Yfu745Rnf-S!UA=DEWY4{Xv43QUMmhGPA{lV3O5n56NzIcy$QE0~;r zdoOeJ>9YdJm1Ya%>~buYmHmqFH+xq*lX4X|&Z6ZiO9N&tZJeQ|E^jzTWtW-3#rxem zyy5Lm4AzwUCzS|L*&s~Wqc?G~@cD?<$nN|j8EWZ-SnJs86|1aw@7(Lm>rNO3FI6fD z@lyX1#S*6;5I~OV_b^wyd~&LG*9!aWo>BVrk85UMCQW-NI@%=ud2EgXH$L-;H$9B@ zi`#e);pUQJ01qxmuKN+Bw%d7jCj4T%>Th6UfTaTw4n^9@sJr@6kq>zM1dTiB7hBUP zMg_BDeU?MM7lpRlQB0N^aM^XL4p2nxy{19YeZ2dq{|%+{lTQkW%i{D13Mqo!bG@R+ zD^>n^((8S2W3#UwN%`@Xes1G(hg}ctlFC{n61u0zccU_Ked7y@W#2U__^tBGM(^9K zr5>*Gu--D{m?L-`oA)B_ffaUB7#pmX$vYYx^B~f8sWOlxIp(AbtiQti?ic5PV=KXC z^6OR2hoBak2LoNqDOaUt^L?`!z^bEyjl_BI{BQo5kx!S&Y6zTv&y@vH4$khpFB5XP zzhEA#DxE5-j=N0ftUX2)Met#Fl>FTwvDXvaZa}sY6Rzh<1w21wWqUJ6$CU8OzQjUh zoI6S9S9A8^6FA)RK|)2u#Cy-19|sWPkG{2cZVSCE=NTZ`?l#v$RkDb63K_`-S2+Cu zb(8jGuUul}n^moHJYgTyYgqX8hK==OSBvXJdi~s_?nT^}1g-9mDHb0jM|42QE|i1a z1?kW(tj}$4nH{F0zGX)Z`ZCg%RCq#IxR3&MZ2X|({$Yg9XJ=%eK*>TT{o1oYUbhZu znOoKM2#IS&IRPKYN49rKeCr{_*I_9p%B~rN&lahLbaO!>(-VS_S2kODqdH6qv2GxZGhU{@jPQ`u==>L-fnbwJ9=j^b!*!0SD%G<#wUk@SO}p=c)XY-a8o3$rmZZkUg;tU(geX!ryCvq^B$-G*n3N3v_|v> z$3m{=ioO2Nid#d1)CH0(_IdKeE3zfGGvbe>Kv!`ZRt5#@k9Hap} zUeB#quiq_rJnBwPUsz0Ke)9Ww!^!VPW6)06C60?14C|(*Y6d>K1}u;mQy-VreitD4 z5ULyz@8?l`e0~0ycOi};73W1^$rN4@d8h1ErXRtx(TN|gASJ)=)7+bJ+E_vZSrh(zM9|fxW5aZaHyzz?!pkffgPFQ(dL%N1v$a%{})pw?t zTk(R-QtUVyK^9M{Rg1vM85>&k!<{0t*lb)LA$JtP@|Q1kS26Zq5oSfgp49=*KLu`U zTlmuF4kT;ATqbmCzfujW=E4>!jDj9xIWh*_q`h;riRCMEdoF&ETcSGRUi72tZ(+G? z_Ep919QIyLcymvLJU!)y%H$Fsx|wpub%NUOPeP~LAJe%TEslkT@qT$0@RGh-Nxg;z zch}$O?juOpyaCOtEc>`m*Xiefg_Z;%D(TzFm$Bj_fW|3%db=;%AX;uH2Xx2q3mg2Og% z)aH1?Ri{a?TEi^*>U*}s(qqIDX#xIz5$l5TNA+x32>-_v~iNVq?P zN)M&3vEPHKALfbHX6{s6lsJJSKW7cJ5%|W-TVW*+)IXIJo6$BOgcT}&mMrEUO`fMt zC7RSO$qXK`d_JEVb3;TdpXf_SvnuYTanSY=f1!T(R#WV)3A&U~;~TN`O^>Uj@}dSm z4!7Bu%1}<`@H8|JPi&~GvCWG2it=8sT9v1}S+$Z`jL9)@+tqKpDELB+DDGx--XPB6g&CpVRLBK3KkK?IY-+AIwkBc)p=S7vRHP)DcBQ+rPXTsdp(&k^N zWc#${;R3CiDR85C6-l^ZTh7>rT~BKh%ZTqUX5&&+2u$V;M_=h{<>$FYP-&J>f-nH-L#Ix!r-c&io z9UfEP#O1sc>d=!?Qo22^3vEpGSwbx<{hJa#TGz>dqYp(Z+Rx2jN8u#L9w+ROc~dq1 z9HfKOhOh2dkL2=pbZO4bKEk!qM9=4G+&jNo(Ur8fYtbtylv!X#K9Ik6+uEL__q^2x z`Z%bq@dEBLpoe1EYqE$B{NBYV2CA79?Rxi&t=$1NEyuDRxy-YVh zZ-rWps-djA#hff~Df^Sk22Qlvtf)}agEm4uWuBG>M_Vti)qUle#vYD8WXvX?(&(Gg z)s*#18Jf=iSOuw$`t`Mz^;=VIrjT}(+NC!Jp@Q4y!Ky+tyv~OsG`BUIGni}i%vZl% z3yC^!^14ZUlThIJNAZ@6b8&(gZwKdUDhv(3|LYxE<&cCX?|1)@_%QY2x_s7F8&dN! zdt&O1l=k|NQmpSf_B$45fgG#QG;wX`43Qx1B^-S-QS>m-~E`ASdda zk8@zJh^k8h=1KiHt{&5`bI;0h3RVR*)V7-$4j<%U!u7#y9H&U+HD|8BJ}Uu{jE&&NF#GunoJ=L-28)tea*& zs3Y{|!*9lARz&u+*{O6Hb}XUiCnetmggGl0^mcV=$y;R+)8M3-3O#i8v2ks~oIy$1 zfsV=#Q@Y=34zCJyRowLTOF%Jw;%xKs7WCD){D=%V64H0o%TzdGidv6@Sl{OH<#=ON zLrZY^`kJO*5GG8}<%hh?3q-p1RR?f)RVi<8aUNYSMCsj+J(>rGHwPUiC^|R_HAvbm zH`duecJFX6$VPBaaaGQ+ObKeNq$rFl{aMIKqwe(fps3^>${UMW#3|*GOSPfy2MuKn zVC3XXWP@pA$&@FxE%fVmb2~HBbEC&;k7~DXJ;g!x_YDTwL_{jctAh$9qHl^7LFm+H zlpGV%Y~^$opKy`Pmu=QQCRV-kR*=VlUAr*8T_JdiE@u_j^)~S>wUbb(z(b?v_w*#> zU3$Q|)HFjYWcgdpoKg;(eRyIOCw_hq2n#e4pYe*Mpq%Zy)`>El zS>4vBHL7^A4Y~ea?uA9h^+nj7wv|W1w0(Zg)T@KO6W(H1s=oG-#3-K_XPPtU2N}zF z8yj2wC<*2+eMw>AbKp#05@?11!#phxB9>k!X+Cl-kPHVk@wfono)B)iS0X7(%^evw zHh%NMUFk}JXs&_v=0w@1F5n5AW7W17Hru1}2g*hW5(@7u_Ak4|w=!{0HAKiKFUCTu z`^W5^o#qP#IT$)mM!S>CW$|XTv?8S#N;%k)uh)y4?FNfCJNO}%?>M9j%WuPurr(4n ziT14C@Pgttcd5lv6@;&S<(hiTS?p%BFI=`ltMTOly4MinwGV53l?bU08@y!|%i&wF zd0#xb(EC^}HO-2u@AdQh2ocxcf_>O7v)7nyrf~D0HjadvPHk?2lvX#YV0AZ^EP83s z#3Jt~7npvq(Ig(gU$aV4W2tH~ z5vJU2Y2Q7f7RXUjC(;Zx+(pJKu$Rv^adFa*-5$Fr5WU_7%r%?L58d{rODH| zoJ-!ch|~T`HY_z>JLITz(N7ZYNAqCND63;r70$#y>JvklcZbW5P|%D6=FC=|mP^z2 zjyf-wWw`9C*VL0=k|G$CVKyf>nCx4*!7rze2oB7BjJ&d3Ust=pcbdWo^Z|9xLRD{u zO<<LgHw7+4dKbnzFc+c{F1Jo{|m86I%$|`>ZHxCK@Qy>NF(n{ABe35j9_QREA6a z#Nn{3YDTorbPrv1Bm+dtl4rLLza3_XI`{9$c!I@X#%ffyb7=xy0;aFv=8Yy7KJ6S? zjf?FpDlhuTEA?r-^bX&mkFj|4tEP?3!t-gIVWTwXcZ&NDd6J?W#!cCkd?%Xl{*DQ|g4rUr@942{)cP+%0gcF%8`K z`riApn9913jh%t1k*wS~Hy@mR_ej_t?v6ggd)l90;~1MP8h%$IZKWoK9gY=;Uk&3# z4Nk&ka93Iyzt-9sV(CktxgAksMT!S(7*-{2nJW8!j@G)rJtQ;M=3(w;U8mdloP#8d zuh3#`^$l9;>XNLdm;Dic3N_PPA*afA|C>^4akl>AQA2H&*$Jd=hu@l4z|Hd)4RC9o zkNvE#?WqkB-e8UtHA^r0mAn(PWYJeU+Dw%49N%m3Ca6d6&@j{DLE9#Q19HW^e)7C|dXY`JLy%7^-CrhG`YO`Sp`|>?3wY9~! zJdSCVxHy*S)T_65fTMBzUk`6bmR`VFPj-wbg>@%xg@Mz$H`5e zA3A?KntXGLGKFEaj7IonJWk)2tJQN)N6M?V)IhtLn@URO0V9*}91k*2-_{>Fe-ufL zv;Y1rZa5!B?AK8}Cu;3s_+UPEdSd9(^Wx`vHTOS!8r3nXbNbP`A8AmXE*SM3H$B5e zD;N?K#7l^Ux-ah8lkbSEvCDmjgdEB*j)iMSKbA~+^&|S#i=;VhjZgDkwz4H(1&%fg znne3_h66^azB=r#v-|k!_~%G&aw}#Y{VSKOvg9vYY*y9e$0sQh4vsnl?bawlld?Bihm}Vu3j(^=$p3YkwT86SrSiQps7J-fV4a z5iAfnz5H3=Wrtsb#>Pl*?iUtlur4!WVTAU_AcUZn~WI>iG}?rgv}V2|L0lNl@8 zCXO2i%;qH~s!LAcFR?9qX^5x7p!$&@&;E}Vp56`0)Fkb>-F=-ezXuZ=RI$Lm-6FUK zdgZU{OhS#Lj&v^$3G>Lj@%2|e>V=fx)Y=6ksp_T9HnRf^t!h{&6SI;&ec;#Y7aqrD z9PB&i%9r>kM1}A#iIK1~PEX*bPqJ_J^Ze3U4i)`<(>+_Vl`06_e^T(UJdw_ecCPH_ zD8+0!C8<|`u8!D^8)6zM1?tP1?N>KyKSy2iruliJsi<{^#f|njR6jQUyu5VwNB-N@ zu9T$8PLtFt-bAzS!xVFuaG4|qJZjD*7uNaHf3y@uP6vpU_0K}P)u+EXBJ1DJ>4h9H zyjYwf|8uUb zWnf9k)%crp30c9CN#)DxHNmlkgUH*!Db`mWeVRD5-OB7Ll#3G?Qu=LHQ-eFq+DiHB z=ed*{qr{8*n%dF_8{a)}iE$2aj_o*mv76Q5IN-q>QCrncbB`VK2ods=L8=7tfW^X~ zMQGH;sM#ss4}+SP^*QBLQar$03|vq65j)sUet$&`{hM0y(5wmCggbe2*B#|@@^UqE zhV5ckUwq_{kqnaWRMX2=%#2Q<7*^Ea9@5fJkbaRa$UVqK>T?nJUix-IPN|fEKEFuC zBist9PY1C6`BN}^>s_|!4mPTb06qzny-i6+1I=AM@i zp^xi(_7?Jyi&o6+E?C2$UqKTaQM`(d1vtjI!@`RUZdJzna=#Rt>chMRn4g%}4ccWM zX_8ujxZy4NY1Y{vxr(wsoYM#EC3Q=aB0u0vn0JsncgV-g0=+6E+EwOCh*gON-B`LL zpRV+qVFV=mzMqFYaR?Fdcsjz^`>YDsX@tD4TxQfjtDqoyLFE-0zj5`~N9JzGz`aP{ z)JyIiZP+YbI(vkL^7eT>`@#9Ta(Q;MBQ}DQU#p2w%j58zs}L9UC(>@g+?kvPuTAK1 zbzo35Z{KeYcE!*E&~pCQyI$+{Q$CUuBPW#|JJg*j>T%0ni{B=_uakbvopk~+^tJ_S zQugSBKP?|yMt&Yf?H)Ij@afhOlm8T~n<+{ffN}9ZW$R1HC#>kSE-+8vOtF+9=x6FP zmPk@NEb=91L5W|V-U_t&g;87o{!KU?w>tQdAOf4sM#mC);i|9MH^{S0hwUS&ZIPP? z2iHO#7Sosqmr5)bl37fd7QIJQU8wYmUTbP?;x!DE>rw5@9g3sGMp<>L%MD|n9C)Us zZmZ2obLRtx%@codS}eCHrVNO4YG`-ReMuMTuj>~?^y)akYAXK0IPAiypitj(q8SibQzeGrxM z95A&kv?JoMMo7z~IG?UST$0?1v3Wd{3q#Cw%zJKr1 z*7nqc3>~IBRLn%{kIAII?Km1&iD|4>`v7+}V3AIv?03@-^N#@mi-xQ#jz!yN7MESn zIppSiwrK+aZ~TRHVj5dlNZP{r5>k3t?Zjq$K5maqx2CF9v1<*#A7lPJ?vjQ}>7Nof zew~6XeSu=iVM78rc-AQe(Vy-1x)hYsG!%R zOF7G4yQjqO>B6Iszh;W^ADtTR^K{$a{m`8(oHW5B#_^dt6|wJohkDo+2bbKl0P7{h>#nF9@F<0|9 zr>M~Y54Np(8pOott2y(E+0Ws6e{XS(H&csx?p0c*tXyeV5$*UcdU;1NEaD5QK2bV(!)<*w$i+=fkNgQ=p;-XY#WBGN$7ca?EhNa@8&r`u~0Nek6XOfYJ0ADtk!H$pZa|1y5MX&1tudtNJB%TjB}B6i{Z zbZ+3j5X(*R+Viq*QVU!F|T<*Pl^e3--FM`4=uAJ}w0xnL@));fz`6$1I^`kz>13y z)?<=~DT|!{D?>v6v#$;Wg#-hiU-*+a;gJ8NNNs5qUFmp1AJ7Z|u$9fv^IPS^oPQ|2!U~ z0fNQP#h*TviWhtdLV;kFjxRwt5Q&z)1Xf4AaxVcW7vd?BK-Vh;l0XIo|5*`O8I=Nh zMM(ZMJsZ=im`jGrN39NFr;*{Xe*);&c9o;_!r8OX5Lh?Tw zlKyGF7YBf*(Ev1)Na!iZsA*MxX$Hj-{J7MJxLc*&z@(zA(T-U(}g47z~L&A2>Ar#uv~f91MalCm4o8 z!1161WQL*fVFE)S5PVihI1GU&I~WPbgx3#XiiDktgabzYTNg+e>XE+YXdysEUYjz6na(|C@|H3qXkC5h2Z~`=JaDE0tLon0<^*4cn|{Gj0a5t z4g`Ti@oWrmm9zc^@InF^3D zY!HK=SRr623WdiQXah3WztI9{!Ek()0499~K^O*s!QsOSNDapm1`LHG!Dk1A;-?e< zR3O3qTbNVYGj;?;V*Xo5#g7aFi=F^V4ET&BNDTU)rh2M4C*vvBFIjGpQR6{zp*2{V6cP zFd!!5GY0CRvrz^LLE)hQ0YfnO5efpqpzxCxm}>*aE7)dy^nK z91soh)C`Du#^zv1$Qe(D1Jwzh=zzH*&qQVz@_*nBR8)Uq`;VXrXdiW^enJ2_9iIsT z4#VJE6Odre^aBdUGjR$D2V?%}6MxwYkktQK37%RfP*9=py%uNz+yW0Rpb$J$H~_Wg z88Zfw@0nr($mX~+jDZkxCUyZq?)2;8)9Y{32CN;w90pPr>WtN4FenUu$pBaw><_B! pe-C&XfADn&+&KZoSG>s#hy}Qt@}2?Rq5vEZf+XYMz^X`-{U3y>_Wb|= delta 61164 zcmZU)<8v+!&@33+wr%6Ywr$&Xp4hg{6FWJvZQHh;+~0fa?$*}c`PBbFcg=M7#4SKJ z3_>QT0E}gGxCC~H!LI%R4FHF^!-&ZiPNh61mn73fQ|zZLtK7*!x>ZVdLJ7`xgtZ`_`-`0LTtUj^enu2)om#t4UZkrjd|y(d?H9jjQn)@L zA0GO$*mZLnPvRLYUjbdWc<0k#5LNvt5{g3_3NYt;HUM`&V1j6!!yd2{`}#7`Qz$;~s&(*b( z=XCzm&S~rB^N;lyc#A!_Li_pUZcOZKJ1cVL>~vVZR|T=HAk0Eg_i}71v!BkOmqCYJ z1a{$Zk*A)KXafqSW%G$JAqsD$^AE7|fxBL^0Wb~-H(QerFg6rmR(?PbY2?-~iti%O z$il+I{q?Vs0vU{7AWQ_7v>i2bPq*FrgG2<*fDlS!xLl8e`-9!*B^xG+;+S`+Uxv6> z3ao9jJ8szlMch9>`cTN(sFnzWqGez-f__?~(kksCE7#Jx!!{^(&s$eDr1+w$QSHV8 zDQ&`%YO3-_shVT}gw+}ZUoAO=16fOXldF?KRTQw*Hmg=jcZshZTune?P@tyGHvhlt zW_)4Tvz)U6>j^eCH|fCiwK8w4^h-^+uvqAk0@)~MUYM|z9(F@F_SU@TTGMWe54DfY zeid~+;hYja2N_Ajm{WWZ+5^1$MxCKbzXR_{EpESjzm+&Z+Me$-eN9fhRY7M^w%z6@ zhYYS#knsQ!Kc$ce>FgP@zHqZzJ7O{)5ULV5sxbSoI`2HcLa=Wpno)=qSk=@#Zz1FW ztimbQ0cD=$po-YEIoCPpAayn*Qu9Gtv2#-CVG*|GQD5SIF|bR)nQ1`oug)icxaWHn zNA$+{9&MTQ5_Z{`zTC{-)Wy}=%*YPrKjdI+4a3Gp#6Rct&iUyoXBxD$4 z1U#&L<9yRm{`WR4rJmUCceuCdc+cLE)6}2tJCi<~kuo?L);v6pYq|wbz81m=8267j z9wAO4^zz`iv*XZF)3`)NE#P^^)hMzNFHQC&xLD&>KSyClw;45+Xn_eIkWhke0y9z( zYjSGgPht`B$K+to^y^1Q;39%aw`{&?akA~YUNM9v)7{UBo7)dLyk??l7hDGXTKf;m z7E0B-;}CqzM<(UyJe`P@wx3#EH!xaj$$0hjcB`gF)#VFjr4hHwIUwCz>*GC(Nq*7N z&#m3bMTNkAE9LTdq_Z!=kq*33^K~kBbu%C1I0uPP)-0k(cW5_GVWR#w>$<9LKwM#AJRqkfnFbh*T`h7+riQ&aq+#g4B~q||zr{2;I_N-Y_|9GL*N zTg53V@GT=H~;n|ztPd#+Ig*fe@`P)giMD>@1>HLyOOgLvKPYI31h8+u> zU;B45hJd1AwVug|b8Z%qlH=YNmXbS1^SPu0Fe$)?mEz^5*MDXOLo`{O&( z6Zf_UagU6TxyKcZR%$!7rqXS$@Zjye7yA% z?5W0RQp>go4Jv^CU0)P{rpbK}#I(&03_{g$5>6p0UD4-TBQvI{63VWOoVZGaW)*he zt}^524Nk@v%#kxz*szh(Xa*E+nN23*I7Alo;|L@=bZUp9n^jDum0G2lt{dGfqJloI zNh}z34|o!3$QoTA_|tR?ta8@hxZ}y@%oSVQm5m-Pc4tclbc}f4tF&dI3a+qVZ{F*ylqRY>oW_G{zkqsLeS{ za}omGqv9MuTbQy=o!0tjnLCm;JloJ1T4GgG2QWm^k|k=gYt=fk;w4qaGK@X0sJm=^ zn#dqce}ziMUn5J*_PYu~RGkSiqRxTCnh9f}BzKi)5#C zL8}3wKJcHpc4>mc4X0cOS)yr6OUJAzBtYvVK_UkNCh_b^4*4`PrZ&c8rc?6%9K(E+ z-4*yxvQp8duv*zCda7n@ho6cgG3T-<>zp9{CS);0LjdtMz0|d{7U%Ibg*vV)N~R7~ zhPFeU0}3nj#yp4&nPTv?ap=F{n<@y)Of7cRDzy-gPJ+)(5_J%;Inxm`r)~^Q0DvmH zK%U;cz)Y)}gIN^m#|B;3;*4P|V@0(OVEu0mLRDn6QlS`MUQh&Wuap9v>E;on7{lNQ@JR|P^O zJoeFwU4<-E`LU$oG`uiK#x#{r0DxPFiSV98sF`j#o zR7{Lb2TiU(?#x-b5)oINq1O@KVs}LKq#XMw)|hNXe_b+c=jYk-1NH~^B_KJm(eC+; z;RW=1bEKuth=TYie%vSA`F@|c-&t@bh-U;?YP7J;3hJMphvn|XHZ`3*@GXxEnj&~w zKc-)&pj`VE6#hYITK|cxffx5??~^n zH~qA3Z}#o^F1kOvVYmF3b&vpTAjRm@&`ywH;>DcgJ3MT%?>!9r2yp6zgf9!Nnhj9s z)+l=LUX1oOM72)%^fBtiC4VvTtzY}}@2e!*65ygn*;os%yDYc3r6gpaWMrW58;#w= zIiP&y(`!M&W5WtlKxo7?HR@ptp}ni6=naQO z+?mZ(dh0IYR<+iu0yNTPbIKvlqFhsE^J3n<(!kzQ{%N6^dnXI2s&aNB47`1S$8t!8#0f;be3;y7Wi;H&bCEWJpZ??s(t+E;dKgW+vt4UaJJsLO z_;)`a=0RY$KoPsLYWW$uRrVGdPaDT%&J3nN*O(XH!0!&F;MVio_WJ{Uq-pe$`~koP zV_{|CO2!Tl0kmjbIxMQA?Vf(2V|)rndi(4mHV`XOk)x37oj?-@B{=0A)OfKuL43XP zyq=f17fQ+|UR->U!{CzU{-^kTz(uqTz=N^3KXJ*T*hq1Y*{1&lT2NVE>l<{%9mFeG+b^;y)%Ek zx~r?XAZ0?v3XGpVp4X2K>NIX*!JLc-vd@?D@M**94M}(?mhd@=A!eB1lX^Yk%kHx4 z1bp@F0OpIu!}i{$VuI+*bdtOuGZOJx!`{rz!dawInFzunb(8*5PO?KLl;uKxRa2b` zEy7D@M?c{Y+i%0LUp=_DbK%4Z16(VGPEpjyl9RRiLfB`auGX(*c^>Gph;T4bR5GQ% zHH@H0ztuf|v(J@KLCip`2%0$Xy#0>84-=GZ0haML+X>@*B6<9_dAwfye+Z8W8S3wm!dK^_jNp?X}i_k5SGf$uo6(jltWcDyu@o<63WOZ73~q=dDjyZSWC*oi^kk8;aH+_a9tVGT@HBA(5FDPs_GeM01sD)ST9ow?@)E(x z^I|Ku?#p{ea^et_jMw>#lNNVae6#-8Ik7o;Kc$5}=@1PveVM=>+Xqyif8b6c4gZwQ zdSI|IsPn#v?gs$1kdm1jUo(ZKFtJJ3T$oW&sdN3c@r?)OYL_Lasl6QFgceh71`Hc` zz1oY3Aooj^ae_p|GvVv`td@srYnWBfrvLC_6(y$`@EEod^SU6mx1ANdfV@Z zVhuSCOxo*A3)84Z9|yz+&$T@p`{~W*s+A>#{39rW$l4^5LVz$iN5jsD<_&aGCpO@- z21|#Ai6fH)Lzj!v=wyPekbeA22S@`h$|~zJyB_fXKf1yAwtb?q?;cz51wT>zj(v$A5}Ea#Ng9 z9$!dAGoMnolL2gu>=)#;x->~^0h>X{!Tjkq87unL^KTt})v1fsJ%ZWL8o*R<$pcZo z$TB=R%nw$O8qqhukPgZ3#&m9YMw1c5usAj2oyuH7HKI>?9*$KX>{rQih*1*jgNzx9 zWK}x_1m)8~G~cgrcz>+-ZO%63f5uq~Q10C>8Y|o-;v)LDB5TDwQVJtNH>mrQwGWWLBup}5&D0!^2sVsH<;fsMA`D8J|eLF~JK?Y!H# zeAl8(0E6q>e2)!c$0%V)uQbGg$bXEezfo2PvVHeoI}J!U+Fp>X2B2qb3Jqi>DMRZ> z4ecPA1Ztwh>uucuvjR$f(g?MJB=AR`^hBT3s3nFsu~lX)(W5!se*lfjnld2d z8)~>5r7Zu48WbplSk|vJ!2DVcXxIqST(yto*dAoa2&x!e6QZ8f)Xt4o2Sl8M6#F>5^=ylnN+98{#*A`NHje{jHPcPp9fX zbM`rZd+efE9zYV;<^=3cu5SgHXP5i_ubY^emHYo3#msCROv&ugB7p7;B?nwixY1YN z{DYk|kXRCBH1ck9S|(83dU%MJt+iD)u`9ATRM*d^V)^pu*(yDo0B}%d$A+5Se3D9m z=Ot_Knz*`szXt2Pta6MGi+8&Q>$=nF<@_*hvg58`_n%5Bg8+^In6<`bnm6|zYXPFtEyMqverKmPz(5#+A$Ys6JR4W|GxFb^@2%A6iQwwGmsDp`tf}H;%6yV zkHI)Lc{Fp`KPZ+7o=EI}L8%AOygj@@^*$HE^j5PzFs4Tm0*<8$0tLwYmBo2b{1tcd zsrtFg+k?QgMxJ0Wszyr$E$NT&@1z1ll7p$&fLq<})_e8|jfI~QkFR7c)u4DJtK!?Z ziy}4@NUXaD3hcDxH4hKNX9-ko(2Sxk{;+@_1Fge@w1zYFziQ9KMK;*nF`Rrq$`M-K zC3TL-k;pZk1IW9B3*-}^S-u}`*ykaKuUzurxhGvV=p=iomF=Wm~x$s5!b9T!qoodJCUcBb;!%M zOuucfj$U67J4coq(#w%iYo3@I9S)ZK(9sUAguZ$BNyNlW+`atHyii|ENUVM5Wl{ ziwMH_pqUrL{BSrX#`~|!T?)7;Ootj%MA_IOkdsExA=KitJJnXJn3xsZ(jfkfCouEA zCAm}Rbw@$qi^KoAW`~mr(N50Da|+|cGIFEI0q)e$GWHI~xHbz+I&-=u@ zOnFt{b?7gta>KJ`2RrOjJUY6<19{`JfWUe7DiC^$rvzM$8mQfyqryAuQ=;Z;Z56>c)aQw>b;{bMr$ta;Te8TV`QzWfnU ztoXq%>{CtE#j-53v)k@n4<+A$TC~Pg`t59@r)wara&P^_6%pLB)sMob<4P+{kK0v%M5p@7y3C-!2|65|%{$Gh<;$m+4PPB(j z7ED8H^2j9t{vVKBnn#&zkv{;dN5m-N;AZbi#KO|VTR;Pm3|B^&>|KVHTvG&_+*^v4 zJYFW5+*^p6-1b5Zp(doQEh?LQ@^S>soZgTKj0Fkn78B)sKi_omY6JqN3{RDl?!*9$ z3c}8uZ2G|iAu1syq$rhK`tb~4XZcU^l==Dpk2~m@!=4C`#Wlkk-Mx(MbaC&)N|#)+ z$xW2g153*S`P0%F+7XKbL3}Zg1C_o2Z>cfyuVbO6T5xi)5h@6_8lzDto!gt86~_ij zpo~r$LrEQe8izg0ER$^H%(t!w%l7c=@pJUii~rr9x>-JyDoPn}yU{(W*m7z$uURu| z8vDRh%3GvNP+C)Rd)up=tChHP>$O&oeCd4Gsw=9ZI=r(g7X2JDZEM|V(-x&*Ei*Ck zq%9I{%F4OaW*z(dLQz?|lZP<9fg=;F)tK)oZewY`qHe*k(Y&mjZOTKzZmu7dhGEmG z*Ju@+CO*Crg=7qX`?qkAbPZ)E&PyYRt3cYF+HFj9$58P%QuZC%Iev zb~6)}r8Y4&msq+|PVG*Qbm!;L5w9z+Hu>nt`hmFZ`dWm%FLQ0YCjx*{E8KO8zi0ZA zK#oRm2RVaa%|FPk#Wmq81OvM5M{veazZ9g#)Swa=DhLKJzRUHfNKeMUn%u+Y#XlLV zW*Iv4ZOjqdF>72^HIuMdfO&6pCKBCWH`B%*E$x!EEX~3X{drO0o7=}2L#%Qz&vdMg zVIQn??zc8(am6mG-^+e*YD}dMf2ClTat~J?tNT0V^&-%C7>wo@8FcCC6gGnOJIDy& zLJtJ<(A%Cs#cGk7-<1j28@U$WZ~RF0v(KSj zVC_ZxFaTWFSb&vosBTPE*sn_U2w$v2{ zmj^)1CI5v~zr#bKY>$AyNthP6E1i>d$K4}!(y#0i{7mvvg9We?8B#ZT@EC0{poie# zNhkjxRjaS@v@yCJjLDFj9-KE;HE`_EOArnGy7?66oZD~^Atmxpvb+=3*N|Ee)C#7jL8{7_O4g`1m;zGW7ZKiTD|G9~iFX4|CB@z+A7vSx)=^<|xMhX5{}k^ITjU z|BqYG%$YnlMhT%JqN<`U)D%^Y0RmwC|M9lQ3sO~e_2p+cv17G1hBM$8A#KfvbDqlj zYA8q(_?)Oa))i}l$!r#`J3X_IhlnVG{>73F#~_ATJeIFDJ>$P|8Q<^zngM4U|2;nL ze*XN$uxY>;>~NV`|J>aD>G7kl$m64eg^l))li}pH2ejt5FBu&^Sq(tCe<{NHYa;r$ zkD*=yl$y&mIS_C$O@|fmL!LnAmI71828`dcu4P1oO$I#PKg2d-b^h$we|){WTweuu z4SIO}gWTk9m-z64?2t$j0J+8!;q~y67?EvgLWFDHq~b+3YMbX7;PGv1(>N`Y5eX7D zOWfIa2OtpZ@9g)ZksI``@Kdb0R1GGrA=TO4(!)RR^w?`<%zk(b`f<|5-)**&IHw;< zXa1I{b%N#;fovBC^R{x$;yse{(-(;{h+-^yI>z>HPWeXhFR4$e=<}kM^{N}}C zbZ1u-nA3RXixEa;$;Otns$5o>E%{o*ut#kO0cy&3N_UFNl#46jmz*!`tZ|+xS`xK| zDj|Kq`4JkD(segmXxgt zTB31epNp=j(k|q>g`NwGD!^0Nm(yX2Y%Ba#nVu2MWS+}~D~OkXtf|-&a749~@W>0X z0MR=~0l1RpR9Vi2H#(xvNY8g@v6#6x9n}^cW{5J~Z}3jkdgPvl~6EAN)6Mr2^XqoQBr{4iGaq8O)Z$1$EVFn#)pQGQwo>5VR1#!F+u`ZxEV1 zYntmRYxb?(9Av&@$Ay>SH~1?)YlZtZfG`8RA9&2++|)2hfi{zC?W@`tM*?JSVLs=v zu{H_uxGf&*uZlY*NQroC{D+e#=4AgCM@Q}5-ffhrvBf?Y^Jq-O`ED9y0P1nmzVUlD zv?r22#FTGC)1OYEiQB?g;rUhFV6CgFEC_-^^s0n=DQjMtYsVKJ?Z9Z<9X=C6;}jkDhVI3kGroOYSS|7j?^I70{RB%KMJNn zXt(Y#=Eco{s=v=0yfyOPSXw$HNcls_Ez-FlDXl_rNE6@-avustgm?jiSsd&pafPcw z!mV9_{S^H1Vrg$-LYtzvlvoM3hi%@ElMUN;ESHFZuAZi})(wyLEDB$&JnB7CnsKdNvN z0k*=y0SZ3meuG4+O|(W|_!1E^(ezAKXIaGoRf%*_@o|)3-A&(ky*0oIK$cuWo?S@* zeyYnXd&<=9aA0F{?6a|@1o&BSR@1gb@3=lmw_eFdR|9mJjKn82qB>=em|9!r*Yh|y z8uKBS!0BI z#a2S_JUuA`p%$fGsp#@wT1xp2)Z}#n%!WJNz3tBO8Z^?Tv=JHP4vX^n5=-I__ioIF z*O77Yx+1W&k!8gg+w=#I*9g)R1#7+rCpl(_L90eS*@Ri&GFa;fP_j~fngAylSosu? zraP<90@g*0gxAbZ26_BsMWsNCC}h*H4lz4;4y`1_VA7WcB)VB<6JX8-FGur`5zWyG zF+rq}pO_mjPC|&w23mfR;!R#*ODu(PNl{R*1V|0|TZ5}QPnOcj>XDuK(;MYHJyILp zRdGz~5SdWq$D3^oP)=NA@ia0lZLb1Sb*18pzmXkRYV-odQ{#l8#)g-$F7ZuH6ORHs zjmb{Qj)QLc&YhYbk;?f9;M$F%J9!*OWIyK%!oI)bvL%~H%-vQzW|#PqZ2436;n#WC(jF)VIQBqBv$+N{d_sjoMCG&3 ztaq7z>e40g%NymV8uUQrvm%!5j5s*r^XcdJB&B^l{S63@OuQ}*2LPCUaWK#&@$cj? z5HE~@Rby8ccU$DNI&3Gu=C^@@X#DHPLEiL9{Gom+va=EYj2XhH5QhzF3_J5~HcIC_ zi+HhK0K=gGqMiICdeOKmh_^Y2v(YgAkur!~(hUw%x4+)xW)L%9)8EWi9jSe>B?nCK zd5HP~Jy^`|H845}@LGbj5={;La3MbnfA{=iNO9qXU&I3``Eblkx0K*(xPPslX_ICfS-d^f7c^pDf4$?w1V7O!Y< zVyD~K7H`YU2~!^g7CfIW8~X#Bk1SQ{by^k`w|tH~r;Nwj4inxE3cH`xlufT9x2=R} zt-WmL5HvDz+k+h3hI;D1|FYH-X1SeSAYe~_;>Zh;HV zte-pr2+fyZdC@CgmO@a*9Ogoyd0TqP{z%tKs?wBr@^c)hoqad+qTI>qn5c~q4=DGP z2zT}2>o(t%2v3|T5J~8xg!$gBa(GVCMqzNC*SUgROI!GfF5Ff;XqSvd`uiaSJ-xS( zpzZPp%Tdo+7E7t`Kv$z;1`DZFS1MYuBTc&kQhvz~WX`8tYbZqe6)rr@le0^fO+i(_ z){m8csPsT3^b-a@tXiwS`w3ewzd|~@fld{zMoF?vPbRv2SX@3$2k;r+=J<+U#;;-5 zmB-R(Qxj4q?3!M!HoR>~)(+e}Ir1X6>nXE>%Zp#&o4;^8~ofJ{JX3m$^?z=q#+7 z#A)HfTlH)36EOmU3v%6M7fq_G<6o(PNgJ`R{ud)#cm5734wa$+s#+6NY8`9<^`@<9 z$0gJj(lXDkOr4DH2rYc=*UJO2z@JV7B?S-3tLG?dB{nUhx zTt?CBoipg@tvk`Af@M$eyci23#H+ZnJu6FY?O2MU%(2wL*E@|XQQjk3)exAu422tB z!Q!-iUEQ$o*<2btECBf}#EBn3|3P|(+27?G8R^)PCoEJ@QG`hs|PT*>d z0lcX$8aY2&AZW7ja1x<5-OQ(P(H}xUu;W*cSxBlP#Pv|2CjthHSZ55F;K?Kukm-ijkOs zgmeKnmGnxGME3IjG;?auI=w;1bn(RCWhmZsbCN-4ukZaJ7?So_tVPCgs2_n0c>ei> zd>&3vpCYF=K_SkGq>KDpNz0+i@yTZE?=f?Nj8}#UwllP9klP~WBdP&g;|QiLRdZW* z9a<*LpiOBT@}gD@E368bZ@?r$3uS1sEW~;iTdFzTjr)W_Og~8PwLz{sD^~jDwo3in z!(sbbDOasX5kuEw_NNkOH5ziaASyCCamdbPEe`7rn%UAPw{E*!%G~#qK0@irC>U++ z9L6G;pM3y5k*reGYWHmAbp+wWFOBTX!lo5ZE;LtxPGeC!Kq3P)U2(mBc#fM3*JJ{1^Gz;#<1rNTa5L8OcU4@2IM)DH;%Jp0*Bol&BWnu+ih&7Xi+HgoUuEb z{liPjSQ{uw>Uy|}S}5_ZtH^~x^qA@H*JA`VpLjUFy<+pyxK5)O8GQ>TB()0f6LxS} z`nLwed1spD-v<3G(GB4BFJ|6b1mj_O|PWLS(%CQQn`G$}9+;74voCi1yC!3WosA z8vBxI=`4!$q|mmrpPHySjG{!B^Mjc}JRW=TBsiK>VXF)&N0+}5vfqQ-_aS9q@w8#M zH0|T71Bn8dDH1n!J|AJ@aNwTO$qtZ;(;b--g5l{PPOS)X#?K8{)@VnSoiub7fu@k5 z=%^rKu43bA%V%zJ9>I<+=HW^vcnrlLc#t@#pyQBd{2Jd^hmKHJ$ zv7&T3nu5ZhHz2>fS_HU0USYn}x9MYKhkbz4!fE7H(**A6KExwD#_q5Q_g9+$agBg= zp8bNbR`U^7(J;B_8|Tf&sZ7X01{A5)0^Uac@GC1Np6SQaOXK6A1$(isRN81_fbtow%VcFBiq+EY}#qs8Jbn#vj z^wp;$DCvB6vM|8AT;(tV&l_>JpS7Onysk-d*sklt>^a;gv@Gc*HAgb40Rqif{1Fc0 zm7$nejl`6(IaSG=7p4Xt)8+(nJr~)ndG(eoi<1*BhEMp%c{g^tM z%pYq;reL%1QnLJkHTV#5W142C^M}(@>12L-D@^5YbQXo2K23%Ga6cfV;oYXZyDU_%F6HZ=gQZ;#>(L!ivA@sGAk~l|9XSR6O7e42+lie$g5v z(jXxoC{k)5c+~~GtiD)J#k@``K4gHYmTOQEj9u0(hM0_ug2r|dlGviw&-I>}^4v0i zp^2f0g^P=XgsYvUsJ6CIc}?sN1kB|zcC2R|v*gpoP-S3`R{D+xEk!cwqWBiIP9NCHM!j-k5d_PgT7Gcj&>=Q zc@Rz>7i4ipMYrQ1D4C8#LK4dxFk}JPZ3`D#X++(Ho;)$JfM@`N`kl~p)|X^N7+Q-m zH30Q=Z7;7vUrF*z&q8M##4Ln2h%N47Y}Z@~lSo7fD?;4FG&!|EhA~8VY;1b$GOdZs z(-j|v^vYi+TZv&7IxYFx)7O}p^bq0 zbYYIyosQ4yoMH8vAa+!~ZCmKEseP5IOJJ;%5hklbZK4fRV7B0=uo64MZT=geH z69-`CQt-OVX*BHlVq5S>sfN|23YuYaDOEVf^rKmr3PMG1@O}28%lU|Y)A=aWiR_h{ z`o3@=!7=^?G&d5f7h{?LcvK##IJz1YETEey>T^)FE!iITw+^E7x0lpVXkgfzlDB@= z!;cT4=jAshxN{?Pt1td0Cw#j-Wa3s+CJs??rb_YwX8&=#|4;TB_;z>@Mcb=qv5 z4e!D6i}^)}#{9=UIwbYn9wJ7-R;X_0FEt5S?n1MV#1^XNt>JUV83g%Ou?pUKgYfj? zff8n#iaZT1J|JyImc=J_3NaCLO$tTeABptM64X1Lmdl;6N-{MVv=oS=Y*SxmLjZW; zjP1{NEEP`utG)+~Pr%`ckzX;cXp#7_<%02-N5Yu)PvxN8DKW1TM2zB|jrS^q4A0fQ zt$yviO{37SgStU*%o7OV(bl|uvBEqhrZDnZBP-0jFaIJ$_j2O$bD`a8IUF@}o=@Zz zJcglgv>b`*Fi+!h1AC7W^f(N7xe~yJ4aaavF-0l=dp$J11RR96xl-1Gs+kD>2-yD z3KyRfNYqg}?Y6O9G(8KBjEgvK5nc;^@5*}UjPG)@#pEU20e9(O_bcU48)X1H@&%jZ za)}jDW}@rZ@w(y!KH9FmJ~IKL4nfzVozr=^|H6oC6Z8wSTw&N=L_kRHVqUEtD-K4R-ql(MVKOf;PkAiQ=Rd4GKI z*8;2;i<}rAcI;w3b>spkxB+@2qbYCo-cy#lTC=-~q)>RTLF6W(FH<3p-kua>7DU~% zCO$ecGO<>hCL89Kxz-hq3I>L_EhhP^7=70KSFQYxh6F4;!^gn`Pfsd}ORDRVoa6#iU8eZX8dr1;`6T*BB(@AZUY{ zF-nEdFcnLRmRCH#P!a&KxT5Go<=+-?$=}E+9e6|bK*+?n> zeU`apkbY)1T|~z+xQI9wi4W)Q{BVFy%{(j2*XAD^jhWAq^nsafV{UAvH~V^&RM-+1 zHNW&hns!RfqJ^2`JNb0EeLr-C^LQln{k&H{hxh}m)zl@)7Ac_1cR&}4-i{ahvoJ4( zH1Qd}R4p~NLG1_H--@A$Q9+Oo`Eig_l7x-<3EOH5Ot`C5(ZC!-iZS)n+*BmcuCR-X zK@NW2NLMr_SjJP9*?Y8%ip#lU!_-kv)?2{Di0ovI>M`}2Wl~0?QmS!`gqvodn^89v zIgK1QBok|SFB9$18RgFc$mhd!8k=UMV56&MYaUljNf-NylCN3@DGmlR6Wmy6L0BlM z%_%XXVST*y4fKW;`|b6rmO(T0yJSq(rY}$najws^%LUv`mRQtyz6l(j&wxFW(%$ge zlZV_vdGTp|k7+Li+Ro9pCW&iV8ZO>Xa11k`V%|d62BzMZCGmC8pSt%5AR>;4Fh>uT zBpK8LGf(D`%&!6{XQj-2gT-ilTW=x`6bXG}^c|4v!;KaCx~d2eB5Y)mPJGr#m_lBv zXrh#k?ZBLK(DO*>Y6xP=qCY5LpuaB z@=pl|QN2lGT@fSd)J`~oCU(nUbI^T~H+wr{%7Cx!@0Iu$HgX9ZF2oiRumh~$i=l_8 zs3bl@d+VnBpikRj3_Ofqqm2&>o`TCa#XiHL1 zbxzmrC@MAl!;Ixek|zHlIawOOPwFSXxo$w&Sq2)XMj2D_NQf7U6-9?DF6qaESh&X= z<1@KJ;QQe2w1YiCd9sx1Fo_t>*!e&P9WX^`_!HCTYwiOR9qz;bd0GOUXW8D4dU6d4 zH54yKAi4}m8m}c&TinqFd)X+_fhnE&NZ6*=;q5fJ5UbC#^6pgT`O%J&$5_|!VK{=PWzVI@ubX0r7)KT=&#}7+|K=;F#t+wa}~va$fq{eKN=!t`7>@ zdaod83*BM2zje`fu>$uGT^DMfr!`_<7w#4uO^S*@vi{Pwyh52d)dzRGzkm)hK4eM4 zrqt82BTTcS<8vOf*vjp)M>owGeB|4(+QvJxk97b1PG8pEA^es8B&K+3;K@bIfz5g@ zlaC)U$en*U673R=NbXbLelHtb?G@VX9OE_;eb72xT7k0 zRaX3AQ637pQ;-nkK2S??0mMHNK)_F~YW^;-UwG@SMbsf>o0QQT=|zm|2O8C@_p$BS z$5EwUtDdZz)8Y3EalO%p2KV`nS(j(!`8|{iZ@MZ62k@-0c9-(K4tf-YUzFF;v=+Z zvTJF`0=~avg#vy}%YdV{Ri|%x2eUtzTUQy_FjHhxw*5l5;5x^s)R zO@4lDTzK6a8fmOhs^)!m>c66rfn*SiPYwiiO{=_CXXc|f?k>7Bzi$SwxQxs0W;9od z8`3w*IPB+KBEK%3nH}@2{9)0yuAH`@<}5d2-m?H~pxs}|Zjq{gnXm7`X^6DAiz3!s zjBe6kqJh;!wRE}X3Q-P;(5op$d%nysR0Y%BjIaCNuQ@hno0BP;0eP5vG$N#^~8Auw`f6lGLlRAn?`G-fnmG-Whn zv}Ckmv}3eqbYOH$?jP3${LdfV|F=KWqVA=LW`S{AX7sPyxaeF}wH22ml9nvOP?fjH zSriNyJ&=m#6(6g1UpYa>FoTnnGpY}c6$&mqAP7e30KJH49?L{B28S~o7hYn1*zdl!8Ydy_0Z&iii1dF`e3aL88rA6UC+M zze;S?xXKo*wsX)XcJtq)5J`qP|0z~kWEVex@My>`UDrW{kA=7aI2}l3zV*j|s{(N0Zr0+qy81yaPHSKB=vp)IKX6b5mpdNX_ zc(vvzINirSf{)mYLqEZ2I~RNG^;J$W;WMuEs3j&;p!sUHM zl{W0WGLk}PalO!IjqGFL^@$4#);wtfg!2#dxWFLyY;_DK_eooF9gz^s*uq=vz!4(? zsP1I9PAn|3PPn%Bm9g%5?fP<9C()*MqPF z3M*hOu>QQUQ-s5gM;!I{HmyRoZ5Btdk)T$M!EB1Ja4fn^_8y!84nE^Ci4a?~>lr@! zq9+h@{^5=FA}z+8bcc92WCn~a!W2es=zPXiA_6_mXL_xnDLDJNc~!f{|A|dM zXJMavppAvLKKeqs{vwvnh-1+L)W9rx_&V%UYqI=`eX;rf)Up@NmGFzQrJ$#w9bsZ( zU_3@ft4{_6Lg#G<;d!yws5YUG-9&$2cmkQNDP!ApopKIR3OX{2Jz8`3fVKDCBy9j)z!qYL_?uCi~T*Lo3vjGr&1(2^YJ47APu*T-tMmFd(c?K`xoF4)lVF`SgD z06qD+@290S*?6RRA8QR^Y1?)(lV^7fv$8q+g-JAXF;UB5>BVyg0IR^4K7Too3{c$) zNJWApUF4xpQqAd&lPd9n8FlRguuw_pi&8Bv5`)9Kn1iNT(6lM0%o9rqbV%aSA_piQ zj=h{It|9D;nccM9joVGmP+sMu5U=Ur5nMv+F1Z>emhOq}8DtT&_$eM_h$)S7?4*~6 zDa%SIhS6G_ay1uiw%~N)2_^SRvmdGh5Nphz~*3-%tgr-Tk$h zAwsTJ3BpDLAnu2G0l-|Ny1aZ}(9UxQp+aUkG`LZJ2?nD;EJ@cNNY)yXqwhC(k6L+< z%nhw0zh$y7K{`d=XXcEl+x%>1D7eMJof-87f$64@`I3(xTT z&(ph{OEDqZt95nXR-h65#7$&K^NWevP8-U-Yt;`XH?{*n ziiHfzh#RomCgMq5Qz&eyO735%55^}cwThqT0Oh%K(kHy30)wOT8ytfsF}JR4R-F{q2K?th9_zvDV%x6Ja| zZDuw8^6?iI7jI7fhqq8)nCu0LDBcXY1P_};@GFuX@XB?n0-s~yz3jxDzR()DWSh(VuBB1&$}yA;h5VQf7RM|FlIdQi*9y` zguX*O( zjsl!bEBbRjYx3-E&JrV20}`F|hW7vMBBD=N$S6Co)!mtiDXT3v$LL8sjQU%3=f(J{ zpFmJb+*vggG-UN*7V@;R-&p#il$#LTLU;|Gh5Uk#z}YF9Q-H`-6R}e7!TWR1?c>C^ zARB3YGLJmmE^j;_<5Ed${7wJg9?j>PssXs(bKaatdP}$CFdoZF=381>7}A4bC{@DG)km zpMAohRQ>ViU2KE&Zt-lxTK68u@EApKH^WrVX+OSTOjn@2Ga^CPX3!;B#6-;hZUR52 z*RSb9pRK1zypJL|h-BDs>4jP6q+zS;8Phv?TIxGf+;1$1@zJzctPFn{Lovl(^oo*^ zK=yWReX38Ca`aH3qs7ngNz-3$`m4t#7+6w0h$HhRdojso<|d}+%Uf;h=;>>ZTy2zq zlQYqb(dZ_%aX8Q#kZGWaAggFz3d0pLh@5R>hh7v*+FnnDOXBTKP zH5RgSpElFIe~EtD`z7}~g>W<5QJ|c=$VvyG^I)b;?QL)=Se$!Q*uf^S0(?<=Ovs{@ z#tyMI>1-quOUDxro=PqBei;)p- z3EFf0q3apk&z-p24nB_#|8c|Nts=Vl7QbOYVB-ZdHrfYz`|^-D&-7902HQBaKW%s1 z+qdFlxOWI;c=Z$5YeLl4132nO9wjEIaSv24Vll#TU*S|E7Q1DNbpd9s`Lc(Js2pNl zP|?XN{Xep;jYlrdBt4&e7}RO3)MJFgUS1(G#e_x{?vFb=32t(Y5k5U&BY0uAgqc^V z`@!f!eN;w3KkWL9UQBLIcSaF~yH*hR_xWukp{ zso1vfP4|xy;;XuzM0RAmEdSIPk;YL}l*DMgb_Veh4$HH+zo0FA*DR5!|eoKHXPlnPU%EBBZNqi8#EJ|~W(GZ$0 zGlVJ=0d9=P9FQ&=yk83y$&_exgm9-nw~+5PPBXr|S8wS1FDSm5cyM8UAxM>`Ip-}@ zU4Y!em&5N;<<8#yXb=5}!D%gw#TRA&v5Q#rl@rtc#!l$7$MOiO>9!;&ogX|%WTm=)XhSZ(>Hz&R?ALKcFu_Za3i zz6lS?NhT!yZ9AendK>a9$_VGI*?Nr(x1zME-UvkAX>J96`o(3i|5xHqhf*zy>=SC! zkBi_tWgu%ELjr*-%!^rEqzP4I4YR7{4r8AT!dX363DB8=d<3~5Izdo)O zhphrQ$-V!BFTIjFC|eO3`mrT<@KDywQP7gHUPr^0MsKthBQKI%-4^%V=&_St!$SD)p?2xA1}wY zs`9Yc{%G&X{mSC{-6@+bkL@wz=YN6^sp)N|m(*P;v|Wq+<4tBaWcR5;$8B}&4%qlZ z!-7Z6ezP=ybX9W&+{O5gaNthf@b+CncAz`~MDMvt@#ims8PwXyX(p!J!Nta>?myx_ zX1CDtabeRQ3r`{L0uUR1LuXQV^%J#gBo}!EE%ETv8rP;U_z@8lMgD>le<(2t;#`jk zHKkGSW+pY5|L6VW35#{Ss^3GH10Z8CGcMQv2go$JNImQ{o@lwGp^SoWa6!}e(ONQx z1Rlpg((~&yrrn!ZD#bhDn zEa4TE3)eXpy|>X(;%aM{!_)P}#uAcXa56VsF?IGPvI=n#8x3|Q7hW@@N! z6QlA_TL$B}w+Gn|Cs<-E9rF&q&a&UXu2WLPF-^+^##1Ag7D&jN6-S+$c; z1>>##E@D@0Y+ixFSp!qQXJD4J%_0dU$y<;3)D&nwqgravuk6c&&{j0zyZ}R{>;q$O zKOH3T&mXWx>FGg zaxhA}u!L26*wHPfLsZ8QP5pl7NF{UOC)APR$bDhSeUj2fmqEN;*1UAgWCjox4zvEk zZ1cnAuxtQ@0{&Bt_=cArrRM0qVgByI)L>7Roe&-OyZhJ4cnw3F##q?;I6 z$xl96ChIYh9~cSFeLsEeFmbhXHi*R#=Lih0DF1+nprqt;TS_2Hj?lrkbxXcPhAy@l^*7JZ?WMT4YNw)BpTp!v$nkRPm}abW<5K?h6C}Z6rV%8dLJeY->N<8cE$6aT>Z4|t!p(WHxszQ} z58jNHn+CkQcUikx9|>EWH%>G6d?(xqOc=gc5uz+>R?Y8;o+jH5s>v1p_U;)vF2lT&jA_m-=p~A26JEebpddkD zr<<2I82l;%>KVG(72);?8r~es99YRDXYSXZkueeJTIIRC)oQi9VMseJ=!rG*qaFCv zBjw-`6aQIR7{s@2&X{?>vgLVSHl01pq>?c|rEZSj7@aW^ZN!I#Y0k}>gFRVoftP_j z#bplG7??30ZK0cyG6il{Nnu#fr|D#xxv>OY>bUW5 z_Bm!_uI_Ml-x$;=SLZ$i`K`XiT>@@>|3C!5Dr>YZv@dwU_#wX7pddbd>)poEiPc2( z;ikPz#&E575?fD1UL=GCfs4F%)vqysty4A`{XHlv%rNvW=~B07(#A3AJ=+lZCg#Z& zYx92dwV$F8{a*5~g`JD?)ILMn-*kF)4L@0Dm|&|W$Od9-e|EjaQ_#W*3nf*?5_epu zkuEvrLrWpbDFi|787Kc4e2Y>9TXw*wVav{l`9TOZK0EfaTc8mv42bzvbcvE-#H~hM zwdyWRx-*t^CSl z`xnfg9{~T*Rb2~zu(+twbOy7KW}3iRzj9Ztg;A;nLW~5*P@g8>F;(dN+_n__*}l#H}%Nx?qsO;igSGqLFq8^9UvN z2>9N)_gxt6U$<}Q)s6BsHQfi1A%BsWc(6!lUv_+LW42Am zR{eGawV^LAV}lyRJ*9s?glS5I@mot{lngHBs^K73tBu`h1e|yrh7cSk#$kEzVh0-; zEtQ+KYs9N072uM9`5>VX1$k1S z1E3Z4;^{*te}f3%bgfWCC&znDBTO62qNe`&deTYWdJqUs=pZthJv8|Hy(}}ivE_B=SZWr-~DgECc0%5U*M!4JR)M+L+LDA8) z5}Wa<;ZL=LZXN?^UmH{%M!S7NKq{@5Ia^z)Rq1OXR~M(I(s^Uyh+AgO_e`^W?!=_# z1tcRDOGnG7o@$*UAM#m8tZt{BBXMAT8?S>K3Yxw&+p+b98P4i9NlJaE537SmfLbAV z{s6rYw}o1mk5maklF?hThGTeU}v4P)Am`rPbr-ik&{o! zkp_PrGFgNp>N9r9H~Dt!d~Lc>#ln52bWGW>?_C&TEp2B#zv0Lidgl+BjYE7^$^AGT zs#f*-I2}LoHW_?e@2;-c*il*$v}JDz&EZ(3e)9q0*=Rw*j(ihS#k;KQ!2N8b+^bj3 z2+?j@G9GL~wubN2{#|I{iurD;8Eg1bn8Tf;Ofu(~px0BklzUCVer56d408WWdELTt z6i!1C<*zky)IjzZwIy{37NP{C|GU^Ota%{=xZ_vCKatUkZPlILHf@Cny^X zM3-lZlhr`_=@zc-D#(<;0BjkL94r>X_x(&3&hpOwMV8TKL##z(46Va3<~Me)TWr~{ zonq^lX#HpFXOv?oTv?!%8uETSh87crmfLsE_1BvGx|vj3s_stjiCTismn>Wur})28 z+w2(M<9F2M2BbmHOyjCbS@P+t-x7Q~kM62hWv(hTr1yXUCqRgx1Q?A!d1XJonDdVi zru5;%c^kEn4jZ*a3U)u^p(*_xpZz-4_I3~v&Mho$V`&u4%ax9i}lm=nr$35K*q&CgzU+$UNeh^m2pG}gU_BUqjiMu@qHf5 zLR?u5#u($L(HOL~2Hf0)E9EnC=AcUAi)beV$BYEQ1R-m4d46i#>_U!SZT36H9^l>X z)fq&&-{0#fQ1cHw>mDA`)VFv!p=QB*Kh&X0^IGjoKBJLxtWe@lNv~>2Wqdt!xxG(QDQrS8G zaD8>ie19Ou0+g&Z2`bYr4xB|l*@VSI4w}PIY}N_wmR@Qm14X$$sNQRI{T>L{%kxV1 zWoj3+_l+<@A21@d3iss(G{0!)VK;<-RR5&Zl#zkoh%u=+fxd-_iA0oD?uV#nbm_VF zWw|t=A^2B)v@st0-A-o6^k1`EF0BEkD;sSrL^k5&51{tPU8LBth~Domzn|@tM>n>izwg8^+Hvm?QgAQO(D2$2YE>0cDKqk@ z&g163P-9DilZ-XflI?f&POh*|Zw^&Xc6|m^SLrAx!%-h$F#QH=s+Qsj119;moG>UF z+32DFG5{@7pmG1+NU6 zCu#~t=qV}YtKziSk|fnRY-zXZxDMUOjy+!%!$IXdkNRISksMBv6K+tV)DdT>O20M=Iz&Z*bJ}B$XemQ8lL#&gW(qr#G^y4hK2fANl!b$T8Af z5yxXz%GCYkn2%1KC)@N`LVw}h_^05O=QEC zPVx0?mY(`YF|c~OIRwVAInDvoT=D368QBSmm=G2DQW`dkmJuF`Cj-D zo}jC~Y@fQqVnr{p%Ckvo7pE1!Jn$lm%tj;dXyLc(!BK=sKgKj4-X5i z4rIqA-mprOD7ELJa!InOvv$j1~iEXA5O?9nVTmx4qRWKTT^~H!zD7b-Sq! zJ~V!KT|=b}pVU9iy%6*cwA3eVS}@=<#%aFTH$Q)8_kFb#wZGxriy>ZpcG7(>4WuTg zCS#;E+Y4l^k)=Lix;x^^{|J~PLj3OxnkRVDJ>WyV`UhEK0kWPg+%nD z?Q3|`5G2djZY_-b3>I2iAS%D;8IkoQR30-16+D|Ad%-XXr{22cBoU8 z(J*=xp`KK>SY<>BF@(Fd9KpK%?;ehVnnS(y+oIeO2II?{y}~ZyXRd5rs$luo3+hW| z=b1wURroMyT5D@|IIpgA^@FO|!u)^T+^K(O`+sbSIKaV3Z_1Olt^#!<5=r?n3#C@d z3qtT#y43-0Ef0nw04A%yNgeJj(-S{2%J{j2hxFu3H7ZwQCoW+S)n35bpMm)?bTFLwsIjoN12Kk{9M zE%Fc^5H;ljdC_-wTuAw>~Li(!_oqPD6Y55on@x{==pR*;Y535b(A8wx(sVwJ?* zEK8L14B$@=Jpuv;aL5;1(vl>xh+f@3@rV6iZ zczf=KEtD&$-*`rO9m;98z&FOS+PIG0wZxI>F{=QLU~ypX-HMFwaQ7l_HlIl{uG^&4 zZtF`&dM}lYiR}DergQEcPs*kKo#w-f3rYnbr`GQ(qg=1ho?0AOH%aSqhxGEw1XXxg zD_O-tW0|U9qe7iij#TK->=6e8xg)QNQ2j7r)z+fng}@Ij4bpYzR-#(R_}ndsiN%~F z!MIbZizV%j9$SKO-S-!Ct`9 zK8%p7>Cb226I^PNy285cj)u~zA>T5JCEQdpXU_Q;n{rb#gPUgCdcR5qkq{XTb;ime zR+grbfK86#TyvAZ>B+$i3-)^MbY_j>g2Hbz=DKQNx2XN|y{NeG`-dK26Z&fJ7@0-# zKk8i4e|HTy8#gOUnmif^Goq@9wzh`m|EJ8QF$sf&q@kjNI44anBLim1fTF4z+UV|P z>!tTWq*M>JxQ{)x5}L}Zl4KHg^%b~uVU>S;M`t}u|DDMzIur?1|MgF3GImu>jDeq+ ziiU&%2rSH6(n)_2t*4qY@N#Y~OwK%~Tt{}aIpn5aFLt<}y=R`CZ`#R-(~!xeW;XKW zWuq0KR7XWAz<=JrK?AP#ZxPOt^BNR0B?k`Ob$srX115c|q^r0b(}80d|K4E1#S$~w zrOvA_Nt`#HmiW~Cy$Wck`1oYejaV`l6CX1wv3&I_=Zj~PFtBOt)SWV!>ntN^NJvGR zcYH}Sns?G|*f6nFzACF{Sj+MlZe94&TWgh*#QMY6dW{Jr2BB!;Lte~ zr6F;W#B{m(V9r~Tf@D4s zh~l9>hO{x+)dbKdHs*7EuJN0nhP)rsWNiM4f%z5c!SbX*S-o<$ARS*7du-Wp`!Osi{@&SDX^6`pR$PuG~b_l66TW{+y%N zT|!V1Apqv6aYh^}z)JV5cEVV72rGLSAAd$9sOVNAaYuUbREC>Y5vJ>d(Ea7z;+lfo z9>E2@SqFZxU)EOlBz_diW-OXVYLLF2oG%#tVu;-IV{ z!lY#@1@HO;0HybIxFV^16V>)lsX0=sSb@X*32cf17=NKX2rM6AYL+t^+#x8G0u^3^f@ z%TmcAZP2Z&?cRh6MhLtF}l7w5V?Q~KeM0p%Vqa{NRMCB>o3@6Ux53KYx>nWX{Qhb^PWV% zg+tEI|BBSCVDAP+g_d%2$@DF)uf_GI3`+;|XQ!4Jee03UgT-6o zg*4Ko9<`=SJUuS6vfkW%u21c-Thg9==76zwh}i;&p{-vyNflns9RagalMPt(W-G!r z%_Wr(YK7LNZ6M8G+gK>Sh{NY=$ly9Nx?qJa^^6j*3Qp@+vZCn9i=zkK^Qs@``kAZy zieufDwk3SaA-5%R7Vzl{nW@biUO>ekoP`|Yn8?oPe;~qKE6i691}?ORFQ*H?h6AsX ztA(dxCh%a8>6CWqtMj!Tf^*?$aq%(>gU)%A{*8HHm?8edUDQRjT2XL86hQ!XuKyqS zo1+P>s%nwyXQp+-A5*C4Nn)+P4?%;)xs*PPud$_wh72wW3SkB*hAe|re6CLXPC^nz zG@<@y5EWfYH+;KgGu^=$qeu!jEmkUPOXAx!yO)R}<19CW)%pBaPGIkO?{nww=e4^` z|HI8F6&efx>yG#w6UE6(r`5zq;ETX!g(nQMS_cLBw1drQ^sO9za@+0gdYygH>TmVB{Z$r6ju8c`Njm$K@n1P} z`opQNX<4HcW|?&N^ol9Akyx!+I+Ie?rzwd4%#fgrzBXoBEJ|}y)})M~DPwhJ*o^5Z zYv8Y|xM3*s%9O)MD6~;E7W<(jh%uKr`C>tOq2$fU9HY`W&Efmz1EY#orLd~OpUJf( zyiwnN%v(lCRX86L!;}ANBAOBYV7VCmTkBT}%AzyZ0@oT7VF{bT^4eUOzsp?4sFHuA zdE{^%zOe67#dFZHx&33{D~2q2Cn6O97Yp>$CjQyPQGm&{9Z2jp<RuzbZllV(n&euNUvQ|r+!zM92 zsZ=q|b@FgV7kq~h*-J~Q7Tq)MakpUfmM-kUKeK{lua>zpdD+?CY%|f>=b}koSIAw z7+lD;$mn!V{L^2G#1cy|J|vw1$N7*N&tAe82=VrUAp5W#T<~a4hB6`+fYG$y72=ac zQOog2ksDh_d&~oe;V_hZV#?uZbM9d*5-LzX>i%!LF7FU2!4wHIpd2KlPG|312I6#co5X^Qz#~)x4rGH9cns1UxOrg+SH8SfVPQgeQ8qx07@S}jPLJ-Ok z_v=SK*_~{NP-$JZ+ev=vmo(-yhrpH#{a!|<)aCasY!W`~-=APZ*NPB?CJTv*T5kzp ziPijp(Bp~0kh*Lo&n~Tn{ttNx5*_lsu6#4<^_fe09iO}xjpd#tp9?rnZ|HM?dm)K< zT=YH@Hsq}id#1i^N8y4tgLDlON=uepiND()!kw+?NnEoVPco!^>1Tr~KFM{oyi_V5 z`whcvA?+!SY#B(YXcMX#(8(PIz9yIG#bo5gfE9ae9k$JEVTmP9vRrYQ1>Tn;Ah#IK0EE}GSk)OE^ zj#c7Wun=4`yF{zt8=6(^rG0;c;QJ1X344U#H)KC!qqBM)EdbeK@z1ua=Z-fUFSze! zMk_iI{W85U2DKMA!fzA;+GD$9zhNzhKP0y^f1NX*<#1tB700r(N04P$4&J4>P|G+! zU8)Tc$*z{kuVj`)?H%E@g%qM!il#l~)Buy5f`;K=g;w7nlpC^jPbueJASzxzC2 zX{8bv$AwfOAptiX7;J8~4BOlmgQm5lX#%1MnuzINSr;1fsejp`udr9|%?3auA!_6_ zG0>u%xOMz3R8<8doCF()dLE2*Xw;=|-VLm9JGC19WK%KsOwHW+ztsA2O!;Do_sK#n z$H4CdZbfuhFx(II(H!~SBKbeZ)r{!r=yspRA#Y z%Xdlu>Tj#swSa5opYopVt0fAH-f4z}!j7M6c!1|SqOd%+x``!oi!l9gY$g6O$AOvf zC}pcG*1F-(UG5?j%pw#5uH9Dk@9JSV7j*N!$5f2AuRRdD%?|X`={cmRAYq#!Pd#e0 zzP8xfEM*Th+n&EJehJK*`7#T`A|!-j4eLQ$Jh>ymtFKSk9)D6 zT{?zC+sx@x3(_I|tFe*e0#WS$Mg{SuQUflTTG}S!l^9b|)%H8%{J#qzAiv1LV2q7j z9m5_nMZeYFx{;te4d2ajO;w>y$Bs>1f*E+K3G>=r_s2hr=pB$d-12hNI_bwLXvXSq^=2%M}Uze>k=PtU++z`bvGwbk9np*+5Xe-75G3SMzPGhWVoUxrcnwgA@HHPpHT zFsSMeXOJU@WIEX&SKKy_0&M$?pz3?S5G-(Zb-D?5NSxVDk?4tlw~xHN*$?N18<{`q zm)LJv#Se0Q;xyF06kxPmkKEF`eA-=+_$dMP|0TGb{;`Ls3{iLa{~t8eb2wLaA|z*rW+^}JZe)wBON-)5R=w&Z{Yt;{v~h@_RPvG zfZbSI>g$<;*7DISk~4S4u0ee_;p*rN6x(1wt-S}Qc7rX&-S2z-9^X_o!h;OdrA`}E z<0&vcf0b}4Qm1>hxpr(zSja*5h{;?mMMEjMbh_vbiH5}E5h#N6jwQ#GAdI0e@fxv* z)?slYaHJcGfG+I$p)f9@k17KGjwK6a;PsB8W(5l`foffdYQ>I1UcE2bp|6K2L?Fn9;ktFf2M^U>t z=$0bBxy;MnjXSMU;>CtkyZ?dOEaQPEHPG_G7^P}x(2>K$X>`q&{J8^5@zlX$YBgJ* zs|$9Oq5kHvV)G1Tqu)%D^?Q!Tcek~6Jkzbw>{IKd7ijP5$5ZnPfmDhY<7xU*OwK9a zKl!kN6L?_0UG_T}L&mM-fO!yEtt*$qy2E`v3d4t?5tWX<)F=KBvh!*#O=NI4zn`nD z;;@NXSCUuCVea(Nb;hC0vJ68=k4il?Rj;@7+$$T9|M%AEkxD-mfJ*L&RHkL;uS>OW z<;<`90Z_8cr)c8k-dYdx$YGnJO)k>FbNB7m+~$<63%$ELvPi{I9!hZS&86e!Nx{bq zALwUOa5*8U91LuKT4z#gFW%3Tq-XRzzG`dF6O#WN(@1{dTw0`#9CW&0Sm^zMOM}=U z_eKU4Ha&s_=KAg#Uo^?>!iDS-hB%wc=R@LD33x@oFLs^=68#sd6U-0$?brmX7tY?W z+e!I@>bYW)NuQ}$m|AxMT^Xq@oxj2gf~nZTGPe-)J;A8*D%Un+zp?>_ra(+XY?h8g zSk#NZScG0KY zp4RuaKjsxcFKDJONwHvPHzVW-XFs0CM(+a>{@ev|@i!1;m9LjBo+Uj%K6V5xaaVXZ zF>5IjaWuLVD!4oc-atCvlN^V5lXD$JgV>o`3aI~n72MT;cF*^hn2b^$HA%O(hlIWKI;2iqoMS0d6rwe)0Frf%B!tyD zunIyc1#HQX-j_Zl3gb>$UA4L>aU~Zj(#?Gnv%H7WbKDS57h-N2n3cQ>O$zZOzr{?+ z;-S0l!{SpJOTM&hkN0dR)?KLYz2=WIA$mByUkT(sdN%d=+*Yr8)<^6TNP~Sdh)44? zdtc?eKGRNG=pUgr_wngCfG}82IrM3Vh;JinSfhxMS3SrZ&@={nrB8>a_nlf;aYY)| zYqsBI-iY;tERE!GP6<;wG)qI01^B#KgR`Q87=BMjzO|@&v+l0VoXcpLtRu1=c@wS4 zcl1+eviz-}ZTdVD5z4G$Mkqa{LwTJk!px>2R;~_I`q>vev0i{5&}u=Pg@_+IIr^H* zS9p7rsp3~?-U9D;?%deYohPzLk>H-kAjwx?7r{PE4_o?>-0@*ci^)o!3pcF zUfDUfq#SaYwo2wPMaucKYYB;v+hx76(bzyqa}hPG_is9mpCp$@Da#J@%kN_0Rpuj& zhj9go@c`HThfDn?D}}gzpO$4~C#HE)lkArE5K5hkJWlwf%|YK+BP=9*xdI^@)cT!J z5PT3F)?dLNKe|V^{zq5>W#>u@WdPxWm(o@fl9&Hq&HjH-+B6kLkjSL*XXLbNMi6*F z)=8Q?lSUC4jv-%uNjAE_1RYdV6ij;QH+TS5)O2AuNqp#>Z>JiDkkGnVA4j-wC%H74 zF$!v01kZmfx$X!Znfb#h{aPgTh+I}oMMhe7ibt2l zM{puOwz`#_&zB9?ev4%auFneL%tLiclpT;4Du>1>4;2qaG2WUB6EEpY(a_glHY;t6 zs=Jbo23ScbCX#Ux*Y3Q$)WqEM>?3;w*=YDClBQVZqVd3i^cx#5_umvXShxmYBe~79 z;?~G23iROu70aBDHPJI9V^G!*gULB#UY4rJ%qPP$nhO!mj&G@UtU2K7|c z6k&!%hSn4cMX+b+-zlzzF!wbj+kio+Ft{*#Ht5WYSddtWoKPNe-kjqW=iPfTK4dqj zRmf<3haJzR#{Sp2U%df(3|?kH{zV*u>n^jQM#t5q2wv$Ka=rSJv$!2ahUnj*y;_%| ztQ;NdOz^q^8X`P0?VsC&JHHWgoHE@%l~ApnAbH<5Qu=7rwRTwb*seM3WI({u?_#ir z7Tzt>nNek>euf5e62k|>;kS-@LEsdCFbLI1)!$nofk~C5LL_m3k(n5zrc zZw!ET?D4s*P&sn_qMHl_vSk}RoqJ4m^Y{P~s39HXUc|);5HNl&1({5MEz6+_kfRjc zssDCmC=SAnC}S5K70O)idYXn?fuK1=-c4W)3erq$A9~YUVku12bXfVK-(SI3wtKZ{ zVme1Jq3ryfTc>c`_T9!t1`+uzHT%Pn<~EY*ubf%O z)+AU#uE)oAVZhl8VZLXjdutSl?rAr)Af0DLYoy{QJzg2{3R~^_3W#iD{qI7FGs?l55k927YU_x{RAvV<4P32CZ`f;xZ$C<4(qJ<n78QZPCiF3y{z8QUW3Hs_dY9hs>hjHwN$q$AEp8df-FCm(+?Ev2lVvi=7o*o8_m1$wp)(!?_Xou;ywKSknTCuDoi4JMCDr1j9o?!s+S>HQEE z(;jGlNKxiu@NvPdR8rwuHB6z?8m5s_9Zc1JZ78o8dhyo7ZFG?jgbBN8GjJX_`<7Yt zTPl7t$PdP{(#XBE7?i4fJK2K(ZdrNLgvET>gMa-9R&16)RLG4~T#z2@sAlK((uCUK z4Pq1{l=93=gxT74y_Fp8J>i!<`eyCTeedcjlH2Kh>rSR8O74GxfdOghR`B-VovAji zTM&k`UNx-d*)6&AV^(Pa=tUY--yDVkCq^JLV`F{YAKySacgSO^2iOeAZRCv06HCq?x zcCr`F_RUtX;=|LnY_|9Chgi6Sm+ok=NC^_XYYIMrox%xQS9kZ#*T~RnX-hhoD}QPv zF5p#Q84Jugxsq!iF$W1ur4avM4wyb*$t_A(zvRF#COQoeHJL>CCFT0kd3Wo2;4^6G!60>w4< z00rf(lPn%kAreh@ynlFc>qw4MJ6D2i@eLde!qwhe#7D<{VZBc`iud6!@P#^`gZ%_DtQ&?evnRZ)x}Ulm#s~5kOeBBRv>JrIDTrz z>ZMV(qkl!F`MYftQVyX%=?;r`5a=?BZlya)im!v4oewjaARZDy2T6Z41-`O6-$-|0 zlS!U3)*A;owcEK=(>zFq1X$c>@n;@=$wInCd2QZgG)@CI9e>7Zg=R|Y?XXu}jn}7d zE3$y4s93&-PN*Tno%A}c&U%i5vx%~wYBN{uP?L)D$Gh-~{;#Iz2IY;r(I<)HnAhg5 z&Xh85%qxExd>}kHJyJpVAD3hH>d6le)TGV$mn8CE4S3hhWj(XXNKpx{sN%@7BHr$d z>_ExcacY&zfc+&dF38rp46?YmGR!{#T6ehFmvJru6Ad*vATS_rVrmL9I5#wt-rX?< zPfbHwOH8vB-uwZRn)?xdjadm)Q`gqMF>rGoQSmCM?_QtQp=z!3Q)-=uqT+~BQBhQ6 z1_@&zAT9{R8UBmt7X`riMq z1xxPD$v$WA{q1jm`zWHE`cNW~XwZ7EWxi|HPFd#V?LA|<<;@s>VU$Q1-ADL~I2$X3 z!!Oo4H;v|*6f1~3l6r%hPK~EFQLCsK)C6iX^%gagnn-znQ=Zf;Y7(`DT20NSwo+@T zIn-pzhgwU`rQW8zsHN04Y8|zVnn(FjJk^)#NA;%`Py?tpse#l&Y7ix+Tqq}MF*S-B zOpT_7P&=ra;4rPF()5+Q&&ZsMA!T9eJ+YU#5(Z4Efq`hCen zNs{C-vzjq~_8s3B`UUo9`X>w+G$3Q(l!5Jo1`Y~wadk;?`DO6>!DWNd5c!b%L#0EH zyDoISGAw-9-`OPge}=Cat{wh(MEr=OBYt~_n2tou@TG;-v~%_Cvt=c6W# zIx?CXymmpfHI(HKRk{Q z1~&!7KxS@AW@aiRGvN(T$^ArE)sZdZA&{^A#Tm_|YsWbU#*?k;po;&Au55s&vaEy3 zLOwHpKNjS`;AKKI`yu|w8N1PBOPpX54x2=kkHo@Kfo7X%T|KcD4M{xiOUtDY9##hx zypdjpgOm4X$}+;-RdiN$njxcl8p?31|HJZL51VN;7QZM+g48L9l>gzq9naoHZlwjB)q8Y*&E#zw`lT6pn@6~Qiadm2Yzyf2a!ctX zDKXsu<@~$&+AjMOnnjlr2b-nj0K3o%+V$OMpBy=Vp*(UuhvWB2tm_V0*1hJqPEP;$ z_Q?fr`2{B=SoX~{p-)XBFr(;Bv9KSBSYrfaCZ*=aXKbGtP{fOri^yQT=5xIw?4_ z%D}XU%m_wBr=FRGw7HtpIw>fC*=&om0b2Mjg(NhtJBSZ#v5kXJUWiglN_XDC-UZ3U zF=YXT8Jcu$h8D`8ytueLU-Ko>XfH5->aHmIrC(M^S`5(KBqgBSOz(kgMOqYNJ7Js& z`I&~^G9$TpJBhe}W)lpfA@r9uULkuzJty<8&}d5}d!y#mdvJ}pyY2xNb2yGxM3Ljx z6IdMTQqZo?4>;sQMI+~{ou8Sv-}I>FJ+YR>t|$(1^p{Ob{e1Urn9cX(SyW+vM#s%! zVGDY}8uaRXsALYuLIQ`M(jn>TA^c8B0>mC}1B0GxKzR~;6L-YLt8yUGJ-7y{Il+al z(SROw%mxun96h=In_D}4Dou*B~L$K?&Q&At(=iBelP!9X! zIqVXzdr!Z~YJd9G!GsX0rqSB2 zoU)(_RRg#;Y4eZpf~H>5yW+2Q7O3xvR9QAmF$u-ieB8P!77~Qd*b1l*mu019WO2FK zkee(GG49mAO_+%#Ng9cNSK~E^{ELPo=3(dK)@Vpci-Cw-KI2u7=smzppYto4j9z{8 zYvDHE{^9`xe`#3HvdkLxW2BTLUo$lzn&-jWsxi(&D( zq=$_9DqDW{%B9;ts!dw*3e%e`tr@*Tkg;Dl$sW{!1`c-D$|GB?EVb9l1ym}*54vQj za>#^KTdknywtn+}#9k@Ouu`(`rgbL(__t%1j(z7B=)h8@+u^h$)- zO}_KzFIj#2@sr!;&+omv(6hHCp&_I)$C|%?Bt{z2BGDj+rZ?ye{njBEQRnRzBYlDTS(LDY8|a>=oSeRYz2wdnoy2O^syP`5+UJ% zaxEl`n7fakK3(z{OL!b(|9VrGBHSTvtld~REhwCRrN2A5a_iRJE2ofBv>A^zp$XMN8hlbQSHqIut%gu*ip_A8foc!u4M% zNP(7rvs?VnTzLP~srN3P*s*ofu3bL-j372Y_ee|!Fi-B@>1;}COf>QaZCyc`T63T_ z;~+4Vwc5togytB)E{4G zCoVpDs;Z==MbFn)l)znJI*~KX*|m80L@U;L!@nG>^bO3jx=N_l#J`hL!>5t@3_}~)PPPfle?cmaZ;&o4B&YBOP!OS)!ofQEI*=8 z%xE+Lm>4ZWMiz~xUkaSjCuMlQF@unQ7M6yAuL zANcz7#3u^g^=U`?=gC_~?%y9WeaGg~&!k*dRd#6m ziXnt{J@*-14NcGzSrZ4b;18=IygIZp+?aG2nCo>P9%&&RIyDBuReXBx{=`T)ec?J3 zr`2-G#u$U5l(8NY%`%}=Rtz_PST$b&TUTqM@Ei3C}NB; zm2ok#i4lu_fa7TVJ7~ZS&Q%b8erY0XT84nw-HhA_gw9!}CAXKb*{GN3GWRZpkAwVJ z@^7@(JpjDgW0rD%XmUp!AVhU3Fy-)k#9ERfmUgUx#&TS5-nC5WrLF2i2sxx|Si_2>J z{vBNkUx$|NK=Qu#>CZnQjq!EcErvCN{p{w$x+e;oTuQNjun7rQQxCkz{;Y!r!Qaqh zJbiq&u72-d9Qvk7Ld?8u)jw(M^62$v&mKKNE|x@R8_*In5?jKUA{KU9!f2VGqd`Vw zDJ_d8U#x{{zJuO|&pWH=?1tpi%Hy)@Ii*36N*YT_Y)-~r%w@-uQQrrhckZxV(ZoPP z@7E2`#9zgKodq%Z@?+qB4Dw5=O!Z%>%kyg(HC^b_j{6p*YZI$L3+<3!QBY%-(rBR- zA|L$`=+-7OoM3}>cz)oJ+2M3gfzB{JvrM(SJCPSDnmD0P3tJO*R&@jzWA{+$pIVro z&Z98N$6Nk^U)en#mWCUW>U74Eb~OjZYPCMETwMl#CBXdsy|CrH>lwTv2fJ*WGIHhh z)jzdgD{4N&r4W_(Hwme=xP7v~L_bIe#%s^vqa6?1(f9)U9RLWy77$5UL`GNVV-A;R zeS4wAA#^nWhNlIQ`^GsE{J?~CN*ha;;(AQZwC(XrjkYCy<(AMs_+ zeT0YL#-i0P5f&Oc9^y#f)7NvZ9sbA3h&$?kPZKWQ=5$x`r;(WKlx{#r%xH}zH!86Z zNouRKCtwR4Bm=z*KTKbj;iHOlSJ9a_b|7DsCapFG(ntZsLn$pyzqAr$ys#4>emk+cDd$mex` zP}pXP#yk@`XZaDKMb=ul!h#Xr^=aJRu(luwm_!nasOoHj1TGf>A%wwmB(PT(dNO8n zXzmWkX7EZ0X##X2(vuiX7YmzzPy<_{DJzC*C`&I*Ey52`fSaNuN1X;tQi3uj zfxOM&(J`V;$ZtwUaylfq$5bmTO7hhu<(8PwH@t`@#t4^rZec-}Q6SUe!T;Ea+yObk zvm=N{BfqXFEh+#VQ=FxbiomDNm&1dX=0$Osx~?e6 zg$!_yPnO9ON;Aud^P&xy+MvvTNX~?K_iTtb#-YJ?a-&q95aFH%A+4>@TGFWcFt>p- z1@G72_CJ)A2gShX%c^vh%930)FRfhF8dYw~{fluXYpmA47|7cB&65tvNDJkEUn2?A zq#ovwrvvv*eKF2b>-P=l&D&@p@n_?00vlAvqOr8L4cgj*K*{5=XdJD7g|?s|2vTx* z93CrCl0SpmK+B`CcpR;Spf<8tYl+J|!;2V8`lpJ~uothhSqIZAV}Xg6C(6i8)DR!&&s`aBq_5~b7WZ%&&YL&l`TJA zM14&Aj_%qU6CN7SC~eh$6shxyxL&_4vjw{J;;-H0@9EG&r~W<;Pjz_qv<>y-tEld_ z4XN{q%XWW1rhEOfEF#g-5SPAv@U0j{2shaLGr`5lq?tvez%D2lp_@j!-G(c%a)WFMYev?%hYU3{Pl^IDYfOL16E>T}oq$|^Kc2rq6 z)&Iv$H*`6%$y)*vb0fknx)5_wf7Y=cNSHjmM+&33oR$h){lg&T;Ri6ZN`Qb^X6l z_68w|EiJNtP&QMWpiN54QKcz3`~dGw%e1mHBp0U~%s>xufLnQ5zKSTFifV0bHF;aa z<73Fv*`~$@nSLT<@)zRPjqY3RgiNI}iwl_Rlai2|q>9TWu1Kr0bk)Z-M^15F9@8cE zF}uJ{P}42ILO!=2Sg_?S7QE0iR@+LzwV#YjM4T#r_7iZmT6pL=p30WDlTSh{u=|Zx zhLBI%N!Pa>h=^h`4e89{k3L}2(lfI_!C3yEhC@$mWYExk6O$0h;WYZn`S0$XJa+x^ z=^OAlg9c2vhX>()3+B(=Z%nB))K(g`S!HQOobL3Q=1agl_;ly26}}riz4<{Yr2;C& zn@eaMEGv?j`kDK4{hVZx1Nxc<3@{HENKyX_+sG&PsN zV*xP+N=!yXP*|7uV*!`L=Xvn7 zwYsAn?6u9KcD0JO-l!BiDk3Oyk${Ad1d>1?_v<%L?pFwx5C{+q7ny>WR*JT0)lTg^ z>$wXcpZhLL#Z2KdBBzbO^IGl{#d!OB& ze}CXVbMx|co`ku2L*0FB4|vl}W2B>&m3~%kixJ_2q&}sp843t;dgN z6{Jo`vI;6CmExw#iiNl4*4K#|rIq5Wynp(NO0ke2)OA#wa=Lt#q5uw&-+H6&^^=M4z<&VM_LAygd0~T~Qdk15P-<^J*#SWa1$Ys&th#dN&WC960EI&zd-WN01SQ^|h;ZOG5`N50W+hkfTkr*~tu0DRGw4Z4 zr@Ct}7M(bMXly(CFq_Ff%C5?J?Ww!y(O-NPa2ebNqs5{#P*1I4IiLb^uYc(L><_ws zow!2BFU_2ufdq`Vg+ye=7ipw2U!AHDsyfAiTij%DZVTTAzBc7Lt)-dLSq(;LBUN5# zKgZ}blv%cq)hNb3=HYh zf>~oVwVJ8s-HQC9K#I)$-G5QW?FiF*LVTkFEXwA?FCJ~F2ePPj=H$!6XnF4$I{y09 z*aVQ*LK_VRi@|E7aZykf!4}5Rx_j+R7QV%uVl((Ufkl59NR=AoI;Y7K8??g!eF75Z zVIZAB==N)%wFunaz$vuB-A4z71J$npiAeMST8*Cgq~Q9NqT*u}HGj0`)gwJsPy+G_ ztwJGa+XrTHq06?2iwfWBJ~s+vIHaqTn$@Oe`l_1mj>QH#+ehMq?l6!O(dzvC8g_}I zk{0YJuBifYSKGTT1{iw)N1hgs9)U#i_i@f##oQBon}czJi}V^nM$K>HNx*6~$X~>| zvly*zJSfj58gcZ&hn5zLudH*`|T=Xg=D*<4+>P{T@_ z!|nzL=`^{tTC1r^PaS3-Db8h|29n*v!vTE$dUj*~+<*0PY#%2bA8_a7$(?-komGfn z*Rsc15i4U`*-dECYV;VYMiNwybkzLT`R)8QJAQ^%PKMCxw|~)6`o`V=z3>i@KmXN! zc5SYR&0fPUr;DH8n7;wYjJby(j>h}Z8#qVeV=lUgZt&65JoF!kzKa&Uz3VpnHJW{! zC&z8VQtA$NTCD-P!{Rc78cbHRS;c;RKCx0$VbMJWWOM4N0N4j^rJC6T5i9;c#L@$# zJJnJx$gAq1(|^S{Z7v#pJvqhqjxhGqK>iQ!-D%OY6|(PC9HWa$_vx@O*j1_g-^)?s z_-5niM1nJS0JZWNCoUL6Vx6nB7A!GpH@l{4C%Xk7Sj}q%3m9w~o7n~)umj`l{2}UJ z`5WFZp-HR0h!thU1I~FFoDIW zpxKr4{R_p(Y+fi~7oF_j^ zD1YhS){kjtl&~=~XXE;{dsuD+t%y3KHWy`c*la0E>TO1&1sj1fnf9}CTxSC|v(sh^ z1*r3vPQUQO*4J=99zn}cCR%YrkWhwbX|K}pt=>l0F`t$Zc?E+oP5$hszx?#w%SYHn zwI&4^C@W|KKAS!4z#}E?De1KO%Rz|lTz};IkB&5){(G=)-7kNx49F%;@I)kV)-ytT zM}4E-QG2^@+|lmr^^IeKr6#Dc!79*E@@~w4E?DY ze>FJ!-Wwkq$0F#k)=JbugOaXV)077X$#plxuU;RWiiA^Ru;WbvPjKIRN&CJ2!+%Fe z_y#w*3JajCH7t?VN$X^xmfl#bKSr@7zuUlSg#^f-!1Up~a= zIB`yLS@I4a*T9D<81+C`0JBTD)qe~^x(>G4>wwg^Etud`4CF?zShO_z@cgK@%B;aA zkZSRtDHHrCWr88NZ63m6#3l&npiyB2Mn*R=CI|Sz!+03?z0n+U;x%CQSAl!O8L8fU z4Wo79{(P2h(^(qud{$dQ@#piIeSH2$rh5p>ly)1v!FF%JMLE4wD9_cGFn|BN1$KcR z8(L#gSyZ4V^C!wL48=OeB2?d`f95YVAloKAfDtNh^N)rdy^apr5e5hN;M(57@A~7N z!^6GNbJJ%|p9dFU4O;^i%u54f1uJ7IHft+DMYj0mvHrox$sy^9()tqJ=3GipSy5i8 zOeMF%?_3aMYUx;-%-}C<6@TQvzEwmRkAIT(pJII8@$gkgSNkRR049lp46A(25@lnf z8Dl>1&+Hs&n~h`YNbmzx_CYX`(%+jOanXBdhVSa{{pcn*AqqWh^+uT(B=>TS40ldk z$PWo#s4kSMDDn00`-DI~TEOzfDT#UPjF+JkpIz_680s3)zHq#GXMYu&MYrTtmmS8k zl|oan&l%}~0W#L;QPznYYD-?0O9SLSs?myBAn#m4{JvE7T8l|CL!Ke`kPDx3 z_Bz6zL7SsJKK4*d5X}{oDK^e=F71COXNewdc&`9-J4Aj-0FM+Botlj?NeV}@y-U!`w;S}P+ zCGuMNsb`)!aJaCFvIfnG`lz_4)+vS@IJl=-YP?i7RQku&tbe*K|8K2k9qqcxCbPQj zrIcY4-{|>rqn$hWt+~4_Xc9tBg08&sByWIs{9dD$9;Lomr&p7ZI7ri*m zACyFeLWx8ujDJc72cyx!6p#+iy zZfhr)mvJru6bvySFd%PYY6>$jH#3*}aRD&~OGZ;!Sy{I-asgBUmxdJq5hJZv2~<

&6tL#0?1u$Q@W0UUqRt!=fwr`2m)@73DcL2B>a z;co8h-3O}ed#`8d3s%-Toc-_b`~L6$egXB26D1G`TsC@d4G0LB?X}s@lmG7F z_=CXlqLbq#;U292hj}o^x$VX0UmuU!#-RXLH1|15C=hsW2=I!F-zSTTh?ING@S5o{ z-_vu6$C`f_i7YBCG}dEts60{<6DlWPq#j%2!lESdeXn|~kxD)M`2R@s@RKA;WXX~} z{Fz>HG4V-qiOgej+#ZQ6mZGRxo7TjJ`IE0+@se=gb+QQW#7I9MdDPaVcao!1q@k%X zyBE%Qedgk&X$vT7E;X6jLj95Qq+X?bsddy8>TQ3@oARONQ`4xe)Ou<<^$ztWwUC-Y zZKF0&uT$HpMbr*z6Xj2Brq)sc)LWDnHIW)cvD9el1ufH%o0J-S+LFZ4pWrk^kDO$Bs|(FXc&|8eTl z`{jXKIGpx7Px^xlG7leQsmJnvE>5t$*mMIp!jV*3?6;=jqSgDbNyOe)EsXq*L zaELJWC;qxYx(pjsLaD)MFrt|#!VN9PiUZl?H7a+=O4=XBv)rZcCzKrr9eg%S*-nrZ zCi55xTan^t_1PWmw}l7>XR^5_jV>M-yh2(p8qt@Mj)$F73D#$H71}<6b*1JsfB01B zwTc}rv{s8W|D+6=g*j#5UJ8GP;=*F2A9QikYMh6zJkh4;y#5NQv{@>^7di*&}BEGAi-TL1qG#q0yCmhg~c)5g2FrbgDh8t=)=J`*e8OFqLoF#{VNF^t{yWni^qLG4UPGv z>zKJlypcw;OP%esPmZxq?08JC8M?~CK2W76OM`<_!w8#U4GEnI$JFmb3-lEAHy){L zIco2RPB@Zmm6WA{22y|d3hsMr( z2JUz}UWymtV7wbG!wb+mXxR_wB{Zr8iZe1HFGnNJ#dEOBnkm36#&7ncgQx{<=)d#b zkE`+G2C*(vt1Jhm3JhlP$ffaiJDOv0OtJ9|TK9zzmEtArNSl9o(v1nNdp`gMjX_Qi z(F8 zY)cepnurK%`R=?pyPtGtWCL0?Ot9)hp<@c#$JQCZ{KM9-3A-+HU%}7e7k-?M#-g!( zf3G(xi*mA6c?EwOan#fW>U7u%yRGupy?vVV(8*{U*kbhRy($}=f%BnSJdr_Kix@i|gPcY8`?`*ml&A|zxa@+oERZn?wfijAn%c%gl7sK8 z^z@z1VS0u1Q~aM#?%1y@*PetU(4e_Q#GgX1Rh9Ba;M9M+iz0U0ZbO%N6G!I}p({6g|)}k)`St8VKI163Bbc703v8ax2)fs!Zha%(&*eN)e z{KCtAIqbY09c<+f3$Y0Y=MN7J8GbFn3%@~x>M=4kQ0)Wy+cN1Qu?^M4i56u^XL7Hi zT+#4*(IkHnng_ORRoH{EiQ-U_^U$@Y_0>L|CZCJOI;Qaub_#A>{rg{p$eS>9v=mK8 zB2GiAH3YUqCf>Zi-dtbV+!E6qyd^Yrvz*gB7U9Xi;px8zAZc{G+ln?_x@ARqRsozv z={H)>3eh;^!&=hp>D|D5eeJ_f`{G(NE5t|Id!T;|l&V}M>|+$h)cT655_4^aJuEg@ z5fRD7*X^kwjXlT9XN7-rL{++2t&WQ%12d{B!n)5tEi4?~W&Ze`ADW0%tbr6br?5KN~qClI_@o;bjJM`ZFMwlqzBH{lC z+=n)zfM|MNL0N|wsqfL>ltwQeVQ#S^dKNby8GdGNya>$&%hoE)5$1@X>-*ZN0SB-AH~TcwBcPUf7E5({rFOE7GVO&#@U|3rY=a`oI&ijZmE|uvxZ5HGc*Qo$wt@u}wfVbM;NdMwq7k1Nme5eu|6eR{`f;Bjsg4kI(t=Lf#}C{^eFNWGUzm{T2t;49Ut4d! z4>y_b@UyouF@S5o(X>7K6TrWi{QjkBk)EE=gIq+{phZ$x&>Rlw@JDi)kX}ho_<1M= z=CjJX4Mk8!tU4!GBUWybCQ6Ck6sCXN>YTcq5A(ZnFXmjq!ZrpADp|~+5)m}&ifapt zbuC~9<_k0d@XSRaoA8T#^q5AjU`LsD$CTlr;d74+4HU>8DKuQ+?DPf_UAB|-u?Qkb zl4zkH=(EDbn`k^1&w)%&?AwPremxtwU(W`VN&jD?XBS$6Uq}95U2E^NiK~C(+apVW zDTU%HQk0;ugCgU4f*mb23GQA;lWan?p10enc03hriW6y;L{6EdVq|x56OEs_E$_e5 zcKIrIE^ZsWMj8>Z9{y6pk+-~*5kG7=$OTcvbcAS&V~A}|Y>1J{WwEjKGJA7FLo_%c3$ ztLLr4BqVy~avG9mGKc#lMU1!6DUe%c)N0F&TzO4)=D|}Jw|tu2NBVzc?CtOWelGcV zVzYSHnc&h5l?%;o%S{QF;W%^U^ySYGdusNy3QnJ@RhA96%98<2y88JieS)qzyq-pq zb@YOOjb2NY$4+zTGaAq4+vEnQ7KrgI8a6;^cVtt_(YzyY3i|4s&NJGjA~fS^PCW|PrKF z!7=h7f7%Jmd+5nf*~;fQXw(*)3QKfWr~&cBtW)CU7&ac8{Du6HL8l#MPPq)Z)}HJqU>F2xh4c6 zAr>NtvgsaDWMw#-hLKxQ+5uHD6vF|Xv6>k6AZKK!AcoExc9 zlN1;O3EFM^xs{r-JhB|6re)^j;+OFlH%9{fo91&|XVG@TQLt#bo|?}i`ts?6yIMk8 zLfos84rD~NU#V}?IuM_2^P`(^DSV~lx7qw z%ELefYNY}+o;b;E4l2*DB#Eog-FkQ!!61TQ7&#{vqWFLRBKD{*i$W~^o0}m^pIu4v zd0}Z`$pAX&_5(gxm|du-1oukNmlT#TPnvU3FaqhO!42&1dUQARK((gtDNH}dc?(Lm zG=0@(5i~zQ%dcM}lW{gOvm~Fl1|JPSxU(_8?Cjb#$zD{jo8}QTigW9 z$#as0;=OxeL+th9fuo_}7VPSEgb_JckA^B;ju-R=7W zX5Eq!w!fJq3)tePP6l4&WZ~vT(V}VL!I9}z)lfost*ESNus1eanm?W9R+~g#ln;vR z%tU^B>m*7#Mo2sdhj}H15#=V?_~p%i-|D9;b_D+;98~f1^e));b|g21l?8zp1ct_K z&w779tbGYAhrk`lL5$|xe{17L)Xfv;&(!Q$_xrQ;-+1(wG5qVj>&8`NAsdMI|4`He z8{Kii9&#e?G`K%mMaIo|gk5~zjf_te>)&FD0ccCBTD$wI4iQH>lGqs9xJ&0t2J5@| z+Y`c)qIXNTLoi4h5<4=?gkpa2;B}Z}`xJjsXmTSO{ryFr$JV%;u)H#L6hHvGan7xc{B1H{XrP-zk%brNNQvShY;8hFr+e^2$KrT-?a)>Q=zC1$sxsPHV2+<_;84ClY=d7npNBe)?yACGk zE~t-S!qZaY6KYayw%VHJvtj-7$d3Lpo`4f^0~)*jD0dhkVUVDh0x9p1C5+_E_ z;hU@eU<$4O0%d-^qFa6NoCzo+90Th?d8UYBG*o6TM0yjCAu#f>L1xZ*~ zMnsok{j0b2#qRnZ`3oE)1*rkN%KZ5(v8Y?Ayg9U8g|J!Yzz`s3U==gxP2 z-}n7~zw3sMqMywK>^@5RdFM=RP6F zkeEeCJc%arNCJO}A+aQctS1{tC|OGsQu%}@ zV25+CAHJ&M9m_G5L)l38z}cq!B}#hip8=ed$nzno=n{Y3x){I!jKOKFXhdE(QUt~V zFc+373zE0!5`d>O0H5y}s74?3Z@6l%G@Gi-W>u;2gWXWfzkS+p=Jc84JrAfF(&>g+ z>O~pqd+!BY*y*TmIj`(%Z@dB)-fKdZ+DO154m%hmePbTz$BO;vFHn=%Qqock`4B*J zHAu!kl|z4?*{rKFRGB~z{7#Mhb4x39K{wdohE(}ZP7fw9SacS1HCTD^d^Lxs#vjy{ z?%idDfDfVJNZo$y5T8!39v`AaBX74nl=`;ABWRayQz8x{aZm%75AQ=sj#QXS{K>5n z4GQ}t4UHJUiq|k(K>wGY&LAXaZa&KC^%FdvYJookVg*C4Qi=ZO`4R54QA^kXIi@Pf>T9Q;YAE#rOy=s zK>++OlWaM#1(MmBFME3>Vf;E67{u~HRtyps3&-F9l2#oY$yQb#HCyr}OG1S~6~q;Sv8ka34q279qZcxJ zp$P&`;e5bZm$Tan539DE-BGvrVDjF${m{b?+y^VlY7_J|%Ie}n(i`MYRM$02eqr-_ zNQqtNK${(H4&O;qdoaY`uSmR!Bf@`h^X*<3;zz0bH*}qHJm61GJ1mbUIsFkjCOJhL z=huVY@^fG-J(<<20|TspIM_6h(VcU>{2K62kKVOfi)xIy=HfkORi!4gKnL+qHc)cM zI9Pr)xRa-^HVf1TZRjhAioAqis`*{l(iklH8+hp)*jE;xgY; z=G_aeO##WInvn7${{PJ$E6qz(HprAbaVH*gMjbn{TU z%fgxzZuWf&1-i8=JgXI6g!~3nO!%3XaV`NI1Tixu|-`^*{R z<2O6Vb7HcWm;I%OJdl+KImm+*E6DCajdwP3McApg)8lzjUiE{VT#D#}OYU1dR2={>K^}5iw#BuJkA|l+E z+E>K7FAa?ijY$X%dA_qxbmXS^xX>7Pzvz(Am?(xx9qgMJwSIO|bcoNU(8c~SVX<+# zfcW_lnt#YiuH!r>vQ{RNVP0oeF^icunITLt})bf^CQ)EPJf^Kz_=7Zbs-DoNmdv!X|M;(uIpQOM!wEEJ_e+BSnBB}>fMx@q2c;E4y| z*pqF!H~45(&z#7rI#hnx z)^E2CA4wt-Vwt_r{@_EqYWDXF2&rw@YL~*vDR?RNkLG-03Vhk!++4+&q4d*BWkph|ft)%M@JbUUFzJbX@EdnWZ zV$WV_NjdlHj@j6^BUip$_A4tTRTCcKtmbcv)RZWE?(SWh(h8RfBp&^O#2GK;$kG}p z3!b0Hfjr~H+(TD=x$Vx8VEH4uhXT%+A1ANfG8FB5<_Js80;MvFFZ;AN4(baug$L(; zs0%gySb25kyRwq4=_{N?_|45Jjm)5)t#;es^Fyl5Pc3f~cTWjHDcyC#IDg9H9;8%^ z^nBy)^w$)P-#fKeh!a?bYo0ZdCwhlmE;JPYb$==)=x*R&5gr5sgvb zpJgmec~de8et6T<>+X5s7e3D(G3bBLFku*H-U4l)_l9t2&L-F0HrbQs;^zm{ZPCzW zqeAc1{psBud8e=a;Mq#b;&j+HVi6m)@@E)^_JEUnC9oT6g9Z&=i2g;^>}NVX@-R@ zWHW^SqF`3p2R;NJ1(xxCA%Fgh2Dg$d{tcClaSxGBS_f51{*)ir)GJk0U%yaF=sBwT zFi)e@&)F13cke>ejJ4SJ=D}CZBa|yos6u!`f_n( zk0fovn8l716&RQ)WKC1YdV<<@qC`B%O26f14w65m^_>9QwCjI`22 zM0eMM9XdI5?yJtLl(-x@xLNq@F}{9d)bOS6R@Ip%edCoy!*FDYAA$Up=trHBA*5c*Fvp}P_wkBlreLl?G-t%)I|Ndo4U1`C~x9rYm9#uaLTeBK( z%gHHubf#xCWSlYw16mp>`x+;a0{x5rxe;A@JRxogTwV&U2yy>&yv`P)dPidiyFHI}Tp zL9MW_8-|*ZNO@Kc(`?7QvR-)Pj3zYG*JxzDwU#I`;rQX`%t4zqdiYrQy;f017@5ye zFwxc>bIaQ)#~j#|`5R()S66op<3R$hMnr6Cw-SPmpK*PouI3THsb3roDSUHYbJV_- zTD##(S3EeP*qwWiPi*H`#c52z2rz{^AmqqTx(=|Ge9&S9|!<~MpLUylOG-F-)P%qkt-~ZQV zl9RGej^6nySlt^@x4d@sp7&o6==D+dK_Boy9ZFf=quaZrcS^0P!Ig}4pV zAI^sB+_S%WjkqVrQxO8%7dMjjdsUjRKYV8CV&l17d%A>_ZBTR;`34?Sta_Ijok?q=N8{r;ye7w0DVlc4DC%*>>6ag}^F>s9>IY$NC3g ziY;$0sw5|pCWKBWO3}a`p{tv^$@SSjX7l)PImX-S!qd&fDWk-TfoC(fPyrJ3QE1-- z?VBd}RTpgEW}Mz!xpl!-Q*-!di?heldAxjO15UkaX`X5B^6uBEZ%_|mQhZy3oTS^x zB||PAd(2&~Och&sd=V0QeUwL%>22FrTH5rlckTsbvAoxR$Y9@A3S1COd)w; zKcnuz=xo>1?3}f?h{U(>S&Z<8tDvC%Y@M=ezx<0Jp9%bH^@NtJKI7Ua>mqz{sg4~7 ztni*qW{y>d3x^?RWLc{soyC7%nhHN2)aIF=ROaa0p*3BTQ}47O>>#|yc9`;Fp(*dv z+v=v5JAI;@RevxS8L8>cukgm12Q8~5-qw`1b(eb|u`q?M=_RrhD?TQKTvwLyn#X&(4$D=crvJ1~85v90Z5TZMVee83p+Ey(-Y52bdAaX;c( zXWDs)`)%Wy1`JOo~}s>rB`F?K%N znlI@s|GwS$jv@v0sUe&!R3jNIVPP6Aaup)s6(D=t$tFaE9~tkjLTjANfy-;}2!L6b zy1CU6tw%iyB6&@1;F}~e=Iv3P-V;xwdYvDAxU@k`@;0JXpo9yZ$A! zg4=)cjZzt_Bp1`=pPjMY%!p{;MBn&dOo*qHz=1L$`C0npJC_lulsU~hpYn7Z(1;`s zxoV}yuSj*SJ8%Q1!f01(&Rx23w}aN5^NeFW1ipcpr*In{m#rCk1^LcZ-t!z~iMJtB|TCXe~mq z+YAdz(Rei{Tg@WYui2g^U)FhN$mjfwW_jnkB$|*u?k5rXCH)TlrC~PWdfHgi{H|~A zre#`~=4p7*G@MDU=w$_?JH)7g{DvJCf6iS+~-d)7+hH>9Wih2;gd3#7Hm!aZgZ7vmHS>qmj&v8`QEv! zukt$VXFs>z8>ROeN>$?;5BaXzikoQjAWeRbKA*YyEEcZr zW1^s{=KkM(OEB!JlPEDr-vL=_m7Ft8flE(=l7D{fFng)sixp> zF1O?%1r*}&FOc7kyng)R95!~lA);&aUg>Ukg8bFq6|8)`)5m1ix>bhkk89ld&haT- zmu_b6y;&Yvq#bl}E2+;2fa+CB*a#gew-i(KA*%};9TKvwGuGRw?iVr67}Sltx#3LF zayxfqg^MnDLKQ4IAID8RXBu~3;jNRSpcsUxWlq%AXDlh!IZ*oe_3-QkrIJymkLhc> zIbIL?EUd7YBs~|K{#MtAe0MH$C3ni+s;ZItHBI8VMgF4?eNM8e0!`FbdXeKm^VRZ( zc_K>EV3ar`zjsU7kjzvoOS>%-X+2hThw4WX5mU&Kv~pPiNb?uj(yPObm7QssGY<}9 zfK48rHb1K3Buf?8jq7N04Z|O)cf}v|j(nd!ujFEm9dt2Tai$Mf*F~>A_%&g{8NvG0 zTOg2Zr{PFPC|ddRSGR514cAa&*hVri-9N_dmx!7p8x84m^$_}#=h?ZUMPL}OuB@=bM{h?RTe2z9?{wFVI zf^9?DODwf+(JkipGoBX8RTgeDYw7(KP&L2zSv|KCq)%{ch-~-k@F-=hEODUhsD$>% zNORq(Yqd5slBpSxioRcnQf_FEIX%m9yM{T_aK_}Xj2a*4T{WIGW5(hR4jECNWVk!{ zh_geL)xnuZo=ei}ng?c^QR?o#6{ma##~#t%18kn5+v8&=oQ*2-M%|q7`9)&8hnLbN zI8#ztC_C7EC85KqPIn?&IcpX9n!Xr|iG-Myg-e+P_cC^=hL}#}bm=da8Bd@K-O6p} zPuw?)?J~(X;v(ibbj@Ft#H&owzDQpf<0_4L$~{U?neEvoy@8;L zZ5N3^NjO)*Myq9eNYCQIJn`0iV!=7qO{H0WHRhGrB1w&I0irVLkCnOA6?fNL5=B{W zRCms5|K#((;Fd)znaS6fM{zSY@LJ|*u1PBP^IT~~7ePU)<*CUooT9y@;7uq;J_9zbE{yJFq{aw-;Q2sbZotoG2S}JTB|?4-~{Y`$)DwV&=ZT&%GqaM{#!Xk%d?W zHXELY=9+<7cNH&J_3v3^cj_03LY5J4Uf9`N@lJ||A5El@28zOkEG6MN_&K;h@14OE z%k#O$isZxkrd>w;iS43dnzs=!^CNQOM|YT5r=)X)Tx%aRR_kP`vn|0&gqX#}9p4Ro z3AsmZ=vL6_$iwn&Pro(fUF@u<2kTK2)}}hu+P#7?S6GwvQ_}4(SV11@WZe&46wJ3s z7t+^t@6F~HoJjeEu`zGq2U>~RSL#`D3j2D%RbVu4C9>gZh^A;vPyDXLIyosOrlnxx z0DV4!PncmKXIl)Sj%_kk z+75a1GSQEG=!14$!3X>>7B29kz>Y{B(Iri z<5Z$Mo23k&MrLEgT`oOmd!y`!=`tE-;Szk7LS}fVqK{YrEk*eDxn48iYEQVjyt0MN z7r8U^K8LcJKmT$CNep!UN|(99)F-T7#7s&7x4AA+rAWbJyfI4++Os{()Zej#i%;t5 zFE^s;P6~>ZD`W52=`3q6eA7o8g~;%}f6m`lv=k?4cG#aaZtF(&)rR7-TFZoZ?R4xt zk`VQ}kE%E8t+En&XM4=T?vOe05G@QPu_ia)DLLQD-S11r&`nih`b}m1nq1;4R)`r{ zZzu#Ca7QMIVbky3=>7a?dGG~KT^@O)@@J6U+5NjU#24zw-aKm*VL39a8EsR@Z;}H? zGLpTz`nh?!apA>AvWsK>FWThrqBBw?Q`K4Aw$<}SNn&)p@Oi_$u`{thP zgq{;GKsmU^2x|R&AKQYdQ+r|d*?zESBQc|{MqP)$K}5Rw%7I{A{qUB$r$L#ldf+!Z zq2|&I$c!CroA$YqBV4wvC11j|@t;x&CX`~8k7wcwzZpio3DNZGChq6Vm{F-%S8q1A z=(|!QXSF?S*t>k3uiRaD&F;+5I+pCKrajk6Q25S`-r4+;820y^yX+a@+$D|Fsi2w) zmf_?=5*msMQ8k-t&--m$IkL=gQpZ+{LtjlvevAj~fjF(TYQ3fCYvFgD^tB9>x5kF& znvYy{a`ra%@VSUOPPDJbJX>BV!;nB-8;nC&<|1&!NJ195vC-;%2?8UItiYn zLrKPSQDGY1LA}@IqVdqiYt&6P?v|wu)AJ@-;x<&zWnBfe5=d zqrWIz9rva8B3p+B_lSBAuxf!>Qnma=?bHi5&fR=f>e|@rQMdS^ zVRw_k1lN+nW|bP_HfAMhRK9kl@`w!_VdlDSv+VK&!O%`4iYqpurn0!DzKKT`H8>H^ zJxJ~Ub@{RTsDGpoTY$)6rrnu1MlRB^bZ`5?w+r7r9joGn_#F?T$ODZDQPh8Rgb%lo27y)UR>NH&p%sP<{ix1&fM({QHJpGo{h`2*}dy>Hs&7HPH+38 zHnVOai@1-63#qt@YL`{qqDIy$W|{HcnUJl8&FKS)?j}LIKF!kDn3wTv&5LDxlv^4C z@k1)6mC=v+f}KcL)3eCTR~$wHR=&2CZP1ZM0h`+?=`tb@x?&s=m%UaU2CJ`nyT1-r z^p1bAzcTKXd1h{TE^M+VUSJ9|s2vr*5go^9&A{9qcA>m>crjzCaRimUL(5TIv^2T2 zbN8N7@!Is#q3>nU!$YB^ap`;wvcLZ(L;UmN0~`XzeGdacNewmhm5fdB%;6w*5KdbG z#DJ5I0MTK+1P9+bGIcW;$9F5+%S9*59to-ToY7SH^oc$KXU=AA#p&WRXm-HnBt%~a z>i9Hh9HSohL*rZMSAoLHgu7O`%jJ*NZtD#wrz0h^XxfJE?T=Nv*|~P16kR^S@?t#p0;8v-8A-+NMk3RbD$nx1OYSarMb`Pl@dVG8QkukUH)ytYoqge@#52mnwDc*Ba=ecRRdeW@6!|yd4C3YTI*M1=l|)+i zOL|K#bc4D-PClKyUl3`q!*GRHLZ`I%eZ=j+IKS0TB{RE?=&sKvBC-v(yvHotel`oE z-9LlUX?2vIvE2SjUL5>7MIy_;UxII;&dISPIcJa&`@p_;^ec_#L?qYt$idK=#80zw zBny)?LNuTv1>8;*XLZoU#+gRp-4&3jqZCA9<09 z>bv`#2%YsQ#hDq)wv#ZJhuNgawAvz_I))6Kt?rsDPS|!8iDb=+ z+KS@}9Rs^M@Q0e{2W@9lUh(DyqtM?aPGEKW@bJ@1>SbM?9znPXHXWT&VROSPp^eo5Y* zh}eJSS|h9GT=TH+*Y4>0r5ZW>XI8NtV5e}W+CbU+V&0ALb)B{ATbgX4HyRj^%)VyF z4co8!h+b-)plf`0OWHCrl)V?sCoh%R@ZouNGqxePyVdlrrzhuN9i>e~sY2gVVtA6s z`&w6j{k{%W2~jc*8K~w!z;&8~h4?!|GDoFLD3rrsvsPNq*>Z*@ZS|65sQg{qhofU7 zpDw3!rEAUKJ}&PghMS@w*!k!soR4O0PK|JNH3M^@;CGjl3yT*IV3gi3U#A)S1&9t% zmSd?*{rFGH%T%N{*Bw9dU#ae`8~!@afZkNy{hWS+uU;LB6IVx0;0a1NS=klVda@S&PY| zU&N}=8-&Jeetx8lGJ7G?lXz}_JLCDtyrnCaQMw~R=i>Vm5>VHPLY>J%xYh@ndL2u$ z^Xa%tQgT->i^=!j6EuW=dCp_wy7pxUG9P;tDVylt7fWZNbGPd*Bdt<#r!KM0S0lr| zG*_vY);=^l>BJv~mcg?>JEMr}T}e*!}))CV?xLEW!Cf%g6{y z%4g0$ES`%i6(qMaG!&oDNU|e>&jgN&=PmYSQCld)3Li8b&Wzv=OkREG%REyV(7k!B zO;d?95!;+6L!!sE^3yvxr}u4$bw$0XH&!}Xp-szjWAaLE-@@p43FwC$?TK&?0x9Jo z>fx4f;_eV_B@cNUqcdpMVCX{9HZYJ{FG4#-J7TY9Fm zN8@60<>rf06 zaj0k6VU|0j5qUF@{ksw(|5QQ<3W32%#Q>F1QC~|zSq|qB1DeFC>i~tY?kR|Z%#~u( z-OIff@AU*k4LVDmZZq*0KL~|Oiv>xMUe__yG||S5#)7`#h|NJ9WHglITaUK~a9^K- z`p(Ly>1g6MEkK;aP#6N&c@vOw-NabISQ|%j3lxnjx&<=C30Z;I(NxioTw*o`ynfQe zz~N`2T2Eqa4tYLpDbmidgLtKZI3fD2PpuP zq?rSo%JfOYNd-vdUWQSBeh>D7fW?RzJ03mKFdg+jNx?j!@-H6l7(AN3vZdX*Ztwy& z@7a}U-hET_#8&jiT_x}P`&DZxKj=M|QP=@up60d8$_|-y>|o@V5Ya#yJt_6$mI4_@ zu(iX?N!9IwVD_!)on7!Hs#|;}I+Yu*j^y8u6R|T5qTH`eBu!gEGP^!i+&@Q0M@)Q% zwE5u{F3TFkMFfH3=q&*Rl#O)dr|AW>311${k3IsAScD4F;V^mtqn=nnAVFIe$JsUQ#$37Q**M&rq! zfy_XpCUS~~I*NFQbPz9y5d-0dqcQ*ggMr{OGC+EOF@IzLFMdLC*D^sU5EPHi1Ytp> zs#*$$@+SDRS-)E&o)@6=c=QX9Inkd5;L~$J8N`1Mpux-Kfdq&^XuREPkUQv~w@D`p zKuN@;Dt~SN!v_?DQi=cBn8H=|oA=N2@cQ?^m!qm~EGK7*H?REt8+`>+QzK(Man0`! zf9~6URS!x7$o{%639r)h`@`QSxZ@XFL5alwbaJ5`zh^U$Gc{Gz!1I3nt-;@(jj!ne z@2`Kxz%UE| z?5Qy%0!lcB1lr5U5s)Aj1)MtnpD7RsIEHWv1Of^Nj`sOC9Rv)=KnTXb2q+A&-hb$T zF$kDIO$eapA2qT6)*S^UAOz@82*NQq9E=3oOY(7=(}x*ne~iGhiY> z9fAn~c%cLng5gjEaH>)L42TyCfuPYa0)v3z5CoEN9ykOBCm4f3kQfx9K~OOGDaBAw z!0P|i3j#qvpfGOie^(EngdtQ0iNTF2LXeMAj1W=g%!vFt+4vB^lG9zJ77@-g(6hnv>;AOB= zbTA|aehPjV6!QPdVE@VhU@+j1goFsd75<;_Z#o1DK^T@0z?_6(`5P?^A=EGwn2;9? z#vlp1A`z5&4dB2w;(_Z0wfa@;X=?DG@KAYGzQ2{fZX5s{{ue+ zj6s|tgo6Q}BTx{Ag2D-N383_;F#in=AqoIi|4x8^#~%y@q+0?Z05giv`yntO!w}G+ z(ST^eF%Nh6SJUOf(eelm0s)1dKug1@*sXLSYbu@Pko+oe1EEfRQL9 zp@IMkf9DEd{r|uZhM@p2BoG3u7)l5~1df6b`Uf0{J3<9vfYJp10e}xc{Vy4R;SWJV zp{FN=ol3zl0M>sq|HcF0Jw1j(opNd*%bbcZ7#i?DLaiYv)G4i@U<6@AK)~QrUJZ;P zp#&?2fDu4A{cFX)l?IYB;%}4uyK16=szX2s2tLIOg#niOFC8El3MSRkT2v7oE7#jIce}es=_d`*@355_ z3(zkRc1^!KDZqjM%76cFV0lk)G0FoO#lM+KNFMx z>CG^>r(+-{dkpeadj|$gO^6!c5&&!jpaJOyNr3q8gh&`bKsOJ?z;V?JATHosign == FP_NEG) { /* yes, copy G and invmod it */ @@ -181,11 +181,12 @@ int fp_exptmod(fp_int * G, fp_int * X, fp_int * P, fp_int * Y) if ((err = fp_invmod(&tmp, P, &tmp)) != FP_OKAY) { return err; } - /* _fp_exptmod doesn't care about the sign of X */ - return _fp_exptmod(&tmp, X, P, Y); + X->sign = FP_ZPOS; + err = _fp_exptmod(&tmp, X, P, Y); + X->sign = FP_NEG; + return err; } else { /* Positive exponent so just exptmod */ return _fp_exptmod(G, X, P, Y); } } - diff --git a/fp_mul.c b/fp_mul.c index 70174d5..cd0f2b1 100644 --- a/fp_mul.c +++ b/fp_mul.c @@ -29,11 +29,11 @@ void fp_mul(fp_int *A, fp_int *B, fp_int *C) } else if (y <= 8) { fp_mul_comba8(A,B,C); #if defined(TFM_LARGE) - } else if (y <= 16 && y >= 12) { + } else if (y <= 16 && y >= 10) { fp_mul_comba16(A,B,C); #endif #if defined(TFM_HUGE) - } else if (y <= 32 && y >= 28) { + } else if (y <= 32 && y >= 24) { fp_mul_comba32(A,B,C); #endif } else { diff --git a/fp_sqr.c b/fp_sqr.c index b7c7f64..d028a88 100644 --- a/fp_sqr.c +++ b/fp_sqr.c @@ -16,7 +16,7 @@ void fp_sqr(fp_int *A, fp_int *B) fp_int aa, bb, comp, amb, t1; y = A->used; - if (y <= 48) { + if (y <= 64) { if (y <= 4) { fp_sqr_comba4(A,B); } else if (y <= 8) { @@ -26,8 +26,10 @@ void fp_sqr(fp_int *A, fp_int *B) fp_sqr_comba16(A,B); #endif #if defined(TFM_HUGE) - } else if (y <= 32 && y >= 28) { + } else if (y <= 32 && y >= 20) { fp_sqr_comba32(A,B); + } else if (y <= 64 && y >= 48) { + fp_sqr_comba64(A,B); #endif } else { fp_sqr_comba(A, B); diff --git a/fp_sqr_comba.c b/fp_sqr_comba.c index 4a73e2a..cdee78a 100644 --- a/fp_sqr_comba.c +++ b/fp_sqr_comba.c @@ -53,6 +53,34 @@ asm volatile ( \ "adcl $0,%2 \n\t" \ :"=r"(c0), "=r"(c1), "=r"(c2): "0"(c0), "1"(c1), "2"(c2), "m"(i), "m"(j) :"%eax","%edx","%cc"); +#define SQRADDSC(i, j) \ +asm ( \ + "movl %6,%%eax \n\t" \ + "mull %7 \n\t" \ + "movl %%eax,%0 \n\t" \ + "movl %%edx,%1 \n\t" \ + "xorl %2,%2 \n\t" \ + :"=r"(sc0), "=r"(sc1), "=r"(sc2): "0"(sc0), "1"(sc1), "2"(sc2), "g"(i), "g"(j) :"%eax","%edx","%cc"); + +#define SQRADDAC(i, j) \ +asm ( \ + "movl %6,%%eax \n\t" \ + "mull %7 \n\t" \ + "addl %%eax,%0 \n\t" \ + "adcl %%edx,%1 \n\t" \ + "adcl $0,%2 \n\t" \ + :"=r"(sc0), "=r"(sc1), "=r"(sc2): "0"(sc0), "1"(sc1), "2"(sc2), "g"(i), "g"(j) :"%eax","%edx","%cc"); + +#define SQRADDDB \ +asm ( \ + "addl %3,%0 \n\t" \ + "adcl %4,%1 \n\t" \ + "adcl %5,%2 \n\t" \ + "addl %3,%0 \n\t" \ + "adcl %4,%1 \n\t" \ + "adcl %5,%2 \n\t" \ + :"=r"(c0), "=r"(c1), "=r"(c2), "=g"(sc0), "=g"(sc1), "=g"(sc2) : "0"(c0), "1"(c1), "2"(c2), "3"(sc0), "4"(sc1), "5"(sc2) : "%cc"); + #elif defined(TFM_X86_64) /* x86-64 optimized */ @@ -93,6 +121,33 @@ asm ( \ "adcq $0,%2 \n\t" \ :"=r"(c0), "=r"(c1), "=r"(c2): "0"(c0), "1"(c1), "2"(c2), "g"(i), "g"(j) :"%rax","%rdx","%cc"); +#define SQRADDSC(i, j) \ +asm ( \ + "movq %6,%%rax \n\t" \ + "mulq %7 \n\t" \ + "movq %%rax,%0 \n\t" \ + "movq %%rdx,%1 \n\t" \ + "xorq %2,%2 \n\t" \ + :"=r"(sc0), "=r"(sc1), "=r"(sc2): "0"(sc0), "1"(sc1), "2"(sc2), "g"(i), "g"(j) :"%rax","%rdx","%cc"); + +#define SQRADDAC(i, j) \ +asm ( \ + "movq %6,%%rax \n\t" \ + "mulq %7 \n\t" \ + "addq %%rax,%0 \n\t" \ + "adcq %%rdx,%1 \n\t" \ + "adcq $0,%2 \n\t" \ + :"=r"(sc0), "=r"(sc1), "=r"(sc2): "0"(sc0), "1"(sc1), "2"(sc2), "g"(i), "g"(j) :"%rax","%rdx","%cc"); + +#define SQRADDDB \ +asm ( \ + "addq %3,%0 \n\t" \ + "adcq %4,%1 \n\t" \ + "adcq %5,%2 \n\t" \ + "addq %3,%0 \n\t" \ + "adcq %4,%1 \n\t" \ + "adcq %5,%2 \n\t" \ + :"=r"(c0), "=r"(c1), "=r"(c2), "=r"(sc0), "=r"(sc1), "=r"(sc2) : "0"(c0), "1"(c1), "2"(c2), "3"(sc0), "4"(sc1), "5"(sc2) : "%cc"); #elif defined(TFM_SSE2) @@ -142,6 +197,44 @@ asm volatile ( \ "adcl $0,%2 \n\t" \ :"=r"(c0), "=r"(c1), "=r"(c2): "0"(c0), "1"(c1), "2"(c2), "m"(i), "m"(j) :"%eax","%edx","%cc"); +#define SQRADDSC(i, j) \ +asm volatile ( \ + "movd %6,%%mm0 \n\t" \ + "pmuludq %%mm0,%%mm0\n\t" \ + "movd %%mm0,%%eax \n\t" \ + "psrlq $32,%%mm0 \n\t" \ + "movl %%eax,%0 \n\t" \ + "movd %%mm0,%%eax \n\t" \ + "movl %%eax,%1 \n\t" \ + "xorl %2,%2 \n\t" \ + :"=r"(sc0), "=r"(sc1), "=r"(sc2): "0"(sc0), "1"(sc1), "2"(sc2), "m"(i) :"%eax","%cc"); + +#define SQRADDAC(i, j) \ +asm volatile ( \ + "movd %6,%%mm0 \n\t" \ + "movd %7,%%mm1 \n\t" \ + "pmuludq %%mm1,%%mm0\n\t" \ + "movd %%mm0,%%eax \n\t" \ + "psrlq $32,%%mm0 \n\t" \ + "movd %%mm0,%%edx \n\t" \ + "addl %%eax,%0 \n\t" \ + "adcl %%edx,%1 \n\t" \ + "adcl $0,%2 \n\t" \ + "addl %%eax,%0 \n\t" \ + "adcl %%edx,%1 \n\t" \ + "adcl $0,%2 \n\t" \ + :"=r"(sc0), "=r"(sc1), "=r"(sc2): "0"(sc0), "1"(sc1), "2"(sc2), "m"(i), "m"(j) :"%eax","%edx","%cc"); + +#define SQRADDDB \ +asm ( \ + "addl %3,%0 \n\t" \ + "adcl %4,%1 \n\t" \ + "adcl %5,%2 \n\t" \ + "addl %3,%0 \n\t" \ + "adcl %4,%1 \n\t" \ + "adcl %5,%2 \n\t" \ + :"=r"(c0), "=r"(c1), "=r"(c2), "=g"(sc0), "=g"(sc1), "=g"(sc2) : "0"(c0), "1"(c1), "2"(c2), "3"(sc0), "4"(sc1), "5"(sc2) : "%cc"); + #elif defined(TFM_ARM) /* ARM code */ @@ -183,6 +276,30 @@ asm( \ " ADC %2,%2,#0 \n\t" \ :"=r"(c0), "=r"(c1), "=r"(c2) : "0"(c0), "1"(c1), "2"(c2), "r"(i), "r"(j) : "r0", "r1", "%cc"); +#define SQRADDSC(i, j) \ +asm( \ +" UMULL %0,%1,%6,%7 \n\t" \ +" SUB %2,%2,%2 \n\t" \ +:"=r"(sc0), "=r"(sc1), "=r"(sc2) : "0"(sc0), "1"(sc1), "2"(sc2), "r"(i), "r"(j) : "%cc"); + +#define SQRADDAC(i, j) \ +asm( \ +" UMULL r0,r1,%6,%7 \n\t" \ +" ADDS %0,%0,r0 \n\t" \ +" ADCS %1,%1,r1 \n\t" \ +" ADC %2,%2,#0 \n\t" \ +:"=r"(sc0), "=r"(sc1), "=r"(sc2) : "0"(sc0), "1"(sc1), "2"(sc2), "r"(i), "r"(j) : "r0", "r1", "%cc"); + +#define SQRADDDB \ +asm( \ +" ADDS %3,%0 \n\t" \ +" ADCS %4,%1 \n\t" \ +" ADC %5,%2 \n\t" \ +" ADDS %3,%0 \n\t" \ +" ADCS %4,%1 \n\t" \ +" ADC %5,%2 \n\t" \ +:"=r"(sc0), "=r"(sc1), "=r"(sc2), "=r"(c0), "=r"(c1), "=r"(c2) : "0"(sc0), "1"(sc1), "2"(sc2), "3"(c0), "4"(c1), "5"(c2) : "%cc"); + #else /* ISO C portable code */ @@ -223,87 +340,31 @@ asm( \ tt = (fp_word)c1 + (tt >> DIGIT_BIT); c1 = tt; c2 += tt >> DIGIT_BIT; \ } while (0); +#define SQRADDSC(i, j) \ + do { fp_word t; \ + t = ((fp_word)i) * ((fp_word)j); \ + sc0 = (fp_digit)t; sc1 = (t >> DIGIT_BIT); sc2 = 0; \ + } while (0); + +#define SQRADDAC(i, j) \ + do { fp_word t; \ + t = sc0 + ((fp_word)i) * ((fp_word)j); sc0 = t; \ + t = sc1 + (t >> DIGIT_BIT); sc1 = t; sc2 += t >> DIGIT_BIT; \ + } while (0); + +#define SQRADDDB \ + do { fp_word t; \ + t = ((fp_word)sc0) + ((fp_word)sc0) + c0; c0 = t; \ + t = ((fp_word)sc1) + ((fp_word)sc1) + c1 + (t >> DIGIT_BIT); c1 = t; \ + c2 = c2 + ((fp_word)sc2) + ((fp_word)sc2) + (t >> DIGIT_BIT); \ + } while (0); + #endif -/* generic comba squarer */ -void fp_sqr_comba(fp_int *A, fp_int *B) -{ - int pa, ix, iz; - fp_digit c0, c1, c2; - fp_int tmp, *dst; - - /* get size of output and trim */ - pa = A->used + A->used; - if (pa >= FP_SIZE) { - pa = FP_SIZE-1; - } - - /* number of output digits to produce */ - COMBA_START; - CLEAR_CARRY; - - if (A == B) { - fp_zero(&tmp); - dst = &tmp; - } else { - fp_zero(B); - dst = B; - } - - for (ix = 0; ix < pa; ix++) { - int tx, ty, iy; - fp_digit *tmpy, *tmpx; - - /* get offsets into the two bignums */ - ty = MIN(A->used-1, ix); - tx = ix - ty; - - /* setup temp aliases */ - tmpx = A->dp + tx; - tmpy = A->dp + ty; - - /* this is the number of times the loop will iterrate, essentially its - while (tx++ < a->used && ty-- >= 0) { ... } - */ - iy = MIN(A->used-tx, ty+1); - - /* now for squaring tx can never equal ty - * we halve the distance since they approach at a rate of 2x - * and we have to round because odd cases need to be executed - */ - iy = MIN(iy, (ty-tx+1)>>1); - - /* forward carries */ - CARRY_FORWARD; - - /* execute loop */ - for (iz = 0; iz < iy; iz++) { - SQRADD2(*tmpx++, *tmpy--); - } - - /* even columns have the square term in them */ - if ((ix&1) == 0) { - SQRADD(A->dp[ix>>1], A->dp[ix>>1]); - } - - /* store it */ - COMBA_STORE(dst->dp[ix]); - } - COMBA_STORE2(dst->dp[ix]); - - COMBA_FINI; - - /* setup dest */ - dst->used = pa; - fp_clamp (dst); - if (dst != B) { - fp_copy(dst, B); - } -} - +#include "fp_sqr_comba_generic.c" void fp_sqr_comba4(fp_int *A, fp_int *B) { - fp_digit *a, b[8], c0, c1, c2; + fp_digit *a, b[8], c0, c1, c2, sc0, sc1, sc2; a = A->dp; COMBA_START; @@ -356,7 +417,7 @@ void fp_sqr_comba4(fp_int *A, fp_int *B) void fp_sqr_comba8(fp_int *A, fp_int *B) { - fp_digit *a, b[16], c0, c1, c2; + fp_digit *a, b[16], c0, c1, c2, sc0, sc1, sc2; a = A->dp; COMBA_START; @@ -390,27 +451,27 @@ void fp_sqr_comba8(fp_int *A, fp_int *B) /* output 5 */ CARRY_FORWARD; - SQRADD2(a[0], a[5]); SQRADD2(a[1], a[4]); SQRADD2(a[2], a[3]); + SQRADDSC(a[0], a[5]); SQRADDAC(a[1], a[4]); SQRADDAC(a[2], a[3]); SQRADDDB; COMBA_STORE(b[5]); /* output 6 */ CARRY_FORWARD; - SQRADD2(a[0], a[6]); SQRADD2(a[1], a[5]); SQRADD2(a[2], a[4]); SQRADD(a[3], a[3]); + SQRADDSC(a[0], a[6]); SQRADDAC(a[1], a[5]); SQRADDAC(a[2], a[4]); SQRADDDB; SQRADD(a[3], a[3]); COMBA_STORE(b[6]); /* output 7 */ CARRY_FORWARD; - SQRADD2(a[0], a[7]); SQRADD2(a[1], a[6]); SQRADD2(a[2], a[5]); SQRADD2(a[3], a[4]); + SQRADDSC(a[0], a[7]); SQRADDAC(a[1], a[6]); SQRADDAC(a[2], a[5]); SQRADDAC(a[3], a[4]); SQRADDDB; COMBA_STORE(b[7]); /* output 8 */ CARRY_FORWARD; - SQRADD2(a[1], a[7]); SQRADD2(a[2], a[6]); SQRADD2(a[3], a[5]); SQRADD(a[4], a[4]); + SQRADDSC(a[1], a[7]); SQRADDAC(a[2], a[6]); SQRADDAC(a[3], a[5]); SQRADDDB; SQRADD(a[4], a[4]); COMBA_STORE(b[8]); /* output 9 */ CARRY_FORWARD; - SQRADD2(a[2], a[7]); SQRADD2(a[3], a[6]); SQRADD2(a[4], a[5]); + SQRADDSC(a[2], a[7]); SQRADDAC(a[3], a[6]); SQRADDAC(a[4], a[5]); SQRADDDB; COMBA_STORE(b[9]); /* output 10 */ @@ -446,11 +507,11 @@ void fp_sqr_comba8(fp_int *A, fp_int *B) fp_clamp(B); } -#if defined(TFM_LARGE) +#ifdef TFM_LARGE void fp_sqr_comba16(fp_int *A, fp_int *B) { - fp_digit *a, b[32], c0, c1, c2; + fp_digit *a, b[32], c0, c1, c2, sc0, sc1, sc2; a = A->dp; COMBA_START; @@ -484,107 +545,107 @@ void fp_sqr_comba16(fp_int *A, fp_int *B) /* output 5 */ CARRY_FORWARD; - SQRADD2(a[0], a[5]); SQRADD2(a[1], a[4]); SQRADD2(a[2], a[3]); + SQRADDSC(a[0], a[5]); SQRADDAC(a[1], a[4]); SQRADDAC(a[2], a[3]); SQRADDDB; COMBA_STORE(b[5]); /* output 6 */ CARRY_FORWARD; - SQRADD2(a[0], a[6]); SQRADD2(a[1], a[5]); SQRADD2(a[2], a[4]); SQRADD(a[3], a[3]); + SQRADDSC(a[0], a[6]); SQRADDAC(a[1], a[5]); SQRADDAC(a[2], a[4]); SQRADDDB; SQRADD(a[3], a[3]); COMBA_STORE(b[6]); /* output 7 */ CARRY_FORWARD; - SQRADD2(a[0], a[7]); SQRADD2(a[1], a[6]); SQRADD2(a[2], a[5]); SQRADD2(a[3], a[4]); + SQRADDSC(a[0], a[7]); SQRADDAC(a[1], a[6]); SQRADDAC(a[2], a[5]); SQRADDAC(a[3], a[4]); SQRADDDB; COMBA_STORE(b[7]); /* output 8 */ CARRY_FORWARD; - SQRADD2(a[0], a[8]); SQRADD2(a[1], a[7]); SQRADD2(a[2], a[6]); SQRADD2(a[3], a[5]); SQRADD(a[4], a[4]); + SQRADDSC(a[0], a[8]); SQRADDAC(a[1], a[7]); SQRADDAC(a[2], a[6]); SQRADDAC(a[3], a[5]); SQRADDDB; SQRADD(a[4], a[4]); COMBA_STORE(b[8]); /* output 9 */ CARRY_FORWARD; - SQRADD2(a[0], a[9]); SQRADD2(a[1], a[8]); SQRADD2(a[2], a[7]); SQRADD2(a[3], a[6]); SQRADD2(a[4], a[5]); + SQRADDSC(a[0], a[9]); SQRADDAC(a[1], a[8]); SQRADDAC(a[2], a[7]); SQRADDAC(a[3], a[6]); SQRADDAC(a[4], a[5]); SQRADDDB; COMBA_STORE(b[9]); /* output 10 */ CARRY_FORWARD; - SQRADD2(a[0], a[10]); SQRADD2(a[1], a[9]); SQRADD2(a[2], a[8]); SQRADD2(a[3], a[7]); SQRADD2(a[4], a[6]); SQRADD(a[5], a[5]); + SQRADDSC(a[0], a[10]); SQRADDAC(a[1], a[9]); SQRADDAC(a[2], a[8]); SQRADDAC(a[3], a[7]); SQRADDAC(a[4], a[6]); SQRADDDB; SQRADD(a[5], a[5]); COMBA_STORE(b[10]); /* output 11 */ CARRY_FORWARD; - SQRADD2(a[0], a[11]); SQRADD2(a[1], a[10]); SQRADD2(a[2], a[9]); SQRADD2(a[3], a[8]); SQRADD2(a[4], a[7]); SQRADD2(a[5], a[6]); + SQRADDSC(a[0], a[11]); SQRADDAC(a[1], a[10]); SQRADDAC(a[2], a[9]); SQRADDAC(a[3], a[8]); SQRADDAC(a[4], a[7]); SQRADDAC(a[5], a[6]); SQRADDDB; COMBA_STORE(b[11]); /* output 12 */ CARRY_FORWARD; - SQRADD2(a[0], a[12]); SQRADD2(a[1], a[11]); SQRADD2(a[2], a[10]); SQRADD2(a[3], a[9]); SQRADD2(a[4], a[8]); SQRADD2(a[5], a[7]); SQRADD(a[6], a[6]); + SQRADDSC(a[0], a[12]); SQRADDAC(a[1], a[11]); SQRADDAC(a[2], a[10]); SQRADDAC(a[3], a[9]); SQRADDAC(a[4], a[8]); SQRADDAC(a[5], a[7]); SQRADDDB; SQRADD(a[6], a[6]); COMBA_STORE(b[12]); /* output 13 */ CARRY_FORWARD; - SQRADD2(a[0], a[13]); SQRADD2(a[1], a[12]); SQRADD2(a[2], a[11]); SQRADD2(a[3], a[10]); SQRADD2(a[4], a[9]); SQRADD2(a[5], a[8]); SQRADD2(a[6], a[7]); + SQRADDSC(a[0], a[13]); SQRADDAC(a[1], a[12]); SQRADDAC(a[2], a[11]); SQRADDAC(a[3], a[10]); SQRADDAC(a[4], a[9]); SQRADDAC(a[5], a[8]); SQRADDAC(a[6], a[7]); SQRADDDB; COMBA_STORE(b[13]); /* output 14 */ CARRY_FORWARD; - SQRADD2(a[0], a[14]); SQRADD2(a[1], a[13]); SQRADD2(a[2], a[12]); SQRADD2(a[3], a[11]); SQRADD2(a[4], a[10]); SQRADD2(a[5], a[9]); SQRADD2(a[6], a[8]); SQRADD(a[7], a[7]); + SQRADDSC(a[0], a[14]); SQRADDAC(a[1], a[13]); SQRADDAC(a[2], a[12]); SQRADDAC(a[3], a[11]); SQRADDAC(a[4], a[10]); SQRADDAC(a[5], a[9]); SQRADDAC(a[6], a[8]); SQRADDDB; SQRADD(a[7], a[7]); COMBA_STORE(b[14]); /* output 15 */ CARRY_FORWARD; - SQRADD2(a[0], a[15]); SQRADD2(a[1], a[14]); SQRADD2(a[2], a[13]); SQRADD2(a[3], a[12]); SQRADD2(a[4], a[11]); SQRADD2(a[5], a[10]); SQRADD2(a[6], a[9]); SQRADD2(a[7], a[8]); + SQRADDSC(a[0], a[15]); SQRADDAC(a[1], a[14]); SQRADDAC(a[2], a[13]); SQRADDAC(a[3], a[12]); SQRADDAC(a[4], a[11]); SQRADDAC(a[5], a[10]); SQRADDAC(a[6], a[9]); SQRADDAC(a[7], a[8]); SQRADDDB; COMBA_STORE(b[15]); /* output 16 */ CARRY_FORWARD; - SQRADD2(a[1], a[15]); SQRADD2(a[2], a[14]); SQRADD2(a[3], a[13]); SQRADD2(a[4], a[12]); SQRADD2(a[5], a[11]); SQRADD2(a[6], a[10]); SQRADD2(a[7], a[9]); SQRADD(a[8], a[8]); + SQRADDSC(a[1], a[15]); SQRADDAC(a[2], a[14]); SQRADDAC(a[3], a[13]); SQRADDAC(a[4], a[12]); SQRADDAC(a[5], a[11]); SQRADDAC(a[6], a[10]); SQRADDAC(a[7], a[9]); SQRADDDB; SQRADD(a[8], a[8]); COMBA_STORE(b[16]); /* output 17 */ CARRY_FORWARD; - SQRADD2(a[2], a[15]); SQRADD2(a[3], a[14]); SQRADD2(a[4], a[13]); SQRADD2(a[5], a[12]); SQRADD2(a[6], a[11]); SQRADD2(a[7], a[10]); SQRADD2(a[8], a[9]); + SQRADDSC(a[2], a[15]); SQRADDAC(a[3], a[14]); SQRADDAC(a[4], a[13]); SQRADDAC(a[5], a[12]); SQRADDAC(a[6], a[11]); SQRADDAC(a[7], a[10]); SQRADDAC(a[8], a[9]); SQRADDDB; COMBA_STORE(b[17]); /* output 18 */ CARRY_FORWARD; - SQRADD2(a[3], a[15]); SQRADD2(a[4], a[14]); SQRADD2(a[5], a[13]); SQRADD2(a[6], a[12]); SQRADD2(a[7], a[11]); SQRADD2(a[8], a[10]); SQRADD(a[9], a[9]); + SQRADDSC(a[3], a[15]); SQRADDAC(a[4], a[14]); SQRADDAC(a[5], a[13]); SQRADDAC(a[6], a[12]); SQRADDAC(a[7], a[11]); SQRADDAC(a[8], a[10]); SQRADDDB; SQRADD(a[9], a[9]); COMBA_STORE(b[18]); /* output 19 */ CARRY_FORWARD; - SQRADD2(a[4], a[15]); SQRADD2(a[5], a[14]); SQRADD2(a[6], a[13]); SQRADD2(a[7], a[12]); SQRADD2(a[8], a[11]); SQRADD2(a[9], a[10]); + SQRADDSC(a[4], a[15]); SQRADDAC(a[5], a[14]); SQRADDAC(a[6], a[13]); SQRADDAC(a[7], a[12]); SQRADDAC(a[8], a[11]); SQRADDAC(a[9], a[10]); SQRADDDB; COMBA_STORE(b[19]); /* output 20 */ CARRY_FORWARD; - SQRADD2(a[5], a[15]); SQRADD2(a[6], a[14]); SQRADD2(a[7], a[13]); SQRADD2(a[8], a[12]); SQRADD2(a[9], a[11]); SQRADD(a[10], a[10]); + SQRADDSC(a[5], a[15]); SQRADDAC(a[6], a[14]); SQRADDAC(a[7], a[13]); SQRADDAC(a[8], a[12]); SQRADDAC(a[9], a[11]); SQRADDDB; SQRADD(a[10], a[10]); COMBA_STORE(b[20]); /* output 21 */ CARRY_FORWARD; - SQRADD2(a[6], a[15]); SQRADD2(a[7], a[14]); SQRADD2(a[8], a[13]); SQRADD2(a[9], a[12]); SQRADD2(a[10], a[11]); + SQRADDSC(a[6], a[15]); SQRADDAC(a[7], a[14]); SQRADDAC(a[8], a[13]); SQRADDAC(a[9], a[12]); SQRADDAC(a[10], a[11]); SQRADDDB; COMBA_STORE(b[21]); /* output 22 */ CARRY_FORWARD; - SQRADD2(a[7], a[15]); SQRADD2(a[8], a[14]); SQRADD2(a[9], a[13]); SQRADD2(a[10], a[12]); SQRADD(a[11], a[11]); + SQRADDSC(a[7], a[15]); SQRADDAC(a[8], a[14]); SQRADDAC(a[9], a[13]); SQRADDAC(a[10], a[12]); SQRADDDB; SQRADD(a[11], a[11]); COMBA_STORE(b[22]); /* output 23 */ CARRY_FORWARD; - SQRADD2(a[8], a[15]); SQRADD2(a[9], a[14]); SQRADD2(a[10], a[13]); SQRADD2(a[11], a[12]); + SQRADDSC(a[8], a[15]); SQRADDAC(a[9], a[14]); SQRADDAC(a[10], a[13]); SQRADDAC(a[11], a[12]); SQRADDDB; COMBA_STORE(b[23]); /* output 24 */ CARRY_FORWARD; - SQRADD2(a[9], a[15]); SQRADD2(a[10], a[14]); SQRADD2(a[11], a[13]); SQRADD(a[12], a[12]); + SQRADDSC(a[9], a[15]); SQRADDAC(a[10], a[14]); SQRADDAC(a[11], a[13]); SQRADDDB; SQRADD(a[12], a[12]); COMBA_STORE(b[24]); /* output 25 */ CARRY_FORWARD; - SQRADD2(a[10], a[15]); SQRADD2(a[11], a[14]); SQRADD2(a[12], a[13]); + SQRADDSC(a[10], a[15]); SQRADDAC(a[11], a[14]); SQRADDAC(a[12], a[13]); SQRADDDB; COMBA_STORE(b[25]); /* output 26 */ @@ -620,13 +681,12 @@ void fp_sqr_comba16(fp_int *A, fp_int *B) fp_clamp(B); } -#endif /* TFM_LARGE */ +#endif #ifdef TFM_HUGE - void fp_sqr_comba32(fp_int *A, fp_int *B) { - fp_digit *a, b[64], c0, c1, c2; + fp_digit *a, b[64], c0, c1, c2, sc0, sc1, sc2; a = A->dp; COMBA_START; @@ -660,267 +720,267 @@ void fp_sqr_comba32(fp_int *A, fp_int *B) /* output 5 */ CARRY_FORWARD; - SQRADD2(a[0], a[5]); SQRADD2(a[1], a[4]); SQRADD2(a[2], a[3]); + SQRADDSC(a[0], a[5]); SQRADDAC(a[1], a[4]); SQRADDAC(a[2], a[3]); SQRADDDB; COMBA_STORE(b[5]); /* output 6 */ CARRY_FORWARD; - SQRADD2(a[0], a[6]); SQRADD2(a[1], a[5]); SQRADD2(a[2], a[4]); SQRADD(a[3], a[3]); + SQRADDSC(a[0], a[6]); SQRADDAC(a[1], a[5]); SQRADDAC(a[2], a[4]); SQRADDDB; SQRADD(a[3], a[3]); COMBA_STORE(b[6]); /* output 7 */ CARRY_FORWARD; - SQRADD2(a[0], a[7]); SQRADD2(a[1], a[6]); SQRADD2(a[2], a[5]); SQRADD2(a[3], a[4]); + SQRADDSC(a[0], a[7]); SQRADDAC(a[1], a[6]); SQRADDAC(a[2], a[5]); SQRADDAC(a[3], a[4]); SQRADDDB; COMBA_STORE(b[7]); /* output 8 */ CARRY_FORWARD; - SQRADD2(a[0], a[8]); SQRADD2(a[1], a[7]); SQRADD2(a[2], a[6]); SQRADD2(a[3], a[5]); SQRADD(a[4], a[4]); + SQRADDSC(a[0], a[8]); SQRADDAC(a[1], a[7]); SQRADDAC(a[2], a[6]); SQRADDAC(a[3], a[5]); SQRADDDB; SQRADD(a[4], a[4]); COMBA_STORE(b[8]); /* output 9 */ CARRY_FORWARD; - SQRADD2(a[0], a[9]); SQRADD2(a[1], a[8]); SQRADD2(a[2], a[7]); SQRADD2(a[3], a[6]); SQRADD2(a[4], a[5]); + SQRADDSC(a[0], a[9]); SQRADDAC(a[1], a[8]); SQRADDAC(a[2], a[7]); SQRADDAC(a[3], a[6]); SQRADDAC(a[4], a[5]); SQRADDDB; COMBA_STORE(b[9]); /* output 10 */ CARRY_FORWARD; - SQRADD2(a[0], a[10]); SQRADD2(a[1], a[9]); SQRADD2(a[2], a[8]); SQRADD2(a[3], a[7]); SQRADD2(a[4], a[6]); SQRADD(a[5], a[5]); + SQRADDSC(a[0], a[10]); SQRADDAC(a[1], a[9]); SQRADDAC(a[2], a[8]); SQRADDAC(a[3], a[7]); SQRADDAC(a[4], a[6]); SQRADDDB; SQRADD(a[5], a[5]); COMBA_STORE(b[10]); /* output 11 */ CARRY_FORWARD; - SQRADD2(a[0], a[11]); SQRADD2(a[1], a[10]); SQRADD2(a[2], a[9]); SQRADD2(a[3], a[8]); SQRADD2(a[4], a[7]); SQRADD2(a[5], a[6]); + SQRADDSC(a[0], a[11]); SQRADDAC(a[1], a[10]); SQRADDAC(a[2], a[9]); SQRADDAC(a[3], a[8]); SQRADDAC(a[4], a[7]); SQRADDAC(a[5], a[6]); SQRADDDB; COMBA_STORE(b[11]); /* output 12 */ CARRY_FORWARD; - SQRADD2(a[0], a[12]); SQRADD2(a[1], a[11]); SQRADD2(a[2], a[10]); SQRADD2(a[3], a[9]); SQRADD2(a[4], a[8]); SQRADD2(a[5], a[7]); SQRADD(a[6], a[6]); + SQRADDSC(a[0], a[12]); SQRADDAC(a[1], a[11]); SQRADDAC(a[2], a[10]); SQRADDAC(a[3], a[9]); SQRADDAC(a[4], a[8]); SQRADDAC(a[5], a[7]); SQRADDDB; SQRADD(a[6], a[6]); COMBA_STORE(b[12]); /* output 13 */ CARRY_FORWARD; - SQRADD2(a[0], a[13]); SQRADD2(a[1], a[12]); SQRADD2(a[2], a[11]); SQRADD2(a[3], a[10]); SQRADD2(a[4], a[9]); SQRADD2(a[5], a[8]); SQRADD2(a[6], a[7]); + SQRADDSC(a[0], a[13]); SQRADDAC(a[1], a[12]); SQRADDAC(a[2], a[11]); SQRADDAC(a[3], a[10]); SQRADDAC(a[4], a[9]); SQRADDAC(a[5], a[8]); SQRADDAC(a[6], a[7]); SQRADDDB; COMBA_STORE(b[13]); /* output 14 */ CARRY_FORWARD; - SQRADD2(a[0], a[14]); SQRADD2(a[1], a[13]); SQRADD2(a[2], a[12]); SQRADD2(a[3], a[11]); SQRADD2(a[4], a[10]); SQRADD2(a[5], a[9]); SQRADD2(a[6], a[8]); SQRADD(a[7], a[7]); + SQRADDSC(a[0], a[14]); SQRADDAC(a[1], a[13]); SQRADDAC(a[2], a[12]); SQRADDAC(a[3], a[11]); SQRADDAC(a[4], a[10]); SQRADDAC(a[5], a[9]); SQRADDAC(a[6], a[8]); SQRADDDB; SQRADD(a[7], a[7]); COMBA_STORE(b[14]); /* output 15 */ CARRY_FORWARD; - SQRADD2(a[0], a[15]); SQRADD2(a[1], a[14]); SQRADD2(a[2], a[13]); SQRADD2(a[3], a[12]); SQRADD2(a[4], a[11]); SQRADD2(a[5], a[10]); SQRADD2(a[6], a[9]); SQRADD2(a[7], a[8]); + SQRADDSC(a[0], a[15]); SQRADDAC(a[1], a[14]); SQRADDAC(a[2], a[13]); SQRADDAC(a[3], a[12]); SQRADDAC(a[4], a[11]); SQRADDAC(a[5], a[10]); SQRADDAC(a[6], a[9]); SQRADDAC(a[7], a[8]); SQRADDDB; COMBA_STORE(b[15]); /* output 16 */ CARRY_FORWARD; - SQRADD2(a[0], a[16]); SQRADD2(a[1], a[15]); SQRADD2(a[2], a[14]); SQRADD2(a[3], a[13]); SQRADD2(a[4], a[12]); SQRADD2(a[5], a[11]); SQRADD2(a[6], a[10]); SQRADD2(a[7], a[9]); SQRADD(a[8], a[8]); + SQRADDSC(a[0], a[16]); SQRADDAC(a[1], a[15]); SQRADDAC(a[2], a[14]); SQRADDAC(a[3], a[13]); SQRADDAC(a[4], a[12]); SQRADDAC(a[5], a[11]); SQRADDAC(a[6], a[10]); SQRADDAC(a[7], a[9]); SQRADDDB; SQRADD(a[8], a[8]); COMBA_STORE(b[16]); /* output 17 */ CARRY_FORWARD; - SQRADD2(a[0], a[17]); SQRADD2(a[1], a[16]); SQRADD2(a[2], a[15]); SQRADD2(a[3], a[14]); SQRADD2(a[4], a[13]); SQRADD2(a[5], a[12]); SQRADD2(a[6], a[11]); SQRADD2(a[7], a[10]); SQRADD2(a[8], a[9]); + SQRADDSC(a[0], a[17]); SQRADDAC(a[1], a[16]); SQRADDAC(a[2], a[15]); SQRADDAC(a[3], a[14]); SQRADDAC(a[4], a[13]); SQRADDAC(a[5], a[12]); SQRADDAC(a[6], a[11]); SQRADDAC(a[7], a[10]); SQRADDAC(a[8], a[9]); SQRADDDB; COMBA_STORE(b[17]); /* output 18 */ CARRY_FORWARD; - SQRADD2(a[0], a[18]); SQRADD2(a[1], a[17]); SQRADD2(a[2], a[16]); SQRADD2(a[3], a[15]); SQRADD2(a[4], a[14]); SQRADD2(a[5], a[13]); SQRADD2(a[6], a[12]); SQRADD2(a[7], a[11]); SQRADD2(a[8], a[10]); SQRADD(a[9], a[9]); + SQRADDSC(a[0], a[18]); SQRADDAC(a[1], a[17]); SQRADDAC(a[2], a[16]); SQRADDAC(a[3], a[15]); SQRADDAC(a[4], a[14]); SQRADDAC(a[5], a[13]); SQRADDAC(a[6], a[12]); SQRADDAC(a[7], a[11]); SQRADDAC(a[8], a[10]); SQRADDDB; SQRADD(a[9], a[9]); COMBA_STORE(b[18]); /* output 19 */ CARRY_FORWARD; - SQRADD2(a[0], a[19]); SQRADD2(a[1], a[18]); SQRADD2(a[2], a[17]); SQRADD2(a[3], a[16]); SQRADD2(a[4], a[15]); SQRADD2(a[5], a[14]); SQRADD2(a[6], a[13]); SQRADD2(a[7], a[12]); SQRADD2(a[8], a[11]); SQRADD2(a[9], a[10]); + SQRADDSC(a[0], a[19]); SQRADDAC(a[1], a[18]); SQRADDAC(a[2], a[17]); SQRADDAC(a[3], a[16]); SQRADDAC(a[4], a[15]); SQRADDAC(a[5], a[14]); SQRADDAC(a[6], a[13]); SQRADDAC(a[7], a[12]); SQRADDAC(a[8], a[11]); SQRADDAC(a[9], a[10]); SQRADDDB; COMBA_STORE(b[19]); /* output 20 */ CARRY_FORWARD; - SQRADD2(a[0], a[20]); SQRADD2(a[1], a[19]); SQRADD2(a[2], a[18]); SQRADD2(a[3], a[17]); SQRADD2(a[4], a[16]); SQRADD2(a[5], a[15]); SQRADD2(a[6], a[14]); SQRADD2(a[7], a[13]); SQRADD2(a[8], a[12]); SQRADD2(a[9], a[11]); SQRADD(a[10], a[10]); + SQRADDSC(a[0], a[20]); SQRADDAC(a[1], a[19]); SQRADDAC(a[2], a[18]); SQRADDAC(a[3], a[17]); SQRADDAC(a[4], a[16]); SQRADDAC(a[5], a[15]); SQRADDAC(a[6], a[14]); SQRADDAC(a[7], a[13]); SQRADDAC(a[8], a[12]); SQRADDAC(a[9], a[11]); SQRADDDB; SQRADD(a[10], a[10]); COMBA_STORE(b[20]); /* output 21 */ CARRY_FORWARD; - SQRADD2(a[0], a[21]); SQRADD2(a[1], a[20]); SQRADD2(a[2], a[19]); SQRADD2(a[3], a[18]); SQRADD2(a[4], a[17]); SQRADD2(a[5], a[16]); SQRADD2(a[6], a[15]); SQRADD2(a[7], a[14]); SQRADD2(a[8], a[13]); SQRADD2(a[9], a[12]); SQRADD2(a[10], a[11]); + SQRADDSC(a[0], a[21]); SQRADDAC(a[1], a[20]); SQRADDAC(a[2], a[19]); SQRADDAC(a[3], a[18]); SQRADDAC(a[4], a[17]); SQRADDAC(a[5], a[16]); SQRADDAC(a[6], a[15]); SQRADDAC(a[7], a[14]); SQRADDAC(a[8], a[13]); SQRADDAC(a[9], a[12]); SQRADDAC(a[10], a[11]); SQRADDDB; COMBA_STORE(b[21]); /* output 22 */ CARRY_FORWARD; - SQRADD2(a[0], a[22]); SQRADD2(a[1], a[21]); SQRADD2(a[2], a[20]); SQRADD2(a[3], a[19]); SQRADD2(a[4], a[18]); SQRADD2(a[5], a[17]); SQRADD2(a[6], a[16]); SQRADD2(a[7], a[15]); SQRADD2(a[8], a[14]); SQRADD2(a[9], a[13]); SQRADD2(a[10], a[12]); SQRADD(a[11], a[11]); + SQRADDSC(a[0], a[22]); SQRADDAC(a[1], a[21]); SQRADDAC(a[2], a[20]); SQRADDAC(a[3], a[19]); SQRADDAC(a[4], a[18]); SQRADDAC(a[5], a[17]); SQRADDAC(a[6], a[16]); SQRADDAC(a[7], a[15]); SQRADDAC(a[8], a[14]); SQRADDAC(a[9], a[13]); SQRADDAC(a[10], a[12]); SQRADDDB; SQRADD(a[11], a[11]); COMBA_STORE(b[22]); /* output 23 */ CARRY_FORWARD; - SQRADD2(a[0], a[23]); SQRADD2(a[1], a[22]); SQRADD2(a[2], a[21]); SQRADD2(a[3], a[20]); SQRADD2(a[4], a[19]); SQRADD2(a[5], a[18]); SQRADD2(a[6], a[17]); SQRADD2(a[7], a[16]); SQRADD2(a[8], a[15]); SQRADD2(a[9], a[14]); SQRADD2(a[10], a[13]); SQRADD2(a[11], a[12]); + SQRADDSC(a[0], a[23]); SQRADDAC(a[1], a[22]); SQRADDAC(a[2], a[21]); SQRADDAC(a[3], a[20]); SQRADDAC(a[4], a[19]); SQRADDAC(a[5], a[18]); SQRADDAC(a[6], a[17]); SQRADDAC(a[7], a[16]); SQRADDAC(a[8], a[15]); SQRADDAC(a[9], a[14]); SQRADDAC(a[10], a[13]); SQRADDAC(a[11], a[12]); SQRADDDB; COMBA_STORE(b[23]); /* output 24 */ CARRY_FORWARD; - SQRADD2(a[0], a[24]); SQRADD2(a[1], a[23]); SQRADD2(a[2], a[22]); SQRADD2(a[3], a[21]); SQRADD2(a[4], a[20]); SQRADD2(a[5], a[19]); SQRADD2(a[6], a[18]); SQRADD2(a[7], a[17]); SQRADD2(a[8], a[16]); SQRADD2(a[9], a[15]); SQRADD2(a[10], a[14]); SQRADD2(a[11], a[13]); SQRADD(a[12], a[12]); + SQRADDSC(a[0], a[24]); SQRADDAC(a[1], a[23]); SQRADDAC(a[2], a[22]); SQRADDAC(a[3], a[21]); SQRADDAC(a[4], a[20]); SQRADDAC(a[5], a[19]); SQRADDAC(a[6], a[18]); SQRADDAC(a[7], a[17]); SQRADDAC(a[8], a[16]); SQRADDAC(a[9], a[15]); SQRADDAC(a[10], a[14]); SQRADDAC(a[11], a[13]); SQRADDDB; SQRADD(a[12], a[12]); COMBA_STORE(b[24]); /* output 25 */ CARRY_FORWARD; - SQRADD2(a[0], a[25]); SQRADD2(a[1], a[24]); SQRADD2(a[2], a[23]); SQRADD2(a[3], a[22]); SQRADD2(a[4], a[21]); SQRADD2(a[5], a[20]); SQRADD2(a[6], a[19]); SQRADD2(a[7], a[18]); SQRADD2(a[8], a[17]); SQRADD2(a[9], a[16]); SQRADD2(a[10], a[15]); SQRADD2(a[11], a[14]); SQRADD2(a[12], a[13]); + SQRADDSC(a[0], a[25]); SQRADDAC(a[1], a[24]); SQRADDAC(a[2], a[23]); SQRADDAC(a[3], a[22]); SQRADDAC(a[4], a[21]); SQRADDAC(a[5], a[20]); SQRADDAC(a[6], a[19]); SQRADDAC(a[7], a[18]); SQRADDAC(a[8], a[17]); SQRADDAC(a[9], a[16]); SQRADDAC(a[10], a[15]); SQRADDAC(a[11], a[14]); SQRADDAC(a[12], a[13]); SQRADDDB; COMBA_STORE(b[25]); /* output 26 */ CARRY_FORWARD; - SQRADD2(a[0], a[26]); SQRADD2(a[1], a[25]); SQRADD2(a[2], a[24]); SQRADD2(a[3], a[23]); SQRADD2(a[4], a[22]); SQRADD2(a[5], a[21]); SQRADD2(a[6], a[20]); SQRADD2(a[7], a[19]); SQRADD2(a[8], a[18]); SQRADD2(a[9], a[17]); SQRADD2(a[10], a[16]); SQRADD2(a[11], a[15]); SQRADD2(a[12], a[14]); SQRADD(a[13], a[13]); + SQRADDSC(a[0], a[26]); SQRADDAC(a[1], a[25]); SQRADDAC(a[2], a[24]); SQRADDAC(a[3], a[23]); SQRADDAC(a[4], a[22]); SQRADDAC(a[5], a[21]); SQRADDAC(a[6], a[20]); SQRADDAC(a[7], a[19]); SQRADDAC(a[8], a[18]); SQRADDAC(a[9], a[17]); SQRADDAC(a[10], a[16]); SQRADDAC(a[11], a[15]); SQRADDAC(a[12], a[14]); SQRADDDB; SQRADD(a[13], a[13]); COMBA_STORE(b[26]); /* output 27 */ CARRY_FORWARD; - SQRADD2(a[0], a[27]); SQRADD2(a[1], a[26]); SQRADD2(a[2], a[25]); SQRADD2(a[3], a[24]); SQRADD2(a[4], a[23]); SQRADD2(a[5], a[22]); SQRADD2(a[6], a[21]); SQRADD2(a[7], a[20]); SQRADD2(a[8], a[19]); SQRADD2(a[9], a[18]); SQRADD2(a[10], a[17]); SQRADD2(a[11], a[16]); SQRADD2(a[12], a[15]); SQRADD2(a[13], a[14]); + SQRADDSC(a[0], a[27]); SQRADDAC(a[1], a[26]); SQRADDAC(a[2], a[25]); SQRADDAC(a[3], a[24]); SQRADDAC(a[4], a[23]); SQRADDAC(a[5], a[22]); SQRADDAC(a[6], a[21]); SQRADDAC(a[7], a[20]); SQRADDAC(a[8], a[19]); SQRADDAC(a[9], a[18]); SQRADDAC(a[10], a[17]); SQRADDAC(a[11], a[16]); SQRADDAC(a[12], a[15]); SQRADDAC(a[13], a[14]); SQRADDDB; COMBA_STORE(b[27]); /* output 28 */ CARRY_FORWARD; - SQRADD2(a[0], a[28]); SQRADD2(a[1], a[27]); SQRADD2(a[2], a[26]); SQRADD2(a[3], a[25]); SQRADD2(a[4], a[24]); SQRADD2(a[5], a[23]); SQRADD2(a[6], a[22]); SQRADD2(a[7], a[21]); SQRADD2(a[8], a[20]); SQRADD2(a[9], a[19]); SQRADD2(a[10], a[18]); SQRADD2(a[11], a[17]); SQRADD2(a[12], a[16]); SQRADD2(a[13], a[15]); SQRADD(a[14], a[14]); + SQRADDSC(a[0], a[28]); SQRADDAC(a[1], a[27]); SQRADDAC(a[2], a[26]); SQRADDAC(a[3], a[25]); SQRADDAC(a[4], a[24]); SQRADDAC(a[5], a[23]); SQRADDAC(a[6], a[22]); SQRADDAC(a[7], a[21]); SQRADDAC(a[8], a[20]); SQRADDAC(a[9], a[19]); SQRADDAC(a[10], a[18]); SQRADDAC(a[11], a[17]); SQRADDAC(a[12], a[16]); SQRADDAC(a[13], a[15]); SQRADDDB; SQRADD(a[14], a[14]); COMBA_STORE(b[28]); /* output 29 */ CARRY_FORWARD; - SQRADD2(a[0], a[29]); SQRADD2(a[1], a[28]); SQRADD2(a[2], a[27]); SQRADD2(a[3], a[26]); SQRADD2(a[4], a[25]); SQRADD2(a[5], a[24]); SQRADD2(a[6], a[23]); SQRADD2(a[7], a[22]); SQRADD2(a[8], a[21]); SQRADD2(a[9], a[20]); SQRADD2(a[10], a[19]); SQRADD2(a[11], a[18]); SQRADD2(a[12], a[17]); SQRADD2(a[13], a[16]); SQRADD2(a[14], a[15]); + SQRADDSC(a[0], a[29]); SQRADDAC(a[1], a[28]); SQRADDAC(a[2], a[27]); SQRADDAC(a[3], a[26]); SQRADDAC(a[4], a[25]); SQRADDAC(a[5], a[24]); SQRADDAC(a[6], a[23]); SQRADDAC(a[7], a[22]); SQRADDAC(a[8], a[21]); SQRADDAC(a[9], a[20]); SQRADDAC(a[10], a[19]); SQRADDAC(a[11], a[18]); SQRADDAC(a[12], a[17]); SQRADDAC(a[13], a[16]); SQRADDAC(a[14], a[15]); SQRADDDB; COMBA_STORE(b[29]); /* output 30 */ CARRY_FORWARD; - SQRADD2(a[0], a[30]); SQRADD2(a[1], a[29]); SQRADD2(a[2], a[28]); SQRADD2(a[3], a[27]); SQRADD2(a[4], a[26]); SQRADD2(a[5], a[25]); SQRADD2(a[6], a[24]); SQRADD2(a[7], a[23]); SQRADD2(a[8], a[22]); SQRADD2(a[9], a[21]); SQRADD2(a[10], a[20]); SQRADD2(a[11], a[19]); SQRADD2(a[12], a[18]); SQRADD2(a[13], a[17]); SQRADD2(a[14], a[16]); SQRADD(a[15], a[15]); + SQRADDSC(a[0], a[30]); SQRADDAC(a[1], a[29]); SQRADDAC(a[2], a[28]); SQRADDAC(a[3], a[27]); SQRADDAC(a[4], a[26]); SQRADDAC(a[5], a[25]); SQRADDAC(a[6], a[24]); SQRADDAC(a[7], a[23]); SQRADDAC(a[8], a[22]); SQRADDAC(a[9], a[21]); SQRADDAC(a[10], a[20]); SQRADDAC(a[11], a[19]); SQRADDAC(a[12], a[18]); SQRADDAC(a[13], a[17]); SQRADDAC(a[14], a[16]); SQRADDDB; SQRADD(a[15], a[15]); COMBA_STORE(b[30]); /* output 31 */ CARRY_FORWARD; - SQRADD2(a[0], a[31]); SQRADD2(a[1], a[30]); SQRADD2(a[2], a[29]); SQRADD2(a[3], a[28]); SQRADD2(a[4], a[27]); SQRADD2(a[5], a[26]); SQRADD2(a[6], a[25]); SQRADD2(a[7], a[24]); SQRADD2(a[8], a[23]); SQRADD2(a[9], a[22]); SQRADD2(a[10], a[21]); SQRADD2(a[11], a[20]); SQRADD2(a[12], a[19]); SQRADD2(a[13], a[18]); SQRADD2(a[14], a[17]); SQRADD2(a[15], a[16]); + SQRADDSC(a[0], a[31]); SQRADDAC(a[1], a[30]); SQRADDAC(a[2], a[29]); SQRADDAC(a[3], a[28]); SQRADDAC(a[4], a[27]); SQRADDAC(a[5], a[26]); SQRADDAC(a[6], a[25]); SQRADDAC(a[7], a[24]); SQRADDAC(a[8], a[23]); SQRADDAC(a[9], a[22]); SQRADDAC(a[10], a[21]); SQRADDAC(a[11], a[20]); SQRADDAC(a[12], a[19]); SQRADDAC(a[13], a[18]); SQRADDAC(a[14], a[17]); SQRADDAC(a[15], a[16]); SQRADDDB; COMBA_STORE(b[31]); /* output 32 */ CARRY_FORWARD; - SQRADD2(a[1], a[31]); SQRADD2(a[2], a[30]); SQRADD2(a[3], a[29]); SQRADD2(a[4], a[28]); SQRADD2(a[5], a[27]); SQRADD2(a[6], a[26]); SQRADD2(a[7], a[25]); SQRADD2(a[8], a[24]); SQRADD2(a[9], a[23]); SQRADD2(a[10], a[22]); SQRADD2(a[11], a[21]); SQRADD2(a[12], a[20]); SQRADD2(a[13], a[19]); SQRADD2(a[14], a[18]); SQRADD2(a[15], a[17]); SQRADD(a[16], a[16]); + SQRADDSC(a[1], a[31]); SQRADDAC(a[2], a[30]); SQRADDAC(a[3], a[29]); SQRADDAC(a[4], a[28]); SQRADDAC(a[5], a[27]); SQRADDAC(a[6], a[26]); SQRADDAC(a[7], a[25]); SQRADDAC(a[8], a[24]); SQRADDAC(a[9], a[23]); SQRADDAC(a[10], a[22]); SQRADDAC(a[11], a[21]); SQRADDAC(a[12], a[20]); SQRADDAC(a[13], a[19]); SQRADDAC(a[14], a[18]); SQRADDAC(a[15], a[17]); SQRADDDB; SQRADD(a[16], a[16]); COMBA_STORE(b[32]); /* output 33 */ CARRY_FORWARD; - SQRADD2(a[2], a[31]); SQRADD2(a[3], a[30]); SQRADD2(a[4], a[29]); SQRADD2(a[5], a[28]); SQRADD2(a[6], a[27]); SQRADD2(a[7], a[26]); SQRADD2(a[8], a[25]); SQRADD2(a[9], a[24]); SQRADD2(a[10], a[23]); SQRADD2(a[11], a[22]); SQRADD2(a[12], a[21]); SQRADD2(a[13], a[20]); SQRADD2(a[14], a[19]); SQRADD2(a[15], a[18]); SQRADD2(a[16], a[17]); + SQRADDSC(a[2], a[31]); SQRADDAC(a[3], a[30]); SQRADDAC(a[4], a[29]); SQRADDAC(a[5], a[28]); SQRADDAC(a[6], a[27]); SQRADDAC(a[7], a[26]); SQRADDAC(a[8], a[25]); SQRADDAC(a[9], a[24]); SQRADDAC(a[10], a[23]); SQRADDAC(a[11], a[22]); SQRADDAC(a[12], a[21]); SQRADDAC(a[13], a[20]); SQRADDAC(a[14], a[19]); SQRADDAC(a[15], a[18]); SQRADDAC(a[16], a[17]); SQRADDDB; COMBA_STORE(b[33]); /* output 34 */ CARRY_FORWARD; - SQRADD2(a[3], a[31]); SQRADD2(a[4], a[30]); SQRADD2(a[5], a[29]); SQRADD2(a[6], a[28]); SQRADD2(a[7], a[27]); SQRADD2(a[8], a[26]); SQRADD2(a[9], a[25]); SQRADD2(a[10], a[24]); SQRADD2(a[11], a[23]); SQRADD2(a[12], a[22]); SQRADD2(a[13], a[21]); SQRADD2(a[14], a[20]); SQRADD2(a[15], a[19]); SQRADD2(a[16], a[18]); SQRADD(a[17], a[17]); + SQRADDSC(a[3], a[31]); SQRADDAC(a[4], a[30]); SQRADDAC(a[5], a[29]); SQRADDAC(a[6], a[28]); SQRADDAC(a[7], a[27]); SQRADDAC(a[8], a[26]); SQRADDAC(a[9], a[25]); SQRADDAC(a[10], a[24]); SQRADDAC(a[11], a[23]); SQRADDAC(a[12], a[22]); SQRADDAC(a[13], a[21]); SQRADDAC(a[14], a[20]); SQRADDAC(a[15], a[19]); SQRADDAC(a[16], a[18]); SQRADDDB; SQRADD(a[17], a[17]); COMBA_STORE(b[34]); /* output 35 */ CARRY_FORWARD; - SQRADD2(a[4], a[31]); SQRADD2(a[5], a[30]); SQRADD2(a[6], a[29]); SQRADD2(a[7], a[28]); SQRADD2(a[8], a[27]); SQRADD2(a[9], a[26]); SQRADD2(a[10], a[25]); SQRADD2(a[11], a[24]); SQRADD2(a[12], a[23]); SQRADD2(a[13], a[22]); SQRADD2(a[14], a[21]); SQRADD2(a[15], a[20]); SQRADD2(a[16], a[19]); SQRADD2(a[17], a[18]); + SQRADDSC(a[4], a[31]); SQRADDAC(a[5], a[30]); SQRADDAC(a[6], a[29]); SQRADDAC(a[7], a[28]); SQRADDAC(a[8], a[27]); SQRADDAC(a[9], a[26]); SQRADDAC(a[10], a[25]); SQRADDAC(a[11], a[24]); SQRADDAC(a[12], a[23]); SQRADDAC(a[13], a[22]); SQRADDAC(a[14], a[21]); SQRADDAC(a[15], a[20]); SQRADDAC(a[16], a[19]); SQRADDAC(a[17], a[18]); SQRADDDB; COMBA_STORE(b[35]); /* output 36 */ CARRY_FORWARD; - SQRADD2(a[5], a[31]); SQRADD2(a[6], a[30]); SQRADD2(a[7], a[29]); SQRADD2(a[8], a[28]); SQRADD2(a[9], a[27]); SQRADD2(a[10], a[26]); SQRADD2(a[11], a[25]); SQRADD2(a[12], a[24]); SQRADD2(a[13], a[23]); SQRADD2(a[14], a[22]); SQRADD2(a[15], a[21]); SQRADD2(a[16], a[20]); SQRADD2(a[17], a[19]); SQRADD(a[18], a[18]); + SQRADDSC(a[5], a[31]); SQRADDAC(a[6], a[30]); SQRADDAC(a[7], a[29]); SQRADDAC(a[8], a[28]); SQRADDAC(a[9], a[27]); SQRADDAC(a[10], a[26]); SQRADDAC(a[11], a[25]); SQRADDAC(a[12], a[24]); SQRADDAC(a[13], a[23]); SQRADDAC(a[14], a[22]); SQRADDAC(a[15], a[21]); SQRADDAC(a[16], a[20]); SQRADDAC(a[17], a[19]); SQRADDDB; SQRADD(a[18], a[18]); COMBA_STORE(b[36]); /* output 37 */ CARRY_FORWARD; - SQRADD2(a[6], a[31]); SQRADD2(a[7], a[30]); SQRADD2(a[8], a[29]); SQRADD2(a[9], a[28]); SQRADD2(a[10], a[27]); SQRADD2(a[11], a[26]); SQRADD2(a[12], a[25]); SQRADD2(a[13], a[24]); SQRADD2(a[14], a[23]); SQRADD2(a[15], a[22]); SQRADD2(a[16], a[21]); SQRADD2(a[17], a[20]); SQRADD2(a[18], a[19]); + SQRADDSC(a[6], a[31]); SQRADDAC(a[7], a[30]); SQRADDAC(a[8], a[29]); SQRADDAC(a[9], a[28]); SQRADDAC(a[10], a[27]); SQRADDAC(a[11], a[26]); SQRADDAC(a[12], a[25]); SQRADDAC(a[13], a[24]); SQRADDAC(a[14], a[23]); SQRADDAC(a[15], a[22]); SQRADDAC(a[16], a[21]); SQRADDAC(a[17], a[20]); SQRADDAC(a[18], a[19]); SQRADDDB; COMBA_STORE(b[37]); /* output 38 */ CARRY_FORWARD; - SQRADD2(a[7], a[31]); SQRADD2(a[8], a[30]); SQRADD2(a[9], a[29]); SQRADD2(a[10], a[28]); SQRADD2(a[11], a[27]); SQRADD2(a[12], a[26]); SQRADD2(a[13], a[25]); SQRADD2(a[14], a[24]); SQRADD2(a[15], a[23]); SQRADD2(a[16], a[22]); SQRADD2(a[17], a[21]); SQRADD2(a[18], a[20]); SQRADD(a[19], a[19]); + SQRADDSC(a[7], a[31]); SQRADDAC(a[8], a[30]); SQRADDAC(a[9], a[29]); SQRADDAC(a[10], a[28]); SQRADDAC(a[11], a[27]); SQRADDAC(a[12], a[26]); SQRADDAC(a[13], a[25]); SQRADDAC(a[14], a[24]); SQRADDAC(a[15], a[23]); SQRADDAC(a[16], a[22]); SQRADDAC(a[17], a[21]); SQRADDAC(a[18], a[20]); SQRADDDB; SQRADD(a[19], a[19]); COMBA_STORE(b[38]); /* output 39 */ CARRY_FORWARD; - SQRADD2(a[8], a[31]); SQRADD2(a[9], a[30]); SQRADD2(a[10], a[29]); SQRADD2(a[11], a[28]); SQRADD2(a[12], a[27]); SQRADD2(a[13], a[26]); SQRADD2(a[14], a[25]); SQRADD2(a[15], a[24]); SQRADD2(a[16], a[23]); SQRADD2(a[17], a[22]); SQRADD2(a[18], a[21]); SQRADD2(a[19], a[20]); + SQRADDSC(a[8], a[31]); SQRADDAC(a[9], a[30]); SQRADDAC(a[10], a[29]); SQRADDAC(a[11], a[28]); SQRADDAC(a[12], a[27]); SQRADDAC(a[13], a[26]); SQRADDAC(a[14], a[25]); SQRADDAC(a[15], a[24]); SQRADDAC(a[16], a[23]); SQRADDAC(a[17], a[22]); SQRADDAC(a[18], a[21]); SQRADDAC(a[19], a[20]); SQRADDDB; COMBA_STORE(b[39]); /* output 40 */ CARRY_FORWARD; - SQRADD2(a[9], a[31]); SQRADD2(a[10], a[30]); SQRADD2(a[11], a[29]); SQRADD2(a[12], a[28]); SQRADD2(a[13], a[27]); SQRADD2(a[14], a[26]); SQRADD2(a[15], a[25]); SQRADD2(a[16], a[24]); SQRADD2(a[17], a[23]); SQRADD2(a[18], a[22]); SQRADD2(a[19], a[21]); SQRADD(a[20], a[20]); + SQRADDSC(a[9], a[31]); SQRADDAC(a[10], a[30]); SQRADDAC(a[11], a[29]); SQRADDAC(a[12], a[28]); SQRADDAC(a[13], a[27]); SQRADDAC(a[14], a[26]); SQRADDAC(a[15], a[25]); SQRADDAC(a[16], a[24]); SQRADDAC(a[17], a[23]); SQRADDAC(a[18], a[22]); SQRADDAC(a[19], a[21]); SQRADDDB; SQRADD(a[20], a[20]); COMBA_STORE(b[40]); /* output 41 */ CARRY_FORWARD; - SQRADD2(a[10], a[31]); SQRADD2(a[11], a[30]); SQRADD2(a[12], a[29]); SQRADD2(a[13], a[28]); SQRADD2(a[14], a[27]); SQRADD2(a[15], a[26]); SQRADD2(a[16], a[25]); SQRADD2(a[17], a[24]); SQRADD2(a[18], a[23]); SQRADD2(a[19], a[22]); SQRADD2(a[20], a[21]); + SQRADDSC(a[10], a[31]); SQRADDAC(a[11], a[30]); SQRADDAC(a[12], a[29]); SQRADDAC(a[13], a[28]); SQRADDAC(a[14], a[27]); SQRADDAC(a[15], a[26]); SQRADDAC(a[16], a[25]); SQRADDAC(a[17], a[24]); SQRADDAC(a[18], a[23]); SQRADDAC(a[19], a[22]); SQRADDAC(a[20], a[21]); SQRADDDB; COMBA_STORE(b[41]); /* output 42 */ CARRY_FORWARD; - SQRADD2(a[11], a[31]); SQRADD2(a[12], a[30]); SQRADD2(a[13], a[29]); SQRADD2(a[14], a[28]); SQRADD2(a[15], a[27]); SQRADD2(a[16], a[26]); SQRADD2(a[17], a[25]); SQRADD2(a[18], a[24]); SQRADD2(a[19], a[23]); SQRADD2(a[20], a[22]); SQRADD(a[21], a[21]); + SQRADDSC(a[11], a[31]); SQRADDAC(a[12], a[30]); SQRADDAC(a[13], a[29]); SQRADDAC(a[14], a[28]); SQRADDAC(a[15], a[27]); SQRADDAC(a[16], a[26]); SQRADDAC(a[17], a[25]); SQRADDAC(a[18], a[24]); SQRADDAC(a[19], a[23]); SQRADDAC(a[20], a[22]); SQRADDDB; SQRADD(a[21], a[21]); COMBA_STORE(b[42]); /* output 43 */ CARRY_FORWARD; - SQRADD2(a[12], a[31]); SQRADD2(a[13], a[30]); SQRADD2(a[14], a[29]); SQRADD2(a[15], a[28]); SQRADD2(a[16], a[27]); SQRADD2(a[17], a[26]); SQRADD2(a[18], a[25]); SQRADD2(a[19], a[24]); SQRADD2(a[20], a[23]); SQRADD2(a[21], a[22]); + SQRADDSC(a[12], a[31]); SQRADDAC(a[13], a[30]); SQRADDAC(a[14], a[29]); SQRADDAC(a[15], a[28]); SQRADDAC(a[16], a[27]); SQRADDAC(a[17], a[26]); SQRADDAC(a[18], a[25]); SQRADDAC(a[19], a[24]); SQRADDAC(a[20], a[23]); SQRADDAC(a[21], a[22]); SQRADDDB; COMBA_STORE(b[43]); /* output 44 */ CARRY_FORWARD; - SQRADD2(a[13], a[31]); SQRADD2(a[14], a[30]); SQRADD2(a[15], a[29]); SQRADD2(a[16], a[28]); SQRADD2(a[17], a[27]); SQRADD2(a[18], a[26]); SQRADD2(a[19], a[25]); SQRADD2(a[20], a[24]); SQRADD2(a[21], a[23]); SQRADD(a[22], a[22]); + SQRADDSC(a[13], a[31]); SQRADDAC(a[14], a[30]); SQRADDAC(a[15], a[29]); SQRADDAC(a[16], a[28]); SQRADDAC(a[17], a[27]); SQRADDAC(a[18], a[26]); SQRADDAC(a[19], a[25]); SQRADDAC(a[20], a[24]); SQRADDAC(a[21], a[23]); SQRADDDB; SQRADD(a[22], a[22]); COMBA_STORE(b[44]); /* output 45 */ CARRY_FORWARD; - SQRADD2(a[14], a[31]); SQRADD2(a[15], a[30]); SQRADD2(a[16], a[29]); SQRADD2(a[17], a[28]); SQRADD2(a[18], a[27]); SQRADD2(a[19], a[26]); SQRADD2(a[20], a[25]); SQRADD2(a[21], a[24]); SQRADD2(a[22], a[23]); + SQRADDSC(a[14], a[31]); SQRADDAC(a[15], a[30]); SQRADDAC(a[16], a[29]); SQRADDAC(a[17], a[28]); SQRADDAC(a[18], a[27]); SQRADDAC(a[19], a[26]); SQRADDAC(a[20], a[25]); SQRADDAC(a[21], a[24]); SQRADDAC(a[22], a[23]); SQRADDDB; COMBA_STORE(b[45]); /* output 46 */ CARRY_FORWARD; - SQRADD2(a[15], a[31]); SQRADD2(a[16], a[30]); SQRADD2(a[17], a[29]); SQRADD2(a[18], a[28]); SQRADD2(a[19], a[27]); SQRADD2(a[20], a[26]); SQRADD2(a[21], a[25]); SQRADD2(a[22], a[24]); SQRADD(a[23], a[23]); + SQRADDSC(a[15], a[31]); SQRADDAC(a[16], a[30]); SQRADDAC(a[17], a[29]); SQRADDAC(a[18], a[28]); SQRADDAC(a[19], a[27]); SQRADDAC(a[20], a[26]); SQRADDAC(a[21], a[25]); SQRADDAC(a[22], a[24]); SQRADDDB; SQRADD(a[23], a[23]); COMBA_STORE(b[46]); /* output 47 */ CARRY_FORWARD; - SQRADD2(a[16], a[31]); SQRADD2(a[17], a[30]); SQRADD2(a[18], a[29]); SQRADD2(a[19], a[28]); SQRADD2(a[20], a[27]); SQRADD2(a[21], a[26]); SQRADD2(a[22], a[25]); SQRADD2(a[23], a[24]); + SQRADDSC(a[16], a[31]); SQRADDAC(a[17], a[30]); SQRADDAC(a[18], a[29]); SQRADDAC(a[19], a[28]); SQRADDAC(a[20], a[27]); SQRADDAC(a[21], a[26]); SQRADDAC(a[22], a[25]); SQRADDAC(a[23], a[24]); SQRADDDB; COMBA_STORE(b[47]); /* output 48 */ CARRY_FORWARD; - SQRADD2(a[17], a[31]); SQRADD2(a[18], a[30]); SQRADD2(a[19], a[29]); SQRADD2(a[20], a[28]); SQRADD2(a[21], a[27]); SQRADD2(a[22], a[26]); SQRADD2(a[23], a[25]); SQRADD(a[24], a[24]); + SQRADDSC(a[17], a[31]); SQRADDAC(a[18], a[30]); SQRADDAC(a[19], a[29]); SQRADDAC(a[20], a[28]); SQRADDAC(a[21], a[27]); SQRADDAC(a[22], a[26]); SQRADDAC(a[23], a[25]); SQRADDDB; SQRADD(a[24], a[24]); COMBA_STORE(b[48]); /* output 49 */ CARRY_FORWARD; - SQRADD2(a[18], a[31]); SQRADD2(a[19], a[30]); SQRADD2(a[20], a[29]); SQRADD2(a[21], a[28]); SQRADD2(a[22], a[27]); SQRADD2(a[23], a[26]); SQRADD2(a[24], a[25]); + SQRADDSC(a[18], a[31]); SQRADDAC(a[19], a[30]); SQRADDAC(a[20], a[29]); SQRADDAC(a[21], a[28]); SQRADDAC(a[22], a[27]); SQRADDAC(a[23], a[26]); SQRADDAC(a[24], a[25]); SQRADDDB; COMBA_STORE(b[49]); /* output 50 */ CARRY_FORWARD; - SQRADD2(a[19], a[31]); SQRADD2(a[20], a[30]); SQRADD2(a[21], a[29]); SQRADD2(a[22], a[28]); SQRADD2(a[23], a[27]); SQRADD2(a[24], a[26]); SQRADD(a[25], a[25]); + SQRADDSC(a[19], a[31]); SQRADDAC(a[20], a[30]); SQRADDAC(a[21], a[29]); SQRADDAC(a[22], a[28]); SQRADDAC(a[23], a[27]); SQRADDAC(a[24], a[26]); SQRADDDB; SQRADD(a[25], a[25]); COMBA_STORE(b[50]); /* output 51 */ CARRY_FORWARD; - SQRADD2(a[20], a[31]); SQRADD2(a[21], a[30]); SQRADD2(a[22], a[29]); SQRADD2(a[23], a[28]); SQRADD2(a[24], a[27]); SQRADD2(a[25], a[26]); + SQRADDSC(a[20], a[31]); SQRADDAC(a[21], a[30]); SQRADDAC(a[22], a[29]); SQRADDAC(a[23], a[28]); SQRADDAC(a[24], a[27]); SQRADDAC(a[25], a[26]); SQRADDDB; COMBA_STORE(b[51]); /* output 52 */ CARRY_FORWARD; - SQRADD2(a[21], a[31]); SQRADD2(a[22], a[30]); SQRADD2(a[23], a[29]); SQRADD2(a[24], a[28]); SQRADD2(a[25], a[27]); SQRADD(a[26], a[26]); + SQRADDSC(a[21], a[31]); SQRADDAC(a[22], a[30]); SQRADDAC(a[23], a[29]); SQRADDAC(a[24], a[28]); SQRADDAC(a[25], a[27]); SQRADDDB; SQRADD(a[26], a[26]); COMBA_STORE(b[52]); /* output 53 */ CARRY_FORWARD; - SQRADD2(a[22], a[31]); SQRADD2(a[23], a[30]); SQRADD2(a[24], a[29]); SQRADD2(a[25], a[28]); SQRADD2(a[26], a[27]); + SQRADDSC(a[22], a[31]); SQRADDAC(a[23], a[30]); SQRADDAC(a[24], a[29]); SQRADDAC(a[25], a[28]); SQRADDAC(a[26], a[27]); SQRADDDB; COMBA_STORE(b[53]); /* output 54 */ CARRY_FORWARD; - SQRADD2(a[23], a[31]); SQRADD2(a[24], a[30]); SQRADD2(a[25], a[29]); SQRADD2(a[26], a[28]); SQRADD(a[27], a[27]); + SQRADDSC(a[23], a[31]); SQRADDAC(a[24], a[30]); SQRADDAC(a[25], a[29]); SQRADDAC(a[26], a[28]); SQRADDDB; SQRADD(a[27], a[27]); COMBA_STORE(b[54]); /* output 55 */ CARRY_FORWARD; - SQRADD2(a[24], a[31]); SQRADD2(a[25], a[30]); SQRADD2(a[26], a[29]); SQRADD2(a[27], a[28]); + SQRADDSC(a[24], a[31]); SQRADDAC(a[25], a[30]); SQRADDAC(a[26], a[29]); SQRADDAC(a[27], a[28]); SQRADDDB; COMBA_STORE(b[55]); /* output 56 */ CARRY_FORWARD; - SQRADD2(a[25], a[31]); SQRADD2(a[26], a[30]); SQRADD2(a[27], a[29]); SQRADD(a[28], a[28]); + SQRADDSC(a[25], a[31]); SQRADDAC(a[26], a[30]); SQRADDAC(a[27], a[29]); SQRADDDB; SQRADD(a[28], a[28]); COMBA_STORE(b[56]); /* output 57 */ CARRY_FORWARD; - SQRADD2(a[26], a[31]); SQRADD2(a[27], a[30]); SQRADD2(a[28], a[29]); + SQRADDSC(a[26], a[31]); SQRADDAC(a[27], a[30]); SQRADDAC(a[28], a[29]); SQRADDDB; COMBA_STORE(b[57]); /* output 58 */ @@ -956,5 +1016,661 @@ void fp_sqr_comba32(fp_int *A, fp_int *B) fp_clamp(B); } + #endif +#ifdef TFM_HUGE +void fp_sqr_comba64(fp_int *A, fp_int *B) +{ + fp_digit *a, b[128], c0, c1, c2, sc0, sc1, sc2; + + a = A->dp; + COMBA_START; + + /* clear carries */ + CLEAR_CARRY; + + /* output 0 */ + SQRADD(a[0],a[0]); + COMBA_STORE(b[0]); + + /* output 1 */ + CARRY_FORWARD; + SQRADD2(a[0], a[1]); + COMBA_STORE(b[1]); + + /* output 2 */ + CARRY_FORWARD; + SQRADD2(a[0], a[2]); SQRADD(a[1], a[1]); + COMBA_STORE(b[2]); + + /* output 3 */ + CARRY_FORWARD; + SQRADD2(a[0], a[3]); SQRADD2(a[1], a[2]); + COMBA_STORE(b[3]); + + /* output 4 */ + CARRY_FORWARD; + SQRADD2(a[0], a[4]); SQRADD2(a[1], a[3]); SQRADD(a[2], a[2]); + COMBA_STORE(b[4]); + + /* output 5 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[5]); SQRADDAC(a[1], a[4]); SQRADDAC(a[2], a[3]); SQRADDDB; + COMBA_STORE(b[5]); + + /* output 6 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[6]); SQRADDAC(a[1], a[5]); SQRADDAC(a[2], a[4]); SQRADDDB; SQRADD(a[3], a[3]); + COMBA_STORE(b[6]); + + /* output 7 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[7]); SQRADDAC(a[1], a[6]); SQRADDAC(a[2], a[5]); SQRADDAC(a[3], a[4]); SQRADDDB; + COMBA_STORE(b[7]); + + /* output 8 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[8]); SQRADDAC(a[1], a[7]); SQRADDAC(a[2], a[6]); SQRADDAC(a[3], a[5]); SQRADDDB; SQRADD(a[4], a[4]); + COMBA_STORE(b[8]); + + /* output 9 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[9]); SQRADDAC(a[1], a[8]); SQRADDAC(a[2], a[7]); SQRADDAC(a[3], a[6]); SQRADDAC(a[4], a[5]); SQRADDDB; + COMBA_STORE(b[9]); + + /* output 10 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[10]); SQRADDAC(a[1], a[9]); SQRADDAC(a[2], a[8]); SQRADDAC(a[3], a[7]); SQRADDAC(a[4], a[6]); SQRADDDB; SQRADD(a[5], a[5]); + COMBA_STORE(b[10]); + + /* output 11 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[11]); SQRADDAC(a[1], a[10]); SQRADDAC(a[2], a[9]); SQRADDAC(a[3], a[8]); SQRADDAC(a[4], a[7]); SQRADDAC(a[5], a[6]); SQRADDDB; + COMBA_STORE(b[11]); + + /* output 12 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[12]); SQRADDAC(a[1], a[11]); SQRADDAC(a[2], a[10]); SQRADDAC(a[3], a[9]); SQRADDAC(a[4], a[8]); SQRADDAC(a[5], a[7]); SQRADDDB; SQRADD(a[6], a[6]); + COMBA_STORE(b[12]); + + /* output 13 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[13]); SQRADDAC(a[1], a[12]); SQRADDAC(a[2], a[11]); SQRADDAC(a[3], a[10]); SQRADDAC(a[4], a[9]); SQRADDAC(a[5], a[8]); SQRADDAC(a[6], a[7]); SQRADDDB; + COMBA_STORE(b[13]); + + /* output 14 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[14]); SQRADDAC(a[1], a[13]); SQRADDAC(a[2], a[12]); SQRADDAC(a[3], a[11]); SQRADDAC(a[4], a[10]); SQRADDAC(a[5], a[9]); SQRADDAC(a[6], a[8]); SQRADDDB; SQRADD(a[7], a[7]); + COMBA_STORE(b[14]); + + /* output 15 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[15]); SQRADDAC(a[1], a[14]); SQRADDAC(a[2], a[13]); SQRADDAC(a[3], a[12]); SQRADDAC(a[4], a[11]); SQRADDAC(a[5], a[10]); SQRADDAC(a[6], a[9]); SQRADDAC(a[7], a[8]); SQRADDDB; + COMBA_STORE(b[15]); + + /* output 16 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[16]); SQRADDAC(a[1], a[15]); SQRADDAC(a[2], a[14]); SQRADDAC(a[3], a[13]); SQRADDAC(a[4], a[12]); SQRADDAC(a[5], a[11]); SQRADDAC(a[6], a[10]); SQRADDAC(a[7], a[9]); SQRADDDB; SQRADD(a[8], a[8]); + COMBA_STORE(b[16]); + + /* output 17 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[17]); SQRADDAC(a[1], a[16]); SQRADDAC(a[2], a[15]); SQRADDAC(a[3], a[14]); SQRADDAC(a[4], a[13]); SQRADDAC(a[5], a[12]); SQRADDAC(a[6], a[11]); SQRADDAC(a[7], a[10]); SQRADDAC(a[8], a[9]); SQRADDDB; + COMBA_STORE(b[17]); + + /* output 18 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[18]); SQRADDAC(a[1], a[17]); SQRADDAC(a[2], a[16]); SQRADDAC(a[3], a[15]); SQRADDAC(a[4], a[14]); SQRADDAC(a[5], a[13]); SQRADDAC(a[6], a[12]); SQRADDAC(a[7], a[11]); SQRADDAC(a[8], a[10]); SQRADDDB; SQRADD(a[9], a[9]); + COMBA_STORE(b[18]); + + /* output 19 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[19]); SQRADDAC(a[1], a[18]); SQRADDAC(a[2], a[17]); SQRADDAC(a[3], a[16]); SQRADDAC(a[4], a[15]); SQRADDAC(a[5], a[14]); SQRADDAC(a[6], a[13]); SQRADDAC(a[7], a[12]); SQRADDAC(a[8], a[11]); SQRADDAC(a[9], a[10]); SQRADDDB; + COMBA_STORE(b[19]); + + /* output 20 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[20]); SQRADDAC(a[1], a[19]); SQRADDAC(a[2], a[18]); SQRADDAC(a[3], a[17]); SQRADDAC(a[4], a[16]); SQRADDAC(a[5], a[15]); SQRADDAC(a[6], a[14]); SQRADDAC(a[7], a[13]); SQRADDAC(a[8], a[12]); SQRADDAC(a[9], a[11]); SQRADDDB; SQRADD(a[10], a[10]); + COMBA_STORE(b[20]); + + /* output 21 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[21]); SQRADDAC(a[1], a[20]); SQRADDAC(a[2], a[19]); SQRADDAC(a[3], a[18]); SQRADDAC(a[4], a[17]); SQRADDAC(a[5], a[16]); SQRADDAC(a[6], a[15]); SQRADDAC(a[7], a[14]); SQRADDAC(a[8], a[13]); SQRADDAC(a[9], a[12]); SQRADDAC(a[10], a[11]); SQRADDDB; + COMBA_STORE(b[21]); + + /* output 22 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[22]); SQRADDAC(a[1], a[21]); SQRADDAC(a[2], a[20]); SQRADDAC(a[3], a[19]); SQRADDAC(a[4], a[18]); SQRADDAC(a[5], a[17]); SQRADDAC(a[6], a[16]); SQRADDAC(a[7], a[15]); SQRADDAC(a[8], a[14]); SQRADDAC(a[9], a[13]); SQRADDAC(a[10], a[12]); SQRADDDB; SQRADD(a[11], a[11]); + COMBA_STORE(b[22]); + + /* output 23 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[23]); SQRADDAC(a[1], a[22]); SQRADDAC(a[2], a[21]); SQRADDAC(a[3], a[20]); SQRADDAC(a[4], a[19]); SQRADDAC(a[5], a[18]); SQRADDAC(a[6], a[17]); SQRADDAC(a[7], a[16]); SQRADDAC(a[8], a[15]); SQRADDAC(a[9], a[14]); SQRADDAC(a[10], a[13]); SQRADDAC(a[11], a[12]); SQRADDDB; + COMBA_STORE(b[23]); + + /* output 24 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[24]); SQRADDAC(a[1], a[23]); SQRADDAC(a[2], a[22]); SQRADDAC(a[3], a[21]); SQRADDAC(a[4], a[20]); SQRADDAC(a[5], a[19]); SQRADDAC(a[6], a[18]); SQRADDAC(a[7], a[17]); SQRADDAC(a[8], a[16]); SQRADDAC(a[9], a[15]); SQRADDAC(a[10], a[14]); SQRADDAC(a[11], a[13]); SQRADDDB; SQRADD(a[12], a[12]); + COMBA_STORE(b[24]); + + /* output 25 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[25]); SQRADDAC(a[1], a[24]); SQRADDAC(a[2], a[23]); SQRADDAC(a[3], a[22]); SQRADDAC(a[4], a[21]); SQRADDAC(a[5], a[20]); SQRADDAC(a[6], a[19]); SQRADDAC(a[7], a[18]); SQRADDAC(a[8], a[17]); SQRADDAC(a[9], a[16]); SQRADDAC(a[10], a[15]); SQRADDAC(a[11], a[14]); SQRADDAC(a[12], a[13]); SQRADDDB; + COMBA_STORE(b[25]); + + /* output 26 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[26]); SQRADDAC(a[1], a[25]); SQRADDAC(a[2], a[24]); SQRADDAC(a[3], a[23]); SQRADDAC(a[4], a[22]); SQRADDAC(a[5], a[21]); SQRADDAC(a[6], a[20]); SQRADDAC(a[7], a[19]); SQRADDAC(a[8], a[18]); SQRADDAC(a[9], a[17]); SQRADDAC(a[10], a[16]); SQRADDAC(a[11], a[15]); SQRADDAC(a[12], a[14]); SQRADDDB; SQRADD(a[13], a[13]); + COMBA_STORE(b[26]); + + /* output 27 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[27]); SQRADDAC(a[1], a[26]); SQRADDAC(a[2], a[25]); SQRADDAC(a[3], a[24]); SQRADDAC(a[4], a[23]); SQRADDAC(a[5], a[22]); SQRADDAC(a[6], a[21]); SQRADDAC(a[7], a[20]); SQRADDAC(a[8], a[19]); SQRADDAC(a[9], a[18]); SQRADDAC(a[10], a[17]); SQRADDAC(a[11], a[16]); SQRADDAC(a[12], a[15]); SQRADDAC(a[13], a[14]); SQRADDDB; + COMBA_STORE(b[27]); + + /* output 28 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[28]); SQRADDAC(a[1], a[27]); SQRADDAC(a[2], a[26]); SQRADDAC(a[3], a[25]); SQRADDAC(a[4], a[24]); SQRADDAC(a[5], a[23]); SQRADDAC(a[6], a[22]); SQRADDAC(a[7], a[21]); SQRADDAC(a[8], a[20]); SQRADDAC(a[9], a[19]); SQRADDAC(a[10], a[18]); SQRADDAC(a[11], a[17]); SQRADDAC(a[12], a[16]); SQRADDAC(a[13], a[15]); SQRADDDB; SQRADD(a[14], a[14]); + COMBA_STORE(b[28]); + + /* output 29 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[29]); SQRADDAC(a[1], a[28]); SQRADDAC(a[2], a[27]); SQRADDAC(a[3], a[26]); SQRADDAC(a[4], a[25]); SQRADDAC(a[5], a[24]); SQRADDAC(a[6], a[23]); SQRADDAC(a[7], a[22]); SQRADDAC(a[8], a[21]); SQRADDAC(a[9], a[20]); SQRADDAC(a[10], a[19]); SQRADDAC(a[11], a[18]); SQRADDAC(a[12], a[17]); SQRADDAC(a[13], a[16]); SQRADDAC(a[14], a[15]); SQRADDDB; + COMBA_STORE(b[29]); + + /* output 30 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[30]); SQRADDAC(a[1], a[29]); SQRADDAC(a[2], a[28]); SQRADDAC(a[3], a[27]); SQRADDAC(a[4], a[26]); SQRADDAC(a[5], a[25]); SQRADDAC(a[6], a[24]); SQRADDAC(a[7], a[23]); SQRADDAC(a[8], a[22]); SQRADDAC(a[9], a[21]); SQRADDAC(a[10], a[20]); SQRADDAC(a[11], a[19]); SQRADDAC(a[12], a[18]); SQRADDAC(a[13], a[17]); SQRADDAC(a[14], a[16]); SQRADDDB; SQRADD(a[15], a[15]); + COMBA_STORE(b[30]); + + /* output 31 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[31]); SQRADDAC(a[1], a[30]); SQRADDAC(a[2], a[29]); SQRADDAC(a[3], a[28]); SQRADDAC(a[4], a[27]); SQRADDAC(a[5], a[26]); SQRADDAC(a[6], a[25]); SQRADDAC(a[7], a[24]); SQRADDAC(a[8], a[23]); SQRADDAC(a[9], a[22]); SQRADDAC(a[10], a[21]); SQRADDAC(a[11], a[20]); SQRADDAC(a[12], a[19]); SQRADDAC(a[13], a[18]); SQRADDAC(a[14], a[17]); SQRADDAC(a[15], a[16]); SQRADDDB; + COMBA_STORE(b[31]); + + /* output 32 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[32]); SQRADDAC(a[1], a[31]); SQRADDAC(a[2], a[30]); SQRADDAC(a[3], a[29]); SQRADDAC(a[4], a[28]); SQRADDAC(a[5], a[27]); SQRADDAC(a[6], a[26]); SQRADDAC(a[7], a[25]); SQRADDAC(a[8], a[24]); SQRADDAC(a[9], a[23]); SQRADDAC(a[10], a[22]); SQRADDAC(a[11], a[21]); SQRADDAC(a[12], a[20]); SQRADDAC(a[13], a[19]); SQRADDAC(a[14], a[18]); SQRADDAC(a[15], a[17]); SQRADDDB; SQRADD(a[16], a[16]); + COMBA_STORE(b[32]); + + /* output 33 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[33]); SQRADDAC(a[1], a[32]); SQRADDAC(a[2], a[31]); SQRADDAC(a[3], a[30]); SQRADDAC(a[4], a[29]); SQRADDAC(a[5], a[28]); SQRADDAC(a[6], a[27]); SQRADDAC(a[7], a[26]); SQRADDAC(a[8], a[25]); SQRADDAC(a[9], a[24]); SQRADDAC(a[10], a[23]); SQRADDAC(a[11], a[22]); SQRADDAC(a[12], a[21]); SQRADDAC(a[13], a[20]); SQRADDAC(a[14], a[19]); SQRADDAC(a[15], a[18]); SQRADDAC(a[16], a[17]); SQRADDDB; + COMBA_STORE(b[33]); + + /* output 34 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[34]); SQRADDAC(a[1], a[33]); SQRADDAC(a[2], a[32]); SQRADDAC(a[3], a[31]); SQRADDAC(a[4], a[30]); SQRADDAC(a[5], a[29]); SQRADDAC(a[6], a[28]); SQRADDAC(a[7], a[27]); SQRADDAC(a[8], a[26]); SQRADDAC(a[9], a[25]); SQRADDAC(a[10], a[24]); SQRADDAC(a[11], a[23]); SQRADDAC(a[12], a[22]); SQRADDAC(a[13], a[21]); SQRADDAC(a[14], a[20]); SQRADDAC(a[15], a[19]); SQRADDAC(a[16], a[18]); SQRADDDB; SQRADD(a[17], a[17]); + COMBA_STORE(b[34]); + + /* output 35 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[35]); SQRADDAC(a[1], a[34]); SQRADDAC(a[2], a[33]); SQRADDAC(a[3], a[32]); SQRADDAC(a[4], a[31]); SQRADDAC(a[5], a[30]); SQRADDAC(a[6], a[29]); SQRADDAC(a[7], a[28]); SQRADDAC(a[8], a[27]); SQRADDAC(a[9], a[26]); SQRADDAC(a[10], a[25]); SQRADDAC(a[11], a[24]); SQRADDAC(a[12], a[23]); SQRADDAC(a[13], a[22]); SQRADDAC(a[14], a[21]); SQRADDAC(a[15], a[20]); SQRADDAC(a[16], a[19]); SQRADDAC(a[17], a[18]); SQRADDDB; + COMBA_STORE(b[35]); + + /* output 36 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[36]); SQRADDAC(a[1], a[35]); SQRADDAC(a[2], a[34]); SQRADDAC(a[3], a[33]); SQRADDAC(a[4], a[32]); SQRADDAC(a[5], a[31]); SQRADDAC(a[6], a[30]); SQRADDAC(a[7], a[29]); SQRADDAC(a[8], a[28]); SQRADDAC(a[9], a[27]); SQRADDAC(a[10], a[26]); SQRADDAC(a[11], a[25]); SQRADDAC(a[12], a[24]); SQRADDAC(a[13], a[23]); SQRADDAC(a[14], a[22]); SQRADDAC(a[15], a[21]); SQRADDAC(a[16], a[20]); SQRADDAC(a[17], a[19]); SQRADDDB; SQRADD(a[18], a[18]); + COMBA_STORE(b[36]); + + /* output 37 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[37]); SQRADDAC(a[1], a[36]); SQRADDAC(a[2], a[35]); SQRADDAC(a[3], a[34]); SQRADDAC(a[4], a[33]); SQRADDAC(a[5], a[32]); SQRADDAC(a[6], a[31]); SQRADDAC(a[7], a[30]); SQRADDAC(a[8], a[29]); SQRADDAC(a[9], a[28]); SQRADDAC(a[10], a[27]); SQRADDAC(a[11], a[26]); SQRADDAC(a[12], a[25]); SQRADDAC(a[13], a[24]); SQRADDAC(a[14], a[23]); SQRADDAC(a[15], a[22]); SQRADDAC(a[16], a[21]); SQRADDAC(a[17], a[20]); SQRADDAC(a[18], a[19]); SQRADDDB; + COMBA_STORE(b[37]); + + /* output 38 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[38]); SQRADDAC(a[1], a[37]); SQRADDAC(a[2], a[36]); SQRADDAC(a[3], a[35]); SQRADDAC(a[4], a[34]); SQRADDAC(a[5], a[33]); SQRADDAC(a[6], a[32]); SQRADDAC(a[7], a[31]); SQRADDAC(a[8], a[30]); SQRADDAC(a[9], a[29]); SQRADDAC(a[10], a[28]); SQRADDAC(a[11], a[27]); SQRADDAC(a[12], a[26]); SQRADDAC(a[13], a[25]); SQRADDAC(a[14], a[24]); SQRADDAC(a[15], a[23]); SQRADDAC(a[16], a[22]); SQRADDAC(a[17], a[21]); SQRADDAC(a[18], a[20]); SQRADDDB; SQRADD(a[19], a[19]); + COMBA_STORE(b[38]); + + /* output 39 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[39]); SQRADDAC(a[1], a[38]); SQRADDAC(a[2], a[37]); SQRADDAC(a[3], a[36]); SQRADDAC(a[4], a[35]); SQRADDAC(a[5], a[34]); SQRADDAC(a[6], a[33]); SQRADDAC(a[7], a[32]); SQRADDAC(a[8], a[31]); SQRADDAC(a[9], a[30]); SQRADDAC(a[10], a[29]); SQRADDAC(a[11], a[28]); SQRADDAC(a[12], a[27]); SQRADDAC(a[13], a[26]); SQRADDAC(a[14], a[25]); SQRADDAC(a[15], a[24]); SQRADDAC(a[16], a[23]); SQRADDAC(a[17], a[22]); SQRADDAC(a[18], a[21]); SQRADDAC(a[19], a[20]); SQRADDDB; + COMBA_STORE(b[39]); + + /* output 40 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[40]); SQRADDAC(a[1], a[39]); SQRADDAC(a[2], a[38]); SQRADDAC(a[3], a[37]); SQRADDAC(a[4], a[36]); SQRADDAC(a[5], a[35]); SQRADDAC(a[6], a[34]); SQRADDAC(a[7], a[33]); SQRADDAC(a[8], a[32]); SQRADDAC(a[9], a[31]); SQRADDAC(a[10], a[30]); SQRADDAC(a[11], a[29]); SQRADDAC(a[12], a[28]); SQRADDAC(a[13], a[27]); SQRADDAC(a[14], a[26]); SQRADDAC(a[15], a[25]); SQRADDAC(a[16], a[24]); SQRADDAC(a[17], a[23]); SQRADDAC(a[18], a[22]); SQRADDAC(a[19], a[21]); SQRADDDB; SQRADD(a[20], a[20]); + COMBA_STORE(b[40]); + + /* output 41 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[41]); SQRADDAC(a[1], a[40]); SQRADDAC(a[2], a[39]); SQRADDAC(a[3], a[38]); SQRADDAC(a[4], a[37]); SQRADDAC(a[5], a[36]); SQRADDAC(a[6], a[35]); SQRADDAC(a[7], a[34]); SQRADDAC(a[8], a[33]); SQRADDAC(a[9], a[32]); SQRADDAC(a[10], a[31]); SQRADDAC(a[11], a[30]); SQRADDAC(a[12], a[29]); SQRADDAC(a[13], a[28]); SQRADDAC(a[14], a[27]); SQRADDAC(a[15], a[26]); SQRADDAC(a[16], a[25]); SQRADDAC(a[17], a[24]); SQRADDAC(a[18], a[23]); SQRADDAC(a[19], a[22]); SQRADDAC(a[20], a[21]); SQRADDDB; + COMBA_STORE(b[41]); + + /* output 42 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[42]); SQRADDAC(a[1], a[41]); SQRADDAC(a[2], a[40]); SQRADDAC(a[3], a[39]); SQRADDAC(a[4], a[38]); SQRADDAC(a[5], a[37]); SQRADDAC(a[6], a[36]); SQRADDAC(a[7], a[35]); SQRADDAC(a[8], a[34]); SQRADDAC(a[9], a[33]); SQRADDAC(a[10], a[32]); SQRADDAC(a[11], a[31]); SQRADDAC(a[12], a[30]); SQRADDAC(a[13], a[29]); SQRADDAC(a[14], a[28]); SQRADDAC(a[15], a[27]); SQRADDAC(a[16], a[26]); SQRADDAC(a[17], a[25]); SQRADDAC(a[18], a[24]); SQRADDAC(a[19], a[23]); SQRADDAC(a[20], a[22]); SQRADDDB; SQRADD(a[21], a[21]); + COMBA_STORE(b[42]); + + /* output 43 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[43]); SQRADDAC(a[1], a[42]); SQRADDAC(a[2], a[41]); SQRADDAC(a[3], a[40]); SQRADDAC(a[4], a[39]); SQRADDAC(a[5], a[38]); SQRADDAC(a[6], a[37]); SQRADDAC(a[7], a[36]); SQRADDAC(a[8], a[35]); SQRADDAC(a[9], a[34]); SQRADDAC(a[10], a[33]); SQRADDAC(a[11], a[32]); SQRADDAC(a[12], a[31]); SQRADDAC(a[13], a[30]); SQRADDAC(a[14], a[29]); SQRADDAC(a[15], a[28]); SQRADDAC(a[16], a[27]); SQRADDAC(a[17], a[26]); SQRADDAC(a[18], a[25]); SQRADDAC(a[19], a[24]); SQRADDAC(a[20], a[23]); SQRADDAC(a[21], a[22]); SQRADDDB; + COMBA_STORE(b[43]); + + /* output 44 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[44]); SQRADDAC(a[1], a[43]); SQRADDAC(a[2], a[42]); SQRADDAC(a[3], a[41]); SQRADDAC(a[4], a[40]); SQRADDAC(a[5], a[39]); SQRADDAC(a[6], a[38]); SQRADDAC(a[7], a[37]); SQRADDAC(a[8], a[36]); SQRADDAC(a[9], a[35]); SQRADDAC(a[10], a[34]); SQRADDAC(a[11], a[33]); SQRADDAC(a[12], a[32]); SQRADDAC(a[13], a[31]); SQRADDAC(a[14], a[30]); SQRADDAC(a[15], a[29]); SQRADDAC(a[16], a[28]); SQRADDAC(a[17], a[27]); SQRADDAC(a[18], a[26]); SQRADDAC(a[19], a[25]); SQRADDAC(a[20], a[24]); SQRADDAC(a[21], a[23]); SQRADDDB; SQRADD(a[22], a[22]); + COMBA_STORE(b[44]); + + /* output 45 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[45]); SQRADDAC(a[1], a[44]); SQRADDAC(a[2], a[43]); SQRADDAC(a[3], a[42]); SQRADDAC(a[4], a[41]); SQRADDAC(a[5], a[40]); SQRADDAC(a[6], a[39]); SQRADDAC(a[7], a[38]); SQRADDAC(a[8], a[37]); SQRADDAC(a[9], a[36]); SQRADDAC(a[10], a[35]); SQRADDAC(a[11], a[34]); SQRADDAC(a[12], a[33]); SQRADDAC(a[13], a[32]); SQRADDAC(a[14], a[31]); SQRADDAC(a[15], a[30]); SQRADDAC(a[16], a[29]); SQRADDAC(a[17], a[28]); SQRADDAC(a[18], a[27]); SQRADDAC(a[19], a[26]); SQRADDAC(a[20], a[25]); SQRADDAC(a[21], a[24]); SQRADDAC(a[22], a[23]); SQRADDDB; + COMBA_STORE(b[45]); + + /* output 46 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[46]); SQRADDAC(a[1], a[45]); SQRADDAC(a[2], a[44]); SQRADDAC(a[3], a[43]); SQRADDAC(a[4], a[42]); SQRADDAC(a[5], a[41]); SQRADDAC(a[6], a[40]); SQRADDAC(a[7], a[39]); SQRADDAC(a[8], a[38]); SQRADDAC(a[9], a[37]); SQRADDAC(a[10], a[36]); SQRADDAC(a[11], a[35]); SQRADDAC(a[12], a[34]); SQRADDAC(a[13], a[33]); SQRADDAC(a[14], a[32]); SQRADDAC(a[15], a[31]); SQRADDAC(a[16], a[30]); SQRADDAC(a[17], a[29]); SQRADDAC(a[18], a[28]); SQRADDAC(a[19], a[27]); SQRADDAC(a[20], a[26]); SQRADDAC(a[21], a[25]); SQRADDAC(a[22], a[24]); SQRADDDB; SQRADD(a[23], a[23]); + COMBA_STORE(b[46]); + + /* output 47 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[47]); SQRADDAC(a[1], a[46]); SQRADDAC(a[2], a[45]); SQRADDAC(a[3], a[44]); SQRADDAC(a[4], a[43]); SQRADDAC(a[5], a[42]); SQRADDAC(a[6], a[41]); SQRADDAC(a[7], a[40]); SQRADDAC(a[8], a[39]); SQRADDAC(a[9], a[38]); SQRADDAC(a[10], a[37]); SQRADDAC(a[11], a[36]); SQRADDAC(a[12], a[35]); SQRADDAC(a[13], a[34]); SQRADDAC(a[14], a[33]); SQRADDAC(a[15], a[32]); SQRADDAC(a[16], a[31]); SQRADDAC(a[17], a[30]); SQRADDAC(a[18], a[29]); SQRADDAC(a[19], a[28]); SQRADDAC(a[20], a[27]); SQRADDAC(a[21], a[26]); SQRADDAC(a[22], a[25]); SQRADDAC(a[23], a[24]); SQRADDDB; + COMBA_STORE(b[47]); + + /* output 48 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[48]); SQRADDAC(a[1], a[47]); SQRADDAC(a[2], a[46]); SQRADDAC(a[3], a[45]); SQRADDAC(a[4], a[44]); SQRADDAC(a[5], a[43]); SQRADDAC(a[6], a[42]); SQRADDAC(a[7], a[41]); SQRADDAC(a[8], a[40]); SQRADDAC(a[9], a[39]); SQRADDAC(a[10], a[38]); SQRADDAC(a[11], a[37]); SQRADDAC(a[12], a[36]); SQRADDAC(a[13], a[35]); SQRADDAC(a[14], a[34]); SQRADDAC(a[15], a[33]); SQRADDAC(a[16], a[32]); SQRADDAC(a[17], a[31]); SQRADDAC(a[18], a[30]); SQRADDAC(a[19], a[29]); SQRADDAC(a[20], a[28]); SQRADDAC(a[21], a[27]); SQRADDAC(a[22], a[26]); SQRADDAC(a[23], a[25]); SQRADDDB; SQRADD(a[24], a[24]); + COMBA_STORE(b[48]); + + /* output 49 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[49]); SQRADDAC(a[1], a[48]); SQRADDAC(a[2], a[47]); SQRADDAC(a[3], a[46]); SQRADDAC(a[4], a[45]); SQRADDAC(a[5], a[44]); SQRADDAC(a[6], a[43]); SQRADDAC(a[7], a[42]); SQRADDAC(a[8], a[41]); SQRADDAC(a[9], a[40]); SQRADDAC(a[10], a[39]); SQRADDAC(a[11], a[38]); SQRADDAC(a[12], a[37]); SQRADDAC(a[13], a[36]); SQRADDAC(a[14], a[35]); SQRADDAC(a[15], a[34]); SQRADDAC(a[16], a[33]); SQRADDAC(a[17], a[32]); SQRADDAC(a[18], a[31]); SQRADDAC(a[19], a[30]); SQRADDAC(a[20], a[29]); SQRADDAC(a[21], a[28]); SQRADDAC(a[22], a[27]); SQRADDAC(a[23], a[26]); SQRADDAC(a[24], a[25]); SQRADDDB; + COMBA_STORE(b[49]); + + /* output 50 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[50]); SQRADDAC(a[1], a[49]); SQRADDAC(a[2], a[48]); SQRADDAC(a[3], a[47]); SQRADDAC(a[4], a[46]); SQRADDAC(a[5], a[45]); SQRADDAC(a[6], a[44]); SQRADDAC(a[7], a[43]); SQRADDAC(a[8], a[42]); SQRADDAC(a[9], a[41]); SQRADDAC(a[10], a[40]); SQRADDAC(a[11], a[39]); SQRADDAC(a[12], a[38]); SQRADDAC(a[13], a[37]); SQRADDAC(a[14], a[36]); SQRADDAC(a[15], a[35]); SQRADDAC(a[16], a[34]); SQRADDAC(a[17], a[33]); SQRADDAC(a[18], a[32]); SQRADDAC(a[19], a[31]); SQRADDAC(a[20], a[30]); SQRADDAC(a[21], a[29]); SQRADDAC(a[22], a[28]); SQRADDAC(a[23], a[27]); SQRADDAC(a[24], a[26]); SQRADDDB; SQRADD(a[25], a[25]); + COMBA_STORE(b[50]); + + /* output 51 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[51]); SQRADDAC(a[1], a[50]); SQRADDAC(a[2], a[49]); SQRADDAC(a[3], a[48]); SQRADDAC(a[4], a[47]); SQRADDAC(a[5], a[46]); SQRADDAC(a[6], a[45]); SQRADDAC(a[7], a[44]); SQRADDAC(a[8], a[43]); SQRADDAC(a[9], a[42]); SQRADDAC(a[10], a[41]); SQRADDAC(a[11], a[40]); SQRADDAC(a[12], a[39]); SQRADDAC(a[13], a[38]); SQRADDAC(a[14], a[37]); SQRADDAC(a[15], a[36]); SQRADDAC(a[16], a[35]); SQRADDAC(a[17], a[34]); SQRADDAC(a[18], a[33]); SQRADDAC(a[19], a[32]); SQRADDAC(a[20], a[31]); SQRADDAC(a[21], a[30]); SQRADDAC(a[22], a[29]); SQRADDAC(a[23], a[28]); SQRADDAC(a[24], a[27]); SQRADDAC(a[25], a[26]); SQRADDDB; + COMBA_STORE(b[51]); + + /* output 52 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[52]); SQRADDAC(a[1], a[51]); SQRADDAC(a[2], a[50]); SQRADDAC(a[3], a[49]); SQRADDAC(a[4], a[48]); SQRADDAC(a[5], a[47]); SQRADDAC(a[6], a[46]); SQRADDAC(a[7], a[45]); SQRADDAC(a[8], a[44]); SQRADDAC(a[9], a[43]); SQRADDAC(a[10], a[42]); SQRADDAC(a[11], a[41]); SQRADDAC(a[12], a[40]); SQRADDAC(a[13], a[39]); SQRADDAC(a[14], a[38]); SQRADDAC(a[15], a[37]); SQRADDAC(a[16], a[36]); SQRADDAC(a[17], a[35]); SQRADDAC(a[18], a[34]); SQRADDAC(a[19], a[33]); SQRADDAC(a[20], a[32]); SQRADDAC(a[21], a[31]); SQRADDAC(a[22], a[30]); SQRADDAC(a[23], a[29]); SQRADDAC(a[24], a[28]); SQRADDAC(a[25], a[27]); SQRADDDB; SQRADD(a[26], a[26]); + COMBA_STORE(b[52]); + + /* output 53 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[53]); SQRADDAC(a[1], a[52]); SQRADDAC(a[2], a[51]); SQRADDAC(a[3], a[50]); SQRADDAC(a[4], a[49]); SQRADDAC(a[5], a[48]); SQRADDAC(a[6], a[47]); SQRADDAC(a[7], a[46]); SQRADDAC(a[8], a[45]); SQRADDAC(a[9], a[44]); SQRADDAC(a[10], a[43]); SQRADDAC(a[11], a[42]); SQRADDAC(a[12], a[41]); SQRADDAC(a[13], a[40]); SQRADDAC(a[14], a[39]); SQRADDAC(a[15], a[38]); SQRADDAC(a[16], a[37]); SQRADDAC(a[17], a[36]); SQRADDAC(a[18], a[35]); SQRADDAC(a[19], a[34]); SQRADDAC(a[20], a[33]); SQRADDAC(a[21], a[32]); SQRADDAC(a[22], a[31]); SQRADDAC(a[23], a[30]); SQRADDAC(a[24], a[29]); SQRADDAC(a[25], a[28]); SQRADDAC(a[26], a[27]); SQRADDDB; + COMBA_STORE(b[53]); + + /* output 54 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[54]); SQRADDAC(a[1], a[53]); SQRADDAC(a[2], a[52]); SQRADDAC(a[3], a[51]); SQRADDAC(a[4], a[50]); SQRADDAC(a[5], a[49]); SQRADDAC(a[6], a[48]); SQRADDAC(a[7], a[47]); SQRADDAC(a[8], a[46]); SQRADDAC(a[9], a[45]); SQRADDAC(a[10], a[44]); SQRADDAC(a[11], a[43]); SQRADDAC(a[12], a[42]); SQRADDAC(a[13], a[41]); SQRADDAC(a[14], a[40]); SQRADDAC(a[15], a[39]); SQRADDAC(a[16], a[38]); SQRADDAC(a[17], a[37]); SQRADDAC(a[18], a[36]); SQRADDAC(a[19], a[35]); SQRADDAC(a[20], a[34]); SQRADDAC(a[21], a[33]); SQRADDAC(a[22], a[32]); SQRADDAC(a[23], a[31]); SQRADDAC(a[24], a[30]); SQRADDAC(a[25], a[29]); SQRADDAC(a[26], a[28]); SQRADDDB; SQRADD(a[27], a[27]); + COMBA_STORE(b[54]); + + /* output 55 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[55]); SQRADDAC(a[1], a[54]); SQRADDAC(a[2], a[53]); SQRADDAC(a[3], a[52]); SQRADDAC(a[4], a[51]); SQRADDAC(a[5], a[50]); SQRADDAC(a[6], a[49]); SQRADDAC(a[7], a[48]); SQRADDAC(a[8], a[47]); SQRADDAC(a[9], a[46]); SQRADDAC(a[10], a[45]); SQRADDAC(a[11], a[44]); SQRADDAC(a[12], a[43]); SQRADDAC(a[13], a[42]); SQRADDAC(a[14], a[41]); SQRADDAC(a[15], a[40]); SQRADDAC(a[16], a[39]); SQRADDAC(a[17], a[38]); SQRADDAC(a[18], a[37]); SQRADDAC(a[19], a[36]); SQRADDAC(a[20], a[35]); SQRADDAC(a[21], a[34]); SQRADDAC(a[22], a[33]); SQRADDAC(a[23], a[32]); SQRADDAC(a[24], a[31]); SQRADDAC(a[25], a[30]); SQRADDAC(a[26], a[29]); SQRADDAC(a[27], a[28]); SQRADDDB; + COMBA_STORE(b[55]); + + /* output 56 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[56]); SQRADDAC(a[1], a[55]); SQRADDAC(a[2], a[54]); SQRADDAC(a[3], a[53]); SQRADDAC(a[4], a[52]); SQRADDAC(a[5], a[51]); SQRADDAC(a[6], a[50]); SQRADDAC(a[7], a[49]); SQRADDAC(a[8], a[48]); SQRADDAC(a[9], a[47]); SQRADDAC(a[10], a[46]); SQRADDAC(a[11], a[45]); SQRADDAC(a[12], a[44]); SQRADDAC(a[13], a[43]); SQRADDAC(a[14], a[42]); SQRADDAC(a[15], a[41]); SQRADDAC(a[16], a[40]); SQRADDAC(a[17], a[39]); SQRADDAC(a[18], a[38]); SQRADDAC(a[19], a[37]); SQRADDAC(a[20], a[36]); SQRADDAC(a[21], a[35]); SQRADDAC(a[22], a[34]); SQRADDAC(a[23], a[33]); SQRADDAC(a[24], a[32]); SQRADDAC(a[25], a[31]); SQRADDAC(a[26], a[30]); SQRADDAC(a[27], a[29]); SQRADDDB; SQRADD(a[28], a[28]); + COMBA_STORE(b[56]); + + /* output 57 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[57]); SQRADDAC(a[1], a[56]); SQRADDAC(a[2], a[55]); SQRADDAC(a[3], a[54]); SQRADDAC(a[4], a[53]); SQRADDAC(a[5], a[52]); SQRADDAC(a[6], a[51]); SQRADDAC(a[7], a[50]); SQRADDAC(a[8], a[49]); SQRADDAC(a[9], a[48]); SQRADDAC(a[10], a[47]); SQRADDAC(a[11], a[46]); SQRADDAC(a[12], a[45]); SQRADDAC(a[13], a[44]); SQRADDAC(a[14], a[43]); SQRADDAC(a[15], a[42]); SQRADDAC(a[16], a[41]); SQRADDAC(a[17], a[40]); SQRADDAC(a[18], a[39]); SQRADDAC(a[19], a[38]); SQRADDAC(a[20], a[37]); SQRADDAC(a[21], a[36]); SQRADDAC(a[22], a[35]); SQRADDAC(a[23], a[34]); SQRADDAC(a[24], a[33]); SQRADDAC(a[25], a[32]); SQRADDAC(a[26], a[31]); SQRADDAC(a[27], a[30]); SQRADDAC(a[28], a[29]); SQRADDDB; + COMBA_STORE(b[57]); + + /* output 58 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[58]); SQRADDAC(a[1], a[57]); SQRADDAC(a[2], a[56]); SQRADDAC(a[3], a[55]); SQRADDAC(a[4], a[54]); SQRADDAC(a[5], a[53]); SQRADDAC(a[6], a[52]); SQRADDAC(a[7], a[51]); SQRADDAC(a[8], a[50]); SQRADDAC(a[9], a[49]); SQRADDAC(a[10], a[48]); SQRADDAC(a[11], a[47]); SQRADDAC(a[12], a[46]); SQRADDAC(a[13], a[45]); SQRADDAC(a[14], a[44]); SQRADDAC(a[15], a[43]); SQRADDAC(a[16], a[42]); SQRADDAC(a[17], a[41]); SQRADDAC(a[18], a[40]); SQRADDAC(a[19], a[39]); SQRADDAC(a[20], a[38]); SQRADDAC(a[21], a[37]); SQRADDAC(a[22], a[36]); SQRADDAC(a[23], a[35]); SQRADDAC(a[24], a[34]); SQRADDAC(a[25], a[33]); SQRADDAC(a[26], a[32]); SQRADDAC(a[27], a[31]); SQRADDAC(a[28], a[30]); SQRADDDB; SQRADD(a[29], a[29]); + COMBA_STORE(b[58]); + + /* output 59 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[59]); SQRADDAC(a[1], a[58]); SQRADDAC(a[2], a[57]); SQRADDAC(a[3], a[56]); SQRADDAC(a[4], a[55]); SQRADDAC(a[5], a[54]); SQRADDAC(a[6], a[53]); SQRADDAC(a[7], a[52]); SQRADDAC(a[8], a[51]); SQRADDAC(a[9], a[50]); SQRADDAC(a[10], a[49]); SQRADDAC(a[11], a[48]); SQRADDAC(a[12], a[47]); SQRADDAC(a[13], a[46]); SQRADDAC(a[14], a[45]); SQRADDAC(a[15], a[44]); SQRADDAC(a[16], a[43]); SQRADDAC(a[17], a[42]); SQRADDAC(a[18], a[41]); SQRADDAC(a[19], a[40]); SQRADDAC(a[20], a[39]); SQRADDAC(a[21], a[38]); SQRADDAC(a[22], a[37]); SQRADDAC(a[23], a[36]); SQRADDAC(a[24], a[35]); SQRADDAC(a[25], a[34]); SQRADDAC(a[26], a[33]); SQRADDAC(a[27], a[32]); SQRADDAC(a[28], a[31]); SQRADDAC(a[29], a[30]); SQRADDDB; + COMBA_STORE(b[59]); + + /* output 60 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[60]); SQRADDAC(a[1], a[59]); SQRADDAC(a[2], a[58]); SQRADDAC(a[3], a[57]); SQRADDAC(a[4], a[56]); SQRADDAC(a[5], a[55]); SQRADDAC(a[6], a[54]); SQRADDAC(a[7], a[53]); SQRADDAC(a[8], a[52]); SQRADDAC(a[9], a[51]); SQRADDAC(a[10], a[50]); SQRADDAC(a[11], a[49]); SQRADDAC(a[12], a[48]); SQRADDAC(a[13], a[47]); SQRADDAC(a[14], a[46]); SQRADDAC(a[15], a[45]); SQRADDAC(a[16], a[44]); SQRADDAC(a[17], a[43]); SQRADDAC(a[18], a[42]); SQRADDAC(a[19], a[41]); SQRADDAC(a[20], a[40]); SQRADDAC(a[21], a[39]); SQRADDAC(a[22], a[38]); SQRADDAC(a[23], a[37]); SQRADDAC(a[24], a[36]); SQRADDAC(a[25], a[35]); SQRADDAC(a[26], a[34]); SQRADDAC(a[27], a[33]); SQRADDAC(a[28], a[32]); SQRADDAC(a[29], a[31]); SQRADDDB; SQRADD(a[30], a[30]); + COMBA_STORE(b[60]); + + /* output 61 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[61]); SQRADDAC(a[1], a[60]); SQRADDAC(a[2], a[59]); SQRADDAC(a[3], a[58]); SQRADDAC(a[4], a[57]); SQRADDAC(a[5], a[56]); SQRADDAC(a[6], a[55]); SQRADDAC(a[7], a[54]); SQRADDAC(a[8], a[53]); SQRADDAC(a[9], a[52]); SQRADDAC(a[10], a[51]); SQRADDAC(a[11], a[50]); SQRADDAC(a[12], a[49]); SQRADDAC(a[13], a[48]); SQRADDAC(a[14], a[47]); SQRADDAC(a[15], a[46]); SQRADDAC(a[16], a[45]); SQRADDAC(a[17], a[44]); SQRADDAC(a[18], a[43]); SQRADDAC(a[19], a[42]); SQRADDAC(a[20], a[41]); SQRADDAC(a[21], a[40]); SQRADDAC(a[22], a[39]); SQRADDAC(a[23], a[38]); SQRADDAC(a[24], a[37]); SQRADDAC(a[25], a[36]); SQRADDAC(a[26], a[35]); SQRADDAC(a[27], a[34]); SQRADDAC(a[28], a[33]); SQRADDAC(a[29], a[32]); SQRADDAC(a[30], a[31]); SQRADDDB; + COMBA_STORE(b[61]); + + /* output 62 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[62]); SQRADDAC(a[1], a[61]); SQRADDAC(a[2], a[60]); SQRADDAC(a[3], a[59]); SQRADDAC(a[4], a[58]); SQRADDAC(a[5], a[57]); SQRADDAC(a[6], a[56]); SQRADDAC(a[7], a[55]); SQRADDAC(a[8], a[54]); SQRADDAC(a[9], a[53]); SQRADDAC(a[10], a[52]); SQRADDAC(a[11], a[51]); SQRADDAC(a[12], a[50]); SQRADDAC(a[13], a[49]); SQRADDAC(a[14], a[48]); SQRADDAC(a[15], a[47]); SQRADDAC(a[16], a[46]); SQRADDAC(a[17], a[45]); SQRADDAC(a[18], a[44]); SQRADDAC(a[19], a[43]); SQRADDAC(a[20], a[42]); SQRADDAC(a[21], a[41]); SQRADDAC(a[22], a[40]); SQRADDAC(a[23], a[39]); SQRADDAC(a[24], a[38]); SQRADDAC(a[25], a[37]); SQRADDAC(a[26], a[36]); SQRADDAC(a[27], a[35]); SQRADDAC(a[28], a[34]); SQRADDAC(a[29], a[33]); SQRADDAC(a[30], a[32]); SQRADDDB; SQRADD(a[31], a[31]); + COMBA_STORE(b[62]); + + /* output 63 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[63]); SQRADDAC(a[1], a[62]); SQRADDAC(a[2], a[61]); SQRADDAC(a[3], a[60]); SQRADDAC(a[4], a[59]); SQRADDAC(a[5], a[58]); SQRADDAC(a[6], a[57]); SQRADDAC(a[7], a[56]); SQRADDAC(a[8], a[55]); SQRADDAC(a[9], a[54]); SQRADDAC(a[10], a[53]); SQRADDAC(a[11], a[52]); SQRADDAC(a[12], a[51]); SQRADDAC(a[13], a[50]); SQRADDAC(a[14], a[49]); SQRADDAC(a[15], a[48]); SQRADDAC(a[16], a[47]); SQRADDAC(a[17], a[46]); SQRADDAC(a[18], a[45]); SQRADDAC(a[19], a[44]); SQRADDAC(a[20], a[43]); SQRADDAC(a[21], a[42]); SQRADDAC(a[22], a[41]); SQRADDAC(a[23], a[40]); SQRADDAC(a[24], a[39]); SQRADDAC(a[25], a[38]); SQRADDAC(a[26], a[37]); SQRADDAC(a[27], a[36]); SQRADDAC(a[28], a[35]); SQRADDAC(a[29], a[34]); SQRADDAC(a[30], a[33]); SQRADDAC(a[31], a[32]); SQRADDDB; + COMBA_STORE(b[63]); + + /* output 64 */ + CARRY_FORWARD; + SQRADDSC(a[1], a[63]); SQRADDAC(a[2], a[62]); SQRADDAC(a[3], a[61]); SQRADDAC(a[4], a[60]); SQRADDAC(a[5], a[59]); SQRADDAC(a[6], a[58]); SQRADDAC(a[7], a[57]); SQRADDAC(a[8], a[56]); SQRADDAC(a[9], a[55]); SQRADDAC(a[10], a[54]); SQRADDAC(a[11], a[53]); SQRADDAC(a[12], a[52]); SQRADDAC(a[13], a[51]); SQRADDAC(a[14], a[50]); SQRADDAC(a[15], a[49]); SQRADDAC(a[16], a[48]); SQRADDAC(a[17], a[47]); SQRADDAC(a[18], a[46]); SQRADDAC(a[19], a[45]); SQRADDAC(a[20], a[44]); SQRADDAC(a[21], a[43]); SQRADDAC(a[22], a[42]); SQRADDAC(a[23], a[41]); SQRADDAC(a[24], a[40]); SQRADDAC(a[25], a[39]); SQRADDAC(a[26], a[38]); SQRADDAC(a[27], a[37]); SQRADDAC(a[28], a[36]); SQRADDAC(a[29], a[35]); SQRADDAC(a[30], a[34]); SQRADDAC(a[31], a[33]); SQRADDDB; SQRADD(a[32], a[32]); + COMBA_STORE(b[64]); + + /* output 65 */ + CARRY_FORWARD; + SQRADDSC(a[2], a[63]); SQRADDAC(a[3], a[62]); SQRADDAC(a[4], a[61]); SQRADDAC(a[5], a[60]); SQRADDAC(a[6], a[59]); SQRADDAC(a[7], a[58]); SQRADDAC(a[8], a[57]); SQRADDAC(a[9], a[56]); SQRADDAC(a[10], a[55]); SQRADDAC(a[11], a[54]); SQRADDAC(a[12], a[53]); SQRADDAC(a[13], a[52]); SQRADDAC(a[14], a[51]); SQRADDAC(a[15], a[50]); SQRADDAC(a[16], a[49]); SQRADDAC(a[17], a[48]); SQRADDAC(a[18], a[47]); SQRADDAC(a[19], a[46]); SQRADDAC(a[20], a[45]); SQRADDAC(a[21], a[44]); SQRADDAC(a[22], a[43]); SQRADDAC(a[23], a[42]); SQRADDAC(a[24], a[41]); SQRADDAC(a[25], a[40]); SQRADDAC(a[26], a[39]); SQRADDAC(a[27], a[38]); SQRADDAC(a[28], a[37]); SQRADDAC(a[29], a[36]); SQRADDAC(a[30], a[35]); SQRADDAC(a[31], a[34]); SQRADDAC(a[32], a[33]); SQRADDDB; + COMBA_STORE(b[65]); + + /* output 66 */ + CARRY_FORWARD; + SQRADDSC(a[3], a[63]); SQRADDAC(a[4], a[62]); SQRADDAC(a[5], a[61]); SQRADDAC(a[6], a[60]); SQRADDAC(a[7], a[59]); SQRADDAC(a[8], a[58]); SQRADDAC(a[9], a[57]); SQRADDAC(a[10], a[56]); SQRADDAC(a[11], a[55]); SQRADDAC(a[12], a[54]); SQRADDAC(a[13], a[53]); SQRADDAC(a[14], a[52]); SQRADDAC(a[15], a[51]); SQRADDAC(a[16], a[50]); SQRADDAC(a[17], a[49]); SQRADDAC(a[18], a[48]); SQRADDAC(a[19], a[47]); SQRADDAC(a[20], a[46]); SQRADDAC(a[21], a[45]); SQRADDAC(a[22], a[44]); SQRADDAC(a[23], a[43]); SQRADDAC(a[24], a[42]); SQRADDAC(a[25], a[41]); SQRADDAC(a[26], a[40]); SQRADDAC(a[27], a[39]); SQRADDAC(a[28], a[38]); SQRADDAC(a[29], a[37]); SQRADDAC(a[30], a[36]); SQRADDAC(a[31], a[35]); SQRADDAC(a[32], a[34]); SQRADDDB; SQRADD(a[33], a[33]); + COMBA_STORE(b[66]); + + /* output 67 */ + CARRY_FORWARD; + SQRADDSC(a[4], a[63]); SQRADDAC(a[5], a[62]); SQRADDAC(a[6], a[61]); SQRADDAC(a[7], a[60]); SQRADDAC(a[8], a[59]); SQRADDAC(a[9], a[58]); SQRADDAC(a[10], a[57]); SQRADDAC(a[11], a[56]); SQRADDAC(a[12], a[55]); SQRADDAC(a[13], a[54]); SQRADDAC(a[14], a[53]); SQRADDAC(a[15], a[52]); SQRADDAC(a[16], a[51]); SQRADDAC(a[17], a[50]); SQRADDAC(a[18], a[49]); SQRADDAC(a[19], a[48]); SQRADDAC(a[20], a[47]); SQRADDAC(a[21], a[46]); SQRADDAC(a[22], a[45]); SQRADDAC(a[23], a[44]); SQRADDAC(a[24], a[43]); SQRADDAC(a[25], a[42]); SQRADDAC(a[26], a[41]); SQRADDAC(a[27], a[40]); SQRADDAC(a[28], a[39]); SQRADDAC(a[29], a[38]); SQRADDAC(a[30], a[37]); SQRADDAC(a[31], a[36]); SQRADDAC(a[32], a[35]); SQRADDAC(a[33], a[34]); SQRADDDB; + COMBA_STORE(b[67]); + + /* output 68 */ + CARRY_FORWARD; + SQRADDSC(a[5], a[63]); SQRADDAC(a[6], a[62]); SQRADDAC(a[7], a[61]); SQRADDAC(a[8], a[60]); SQRADDAC(a[9], a[59]); SQRADDAC(a[10], a[58]); SQRADDAC(a[11], a[57]); SQRADDAC(a[12], a[56]); SQRADDAC(a[13], a[55]); SQRADDAC(a[14], a[54]); SQRADDAC(a[15], a[53]); SQRADDAC(a[16], a[52]); SQRADDAC(a[17], a[51]); SQRADDAC(a[18], a[50]); SQRADDAC(a[19], a[49]); SQRADDAC(a[20], a[48]); SQRADDAC(a[21], a[47]); SQRADDAC(a[22], a[46]); SQRADDAC(a[23], a[45]); SQRADDAC(a[24], a[44]); SQRADDAC(a[25], a[43]); SQRADDAC(a[26], a[42]); SQRADDAC(a[27], a[41]); SQRADDAC(a[28], a[40]); SQRADDAC(a[29], a[39]); SQRADDAC(a[30], a[38]); SQRADDAC(a[31], a[37]); SQRADDAC(a[32], a[36]); SQRADDAC(a[33], a[35]); SQRADDDB; SQRADD(a[34], a[34]); + COMBA_STORE(b[68]); + + /* output 69 */ + CARRY_FORWARD; + SQRADDSC(a[6], a[63]); SQRADDAC(a[7], a[62]); SQRADDAC(a[8], a[61]); SQRADDAC(a[9], a[60]); SQRADDAC(a[10], a[59]); SQRADDAC(a[11], a[58]); SQRADDAC(a[12], a[57]); SQRADDAC(a[13], a[56]); SQRADDAC(a[14], a[55]); SQRADDAC(a[15], a[54]); SQRADDAC(a[16], a[53]); SQRADDAC(a[17], a[52]); SQRADDAC(a[18], a[51]); SQRADDAC(a[19], a[50]); SQRADDAC(a[20], a[49]); SQRADDAC(a[21], a[48]); SQRADDAC(a[22], a[47]); SQRADDAC(a[23], a[46]); SQRADDAC(a[24], a[45]); SQRADDAC(a[25], a[44]); SQRADDAC(a[26], a[43]); SQRADDAC(a[27], a[42]); SQRADDAC(a[28], a[41]); SQRADDAC(a[29], a[40]); SQRADDAC(a[30], a[39]); SQRADDAC(a[31], a[38]); SQRADDAC(a[32], a[37]); SQRADDAC(a[33], a[36]); SQRADDAC(a[34], a[35]); SQRADDDB; + COMBA_STORE(b[69]); + + /* output 70 */ + CARRY_FORWARD; + SQRADDSC(a[7], a[63]); SQRADDAC(a[8], a[62]); SQRADDAC(a[9], a[61]); SQRADDAC(a[10], a[60]); SQRADDAC(a[11], a[59]); SQRADDAC(a[12], a[58]); SQRADDAC(a[13], a[57]); SQRADDAC(a[14], a[56]); SQRADDAC(a[15], a[55]); SQRADDAC(a[16], a[54]); SQRADDAC(a[17], a[53]); SQRADDAC(a[18], a[52]); SQRADDAC(a[19], a[51]); SQRADDAC(a[20], a[50]); SQRADDAC(a[21], a[49]); SQRADDAC(a[22], a[48]); SQRADDAC(a[23], a[47]); SQRADDAC(a[24], a[46]); SQRADDAC(a[25], a[45]); SQRADDAC(a[26], a[44]); SQRADDAC(a[27], a[43]); SQRADDAC(a[28], a[42]); SQRADDAC(a[29], a[41]); SQRADDAC(a[30], a[40]); SQRADDAC(a[31], a[39]); SQRADDAC(a[32], a[38]); SQRADDAC(a[33], a[37]); SQRADDAC(a[34], a[36]); SQRADDDB; SQRADD(a[35], a[35]); + COMBA_STORE(b[70]); + + /* output 71 */ + CARRY_FORWARD; + SQRADDSC(a[8], a[63]); SQRADDAC(a[9], a[62]); SQRADDAC(a[10], a[61]); SQRADDAC(a[11], a[60]); SQRADDAC(a[12], a[59]); SQRADDAC(a[13], a[58]); SQRADDAC(a[14], a[57]); SQRADDAC(a[15], a[56]); SQRADDAC(a[16], a[55]); SQRADDAC(a[17], a[54]); SQRADDAC(a[18], a[53]); SQRADDAC(a[19], a[52]); SQRADDAC(a[20], a[51]); SQRADDAC(a[21], a[50]); SQRADDAC(a[22], a[49]); SQRADDAC(a[23], a[48]); SQRADDAC(a[24], a[47]); SQRADDAC(a[25], a[46]); SQRADDAC(a[26], a[45]); SQRADDAC(a[27], a[44]); SQRADDAC(a[28], a[43]); SQRADDAC(a[29], a[42]); SQRADDAC(a[30], a[41]); SQRADDAC(a[31], a[40]); SQRADDAC(a[32], a[39]); SQRADDAC(a[33], a[38]); SQRADDAC(a[34], a[37]); SQRADDAC(a[35], a[36]); SQRADDDB; + COMBA_STORE(b[71]); + + /* output 72 */ + CARRY_FORWARD; + SQRADDSC(a[9], a[63]); SQRADDAC(a[10], a[62]); SQRADDAC(a[11], a[61]); SQRADDAC(a[12], a[60]); SQRADDAC(a[13], a[59]); SQRADDAC(a[14], a[58]); SQRADDAC(a[15], a[57]); SQRADDAC(a[16], a[56]); SQRADDAC(a[17], a[55]); SQRADDAC(a[18], a[54]); SQRADDAC(a[19], a[53]); SQRADDAC(a[20], a[52]); SQRADDAC(a[21], a[51]); SQRADDAC(a[22], a[50]); SQRADDAC(a[23], a[49]); SQRADDAC(a[24], a[48]); SQRADDAC(a[25], a[47]); SQRADDAC(a[26], a[46]); SQRADDAC(a[27], a[45]); SQRADDAC(a[28], a[44]); SQRADDAC(a[29], a[43]); SQRADDAC(a[30], a[42]); SQRADDAC(a[31], a[41]); SQRADDAC(a[32], a[40]); SQRADDAC(a[33], a[39]); SQRADDAC(a[34], a[38]); SQRADDAC(a[35], a[37]); SQRADDDB; SQRADD(a[36], a[36]); + COMBA_STORE(b[72]); + + /* output 73 */ + CARRY_FORWARD; + SQRADDSC(a[10], a[63]); SQRADDAC(a[11], a[62]); SQRADDAC(a[12], a[61]); SQRADDAC(a[13], a[60]); SQRADDAC(a[14], a[59]); SQRADDAC(a[15], a[58]); SQRADDAC(a[16], a[57]); SQRADDAC(a[17], a[56]); SQRADDAC(a[18], a[55]); SQRADDAC(a[19], a[54]); SQRADDAC(a[20], a[53]); SQRADDAC(a[21], a[52]); SQRADDAC(a[22], a[51]); SQRADDAC(a[23], a[50]); SQRADDAC(a[24], a[49]); SQRADDAC(a[25], a[48]); SQRADDAC(a[26], a[47]); SQRADDAC(a[27], a[46]); SQRADDAC(a[28], a[45]); SQRADDAC(a[29], a[44]); SQRADDAC(a[30], a[43]); SQRADDAC(a[31], a[42]); SQRADDAC(a[32], a[41]); SQRADDAC(a[33], a[40]); SQRADDAC(a[34], a[39]); SQRADDAC(a[35], a[38]); SQRADDAC(a[36], a[37]); SQRADDDB; + COMBA_STORE(b[73]); + + /* output 74 */ + CARRY_FORWARD; + SQRADDSC(a[11], a[63]); SQRADDAC(a[12], a[62]); SQRADDAC(a[13], a[61]); SQRADDAC(a[14], a[60]); SQRADDAC(a[15], a[59]); SQRADDAC(a[16], a[58]); SQRADDAC(a[17], a[57]); SQRADDAC(a[18], a[56]); SQRADDAC(a[19], a[55]); SQRADDAC(a[20], a[54]); SQRADDAC(a[21], a[53]); SQRADDAC(a[22], a[52]); SQRADDAC(a[23], a[51]); SQRADDAC(a[24], a[50]); SQRADDAC(a[25], a[49]); SQRADDAC(a[26], a[48]); SQRADDAC(a[27], a[47]); SQRADDAC(a[28], a[46]); SQRADDAC(a[29], a[45]); SQRADDAC(a[30], a[44]); SQRADDAC(a[31], a[43]); SQRADDAC(a[32], a[42]); SQRADDAC(a[33], a[41]); SQRADDAC(a[34], a[40]); SQRADDAC(a[35], a[39]); SQRADDAC(a[36], a[38]); SQRADDDB; SQRADD(a[37], a[37]); + COMBA_STORE(b[74]); + + /* output 75 */ + CARRY_FORWARD; + SQRADDSC(a[12], a[63]); SQRADDAC(a[13], a[62]); SQRADDAC(a[14], a[61]); SQRADDAC(a[15], a[60]); SQRADDAC(a[16], a[59]); SQRADDAC(a[17], a[58]); SQRADDAC(a[18], a[57]); SQRADDAC(a[19], a[56]); SQRADDAC(a[20], a[55]); SQRADDAC(a[21], a[54]); SQRADDAC(a[22], a[53]); SQRADDAC(a[23], a[52]); SQRADDAC(a[24], a[51]); SQRADDAC(a[25], a[50]); SQRADDAC(a[26], a[49]); SQRADDAC(a[27], a[48]); SQRADDAC(a[28], a[47]); SQRADDAC(a[29], a[46]); SQRADDAC(a[30], a[45]); SQRADDAC(a[31], a[44]); SQRADDAC(a[32], a[43]); SQRADDAC(a[33], a[42]); SQRADDAC(a[34], a[41]); SQRADDAC(a[35], a[40]); SQRADDAC(a[36], a[39]); SQRADDAC(a[37], a[38]); SQRADDDB; + COMBA_STORE(b[75]); + + /* output 76 */ + CARRY_FORWARD; + SQRADDSC(a[13], a[63]); SQRADDAC(a[14], a[62]); SQRADDAC(a[15], a[61]); SQRADDAC(a[16], a[60]); SQRADDAC(a[17], a[59]); SQRADDAC(a[18], a[58]); SQRADDAC(a[19], a[57]); SQRADDAC(a[20], a[56]); SQRADDAC(a[21], a[55]); SQRADDAC(a[22], a[54]); SQRADDAC(a[23], a[53]); SQRADDAC(a[24], a[52]); SQRADDAC(a[25], a[51]); SQRADDAC(a[26], a[50]); SQRADDAC(a[27], a[49]); SQRADDAC(a[28], a[48]); SQRADDAC(a[29], a[47]); SQRADDAC(a[30], a[46]); SQRADDAC(a[31], a[45]); SQRADDAC(a[32], a[44]); SQRADDAC(a[33], a[43]); SQRADDAC(a[34], a[42]); SQRADDAC(a[35], a[41]); SQRADDAC(a[36], a[40]); SQRADDAC(a[37], a[39]); SQRADDDB; SQRADD(a[38], a[38]); + COMBA_STORE(b[76]); + + /* output 77 */ + CARRY_FORWARD; + SQRADDSC(a[14], a[63]); SQRADDAC(a[15], a[62]); SQRADDAC(a[16], a[61]); SQRADDAC(a[17], a[60]); SQRADDAC(a[18], a[59]); SQRADDAC(a[19], a[58]); SQRADDAC(a[20], a[57]); SQRADDAC(a[21], a[56]); SQRADDAC(a[22], a[55]); SQRADDAC(a[23], a[54]); SQRADDAC(a[24], a[53]); SQRADDAC(a[25], a[52]); SQRADDAC(a[26], a[51]); SQRADDAC(a[27], a[50]); SQRADDAC(a[28], a[49]); SQRADDAC(a[29], a[48]); SQRADDAC(a[30], a[47]); SQRADDAC(a[31], a[46]); SQRADDAC(a[32], a[45]); SQRADDAC(a[33], a[44]); SQRADDAC(a[34], a[43]); SQRADDAC(a[35], a[42]); SQRADDAC(a[36], a[41]); SQRADDAC(a[37], a[40]); SQRADDAC(a[38], a[39]); SQRADDDB; + COMBA_STORE(b[77]); + + /* output 78 */ + CARRY_FORWARD; + SQRADDSC(a[15], a[63]); SQRADDAC(a[16], a[62]); SQRADDAC(a[17], a[61]); SQRADDAC(a[18], a[60]); SQRADDAC(a[19], a[59]); SQRADDAC(a[20], a[58]); SQRADDAC(a[21], a[57]); SQRADDAC(a[22], a[56]); SQRADDAC(a[23], a[55]); SQRADDAC(a[24], a[54]); SQRADDAC(a[25], a[53]); SQRADDAC(a[26], a[52]); SQRADDAC(a[27], a[51]); SQRADDAC(a[28], a[50]); SQRADDAC(a[29], a[49]); SQRADDAC(a[30], a[48]); SQRADDAC(a[31], a[47]); SQRADDAC(a[32], a[46]); SQRADDAC(a[33], a[45]); SQRADDAC(a[34], a[44]); SQRADDAC(a[35], a[43]); SQRADDAC(a[36], a[42]); SQRADDAC(a[37], a[41]); SQRADDAC(a[38], a[40]); SQRADDDB; SQRADD(a[39], a[39]); + COMBA_STORE(b[78]); + + /* output 79 */ + CARRY_FORWARD; + SQRADDSC(a[16], a[63]); SQRADDAC(a[17], a[62]); SQRADDAC(a[18], a[61]); SQRADDAC(a[19], a[60]); SQRADDAC(a[20], a[59]); SQRADDAC(a[21], a[58]); SQRADDAC(a[22], a[57]); SQRADDAC(a[23], a[56]); SQRADDAC(a[24], a[55]); SQRADDAC(a[25], a[54]); SQRADDAC(a[26], a[53]); SQRADDAC(a[27], a[52]); SQRADDAC(a[28], a[51]); SQRADDAC(a[29], a[50]); SQRADDAC(a[30], a[49]); SQRADDAC(a[31], a[48]); SQRADDAC(a[32], a[47]); SQRADDAC(a[33], a[46]); SQRADDAC(a[34], a[45]); SQRADDAC(a[35], a[44]); SQRADDAC(a[36], a[43]); SQRADDAC(a[37], a[42]); SQRADDAC(a[38], a[41]); SQRADDAC(a[39], a[40]); SQRADDDB; + COMBA_STORE(b[79]); + + /* output 80 */ + CARRY_FORWARD; + SQRADDSC(a[17], a[63]); SQRADDAC(a[18], a[62]); SQRADDAC(a[19], a[61]); SQRADDAC(a[20], a[60]); SQRADDAC(a[21], a[59]); SQRADDAC(a[22], a[58]); SQRADDAC(a[23], a[57]); SQRADDAC(a[24], a[56]); SQRADDAC(a[25], a[55]); SQRADDAC(a[26], a[54]); SQRADDAC(a[27], a[53]); SQRADDAC(a[28], a[52]); SQRADDAC(a[29], a[51]); SQRADDAC(a[30], a[50]); SQRADDAC(a[31], a[49]); SQRADDAC(a[32], a[48]); SQRADDAC(a[33], a[47]); SQRADDAC(a[34], a[46]); SQRADDAC(a[35], a[45]); SQRADDAC(a[36], a[44]); SQRADDAC(a[37], a[43]); SQRADDAC(a[38], a[42]); SQRADDAC(a[39], a[41]); SQRADDDB; SQRADD(a[40], a[40]); + COMBA_STORE(b[80]); + + /* output 81 */ + CARRY_FORWARD; + SQRADDSC(a[18], a[63]); SQRADDAC(a[19], a[62]); SQRADDAC(a[20], a[61]); SQRADDAC(a[21], a[60]); SQRADDAC(a[22], a[59]); SQRADDAC(a[23], a[58]); SQRADDAC(a[24], a[57]); SQRADDAC(a[25], a[56]); SQRADDAC(a[26], a[55]); SQRADDAC(a[27], a[54]); SQRADDAC(a[28], a[53]); SQRADDAC(a[29], a[52]); SQRADDAC(a[30], a[51]); SQRADDAC(a[31], a[50]); SQRADDAC(a[32], a[49]); SQRADDAC(a[33], a[48]); SQRADDAC(a[34], a[47]); SQRADDAC(a[35], a[46]); SQRADDAC(a[36], a[45]); SQRADDAC(a[37], a[44]); SQRADDAC(a[38], a[43]); SQRADDAC(a[39], a[42]); SQRADDAC(a[40], a[41]); SQRADDDB; + COMBA_STORE(b[81]); + + /* output 82 */ + CARRY_FORWARD; + SQRADDSC(a[19], a[63]); SQRADDAC(a[20], a[62]); SQRADDAC(a[21], a[61]); SQRADDAC(a[22], a[60]); SQRADDAC(a[23], a[59]); SQRADDAC(a[24], a[58]); SQRADDAC(a[25], a[57]); SQRADDAC(a[26], a[56]); SQRADDAC(a[27], a[55]); SQRADDAC(a[28], a[54]); SQRADDAC(a[29], a[53]); SQRADDAC(a[30], a[52]); SQRADDAC(a[31], a[51]); SQRADDAC(a[32], a[50]); SQRADDAC(a[33], a[49]); SQRADDAC(a[34], a[48]); SQRADDAC(a[35], a[47]); SQRADDAC(a[36], a[46]); SQRADDAC(a[37], a[45]); SQRADDAC(a[38], a[44]); SQRADDAC(a[39], a[43]); SQRADDAC(a[40], a[42]); SQRADDDB; SQRADD(a[41], a[41]); + COMBA_STORE(b[82]); + + /* output 83 */ + CARRY_FORWARD; + SQRADDSC(a[20], a[63]); SQRADDAC(a[21], a[62]); SQRADDAC(a[22], a[61]); SQRADDAC(a[23], a[60]); SQRADDAC(a[24], a[59]); SQRADDAC(a[25], a[58]); SQRADDAC(a[26], a[57]); SQRADDAC(a[27], a[56]); SQRADDAC(a[28], a[55]); SQRADDAC(a[29], a[54]); SQRADDAC(a[30], a[53]); SQRADDAC(a[31], a[52]); SQRADDAC(a[32], a[51]); SQRADDAC(a[33], a[50]); SQRADDAC(a[34], a[49]); SQRADDAC(a[35], a[48]); SQRADDAC(a[36], a[47]); SQRADDAC(a[37], a[46]); SQRADDAC(a[38], a[45]); SQRADDAC(a[39], a[44]); SQRADDAC(a[40], a[43]); SQRADDAC(a[41], a[42]); SQRADDDB; + COMBA_STORE(b[83]); + + /* output 84 */ + CARRY_FORWARD; + SQRADDSC(a[21], a[63]); SQRADDAC(a[22], a[62]); SQRADDAC(a[23], a[61]); SQRADDAC(a[24], a[60]); SQRADDAC(a[25], a[59]); SQRADDAC(a[26], a[58]); SQRADDAC(a[27], a[57]); SQRADDAC(a[28], a[56]); SQRADDAC(a[29], a[55]); SQRADDAC(a[30], a[54]); SQRADDAC(a[31], a[53]); SQRADDAC(a[32], a[52]); SQRADDAC(a[33], a[51]); SQRADDAC(a[34], a[50]); SQRADDAC(a[35], a[49]); SQRADDAC(a[36], a[48]); SQRADDAC(a[37], a[47]); SQRADDAC(a[38], a[46]); SQRADDAC(a[39], a[45]); SQRADDAC(a[40], a[44]); SQRADDAC(a[41], a[43]); SQRADDDB; SQRADD(a[42], a[42]); + COMBA_STORE(b[84]); + + /* output 85 */ + CARRY_FORWARD; + SQRADDSC(a[22], a[63]); SQRADDAC(a[23], a[62]); SQRADDAC(a[24], a[61]); SQRADDAC(a[25], a[60]); SQRADDAC(a[26], a[59]); SQRADDAC(a[27], a[58]); SQRADDAC(a[28], a[57]); SQRADDAC(a[29], a[56]); SQRADDAC(a[30], a[55]); SQRADDAC(a[31], a[54]); SQRADDAC(a[32], a[53]); SQRADDAC(a[33], a[52]); SQRADDAC(a[34], a[51]); SQRADDAC(a[35], a[50]); SQRADDAC(a[36], a[49]); SQRADDAC(a[37], a[48]); SQRADDAC(a[38], a[47]); SQRADDAC(a[39], a[46]); SQRADDAC(a[40], a[45]); SQRADDAC(a[41], a[44]); SQRADDAC(a[42], a[43]); SQRADDDB; + COMBA_STORE(b[85]); + + /* output 86 */ + CARRY_FORWARD; + SQRADDSC(a[23], a[63]); SQRADDAC(a[24], a[62]); SQRADDAC(a[25], a[61]); SQRADDAC(a[26], a[60]); SQRADDAC(a[27], a[59]); SQRADDAC(a[28], a[58]); SQRADDAC(a[29], a[57]); SQRADDAC(a[30], a[56]); SQRADDAC(a[31], a[55]); SQRADDAC(a[32], a[54]); SQRADDAC(a[33], a[53]); SQRADDAC(a[34], a[52]); SQRADDAC(a[35], a[51]); SQRADDAC(a[36], a[50]); SQRADDAC(a[37], a[49]); SQRADDAC(a[38], a[48]); SQRADDAC(a[39], a[47]); SQRADDAC(a[40], a[46]); SQRADDAC(a[41], a[45]); SQRADDAC(a[42], a[44]); SQRADDDB; SQRADD(a[43], a[43]); + COMBA_STORE(b[86]); + + /* output 87 */ + CARRY_FORWARD; + SQRADDSC(a[24], a[63]); SQRADDAC(a[25], a[62]); SQRADDAC(a[26], a[61]); SQRADDAC(a[27], a[60]); SQRADDAC(a[28], a[59]); SQRADDAC(a[29], a[58]); SQRADDAC(a[30], a[57]); SQRADDAC(a[31], a[56]); SQRADDAC(a[32], a[55]); SQRADDAC(a[33], a[54]); SQRADDAC(a[34], a[53]); SQRADDAC(a[35], a[52]); SQRADDAC(a[36], a[51]); SQRADDAC(a[37], a[50]); SQRADDAC(a[38], a[49]); SQRADDAC(a[39], a[48]); SQRADDAC(a[40], a[47]); SQRADDAC(a[41], a[46]); SQRADDAC(a[42], a[45]); SQRADDAC(a[43], a[44]); SQRADDDB; + COMBA_STORE(b[87]); + + /* output 88 */ + CARRY_FORWARD; + SQRADDSC(a[25], a[63]); SQRADDAC(a[26], a[62]); SQRADDAC(a[27], a[61]); SQRADDAC(a[28], a[60]); SQRADDAC(a[29], a[59]); SQRADDAC(a[30], a[58]); SQRADDAC(a[31], a[57]); SQRADDAC(a[32], a[56]); SQRADDAC(a[33], a[55]); SQRADDAC(a[34], a[54]); SQRADDAC(a[35], a[53]); SQRADDAC(a[36], a[52]); SQRADDAC(a[37], a[51]); SQRADDAC(a[38], a[50]); SQRADDAC(a[39], a[49]); SQRADDAC(a[40], a[48]); SQRADDAC(a[41], a[47]); SQRADDAC(a[42], a[46]); SQRADDAC(a[43], a[45]); SQRADDDB; SQRADD(a[44], a[44]); + COMBA_STORE(b[88]); + + /* output 89 */ + CARRY_FORWARD; + SQRADDSC(a[26], a[63]); SQRADDAC(a[27], a[62]); SQRADDAC(a[28], a[61]); SQRADDAC(a[29], a[60]); SQRADDAC(a[30], a[59]); SQRADDAC(a[31], a[58]); SQRADDAC(a[32], a[57]); SQRADDAC(a[33], a[56]); SQRADDAC(a[34], a[55]); SQRADDAC(a[35], a[54]); SQRADDAC(a[36], a[53]); SQRADDAC(a[37], a[52]); SQRADDAC(a[38], a[51]); SQRADDAC(a[39], a[50]); SQRADDAC(a[40], a[49]); SQRADDAC(a[41], a[48]); SQRADDAC(a[42], a[47]); SQRADDAC(a[43], a[46]); SQRADDAC(a[44], a[45]); SQRADDDB; + COMBA_STORE(b[89]); + + /* output 90 */ + CARRY_FORWARD; + SQRADDSC(a[27], a[63]); SQRADDAC(a[28], a[62]); SQRADDAC(a[29], a[61]); SQRADDAC(a[30], a[60]); SQRADDAC(a[31], a[59]); SQRADDAC(a[32], a[58]); SQRADDAC(a[33], a[57]); SQRADDAC(a[34], a[56]); SQRADDAC(a[35], a[55]); SQRADDAC(a[36], a[54]); SQRADDAC(a[37], a[53]); SQRADDAC(a[38], a[52]); SQRADDAC(a[39], a[51]); SQRADDAC(a[40], a[50]); SQRADDAC(a[41], a[49]); SQRADDAC(a[42], a[48]); SQRADDAC(a[43], a[47]); SQRADDAC(a[44], a[46]); SQRADDDB; SQRADD(a[45], a[45]); + COMBA_STORE(b[90]); + + /* output 91 */ + CARRY_FORWARD; + SQRADDSC(a[28], a[63]); SQRADDAC(a[29], a[62]); SQRADDAC(a[30], a[61]); SQRADDAC(a[31], a[60]); SQRADDAC(a[32], a[59]); SQRADDAC(a[33], a[58]); SQRADDAC(a[34], a[57]); SQRADDAC(a[35], a[56]); SQRADDAC(a[36], a[55]); SQRADDAC(a[37], a[54]); SQRADDAC(a[38], a[53]); SQRADDAC(a[39], a[52]); SQRADDAC(a[40], a[51]); SQRADDAC(a[41], a[50]); SQRADDAC(a[42], a[49]); SQRADDAC(a[43], a[48]); SQRADDAC(a[44], a[47]); SQRADDAC(a[45], a[46]); SQRADDDB; + COMBA_STORE(b[91]); + + /* output 92 */ + CARRY_FORWARD; + SQRADDSC(a[29], a[63]); SQRADDAC(a[30], a[62]); SQRADDAC(a[31], a[61]); SQRADDAC(a[32], a[60]); SQRADDAC(a[33], a[59]); SQRADDAC(a[34], a[58]); SQRADDAC(a[35], a[57]); SQRADDAC(a[36], a[56]); SQRADDAC(a[37], a[55]); SQRADDAC(a[38], a[54]); SQRADDAC(a[39], a[53]); SQRADDAC(a[40], a[52]); SQRADDAC(a[41], a[51]); SQRADDAC(a[42], a[50]); SQRADDAC(a[43], a[49]); SQRADDAC(a[44], a[48]); SQRADDAC(a[45], a[47]); SQRADDDB; SQRADD(a[46], a[46]); + COMBA_STORE(b[92]); + + /* output 93 */ + CARRY_FORWARD; + SQRADDSC(a[30], a[63]); SQRADDAC(a[31], a[62]); SQRADDAC(a[32], a[61]); SQRADDAC(a[33], a[60]); SQRADDAC(a[34], a[59]); SQRADDAC(a[35], a[58]); SQRADDAC(a[36], a[57]); SQRADDAC(a[37], a[56]); SQRADDAC(a[38], a[55]); SQRADDAC(a[39], a[54]); SQRADDAC(a[40], a[53]); SQRADDAC(a[41], a[52]); SQRADDAC(a[42], a[51]); SQRADDAC(a[43], a[50]); SQRADDAC(a[44], a[49]); SQRADDAC(a[45], a[48]); SQRADDAC(a[46], a[47]); SQRADDDB; + COMBA_STORE(b[93]); + + /* output 94 */ + CARRY_FORWARD; + SQRADDSC(a[31], a[63]); SQRADDAC(a[32], a[62]); SQRADDAC(a[33], a[61]); SQRADDAC(a[34], a[60]); SQRADDAC(a[35], a[59]); SQRADDAC(a[36], a[58]); SQRADDAC(a[37], a[57]); SQRADDAC(a[38], a[56]); SQRADDAC(a[39], a[55]); SQRADDAC(a[40], a[54]); SQRADDAC(a[41], a[53]); SQRADDAC(a[42], a[52]); SQRADDAC(a[43], a[51]); SQRADDAC(a[44], a[50]); SQRADDAC(a[45], a[49]); SQRADDAC(a[46], a[48]); SQRADDDB; SQRADD(a[47], a[47]); + COMBA_STORE(b[94]); + + /* output 95 */ + CARRY_FORWARD; + SQRADDSC(a[32], a[63]); SQRADDAC(a[33], a[62]); SQRADDAC(a[34], a[61]); SQRADDAC(a[35], a[60]); SQRADDAC(a[36], a[59]); SQRADDAC(a[37], a[58]); SQRADDAC(a[38], a[57]); SQRADDAC(a[39], a[56]); SQRADDAC(a[40], a[55]); SQRADDAC(a[41], a[54]); SQRADDAC(a[42], a[53]); SQRADDAC(a[43], a[52]); SQRADDAC(a[44], a[51]); SQRADDAC(a[45], a[50]); SQRADDAC(a[46], a[49]); SQRADDAC(a[47], a[48]); SQRADDDB; + COMBA_STORE(b[95]); + + /* output 96 */ + CARRY_FORWARD; + SQRADDSC(a[33], a[63]); SQRADDAC(a[34], a[62]); SQRADDAC(a[35], a[61]); SQRADDAC(a[36], a[60]); SQRADDAC(a[37], a[59]); SQRADDAC(a[38], a[58]); SQRADDAC(a[39], a[57]); SQRADDAC(a[40], a[56]); SQRADDAC(a[41], a[55]); SQRADDAC(a[42], a[54]); SQRADDAC(a[43], a[53]); SQRADDAC(a[44], a[52]); SQRADDAC(a[45], a[51]); SQRADDAC(a[46], a[50]); SQRADDAC(a[47], a[49]); SQRADDDB; SQRADD(a[48], a[48]); + COMBA_STORE(b[96]); + + /* output 97 */ + CARRY_FORWARD; + SQRADDSC(a[34], a[63]); SQRADDAC(a[35], a[62]); SQRADDAC(a[36], a[61]); SQRADDAC(a[37], a[60]); SQRADDAC(a[38], a[59]); SQRADDAC(a[39], a[58]); SQRADDAC(a[40], a[57]); SQRADDAC(a[41], a[56]); SQRADDAC(a[42], a[55]); SQRADDAC(a[43], a[54]); SQRADDAC(a[44], a[53]); SQRADDAC(a[45], a[52]); SQRADDAC(a[46], a[51]); SQRADDAC(a[47], a[50]); SQRADDAC(a[48], a[49]); SQRADDDB; + COMBA_STORE(b[97]); + + /* output 98 */ + CARRY_FORWARD; + SQRADDSC(a[35], a[63]); SQRADDAC(a[36], a[62]); SQRADDAC(a[37], a[61]); SQRADDAC(a[38], a[60]); SQRADDAC(a[39], a[59]); SQRADDAC(a[40], a[58]); SQRADDAC(a[41], a[57]); SQRADDAC(a[42], a[56]); SQRADDAC(a[43], a[55]); SQRADDAC(a[44], a[54]); SQRADDAC(a[45], a[53]); SQRADDAC(a[46], a[52]); SQRADDAC(a[47], a[51]); SQRADDAC(a[48], a[50]); SQRADDDB; SQRADD(a[49], a[49]); + COMBA_STORE(b[98]); + + /* output 99 */ + CARRY_FORWARD; + SQRADDSC(a[36], a[63]); SQRADDAC(a[37], a[62]); SQRADDAC(a[38], a[61]); SQRADDAC(a[39], a[60]); SQRADDAC(a[40], a[59]); SQRADDAC(a[41], a[58]); SQRADDAC(a[42], a[57]); SQRADDAC(a[43], a[56]); SQRADDAC(a[44], a[55]); SQRADDAC(a[45], a[54]); SQRADDAC(a[46], a[53]); SQRADDAC(a[47], a[52]); SQRADDAC(a[48], a[51]); SQRADDAC(a[49], a[50]); SQRADDDB; + COMBA_STORE(b[99]); + + /* output 100 */ + CARRY_FORWARD; + SQRADDSC(a[37], a[63]); SQRADDAC(a[38], a[62]); SQRADDAC(a[39], a[61]); SQRADDAC(a[40], a[60]); SQRADDAC(a[41], a[59]); SQRADDAC(a[42], a[58]); SQRADDAC(a[43], a[57]); SQRADDAC(a[44], a[56]); SQRADDAC(a[45], a[55]); SQRADDAC(a[46], a[54]); SQRADDAC(a[47], a[53]); SQRADDAC(a[48], a[52]); SQRADDAC(a[49], a[51]); SQRADDDB; SQRADD(a[50], a[50]); + COMBA_STORE(b[100]); + + /* output 101 */ + CARRY_FORWARD; + SQRADDSC(a[38], a[63]); SQRADDAC(a[39], a[62]); SQRADDAC(a[40], a[61]); SQRADDAC(a[41], a[60]); SQRADDAC(a[42], a[59]); SQRADDAC(a[43], a[58]); SQRADDAC(a[44], a[57]); SQRADDAC(a[45], a[56]); SQRADDAC(a[46], a[55]); SQRADDAC(a[47], a[54]); SQRADDAC(a[48], a[53]); SQRADDAC(a[49], a[52]); SQRADDAC(a[50], a[51]); SQRADDDB; + COMBA_STORE(b[101]); + + /* output 102 */ + CARRY_FORWARD; + SQRADDSC(a[39], a[63]); SQRADDAC(a[40], a[62]); SQRADDAC(a[41], a[61]); SQRADDAC(a[42], a[60]); SQRADDAC(a[43], a[59]); SQRADDAC(a[44], a[58]); SQRADDAC(a[45], a[57]); SQRADDAC(a[46], a[56]); SQRADDAC(a[47], a[55]); SQRADDAC(a[48], a[54]); SQRADDAC(a[49], a[53]); SQRADDAC(a[50], a[52]); SQRADDDB; SQRADD(a[51], a[51]); + COMBA_STORE(b[102]); + + /* output 103 */ + CARRY_FORWARD; + SQRADDSC(a[40], a[63]); SQRADDAC(a[41], a[62]); SQRADDAC(a[42], a[61]); SQRADDAC(a[43], a[60]); SQRADDAC(a[44], a[59]); SQRADDAC(a[45], a[58]); SQRADDAC(a[46], a[57]); SQRADDAC(a[47], a[56]); SQRADDAC(a[48], a[55]); SQRADDAC(a[49], a[54]); SQRADDAC(a[50], a[53]); SQRADDAC(a[51], a[52]); SQRADDDB; + COMBA_STORE(b[103]); + + /* output 104 */ + CARRY_FORWARD; + SQRADDSC(a[41], a[63]); SQRADDAC(a[42], a[62]); SQRADDAC(a[43], a[61]); SQRADDAC(a[44], a[60]); SQRADDAC(a[45], a[59]); SQRADDAC(a[46], a[58]); SQRADDAC(a[47], a[57]); SQRADDAC(a[48], a[56]); SQRADDAC(a[49], a[55]); SQRADDAC(a[50], a[54]); SQRADDAC(a[51], a[53]); SQRADDDB; SQRADD(a[52], a[52]); + COMBA_STORE(b[104]); + + /* output 105 */ + CARRY_FORWARD; + SQRADDSC(a[42], a[63]); SQRADDAC(a[43], a[62]); SQRADDAC(a[44], a[61]); SQRADDAC(a[45], a[60]); SQRADDAC(a[46], a[59]); SQRADDAC(a[47], a[58]); SQRADDAC(a[48], a[57]); SQRADDAC(a[49], a[56]); SQRADDAC(a[50], a[55]); SQRADDAC(a[51], a[54]); SQRADDAC(a[52], a[53]); SQRADDDB; + COMBA_STORE(b[105]); + + /* output 106 */ + CARRY_FORWARD; + SQRADDSC(a[43], a[63]); SQRADDAC(a[44], a[62]); SQRADDAC(a[45], a[61]); SQRADDAC(a[46], a[60]); SQRADDAC(a[47], a[59]); SQRADDAC(a[48], a[58]); SQRADDAC(a[49], a[57]); SQRADDAC(a[50], a[56]); SQRADDAC(a[51], a[55]); SQRADDAC(a[52], a[54]); SQRADDDB; SQRADD(a[53], a[53]); + COMBA_STORE(b[106]); + + /* output 107 */ + CARRY_FORWARD; + SQRADDSC(a[44], a[63]); SQRADDAC(a[45], a[62]); SQRADDAC(a[46], a[61]); SQRADDAC(a[47], a[60]); SQRADDAC(a[48], a[59]); SQRADDAC(a[49], a[58]); SQRADDAC(a[50], a[57]); SQRADDAC(a[51], a[56]); SQRADDAC(a[52], a[55]); SQRADDAC(a[53], a[54]); SQRADDDB; + COMBA_STORE(b[107]); + + /* output 108 */ + CARRY_FORWARD; + SQRADDSC(a[45], a[63]); SQRADDAC(a[46], a[62]); SQRADDAC(a[47], a[61]); SQRADDAC(a[48], a[60]); SQRADDAC(a[49], a[59]); SQRADDAC(a[50], a[58]); SQRADDAC(a[51], a[57]); SQRADDAC(a[52], a[56]); SQRADDAC(a[53], a[55]); SQRADDDB; SQRADD(a[54], a[54]); + COMBA_STORE(b[108]); + + /* output 109 */ + CARRY_FORWARD; + SQRADDSC(a[46], a[63]); SQRADDAC(a[47], a[62]); SQRADDAC(a[48], a[61]); SQRADDAC(a[49], a[60]); SQRADDAC(a[50], a[59]); SQRADDAC(a[51], a[58]); SQRADDAC(a[52], a[57]); SQRADDAC(a[53], a[56]); SQRADDAC(a[54], a[55]); SQRADDDB; + COMBA_STORE(b[109]); + + /* output 110 */ + CARRY_FORWARD; + SQRADDSC(a[47], a[63]); SQRADDAC(a[48], a[62]); SQRADDAC(a[49], a[61]); SQRADDAC(a[50], a[60]); SQRADDAC(a[51], a[59]); SQRADDAC(a[52], a[58]); SQRADDAC(a[53], a[57]); SQRADDAC(a[54], a[56]); SQRADDDB; SQRADD(a[55], a[55]); + COMBA_STORE(b[110]); + + /* output 111 */ + CARRY_FORWARD; + SQRADDSC(a[48], a[63]); SQRADDAC(a[49], a[62]); SQRADDAC(a[50], a[61]); SQRADDAC(a[51], a[60]); SQRADDAC(a[52], a[59]); SQRADDAC(a[53], a[58]); SQRADDAC(a[54], a[57]); SQRADDAC(a[55], a[56]); SQRADDDB; + COMBA_STORE(b[111]); + + /* output 112 */ + CARRY_FORWARD; + SQRADDSC(a[49], a[63]); SQRADDAC(a[50], a[62]); SQRADDAC(a[51], a[61]); SQRADDAC(a[52], a[60]); SQRADDAC(a[53], a[59]); SQRADDAC(a[54], a[58]); SQRADDAC(a[55], a[57]); SQRADDDB; SQRADD(a[56], a[56]); + COMBA_STORE(b[112]); + + /* output 113 */ + CARRY_FORWARD; + SQRADDSC(a[50], a[63]); SQRADDAC(a[51], a[62]); SQRADDAC(a[52], a[61]); SQRADDAC(a[53], a[60]); SQRADDAC(a[54], a[59]); SQRADDAC(a[55], a[58]); SQRADDAC(a[56], a[57]); SQRADDDB; + COMBA_STORE(b[113]); + + /* output 114 */ + CARRY_FORWARD; + SQRADDSC(a[51], a[63]); SQRADDAC(a[52], a[62]); SQRADDAC(a[53], a[61]); SQRADDAC(a[54], a[60]); SQRADDAC(a[55], a[59]); SQRADDAC(a[56], a[58]); SQRADDDB; SQRADD(a[57], a[57]); + COMBA_STORE(b[114]); + + /* output 115 */ + CARRY_FORWARD; + SQRADDSC(a[52], a[63]); SQRADDAC(a[53], a[62]); SQRADDAC(a[54], a[61]); SQRADDAC(a[55], a[60]); SQRADDAC(a[56], a[59]); SQRADDAC(a[57], a[58]); SQRADDDB; + COMBA_STORE(b[115]); + + /* output 116 */ + CARRY_FORWARD; + SQRADDSC(a[53], a[63]); SQRADDAC(a[54], a[62]); SQRADDAC(a[55], a[61]); SQRADDAC(a[56], a[60]); SQRADDAC(a[57], a[59]); SQRADDDB; SQRADD(a[58], a[58]); + COMBA_STORE(b[116]); + + /* output 117 */ + CARRY_FORWARD; + SQRADDSC(a[54], a[63]); SQRADDAC(a[55], a[62]); SQRADDAC(a[56], a[61]); SQRADDAC(a[57], a[60]); SQRADDAC(a[58], a[59]); SQRADDDB; + COMBA_STORE(b[117]); + + /* output 118 */ + CARRY_FORWARD; + SQRADDSC(a[55], a[63]); SQRADDAC(a[56], a[62]); SQRADDAC(a[57], a[61]); SQRADDAC(a[58], a[60]); SQRADDDB; SQRADD(a[59], a[59]); + COMBA_STORE(b[118]); + + /* output 119 */ + CARRY_FORWARD; + SQRADDSC(a[56], a[63]); SQRADDAC(a[57], a[62]); SQRADDAC(a[58], a[61]); SQRADDAC(a[59], a[60]); SQRADDDB; + COMBA_STORE(b[119]); + + /* output 120 */ + CARRY_FORWARD; + SQRADDSC(a[57], a[63]); SQRADDAC(a[58], a[62]); SQRADDAC(a[59], a[61]); SQRADDDB; SQRADD(a[60], a[60]); + COMBA_STORE(b[120]); + + /* output 121 */ + CARRY_FORWARD; + SQRADDSC(a[58], a[63]); SQRADDAC(a[59], a[62]); SQRADDAC(a[60], a[61]); SQRADDDB; + COMBA_STORE(b[121]); + + /* output 122 */ + CARRY_FORWARD; + SQRADD2(a[59], a[63]); SQRADD2(a[60], a[62]); SQRADD(a[61], a[61]); + COMBA_STORE(b[122]); + + /* output 123 */ + CARRY_FORWARD; + SQRADD2(a[60], a[63]); SQRADD2(a[61], a[62]); + COMBA_STORE(b[123]); + + /* output 124 */ + CARRY_FORWARD; + SQRADD2(a[61], a[63]); SQRADD(a[62], a[62]); + COMBA_STORE(b[124]); + + /* output 125 */ + CARRY_FORWARD; + SQRADD2(a[62], a[63]); + COMBA_STORE(b[125]); + + /* output 126 */ + CARRY_FORWARD; + SQRADD(a[63], a[63]); + COMBA_STORE(b[126]); + COMBA_STORE2(b[127]); + COMBA_FINI; + + B->used = 128; + B->sign = FP_ZPOS; + memcpy(B->dp, b, 128 * sizeof(fp_digit)); + fp_clamp(B); +} + + +#endif diff --git a/fp_sqr_comba_generic.c b/fp_sqr_comba_generic.c new file mode 100644 index 0000000..446d794 --- /dev/null +++ b/fp_sqr_comba_generic.c @@ -0,0 +1,75 @@ +/* generic comba squarer */ +void fp_sqr_comba(fp_int *A, fp_int *B) +{ + int pa, ix, iz; + fp_digit c0, c1, c2; + fp_int tmp, *dst; + + /* get size of output and trim */ + pa = A->used + A->used; + if (pa >= FP_SIZE) { + pa = FP_SIZE-1; + } + + /* number of output digits to produce */ + COMBA_START; + CLEAR_CARRY; + + if (A == B) { + fp_zero(&tmp); + dst = &tmp; + } else { + fp_zero(B); + dst = B; + } + + for (ix = 0; ix < pa; ix++) { + int tx, ty, iy; + fp_digit *tmpy, *tmpx; + + /* get offsets into the two bignums */ + ty = MIN(A->used-1, ix); + tx = ix - ty; + + /* setup temp aliases */ + tmpx = A->dp + tx; + tmpy = A->dp + ty; + + /* this is the number of times the loop will iterrate, essentially its + while (tx++ < a->used && ty-- >= 0) { ... } + */ + iy = MIN(A->used-tx, ty+1); + + /* now for squaring tx can never equal ty + * we halve the distance since they approach at a rate of 2x + * and we have to round because odd cases need to be executed + */ + iy = MIN(iy, (ty-tx+1)>>1); + + /* forward carries */ + CARRY_FORWARD; + + /* execute loop */ + for (iz = 0; iz < iy; iz++) { + SQRADD2(*tmpx++, *tmpy--); + } + + /* even columns have the square term in them */ + if ((ix&1) == 0) { + SQRADD(A->dp[ix>>1], A->dp[ix>>1]); + } + + /* store it */ + COMBA_STORE(dst->dp[ix]); + } + COMBA_STORE2(dst->dp[ix]); + + COMBA_FINI; + + /* setup dest */ + dst->used = pa; + fp_clamp (dst); + if (dst != B) { + fp_copy(dst, B); + } +} diff --git a/makefile b/makefile index 353f69a..5bfc936 100644 --- a/makefile +++ b/makefile @@ -10,7 +10,7 @@ CFLAGS += -Wall -W -Wshadow -I./ -O3 -funroll-all-loops #speed CFLAGS += -fomit-frame-pointer -VERSION=0.02 +VERSION=0.03 default: libtfm.a diff --git a/pre_gen/mpi.c b/pre_gen/mpi.c index 14ea49c..68b3acb 100644 --- a/pre_gen/mpi.c +++ b/pre_gen/mpi.c @@ -708,7 +708,6 @@ int fp_div_d(fp_int *a, fp_digit b, fp_int *c, fp_digit *d) /* y = g**x (mod b) * Some restrictions... x must be positive and < b */ - static int _fp_exptmod(fp_int * G, fp_int * X, fp_int * P, fp_int * Y) { fp_int M[64], res; @@ -730,7 +729,7 @@ static int _fp_exptmod(fp_int * G, fp_int * X, fp_int * P, fp_int * Y) } /* init M array */ - memset(M, 0, sizeof(M)); + memset(M, 0, sizeof(M)); /* now setup montgomery */ if ((err = fp_montgomery_setup (P, &mp)) != FP_OKAY) { @@ -865,11 +864,12 @@ static int _fp_exptmod(fp_int * G, fp_int * X, fp_int * P, fp_int * Y) return FP_OKAY; } + int fp_exptmod(fp_int * G, fp_int * X, fp_int * P, fp_int * Y) { fp_int tmp; int err; - + /* is X negative? */ if (X->sign == FP_NEG) { /* yes, copy G and invmod it */ @@ -877,15 +877,16 @@ int fp_exptmod(fp_int * G, fp_int * X, fp_int * P, fp_int * Y) if ((err = fp_invmod(&tmp, P, &tmp)) != FP_OKAY) { return err; } - /* _fp_exptmod doesn't care about the sign of X */ - return _fp_exptmod(&tmp, X, P, Y); + X->sign = FP_ZPOS; + err = _fp_exptmod(&tmp, X, P, Y); + X->sign = FP_NEG; + return err; } else { /* Positive exponent so just exptmod */ return _fp_exptmod(G, X, P, Y); } } - /* End: fp_exptmod.c */ /* Start: fp_gcd.c */ @@ -1736,11 +1737,11 @@ void fp_mul(fp_int *A, fp_int *B, fp_int *C) } else if (y <= 8) { fp_mul_comba8(A,B,C); #if defined(TFM_LARGE) - } else if (y <= 16 && y >= 12) { + } else if (y <= 16 && y >= 10) { fp_mul_comba16(A,B,C); #endif #if defined(TFM_HUGE) - } else if (y <= 32 && y >= 28) { + } else if (y <= 32 && y >= 24) { fp_mul_comba32(A,B,C); #endif } else { @@ -3298,7 +3299,7 @@ void fp_sqr(fp_int *A, fp_int *B) fp_int aa, bb, comp, amb, t1; y = A->used; - if (y <= 48) { + if (y <= 64) { if (y <= 4) { fp_sqr_comba4(A,B); } else if (y <= 8) { @@ -3308,8 +3309,10 @@ void fp_sqr(fp_int *A, fp_int *B) fp_sqr_comba16(A,B); #endif #if defined(TFM_HUGE) - } else if (y <= 32 && y >= 28) { + } else if (y <= 32 && y >= 20) { fp_sqr_comba32(A,B); + } else if (y <= 64 && y >= 48) { + fp_sqr_comba64(A,B); #endif } else { fp_sqr_comba(A, B); @@ -3448,6 +3451,34 @@ asm volatile ( \ "adcl $0,%2 \n\t" \ :"=r"(c0), "=r"(c1), "=r"(c2): "0"(c0), "1"(c1), "2"(c2), "m"(i), "m"(j) :"%eax","%edx","%cc"); +#define SQRADDSC(i, j) \ +asm ( \ + "movl %6,%%eax \n\t" \ + "mull %7 \n\t" \ + "movl %%eax,%0 \n\t" \ + "movl %%edx,%1 \n\t" \ + "xorl %2,%2 \n\t" \ + :"=r"(sc0), "=r"(sc1), "=r"(sc2): "0"(sc0), "1"(sc1), "2"(sc2), "g"(i), "g"(j) :"%eax","%edx","%cc"); + +#define SQRADDAC(i, j) \ +asm ( \ + "movl %6,%%eax \n\t" \ + "mull %7 \n\t" \ + "addl %%eax,%0 \n\t" \ + "adcl %%edx,%1 \n\t" \ + "adcl $0,%2 \n\t" \ + :"=r"(sc0), "=r"(sc1), "=r"(sc2): "0"(sc0), "1"(sc1), "2"(sc2), "g"(i), "g"(j) :"%eax","%edx","%cc"); + +#define SQRADDDB \ +asm ( \ + "addl %3,%0 \n\t" \ + "adcl %4,%1 \n\t" \ + "adcl %5,%2 \n\t" \ + "addl %3,%0 \n\t" \ + "adcl %4,%1 \n\t" \ + "adcl %5,%2 \n\t" \ + :"=r"(c0), "=r"(c1), "=r"(c2), "=g"(sc0), "=g"(sc1), "=g"(sc2) : "0"(c0), "1"(c1), "2"(c2), "3"(sc0), "4"(sc1), "5"(sc2) : "%cc"); + #elif defined(TFM_X86_64) /* x86-64 optimized */ @@ -3488,6 +3519,33 @@ asm ( \ "adcq $0,%2 \n\t" \ :"=r"(c0), "=r"(c1), "=r"(c2): "0"(c0), "1"(c1), "2"(c2), "g"(i), "g"(j) :"%rax","%rdx","%cc"); +#define SQRADDSC(i, j) \ +asm ( \ + "movq %6,%%rax \n\t" \ + "mulq %7 \n\t" \ + "movq %%rax,%0 \n\t" \ + "movq %%rdx,%1 \n\t" \ + "xorq %2,%2 \n\t" \ + :"=r"(sc0), "=r"(sc1), "=r"(sc2): "0"(sc0), "1"(sc1), "2"(sc2), "g"(i), "g"(j) :"%rax","%rdx","%cc"); + +#define SQRADDAC(i, j) \ +asm ( \ + "movq %6,%%rax \n\t" \ + "mulq %7 \n\t" \ + "addq %%rax,%0 \n\t" \ + "adcq %%rdx,%1 \n\t" \ + "adcq $0,%2 \n\t" \ + :"=r"(sc0), "=r"(sc1), "=r"(sc2): "0"(sc0), "1"(sc1), "2"(sc2), "g"(i), "g"(j) :"%rax","%rdx","%cc"); + +#define SQRADDDB \ +asm ( \ + "addq %3,%0 \n\t" \ + "adcq %4,%1 \n\t" \ + "adcq %5,%2 \n\t" \ + "addq %3,%0 \n\t" \ + "adcq %4,%1 \n\t" \ + "adcq %5,%2 \n\t" \ + :"=r"(c0), "=r"(c1), "=r"(c2), "=r"(sc0), "=r"(sc1), "=r"(sc2) : "0"(c0), "1"(c1), "2"(c2), "3"(sc0), "4"(sc1), "5"(sc2) : "%cc"); #elif defined(TFM_SSE2) @@ -3537,6 +3595,44 @@ asm volatile ( \ "adcl $0,%2 \n\t" \ :"=r"(c0), "=r"(c1), "=r"(c2): "0"(c0), "1"(c1), "2"(c2), "m"(i), "m"(j) :"%eax","%edx","%cc"); +#define SQRADDSC(i, j) \ +asm volatile ( \ + "movd %6,%%mm0 \n\t" \ + "pmuludq %%mm0,%%mm0\n\t" \ + "movd %%mm0,%%eax \n\t" \ + "psrlq $32,%%mm0 \n\t" \ + "movl %%eax,%0 \n\t" \ + "movd %%mm0,%%eax \n\t" \ + "movl %%eax,%1 \n\t" \ + "xorl %2,%2 \n\t" \ + :"=r"(sc0), "=r"(sc1), "=r"(sc2): "0"(sc0), "1"(sc1), "2"(sc2), "m"(i) :"%eax","%cc"); + +#define SQRADDAC(i, j) \ +asm volatile ( \ + "movd %6,%%mm0 \n\t" \ + "movd %7,%%mm1 \n\t" \ + "pmuludq %%mm1,%%mm0\n\t" \ + "movd %%mm0,%%eax \n\t" \ + "psrlq $32,%%mm0 \n\t" \ + "movd %%mm0,%%edx \n\t" \ + "addl %%eax,%0 \n\t" \ + "adcl %%edx,%1 \n\t" \ + "adcl $0,%2 \n\t" \ + "addl %%eax,%0 \n\t" \ + "adcl %%edx,%1 \n\t" \ + "adcl $0,%2 \n\t" \ + :"=r"(sc0), "=r"(sc1), "=r"(sc2): "0"(sc0), "1"(sc1), "2"(sc2), "m"(i), "m"(j) :"%eax","%edx","%cc"); + +#define SQRADDDB \ +asm ( \ + "addl %3,%0 \n\t" \ + "adcl %4,%1 \n\t" \ + "adcl %5,%2 \n\t" \ + "addl %3,%0 \n\t" \ + "adcl %4,%1 \n\t" \ + "adcl %5,%2 \n\t" \ + :"=r"(c0), "=r"(c1), "=r"(c2), "=g"(sc0), "=g"(sc1), "=g"(sc2) : "0"(c0), "1"(c1), "2"(c2), "3"(sc0), "4"(sc1), "5"(sc2) : "%cc"); + #elif defined(TFM_ARM) /* ARM code */ @@ -3578,6 +3674,30 @@ asm( \ " ADC %2,%2,#0 \n\t" \ :"=r"(c0), "=r"(c1), "=r"(c2) : "0"(c0), "1"(c1), "2"(c2), "r"(i), "r"(j) : "r0", "r1", "%cc"); +#define SQRADDSC(i, j) \ +asm( \ +" UMULL %0,%1,%6,%7 \n\t" \ +" SUB %2,%2,%2 \n\t" \ +:"=r"(sc0), "=r"(sc1), "=r"(sc2) : "0"(sc0), "1"(sc1), "2"(sc2), "r"(i), "r"(j) : "%cc"); + +#define SQRADDAC(i, j) \ +asm( \ +" UMULL r0,r1,%6,%7 \n\t" \ +" ADDS %0,%0,r0 \n\t" \ +" ADCS %1,%1,r1 \n\t" \ +" ADC %2,%2,#0 \n\t" \ +:"=r"(sc0), "=r"(sc1), "=r"(sc2) : "0"(sc0), "1"(sc1), "2"(sc2), "r"(i), "r"(j) : "r0", "r1", "%cc"); + +#define SQRADDDB \ +asm( \ +" ADDS %3,%0 \n\t" \ +" ADCS %4,%1 \n\t" \ +" ADC %5,%2 \n\t" \ +" ADDS %3,%0 \n\t" \ +" ADCS %4,%1 \n\t" \ +" ADC %5,%2 \n\t" \ +:"=r"(sc0), "=r"(sc1), "=r"(sc2), "=r"(c0), "=r"(c1), "=r"(c2) : "0"(sc0), "1"(sc1), "2"(sc2), "3"(c0), "4"(c1), "5"(c2) : "%cc"); + #else /* ISO C portable code */ @@ -3618,8 +3738,1344 @@ asm( \ tt = (fp_word)c1 + (tt >> DIGIT_BIT); c1 = tt; c2 += tt >> DIGIT_BIT; \ } while (0); +#define SQRADDSC(i, j) \ + do { fp_word t; \ + t = ((fp_word)i) * ((fp_word)j); \ + sc0 = (fp_digit)t; sc1 = (t >> DIGIT_BIT); sc2 = 0; \ + } while (0); + +#define SQRADDAC(i, j) \ + do { fp_word t; \ + t = sc0 + ((fp_word)i) * ((fp_word)j); sc0 = t; \ + t = sc1 + (t >> DIGIT_BIT); sc1 = t; sc2 += t >> DIGIT_BIT; \ + } while (0); + +#define SQRADDDB \ + do { fp_word t; \ + t = ((fp_word)sc0) + ((fp_word)sc0) + c0; c0 = t; \ + t = ((fp_word)sc1) + ((fp_word)sc1) + c1 + (t >> DIGIT_BIT); c1 = t; \ + c2 = c2 + ((fp_word)sc2) + ((fp_word)sc2) + (t >> DIGIT_BIT); \ + } while (0); + #endif +#include "fp_sqr_comba_generic.c" +void fp_sqr_comba4(fp_int *A, fp_int *B) +{ + fp_digit *a, b[8], c0, c1, c2, sc0, sc1, sc2; + + a = A->dp; + COMBA_START; + + /* clear carries */ + CLEAR_CARRY; + + /* output 0 */ + SQRADD(a[0],a[0]); + COMBA_STORE(b[0]); + + /* output 1 */ + CARRY_FORWARD; + SQRADD2(a[0], a[1]); + COMBA_STORE(b[1]); + + /* output 2 */ + CARRY_FORWARD; + SQRADD2(a[0], a[2]); SQRADD(a[1], a[1]); + COMBA_STORE(b[2]); + + /* output 3 */ + CARRY_FORWARD; + SQRADD2(a[0], a[3]); SQRADD2(a[1], a[2]); + COMBA_STORE(b[3]); + + /* output 4 */ + CARRY_FORWARD; + SQRADD2(a[1], a[3]); SQRADD(a[2], a[2]); + COMBA_STORE(b[4]); + + /* output 5 */ + CARRY_FORWARD; + SQRADD2(a[2], a[3]); + COMBA_STORE(b[5]); + + /* output 6 */ + CARRY_FORWARD; + SQRADD(a[3], a[3]); + COMBA_STORE(b[6]); + COMBA_STORE2(b[7]); + COMBA_FINI; + + B->used = 8; + B->sign = FP_ZPOS; + memcpy(B->dp, b, 8 * sizeof(fp_digit)); + fp_clamp(B); +} + + +void fp_sqr_comba8(fp_int *A, fp_int *B) +{ + fp_digit *a, b[16], c0, c1, c2, sc0, sc1, sc2; + + a = A->dp; + COMBA_START; + + /* clear carries */ + CLEAR_CARRY; + + /* output 0 */ + SQRADD(a[0],a[0]); + COMBA_STORE(b[0]); + + /* output 1 */ + CARRY_FORWARD; + SQRADD2(a[0], a[1]); + COMBA_STORE(b[1]); + + /* output 2 */ + CARRY_FORWARD; + SQRADD2(a[0], a[2]); SQRADD(a[1], a[1]); + COMBA_STORE(b[2]); + + /* output 3 */ + CARRY_FORWARD; + SQRADD2(a[0], a[3]); SQRADD2(a[1], a[2]); + COMBA_STORE(b[3]); + + /* output 4 */ + CARRY_FORWARD; + SQRADD2(a[0], a[4]); SQRADD2(a[1], a[3]); SQRADD(a[2], a[2]); + COMBA_STORE(b[4]); + + /* output 5 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[5]); SQRADDAC(a[1], a[4]); SQRADDAC(a[2], a[3]); SQRADDDB; + COMBA_STORE(b[5]); + + /* output 6 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[6]); SQRADDAC(a[1], a[5]); SQRADDAC(a[2], a[4]); SQRADDDB; SQRADD(a[3], a[3]); + COMBA_STORE(b[6]); + + /* output 7 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[7]); SQRADDAC(a[1], a[6]); SQRADDAC(a[2], a[5]); SQRADDAC(a[3], a[4]); SQRADDDB; + COMBA_STORE(b[7]); + + /* output 8 */ + CARRY_FORWARD; + SQRADDSC(a[1], a[7]); SQRADDAC(a[2], a[6]); SQRADDAC(a[3], a[5]); SQRADDDB; SQRADD(a[4], a[4]); + COMBA_STORE(b[8]); + + /* output 9 */ + CARRY_FORWARD; + SQRADDSC(a[2], a[7]); SQRADDAC(a[3], a[6]); SQRADDAC(a[4], a[5]); SQRADDDB; + COMBA_STORE(b[9]); + + /* output 10 */ + CARRY_FORWARD; + SQRADD2(a[3], a[7]); SQRADD2(a[4], a[6]); SQRADD(a[5], a[5]); + COMBA_STORE(b[10]); + + /* output 11 */ + CARRY_FORWARD; + SQRADD2(a[4], a[7]); SQRADD2(a[5], a[6]); + COMBA_STORE(b[11]); + + /* output 12 */ + CARRY_FORWARD; + SQRADD2(a[5], a[7]); SQRADD(a[6], a[6]); + COMBA_STORE(b[12]); + + /* output 13 */ + CARRY_FORWARD; + SQRADD2(a[6], a[7]); + COMBA_STORE(b[13]); + + /* output 14 */ + CARRY_FORWARD; + SQRADD(a[7], a[7]); + COMBA_STORE(b[14]); + COMBA_STORE2(b[15]); + COMBA_FINI; + + B->used = 16; + B->sign = FP_ZPOS; + memcpy(B->dp, b, 16 * sizeof(fp_digit)); + fp_clamp(B); +} + + +#ifdef TFM_LARGE +void fp_sqr_comba16(fp_int *A, fp_int *B) +{ + fp_digit *a, b[32], c0, c1, c2, sc0, sc1, sc2; + + a = A->dp; + COMBA_START; + + /* clear carries */ + CLEAR_CARRY; + + /* output 0 */ + SQRADD(a[0],a[0]); + COMBA_STORE(b[0]); + + /* output 1 */ + CARRY_FORWARD; + SQRADD2(a[0], a[1]); + COMBA_STORE(b[1]); + + /* output 2 */ + CARRY_FORWARD; + SQRADD2(a[0], a[2]); SQRADD(a[1], a[1]); + COMBA_STORE(b[2]); + + /* output 3 */ + CARRY_FORWARD; + SQRADD2(a[0], a[3]); SQRADD2(a[1], a[2]); + COMBA_STORE(b[3]); + + /* output 4 */ + CARRY_FORWARD; + SQRADD2(a[0], a[4]); SQRADD2(a[1], a[3]); SQRADD(a[2], a[2]); + COMBA_STORE(b[4]); + + /* output 5 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[5]); SQRADDAC(a[1], a[4]); SQRADDAC(a[2], a[3]); SQRADDDB; + COMBA_STORE(b[5]); + + /* output 6 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[6]); SQRADDAC(a[1], a[5]); SQRADDAC(a[2], a[4]); SQRADDDB; SQRADD(a[3], a[3]); + COMBA_STORE(b[6]); + + /* output 7 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[7]); SQRADDAC(a[1], a[6]); SQRADDAC(a[2], a[5]); SQRADDAC(a[3], a[4]); SQRADDDB; + COMBA_STORE(b[7]); + + /* output 8 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[8]); SQRADDAC(a[1], a[7]); SQRADDAC(a[2], a[6]); SQRADDAC(a[3], a[5]); SQRADDDB; SQRADD(a[4], a[4]); + COMBA_STORE(b[8]); + + /* output 9 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[9]); SQRADDAC(a[1], a[8]); SQRADDAC(a[2], a[7]); SQRADDAC(a[3], a[6]); SQRADDAC(a[4], a[5]); SQRADDDB; + COMBA_STORE(b[9]); + + /* output 10 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[10]); SQRADDAC(a[1], a[9]); SQRADDAC(a[2], a[8]); SQRADDAC(a[3], a[7]); SQRADDAC(a[4], a[6]); SQRADDDB; SQRADD(a[5], a[5]); + COMBA_STORE(b[10]); + + /* output 11 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[11]); SQRADDAC(a[1], a[10]); SQRADDAC(a[2], a[9]); SQRADDAC(a[3], a[8]); SQRADDAC(a[4], a[7]); SQRADDAC(a[5], a[6]); SQRADDDB; + COMBA_STORE(b[11]); + + /* output 12 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[12]); SQRADDAC(a[1], a[11]); SQRADDAC(a[2], a[10]); SQRADDAC(a[3], a[9]); SQRADDAC(a[4], a[8]); SQRADDAC(a[5], a[7]); SQRADDDB; SQRADD(a[6], a[6]); + COMBA_STORE(b[12]); + + /* output 13 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[13]); SQRADDAC(a[1], a[12]); SQRADDAC(a[2], a[11]); SQRADDAC(a[3], a[10]); SQRADDAC(a[4], a[9]); SQRADDAC(a[5], a[8]); SQRADDAC(a[6], a[7]); SQRADDDB; + COMBA_STORE(b[13]); + + /* output 14 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[14]); SQRADDAC(a[1], a[13]); SQRADDAC(a[2], a[12]); SQRADDAC(a[3], a[11]); SQRADDAC(a[4], a[10]); SQRADDAC(a[5], a[9]); SQRADDAC(a[6], a[8]); SQRADDDB; SQRADD(a[7], a[7]); + COMBA_STORE(b[14]); + + /* output 15 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[15]); SQRADDAC(a[1], a[14]); SQRADDAC(a[2], a[13]); SQRADDAC(a[3], a[12]); SQRADDAC(a[4], a[11]); SQRADDAC(a[5], a[10]); SQRADDAC(a[6], a[9]); SQRADDAC(a[7], a[8]); SQRADDDB; + COMBA_STORE(b[15]); + + /* output 16 */ + CARRY_FORWARD; + SQRADDSC(a[1], a[15]); SQRADDAC(a[2], a[14]); SQRADDAC(a[3], a[13]); SQRADDAC(a[4], a[12]); SQRADDAC(a[5], a[11]); SQRADDAC(a[6], a[10]); SQRADDAC(a[7], a[9]); SQRADDDB; SQRADD(a[8], a[8]); + COMBA_STORE(b[16]); + + /* output 17 */ + CARRY_FORWARD; + SQRADDSC(a[2], a[15]); SQRADDAC(a[3], a[14]); SQRADDAC(a[4], a[13]); SQRADDAC(a[5], a[12]); SQRADDAC(a[6], a[11]); SQRADDAC(a[7], a[10]); SQRADDAC(a[8], a[9]); SQRADDDB; + COMBA_STORE(b[17]); + + /* output 18 */ + CARRY_FORWARD; + SQRADDSC(a[3], a[15]); SQRADDAC(a[4], a[14]); SQRADDAC(a[5], a[13]); SQRADDAC(a[6], a[12]); SQRADDAC(a[7], a[11]); SQRADDAC(a[8], a[10]); SQRADDDB; SQRADD(a[9], a[9]); + COMBA_STORE(b[18]); + + /* output 19 */ + CARRY_FORWARD; + SQRADDSC(a[4], a[15]); SQRADDAC(a[5], a[14]); SQRADDAC(a[6], a[13]); SQRADDAC(a[7], a[12]); SQRADDAC(a[8], a[11]); SQRADDAC(a[9], a[10]); SQRADDDB; + COMBA_STORE(b[19]); + + /* output 20 */ + CARRY_FORWARD; + SQRADDSC(a[5], a[15]); SQRADDAC(a[6], a[14]); SQRADDAC(a[7], a[13]); SQRADDAC(a[8], a[12]); SQRADDAC(a[9], a[11]); SQRADDDB; SQRADD(a[10], a[10]); + COMBA_STORE(b[20]); + + /* output 21 */ + CARRY_FORWARD; + SQRADDSC(a[6], a[15]); SQRADDAC(a[7], a[14]); SQRADDAC(a[8], a[13]); SQRADDAC(a[9], a[12]); SQRADDAC(a[10], a[11]); SQRADDDB; + COMBA_STORE(b[21]); + + /* output 22 */ + CARRY_FORWARD; + SQRADDSC(a[7], a[15]); SQRADDAC(a[8], a[14]); SQRADDAC(a[9], a[13]); SQRADDAC(a[10], a[12]); SQRADDDB; SQRADD(a[11], a[11]); + COMBA_STORE(b[22]); + + /* output 23 */ + CARRY_FORWARD; + SQRADDSC(a[8], a[15]); SQRADDAC(a[9], a[14]); SQRADDAC(a[10], a[13]); SQRADDAC(a[11], a[12]); SQRADDDB; + COMBA_STORE(b[23]); + + /* output 24 */ + CARRY_FORWARD; + SQRADDSC(a[9], a[15]); SQRADDAC(a[10], a[14]); SQRADDAC(a[11], a[13]); SQRADDDB; SQRADD(a[12], a[12]); + COMBA_STORE(b[24]); + + /* output 25 */ + CARRY_FORWARD; + SQRADDSC(a[10], a[15]); SQRADDAC(a[11], a[14]); SQRADDAC(a[12], a[13]); SQRADDDB; + COMBA_STORE(b[25]); + + /* output 26 */ + CARRY_FORWARD; + SQRADD2(a[11], a[15]); SQRADD2(a[12], a[14]); SQRADD(a[13], a[13]); + COMBA_STORE(b[26]); + + /* output 27 */ + CARRY_FORWARD; + SQRADD2(a[12], a[15]); SQRADD2(a[13], a[14]); + COMBA_STORE(b[27]); + + /* output 28 */ + CARRY_FORWARD; + SQRADD2(a[13], a[15]); SQRADD(a[14], a[14]); + COMBA_STORE(b[28]); + + /* output 29 */ + CARRY_FORWARD; + SQRADD2(a[14], a[15]); + COMBA_STORE(b[29]); + + /* output 30 */ + CARRY_FORWARD; + SQRADD(a[15], a[15]); + COMBA_STORE(b[30]); + COMBA_STORE2(b[31]); + COMBA_FINI; + + B->used = 32; + B->sign = FP_ZPOS; + memcpy(B->dp, b, 32 * sizeof(fp_digit)); + fp_clamp(B); +} + + +#endif +#ifdef TFM_HUGE +void fp_sqr_comba32(fp_int *A, fp_int *B) +{ + fp_digit *a, b[64], c0, c1, c2, sc0, sc1, sc2; + + a = A->dp; + COMBA_START; + + /* clear carries */ + CLEAR_CARRY; + + /* output 0 */ + SQRADD(a[0],a[0]); + COMBA_STORE(b[0]); + + /* output 1 */ + CARRY_FORWARD; + SQRADD2(a[0], a[1]); + COMBA_STORE(b[1]); + + /* output 2 */ + CARRY_FORWARD; + SQRADD2(a[0], a[2]); SQRADD(a[1], a[1]); + COMBA_STORE(b[2]); + + /* output 3 */ + CARRY_FORWARD; + SQRADD2(a[0], a[3]); SQRADD2(a[1], a[2]); + COMBA_STORE(b[3]); + + /* output 4 */ + CARRY_FORWARD; + SQRADD2(a[0], a[4]); SQRADD2(a[1], a[3]); SQRADD(a[2], a[2]); + COMBA_STORE(b[4]); + + /* output 5 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[5]); SQRADDAC(a[1], a[4]); SQRADDAC(a[2], a[3]); SQRADDDB; + COMBA_STORE(b[5]); + + /* output 6 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[6]); SQRADDAC(a[1], a[5]); SQRADDAC(a[2], a[4]); SQRADDDB; SQRADD(a[3], a[3]); + COMBA_STORE(b[6]); + + /* output 7 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[7]); SQRADDAC(a[1], a[6]); SQRADDAC(a[2], a[5]); SQRADDAC(a[3], a[4]); SQRADDDB; + COMBA_STORE(b[7]); + + /* output 8 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[8]); SQRADDAC(a[1], a[7]); SQRADDAC(a[2], a[6]); SQRADDAC(a[3], a[5]); SQRADDDB; SQRADD(a[4], a[4]); + COMBA_STORE(b[8]); + + /* output 9 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[9]); SQRADDAC(a[1], a[8]); SQRADDAC(a[2], a[7]); SQRADDAC(a[3], a[6]); SQRADDAC(a[4], a[5]); SQRADDDB; + COMBA_STORE(b[9]); + + /* output 10 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[10]); SQRADDAC(a[1], a[9]); SQRADDAC(a[2], a[8]); SQRADDAC(a[3], a[7]); SQRADDAC(a[4], a[6]); SQRADDDB; SQRADD(a[5], a[5]); + COMBA_STORE(b[10]); + + /* output 11 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[11]); SQRADDAC(a[1], a[10]); SQRADDAC(a[2], a[9]); SQRADDAC(a[3], a[8]); SQRADDAC(a[4], a[7]); SQRADDAC(a[5], a[6]); SQRADDDB; + COMBA_STORE(b[11]); + + /* output 12 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[12]); SQRADDAC(a[1], a[11]); SQRADDAC(a[2], a[10]); SQRADDAC(a[3], a[9]); SQRADDAC(a[4], a[8]); SQRADDAC(a[5], a[7]); SQRADDDB; SQRADD(a[6], a[6]); + COMBA_STORE(b[12]); + + /* output 13 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[13]); SQRADDAC(a[1], a[12]); SQRADDAC(a[2], a[11]); SQRADDAC(a[3], a[10]); SQRADDAC(a[4], a[9]); SQRADDAC(a[5], a[8]); SQRADDAC(a[6], a[7]); SQRADDDB; + COMBA_STORE(b[13]); + + /* output 14 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[14]); SQRADDAC(a[1], a[13]); SQRADDAC(a[2], a[12]); SQRADDAC(a[3], a[11]); SQRADDAC(a[4], a[10]); SQRADDAC(a[5], a[9]); SQRADDAC(a[6], a[8]); SQRADDDB; SQRADD(a[7], a[7]); + COMBA_STORE(b[14]); + + /* output 15 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[15]); SQRADDAC(a[1], a[14]); SQRADDAC(a[2], a[13]); SQRADDAC(a[3], a[12]); SQRADDAC(a[4], a[11]); SQRADDAC(a[5], a[10]); SQRADDAC(a[6], a[9]); SQRADDAC(a[7], a[8]); SQRADDDB; + COMBA_STORE(b[15]); + + /* output 16 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[16]); SQRADDAC(a[1], a[15]); SQRADDAC(a[2], a[14]); SQRADDAC(a[3], a[13]); SQRADDAC(a[4], a[12]); SQRADDAC(a[5], a[11]); SQRADDAC(a[6], a[10]); SQRADDAC(a[7], a[9]); SQRADDDB; SQRADD(a[8], a[8]); + COMBA_STORE(b[16]); + + /* output 17 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[17]); SQRADDAC(a[1], a[16]); SQRADDAC(a[2], a[15]); SQRADDAC(a[3], a[14]); SQRADDAC(a[4], a[13]); SQRADDAC(a[5], a[12]); SQRADDAC(a[6], a[11]); SQRADDAC(a[7], a[10]); SQRADDAC(a[8], a[9]); SQRADDDB; + COMBA_STORE(b[17]); + + /* output 18 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[18]); SQRADDAC(a[1], a[17]); SQRADDAC(a[2], a[16]); SQRADDAC(a[3], a[15]); SQRADDAC(a[4], a[14]); SQRADDAC(a[5], a[13]); SQRADDAC(a[6], a[12]); SQRADDAC(a[7], a[11]); SQRADDAC(a[8], a[10]); SQRADDDB; SQRADD(a[9], a[9]); + COMBA_STORE(b[18]); + + /* output 19 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[19]); SQRADDAC(a[1], a[18]); SQRADDAC(a[2], a[17]); SQRADDAC(a[3], a[16]); SQRADDAC(a[4], a[15]); SQRADDAC(a[5], a[14]); SQRADDAC(a[6], a[13]); SQRADDAC(a[7], a[12]); SQRADDAC(a[8], a[11]); SQRADDAC(a[9], a[10]); SQRADDDB; + COMBA_STORE(b[19]); + + /* output 20 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[20]); SQRADDAC(a[1], a[19]); SQRADDAC(a[2], a[18]); SQRADDAC(a[3], a[17]); SQRADDAC(a[4], a[16]); SQRADDAC(a[5], a[15]); SQRADDAC(a[6], a[14]); SQRADDAC(a[7], a[13]); SQRADDAC(a[8], a[12]); SQRADDAC(a[9], a[11]); SQRADDDB; SQRADD(a[10], a[10]); + COMBA_STORE(b[20]); + + /* output 21 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[21]); SQRADDAC(a[1], a[20]); SQRADDAC(a[2], a[19]); SQRADDAC(a[3], a[18]); SQRADDAC(a[4], a[17]); SQRADDAC(a[5], a[16]); SQRADDAC(a[6], a[15]); SQRADDAC(a[7], a[14]); SQRADDAC(a[8], a[13]); SQRADDAC(a[9], a[12]); SQRADDAC(a[10], a[11]); SQRADDDB; + COMBA_STORE(b[21]); + + /* output 22 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[22]); SQRADDAC(a[1], a[21]); SQRADDAC(a[2], a[20]); SQRADDAC(a[3], a[19]); SQRADDAC(a[4], a[18]); SQRADDAC(a[5], a[17]); SQRADDAC(a[6], a[16]); SQRADDAC(a[7], a[15]); SQRADDAC(a[8], a[14]); SQRADDAC(a[9], a[13]); SQRADDAC(a[10], a[12]); SQRADDDB; SQRADD(a[11], a[11]); + COMBA_STORE(b[22]); + + /* output 23 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[23]); SQRADDAC(a[1], a[22]); SQRADDAC(a[2], a[21]); SQRADDAC(a[3], a[20]); SQRADDAC(a[4], a[19]); SQRADDAC(a[5], a[18]); SQRADDAC(a[6], a[17]); SQRADDAC(a[7], a[16]); SQRADDAC(a[8], a[15]); SQRADDAC(a[9], a[14]); SQRADDAC(a[10], a[13]); SQRADDAC(a[11], a[12]); SQRADDDB; + COMBA_STORE(b[23]); + + /* output 24 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[24]); SQRADDAC(a[1], a[23]); SQRADDAC(a[2], a[22]); SQRADDAC(a[3], a[21]); SQRADDAC(a[4], a[20]); SQRADDAC(a[5], a[19]); SQRADDAC(a[6], a[18]); SQRADDAC(a[7], a[17]); SQRADDAC(a[8], a[16]); SQRADDAC(a[9], a[15]); SQRADDAC(a[10], a[14]); SQRADDAC(a[11], a[13]); SQRADDDB; SQRADD(a[12], a[12]); + COMBA_STORE(b[24]); + + /* output 25 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[25]); SQRADDAC(a[1], a[24]); SQRADDAC(a[2], a[23]); SQRADDAC(a[3], a[22]); SQRADDAC(a[4], a[21]); SQRADDAC(a[5], a[20]); SQRADDAC(a[6], a[19]); SQRADDAC(a[7], a[18]); SQRADDAC(a[8], a[17]); SQRADDAC(a[9], a[16]); SQRADDAC(a[10], a[15]); SQRADDAC(a[11], a[14]); SQRADDAC(a[12], a[13]); SQRADDDB; + COMBA_STORE(b[25]); + + /* output 26 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[26]); SQRADDAC(a[1], a[25]); SQRADDAC(a[2], a[24]); SQRADDAC(a[3], a[23]); SQRADDAC(a[4], a[22]); SQRADDAC(a[5], a[21]); SQRADDAC(a[6], a[20]); SQRADDAC(a[7], a[19]); SQRADDAC(a[8], a[18]); SQRADDAC(a[9], a[17]); SQRADDAC(a[10], a[16]); SQRADDAC(a[11], a[15]); SQRADDAC(a[12], a[14]); SQRADDDB; SQRADD(a[13], a[13]); + COMBA_STORE(b[26]); + + /* output 27 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[27]); SQRADDAC(a[1], a[26]); SQRADDAC(a[2], a[25]); SQRADDAC(a[3], a[24]); SQRADDAC(a[4], a[23]); SQRADDAC(a[5], a[22]); SQRADDAC(a[6], a[21]); SQRADDAC(a[7], a[20]); SQRADDAC(a[8], a[19]); SQRADDAC(a[9], a[18]); SQRADDAC(a[10], a[17]); SQRADDAC(a[11], a[16]); SQRADDAC(a[12], a[15]); SQRADDAC(a[13], a[14]); SQRADDDB; + COMBA_STORE(b[27]); + + /* output 28 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[28]); SQRADDAC(a[1], a[27]); SQRADDAC(a[2], a[26]); SQRADDAC(a[3], a[25]); SQRADDAC(a[4], a[24]); SQRADDAC(a[5], a[23]); SQRADDAC(a[6], a[22]); SQRADDAC(a[7], a[21]); SQRADDAC(a[8], a[20]); SQRADDAC(a[9], a[19]); SQRADDAC(a[10], a[18]); SQRADDAC(a[11], a[17]); SQRADDAC(a[12], a[16]); SQRADDAC(a[13], a[15]); SQRADDDB; SQRADD(a[14], a[14]); + COMBA_STORE(b[28]); + + /* output 29 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[29]); SQRADDAC(a[1], a[28]); SQRADDAC(a[2], a[27]); SQRADDAC(a[3], a[26]); SQRADDAC(a[4], a[25]); SQRADDAC(a[5], a[24]); SQRADDAC(a[6], a[23]); SQRADDAC(a[7], a[22]); SQRADDAC(a[8], a[21]); SQRADDAC(a[9], a[20]); SQRADDAC(a[10], a[19]); SQRADDAC(a[11], a[18]); SQRADDAC(a[12], a[17]); SQRADDAC(a[13], a[16]); SQRADDAC(a[14], a[15]); SQRADDDB; + COMBA_STORE(b[29]); + + /* output 30 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[30]); SQRADDAC(a[1], a[29]); SQRADDAC(a[2], a[28]); SQRADDAC(a[3], a[27]); SQRADDAC(a[4], a[26]); SQRADDAC(a[5], a[25]); SQRADDAC(a[6], a[24]); SQRADDAC(a[7], a[23]); SQRADDAC(a[8], a[22]); SQRADDAC(a[9], a[21]); SQRADDAC(a[10], a[20]); SQRADDAC(a[11], a[19]); SQRADDAC(a[12], a[18]); SQRADDAC(a[13], a[17]); SQRADDAC(a[14], a[16]); SQRADDDB; SQRADD(a[15], a[15]); + COMBA_STORE(b[30]); + + /* output 31 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[31]); SQRADDAC(a[1], a[30]); SQRADDAC(a[2], a[29]); SQRADDAC(a[3], a[28]); SQRADDAC(a[4], a[27]); SQRADDAC(a[5], a[26]); SQRADDAC(a[6], a[25]); SQRADDAC(a[7], a[24]); SQRADDAC(a[8], a[23]); SQRADDAC(a[9], a[22]); SQRADDAC(a[10], a[21]); SQRADDAC(a[11], a[20]); SQRADDAC(a[12], a[19]); SQRADDAC(a[13], a[18]); SQRADDAC(a[14], a[17]); SQRADDAC(a[15], a[16]); SQRADDDB; + COMBA_STORE(b[31]); + + /* output 32 */ + CARRY_FORWARD; + SQRADDSC(a[1], a[31]); SQRADDAC(a[2], a[30]); SQRADDAC(a[3], a[29]); SQRADDAC(a[4], a[28]); SQRADDAC(a[5], a[27]); SQRADDAC(a[6], a[26]); SQRADDAC(a[7], a[25]); SQRADDAC(a[8], a[24]); SQRADDAC(a[9], a[23]); SQRADDAC(a[10], a[22]); SQRADDAC(a[11], a[21]); SQRADDAC(a[12], a[20]); SQRADDAC(a[13], a[19]); SQRADDAC(a[14], a[18]); SQRADDAC(a[15], a[17]); SQRADDDB; SQRADD(a[16], a[16]); + COMBA_STORE(b[32]); + + /* output 33 */ + CARRY_FORWARD; + SQRADDSC(a[2], a[31]); SQRADDAC(a[3], a[30]); SQRADDAC(a[4], a[29]); SQRADDAC(a[5], a[28]); SQRADDAC(a[6], a[27]); SQRADDAC(a[7], a[26]); SQRADDAC(a[8], a[25]); SQRADDAC(a[9], a[24]); SQRADDAC(a[10], a[23]); SQRADDAC(a[11], a[22]); SQRADDAC(a[12], a[21]); SQRADDAC(a[13], a[20]); SQRADDAC(a[14], a[19]); SQRADDAC(a[15], a[18]); SQRADDAC(a[16], a[17]); SQRADDDB; + COMBA_STORE(b[33]); + + /* output 34 */ + CARRY_FORWARD; + SQRADDSC(a[3], a[31]); SQRADDAC(a[4], a[30]); SQRADDAC(a[5], a[29]); SQRADDAC(a[6], a[28]); SQRADDAC(a[7], a[27]); SQRADDAC(a[8], a[26]); SQRADDAC(a[9], a[25]); SQRADDAC(a[10], a[24]); SQRADDAC(a[11], a[23]); SQRADDAC(a[12], a[22]); SQRADDAC(a[13], a[21]); SQRADDAC(a[14], a[20]); SQRADDAC(a[15], a[19]); SQRADDAC(a[16], a[18]); SQRADDDB; SQRADD(a[17], a[17]); + COMBA_STORE(b[34]); + + /* output 35 */ + CARRY_FORWARD; + SQRADDSC(a[4], a[31]); SQRADDAC(a[5], a[30]); SQRADDAC(a[6], a[29]); SQRADDAC(a[7], a[28]); SQRADDAC(a[8], a[27]); SQRADDAC(a[9], a[26]); SQRADDAC(a[10], a[25]); SQRADDAC(a[11], a[24]); SQRADDAC(a[12], a[23]); SQRADDAC(a[13], a[22]); SQRADDAC(a[14], a[21]); SQRADDAC(a[15], a[20]); SQRADDAC(a[16], a[19]); SQRADDAC(a[17], a[18]); SQRADDDB; + COMBA_STORE(b[35]); + + /* output 36 */ + CARRY_FORWARD; + SQRADDSC(a[5], a[31]); SQRADDAC(a[6], a[30]); SQRADDAC(a[7], a[29]); SQRADDAC(a[8], a[28]); SQRADDAC(a[9], a[27]); SQRADDAC(a[10], a[26]); SQRADDAC(a[11], a[25]); SQRADDAC(a[12], a[24]); SQRADDAC(a[13], a[23]); SQRADDAC(a[14], a[22]); SQRADDAC(a[15], a[21]); SQRADDAC(a[16], a[20]); SQRADDAC(a[17], a[19]); SQRADDDB; SQRADD(a[18], a[18]); + COMBA_STORE(b[36]); + + /* output 37 */ + CARRY_FORWARD; + SQRADDSC(a[6], a[31]); SQRADDAC(a[7], a[30]); SQRADDAC(a[8], a[29]); SQRADDAC(a[9], a[28]); SQRADDAC(a[10], a[27]); SQRADDAC(a[11], a[26]); SQRADDAC(a[12], a[25]); SQRADDAC(a[13], a[24]); SQRADDAC(a[14], a[23]); SQRADDAC(a[15], a[22]); SQRADDAC(a[16], a[21]); SQRADDAC(a[17], a[20]); SQRADDAC(a[18], a[19]); SQRADDDB; + COMBA_STORE(b[37]); + + /* output 38 */ + CARRY_FORWARD; + SQRADDSC(a[7], a[31]); SQRADDAC(a[8], a[30]); SQRADDAC(a[9], a[29]); SQRADDAC(a[10], a[28]); SQRADDAC(a[11], a[27]); SQRADDAC(a[12], a[26]); SQRADDAC(a[13], a[25]); SQRADDAC(a[14], a[24]); SQRADDAC(a[15], a[23]); SQRADDAC(a[16], a[22]); SQRADDAC(a[17], a[21]); SQRADDAC(a[18], a[20]); SQRADDDB; SQRADD(a[19], a[19]); + COMBA_STORE(b[38]); + + /* output 39 */ + CARRY_FORWARD; + SQRADDSC(a[8], a[31]); SQRADDAC(a[9], a[30]); SQRADDAC(a[10], a[29]); SQRADDAC(a[11], a[28]); SQRADDAC(a[12], a[27]); SQRADDAC(a[13], a[26]); SQRADDAC(a[14], a[25]); SQRADDAC(a[15], a[24]); SQRADDAC(a[16], a[23]); SQRADDAC(a[17], a[22]); SQRADDAC(a[18], a[21]); SQRADDAC(a[19], a[20]); SQRADDDB; + COMBA_STORE(b[39]); + + /* output 40 */ + CARRY_FORWARD; + SQRADDSC(a[9], a[31]); SQRADDAC(a[10], a[30]); SQRADDAC(a[11], a[29]); SQRADDAC(a[12], a[28]); SQRADDAC(a[13], a[27]); SQRADDAC(a[14], a[26]); SQRADDAC(a[15], a[25]); SQRADDAC(a[16], a[24]); SQRADDAC(a[17], a[23]); SQRADDAC(a[18], a[22]); SQRADDAC(a[19], a[21]); SQRADDDB; SQRADD(a[20], a[20]); + COMBA_STORE(b[40]); + + /* output 41 */ + CARRY_FORWARD; + SQRADDSC(a[10], a[31]); SQRADDAC(a[11], a[30]); SQRADDAC(a[12], a[29]); SQRADDAC(a[13], a[28]); SQRADDAC(a[14], a[27]); SQRADDAC(a[15], a[26]); SQRADDAC(a[16], a[25]); SQRADDAC(a[17], a[24]); SQRADDAC(a[18], a[23]); SQRADDAC(a[19], a[22]); SQRADDAC(a[20], a[21]); SQRADDDB; + COMBA_STORE(b[41]); + + /* output 42 */ + CARRY_FORWARD; + SQRADDSC(a[11], a[31]); SQRADDAC(a[12], a[30]); SQRADDAC(a[13], a[29]); SQRADDAC(a[14], a[28]); SQRADDAC(a[15], a[27]); SQRADDAC(a[16], a[26]); SQRADDAC(a[17], a[25]); SQRADDAC(a[18], a[24]); SQRADDAC(a[19], a[23]); SQRADDAC(a[20], a[22]); SQRADDDB; SQRADD(a[21], a[21]); + COMBA_STORE(b[42]); + + /* output 43 */ + CARRY_FORWARD; + SQRADDSC(a[12], a[31]); SQRADDAC(a[13], a[30]); SQRADDAC(a[14], a[29]); SQRADDAC(a[15], a[28]); SQRADDAC(a[16], a[27]); SQRADDAC(a[17], a[26]); SQRADDAC(a[18], a[25]); SQRADDAC(a[19], a[24]); SQRADDAC(a[20], a[23]); SQRADDAC(a[21], a[22]); SQRADDDB; + COMBA_STORE(b[43]); + + /* output 44 */ + CARRY_FORWARD; + SQRADDSC(a[13], a[31]); SQRADDAC(a[14], a[30]); SQRADDAC(a[15], a[29]); SQRADDAC(a[16], a[28]); SQRADDAC(a[17], a[27]); SQRADDAC(a[18], a[26]); SQRADDAC(a[19], a[25]); SQRADDAC(a[20], a[24]); SQRADDAC(a[21], a[23]); SQRADDDB; SQRADD(a[22], a[22]); + COMBA_STORE(b[44]); + + /* output 45 */ + CARRY_FORWARD; + SQRADDSC(a[14], a[31]); SQRADDAC(a[15], a[30]); SQRADDAC(a[16], a[29]); SQRADDAC(a[17], a[28]); SQRADDAC(a[18], a[27]); SQRADDAC(a[19], a[26]); SQRADDAC(a[20], a[25]); SQRADDAC(a[21], a[24]); SQRADDAC(a[22], a[23]); SQRADDDB; + COMBA_STORE(b[45]); + + /* output 46 */ + CARRY_FORWARD; + SQRADDSC(a[15], a[31]); SQRADDAC(a[16], a[30]); SQRADDAC(a[17], a[29]); SQRADDAC(a[18], a[28]); SQRADDAC(a[19], a[27]); SQRADDAC(a[20], a[26]); SQRADDAC(a[21], a[25]); SQRADDAC(a[22], a[24]); SQRADDDB; SQRADD(a[23], a[23]); + COMBA_STORE(b[46]); + + /* output 47 */ + CARRY_FORWARD; + SQRADDSC(a[16], a[31]); SQRADDAC(a[17], a[30]); SQRADDAC(a[18], a[29]); SQRADDAC(a[19], a[28]); SQRADDAC(a[20], a[27]); SQRADDAC(a[21], a[26]); SQRADDAC(a[22], a[25]); SQRADDAC(a[23], a[24]); SQRADDDB; + COMBA_STORE(b[47]); + + /* output 48 */ + CARRY_FORWARD; + SQRADDSC(a[17], a[31]); SQRADDAC(a[18], a[30]); SQRADDAC(a[19], a[29]); SQRADDAC(a[20], a[28]); SQRADDAC(a[21], a[27]); SQRADDAC(a[22], a[26]); SQRADDAC(a[23], a[25]); SQRADDDB; SQRADD(a[24], a[24]); + COMBA_STORE(b[48]); + + /* output 49 */ + CARRY_FORWARD; + SQRADDSC(a[18], a[31]); SQRADDAC(a[19], a[30]); SQRADDAC(a[20], a[29]); SQRADDAC(a[21], a[28]); SQRADDAC(a[22], a[27]); SQRADDAC(a[23], a[26]); SQRADDAC(a[24], a[25]); SQRADDDB; + COMBA_STORE(b[49]); + + /* output 50 */ + CARRY_FORWARD; + SQRADDSC(a[19], a[31]); SQRADDAC(a[20], a[30]); SQRADDAC(a[21], a[29]); SQRADDAC(a[22], a[28]); SQRADDAC(a[23], a[27]); SQRADDAC(a[24], a[26]); SQRADDDB; SQRADD(a[25], a[25]); + COMBA_STORE(b[50]); + + /* output 51 */ + CARRY_FORWARD; + SQRADDSC(a[20], a[31]); SQRADDAC(a[21], a[30]); SQRADDAC(a[22], a[29]); SQRADDAC(a[23], a[28]); SQRADDAC(a[24], a[27]); SQRADDAC(a[25], a[26]); SQRADDDB; + COMBA_STORE(b[51]); + + /* output 52 */ + CARRY_FORWARD; + SQRADDSC(a[21], a[31]); SQRADDAC(a[22], a[30]); SQRADDAC(a[23], a[29]); SQRADDAC(a[24], a[28]); SQRADDAC(a[25], a[27]); SQRADDDB; SQRADD(a[26], a[26]); + COMBA_STORE(b[52]); + + /* output 53 */ + CARRY_FORWARD; + SQRADDSC(a[22], a[31]); SQRADDAC(a[23], a[30]); SQRADDAC(a[24], a[29]); SQRADDAC(a[25], a[28]); SQRADDAC(a[26], a[27]); SQRADDDB; + COMBA_STORE(b[53]); + + /* output 54 */ + CARRY_FORWARD; + SQRADDSC(a[23], a[31]); SQRADDAC(a[24], a[30]); SQRADDAC(a[25], a[29]); SQRADDAC(a[26], a[28]); SQRADDDB; SQRADD(a[27], a[27]); + COMBA_STORE(b[54]); + + /* output 55 */ + CARRY_FORWARD; + SQRADDSC(a[24], a[31]); SQRADDAC(a[25], a[30]); SQRADDAC(a[26], a[29]); SQRADDAC(a[27], a[28]); SQRADDDB; + COMBA_STORE(b[55]); + + /* output 56 */ + CARRY_FORWARD; + SQRADDSC(a[25], a[31]); SQRADDAC(a[26], a[30]); SQRADDAC(a[27], a[29]); SQRADDDB; SQRADD(a[28], a[28]); + COMBA_STORE(b[56]); + + /* output 57 */ + CARRY_FORWARD; + SQRADDSC(a[26], a[31]); SQRADDAC(a[27], a[30]); SQRADDAC(a[28], a[29]); SQRADDDB; + COMBA_STORE(b[57]); + + /* output 58 */ + CARRY_FORWARD; + SQRADD2(a[27], a[31]); SQRADD2(a[28], a[30]); SQRADD(a[29], a[29]); + COMBA_STORE(b[58]); + + /* output 59 */ + CARRY_FORWARD; + SQRADD2(a[28], a[31]); SQRADD2(a[29], a[30]); + COMBA_STORE(b[59]); + + /* output 60 */ + CARRY_FORWARD; + SQRADD2(a[29], a[31]); SQRADD(a[30], a[30]); + COMBA_STORE(b[60]); + + /* output 61 */ + CARRY_FORWARD; + SQRADD2(a[30], a[31]); + COMBA_STORE(b[61]); + + /* output 62 */ + CARRY_FORWARD; + SQRADD(a[31], a[31]); + COMBA_STORE(b[62]); + COMBA_STORE2(b[63]); + COMBA_FINI; + + B->used = 64; + B->sign = FP_ZPOS; + memcpy(B->dp, b, 64 * sizeof(fp_digit)); + fp_clamp(B); +} + + +#endif + +#ifdef TFM_HUGE +void fp_sqr_comba64(fp_int *A, fp_int *B) +{ + fp_digit *a, b[128], c0, c1, c2, sc0, sc1, sc2; + + a = A->dp; + COMBA_START; + + /* clear carries */ + CLEAR_CARRY; + + /* output 0 */ + SQRADD(a[0],a[0]); + COMBA_STORE(b[0]); + + /* output 1 */ + CARRY_FORWARD; + SQRADD2(a[0], a[1]); + COMBA_STORE(b[1]); + + /* output 2 */ + CARRY_FORWARD; + SQRADD2(a[0], a[2]); SQRADD(a[1], a[1]); + COMBA_STORE(b[2]); + + /* output 3 */ + CARRY_FORWARD; + SQRADD2(a[0], a[3]); SQRADD2(a[1], a[2]); + COMBA_STORE(b[3]); + + /* output 4 */ + CARRY_FORWARD; + SQRADD2(a[0], a[4]); SQRADD2(a[1], a[3]); SQRADD(a[2], a[2]); + COMBA_STORE(b[4]); + + /* output 5 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[5]); SQRADDAC(a[1], a[4]); SQRADDAC(a[2], a[3]); SQRADDDB; + COMBA_STORE(b[5]); + + /* output 6 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[6]); SQRADDAC(a[1], a[5]); SQRADDAC(a[2], a[4]); SQRADDDB; SQRADD(a[3], a[3]); + COMBA_STORE(b[6]); + + /* output 7 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[7]); SQRADDAC(a[1], a[6]); SQRADDAC(a[2], a[5]); SQRADDAC(a[3], a[4]); SQRADDDB; + COMBA_STORE(b[7]); + + /* output 8 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[8]); SQRADDAC(a[1], a[7]); SQRADDAC(a[2], a[6]); SQRADDAC(a[3], a[5]); SQRADDDB; SQRADD(a[4], a[4]); + COMBA_STORE(b[8]); + + /* output 9 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[9]); SQRADDAC(a[1], a[8]); SQRADDAC(a[2], a[7]); SQRADDAC(a[3], a[6]); SQRADDAC(a[4], a[5]); SQRADDDB; + COMBA_STORE(b[9]); + + /* output 10 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[10]); SQRADDAC(a[1], a[9]); SQRADDAC(a[2], a[8]); SQRADDAC(a[3], a[7]); SQRADDAC(a[4], a[6]); SQRADDDB; SQRADD(a[5], a[5]); + COMBA_STORE(b[10]); + + /* output 11 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[11]); SQRADDAC(a[1], a[10]); SQRADDAC(a[2], a[9]); SQRADDAC(a[3], a[8]); SQRADDAC(a[4], a[7]); SQRADDAC(a[5], a[6]); SQRADDDB; + COMBA_STORE(b[11]); + + /* output 12 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[12]); SQRADDAC(a[1], a[11]); SQRADDAC(a[2], a[10]); SQRADDAC(a[3], a[9]); SQRADDAC(a[4], a[8]); SQRADDAC(a[5], a[7]); SQRADDDB; SQRADD(a[6], a[6]); + COMBA_STORE(b[12]); + + /* output 13 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[13]); SQRADDAC(a[1], a[12]); SQRADDAC(a[2], a[11]); SQRADDAC(a[3], a[10]); SQRADDAC(a[4], a[9]); SQRADDAC(a[5], a[8]); SQRADDAC(a[6], a[7]); SQRADDDB; + COMBA_STORE(b[13]); + + /* output 14 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[14]); SQRADDAC(a[1], a[13]); SQRADDAC(a[2], a[12]); SQRADDAC(a[3], a[11]); SQRADDAC(a[4], a[10]); SQRADDAC(a[5], a[9]); SQRADDAC(a[6], a[8]); SQRADDDB; SQRADD(a[7], a[7]); + COMBA_STORE(b[14]); + + /* output 15 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[15]); SQRADDAC(a[1], a[14]); SQRADDAC(a[2], a[13]); SQRADDAC(a[3], a[12]); SQRADDAC(a[4], a[11]); SQRADDAC(a[5], a[10]); SQRADDAC(a[6], a[9]); SQRADDAC(a[7], a[8]); SQRADDDB; + COMBA_STORE(b[15]); + + /* output 16 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[16]); SQRADDAC(a[1], a[15]); SQRADDAC(a[2], a[14]); SQRADDAC(a[3], a[13]); SQRADDAC(a[4], a[12]); SQRADDAC(a[5], a[11]); SQRADDAC(a[6], a[10]); SQRADDAC(a[7], a[9]); SQRADDDB; SQRADD(a[8], a[8]); + COMBA_STORE(b[16]); + + /* output 17 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[17]); SQRADDAC(a[1], a[16]); SQRADDAC(a[2], a[15]); SQRADDAC(a[3], a[14]); SQRADDAC(a[4], a[13]); SQRADDAC(a[5], a[12]); SQRADDAC(a[6], a[11]); SQRADDAC(a[7], a[10]); SQRADDAC(a[8], a[9]); SQRADDDB; + COMBA_STORE(b[17]); + + /* output 18 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[18]); SQRADDAC(a[1], a[17]); SQRADDAC(a[2], a[16]); SQRADDAC(a[3], a[15]); SQRADDAC(a[4], a[14]); SQRADDAC(a[5], a[13]); SQRADDAC(a[6], a[12]); SQRADDAC(a[7], a[11]); SQRADDAC(a[8], a[10]); SQRADDDB; SQRADD(a[9], a[9]); + COMBA_STORE(b[18]); + + /* output 19 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[19]); SQRADDAC(a[1], a[18]); SQRADDAC(a[2], a[17]); SQRADDAC(a[3], a[16]); SQRADDAC(a[4], a[15]); SQRADDAC(a[5], a[14]); SQRADDAC(a[6], a[13]); SQRADDAC(a[7], a[12]); SQRADDAC(a[8], a[11]); SQRADDAC(a[9], a[10]); SQRADDDB; + COMBA_STORE(b[19]); + + /* output 20 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[20]); SQRADDAC(a[1], a[19]); SQRADDAC(a[2], a[18]); SQRADDAC(a[3], a[17]); SQRADDAC(a[4], a[16]); SQRADDAC(a[5], a[15]); SQRADDAC(a[6], a[14]); SQRADDAC(a[7], a[13]); SQRADDAC(a[8], a[12]); SQRADDAC(a[9], a[11]); SQRADDDB; SQRADD(a[10], a[10]); + COMBA_STORE(b[20]); + + /* output 21 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[21]); SQRADDAC(a[1], a[20]); SQRADDAC(a[2], a[19]); SQRADDAC(a[3], a[18]); SQRADDAC(a[4], a[17]); SQRADDAC(a[5], a[16]); SQRADDAC(a[6], a[15]); SQRADDAC(a[7], a[14]); SQRADDAC(a[8], a[13]); SQRADDAC(a[9], a[12]); SQRADDAC(a[10], a[11]); SQRADDDB; + COMBA_STORE(b[21]); + + /* output 22 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[22]); SQRADDAC(a[1], a[21]); SQRADDAC(a[2], a[20]); SQRADDAC(a[3], a[19]); SQRADDAC(a[4], a[18]); SQRADDAC(a[5], a[17]); SQRADDAC(a[6], a[16]); SQRADDAC(a[7], a[15]); SQRADDAC(a[8], a[14]); SQRADDAC(a[9], a[13]); SQRADDAC(a[10], a[12]); SQRADDDB; SQRADD(a[11], a[11]); + COMBA_STORE(b[22]); + + /* output 23 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[23]); SQRADDAC(a[1], a[22]); SQRADDAC(a[2], a[21]); SQRADDAC(a[3], a[20]); SQRADDAC(a[4], a[19]); SQRADDAC(a[5], a[18]); SQRADDAC(a[6], a[17]); SQRADDAC(a[7], a[16]); SQRADDAC(a[8], a[15]); SQRADDAC(a[9], a[14]); SQRADDAC(a[10], a[13]); SQRADDAC(a[11], a[12]); SQRADDDB; + COMBA_STORE(b[23]); + + /* output 24 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[24]); SQRADDAC(a[1], a[23]); SQRADDAC(a[2], a[22]); SQRADDAC(a[3], a[21]); SQRADDAC(a[4], a[20]); SQRADDAC(a[5], a[19]); SQRADDAC(a[6], a[18]); SQRADDAC(a[7], a[17]); SQRADDAC(a[8], a[16]); SQRADDAC(a[9], a[15]); SQRADDAC(a[10], a[14]); SQRADDAC(a[11], a[13]); SQRADDDB; SQRADD(a[12], a[12]); + COMBA_STORE(b[24]); + + /* output 25 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[25]); SQRADDAC(a[1], a[24]); SQRADDAC(a[2], a[23]); SQRADDAC(a[3], a[22]); SQRADDAC(a[4], a[21]); SQRADDAC(a[5], a[20]); SQRADDAC(a[6], a[19]); SQRADDAC(a[7], a[18]); SQRADDAC(a[8], a[17]); SQRADDAC(a[9], a[16]); SQRADDAC(a[10], a[15]); SQRADDAC(a[11], a[14]); SQRADDAC(a[12], a[13]); SQRADDDB; + COMBA_STORE(b[25]); + + /* output 26 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[26]); SQRADDAC(a[1], a[25]); SQRADDAC(a[2], a[24]); SQRADDAC(a[3], a[23]); SQRADDAC(a[4], a[22]); SQRADDAC(a[5], a[21]); SQRADDAC(a[6], a[20]); SQRADDAC(a[7], a[19]); SQRADDAC(a[8], a[18]); SQRADDAC(a[9], a[17]); SQRADDAC(a[10], a[16]); SQRADDAC(a[11], a[15]); SQRADDAC(a[12], a[14]); SQRADDDB; SQRADD(a[13], a[13]); + COMBA_STORE(b[26]); + + /* output 27 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[27]); SQRADDAC(a[1], a[26]); SQRADDAC(a[2], a[25]); SQRADDAC(a[3], a[24]); SQRADDAC(a[4], a[23]); SQRADDAC(a[5], a[22]); SQRADDAC(a[6], a[21]); SQRADDAC(a[7], a[20]); SQRADDAC(a[8], a[19]); SQRADDAC(a[9], a[18]); SQRADDAC(a[10], a[17]); SQRADDAC(a[11], a[16]); SQRADDAC(a[12], a[15]); SQRADDAC(a[13], a[14]); SQRADDDB; + COMBA_STORE(b[27]); + + /* output 28 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[28]); SQRADDAC(a[1], a[27]); SQRADDAC(a[2], a[26]); SQRADDAC(a[3], a[25]); SQRADDAC(a[4], a[24]); SQRADDAC(a[5], a[23]); SQRADDAC(a[6], a[22]); SQRADDAC(a[7], a[21]); SQRADDAC(a[8], a[20]); SQRADDAC(a[9], a[19]); SQRADDAC(a[10], a[18]); SQRADDAC(a[11], a[17]); SQRADDAC(a[12], a[16]); SQRADDAC(a[13], a[15]); SQRADDDB; SQRADD(a[14], a[14]); + COMBA_STORE(b[28]); + + /* output 29 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[29]); SQRADDAC(a[1], a[28]); SQRADDAC(a[2], a[27]); SQRADDAC(a[3], a[26]); SQRADDAC(a[4], a[25]); SQRADDAC(a[5], a[24]); SQRADDAC(a[6], a[23]); SQRADDAC(a[7], a[22]); SQRADDAC(a[8], a[21]); SQRADDAC(a[9], a[20]); SQRADDAC(a[10], a[19]); SQRADDAC(a[11], a[18]); SQRADDAC(a[12], a[17]); SQRADDAC(a[13], a[16]); SQRADDAC(a[14], a[15]); SQRADDDB; + COMBA_STORE(b[29]); + + /* output 30 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[30]); SQRADDAC(a[1], a[29]); SQRADDAC(a[2], a[28]); SQRADDAC(a[3], a[27]); SQRADDAC(a[4], a[26]); SQRADDAC(a[5], a[25]); SQRADDAC(a[6], a[24]); SQRADDAC(a[7], a[23]); SQRADDAC(a[8], a[22]); SQRADDAC(a[9], a[21]); SQRADDAC(a[10], a[20]); SQRADDAC(a[11], a[19]); SQRADDAC(a[12], a[18]); SQRADDAC(a[13], a[17]); SQRADDAC(a[14], a[16]); SQRADDDB; SQRADD(a[15], a[15]); + COMBA_STORE(b[30]); + + /* output 31 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[31]); SQRADDAC(a[1], a[30]); SQRADDAC(a[2], a[29]); SQRADDAC(a[3], a[28]); SQRADDAC(a[4], a[27]); SQRADDAC(a[5], a[26]); SQRADDAC(a[6], a[25]); SQRADDAC(a[7], a[24]); SQRADDAC(a[8], a[23]); SQRADDAC(a[9], a[22]); SQRADDAC(a[10], a[21]); SQRADDAC(a[11], a[20]); SQRADDAC(a[12], a[19]); SQRADDAC(a[13], a[18]); SQRADDAC(a[14], a[17]); SQRADDAC(a[15], a[16]); SQRADDDB; + COMBA_STORE(b[31]); + + /* output 32 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[32]); SQRADDAC(a[1], a[31]); SQRADDAC(a[2], a[30]); SQRADDAC(a[3], a[29]); SQRADDAC(a[4], a[28]); SQRADDAC(a[5], a[27]); SQRADDAC(a[6], a[26]); SQRADDAC(a[7], a[25]); SQRADDAC(a[8], a[24]); SQRADDAC(a[9], a[23]); SQRADDAC(a[10], a[22]); SQRADDAC(a[11], a[21]); SQRADDAC(a[12], a[20]); SQRADDAC(a[13], a[19]); SQRADDAC(a[14], a[18]); SQRADDAC(a[15], a[17]); SQRADDDB; SQRADD(a[16], a[16]); + COMBA_STORE(b[32]); + + /* output 33 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[33]); SQRADDAC(a[1], a[32]); SQRADDAC(a[2], a[31]); SQRADDAC(a[3], a[30]); SQRADDAC(a[4], a[29]); SQRADDAC(a[5], a[28]); SQRADDAC(a[6], a[27]); SQRADDAC(a[7], a[26]); SQRADDAC(a[8], a[25]); SQRADDAC(a[9], a[24]); SQRADDAC(a[10], a[23]); SQRADDAC(a[11], a[22]); SQRADDAC(a[12], a[21]); SQRADDAC(a[13], a[20]); SQRADDAC(a[14], a[19]); SQRADDAC(a[15], a[18]); SQRADDAC(a[16], a[17]); SQRADDDB; + COMBA_STORE(b[33]); + + /* output 34 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[34]); SQRADDAC(a[1], a[33]); SQRADDAC(a[2], a[32]); SQRADDAC(a[3], a[31]); SQRADDAC(a[4], a[30]); SQRADDAC(a[5], a[29]); SQRADDAC(a[6], a[28]); SQRADDAC(a[7], a[27]); SQRADDAC(a[8], a[26]); SQRADDAC(a[9], a[25]); SQRADDAC(a[10], a[24]); SQRADDAC(a[11], a[23]); SQRADDAC(a[12], a[22]); SQRADDAC(a[13], a[21]); SQRADDAC(a[14], a[20]); SQRADDAC(a[15], a[19]); SQRADDAC(a[16], a[18]); SQRADDDB; SQRADD(a[17], a[17]); + COMBA_STORE(b[34]); + + /* output 35 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[35]); SQRADDAC(a[1], a[34]); SQRADDAC(a[2], a[33]); SQRADDAC(a[3], a[32]); SQRADDAC(a[4], a[31]); SQRADDAC(a[5], a[30]); SQRADDAC(a[6], a[29]); SQRADDAC(a[7], a[28]); SQRADDAC(a[8], a[27]); SQRADDAC(a[9], a[26]); SQRADDAC(a[10], a[25]); SQRADDAC(a[11], a[24]); SQRADDAC(a[12], a[23]); SQRADDAC(a[13], a[22]); SQRADDAC(a[14], a[21]); SQRADDAC(a[15], a[20]); SQRADDAC(a[16], a[19]); SQRADDAC(a[17], a[18]); SQRADDDB; + COMBA_STORE(b[35]); + + /* output 36 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[36]); SQRADDAC(a[1], a[35]); SQRADDAC(a[2], a[34]); SQRADDAC(a[3], a[33]); SQRADDAC(a[4], a[32]); SQRADDAC(a[5], a[31]); SQRADDAC(a[6], a[30]); SQRADDAC(a[7], a[29]); SQRADDAC(a[8], a[28]); SQRADDAC(a[9], a[27]); SQRADDAC(a[10], a[26]); SQRADDAC(a[11], a[25]); SQRADDAC(a[12], a[24]); SQRADDAC(a[13], a[23]); SQRADDAC(a[14], a[22]); SQRADDAC(a[15], a[21]); SQRADDAC(a[16], a[20]); SQRADDAC(a[17], a[19]); SQRADDDB; SQRADD(a[18], a[18]); + COMBA_STORE(b[36]); + + /* output 37 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[37]); SQRADDAC(a[1], a[36]); SQRADDAC(a[2], a[35]); SQRADDAC(a[3], a[34]); SQRADDAC(a[4], a[33]); SQRADDAC(a[5], a[32]); SQRADDAC(a[6], a[31]); SQRADDAC(a[7], a[30]); SQRADDAC(a[8], a[29]); SQRADDAC(a[9], a[28]); SQRADDAC(a[10], a[27]); SQRADDAC(a[11], a[26]); SQRADDAC(a[12], a[25]); SQRADDAC(a[13], a[24]); SQRADDAC(a[14], a[23]); SQRADDAC(a[15], a[22]); SQRADDAC(a[16], a[21]); SQRADDAC(a[17], a[20]); SQRADDAC(a[18], a[19]); SQRADDDB; + COMBA_STORE(b[37]); + + /* output 38 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[38]); SQRADDAC(a[1], a[37]); SQRADDAC(a[2], a[36]); SQRADDAC(a[3], a[35]); SQRADDAC(a[4], a[34]); SQRADDAC(a[5], a[33]); SQRADDAC(a[6], a[32]); SQRADDAC(a[7], a[31]); SQRADDAC(a[8], a[30]); SQRADDAC(a[9], a[29]); SQRADDAC(a[10], a[28]); SQRADDAC(a[11], a[27]); SQRADDAC(a[12], a[26]); SQRADDAC(a[13], a[25]); SQRADDAC(a[14], a[24]); SQRADDAC(a[15], a[23]); SQRADDAC(a[16], a[22]); SQRADDAC(a[17], a[21]); SQRADDAC(a[18], a[20]); SQRADDDB; SQRADD(a[19], a[19]); + COMBA_STORE(b[38]); + + /* output 39 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[39]); SQRADDAC(a[1], a[38]); SQRADDAC(a[2], a[37]); SQRADDAC(a[3], a[36]); SQRADDAC(a[4], a[35]); SQRADDAC(a[5], a[34]); SQRADDAC(a[6], a[33]); SQRADDAC(a[7], a[32]); SQRADDAC(a[8], a[31]); SQRADDAC(a[9], a[30]); SQRADDAC(a[10], a[29]); SQRADDAC(a[11], a[28]); SQRADDAC(a[12], a[27]); SQRADDAC(a[13], a[26]); SQRADDAC(a[14], a[25]); SQRADDAC(a[15], a[24]); SQRADDAC(a[16], a[23]); SQRADDAC(a[17], a[22]); SQRADDAC(a[18], a[21]); SQRADDAC(a[19], a[20]); SQRADDDB; + COMBA_STORE(b[39]); + + /* output 40 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[40]); SQRADDAC(a[1], a[39]); SQRADDAC(a[2], a[38]); SQRADDAC(a[3], a[37]); SQRADDAC(a[4], a[36]); SQRADDAC(a[5], a[35]); SQRADDAC(a[6], a[34]); SQRADDAC(a[7], a[33]); SQRADDAC(a[8], a[32]); SQRADDAC(a[9], a[31]); SQRADDAC(a[10], a[30]); SQRADDAC(a[11], a[29]); SQRADDAC(a[12], a[28]); SQRADDAC(a[13], a[27]); SQRADDAC(a[14], a[26]); SQRADDAC(a[15], a[25]); SQRADDAC(a[16], a[24]); SQRADDAC(a[17], a[23]); SQRADDAC(a[18], a[22]); SQRADDAC(a[19], a[21]); SQRADDDB; SQRADD(a[20], a[20]); + COMBA_STORE(b[40]); + + /* output 41 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[41]); SQRADDAC(a[1], a[40]); SQRADDAC(a[2], a[39]); SQRADDAC(a[3], a[38]); SQRADDAC(a[4], a[37]); SQRADDAC(a[5], a[36]); SQRADDAC(a[6], a[35]); SQRADDAC(a[7], a[34]); SQRADDAC(a[8], a[33]); SQRADDAC(a[9], a[32]); SQRADDAC(a[10], a[31]); SQRADDAC(a[11], a[30]); SQRADDAC(a[12], a[29]); SQRADDAC(a[13], a[28]); SQRADDAC(a[14], a[27]); SQRADDAC(a[15], a[26]); SQRADDAC(a[16], a[25]); SQRADDAC(a[17], a[24]); SQRADDAC(a[18], a[23]); SQRADDAC(a[19], a[22]); SQRADDAC(a[20], a[21]); SQRADDDB; + COMBA_STORE(b[41]); + + /* output 42 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[42]); SQRADDAC(a[1], a[41]); SQRADDAC(a[2], a[40]); SQRADDAC(a[3], a[39]); SQRADDAC(a[4], a[38]); SQRADDAC(a[5], a[37]); SQRADDAC(a[6], a[36]); SQRADDAC(a[7], a[35]); SQRADDAC(a[8], a[34]); SQRADDAC(a[9], a[33]); SQRADDAC(a[10], a[32]); SQRADDAC(a[11], a[31]); SQRADDAC(a[12], a[30]); SQRADDAC(a[13], a[29]); SQRADDAC(a[14], a[28]); SQRADDAC(a[15], a[27]); SQRADDAC(a[16], a[26]); SQRADDAC(a[17], a[25]); SQRADDAC(a[18], a[24]); SQRADDAC(a[19], a[23]); SQRADDAC(a[20], a[22]); SQRADDDB; SQRADD(a[21], a[21]); + COMBA_STORE(b[42]); + + /* output 43 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[43]); SQRADDAC(a[1], a[42]); SQRADDAC(a[2], a[41]); SQRADDAC(a[3], a[40]); SQRADDAC(a[4], a[39]); SQRADDAC(a[5], a[38]); SQRADDAC(a[6], a[37]); SQRADDAC(a[7], a[36]); SQRADDAC(a[8], a[35]); SQRADDAC(a[9], a[34]); SQRADDAC(a[10], a[33]); SQRADDAC(a[11], a[32]); SQRADDAC(a[12], a[31]); SQRADDAC(a[13], a[30]); SQRADDAC(a[14], a[29]); SQRADDAC(a[15], a[28]); SQRADDAC(a[16], a[27]); SQRADDAC(a[17], a[26]); SQRADDAC(a[18], a[25]); SQRADDAC(a[19], a[24]); SQRADDAC(a[20], a[23]); SQRADDAC(a[21], a[22]); SQRADDDB; + COMBA_STORE(b[43]); + + /* output 44 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[44]); SQRADDAC(a[1], a[43]); SQRADDAC(a[2], a[42]); SQRADDAC(a[3], a[41]); SQRADDAC(a[4], a[40]); SQRADDAC(a[5], a[39]); SQRADDAC(a[6], a[38]); SQRADDAC(a[7], a[37]); SQRADDAC(a[8], a[36]); SQRADDAC(a[9], a[35]); SQRADDAC(a[10], a[34]); SQRADDAC(a[11], a[33]); SQRADDAC(a[12], a[32]); SQRADDAC(a[13], a[31]); SQRADDAC(a[14], a[30]); SQRADDAC(a[15], a[29]); SQRADDAC(a[16], a[28]); SQRADDAC(a[17], a[27]); SQRADDAC(a[18], a[26]); SQRADDAC(a[19], a[25]); SQRADDAC(a[20], a[24]); SQRADDAC(a[21], a[23]); SQRADDDB; SQRADD(a[22], a[22]); + COMBA_STORE(b[44]); + + /* output 45 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[45]); SQRADDAC(a[1], a[44]); SQRADDAC(a[2], a[43]); SQRADDAC(a[3], a[42]); SQRADDAC(a[4], a[41]); SQRADDAC(a[5], a[40]); SQRADDAC(a[6], a[39]); SQRADDAC(a[7], a[38]); SQRADDAC(a[8], a[37]); SQRADDAC(a[9], a[36]); SQRADDAC(a[10], a[35]); SQRADDAC(a[11], a[34]); SQRADDAC(a[12], a[33]); SQRADDAC(a[13], a[32]); SQRADDAC(a[14], a[31]); SQRADDAC(a[15], a[30]); SQRADDAC(a[16], a[29]); SQRADDAC(a[17], a[28]); SQRADDAC(a[18], a[27]); SQRADDAC(a[19], a[26]); SQRADDAC(a[20], a[25]); SQRADDAC(a[21], a[24]); SQRADDAC(a[22], a[23]); SQRADDDB; + COMBA_STORE(b[45]); + + /* output 46 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[46]); SQRADDAC(a[1], a[45]); SQRADDAC(a[2], a[44]); SQRADDAC(a[3], a[43]); SQRADDAC(a[4], a[42]); SQRADDAC(a[5], a[41]); SQRADDAC(a[6], a[40]); SQRADDAC(a[7], a[39]); SQRADDAC(a[8], a[38]); SQRADDAC(a[9], a[37]); SQRADDAC(a[10], a[36]); SQRADDAC(a[11], a[35]); SQRADDAC(a[12], a[34]); SQRADDAC(a[13], a[33]); SQRADDAC(a[14], a[32]); SQRADDAC(a[15], a[31]); SQRADDAC(a[16], a[30]); SQRADDAC(a[17], a[29]); SQRADDAC(a[18], a[28]); SQRADDAC(a[19], a[27]); SQRADDAC(a[20], a[26]); SQRADDAC(a[21], a[25]); SQRADDAC(a[22], a[24]); SQRADDDB; SQRADD(a[23], a[23]); + COMBA_STORE(b[46]); + + /* output 47 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[47]); SQRADDAC(a[1], a[46]); SQRADDAC(a[2], a[45]); SQRADDAC(a[3], a[44]); SQRADDAC(a[4], a[43]); SQRADDAC(a[5], a[42]); SQRADDAC(a[6], a[41]); SQRADDAC(a[7], a[40]); SQRADDAC(a[8], a[39]); SQRADDAC(a[9], a[38]); SQRADDAC(a[10], a[37]); SQRADDAC(a[11], a[36]); SQRADDAC(a[12], a[35]); SQRADDAC(a[13], a[34]); SQRADDAC(a[14], a[33]); SQRADDAC(a[15], a[32]); SQRADDAC(a[16], a[31]); SQRADDAC(a[17], a[30]); SQRADDAC(a[18], a[29]); SQRADDAC(a[19], a[28]); SQRADDAC(a[20], a[27]); SQRADDAC(a[21], a[26]); SQRADDAC(a[22], a[25]); SQRADDAC(a[23], a[24]); SQRADDDB; + COMBA_STORE(b[47]); + + /* output 48 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[48]); SQRADDAC(a[1], a[47]); SQRADDAC(a[2], a[46]); SQRADDAC(a[3], a[45]); SQRADDAC(a[4], a[44]); SQRADDAC(a[5], a[43]); SQRADDAC(a[6], a[42]); SQRADDAC(a[7], a[41]); SQRADDAC(a[8], a[40]); SQRADDAC(a[9], a[39]); SQRADDAC(a[10], a[38]); SQRADDAC(a[11], a[37]); SQRADDAC(a[12], a[36]); SQRADDAC(a[13], a[35]); SQRADDAC(a[14], a[34]); SQRADDAC(a[15], a[33]); SQRADDAC(a[16], a[32]); SQRADDAC(a[17], a[31]); SQRADDAC(a[18], a[30]); SQRADDAC(a[19], a[29]); SQRADDAC(a[20], a[28]); SQRADDAC(a[21], a[27]); SQRADDAC(a[22], a[26]); SQRADDAC(a[23], a[25]); SQRADDDB; SQRADD(a[24], a[24]); + COMBA_STORE(b[48]); + + /* output 49 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[49]); SQRADDAC(a[1], a[48]); SQRADDAC(a[2], a[47]); SQRADDAC(a[3], a[46]); SQRADDAC(a[4], a[45]); SQRADDAC(a[5], a[44]); SQRADDAC(a[6], a[43]); SQRADDAC(a[7], a[42]); SQRADDAC(a[8], a[41]); SQRADDAC(a[9], a[40]); SQRADDAC(a[10], a[39]); SQRADDAC(a[11], a[38]); SQRADDAC(a[12], a[37]); SQRADDAC(a[13], a[36]); SQRADDAC(a[14], a[35]); SQRADDAC(a[15], a[34]); SQRADDAC(a[16], a[33]); SQRADDAC(a[17], a[32]); SQRADDAC(a[18], a[31]); SQRADDAC(a[19], a[30]); SQRADDAC(a[20], a[29]); SQRADDAC(a[21], a[28]); SQRADDAC(a[22], a[27]); SQRADDAC(a[23], a[26]); SQRADDAC(a[24], a[25]); SQRADDDB; + COMBA_STORE(b[49]); + + /* output 50 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[50]); SQRADDAC(a[1], a[49]); SQRADDAC(a[2], a[48]); SQRADDAC(a[3], a[47]); SQRADDAC(a[4], a[46]); SQRADDAC(a[5], a[45]); SQRADDAC(a[6], a[44]); SQRADDAC(a[7], a[43]); SQRADDAC(a[8], a[42]); SQRADDAC(a[9], a[41]); SQRADDAC(a[10], a[40]); SQRADDAC(a[11], a[39]); SQRADDAC(a[12], a[38]); SQRADDAC(a[13], a[37]); SQRADDAC(a[14], a[36]); SQRADDAC(a[15], a[35]); SQRADDAC(a[16], a[34]); SQRADDAC(a[17], a[33]); SQRADDAC(a[18], a[32]); SQRADDAC(a[19], a[31]); SQRADDAC(a[20], a[30]); SQRADDAC(a[21], a[29]); SQRADDAC(a[22], a[28]); SQRADDAC(a[23], a[27]); SQRADDAC(a[24], a[26]); SQRADDDB; SQRADD(a[25], a[25]); + COMBA_STORE(b[50]); + + /* output 51 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[51]); SQRADDAC(a[1], a[50]); SQRADDAC(a[2], a[49]); SQRADDAC(a[3], a[48]); SQRADDAC(a[4], a[47]); SQRADDAC(a[5], a[46]); SQRADDAC(a[6], a[45]); SQRADDAC(a[7], a[44]); SQRADDAC(a[8], a[43]); SQRADDAC(a[9], a[42]); SQRADDAC(a[10], a[41]); SQRADDAC(a[11], a[40]); SQRADDAC(a[12], a[39]); SQRADDAC(a[13], a[38]); SQRADDAC(a[14], a[37]); SQRADDAC(a[15], a[36]); SQRADDAC(a[16], a[35]); SQRADDAC(a[17], a[34]); SQRADDAC(a[18], a[33]); SQRADDAC(a[19], a[32]); SQRADDAC(a[20], a[31]); SQRADDAC(a[21], a[30]); SQRADDAC(a[22], a[29]); SQRADDAC(a[23], a[28]); SQRADDAC(a[24], a[27]); SQRADDAC(a[25], a[26]); SQRADDDB; + COMBA_STORE(b[51]); + + /* output 52 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[52]); SQRADDAC(a[1], a[51]); SQRADDAC(a[2], a[50]); SQRADDAC(a[3], a[49]); SQRADDAC(a[4], a[48]); SQRADDAC(a[5], a[47]); SQRADDAC(a[6], a[46]); SQRADDAC(a[7], a[45]); SQRADDAC(a[8], a[44]); SQRADDAC(a[9], a[43]); SQRADDAC(a[10], a[42]); SQRADDAC(a[11], a[41]); SQRADDAC(a[12], a[40]); SQRADDAC(a[13], a[39]); SQRADDAC(a[14], a[38]); SQRADDAC(a[15], a[37]); SQRADDAC(a[16], a[36]); SQRADDAC(a[17], a[35]); SQRADDAC(a[18], a[34]); SQRADDAC(a[19], a[33]); SQRADDAC(a[20], a[32]); SQRADDAC(a[21], a[31]); SQRADDAC(a[22], a[30]); SQRADDAC(a[23], a[29]); SQRADDAC(a[24], a[28]); SQRADDAC(a[25], a[27]); SQRADDDB; SQRADD(a[26], a[26]); + COMBA_STORE(b[52]); + + /* output 53 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[53]); SQRADDAC(a[1], a[52]); SQRADDAC(a[2], a[51]); SQRADDAC(a[3], a[50]); SQRADDAC(a[4], a[49]); SQRADDAC(a[5], a[48]); SQRADDAC(a[6], a[47]); SQRADDAC(a[7], a[46]); SQRADDAC(a[8], a[45]); SQRADDAC(a[9], a[44]); SQRADDAC(a[10], a[43]); SQRADDAC(a[11], a[42]); SQRADDAC(a[12], a[41]); SQRADDAC(a[13], a[40]); SQRADDAC(a[14], a[39]); SQRADDAC(a[15], a[38]); SQRADDAC(a[16], a[37]); SQRADDAC(a[17], a[36]); SQRADDAC(a[18], a[35]); SQRADDAC(a[19], a[34]); SQRADDAC(a[20], a[33]); SQRADDAC(a[21], a[32]); SQRADDAC(a[22], a[31]); SQRADDAC(a[23], a[30]); SQRADDAC(a[24], a[29]); SQRADDAC(a[25], a[28]); SQRADDAC(a[26], a[27]); SQRADDDB; + COMBA_STORE(b[53]); + + /* output 54 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[54]); SQRADDAC(a[1], a[53]); SQRADDAC(a[2], a[52]); SQRADDAC(a[3], a[51]); SQRADDAC(a[4], a[50]); SQRADDAC(a[5], a[49]); SQRADDAC(a[6], a[48]); SQRADDAC(a[7], a[47]); SQRADDAC(a[8], a[46]); SQRADDAC(a[9], a[45]); SQRADDAC(a[10], a[44]); SQRADDAC(a[11], a[43]); SQRADDAC(a[12], a[42]); SQRADDAC(a[13], a[41]); SQRADDAC(a[14], a[40]); SQRADDAC(a[15], a[39]); SQRADDAC(a[16], a[38]); SQRADDAC(a[17], a[37]); SQRADDAC(a[18], a[36]); SQRADDAC(a[19], a[35]); SQRADDAC(a[20], a[34]); SQRADDAC(a[21], a[33]); SQRADDAC(a[22], a[32]); SQRADDAC(a[23], a[31]); SQRADDAC(a[24], a[30]); SQRADDAC(a[25], a[29]); SQRADDAC(a[26], a[28]); SQRADDDB; SQRADD(a[27], a[27]); + COMBA_STORE(b[54]); + + /* output 55 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[55]); SQRADDAC(a[1], a[54]); SQRADDAC(a[2], a[53]); SQRADDAC(a[3], a[52]); SQRADDAC(a[4], a[51]); SQRADDAC(a[5], a[50]); SQRADDAC(a[6], a[49]); SQRADDAC(a[7], a[48]); SQRADDAC(a[8], a[47]); SQRADDAC(a[9], a[46]); SQRADDAC(a[10], a[45]); SQRADDAC(a[11], a[44]); SQRADDAC(a[12], a[43]); SQRADDAC(a[13], a[42]); SQRADDAC(a[14], a[41]); SQRADDAC(a[15], a[40]); SQRADDAC(a[16], a[39]); SQRADDAC(a[17], a[38]); SQRADDAC(a[18], a[37]); SQRADDAC(a[19], a[36]); SQRADDAC(a[20], a[35]); SQRADDAC(a[21], a[34]); SQRADDAC(a[22], a[33]); SQRADDAC(a[23], a[32]); SQRADDAC(a[24], a[31]); SQRADDAC(a[25], a[30]); SQRADDAC(a[26], a[29]); SQRADDAC(a[27], a[28]); SQRADDDB; + COMBA_STORE(b[55]); + + /* output 56 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[56]); SQRADDAC(a[1], a[55]); SQRADDAC(a[2], a[54]); SQRADDAC(a[3], a[53]); SQRADDAC(a[4], a[52]); SQRADDAC(a[5], a[51]); SQRADDAC(a[6], a[50]); SQRADDAC(a[7], a[49]); SQRADDAC(a[8], a[48]); SQRADDAC(a[9], a[47]); SQRADDAC(a[10], a[46]); SQRADDAC(a[11], a[45]); SQRADDAC(a[12], a[44]); SQRADDAC(a[13], a[43]); SQRADDAC(a[14], a[42]); SQRADDAC(a[15], a[41]); SQRADDAC(a[16], a[40]); SQRADDAC(a[17], a[39]); SQRADDAC(a[18], a[38]); SQRADDAC(a[19], a[37]); SQRADDAC(a[20], a[36]); SQRADDAC(a[21], a[35]); SQRADDAC(a[22], a[34]); SQRADDAC(a[23], a[33]); SQRADDAC(a[24], a[32]); SQRADDAC(a[25], a[31]); SQRADDAC(a[26], a[30]); SQRADDAC(a[27], a[29]); SQRADDDB; SQRADD(a[28], a[28]); + COMBA_STORE(b[56]); + + /* output 57 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[57]); SQRADDAC(a[1], a[56]); SQRADDAC(a[2], a[55]); SQRADDAC(a[3], a[54]); SQRADDAC(a[4], a[53]); SQRADDAC(a[5], a[52]); SQRADDAC(a[6], a[51]); SQRADDAC(a[7], a[50]); SQRADDAC(a[8], a[49]); SQRADDAC(a[9], a[48]); SQRADDAC(a[10], a[47]); SQRADDAC(a[11], a[46]); SQRADDAC(a[12], a[45]); SQRADDAC(a[13], a[44]); SQRADDAC(a[14], a[43]); SQRADDAC(a[15], a[42]); SQRADDAC(a[16], a[41]); SQRADDAC(a[17], a[40]); SQRADDAC(a[18], a[39]); SQRADDAC(a[19], a[38]); SQRADDAC(a[20], a[37]); SQRADDAC(a[21], a[36]); SQRADDAC(a[22], a[35]); SQRADDAC(a[23], a[34]); SQRADDAC(a[24], a[33]); SQRADDAC(a[25], a[32]); SQRADDAC(a[26], a[31]); SQRADDAC(a[27], a[30]); SQRADDAC(a[28], a[29]); SQRADDDB; + COMBA_STORE(b[57]); + + /* output 58 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[58]); SQRADDAC(a[1], a[57]); SQRADDAC(a[2], a[56]); SQRADDAC(a[3], a[55]); SQRADDAC(a[4], a[54]); SQRADDAC(a[5], a[53]); SQRADDAC(a[6], a[52]); SQRADDAC(a[7], a[51]); SQRADDAC(a[8], a[50]); SQRADDAC(a[9], a[49]); SQRADDAC(a[10], a[48]); SQRADDAC(a[11], a[47]); SQRADDAC(a[12], a[46]); SQRADDAC(a[13], a[45]); SQRADDAC(a[14], a[44]); SQRADDAC(a[15], a[43]); SQRADDAC(a[16], a[42]); SQRADDAC(a[17], a[41]); SQRADDAC(a[18], a[40]); SQRADDAC(a[19], a[39]); SQRADDAC(a[20], a[38]); SQRADDAC(a[21], a[37]); SQRADDAC(a[22], a[36]); SQRADDAC(a[23], a[35]); SQRADDAC(a[24], a[34]); SQRADDAC(a[25], a[33]); SQRADDAC(a[26], a[32]); SQRADDAC(a[27], a[31]); SQRADDAC(a[28], a[30]); SQRADDDB; SQRADD(a[29], a[29]); + COMBA_STORE(b[58]); + + /* output 59 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[59]); SQRADDAC(a[1], a[58]); SQRADDAC(a[2], a[57]); SQRADDAC(a[3], a[56]); SQRADDAC(a[4], a[55]); SQRADDAC(a[5], a[54]); SQRADDAC(a[6], a[53]); SQRADDAC(a[7], a[52]); SQRADDAC(a[8], a[51]); SQRADDAC(a[9], a[50]); SQRADDAC(a[10], a[49]); SQRADDAC(a[11], a[48]); SQRADDAC(a[12], a[47]); SQRADDAC(a[13], a[46]); SQRADDAC(a[14], a[45]); SQRADDAC(a[15], a[44]); SQRADDAC(a[16], a[43]); SQRADDAC(a[17], a[42]); SQRADDAC(a[18], a[41]); SQRADDAC(a[19], a[40]); SQRADDAC(a[20], a[39]); SQRADDAC(a[21], a[38]); SQRADDAC(a[22], a[37]); SQRADDAC(a[23], a[36]); SQRADDAC(a[24], a[35]); SQRADDAC(a[25], a[34]); SQRADDAC(a[26], a[33]); SQRADDAC(a[27], a[32]); SQRADDAC(a[28], a[31]); SQRADDAC(a[29], a[30]); SQRADDDB; + COMBA_STORE(b[59]); + + /* output 60 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[60]); SQRADDAC(a[1], a[59]); SQRADDAC(a[2], a[58]); SQRADDAC(a[3], a[57]); SQRADDAC(a[4], a[56]); SQRADDAC(a[5], a[55]); SQRADDAC(a[6], a[54]); SQRADDAC(a[7], a[53]); SQRADDAC(a[8], a[52]); SQRADDAC(a[9], a[51]); SQRADDAC(a[10], a[50]); SQRADDAC(a[11], a[49]); SQRADDAC(a[12], a[48]); SQRADDAC(a[13], a[47]); SQRADDAC(a[14], a[46]); SQRADDAC(a[15], a[45]); SQRADDAC(a[16], a[44]); SQRADDAC(a[17], a[43]); SQRADDAC(a[18], a[42]); SQRADDAC(a[19], a[41]); SQRADDAC(a[20], a[40]); SQRADDAC(a[21], a[39]); SQRADDAC(a[22], a[38]); SQRADDAC(a[23], a[37]); SQRADDAC(a[24], a[36]); SQRADDAC(a[25], a[35]); SQRADDAC(a[26], a[34]); SQRADDAC(a[27], a[33]); SQRADDAC(a[28], a[32]); SQRADDAC(a[29], a[31]); SQRADDDB; SQRADD(a[30], a[30]); + COMBA_STORE(b[60]); + + /* output 61 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[61]); SQRADDAC(a[1], a[60]); SQRADDAC(a[2], a[59]); SQRADDAC(a[3], a[58]); SQRADDAC(a[4], a[57]); SQRADDAC(a[5], a[56]); SQRADDAC(a[6], a[55]); SQRADDAC(a[7], a[54]); SQRADDAC(a[8], a[53]); SQRADDAC(a[9], a[52]); SQRADDAC(a[10], a[51]); SQRADDAC(a[11], a[50]); SQRADDAC(a[12], a[49]); SQRADDAC(a[13], a[48]); SQRADDAC(a[14], a[47]); SQRADDAC(a[15], a[46]); SQRADDAC(a[16], a[45]); SQRADDAC(a[17], a[44]); SQRADDAC(a[18], a[43]); SQRADDAC(a[19], a[42]); SQRADDAC(a[20], a[41]); SQRADDAC(a[21], a[40]); SQRADDAC(a[22], a[39]); SQRADDAC(a[23], a[38]); SQRADDAC(a[24], a[37]); SQRADDAC(a[25], a[36]); SQRADDAC(a[26], a[35]); SQRADDAC(a[27], a[34]); SQRADDAC(a[28], a[33]); SQRADDAC(a[29], a[32]); SQRADDAC(a[30], a[31]); SQRADDDB; + COMBA_STORE(b[61]); + + /* output 62 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[62]); SQRADDAC(a[1], a[61]); SQRADDAC(a[2], a[60]); SQRADDAC(a[3], a[59]); SQRADDAC(a[4], a[58]); SQRADDAC(a[5], a[57]); SQRADDAC(a[6], a[56]); SQRADDAC(a[7], a[55]); SQRADDAC(a[8], a[54]); SQRADDAC(a[9], a[53]); SQRADDAC(a[10], a[52]); SQRADDAC(a[11], a[51]); SQRADDAC(a[12], a[50]); SQRADDAC(a[13], a[49]); SQRADDAC(a[14], a[48]); SQRADDAC(a[15], a[47]); SQRADDAC(a[16], a[46]); SQRADDAC(a[17], a[45]); SQRADDAC(a[18], a[44]); SQRADDAC(a[19], a[43]); SQRADDAC(a[20], a[42]); SQRADDAC(a[21], a[41]); SQRADDAC(a[22], a[40]); SQRADDAC(a[23], a[39]); SQRADDAC(a[24], a[38]); SQRADDAC(a[25], a[37]); SQRADDAC(a[26], a[36]); SQRADDAC(a[27], a[35]); SQRADDAC(a[28], a[34]); SQRADDAC(a[29], a[33]); SQRADDAC(a[30], a[32]); SQRADDDB; SQRADD(a[31], a[31]); + COMBA_STORE(b[62]); + + /* output 63 */ + CARRY_FORWARD; + SQRADDSC(a[0], a[63]); SQRADDAC(a[1], a[62]); SQRADDAC(a[2], a[61]); SQRADDAC(a[3], a[60]); SQRADDAC(a[4], a[59]); SQRADDAC(a[5], a[58]); SQRADDAC(a[6], a[57]); SQRADDAC(a[7], a[56]); SQRADDAC(a[8], a[55]); SQRADDAC(a[9], a[54]); SQRADDAC(a[10], a[53]); SQRADDAC(a[11], a[52]); SQRADDAC(a[12], a[51]); SQRADDAC(a[13], a[50]); SQRADDAC(a[14], a[49]); SQRADDAC(a[15], a[48]); SQRADDAC(a[16], a[47]); SQRADDAC(a[17], a[46]); SQRADDAC(a[18], a[45]); SQRADDAC(a[19], a[44]); SQRADDAC(a[20], a[43]); SQRADDAC(a[21], a[42]); SQRADDAC(a[22], a[41]); SQRADDAC(a[23], a[40]); SQRADDAC(a[24], a[39]); SQRADDAC(a[25], a[38]); SQRADDAC(a[26], a[37]); SQRADDAC(a[27], a[36]); SQRADDAC(a[28], a[35]); SQRADDAC(a[29], a[34]); SQRADDAC(a[30], a[33]); SQRADDAC(a[31], a[32]); SQRADDDB; + COMBA_STORE(b[63]); + + /* output 64 */ + CARRY_FORWARD; + SQRADDSC(a[1], a[63]); SQRADDAC(a[2], a[62]); SQRADDAC(a[3], a[61]); SQRADDAC(a[4], a[60]); SQRADDAC(a[5], a[59]); SQRADDAC(a[6], a[58]); SQRADDAC(a[7], a[57]); SQRADDAC(a[8], a[56]); SQRADDAC(a[9], a[55]); SQRADDAC(a[10], a[54]); SQRADDAC(a[11], a[53]); SQRADDAC(a[12], a[52]); SQRADDAC(a[13], a[51]); SQRADDAC(a[14], a[50]); SQRADDAC(a[15], a[49]); SQRADDAC(a[16], a[48]); SQRADDAC(a[17], a[47]); SQRADDAC(a[18], a[46]); SQRADDAC(a[19], a[45]); SQRADDAC(a[20], a[44]); SQRADDAC(a[21], a[43]); SQRADDAC(a[22], a[42]); SQRADDAC(a[23], a[41]); SQRADDAC(a[24], a[40]); SQRADDAC(a[25], a[39]); SQRADDAC(a[26], a[38]); SQRADDAC(a[27], a[37]); SQRADDAC(a[28], a[36]); SQRADDAC(a[29], a[35]); SQRADDAC(a[30], a[34]); SQRADDAC(a[31], a[33]); SQRADDDB; SQRADD(a[32], a[32]); + COMBA_STORE(b[64]); + + /* output 65 */ + CARRY_FORWARD; + SQRADDSC(a[2], a[63]); SQRADDAC(a[3], a[62]); SQRADDAC(a[4], a[61]); SQRADDAC(a[5], a[60]); SQRADDAC(a[6], a[59]); SQRADDAC(a[7], a[58]); SQRADDAC(a[8], a[57]); SQRADDAC(a[9], a[56]); SQRADDAC(a[10], a[55]); SQRADDAC(a[11], a[54]); SQRADDAC(a[12], a[53]); SQRADDAC(a[13], a[52]); SQRADDAC(a[14], a[51]); SQRADDAC(a[15], a[50]); SQRADDAC(a[16], a[49]); SQRADDAC(a[17], a[48]); SQRADDAC(a[18], a[47]); SQRADDAC(a[19], a[46]); SQRADDAC(a[20], a[45]); SQRADDAC(a[21], a[44]); SQRADDAC(a[22], a[43]); SQRADDAC(a[23], a[42]); SQRADDAC(a[24], a[41]); SQRADDAC(a[25], a[40]); SQRADDAC(a[26], a[39]); SQRADDAC(a[27], a[38]); SQRADDAC(a[28], a[37]); SQRADDAC(a[29], a[36]); SQRADDAC(a[30], a[35]); SQRADDAC(a[31], a[34]); SQRADDAC(a[32], a[33]); SQRADDDB; + COMBA_STORE(b[65]); + + /* output 66 */ + CARRY_FORWARD; + SQRADDSC(a[3], a[63]); SQRADDAC(a[4], a[62]); SQRADDAC(a[5], a[61]); SQRADDAC(a[6], a[60]); SQRADDAC(a[7], a[59]); SQRADDAC(a[8], a[58]); SQRADDAC(a[9], a[57]); SQRADDAC(a[10], a[56]); SQRADDAC(a[11], a[55]); SQRADDAC(a[12], a[54]); SQRADDAC(a[13], a[53]); SQRADDAC(a[14], a[52]); SQRADDAC(a[15], a[51]); SQRADDAC(a[16], a[50]); SQRADDAC(a[17], a[49]); SQRADDAC(a[18], a[48]); SQRADDAC(a[19], a[47]); SQRADDAC(a[20], a[46]); SQRADDAC(a[21], a[45]); SQRADDAC(a[22], a[44]); SQRADDAC(a[23], a[43]); SQRADDAC(a[24], a[42]); SQRADDAC(a[25], a[41]); SQRADDAC(a[26], a[40]); SQRADDAC(a[27], a[39]); SQRADDAC(a[28], a[38]); SQRADDAC(a[29], a[37]); SQRADDAC(a[30], a[36]); SQRADDAC(a[31], a[35]); SQRADDAC(a[32], a[34]); SQRADDDB; SQRADD(a[33], a[33]); + COMBA_STORE(b[66]); + + /* output 67 */ + CARRY_FORWARD; + SQRADDSC(a[4], a[63]); SQRADDAC(a[5], a[62]); SQRADDAC(a[6], a[61]); SQRADDAC(a[7], a[60]); SQRADDAC(a[8], a[59]); SQRADDAC(a[9], a[58]); SQRADDAC(a[10], a[57]); SQRADDAC(a[11], a[56]); SQRADDAC(a[12], a[55]); SQRADDAC(a[13], a[54]); SQRADDAC(a[14], a[53]); SQRADDAC(a[15], a[52]); SQRADDAC(a[16], a[51]); SQRADDAC(a[17], a[50]); SQRADDAC(a[18], a[49]); SQRADDAC(a[19], a[48]); SQRADDAC(a[20], a[47]); SQRADDAC(a[21], a[46]); SQRADDAC(a[22], a[45]); SQRADDAC(a[23], a[44]); SQRADDAC(a[24], a[43]); SQRADDAC(a[25], a[42]); SQRADDAC(a[26], a[41]); SQRADDAC(a[27], a[40]); SQRADDAC(a[28], a[39]); SQRADDAC(a[29], a[38]); SQRADDAC(a[30], a[37]); SQRADDAC(a[31], a[36]); SQRADDAC(a[32], a[35]); SQRADDAC(a[33], a[34]); SQRADDDB; + COMBA_STORE(b[67]); + + /* output 68 */ + CARRY_FORWARD; + SQRADDSC(a[5], a[63]); SQRADDAC(a[6], a[62]); SQRADDAC(a[7], a[61]); SQRADDAC(a[8], a[60]); SQRADDAC(a[9], a[59]); SQRADDAC(a[10], a[58]); SQRADDAC(a[11], a[57]); SQRADDAC(a[12], a[56]); SQRADDAC(a[13], a[55]); SQRADDAC(a[14], a[54]); SQRADDAC(a[15], a[53]); SQRADDAC(a[16], a[52]); SQRADDAC(a[17], a[51]); SQRADDAC(a[18], a[50]); SQRADDAC(a[19], a[49]); SQRADDAC(a[20], a[48]); SQRADDAC(a[21], a[47]); SQRADDAC(a[22], a[46]); SQRADDAC(a[23], a[45]); SQRADDAC(a[24], a[44]); SQRADDAC(a[25], a[43]); SQRADDAC(a[26], a[42]); SQRADDAC(a[27], a[41]); SQRADDAC(a[28], a[40]); SQRADDAC(a[29], a[39]); SQRADDAC(a[30], a[38]); SQRADDAC(a[31], a[37]); SQRADDAC(a[32], a[36]); SQRADDAC(a[33], a[35]); SQRADDDB; SQRADD(a[34], a[34]); + COMBA_STORE(b[68]); + + /* output 69 */ + CARRY_FORWARD; + SQRADDSC(a[6], a[63]); SQRADDAC(a[7], a[62]); SQRADDAC(a[8], a[61]); SQRADDAC(a[9], a[60]); SQRADDAC(a[10], a[59]); SQRADDAC(a[11], a[58]); SQRADDAC(a[12], a[57]); SQRADDAC(a[13], a[56]); SQRADDAC(a[14], a[55]); SQRADDAC(a[15], a[54]); SQRADDAC(a[16], a[53]); SQRADDAC(a[17], a[52]); SQRADDAC(a[18], a[51]); SQRADDAC(a[19], a[50]); SQRADDAC(a[20], a[49]); SQRADDAC(a[21], a[48]); SQRADDAC(a[22], a[47]); SQRADDAC(a[23], a[46]); SQRADDAC(a[24], a[45]); SQRADDAC(a[25], a[44]); SQRADDAC(a[26], a[43]); SQRADDAC(a[27], a[42]); SQRADDAC(a[28], a[41]); SQRADDAC(a[29], a[40]); SQRADDAC(a[30], a[39]); SQRADDAC(a[31], a[38]); SQRADDAC(a[32], a[37]); SQRADDAC(a[33], a[36]); SQRADDAC(a[34], a[35]); SQRADDDB; + COMBA_STORE(b[69]); + + /* output 70 */ + CARRY_FORWARD; + SQRADDSC(a[7], a[63]); SQRADDAC(a[8], a[62]); SQRADDAC(a[9], a[61]); SQRADDAC(a[10], a[60]); SQRADDAC(a[11], a[59]); SQRADDAC(a[12], a[58]); SQRADDAC(a[13], a[57]); SQRADDAC(a[14], a[56]); SQRADDAC(a[15], a[55]); SQRADDAC(a[16], a[54]); SQRADDAC(a[17], a[53]); SQRADDAC(a[18], a[52]); SQRADDAC(a[19], a[51]); SQRADDAC(a[20], a[50]); SQRADDAC(a[21], a[49]); SQRADDAC(a[22], a[48]); SQRADDAC(a[23], a[47]); SQRADDAC(a[24], a[46]); SQRADDAC(a[25], a[45]); SQRADDAC(a[26], a[44]); SQRADDAC(a[27], a[43]); SQRADDAC(a[28], a[42]); SQRADDAC(a[29], a[41]); SQRADDAC(a[30], a[40]); SQRADDAC(a[31], a[39]); SQRADDAC(a[32], a[38]); SQRADDAC(a[33], a[37]); SQRADDAC(a[34], a[36]); SQRADDDB; SQRADD(a[35], a[35]); + COMBA_STORE(b[70]); + + /* output 71 */ + CARRY_FORWARD; + SQRADDSC(a[8], a[63]); SQRADDAC(a[9], a[62]); SQRADDAC(a[10], a[61]); SQRADDAC(a[11], a[60]); SQRADDAC(a[12], a[59]); SQRADDAC(a[13], a[58]); SQRADDAC(a[14], a[57]); SQRADDAC(a[15], a[56]); SQRADDAC(a[16], a[55]); SQRADDAC(a[17], a[54]); SQRADDAC(a[18], a[53]); SQRADDAC(a[19], a[52]); SQRADDAC(a[20], a[51]); SQRADDAC(a[21], a[50]); SQRADDAC(a[22], a[49]); SQRADDAC(a[23], a[48]); SQRADDAC(a[24], a[47]); SQRADDAC(a[25], a[46]); SQRADDAC(a[26], a[45]); SQRADDAC(a[27], a[44]); SQRADDAC(a[28], a[43]); SQRADDAC(a[29], a[42]); SQRADDAC(a[30], a[41]); SQRADDAC(a[31], a[40]); SQRADDAC(a[32], a[39]); SQRADDAC(a[33], a[38]); SQRADDAC(a[34], a[37]); SQRADDAC(a[35], a[36]); SQRADDDB; + COMBA_STORE(b[71]); + + /* output 72 */ + CARRY_FORWARD; + SQRADDSC(a[9], a[63]); SQRADDAC(a[10], a[62]); SQRADDAC(a[11], a[61]); SQRADDAC(a[12], a[60]); SQRADDAC(a[13], a[59]); SQRADDAC(a[14], a[58]); SQRADDAC(a[15], a[57]); SQRADDAC(a[16], a[56]); SQRADDAC(a[17], a[55]); SQRADDAC(a[18], a[54]); SQRADDAC(a[19], a[53]); SQRADDAC(a[20], a[52]); SQRADDAC(a[21], a[51]); SQRADDAC(a[22], a[50]); SQRADDAC(a[23], a[49]); SQRADDAC(a[24], a[48]); SQRADDAC(a[25], a[47]); SQRADDAC(a[26], a[46]); SQRADDAC(a[27], a[45]); SQRADDAC(a[28], a[44]); SQRADDAC(a[29], a[43]); SQRADDAC(a[30], a[42]); SQRADDAC(a[31], a[41]); SQRADDAC(a[32], a[40]); SQRADDAC(a[33], a[39]); SQRADDAC(a[34], a[38]); SQRADDAC(a[35], a[37]); SQRADDDB; SQRADD(a[36], a[36]); + COMBA_STORE(b[72]); + + /* output 73 */ + CARRY_FORWARD; + SQRADDSC(a[10], a[63]); SQRADDAC(a[11], a[62]); SQRADDAC(a[12], a[61]); SQRADDAC(a[13], a[60]); SQRADDAC(a[14], a[59]); SQRADDAC(a[15], a[58]); SQRADDAC(a[16], a[57]); SQRADDAC(a[17], a[56]); SQRADDAC(a[18], a[55]); SQRADDAC(a[19], a[54]); SQRADDAC(a[20], a[53]); SQRADDAC(a[21], a[52]); SQRADDAC(a[22], a[51]); SQRADDAC(a[23], a[50]); SQRADDAC(a[24], a[49]); SQRADDAC(a[25], a[48]); SQRADDAC(a[26], a[47]); SQRADDAC(a[27], a[46]); SQRADDAC(a[28], a[45]); SQRADDAC(a[29], a[44]); SQRADDAC(a[30], a[43]); SQRADDAC(a[31], a[42]); SQRADDAC(a[32], a[41]); SQRADDAC(a[33], a[40]); SQRADDAC(a[34], a[39]); SQRADDAC(a[35], a[38]); SQRADDAC(a[36], a[37]); SQRADDDB; + COMBA_STORE(b[73]); + + /* output 74 */ + CARRY_FORWARD; + SQRADDSC(a[11], a[63]); SQRADDAC(a[12], a[62]); SQRADDAC(a[13], a[61]); SQRADDAC(a[14], a[60]); SQRADDAC(a[15], a[59]); SQRADDAC(a[16], a[58]); SQRADDAC(a[17], a[57]); SQRADDAC(a[18], a[56]); SQRADDAC(a[19], a[55]); SQRADDAC(a[20], a[54]); SQRADDAC(a[21], a[53]); SQRADDAC(a[22], a[52]); SQRADDAC(a[23], a[51]); SQRADDAC(a[24], a[50]); SQRADDAC(a[25], a[49]); SQRADDAC(a[26], a[48]); SQRADDAC(a[27], a[47]); SQRADDAC(a[28], a[46]); SQRADDAC(a[29], a[45]); SQRADDAC(a[30], a[44]); SQRADDAC(a[31], a[43]); SQRADDAC(a[32], a[42]); SQRADDAC(a[33], a[41]); SQRADDAC(a[34], a[40]); SQRADDAC(a[35], a[39]); SQRADDAC(a[36], a[38]); SQRADDDB; SQRADD(a[37], a[37]); + COMBA_STORE(b[74]); + + /* output 75 */ + CARRY_FORWARD; + SQRADDSC(a[12], a[63]); SQRADDAC(a[13], a[62]); SQRADDAC(a[14], a[61]); SQRADDAC(a[15], a[60]); SQRADDAC(a[16], a[59]); SQRADDAC(a[17], a[58]); SQRADDAC(a[18], a[57]); SQRADDAC(a[19], a[56]); SQRADDAC(a[20], a[55]); SQRADDAC(a[21], a[54]); SQRADDAC(a[22], a[53]); SQRADDAC(a[23], a[52]); SQRADDAC(a[24], a[51]); SQRADDAC(a[25], a[50]); SQRADDAC(a[26], a[49]); SQRADDAC(a[27], a[48]); SQRADDAC(a[28], a[47]); SQRADDAC(a[29], a[46]); SQRADDAC(a[30], a[45]); SQRADDAC(a[31], a[44]); SQRADDAC(a[32], a[43]); SQRADDAC(a[33], a[42]); SQRADDAC(a[34], a[41]); SQRADDAC(a[35], a[40]); SQRADDAC(a[36], a[39]); SQRADDAC(a[37], a[38]); SQRADDDB; + COMBA_STORE(b[75]); + + /* output 76 */ + CARRY_FORWARD; + SQRADDSC(a[13], a[63]); SQRADDAC(a[14], a[62]); SQRADDAC(a[15], a[61]); SQRADDAC(a[16], a[60]); SQRADDAC(a[17], a[59]); SQRADDAC(a[18], a[58]); SQRADDAC(a[19], a[57]); SQRADDAC(a[20], a[56]); SQRADDAC(a[21], a[55]); SQRADDAC(a[22], a[54]); SQRADDAC(a[23], a[53]); SQRADDAC(a[24], a[52]); SQRADDAC(a[25], a[51]); SQRADDAC(a[26], a[50]); SQRADDAC(a[27], a[49]); SQRADDAC(a[28], a[48]); SQRADDAC(a[29], a[47]); SQRADDAC(a[30], a[46]); SQRADDAC(a[31], a[45]); SQRADDAC(a[32], a[44]); SQRADDAC(a[33], a[43]); SQRADDAC(a[34], a[42]); SQRADDAC(a[35], a[41]); SQRADDAC(a[36], a[40]); SQRADDAC(a[37], a[39]); SQRADDDB; SQRADD(a[38], a[38]); + COMBA_STORE(b[76]); + + /* output 77 */ + CARRY_FORWARD; + SQRADDSC(a[14], a[63]); SQRADDAC(a[15], a[62]); SQRADDAC(a[16], a[61]); SQRADDAC(a[17], a[60]); SQRADDAC(a[18], a[59]); SQRADDAC(a[19], a[58]); SQRADDAC(a[20], a[57]); SQRADDAC(a[21], a[56]); SQRADDAC(a[22], a[55]); SQRADDAC(a[23], a[54]); SQRADDAC(a[24], a[53]); SQRADDAC(a[25], a[52]); SQRADDAC(a[26], a[51]); SQRADDAC(a[27], a[50]); SQRADDAC(a[28], a[49]); SQRADDAC(a[29], a[48]); SQRADDAC(a[30], a[47]); SQRADDAC(a[31], a[46]); SQRADDAC(a[32], a[45]); SQRADDAC(a[33], a[44]); SQRADDAC(a[34], a[43]); SQRADDAC(a[35], a[42]); SQRADDAC(a[36], a[41]); SQRADDAC(a[37], a[40]); SQRADDAC(a[38], a[39]); SQRADDDB; + COMBA_STORE(b[77]); + + /* output 78 */ + CARRY_FORWARD; + SQRADDSC(a[15], a[63]); SQRADDAC(a[16], a[62]); SQRADDAC(a[17], a[61]); SQRADDAC(a[18], a[60]); SQRADDAC(a[19], a[59]); SQRADDAC(a[20], a[58]); SQRADDAC(a[21], a[57]); SQRADDAC(a[22], a[56]); SQRADDAC(a[23], a[55]); SQRADDAC(a[24], a[54]); SQRADDAC(a[25], a[53]); SQRADDAC(a[26], a[52]); SQRADDAC(a[27], a[51]); SQRADDAC(a[28], a[50]); SQRADDAC(a[29], a[49]); SQRADDAC(a[30], a[48]); SQRADDAC(a[31], a[47]); SQRADDAC(a[32], a[46]); SQRADDAC(a[33], a[45]); SQRADDAC(a[34], a[44]); SQRADDAC(a[35], a[43]); SQRADDAC(a[36], a[42]); SQRADDAC(a[37], a[41]); SQRADDAC(a[38], a[40]); SQRADDDB; SQRADD(a[39], a[39]); + COMBA_STORE(b[78]); + + /* output 79 */ + CARRY_FORWARD; + SQRADDSC(a[16], a[63]); SQRADDAC(a[17], a[62]); SQRADDAC(a[18], a[61]); SQRADDAC(a[19], a[60]); SQRADDAC(a[20], a[59]); SQRADDAC(a[21], a[58]); SQRADDAC(a[22], a[57]); SQRADDAC(a[23], a[56]); SQRADDAC(a[24], a[55]); SQRADDAC(a[25], a[54]); SQRADDAC(a[26], a[53]); SQRADDAC(a[27], a[52]); SQRADDAC(a[28], a[51]); SQRADDAC(a[29], a[50]); SQRADDAC(a[30], a[49]); SQRADDAC(a[31], a[48]); SQRADDAC(a[32], a[47]); SQRADDAC(a[33], a[46]); SQRADDAC(a[34], a[45]); SQRADDAC(a[35], a[44]); SQRADDAC(a[36], a[43]); SQRADDAC(a[37], a[42]); SQRADDAC(a[38], a[41]); SQRADDAC(a[39], a[40]); SQRADDDB; + COMBA_STORE(b[79]); + + /* output 80 */ + CARRY_FORWARD; + SQRADDSC(a[17], a[63]); SQRADDAC(a[18], a[62]); SQRADDAC(a[19], a[61]); SQRADDAC(a[20], a[60]); SQRADDAC(a[21], a[59]); SQRADDAC(a[22], a[58]); SQRADDAC(a[23], a[57]); SQRADDAC(a[24], a[56]); SQRADDAC(a[25], a[55]); SQRADDAC(a[26], a[54]); SQRADDAC(a[27], a[53]); SQRADDAC(a[28], a[52]); SQRADDAC(a[29], a[51]); SQRADDAC(a[30], a[50]); SQRADDAC(a[31], a[49]); SQRADDAC(a[32], a[48]); SQRADDAC(a[33], a[47]); SQRADDAC(a[34], a[46]); SQRADDAC(a[35], a[45]); SQRADDAC(a[36], a[44]); SQRADDAC(a[37], a[43]); SQRADDAC(a[38], a[42]); SQRADDAC(a[39], a[41]); SQRADDDB; SQRADD(a[40], a[40]); + COMBA_STORE(b[80]); + + /* output 81 */ + CARRY_FORWARD; + SQRADDSC(a[18], a[63]); SQRADDAC(a[19], a[62]); SQRADDAC(a[20], a[61]); SQRADDAC(a[21], a[60]); SQRADDAC(a[22], a[59]); SQRADDAC(a[23], a[58]); SQRADDAC(a[24], a[57]); SQRADDAC(a[25], a[56]); SQRADDAC(a[26], a[55]); SQRADDAC(a[27], a[54]); SQRADDAC(a[28], a[53]); SQRADDAC(a[29], a[52]); SQRADDAC(a[30], a[51]); SQRADDAC(a[31], a[50]); SQRADDAC(a[32], a[49]); SQRADDAC(a[33], a[48]); SQRADDAC(a[34], a[47]); SQRADDAC(a[35], a[46]); SQRADDAC(a[36], a[45]); SQRADDAC(a[37], a[44]); SQRADDAC(a[38], a[43]); SQRADDAC(a[39], a[42]); SQRADDAC(a[40], a[41]); SQRADDDB; + COMBA_STORE(b[81]); + + /* output 82 */ + CARRY_FORWARD; + SQRADDSC(a[19], a[63]); SQRADDAC(a[20], a[62]); SQRADDAC(a[21], a[61]); SQRADDAC(a[22], a[60]); SQRADDAC(a[23], a[59]); SQRADDAC(a[24], a[58]); SQRADDAC(a[25], a[57]); SQRADDAC(a[26], a[56]); SQRADDAC(a[27], a[55]); SQRADDAC(a[28], a[54]); SQRADDAC(a[29], a[53]); SQRADDAC(a[30], a[52]); SQRADDAC(a[31], a[51]); SQRADDAC(a[32], a[50]); SQRADDAC(a[33], a[49]); SQRADDAC(a[34], a[48]); SQRADDAC(a[35], a[47]); SQRADDAC(a[36], a[46]); SQRADDAC(a[37], a[45]); SQRADDAC(a[38], a[44]); SQRADDAC(a[39], a[43]); SQRADDAC(a[40], a[42]); SQRADDDB; SQRADD(a[41], a[41]); + COMBA_STORE(b[82]); + + /* output 83 */ + CARRY_FORWARD; + SQRADDSC(a[20], a[63]); SQRADDAC(a[21], a[62]); SQRADDAC(a[22], a[61]); SQRADDAC(a[23], a[60]); SQRADDAC(a[24], a[59]); SQRADDAC(a[25], a[58]); SQRADDAC(a[26], a[57]); SQRADDAC(a[27], a[56]); SQRADDAC(a[28], a[55]); SQRADDAC(a[29], a[54]); SQRADDAC(a[30], a[53]); SQRADDAC(a[31], a[52]); SQRADDAC(a[32], a[51]); SQRADDAC(a[33], a[50]); SQRADDAC(a[34], a[49]); SQRADDAC(a[35], a[48]); SQRADDAC(a[36], a[47]); SQRADDAC(a[37], a[46]); SQRADDAC(a[38], a[45]); SQRADDAC(a[39], a[44]); SQRADDAC(a[40], a[43]); SQRADDAC(a[41], a[42]); SQRADDDB; + COMBA_STORE(b[83]); + + /* output 84 */ + CARRY_FORWARD; + SQRADDSC(a[21], a[63]); SQRADDAC(a[22], a[62]); SQRADDAC(a[23], a[61]); SQRADDAC(a[24], a[60]); SQRADDAC(a[25], a[59]); SQRADDAC(a[26], a[58]); SQRADDAC(a[27], a[57]); SQRADDAC(a[28], a[56]); SQRADDAC(a[29], a[55]); SQRADDAC(a[30], a[54]); SQRADDAC(a[31], a[53]); SQRADDAC(a[32], a[52]); SQRADDAC(a[33], a[51]); SQRADDAC(a[34], a[50]); SQRADDAC(a[35], a[49]); SQRADDAC(a[36], a[48]); SQRADDAC(a[37], a[47]); SQRADDAC(a[38], a[46]); SQRADDAC(a[39], a[45]); SQRADDAC(a[40], a[44]); SQRADDAC(a[41], a[43]); SQRADDDB; SQRADD(a[42], a[42]); + COMBA_STORE(b[84]); + + /* output 85 */ + CARRY_FORWARD; + SQRADDSC(a[22], a[63]); SQRADDAC(a[23], a[62]); SQRADDAC(a[24], a[61]); SQRADDAC(a[25], a[60]); SQRADDAC(a[26], a[59]); SQRADDAC(a[27], a[58]); SQRADDAC(a[28], a[57]); SQRADDAC(a[29], a[56]); SQRADDAC(a[30], a[55]); SQRADDAC(a[31], a[54]); SQRADDAC(a[32], a[53]); SQRADDAC(a[33], a[52]); SQRADDAC(a[34], a[51]); SQRADDAC(a[35], a[50]); SQRADDAC(a[36], a[49]); SQRADDAC(a[37], a[48]); SQRADDAC(a[38], a[47]); SQRADDAC(a[39], a[46]); SQRADDAC(a[40], a[45]); SQRADDAC(a[41], a[44]); SQRADDAC(a[42], a[43]); SQRADDDB; + COMBA_STORE(b[85]); + + /* output 86 */ + CARRY_FORWARD; + SQRADDSC(a[23], a[63]); SQRADDAC(a[24], a[62]); SQRADDAC(a[25], a[61]); SQRADDAC(a[26], a[60]); SQRADDAC(a[27], a[59]); SQRADDAC(a[28], a[58]); SQRADDAC(a[29], a[57]); SQRADDAC(a[30], a[56]); SQRADDAC(a[31], a[55]); SQRADDAC(a[32], a[54]); SQRADDAC(a[33], a[53]); SQRADDAC(a[34], a[52]); SQRADDAC(a[35], a[51]); SQRADDAC(a[36], a[50]); SQRADDAC(a[37], a[49]); SQRADDAC(a[38], a[48]); SQRADDAC(a[39], a[47]); SQRADDAC(a[40], a[46]); SQRADDAC(a[41], a[45]); SQRADDAC(a[42], a[44]); SQRADDDB; SQRADD(a[43], a[43]); + COMBA_STORE(b[86]); + + /* output 87 */ + CARRY_FORWARD; + SQRADDSC(a[24], a[63]); SQRADDAC(a[25], a[62]); SQRADDAC(a[26], a[61]); SQRADDAC(a[27], a[60]); SQRADDAC(a[28], a[59]); SQRADDAC(a[29], a[58]); SQRADDAC(a[30], a[57]); SQRADDAC(a[31], a[56]); SQRADDAC(a[32], a[55]); SQRADDAC(a[33], a[54]); SQRADDAC(a[34], a[53]); SQRADDAC(a[35], a[52]); SQRADDAC(a[36], a[51]); SQRADDAC(a[37], a[50]); SQRADDAC(a[38], a[49]); SQRADDAC(a[39], a[48]); SQRADDAC(a[40], a[47]); SQRADDAC(a[41], a[46]); SQRADDAC(a[42], a[45]); SQRADDAC(a[43], a[44]); SQRADDDB; + COMBA_STORE(b[87]); + + /* output 88 */ + CARRY_FORWARD; + SQRADDSC(a[25], a[63]); SQRADDAC(a[26], a[62]); SQRADDAC(a[27], a[61]); SQRADDAC(a[28], a[60]); SQRADDAC(a[29], a[59]); SQRADDAC(a[30], a[58]); SQRADDAC(a[31], a[57]); SQRADDAC(a[32], a[56]); SQRADDAC(a[33], a[55]); SQRADDAC(a[34], a[54]); SQRADDAC(a[35], a[53]); SQRADDAC(a[36], a[52]); SQRADDAC(a[37], a[51]); SQRADDAC(a[38], a[50]); SQRADDAC(a[39], a[49]); SQRADDAC(a[40], a[48]); SQRADDAC(a[41], a[47]); SQRADDAC(a[42], a[46]); SQRADDAC(a[43], a[45]); SQRADDDB; SQRADD(a[44], a[44]); + COMBA_STORE(b[88]); + + /* output 89 */ + CARRY_FORWARD; + SQRADDSC(a[26], a[63]); SQRADDAC(a[27], a[62]); SQRADDAC(a[28], a[61]); SQRADDAC(a[29], a[60]); SQRADDAC(a[30], a[59]); SQRADDAC(a[31], a[58]); SQRADDAC(a[32], a[57]); SQRADDAC(a[33], a[56]); SQRADDAC(a[34], a[55]); SQRADDAC(a[35], a[54]); SQRADDAC(a[36], a[53]); SQRADDAC(a[37], a[52]); SQRADDAC(a[38], a[51]); SQRADDAC(a[39], a[50]); SQRADDAC(a[40], a[49]); SQRADDAC(a[41], a[48]); SQRADDAC(a[42], a[47]); SQRADDAC(a[43], a[46]); SQRADDAC(a[44], a[45]); SQRADDDB; + COMBA_STORE(b[89]); + + /* output 90 */ + CARRY_FORWARD; + SQRADDSC(a[27], a[63]); SQRADDAC(a[28], a[62]); SQRADDAC(a[29], a[61]); SQRADDAC(a[30], a[60]); SQRADDAC(a[31], a[59]); SQRADDAC(a[32], a[58]); SQRADDAC(a[33], a[57]); SQRADDAC(a[34], a[56]); SQRADDAC(a[35], a[55]); SQRADDAC(a[36], a[54]); SQRADDAC(a[37], a[53]); SQRADDAC(a[38], a[52]); SQRADDAC(a[39], a[51]); SQRADDAC(a[40], a[50]); SQRADDAC(a[41], a[49]); SQRADDAC(a[42], a[48]); SQRADDAC(a[43], a[47]); SQRADDAC(a[44], a[46]); SQRADDDB; SQRADD(a[45], a[45]); + COMBA_STORE(b[90]); + + /* output 91 */ + CARRY_FORWARD; + SQRADDSC(a[28], a[63]); SQRADDAC(a[29], a[62]); SQRADDAC(a[30], a[61]); SQRADDAC(a[31], a[60]); SQRADDAC(a[32], a[59]); SQRADDAC(a[33], a[58]); SQRADDAC(a[34], a[57]); SQRADDAC(a[35], a[56]); SQRADDAC(a[36], a[55]); SQRADDAC(a[37], a[54]); SQRADDAC(a[38], a[53]); SQRADDAC(a[39], a[52]); SQRADDAC(a[40], a[51]); SQRADDAC(a[41], a[50]); SQRADDAC(a[42], a[49]); SQRADDAC(a[43], a[48]); SQRADDAC(a[44], a[47]); SQRADDAC(a[45], a[46]); SQRADDDB; + COMBA_STORE(b[91]); + + /* output 92 */ + CARRY_FORWARD; + SQRADDSC(a[29], a[63]); SQRADDAC(a[30], a[62]); SQRADDAC(a[31], a[61]); SQRADDAC(a[32], a[60]); SQRADDAC(a[33], a[59]); SQRADDAC(a[34], a[58]); SQRADDAC(a[35], a[57]); SQRADDAC(a[36], a[56]); SQRADDAC(a[37], a[55]); SQRADDAC(a[38], a[54]); SQRADDAC(a[39], a[53]); SQRADDAC(a[40], a[52]); SQRADDAC(a[41], a[51]); SQRADDAC(a[42], a[50]); SQRADDAC(a[43], a[49]); SQRADDAC(a[44], a[48]); SQRADDAC(a[45], a[47]); SQRADDDB; SQRADD(a[46], a[46]); + COMBA_STORE(b[92]); + + /* output 93 */ + CARRY_FORWARD; + SQRADDSC(a[30], a[63]); SQRADDAC(a[31], a[62]); SQRADDAC(a[32], a[61]); SQRADDAC(a[33], a[60]); SQRADDAC(a[34], a[59]); SQRADDAC(a[35], a[58]); SQRADDAC(a[36], a[57]); SQRADDAC(a[37], a[56]); SQRADDAC(a[38], a[55]); SQRADDAC(a[39], a[54]); SQRADDAC(a[40], a[53]); SQRADDAC(a[41], a[52]); SQRADDAC(a[42], a[51]); SQRADDAC(a[43], a[50]); SQRADDAC(a[44], a[49]); SQRADDAC(a[45], a[48]); SQRADDAC(a[46], a[47]); SQRADDDB; + COMBA_STORE(b[93]); + + /* output 94 */ + CARRY_FORWARD; + SQRADDSC(a[31], a[63]); SQRADDAC(a[32], a[62]); SQRADDAC(a[33], a[61]); SQRADDAC(a[34], a[60]); SQRADDAC(a[35], a[59]); SQRADDAC(a[36], a[58]); SQRADDAC(a[37], a[57]); SQRADDAC(a[38], a[56]); SQRADDAC(a[39], a[55]); SQRADDAC(a[40], a[54]); SQRADDAC(a[41], a[53]); SQRADDAC(a[42], a[52]); SQRADDAC(a[43], a[51]); SQRADDAC(a[44], a[50]); SQRADDAC(a[45], a[49]); SQRADDAC(a[46], a[48]); SQRADDDB; SQRADD(a[47], a[47]); + COMBA_STORE(b[94]); + + /* output 95 */ + CARRY_FORWARD; + SQRADDSC(a[32], a[63]); SQRADDAC(a[33], a[62]); SQRADDAC(a[34], a[61]); SQRADDAC(a[35], a[60]); SQRADDAC(a[36], a[59]); SQRADDAC(a[37], a[58]); SQRADDAC(a[38], a[57]); SQRADDAC(a[39], a[56]); SQRADDAC(a[40], a[55]); SQRADDAC(a[41], a[54]); SQRADDAC(a[42], a[53]); SQRADDAC(a[43], a[52]); SQRADDAC(a[44], a[51]); SQRADDAC(a[45], a[50]); SQRADDAC(a[46], a[49]); SQRADDAC(a[47], a[48]); SQRADDDB; + COMBA_STORE(b[95]); + + /* output 96 */ + CARRY_FORWARD; + SQRADDSC(a[33], a[63]); SQRADDAC(a[34], a[62]); SQRADDAC(a[35], a[61]); SQRADDAC(a[36], a[60]); SQRADDAC(a[37], a[59]); SQRADDAC(a[38], a[58]); SQRADDAC(a[39], a[57]); SQRADDAC(a[40], a[56]); SQRADDAC(a[41], a[55]); SQRADDAC(a[42], a[54]); SQRADDAC(a[43], a[53]); SQRADDAC(a[44], a[52]); SQRADDAC(a[45], a[51]); SQRADDAC(a[46], a[50]); SQRADDAC(a[47], a[49]); SQRADDDB; SQRADD(a[48], a[48]); + COMBA_STORE(b[96]); + + /* output 97 */ + CARRY_FORWARD; + SQRADDSC(a[34], a[63]); SQRADDAC(a[35], a[62]); SQRADDAC(a[36], a[61]); SQRADDAC(a[37], a[60]); SQRADDAC(a[38], a[59]); SQRADDAC(a[39], a[58]); SQRADDAC(a[40], a[57]); SQRADDAC(a[41], a[56]); SQRADDAC(a[42], a[55]); SQRADDAC(a[43], a[54]); SQRADDAC(a[44], a[53]); SQRADDAC(a[45], a[52]); SQRADDAC(a[46], a[51]); SQRADDAC(a[47], a[50]); SQRADDAC(a[48], a[49]); SQRADDDB; + COMBA_STORE(b[97]); + + /* output 98 */ + CARRY_FORWARD; + SQRADDSC(a[35], a[63]); SQRADDAC(a[36], a[62]); SQRADDAC(a[37], a[61]); SQRADDAC(a[38], a[60]); SQRADDAC(a[39], a[59]); SQRADDAC(a[40], a[58]); SQRADDAC(a[41], a[57]); SQRADDAC(a[42], a[56]); SQRADDAC(a[43], a[55]); SQRADDAC(a[44], a[54]); SQRADDAC(a[45], a[53]); SQRADDAC(a[46], a[52]); SQRADDAC(a[47], a[51]); SQRADDAC(a[48], a[50]); SQRADDDB; SQRADD(a[49], a[49]); + COMBA_STORE(b[98]); + + /* output 99 */ + CARRY_FORWARD; + SQRADDSC(a[36], a[63]); SQRADDAC(a[37], a[62]); SQRADDAC(a[38], a[61]); SQRADDAC(a[39], a[60]); SQRADDAC(a[40], a[59]); SQRADDAC(a[41], a[58]); SQRADDAC(a[42], a[57]); SQRADDAC(a[43], a[56]); SQRADDAC(a[44], a[55]); SQRADDAC(a[45], a[54]); SQRADDAC(a[46], a[53]); SQRADDAC(a[47], a[52]); SQRADDAC(a[48], a[51]); SQRADDAC(a[49], a[50]); SQRADDDB; + COMBA_STORE(b[99]); + + /* output 100 */ + CARRY_FORWARD; + SQRADDSC(a[37], a[63]); SQRADDAC(a[38], a[62]); SQRADDAC(a[39], a[61]); SQRADDAC(a[40], a[60]); SQRADDAC(a[41], a[59]); SQRADDAC(a[42], a[58]); SQRADDAC(a[43], a[57]); SQRADDAC(a[44], a[56]); SQRADDAC(a[45], a[55]); SQRADDAC(a[46], a[54]); SQRADDAC(a[47], a[53]); SQRADDAC(a[48], a[52]); SQRADDAC(a[49], a[51]); SQRADDDB; SQRADD(a[50], a[50]); + COMBA_STORE(b[100]); + + /* output 101 */ + CARRY_FORWARD; + SQRADDSC(a[38], a[63]); SQRADDAC(a[39], a[62]); SQRADDAC(a[40], a[61]); SQRADDAC(a[41], a[60]); SQRADDAC(a[42], a[59]); SQRADDAC(a[43], a[58]); SQRADDAC(a[44], a[57]); SQRADDAC(a[45], a[56]); SQRADDAC(a[46], a[55]); SQRADDAC(a[47], a[54]); SQRADDAC(a[48], a[53]); SQRADDAC(a[49], a[52]); SQRADDAC(a[50], a[51]); SQRADDDB; + COMBA_STORE(b[101]); + + /* output 102 */ + CARRY_FORWARD; + SQRADDSC(a[39], a[63]); SQRADDAC(a[40], a[62]); SQRADDAC(a[41], a[61]); SQRADDAC(a[42], a[60]); SQRADDAC(a[43], a[59]); SQRADDAC(a[44], a[58]); SQRADDAC(a[45], a[57]); SQRADDAC(a[46], a[56]); SQRADDAC(a[47], a[55]); SQRADDAC(a[48], a[54]); SQRADDAC(a[49], a[53]); SQRADDAC(a[50], a[52]); SQRADDDB; SQRADD(a[51], a[51]); + COMBA_STORE(b[102]); + + /* output 103 */ + CARRY_FORWARD; + SQRADDSC(a[40], a[63]); SQRADDAC(a[41], a[62]); SQRADDAC(a[42], a[61]); SQRADDAC(a[43], a[60]); SQRADDAC(a[44], a[59]); SQRADDAC(a[45], a[58]); SQRADDAC(a[46], a[57]); SQRADDAC(a[47], a[56]); SQRADDAC(a[48], a[55]); SQRADDAC(a[49], a[54]); SQRADDAC(a[50], a[53]); SQRADDAC(a[51], a[52]); SQRADDDB; + COMBA_STORE(b[103]); + + /* output 104 */ + CARRY_FORWARD; + SQRADDSC(a[41], a[63]); SQRADDAC(a[42], a[62]); SQRADDAC(a[43], a[61]); SQRADDAC(a[44], a[60]); SQRADDAC(a[45], a[59]); SQRADDAC(a[46], a[58]); SQRADDAC(a[47], a[57]); SQRADDAC(a[48], a[56]); SQRADDAC(a[49], a[55]); SQRADDAC(a[50], a[54]); SQRADDAC(a[51], a[53]); SQRADDDB; SQRADD(a[52], a[52]); + COMBA_STORE(b[104]); + + /* output 105 */ + CARRY_FORWARD; + SQRADDSC(a[42], a[63]); SQRADDAC(a[43], a[62]); SQRADDAC(a[44], a[61]); SQRADDAC(a[45], a[60]); SQRADDAC(a[46], a[59]); SQRADDAC(a[47], a[58]); SQRADDAC(a[48], a[57]); SQRADDAC(a[49], a[56]); SQRADDAC(a[50], a[55]); SQRADDAC(a[51], a[54]); SQRADDAC(a[52], a[53]); SQRADDDB; + COMBA_STORE(b[105]); + + /* output 106 */ + CARRY_FORWARD; + SQRADDSC(a[43], a[63]); SQRADDAC(a[44], a[62]); SQRADDAC(a[45], a[61]); SQRADDAC(a[46], a[60]); SQRADDAC(a[47], a[59]); SQRADDAC(a[48], a[58]); SQRADDAC(a[49], a[57]); SQRADDAC(a[50], a[56]); SQRADDAC(a[51], a[55]); SQRADDAC(a[52], a[54]); SQRADDDB; SQRADD(a[53], a[53]); + COMBA_STORE(b[106]); + + /* output 107 */ + CARRY_FORWARD; + SQRADDSC(a[44], a[63]); SQRADDAC(a[45], a[62]); SQRADDAC(a[46], a[61]); SQRADDAC(a[47], a[60]); SQRADDAC(a[48], a[59]); SQRADDAC(a[49], a[58]); SQRADDAC(a[50], a[57]); SQRADDAC(a[51], a[56]); SQRADDAC(a[52], a[55]); SQRADDAC(a[53], a[54]); SQRADDDB; + COMBA_STORE(b[107]); + + /* output 108 */ + CARRY_FORWARD; + SQRADDSC(a[45], a[63]); SQRADDAC(a[46], a[62]); SQRADDAC(a[47], a[61]); SQRADDAC(a[48], a[60]); SQRADDAC(a[49], a[59]); SQRADDAC(a[50], a[58]); SQRADDAC(a[51], a[57]); SQRADDAC(a[52], a[56]); SQRADDAC(a[53], a[55]); SQRADDDB; SQRADD(a[54], a[54]); + COMBA_STORE(b[108]); + + /* output 109 */ + CARRY_FORWARD; + SQRADDSC(a[46], a[63]); SQRADDAC(a[47], a[62]); SQRADDAC(a[48], a[61]); SQRADDAC(a[49], a[60]); SQRADDAC(a[50], a[59]); SQRADDAC(a[51], a[58]); SQRADDAC(a[52], a[57]); SQRADDAC(a[53], a[56]); SQRADDAC(a[54], a[55]); SQRADDDB; + COMBA_STORE(b[109]); + + /* output 110 */ + CARRY_FORWARD; + SQRADDSC(a[47], a[63]); SQRADDAC(a[48], a[62]); SQRADDAC(a[49], a[61]); SQRADDAC(a[50], a[60]); SQRADDAC(a[51], a[59]); SQRADDAC(a[52], a[58]); SQRADDAC(a[53], a[57]); SQRADDAC(a[54], a[56]); SQRADDDB; SQRADD(a[55], a[55]); + COMBA_STORE(b[110]); + + /* output 111 */ + CARRY_FORWARD; + SQRADDSC(a[48], a[63]); SQRADDAC(a[49], a[62]); SQRADDAC(a[50], a[61]); SQRADDAC(a[51], a[60]); SQRADDAC(a[52], a[59]); SQRADDAC(a[53], a[58]); SQRADDAC(a[54], a[57]); SQRADDAC(a[55], a[56]); SQRADDDB; + COMBA_STORE(b[111]); + + /* output 112 */ + CARRY_FORWARD; + SQRADDSC(a[49], a[63]); SQRADDAC(a[50], a[62]); SQRADDAC(a[51], a[61]); SQRADDAC(a[52], a[60]); SQRADDAC(a[53], a[59]); SQRADDAC(a[54], a[58]); SQRADDAC(a[55], a[57]); SQRADDDB; SQRADD(a[56], a[56]); + COMBA_STORE(b[112]); + + /* output 113 */ + CARRY_FORWARD; + SQRADDSC(a[50], a[63]); SQRADDAC(a[51], a[62]); SQRADDAC(a[52], a[61]); SQRADDAC(a[53], a[60]); SQRADDAC(a[54], a[59]); SQRADDAC(a[55], a[58]); SQRADDAC(a[56], a[57]); SQRADDDB; + COMBA_STORE(b[113]); + + /* output 114 */ + CARRY_FORWARD; + SQRADDSC(a[51], a[63]); SQRADDAC(a[52], a[62]); SQRADDAC(a[53], a[61]); SQRADDAC(a[54], a[60]); SQRADDAC(a[55], a[59]); SQRADDAC(a[56], a[58]); SQRADDDB; SQRADD(a[57], a[57]); + COMBA_STORE(b[114]); + + /* output 115 */ + CARRY_FORWARD; + SQRADDSC(a[52], a[63]); SQRADDAC(a[53], a[62]); SQRADDAC(a[54], a[61]); SQRADDAC(a[55], a[60]); SQRADDAC(a[56], a[59]); SQRADDAC(a[57], a[58]); SQRADDDB; + COMBA_STORE(b[115]); + + /* output 116 */ + CARRY_FORWARD; + SQRADDSC(a[53], a[63]); SQRADDAC(a[54], a[62]); SQRADDAC(a[55], a[61]); SQRADDAC(a[56], a[60]); SQRADDAC(a[57], a[59]); SQRADDDB; SQRADD(a[58], a[58]); + COMBA_STORE(b[116]); + + /* output 117 */ + CARRY_FORWARD; + SQRADDSC(a[54], a[63]); SQRADDAC(a[55], a[62]); SQRADDAC(a[56], a[61]); SQRADDAC(a[57], a[60]); SQRADDAC(a[58], a[59]); SQRADDDB; + COMBA_STORE(b[117]); + + /* output 118 */ + CARRY_FORWARD; + SQRADDSC(a[55], a[63]); SQRADDAC(a[56], a[62]); SQRADDAC(a[57], a[61]); SQRADDAC(a[58], a[60]); SQRADDDB; SQRADD(a[59], a[59]); + COMBA_STORE(b[118]); + + /* output 119 */ + CARRY_FORWARD; + SQRADDSC(a[56], a[63]); SQRADDAC(a[57], a[62]); SQRADDAC(a[58], a[61]); SQRADDAC(a[59], a[60]); SQRADDDB; + COMBA_STORE(b[119]); + + /* output 120 */ + CARRY_FORWARD; + SQRADDSC(a[57], a[63]); SQRADDAC(a[58], a[62]); SQRADDAC(a[59], a[61]); SQRADDDB; SQRADD(a[60], a[60]); + COMBA_STORE(b[120]); + + /* output 121 */ + CARRY_FORWARD; + SQRADDSC(a[58], a[63]); SQRADDAC(a[59], a[62]); SQRADDAC(a[60], a[61]); SQRADDDB; + COMBA_STORE(b[121]); + + /* output 122 */ + CARRY_FORWARD; + SQRADD2(a[59], a[63]); SQRADD2(a[60], a[62]); SQRADD(a[61], a[61]); + COMBA_STORE(b[122]); + + /* output 123 */ + CARRY_FORWARD; + SQRADD2(a[60], a[63]); SQRADD2(a[61], a[62]); + COMBA_STORE(b[123]); + + /* output 124 */ + CARRY_FORWARD; + SQRADD2(a[61], a[63]); SQRADD(a[62], a[62]); + COMBA_STORE(b[124]); + + /* output 125 */ + CARRY_FORWARD; + SQRADD2(a[62], a[63]); + COMBA_STORE(b[125]); + + /* output 126 */ + CARRY_FORWARD; + SQRADD(a[63], a[63]); + COMBA_STORE(b[126]); + COMBA_STORE2(b[127]); + COMBA_FINI; + + B->used = 128; + B->sign = FP_ZPOS; + memcpy(B->dp, b, 128 * sizeof(fp_digit)); + fp_clamp(B); +} + + +#endif + +/* End: fp_sqr_comba.c */ + +/* Start: fp_sqr_comba_generic.c */ /* generic comba squarer */ void fp_sqr_comba(fp_int *A, fp_int *B) { @@ -3696,665 +5152,7 @@ void fp_sqr_comba(fp_int *A, fp_int *B) } } -void fp_sqr_comba4(fp_int *A, fp_int *B) -{ - fp_digit *a, b[8], c0, c1, c2; - - a = A->dp; - COMBA_START; - - /* clear carries */ - CLEAR_CARRY; - - /* output 0 */ - SQRADD(a[0],a[0]); - COMBA_STORE(b[0]); - - /* output 1 */ - CARRY_FORWARD; - SQRADD2(a[0], a[1]); - COMBA_STORE(b[1]); - - /* output 2 */ - CARRY_FORWARD; - SQRADD2(a[0], a[2]); SQRADD(a[1], a[1]); - COMBA_STORE(b[2]); - - /* output 3 */ - CARRY_FORWARD; - SQRADD2(a[0], a[3]); SQRADD2(a[1], a[2]); - COMBA_STORE(b[3]); - - /* output 4 */ - CARRY_FORWARD; - SQRADD2(a[1], a[3]); SQRADD(a[2], a[2]); - COMBA_STORE(b[4]); - - /* output 5 */ - CARRY_FORWARD; - SQRADD2(a[2], a[3]); - COMBA_STORE(b[5]); - - /* output 6 */ - CARRY_FORWARD; - SQRADD(a[3], a[3]); - COMBA_STORE(b[6]); - COMBA_STORE2(b[7]); - COMBA_FINI; - - B->used = 8; - B->sign = FP_ZPOS; - memcpy(B->dp, b, 8 * sizeof(fp_digit)); - fp_clamp(B); -} - - -void fp_sqr_comba8(fp_int *A, fp_int *B) -{ - fp_digit *a, b[16], c0, c1, c2; - - a = A->dp; - COMBA_START; - - /* clear carries */ - CLEAR_CARRY; - - /* output 0 */ - SQRADD(a[0],a[0]); - COMBA_STORE(b[0]); - - /* output 1 */ - CARRY_FORWARD; - SQRADD2(a[0], a[1]); - COMBA_STORE(b[1]); - - /* output 2 */ - CARRY_FORWARD; - SQRADD2(a[0], a[2]); SQRADD(a[1], a[1]); - COMBA_STORE(b[2]); - - /* output 3 */ - CARRY_FORWARD; - SQRADD2(a[0], a[3]); SQRADD2(a[1], a[2]); - COMBA_STORE(b[3]); - - /* output 4 */ - CARRY_FORWARD; - SQRADD2(a[0], a[4]); SQRADD2(a[1], a[3]); SQRADD(a[2], a[2]); - COMBA_STORE(b[4]); - - /* output 5 */ - CARRY_FORWARD; - SQRADD2(a[0], a[5]); SQRADD2(a[1], a[4]); SQRADD2(a[2], a[3]); - COMBA_STORE(b[5]); - - /* output 6 */ - CARRY_FORWARD; - SQRADD2(a[0], a[6]); SQRADD2(a[1], a[5]); SQRADD2(a[2], a[4]); SQRADD(a[3], a[3]); - COMBA_STORE(b[6]); - - /* output 7 */ - CARRY_FORWARD; - SQRADD2(a[0], a[7]); SQRADD2(a[1], a[6]); SQRADD2(a[2], a[5]); SQRADD2(a[3], a[4]); - COMBA_STORE(b[7]); - - /* output 8 */ - CARRY_FORWARD; - SQRADD2(a[1], a[7]); SQRADD2(a[2], a[6]); SQRADD2(a[3], a[5]); SQRADD(a[4], a[4]); - COMBA_STORE(b[8]); - - /* output 9 */ - CARRY_FORWARD; - SQRADD2(a[2], a[7]); SQRADD2(a[3], a[6]); SQRADD2(a[4], a[5]); - COMBA_STORE(b[9]); - - /* output 10 */ - CARRY_FORWARD; - SQRADD2(a[3], a[7]); SQRADD2(a[4], a[6]); SQRADD(a[5], a[5]); - COMBA_STORE(b[10]); - - /* output 11 */ - CARRY_FORWARD; - SQRADD2(a[4], a[7]); SQRADD2(a[5], a[6]); - COMBA_STORE(b[11]); - - /* output 12 */ - CARRY_FORWARD; - SQRADD2(a[5], a[7]); SQRADD(a[6], a[6]); - COMBA_STORE(b[12]); - - /* output 13 */ - CARRY_FORWARD; - SQRADD2(a[6], a[7]); - COMBA_STORE(b[13]); - - /* output 14 */ - CARRY_FORWARD; - SQRADD(a[7], a[7]); - COMBA_STORE(b[14]); - COMBA_STORE2(b[15]); - COMBA_FINI; - - B->used = 16; - B->sign = FP_ZPOS; - memcpy(B->dp, b, 16 * sizeof(fp_digit)); - fp_clamp(B); -} - -#if defined(TFM_LARGE) - -void fp_sqr_comba16(fp_int *A, fp_int *B) -{ - fp_digit *a, b[32], c0, c1, c2; - - a = A->dp; - COMBA_START; - - /* clear carries */ - CLEAR_CARRY; - - /* output 0 */ - SQRADD(a[0],a[0]); - COMBA_STORE(b[0]); - - /* output 1 */ - CARRY_FORWARD; - SQRADD2(a[0], a[1]); - COMBA_STORE(b[1]); - - /* output 2 */ - CARRY_FORWARD; - SQRADD2(a[0], a[2]); SQRADD(a[1], a[1]); - COMBA_STORE(b[2]); - - /* output 3 */ - CARRY_FORWARD; - SQRADD2(a[0], a[3]); SQRADD2(a[1], a[2]); - COMBA_STORE(b[3]); - - /* output 4 */ - CARRY_FORWARD; - SQRADD2(a[0], a[4]); SQRADD2(a[1], a[3]); SQRADD(a[2], a[2]); - COMBA_STORE(b[4]); - - /* output 5 */ - CARRY_FORWARD; - SQRADD2(a[0], a[5]); SQRADD2(a[1], a[4]); SQRADD2(a[2], a[3]); - COMBA_STORE(b[5]); - - /* output 6 */ - CARRY_FORWARD; - SQRADD2(a[0], a[6]); SQRADD2(a[1], a[5]); SQRADD2(a[2], a[4]); SQRADD(a[3], a[3]); - COMBA_STORE(b[6]); - - /* output 7 */ - CARRY_FORWARD; - SQRADD2(a[0], a[7]); SQRADD2(a[1], a[6]); SQRADD2(a[2], a[5]); SQRADD2(a[3], a[4]); - COMBA_STORE(b[7]); - - /* output 8 */ - CARRY_FORWARD; - SQRADD2(a[0], a[8]); SQRADD2(a[1], a[7]); SQRADD2(a[2], a[6]); SQRADD2(a[3], a[5]); SQRADD(a[4], a[4]); - COMBA_STORE(b[8]); - - /* output 9 */ - CARRY_FORWARD; - SQRADD2(a[0], a[9]); SQRADD2(a[1], a[8]); SQRADD2(a[2], a[7]); SQRADD2(a[3], a[6]); SQRADD2(a[4], a[5]); - COMBA_STORE(b[9]); - - /* output 10 */ - CARRY_FORWARD; - SQRADD2(a[0], a[10]); SQRADD2(a[1], a[9]); SQRADD2(a[2], a[8]); SQRADD2(a[3], a[7]); SQRADD2(a[4], a[6]); SQRADD(a[5], a[5]); - COMBA_STORE(b[10]); - - /* output 11 */ - CARRY_FORWARD; - SQRADD2(a[0], a[11]); SQRADD2(a[1], a[10]); SQRADD2(a[2], a[9]); SQRADD2(a[3], a[8]); SQRADD2(a[4], a[7]); SQRADD2(a[5], a[6]); - COMBA_STORE(b[11]); - - /* output 12 */ - CARRY_FORWARD; - SQRADD2(a[0], a[12]); SQRADD2(a[1], a[11]); SQRADD2(a[2], a[10]); SQRADD2(a[3], a[9]); SQRADD2(a[4], a[8]); SQRADD2(a[5], a[7]); SQRADD(a[6], a[6]); - COMBA_STORE(b[12]); - - /* output 13 */ - CARRY_FORWARD; - SQRADD2(a[0], a[13]); SQRADD2(a[1], a[12]); SQRADD2(a[2], a[11]); SQRADD2(a[3], a[10]); SQRADD2(a[4], a[9]); SQRADD2(a[5], a[8]); SQRADD2(a[6], a[7]); - COMBA_STORE(b[13]); - - /* output 14 */ - CARRY_FORWARD; - SQRADD2(a[0], a[14]); SQRADD2(a[1], a[13]); SQRADD2(a[2], a[12]); SQRADD2(a[3], a[11]); SQRADD2(a[4], a[10]); SQRADD2(a[5], a[9]); SQRADD2(a[6], a[8]); SQRADD(a[7], a[7]); - COMBA_STORE(b[14]); - - /* output 15 */ - CARRY_FORWARD; - SQRADD2(a[0], a[15]); SQRADD2(a[1], a[14]); SQRADD2(a[2], a[13]); SQRADD2(a[3], a[12]); SQRADD2(a[4], a[11]); SQRADD2(a[5], a[10]); SQRADD2(a[6], a[9]); SQRADD2(a[7], a[8]); - COMBA_STORE(b[15]); - - /* output 16 */ - CARRY_FORWARD; - SQRADD2(a[1], a[15]); SQRADD2(a[2], a[14]); SQRADD2(a[3], a[13]); SQRADD2(a[4], a[12]); SQRADD2(a[5], a[11]); SQRADD2(a[6], a[10]); SQRADD2(a[7], a[9]); SQRADD(a[8], a[8]); - COMBA_STORE(b[16]); - - /* output 17 */ - CARRY_FORWARD; - SQRADD2(a[2], a[15]); SQRADD2(a[3], a[14]); SQRADD2(a[4], a[13]); SQRADD2(a[5], a[12]); SQRADD2(a[6], a[11]); SQRADD2(a[7], a[10]); SQRADD2(a[8], a[9]); - COMBA_STORE(b[17]); - - /* output 18 */ - CARRY_FORWARD; - SQRADD2(a[3], a[15]); SQRADD2(a[4], a[14]); SQRADD2(a[5], a[13]); SQRADD2(a[6], a[12]); SQRADD2(a[7], a[11]); SQRADD2(a[8], a[10]); SQRADD(a[9], a[9]); - COMBA_STORE(b[18]); - - /* output 19 */ - CARRY_FORWARD; - SQRADD2(a[4], a[15]); SQRADD2(a[5], a[14]); SQRADD2(a[6], a[13]); SQRADD2(a[7], a[12]); SQRADD2(a[8], a[11]); SQRADD2(a[9], a[10]); - COMBA_STORE(b[19]); - - /* output 20 */ - CARRY_FORWARD; - SQRADD2(a[5], a[15]); SQRADD2(a[6], a[14]); SQRADD2(a[7], a[13]); SQRADD2(a[8], a[12]); SQRADD2(a[9], a[11]); SQRADD(a[10], a[10]); - COMBA_STORE(b[20]); - - /* output 21 */ - CARRY_FORWARD; - SQRADD2(a[6], a[15]); SQRADD2(a[7], a[14]); SQRADD2(a[8], a[13]); SQRADD2(a[9], a[12]); SQRADD2(a[10], a[11]); - COMBA_STORE(b[21]); - - /* output 22 */ - CARRY_FORWARD; - SQRADD2(a[7], a[15]); SQRADD2(a[8], a[14]); SQRADD2(a[9], a[13]); SQRADD2(a[10], a[12]); SQRADD(a[11], a[11]); - COMBA_STORE(b[22]); - - /* output 23 */ - CARRY_FORWARD; - SQRADD2(a[8], a[15]); SQRADD2(a[9], a[14]); SQRADD2(a[10], a[13]); SQRADD2(a[11], a[12]); - COMBA_STORE(b[23]); - - /* output 24 */ - CARRY_FORWARD; - SQRADD2(a[9], a[15]); SQRADD2(a[10], a[14]); SQRADD2(a[11], a[13]); SQRADD(a[12], a[12]); - COMBA_STORE(b[24]); - - /* output 25 */ - CARRY_FORWARD; - SQRADD2(a[10], a[15]); SQRADD2(a[11], a[14]); SQRADD2(a[12], a[13]); - COMBA_STORE(b[25]); - - /* output 26 */ - CARRY_FORWARD; - SQRADD2(a[11], a[15]); SQRADD2(a[12], a[14]); SQRADD(a[13], a[13]); - COMBA_STORE(b[26]); - - /* output 27 */ - CARRY_FORWARD; - SQRADD2(a[12], a[15]); SQRADD2(a[13], a[14]); - COMBA_STORE(b[27]); - - /* output 28 */ - CARRY_FORWARD; - SQRADD2(a[13], a[15]); SQRADD(a[14], a[14]); - COMBA_STORE(b[28]); - - /* output 29 */ - CARRY_FORWARD; - SQRADD2(a[14], a[15]); - COMBA_STORE(b[29]); - - /* output 30 */ - CARRY_FORWARD; - SQRADD(a[15], a[15]); - COMBA_STORE(b[30]); - COMBA_STORE2(b[31]); - COMBA_FINI; - - B->used = 32; - B->sign = FP_ZPOS; - memcpy(B->dp, b, 32 * sizeof(fp_digit)); - fp_clamp(B); -} - -#endif /* TFM_LARGE */ - -#ifdef TFM_HUGE - -void fp_sqr_comba32(fp_int *A, fp_int *B) -{ - fp_digit *a, b[64], c0, c1, c2; - - a = A->dp; - COMBA_START; - - /* clear carries */ - CLEAR_CARRY; - - /* output 0 */ - SQRADD(a[0],a[0]); - COMBA_STORE(b[0]); - - /* output 1 */ - CARRY_FORWARD; - SQRADD2(a[0], a[1]); - COMBA_STORE(b[1]); - - /* output 2 */ - CARRY_FORWARD; - SQRADD2(a[0], a[2]); SQRADD(a[1], a[1]); - COMBA_STORE(b[2]); - - /* output 3 */ - CARRY_FORWARD; - SQRADD2(a[0], a[3]); SQRADD2(a[1], a[2]); - COMBA_STORE(b[3]); - - /* output 4 */ - CARRY_FORWARD; - SQRADD2(a[0], a[4]); SQRADD2(a[1], a[3]); SQRADD(a[2], a[2]); - COMBA_STORE(b[4]); - - /* output 5 */ - CARRY_FORWARD; - SQRADD2(a[0], a[5]); SQRADD2(a[1], a[4]); SQRADD2(a[2], a[3]); - COMBA_STORE(b[5]); - - /* output 6 */ - CARRY_FORWARD; - SQRADD2(a[0], a[6]); SQRADD2(a[1], a[5]); SQRADD2(a[2], a[4]); SQRADD(a[3], a[3]); - COMBA_STORE(b[6]); - - /* output 7 */ - CARRY_FORWARD; - SQRADD2(a[0], a[7]); SQRADD2(a[1], a[6]); SQRADD2(a[2], a[5]); SQRADD2(a[3], a[4]); - COMBA_STORE(b[7]); - - /* output 8 */ - CARRY_FORWARD; - SQRADD2(a[0], a[8]); SQRADD2(a[1], a[7]); SQRADD2(a[2], a[6]); SQRADD2(a[3], a[5]); SQRADD(a[4], a[4]); - COMBA_STORE(b[8]); - - /* output 9 */ - CARRY_FORWARD; - SQRADD2(a[0], a[9]); SQRADD2(a[1], a[8]); SQRADD2(a[2], a[7]); SQRADD2(a[3], a[6]); SQRADD2(a[4], a[5]); - COMBA_STORE(b[9]); - - /* output 10 */ - CARRY_FORWARD; - SQRADD2(a[0], a[10]); SQRADD2(a[1], a[9]); SQRADD2(a[2], a[8]); SQRADD2(a[3], a[7]); SQRADD2(a[4], a[6]); SQRADD(a[5], a[5]); - COMBA_STORE(b[10]); - - /* output 11 */ - CARRY_FORWARD; - SQRADD2(a[0], a[11]); SQRADD2(a[1], a[10]); SQRADD2(a[2], a[9]); SQRADD2(a[3], a[8]); SQRADD2(a[4], a[7]); SQRADD2(a[5], a[6]); - COMBA_STORE(b[11]); - - /* output 12 */ - CARRY_FORWARD; - SQRADD2(a[0], a[12]); SQRADD2(a[1], a[11]); SQRADD2(a[2], a[10]); SQRADD2(a[3], a[9]); SQRADD2(a[4], a[8]); SQRADD2(a[5], a[7]); SQRADD(a[6], a[6]); - COMBA_STORE(b[12]); - - /* output 13 */ - CARRY_FORWARD; - SQRADD2(a[0], a[13]); SQRADD2(a[1], a[12]); SQRADD2(a[2], a[11]); SQRADD2(a[3], a[10]); SQRADD2(a[4], a[9]); SQRADD2(a[5], a[8]); SQRADD2(a[6], a[7]); - COMBA_STORE(b[13]); - - /* output 14 */ - CARRY_FORWARD; - SQRADD2(a[0], a[14]); SQRADD2(a[1], a[13]); SQRADD2(a[2], a[12]); SQRADD2(a[3], a[11]); SQRADD2(a[4], a[10]); SQRADD2(a[5], a[9]); SQRADD2(a[6], a[8]); SQRADD(a[7], a[7]); - COMBA_STORE(b[14]); - - /* output 15 */ - CARRY_FORWARD; - SQRADD2(a[0], a[15]); SQRADD2(a[1], a[14]); SQRADD2(a[2], a[13]); SQRADD2(a[3], a[12]); SQRADD2(a[4], a[11]); SQRADD2(a[5], a[10]); SQRADD2(a[6], a[9]); SQRADD2(a[7], a[8]); - COMBA_STORE(b[15]); - - /* output 16 */ - CARRY_FORWARD; - SQRADD2(a[0], a[16]); SQRADD2(a[1], a[15]); SQRADD2(a[2], a[14]); SQRADD2(a[3], a[13]); SQRADD2(a[4], a[12]); SQRADD2(a[5], a[11]); SQRADD2(a[6], a[10]); SQRADD2(a[7], a[9]); SQRADD(a[8], a[8]); - COMBA_STORE(b[16]); - - /* output 17 */ - CARRY_FORWARD; - SQRADD2(a[0], a[17]); SQRADD2(a[1], a[16]); SQRADD2(a[2], a[15]); SQRADD2(a[3], a[14]); SQRADD2(a[4], a[13]); SQRADD2(a[5], a[12]); SQRADD2(a[6], a[11]); SQRADD2(a[7], a[10]); SQRADD2(a[8], a[9]); - COMBA_STORE(b[17]); - - /* output 18 */ - CARRY_FORWARD; - SQRADD2(a[0], a[18]); SQRADD2(a[1], a[17]); SQRADD2(a[2], a[16]); SQRADD2(a[3], a[15]); SQRADD2(a[4], a[14]); SQRADD2(a[5], a[13]); SQRADD2(a[6], a[12]); SQRADD2(a[7], a[11]); SQRADD2(a[8], a[10]); SQRADD(a[9], a[9]); - COMBA_STORE(b[18]); - - /* output 19 */ - CARRY_FORWARD; - SQRADD2(a[0], a[19]); SQRADD2(a[1], a[18]); SQRADD2(a[2], a[17]); SQRADD2(a[3], a[16]); SQRADD2(a[4], a[15]); SQRADD2(a[5], a[14]); SQRADD2(a[6], a[13]); SQRADD2(a[7], a[12]); SQRADD2(a[8], a[11]); SQRADD2(a[9], a[10]); - COMBA_STORE(b[19]); - - /* output 20 */ - CARRY_FORWARD; - SQRADD2(a[0], a[20]); SQRADD2(a[1], a[19]); SQRADD2(a[2], a[18]); SQRADD2(a[3], a[17]); SQRADD2(a[4], a[16]); SQRADD2(a[5], a[15]); SQRADD2(a[6], a[14]); SQRADD2(a[7], a[13]); SQRADD2(a[8], a[12]); SQRADD2(a[9], a[11]); SQRADD(a[10], a[10]); - COMBA_STORE(b[20]); - - /* output 21 */ - CARRY_FORWARD; - SQRADD2(a[0], a[21]); SQRADD2(a[1], a[20]); SQRADD2(a[2], a[19]); SQRADD2(a[3], a[18]); SQRADD2(a[4], a[17]); SQRADD2(a[5], a[16]); SQRADD2(a[6], a[15]); SQRADD2(a[7], a[14]); SQRADD2(a[8], a[13]); SQRADD2(a[9], a[12]); SQRADD2(a[10], a[11]); - COMBA_STORE(b[21]); - - /* output 22 */ - CARRY_FORWARD; - SQRADD2(a[0], a[22]); SQRADD2(a[1], a[21]); SQRADD2(a[2], a[20]); SQRADD2(a[3], a[19]); SQRADD2(a[4], a[18]); SQRADD2(a[5], a[17]); SQRADD2(a[6], a[16]); SQRADD2(a[7], a[15]); SQRADD2(a[8], a[14]); SQRADD2(a[9], a[13]); SQRADD2(a[10], a[12]); SQRADD(a[11], a[11]); - COMBA_STORE(b[22]); - - /* output 23 */ - CARRY_FORWARD; - SQRADD2(a[0], a[23]); SQRADD2(a[1], a[22]); SQRADD2(a[2], a[21]); SQRADD2(a[3], a[20]); SQRADD2(a[4], a[19]); SQRADD2(a[5], a[18]); SQRADD2(a[6], a[17]); SQRADD2(a[7], a[16]); SQRADD2(a[8], a[15]); SQRADD2(a[9], a[14]); SQRADD2(a[10], a[13]); SQRADD2(a[11], a[12]); - COMBA_STORE(b[23]); - - /* output 24 */ - CARRY_FORWARD; - SQRADD2(a[0], a[24]); SQRADD2(a[1], a[23]); SQRADD2(a[2], a[22]); SQRADD2(a[3], a[21]); SQRADD2(a[4], a[20]); SQRADD2(a[5], a[19]); SQRADD2(a[6], a[18]); SQRADD2(a[7], a[17]); SQRADD2(a[8], a[16]); SQRADD2(a[9], a[15]); SQRADD2(a[10], a[14]); SQRADD2(a[11], a[13]); SQRADD(a[12], a[12]); - COMBA_STORE(b[24]); - - /* output 25 */ - CARRY_FORWARD; - SQRADD2(a[0], a[25]); SQRADD2(a[1], a[24]); SQRADD2(a[2], a[23]); SQRADD2(a[3], a[22]); SQRADD2(a[4], a[21]); SQRADD2(a[5], a[20]); SQRADD2(a[6], a[19]); SQRADD2(a[7], a[18]); SQRADD2(a[8], a[17]); SQRADD2(a[9], a[16]); SQRADD2(a[10], a[15]); SQRADD2(a[11], a[14]); SQRADD2(a[12], a[13]); - COMBA_STORE(b[25]); - - /* output 26 */ - CARRY_FORWARD; - SQRADD2(a[0], a[26]); SQRADD2(a[1], a[25]); SQRADD2(a[2], a[24]); SQRADD2(a[3], a[23]); SQRADD2(a[4], a[22]); SQRADD2(a[5], a[21]); SQRADD2(a[6], a[20]); SQRADD2(a[7], a[19]); SQRADD2(a[8], a[18]); SQRADD2(a[9], a[17]); SQRADD2(a[10], a[16]); SQRADD2(a[11], a[15]); SQRADD2(a[12], a[14]); SQRADD(a[13], a[13]); - COMBA_STORE(b[26]); - - /* output 27 */ - CARRY_FORWARD; - SQRADD2(a[0], a[27]); SQRADD2(a[1], a[26]); SQRADD2(a[2], a[25]); SQRADD2(a[3], a[24]); SQRADD2(a[4], a[23]); SQRADD2(a[5], a[22]); SQRADD2(a[6], a[21]); SQRADD2(a[7], a[20]); SQRADD2(a[8], a[19]); SQRADD2(a[9], a[18]); SQRADD2(a[10], a[17]); SQRADD2(a[11], a[16]); SQRADD2(a[12], a[15]); SQRADD2(a[13], a[14]); - COMBA_STORE(b[27]); - - /* output 28 */ - CARRY_FORWARD; - SQRADD2(a[0], a[28]); SQRADD2(a[1], a[27]); SQRADD2(a[2], a[26]); SQRADD2(a[3], a[25]); SQRADD2(a[4], a[24]); SQRADD2(a[5], a[23]); SQRADD2(a[6], a[22]); SQRADD2(a[7], a[21]); SQRADD2(a[8], a[20]); SQRADD2(a[9], a[19]); SQRADD2(a[10], a[18]); SQRADD2(a[11], a[17]); SQRADD2(a[12], a[16]); SQRADD2(a[13], a[15]); SQRADD(a[14], a[14]); - COMBA_STORE(b[28]); - - /* output 29 */ - CARRY_FORWARD; - SQRADD2(a[0], a[29]); SQRADD2(a[1], a[28]); SQRADD2(a[2], a[27]); SQRADD2(a[3], a[26]); SQRADD2(a[4], a[25]); SQRADD2(a[5], a[24]); SQRADD2(a[6], a[23]); SQRADD2(a[7], a[22]); SQRADD2(a[8], a[21]); SQRADD2(a[9], a[20]); SQRADD2(a[10], a[19]); SQRADD2(a[11], a[18]); SQRADD2(a[12], a[17]); SQRADD2(a[13], a[16]); SQRADD2(a[14], a[15]); - COMBA_STORE(b[29]); - - /* output 30 */ - CARRY_FORWARD; - SQRADD2(a[0], a[30]); SQRADD2(a[1], a[29]); SQRADD2(a[2], a[28]); SQRADD2(a[3], a[27]); SQRADD2(a[4], a[26]); SQRADD2(a[5], a[25]); SQRADD2(a[6], a[24]); SQRADD2(a[7], a[23]); SQRADD2(a[8], a[22]); SQRADD2(a[9], a[21]); SQRADD2(a[10], a[20]); SQRADD2(a[11], a[19]); SQRADD2(a[12], a[18]); SQRADD2(a[13], a[17]); SQRADD2(a[14], a[16]); SQRADD(a[15], a[15]); - COMBA_STORE(b[30]); - - /* output 31 */ - CARRY_FORWARD; - SQRADD2(a[0], a[31]); SQRADD2(a[1], a[30]); SQRADD2(a[2], a[29]); SQRADD2(a[3], a[28]); SQRADD2(a[4], a[27]); SQRADD2(a[5], a[26]); SQRADD2(a[6], a[25]); SQRADD2(a[7], a[24]); SQRADD2(a[8], a[23]); SQRADD2(a[9], a[22]); SQRADD2(a[10], a[21]); SQRADD2(a[11], a[20]); SQRADD2(a[12], a[19]); SQRADD2(a[13], a[18]); SQRADD2(a[14], a[17]); SQRADD2(a[15], a[16]); - COMBA_STORE(b[31]); - - /* output 32 */ - CARRY_FORWARD; - SQRADD2(a[1], a[31]); SQRADD2(a[2], a[30]); SQRADD2(a[3], a[29]); SQRADD2(a[4], a[28]); SQRADD2(a[5], a[27]); SQRADD2(a[6], a[26]); SQRADD2(a[7], a[25]); SQRADD2(a[8], a[24]); SQRADD2(a[9], a[23]); SQRADD2(a[10], a[22]); SQRADD2(a[11], a[21]); SQRADD2(a[12], a[20]); SQRADD2(a[13], a[19]); SQRADD2(a[14], a[18]); SQRADD2(a[15], a[17]); SQRADD(a[16], a[16]); - COMBA_STORE(b[32]); - - /* output 33 */ - CARRY_FORWARD; - SQRADD2(a[2], a[31]); SQRADD2(a[3], a[30]); SQRADD2(a[4], a[29]); SQRADD2(a[5], a[28]); SQRADD2(a[6], a[27]); SQRADD2(a[7], a[26]); SQRADD2(a[8], a[25]); SQRADD2(a[9], a[24]); SQRADD2(a[10], a[23]); SQRADD2(a[11], a[22]); SQRADD2(a[12], a[21]); SQRADD2(a[13], a[20]); SQRADD2(a[14], a[19]); SQRADD2(a[15], a[18]); SQRADD2(a[16], a[17]); - COMBA_STORE(b[33]); - - /* output 34 */ - CARRY_FORWARD; - SQRADD2(a[3], a[31]); SQRADD2(a[4], a[30]); SQRADD2(a[5], a[29]); SQRADD2(a[6], a[28]); SQRADD2(a[7], a[27]); SQRADD2(a[8], a[26]); SQRADD2(a[9], a[25]); SQRADD2(a[10], a[24]); SQRADD2(a[11], a[23]); SQRADD2(a[12], a[22]); SQRADD2(a[13], a[21]); SQRADD2(a[14], a[20]); SQRADD2(a[15], a[19]); SQRADD2(a[16], a[18]); SQRADD(a[17], a[17]); - COMBA_STORE(b[34]); - - /* output 35 */ - CARRY_FORWARD; - SQRADD2(a[4], a[31]); SQRADD2(a[5], a[30]); SQRADD2(a[6], a[29]); SQRADD2(a[7], a[28]); SQRADD2(a[8], a[27]); SQRADD2(a[9], a[26]); SQRADD2(a[10], a[25]); SQRADD2(a[11], a[24]); SQRADD2(a[12], a[23]); SQRADD2(a[13], a[22]); SQRADD2(a[14], a[21]); SQRADD2(a[15], a[20]); SQRADD2(a[16], a[19]); SQRADD2(a[17], a[18]); - COMBA_STORE(b[35]); - - /* output 36 */ - CARRY_FORWARD; - SQRADD2(a[5], a[31]); SQRADD2(a[6], a[30]); SQRADD2(a[7], a[29]); SQRADD2(a[8], a[28]); SQRADD2(a[9], a[27]); SQRADD2(a[10], a[26]); SQRADD2(a[11], a[25]); SQRADD2(a[12], a[24]); SQRADD2(a[13], a[23]); SQRADD2(a[14], a[22]); SQRADD2(a[15], a[21]); SQRADD2(a[16], a[20]); SQRADD2(a[17], a[19]); SQRADD(a[18], a[18]); - COMBA_STORE(b[36]); - - /* output 37 */ - CARRY_FORWARD; - SQRADD2(a[6], a[31]); SQRADD2(a[7], a[30]); SQRADD2(a[8], a[29]); SQRADD2(a[9], a[28]); SQRADD2(a[10], a[27]); SQRADD2(a[11], a[26]); SQRADD2(a[12], a[25]); SQRADD2(a[13], a[24]); SQRADD2(a[14], a[23]); SQRADD2(a[15], a[22]); SQRADD2(a[16], a[21]); SQRADD2(a[17], a[20]); SQRADD2(a[18], a[19]); - COMBA_STORE(b[37]); - - /* output 38 */ - CARRY_FORWARD; - SQRADD2(a[7], a[31]); SQRADD2(a[8], a[30]); SQRADD2(a[9], a[29]); SQRADD2(a[10], a[28]); SQRADD2(a[11], a[27]); SQRADD2(a[12], a[26]); SQRADD2(a[13], a[25]); SQRADD2(a[14], a[24]); SQRADD2(a[15], a[23]); SQRADD2(a[16], a[22]); SQRADD2(a[17], a[21]); SQRADD2(a[18], a[20]); SQRADD(a[19], a[19]); - COMBA_STORE(b[38]); - - /* output 39 */ - CARRY_FORWARD; - SQRADD2(a[8], a[31]); SQRADD2(a[9], a[30]); SQRADD2(a[10], a[29]); SQRADD2(a[11], a[28]); SQRADD2(a[12], a[27]); SQRADD2(a[13], a[26]); SQRADD2(a[14], a[25]); SQRADD2(a[15], a[24]); SQRADD2(a[16], a[23]); SQRADD2(a[17], a[22]); SQRADD2(a[18], a[21]); SQRADD2(a[19], a[20]); - COMBA_STORE(b[39]); - - /* output 40 */ - CARRY_FORWARD; - SQRADD2(a[9], a[31]); SQRADD2(a[10], a[30]); SQRADD2(a[11], a[29]); SQRADD2(a[12], a[28]); SQRADD2(a[13], a[27]); SQRADD2(a[14], a[26]); SQRADD2(a[15], a[25]); SQRADD2(a[16], a[24]); SQRADD2(a[17], a[23]); SQRADD2(a[18], a[22]); SQRADD2(a[19], a[21]); SQRADD(a[20], a[20]); - COMBA_STORE(b[40]); - - /* output 41 */ - CARRY_FORWARD; - SQRADD2(a[10], a[31]); SQRADD2(a[11], a[30]); SQRADD2(a[12], a[29]); SQRADD2(a[13], a[28]); SQRADD2(a[14], a[27]); SQRADD2(a[15], a[26]); SQRADD2(a[16], a[25]); SQRADD2(a[17], a[24]); SQRADD2(a[18], a[23]); SQRADD2(a[19], a[22]); SQRADD2(a[20], a[21]); - COMBA_STORE(b[41]); - - /* output 42 */ - CARRY_FORWARD; - SQRADD2(a[11], a[31]); SQRADD2(a[12], a[30]); SQRADD2(a[13], a[29]); SQRADD2(a[14], a[28]); SQRADD2(a[15], a[27]); SQRADD2(a[16], a[26]); SQRADD2(a[17], a[25]); SQRADD2(a[18], a[24]); SQRADD2(a[19], a[23]); SQRADD2(a[20], a[22]); SQRADD(a[21], a[21]); - COMBA_STORE(b[42]); - - /* output 43 */ - CARRY_FORWARD; - SQRADD2(a[12], a[31]); SQRADD2(a[13], a[30]); SQRADD2(a[14], a[29]); SQRADD2(a[15], a[28]); SQRADD2(a[16], a[27]); SQRADD2(a[17], a[26]); SQRADD2(a[18], a[25]); SQRADD2(a[19], a[24]); SQRADD2(a[20], a[23]); SQRADD2(a[21], a[22]); - COMBA_STORE(b[43]); - - /* output 44 */ - CARRY_FORWARD; - SQRADD2(a[13], a[31]); SQRADD2(a[14], a[30]); SQRADD2(a[15], a[29]); SQRADD2(a[16], a[28]); SQRADD2(a[17], a[27]); SQRADD2(a[18], a[26]); SQRADD2(a[19], a[25]); SQRADD2(a[20], a[24]); SQRADD2(a[21], a[23]); SQRADD(a[22], a[22]); - COMBA_STORE(b[44]); - - /* output 45 */ - CARRY_FORWARD; - SQRADD2(a[14], a[31]); SQRADD2(a[15], a[30]); SQRADD2(a[16], a[29]); SQRADD2(a[17], a[28]); SQRADD2(a[18], a[27]); SQRADD2(a[19], a[26]); SQRADD2(a[20], a[25]); SQRADD2(a[21], a[24]); SQRADD2(a[22], a[23]); - COMBA_STORE(b[45]); - - /* output 46 */ - CARRY_FORWARD; - SQRADD2(a[15], a[31]); SQRADD2(a[16], a[30]); SQRADD2(a[17], a[29]); SQRADD2(a[18], a[28]); SQRADD2(a[19], a[27]); SQRADD2(a[20], a[26]); SQRADD2(a[21], a[25]); SQRADD2(a[22], a[24]); SQRADD(a[23], a[23]); - COMBA_STORE(b[46]); - - /* output 47 */ - CARRY_FORWARD; - SQRADD2(a[16], a[31]); SQRADD2(a[17], a[30]); SQRADD2(a[18], a[29]); SQRADD2(a[19], a[28]); SQRADD2(a[20], a[27]); SQRADD2(a[21], a[26]); SQRADD2(a[22], a[25]); SQRADD2(a[23], a[24]); - COMBA_STORE(b[47]); - - /* output 48 */ - CARRY_FORWARD; - SQRADD2(a[17], a[31]); SQRADD2(a[18], a[30]); SQRADD2(a[19], a[29]); SQRADD2(a[20], a[28]); SQRADD2(a[21], a[27]); SQRADD2(a[22], a[26]); SQRADD2(a[23], a[25]); SQRADD(a[24], a[24]); - COMBA_STORE(b[48]); - - /* output 49 */ - CARRY_FORWARD; - SQRADD2(a[18], a[31]); SQRADD2(a[19], a[30]); SQRADD2(a[20], a[29]); SQRADD2(a[21], a[28]); SQRADD2(a[22], a[27]); SQRADD2(a[23], a[26]); SQRADD2(a[24], a[25]); - COMBA_STORE(b[49]); - - /* output 50 */ - CARRY_FORWARD; - SQRADD2(a[19], a[31]); SQRADD2(a[20], a[30]); SQRADD2(a[21], a[29]); SQRADD2(a[22], a[28]); SQRADD2(a[23], a[27]); SQRADD2(a[24], a[26]); SQRADD(a[25], a[25]); - COMBA_STORE(b[50]); - - /* output 51 */ - CARRY_FORWARD; - SQRADD2(a[20], a[31]); SQRADD2(a[21], a[30]); SQRADD2(a[22], a[29]); SQRADD2(a[23], a[28]); SQRADD2(a[24], a[27]); SQRADD2(a[25], a[26]); - COMBA_STORE(b[51]); - - /* output 52 */ - CARRY_FORWARD; - SQRADD2(a[21], a[31]); SQRADD2(a[22], a[30]); SQRADD2(a[23], a[29]); SQRADD2(a[24], a[28]); SQRADD2(a[25], a[27]); SQRADD(a[26], a[26]); - COMBA_STORE(b[52]); - - /* output 53 */ - CARRY_FORWARD; - SQRADD2(a[22], a[31]); SQRADD2(a[23], a[30]); SQRADD2(a[24], a[29]); SQRADD2(a[25], a[28]); SQRADD2(a[26], a[27]); - COMBA_STORE(b[53]); - - /* output 54 */ - CARRY_FORWARD; - SQRADD2(a[23], a[31]); SQRADD2(a[24], a[30]); SQRADD2(a[25], a[29]); SQRADD2(a[26], a[28]); SQRADD(a[27], a[27]); - COMBA_STORE(b[54]); - - /* output 55 */ - CARRY_FORWARD; - SQRADD2(a[24], a[31]); SQRADD2(a[25], a[30]); SQRADD2(a[26], a[29]); SQRADD2(a[27], a[28]); - COMBA_STORE(b[55]); - - /* output 56 */ - CARRY_FORWARD; - SQRADD2(a[25], a[31]); SQRADD2(a[26], a[30]); SQRADD2(a[27], a[29]); SQRADD(a[28], a[28]); - COMBA_STORE(b[56]); - - /* output 57 */ - CARRY_FORWARD; - SQRADD2(a[26], a[31]); SQRADD2(a[27], a[30]); SQRADD2(a[28], a[29]); - COMBA_STORE(b[57]); - - /* output 58 */ - CARRY_FORWARD; - SQRADD2(a[27], a[31]); SQRADD2(a[28], a[30]); SQRADD(a[29], a[29]); - COMBA_STORE(b[58]); - - /* output 59 */ - CARRY_FORWARD; - SQRADD2(a[28], a[31]); SQRADD2(a[29], a[30]); - COMBA_STORE(b[59]); - - /* output 60 */ - CARRY_FORWARD; - SQRADD2(a[29], a[31]); SQRADD(a[30], a[30]); - COMBA_STORE(b[60]); - - /* output 61 */ - CARRY_FORWARD; - SQRADD2(a[30], a[31]); - COMBA_STORE(b[61]); - - /* output 62 */ - CARRY_FORWARD; - SQRADD(a[31], a[31]); - COMBA_STORE(b[62]); - COMBA_STORE2(b[63]); - COMBA_FINI; - - B->used = 64; - B->sign = FP_ZPOS; - memcpy(B->dp, b, 64 * sizeof(fp_digit)); - fp_clamp(B); -} - -#endif - - -/* End: fp_sqr_comba.c */ +/* End: fp_sqr_comba_generic.c */ /* Start: fp_sqrmod.c */ /* TomsFastMath, a fast ISO C bignum library. diff --git a/random_txt_files/newsqr.txt b/random_txt_files/newsqr.txt new file mode 100644 index 0000000..71a2773 --- /dev/null +++ b/random_txt_files/newsqr.txt @@ -0,0 +1,36 @@ +New code added in TFM v0.03 + +OLD 64-bit...[athlon64] + +Squaring: + 256-bit: 89 + 512-bit: 234 + 1024-bit: 815 + 2048-bit: 2851 + +NEW 64-bit ... + +Squaring: + 256-bit: 89 + 512-bit: 228 + 1024-bit: 691 + 2048-bit: 2228 + + +OLD 32-bit [athlonxp] + +Squaring: + + 256-bit: 327 + 512-bit: 1044 + 1024-bit: 3646 + 2048-bit: 17055 + +NEW 32-bit + +Squaring: + + 256-bit: 332 + 512-bit: 894 + 1024-bit: 2983 + 2048-bit: 10385 diff --git a/tfm.h b/tfm.h index c927bae..b65f6c0 100644 --- a/tfm.h +++ b/tfm.h @@ -107,11 +107,11 @@ /* we want no asm? */ #ifdef TFM_NO_ASM - #undef TFM_X86 - #undef TFM_X86_64 - #undef TFM_SSE2 - #undef TFM_ARM - #undef TFM_ASM + #undef TFM_X86 + #undef TFM_X86_64 + #undef TFM_SSE2 + #undef TFM_ARM + #undef TFM_ASM #endif /* some default configurations. @@ -350,6 +350,7 @@ void fp_sqr_comba16(fp_int *A, fp_int *B); #endif #ifdef TFM_HUGE void fp_sqr_comba32(fp_int *A, fp_int *B); +void fp_sqr_comba64(fp_int *A, fp_int *B); #endif extern const char *fp_s_rmap; diff --git a/tfm.tex b/tfm.tex index db09a6e..f99d53e 100644 --- a/tfm.tex +++ b/tfm.tex @@ -49,7 +49,7 @@ \begin{document} \frontmatter \pagestyle{empty} -\title{TomsFastMath User Manual \\ v0.02} +\title{TomsFastMath User Manual \\ v0.03} \author{Tom St Denis \\ tomstdenis@iahu.ca} \maketitle This text and library are all hereby placed in the public domain. This book has been formatted for B5 @@ -525,6 +525,37 @@ This is essentially the MULADD macro from the multiplication code. This is like SQRADD except it adds the produce twice. It's similar to computing SQRADD(i, j*2). +To further make things interesting the squaring code also has ``doubles'' (see my LTM book chapter five...) which are +handled with these macros. + +\begin{verbatim} +#define SQRADDSC(i, j) \ + do { fp_word t; \ + t = ((fp_word)i) * ((fp_word)j); \ + sc0 = (fp_digit)t; sc1 = (t >> DIGIT_BIT); sc2 = 0; \ + } while (0); +\end{verbatim} +This computes a product and stores it in the ``secondary'' carry registers $\left < sc0, sc1, sc2 \right >$. + +\begin{verbatim} +#define SQRADDAC(i, j) \ + do { fp_word t; \ + t = sc0 + ((fp_word)i) * ((fp_word)j); sc0 = t; \ + t = sc1 + (t >> DIGIT_BIT); sc1 = t; sc2 += t >> DIGIT_BIT; \ + } while (0); +\end{verbatim} +This computes a product and adds it to the ``secondary'' carry registers. + +\begin{verbatim} +#define SQRADDDB \ + do { fp_word t; \ + t = ((fp_word)sc0) + ((fp_word)sc0) + c0; c0 = t; \ + t = ((fp_word)sc1) + ((fp_word)sc1) + c1 + (t >> DIGIT_BIT); c1 = t; \ + c2 = c2 + ((fp_word)sc2) + ((fp_word)sc2) + (t >> DIGIT_BIT); \ + } while (0); +\end{verbatim} +This doubles the ``secondary'' carry registers and adds the sum to the main carry registers. Really complicated. + \section{Montgomery with Comba} Montgomery reduction is used in modular exponentiation and is most called function during that operation. It's important to make sure this routine is very fast or all is lost.