From 107c23505b8a7e1eed77e62732bcfcdc0661b052 Mon Sep 17 00:00:00 2001 From: Evgeniy Berlog Date: Tue, 28 Aug 2012 08:24:07 +0000 Subject: [PATCH] fixed bug 53434 git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1378016 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/poi/ss/formula/LazyAreaEval.java | 2 +- .../ss/formula/functions/TestSubtotal.java | 174 +++++++++--------- test-data/spreadsheet/SubtotalsNested.xls | Bin 18944 -> 23040 bytes 3 files changed, 88 insertions(+), 88 deletions(-) diff --git a/src/java/org/apache/poi/ss/formula/LazyAreaEval.java b/src/java/org/apache/poi/ss/formula/LazyAreaEval.java index 2a9f94391..c23fb4f4e 100644 --- a/src/java/org/apache/poi/ss/formula/LazyAreaEval.java +++ b/src/java/org/apache/poi/ss/formula/LazyAreaEval.java @@ -93,6 +93,6 @@ final class LazyAreaEval extends AreaEvalBase { */ public boolean isSubTotal(int rowIndex, int columnIndex){ // delegate the query to the sheet evaluator which has access to internal ptgs - return _evaluator.isSubTotal(rowIndex, columnIndex); + return _evaluator.isSubTotal(getFirstRow() + rowIndex, getFirstColumn() + columnIndex); } } diff --git a/src/testcases/org/apache/poi/ss/formula/functions/TestSubtotal.java b/src/testcases/org/apache/poi/ss/formula/functions/TestSubtotal.java index 14cb2d828..7b63eaf79 100644 --- a/src/testcases/org/apache/poi/ss/formula/functions/TestSubtotal.java +++ b/src/testcases/org/apache/poi/ss/formula/functions/TestSubtotal.java @@ -81,20 +81,20 @@ public final class TestSubtotal extends TestCase { FormulaEvaluator fe = wb.getCreationHelper().createFormulaEvaluator(); Sheet sh = wb.createSheet(); - Cell a1 = sh.createRow(0).createCell(0); + Cell a1 = sh.createRow(1).createCell(1); a1.setCellValue(1); - Cell a2 = sh.createRow(1).createCell(0); + Cell a2 = sh.createRow(2).createCell(1); a2.setCellValue(3); - Cell a3 = sh.createRow(2).createCell(0); - a3.setCellFormula("SUBTOTAL(1,A1:A2)"); - Cell a4 = sh.createRow(3).createCell(0); + Cell a3 = sh.createRow(3).createCell(1); + a3.setCellFormula("SUBTOTAL(1,B2:B3)"); + Cell a4 = sh.createRow(4).createCell(1); a4.setCellValue(1); - Cell a5 = sh.createRow(4).createCell(0); + Cell a5 = sh.createRow(5).createCell(1); a5.setCellValue(7); - Cell a6 = sh.createRow(5).createCell(0); - a6.setCellFormula("SUBTOTAL(1,A1:A5)*2 + 2"); - Cell a7 = sh.createRow(6).createCell(0); - a7.setCellFormula("SUBTOTAL(1,A1:A6)"); + Cell a6 = sh.createRow(6).createCell(1); + a6.setCellFormula("SUBTOTAL(1,B2:B6)*2 + 2"); + Cell a7 = sh.createRow(7).createCell(1); + a7.setCellFormula("SUBTOTAL(1,B2:B7)"); fe.evaluateAll(); @@ -110,20 +110,20 @@ public final class TestSubtotal extends TestCase { FormulaEvaluator fe = wb.getCreationHelper().createFormulaEvaluator(); Sheet sh = wb.createSheet(); - Cell a1 = sh.createRow(0).createCell(0); + Cell a1 = sh.createRow(1).createCell(1); a1.setCellValue(1); - Cell a2 = sh.createRow(1).createCell(0); + Cell a2 = sh.createRow(2).createCell(1); a2.setCellValue(3); - Cell a3 = sh.createRow(2).createCell(0); - a3.setCellFormula("SUBTOTAL(9,A1:A2)"); - Cell a4 = sh.createRow(3).createCell(0); + Cell a3 = sh.createRow(3).createCell(1); + a3.setCellFormula("SUBTOTAL(9,B2:B3)"); + Cell a4 = sh.createRow(4).createCell(1); a4.setCellValue(1); - Cell a5 = sh.createRow(4).createCell(0); + Cell a5 = sh.createRow(5).createCell(1); a5.setCellValue(7); - Cell a6 = sh.createRow(5).createCell(0); - a6.setCellFormula("SUBTOTAL(9,A1:A5)*2 + 2"); - Cell a7 = sh.createRow(6).createCell(0); - a7.setCellFormula("SUBTOTAL(9,A1:A6)"); + Cell a6 = sh.createRow(6).createCell(1); + a6.setCellFormula("SUBTOTAL(9,B2:B6)*2 + 2"); + Cell a7 = sh.createRow(7).createCell(1); + a7.setCellFormula("SUBTOTAL(9,B2:B7)"); fe.evaluateAll(); @@ -139,20 +139,20 @@ public final class TestSubtotal extends TestCase { FormulaEvaluator fe = wb.getCreationHelper().createFormulaEvaluator(); Sheet sh = wb.createSheet(); - Cell a1 = sh.createRow(0).createCell(0); + Cell a1 = sh.createRow(1).createCell(1); a1.setCellValue(1); - Cell a2 = sh.createRow(1).createCell(0); + Cell a2 = sh.createRow(2).createCell(1); a2.setCellValue(3); - Cell a3 = sh.createRow(2).createCell(0); - a3.setCellFormula("SUBTOTAL(2,A1:A2)"); - Cell a4 = sh.createRow(3).createCell(0); + Cell a3 = sh.createRow(3).createCell(1); + a3.setCellFormula("SUBTOTAL(2,B2:B3)"); + Cell a4 = sh.createRow(4).createCell(1); a4.setCellValue("POI"); // A4 is string and not counted - Cell a5 = sh.createRow(4).createCell(0); // A5 is blank and not counted + Cell a5 = sh.createRow(5).createCell(1); // A5 is blank and not counted - Cell a6 = sh.createRow(5).createCell(0); - a6.setCellFormula("SUBTOTAL(2,A1:A5)*2 + 2"); - Cell a7 = sh.createRow(6).createCell(0); - a7.setCellFormula("SUBTOTAL(2,A1:A6)"); + Cell a6 = sh.createRow(6).createCell(1); + a6.setCellFormula("SUBTOTAL(2,B2:B6)*2 + 2"); + Cell a7 = sh.createRow(7).createCell(1); + a7.setCellFormula("SUBTOTAL(2,B2:B7)"); fe.evaluateAll(); @@ -168,20 +168,20 @@ public final class TestSubtotal extends TestCase { FormulaEvaluator fe = wb.getCreationHelper().createFormulaEvaluator(); Sheet sh = wb.createSheet(); - Cell a1 = sh.createRow(0).createCell(0); + Cell a1 = sh.createRow(1).createCell(1); a1.setCellValue(1); - Cell a2 = sh.createRow(1).createCell(0); + Cell a2 = sh.createRow(2).createCell(1); a2.setCellValue(3); - Cell a3 = sh.createRow(2).createCell(0); - a3.setCellFormula("SUBTOTAL(3,A1:A2)"); - Cell a4 = sh.createRow(3).createCell(0); + Cell a3 = sh.createRow(3).createCell(1); + a3.setCellFormula("SUBTOTAL(3,B2:B3)"); + Cell a4 = sh.createRow(4).createCell(1); a4.setCellValue("POI"); // A4 is string and not counted - Cell a5 = sh.createRow(4).createCell(0); // A5 is blank and not counted + Cell a5 = sh.createRow(5).createCell(1); // A5 is blank and not counted - Cell a6 = sh.createRow(5).createCell(0); - a6.setCellFormula("SUBTOTAL(3,A1:A5)*2 + 2"); - Cell a7 = sh.createRow(6).createCell(0); - a7.setCellFormula("SUBTOTAL(3,A1:A6)"); + Cell a6 = sh.createRow(6).createCell(1); + a6.setCellFormula("SUBTOTAL(3,B2:B6)*2 + 2"); + Cell a7 = sh.createRow(7).createCell(1); + a7.setCellFormula("SUBTOTAL(3,B2:B7)"); fe.evaluateAll(); @@ -197,20 +197,20 @@ public final class TestSubtotal extends TestCase { FormulaEvaluator fe = wb.getCreationHelper().createFormulaEvaluator(); Sheet sh = wb.createSheet(); - Cell a1 = sh.createRow(0).createCell(0); + Cell a1 = sh.createRow(1).createCell(1); a1.setCellValue(1); - Cell a2 = sh.createRow(1).createCell(0); + Cell a2 = sh.createRow(2).createCell(1); a2.setCellValue(3); - Cell a3 = sh.createRow(2).createCell(0); - a3.setCellFormula("SUBTOTAL(4,A1:A2)"); - Cell a4 = sh.createRow(3).createCell(0); + Cell a3 = sh.createRow(3).createCell(1); + a3.setCellFormula("SUBTOTAL(4,B2:B3)"); + Cell a4 = sh.createRow(4).createCell(1); a4.setCellValue(1); - Cell a5 = sh.createRow(4).createCell(0); + Cell a5 = sh.createRow(5).createCell(1); a5.setCellValue(7); - Cell a6 = sh.createRow(5).createCell(0); - a6.setCellFormula("SUBTOTAL(4,A1:A5)*2 + 2"); - Cell a7 = sh.createRow(6).createCell(0); - a7.setCellFormula("SUBTOTAL(4,A1:A6)"); + Cell a6 = sh.createRow(6).createCell(1); + a6.setCellFormula("SUBTOTAL(4,B2:B6)*2 + 2"); + Cell a7 = sh.createRow(7).createCell(1); + a7.setCellFormula("SUBTOTAL(4,B2:B7)"); fe.evaluateAll(); @@ -226,20 +226,20 @@ public final class TestSubtotal extends TestCase { FormulaEvaluator fe = wb.getCreationHelper().createFormulaEvaluator(); Sheet sh = wb.createSheet(); - Cell a1 = sh.createRow(0).createCell(0); + Cell a1 = sh.createRow(1).createCell(1); a1.setCellValue(1); - Cell a2 = sh.createRow(1).createCell(0); + Cell a2 = sh.createRow(2).createCell(1); a2.setCellValue(3); - Cell a3 = sh.createRow(2).createCell(0); - a3.setCellFormula("SUBTOTAL(5,A1:A2)"); - Cell a4 = sh.createRow(3).createCell(0); + Cell a3 = sh.createRow(3).createCell(1); + a3.setCellFormula("SUBTOTAL(5,B2:B3)"); + Cell a4 = sh.createRow(4).createCell(1); a4.setCellValue(1); - Cell a5 = sh.createRow(4).createCell(0); + Cell a5 = sh.createRow(5).createCell(1); a5.setCellValue(7); - Cell a6 = sh.createRow(5).createCell(0); - a6.setCellFormula("SUBTOTAL(5,A1:A5)*2 + 2"); - Cell a7 = sh.createRow(6).createCell(0); - a7.setCellFormula("SUBTOTAL(5,A1:A6)"); + Cell a6 = sh.createRow(6).createCell(1); + a6.setCellFormula("SUBTOTAL(5,B2:B6)*2 + 2"); + Cell a7 = sh.createRow(7).createCell(1); + a7.setCellFormula("SUBTOTAL(5,B2:B7)"); fe.evaluateAll(); @@ -255,20 +255,20 @@ public final class TestSubtotal extends TestCase { FormulaEvaluator fe = wb.getCreationHelper().createFormulaEvaluator(); Sheet sh = wb.createSheet(); - Cell a1 = sh.createRow(0).createCell(0); + Cell a1 = sh.createRow(1).createCell(1); a1.setCellValue(1); - Cell a2 = sh.createRow(1).createCell(0); + Cell a2 = sh.createRow(2).createCell(1); a2.setCellValue(3); - Cell a3 = sh.createRow(2).createCell(0); - a3.setCellFormula("SUBTOTAL(7,A1:A2)"); - Cell a4 = sh.createRow(3).createCell(0); + Cell a3 = sh.createRow(3).createCell(1); + a3.setCellFormula("SUBTOTAL(7,B2:B3)"); + Cell a4 = sh.createRow(4).createCell(1); a4.setCellValue(1); - Cell a5 = sh.createRow(4).createCell(0); + Cell a5 = sh.createRow(5).createCell(1); a5.setCellValue(7); - Cell a6 = sh.createRow(5).createCell(0); - a6.setCellFormula("SUBTOTAL(7,A1:A5)*2 + 2"); - Cell a7 = sh.createRow(6).createCell(0); - a7.setCellFormula("SUBTOTAL(7,A1:A6)"); + Cell a6 = sh.createRow(6).createCell(1); + a6.setCellFormula("SUBTOTAL(7,B2:B6)*2 + 2"); + Cell a7 = sh.createRow(7).createCell(1); + a7.setCellFormula("SUBTOTAL(7,B2:B7)"); fe.evaluateAll(); @@ -280,12 +280,12 @@ public final class TestSubtotal extends TestCase { public void test50209(){ Workbook wb = new HSSFWorkbook(); Sheet sh = wb.createSheet(); - Cell a1 = sh.createRow(0).createCell(0); + Cell a1 = sh.createRow(1).createCell(1); a1.setCellValue(1); - Cell a2 = sh.createRow(1).createCell(0); - a2.setCellFormula("SUBTOTAL(9,A1)"); - Cell a3 = sh.createRow(2).createCell(0); - a3.setCellFormula("SUBTOTAL(9,A1:A2)"); + Cell a2 = sh.createRow(2).createCell(1); + a2.setCellFormula("SUBTOTAL(9,B2)"); + Cell a3 = sh.createRow(3).createCell(1); + a3.setCellFormula("SUBTOTAL(9,B2:B3)"); FormulaEvaluator fe = wb.getCreationHelper().createFormulaEvaluator(); fe.evaluateAll(); @@ -306,26 +306,26 @@ public final class TestSubtotal extends TestCase { HSSFSheet sheet = workbook.getSheetAt(0); FormulaEvaluator evaluator = workbook.getCreationHelper().createFormulaEvaluator(); - assertEquals("A1", 10.0, sheet.getRow(0).getCell(0).getNumericCellValue()); - assertEquals("A2", 20.0, sheet.getRow(1).getCell(0).getNumericCellValue()); + assertEquals("B2", 10.0, sheet.getRow(1).getCell(1).getNumericCellValue()); + assertEquals("B3", 20.0, sheet.getRow(2).getCell(1).getNumericCellValue()); //Test simple subtotal over one area - Cell cellA3 = sheet.getRow(2).getCell(0); - confirmExpectedResult(evaluator, "A3", cellA3, 30.0); + Cell cellA3 = sheet.getRow(3).getCell(1); + confirmExpectedResult(evaluator, "B4", cellA3, 30.0); //Test existence of the second area - assertNotNull("B1 must not be null", sheet.getRow(0).getCell(1)); - assertEquals("B1", 7.0, sheet.getRow(0).getCell(1).getNumericCellValue()); + assertNotNull("C2 must not be null", sheet.getRow(1).getCell(2)); + assertEquals("C2", 7.0, sheet.getRow(1).getCell(2).getNumericCellValue()); - Cell cellC1 = sheet.getRow(0).getCell(2); - Cell cellC2 = sheet.getRow(1).getCell(2); - Cell cellC3 = sheet.getRow(2).getCell(2); + Cell cellC1 = sheet.getRow(1).getCell(3); + Cell cellC2 = sheet.getRow(2).getCell(3); + Cell cellC3 = sheet.getRow(3).getCell(3); //Test Functions SUM, COUNT and COUNTA calculation of SUBTOTAL //a) areas A and B are used //b) first 2 subtotals don't consider the value of nested subtotal in A3 - confirmExpectedResult(evaluator, "SUBTOTAL(SUM;A1:A7;B1:B7)", cellC1, 37.0); - confirmExpectedResult(evaluator, "SUBTOTAL(COUNT;A1:A7;B1:B7)", cellC2, 3.0); - confirmExpectedResult(evaluator, "SUBTOTAL(COUNTA;A1:A7;B1:B7)", cellC3, 5.0); + confirmExpectedResult(evaluator, "SUBTOTAL(SUM;B2:B8;C2:C8)", cellC1, 37.0); + confirmExpectedResult(evaluator, "SUBTOTAL(COUNT;B2:B8,C2:C8)", cellC2, 3.0); + confirmExpectedResult(evaluator, "SUBTOTAL(COUNTA;B2:B8,C2:C8)", cellC3, 5.0); } } diff --git a/test-data/spreadsheet/SubtotalsNested.xls b/test-data/spreadsheet/SubtotalsNested.xls index 91d7463dcfa7e1ee85e0066dca2ae7eba3c704e3..a19571d84918d4fcc844f42be9de72f5b1fda966 100644 GIT binary patch literal 23040 zcmeHP3v?XSdH!d$lGc)JOMX9KJ(eu_DS53G4%h+7;$a(PTUa(Pi^#IHYY9s$M-PHY zTm&?y36K=*#MI!lAql5>5D1SDC?tp^C21=H?Ma$LN_t2R;WSCxG=!Wq9K-he?%kQ4 znVlJl9NKe8xqI&H-2eXf`~Umj|K7QC@60^^T-8hWJhLUa!r5Pr*}SU zJYROKivO!YYtd|SIiwHEAvvJ*IHXIxh2tEF81!39hv^ih=#EP?XR&n1m<;0At?IrV zR!A$INEwxWoM%EnS3y3#%aMeLNr919NBkMxaYuIV@bFG8!*q1&Ji z6EN_(IE%_DP%AN}kcyVaajrT(p!l9t$8(YM%HpqP|9kfZO=p9H*Qjq9EsF1B>R7Fg zvv4%zYpTqT6lDWOs_%k7d&BK)Qot7*Ti_M_@Pq;R-^`86ix3zSOKz!gzLMFGenI&g zFlLft{S+LAG|Q7T3!*=UAx%?oh@3a2l-Lv)5sd#+)uk$ggY96T9jv;z+df_ z$Gj;ynx^C^n}WkYn^;=^a0~+Ed`#d^%%_gPPg(Na^x_4 zIi~jfD6ao(Q+614d$4R2S8xAZQyj93#v?JKKAX&%lE^-i_*&vyi3buJ#1w~}0(l&k z3gmIvDujpg7UiFzJURaf<;i(rC{M0Gh49$@Hk2pVb3=Fpy?d&9*&Z8;lk@u!9=nf+ z@E91=RPPAku}8H~p4`~z%M*_-!Yl+c(CT}uYu44&BsSxuvtFIXqi141idl?2a_60^qVPRB*zuI9>U7p7l z;V~XPBwv+ekkBqPf-b^lC={8`Cl~Yc0^NC*xEtkBT*rLs=ru=>SbsjZ_-0I_@;;=I zc(j!GpnMHh3{@hpePPY>D&)ER6>#TU;$!ldU=E*Xz|b^T9_Rgd=h{T=X5BgJ6SeW^ zLirosmV?DXXCfY*BTw)yUiDm1s?7^_RL7(9!vd)9gIVAGs$qx0NwC7>~}Br+JfMamS-E z`6g@GyB?WU@-3F=UEgVf0mmap;?YX^HkT!|%ANJf9A)yiT*6Q^8s`}rhgQ&9^DG`M zm+x?mqXt(B)^IVVFIc)@UcPorv1aq+@3_{H%T!VneU|(^*G7~rm`OwZ0}Zur>u@TS zxw><0&AJ4|whoM?uI6Bj6vwnlHKuvYym{Z1seyr^4_v)9l}QbE55%KMc~%;%%2^G| zrg1ao@a7 zo}omob6u7|9F`{{n58*pR<+_r_^e%PgGSswd|>7lI!odeCl=t z{m$|`%Pl(B@YVQW({+25S@iE?u}RLulDr;I-1G-=^Q7sx*lHZlc#cbgrrZ7fi!-U` zOsonhxwm6lC$XqRPb?%Imt+sW)(3(#9eOq_Y*;8!J)Ur{!9Bixc@}ZF=b-4{mv)hH zThDneI_C&lf9_4>_)RCjP50D``xuJfL+9Rx9~~o}g})!CxCPR3xkuv1&wUd`|3o^i z+wm`!vR;LL8|0t21o-pg0rW=$=t1~jRs7t$QT@?lhdPU%*I)53x9E@HgdwW?qk$Qd zs_%bkvSlCc5xvHha}U1u2Uzu#?GFmS7OYC2@5_Fi+IBWAx-Iw1il6&Rir@BsJx;E) z=pMNSZfX4V#A>lG9kV`5AD16;uPdh~=y^Zn{#TA}I{nb5d-TD=fW?n~n(vP_79I7{ z{-f))%A$L43|x@?>-DHF9i3Lowe6qOw28m51ke9qi^%lqZ((Oo4yECgG0}ImrDybiE?tehpFUxaBR9m?uTOY4=qp>ZX0{azPP=QD+heX8(u<l#zGJ{ z1Y}JCl5GwLIWQfN#-tm>TmK$_1lK=OsQMvWY6NGv1ZABDi$qa>W<2w&?`4DQzt077 zN=p1evfl{ z?Ub^G!_!Wb%8#r_xPfUN3k1WH0xksM6fzG|pq&OurJdRpf>cijWU?(B1dB-yO_1=b zjy=W)RA<+8K&5as1*~lP*XmG2Q!{X{3h|;go#b!W3e5G ztdR~zG@hM_&F&z6wuphfg3@Rz{VzZJb+(x29M&-VsKxamLYWK0WH$Q9tPYW>{ZYv* zPNiS{@r(X47lp}8`pB#ck*V8T$t+2wfAQ-d`^#J$CbP*$=9& zf0;|dWS-?Cvmrz#c9blcF|_A@{>ESC(lD7DePlL<$lREhIU|*R~mxzGHf+s_!iKQdQrn2GwW^>!qr`v(8IZeW%__Reh%cRAb{?=sPCr9n7EaJB`UtKKw&n zZ(ei|?CZ|@FqwXRXGMriXWwZ|zHsL!{beS?Wcu};RUtB+eWx+`&40ejU*?7|nSOm| zU5HF)-)T%fbkBGEWj2P%^y@o`5Sh-t)0jN|Z0`E%ZO>$wOuxR<6e82vcN&wgPu%WT z&k79RnC;uMwF*3RVW-hwD&V4a8a<^#-jh$Gk5u4kT{|DWqe9Nfr_nDe@Ms_N$3_lz zA4naK%*Ns%cI8@A!>OLW%vk0iS>8*Q3;Qz`%eiE^aQI;AK&F4h#2j)qo|JNupxAso z*;GlcLjx}lr!u{%VRKLFy3ylUZEnFOUbc?me1UA?dp+CRyIR}3wx&k92S-Q71_z-> zg|t%W&eYf_o>Dm;DUt6|co|#;zEdjGL6?3I#xKh;V zGJ^Lfx)UEw98BDlxF&G{YUi<;aRzj9^H}~*vD`wTPCP$_eU{ucIVzWr7iW*fOm_u~ zi^2SliPO0oQ5x|$_Jyt(kAZiEn>P}J;OAg;^8W%it`Be}3;Z+WN*LMrN#du__I;j0 zW!Z=@hijIW-MHXwnTd2&tIZj97MvR4HYiC)AOZ0gQ>6B$5ow6*XQ^zCac&Hk8u<2Vb-t%XvW7tP^b&p7S zwn%iI)j5>os2UwV0N`J>qlQB(@vN zwaS622Y1@t2Q}OL`H6o8Gf@vXQ8~1GQRg^N^{^g*s^`oRh1%mp<)F?*AY~tQFpB0n zP&uF%4rEy5nSn>>;cL&Fh~085w$+2M7{10F?#?KUoC`$sFUxw`zpRw*3n}8he(Bx2 z3w?M#aG4Y2!yNlmU$A_bguD;yl;y)ZW%;m9(TCIY;rnixmG<-Dv*5!z&$0`Bm>s|# z@D7fb!ZVk+O;TJ6)tB7<`P*n?4t0IwQE;vDa7FQAKDqpScLrV;gk@5`mYD~5<~S{r z#fG%iySZ!avW)Jt)<~pNmSuFxvW!kqXBn5mn&EA}h%CP5M8>MwHRChD)!?pKWJb0^ z`aZJhNGx+hB9rhR&JVGELpS-2f=eKTInGg#&ktDj<3k3jejkrrAs=_R^X*Wp3co$z zIDlp1lyu-hk0a`Ahk6mDU%jGx4xTjYmuvCL?x=&K4YY&O2igWq{Ey+K*|S+qdF7QX z_ggV^=>uO6Rur6!laxD*qi;BQ<`o;)chlWAPJCuI`+Y5cOFOB(4(0>aGv z@l@d{1cjjlf`{cMQ9hdm7Sh?1lk)Jx52O5~B-2?*;vXad3-S=tfKQ*46DLjx7$kWT z1dJF-#FHw5mOP1=l+MaoykStnRrO@Q!TseAWA^-)Eu_a}4{lyC*WPefY?0jMu(s~! zdQuse)r?mZal(+w;A+aEAyZwf<7+d!#(&e0d7gGu;uV@|3KH4 zfq_dp_G~inf)ii1rSD&y05M=^q_PjdX43+OT?|Y^G_bcCkKXx!*|T{6)C& zLs-T~D{~R}Y0DK8cNJZpvUBKKkEeWCF&3C&*P+oNmq&d-@hue-w+8froGDAt z&M!!r!MF&o%6YO&U2af^a#HE2S4Zmbs7IfJkn^+=LlimqiXo@rdED5J>c~|9i0>FX zFgi5aJz$=*$(d?&rIMSnSXYQiaf|*YNKb5m^fr~zfMr;`Z_^*WFE7Xp;+a;+eAKoF~3Yg*RH^^7jNwFyb4Etr6eY& zzwqmS+Hs)0xl7U4sN-67yh$C$xo(jQwY-F(Puz%{r;G6puzU=kBx$RwzGygeXzS2u z-}XJ{o2`e;);;SwM!Pe;-NU`r+k1vG?cKvY=GMUj+v?5_C?kzs&#Cn zKa(06G52QrN9%Tn7F5zUnROS;mo7}t-LWr^DD|+=d01dR#FZu{f3hpNR$Ot7I$RgGDf+k>VHS`Dn+lBoe_BaCenA#d^`G zv(>BO29DeX+k%C-w=d8Y8Tilos}ufvLi_IRm+_wQ?GAhj1P;5BKmOkMnexBd+|6{|xGHdPbX7F5`aF(oEPaWQ5XEawY6qSC}4EFZAb z5pX*5i!de~s~A*c63gSAAz86BW2cKTXBjL%Y?m*A`wo`B-%gi8?qKss6gYeuKdm(Cl0(NU_F^;75V>e z_~W&}n;7{@)WQuK+Y#s&FMas0Uj6;9zREA%5tFqmAAW%|-j5*CKbX%&F8WLhB7J2K zVg+I!A~txj9HzeuIgWq&*yqqg_>LQStdGgz)R)%6jMqN>)azxF2G7T@`&}i!9hmFW z%vB*w|Hu!X{lTe*rIp9;g#PP(e?Rqq1d+N@|80nT7`+{lx87GERwC|4oQueM@Lu*X zBI|Pel{r`fOZu@qh>yG#fhl ZQmN5~v*opO9@0}R|N6g6edk)>e*gunQu_b^ delta 2745 zcma)8YfPKh8GgPCzJP;`jlmGd`2c5IAcQXoWogO97)Y8dO-V{dmeLZyUxF3eWFMv~ zNUi;&s#Ix{s=WQNshzeT-PU%OCUbXfyHPEZ_9M}>ADfhE)3ho5T}|p#sU@NBd$=X8 z)a_X3eCIspy*}sW@>^Q@CGADq>cCnF0e4qcR%EpPZRdWa?etY`zu(8xo*KLvyXn1^ z;;sh#3p%cv?{N$Ko9j3(BLIBOxj5@uUzuIZ%|4Z*0nZqXc>MG&Ppei>70>e;DDK_1 z-d3LSKCZ{uf>#^FB=VSoi!Ar{Ab}a0^hapfpYbNleW*e6m0*k}g7stv1I9sk=x%*V z^U~p9+VG*B27(ESu|z%?HolHd`ctrI?8H9$Gh&{?Ak z{cG4v@>Ljsz1vQh5qux@oKTm&qyO>KPUea6ZhJ?VDtG5iRTO-udb-Rnlh-jC_Y zaIEx`RkeJ6+*()|xAOUfxdlIkPi(D%2{V8<;Z?wR_rgNL^x>+clIdaL23!*hnI6&2 zb1MQN{0w#L!E$aAXDupB@oECXz+1wAP49;r#(oYDN2$_Hm@W7P8Wm6Wgmq7*_PCWW z8}Um7Hzt*3h1cU(@B@lVAx&ucH9ZnZ8oz->--)!>$O^wrFGuP^H94PErXwq|W7&Bmj2yX9$m zE*_)tR-5zUmsoC>lIv7*nXNWu67NvC>vJF$Lt}19h+lLFn}*?j@e59Uxc@`ZcsV+k`kDo zyEr-JkRHTN)B`l*~8xexl8AMYmGWj7fJW=Rl@EA)M-%p;0XQ}? zksg^i>dZ~%i*xh&JO>&;uXsP{%op9s9O<>Z8TnM4oGoS-MZd3H!}?qBWjTS5P0!>w zA7vP2FL)-5{dB%BT6$1e|NE5V&P~s_*$YKWZJ~#%QMG#g)hII@#(`>7t>(dMl*x|b zkfi=q$GucozI>tRSm%bET#mCbaky-9R3=hoFMlH#kW)Q2=@#y#D2lWgI44ThG6#Lx zUB2KHDvu55TJzNwzS=q4QC>)%-}4Qa%;+9^CH?LGt*`)%ZxZlxAjNYKxP@BHU=m}z z->v(ny*#~IR_N`)9-15+Gjw>lf4~G*mgtkgBdSvw9!hKUhhbYkpQVq6haVl~DEJz~ zv@gna-3kz0>+(VYtB+LZzDKG~=gVrX@GXXeZNQO^${&wRdrN2d>8iyu$}nG_b%RPy z#ybD51cubpCS!wt$*sd1W0Oh9*B#xEui;ISuX}i7?BV?Lbw|_~I#bR?ybFzT@*rhb4q}A_m=*H*x(pBg}nIs}# z37tni9tvxN^ukDY-2jg~oC|YAe;FC57eS#$mL8zaQ*CP72^Dm0G-A|fI(={|O7YRg z>}3YUlJH`470LZvWyg+i<-36Y9YG#@%y5-_Z}Ub^@K-j+nVg%Qp0UQ9!lILdgA`-< z@O!`exb}u7{qps{mJcUyXhx;s#D`kNI`RJhXlUe^O-rNZT9i%nkI{)b@hG`0*ZS$v zGc9!f%+8qXivf4a$rk6Pa<_{`$5kTQ|K;fTP3_8QANlkHru<{1hxPbsXGV|v1-ZlZ z?zK~M+7)w9(`d-Fn%JKzBma%R_WR>EwAH_wv}hiu>oqpnrm6p@gFZGFJ!<=gXt8E7 L&?+kG%mAMP5i3GV