From b280c02d584ad403417db0e8840f8ae6de245883 Mon Sep 17 00:00:00 2001 From: Miklos Vajna Date: Mon, 11 Nov 2019 14:08:14 +0100 Subject: [PATCH] Related: tdf#117658 PPTX import: ignore math text outside This way a pretty-printed bug document doesn't assert on import with: soffice.bin: /home/vmiklos/git/libreoffice/master/oox/source/mathml/importutils.cxx:335: void oox::formulaimport::XmlStreamBuilder::appendCharacters(const rtl::OUString&): Assertion `!tags.empty()' failed. Change-Id: Icf8b11f3c56076b1ad2dddad196260ee87540020 Reviewed-on: https://gerrit.libreoffice.org/82437 Reviewed-by: Miklos Vajna Tested-by: Jenkins --- oox/CppunitTest_oox_mathml.mk | 44 ++++++++++++++++ oox/Module_oox.mk | 1 + oox/qa/unit/data/import-characters.pptx | Bin 0 -> 33620 bytes oox/qa/unit/mathml.cxx | 65 ++++++++++++++++++++++++ oox/source/mathml/import.cxx | 22 ++++---- 5 files changed, 122 insertions(+), 10 deletions(-) create mode 100644 oox/CppunitTest_oox_mathml.mk create mode 100644 oox/qa/unit/data/import-characters.pptx create mode 100644 oox/qa/unit/mathml.cxx diff --git a/oox/CppunitTest_oox_mathml.mk b/oox/CppunitTest_oox_mathml.mk new file mode 100644 index 000000000000..e358a9666fc3 --- /dev/null +++ b/oox/CppunitTest_oox_mathml.mk @@ -0,0 +1,44 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +#************************************************************************* +# +# This file is part of the LibreOffice project. +# +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. +# +#************************************************************************* + +$(eval $(call gb_CppunitTest_CppunitTest,oox_mathml)) + +$(eval $(call gb_CppunitTest_use_externals,oox_mathml,\ + boost_headers \ +)) + +$(eval $(call gb_CppunitTest_add_exception_objects,oox_mathml, \ + oox/qa/unit/mathml \ +)) + +$(eval $(call gb_CppunitTest_use_libraries,oox_mathml, \ + comphelper \ + cppu \ + oox \ + sal \ + test \ + unotest \ +)) + +$(eval $(call gb_CppunitTest_use_sdk_api,oox_mathml)) + +$(eval $(call gb_CppunitTest_use_ure,oox_mathml)) +$(eval $(call gb_CppunitTest_use_vcl,oox_mathml)) + +$(eval $(call gb_CppunitTest_use_rdb,oox_mathml,services)) + +$(eval $(call gb_CppunitTest_use_custom_headers,oox_mathml,\ + officecfg/registry \ +)) + +$(eval $(call gb_CppunitTest_use_configuration,oox_mathml)) + +# vim: set noet sw=4 ts=4: diff --git a/oox/Module_oox.mk b/oox/Module_oox.mk index 1f906231e981..636f9f6ece99 100644 --- a/oox/Module_oox.mk +++ b/oox/Module_oox.mk @@ -25,6 +25,7 @@ $(eval $(call gb_Module_add_check_targets,oox,\ CppunitTest_oox_vba_compression \ CppunitTest_oox_vba_encryption \ CppunitTest_oox_crypto \ + CppunitTest_oox_mathml \ )) # vim: set noet sw=4 ts=4: diff --git a/oox/qa/unit/data/import-characters.pptx b/oox/qa/unit/data/import-characters.pptx new file mode 100644 index 0000000000000000000000000000000000000000..29338023641caaef938279a79aec541837508efb GIT binary patch literal 33620 zcmeFYV|1lmmoZl=w!0003850N^_S5?E8v#@f-y+EGWz z&DO|4i`Lc35?U(Pt_DqZX3wBu|N zme}OH`$W{r4XI-edWtz#jtU#khzdsEaCws!FXig-5QWr&FG6<{#%QF=o|%Qm=4^9H#hldLXG$ zn8S|id_^*CVRE1M(lWU;pW?*@XWOp<>Ou1rtwt1?zJgGvDH=&vi&4n3T{geJF%yhk zLlKi~a(!-1`+xxepPwKAxqn9ircaK!U|$rl^M!DjFAC7HH?nk~qy6jqf1&?B81Mh^ z(<|cEBtYoDpbxf1Fz&^=MoBnpX(M!$Is5`JU}(eIz!oc-?d-_i*3+Z$@5q?r)w!8+ zuXo9JEl#kyf=*I~^KXYAe9`W4c&+&j7K_o*L+`3!n**DEaHIb&L}ZUK8W5?DjFOE4 zJAN%QS^;67QjR#1EP)m$NUL{ZB=jE4J)*3&HGHQCk``99j0t9DQN`B~qQ>$ms>z|x zG)(R!)(~16L(;TQlQ%H`o$3caZ;~UAvr-V|9@q3qJ0I8CdblX(WRB-T*^=114c}N7 zNKjRM+C{)7`wf?Ye}=Os8R0}>1!!oD-Rjsd1^a>!zxq6b-b7iZT<6CApT#} zcm|YYt$dy7{6Y@?*Jx|&NatW_W@zL<_b&kY`+)wh1@vzyRm4n~f3auaWl(3pvIhxg zh=Ro4PYHq;MR7dc*u}cg`v4WF`!&@Wbr-$*pNThdY}A^ix2(rQ`DFwb-|^JZ)M2oVZe1#srqdZrJxnk zsKpFvFdPbPRURrv6TW(V$fD)B*yr&5ZX-0$HqMx$Hb*q67CCB{LgaWF&LH}BO3Y%V z!0ORm-gFL*ITuSupY`BVo3l{Kj+N;QRM`s>cXgFdb5d3+cz^xy|2HgHw9F9Szs^j9 z004LZNT9#M@-OkQwKsD35*B)nW;WLUH!5EQ1N5aWzHa!R{i%rWk?8+xZS}uIJg}at zY7Mn)Mf>)EA6kWgxMqeW6(18;?&V>iYT=@OQkWe0iST@Az@T2qt2yC(B(6?`FR7qw z3av@02;;i4sk08q$CsvPWG2rM^mp?1ZgLl(5o{NVwC~sdMF1oXd6DEmiD^kfvX~o2 zmUv$YEB}(lsop+<`AjICydKSn&pT|GuHd_sklfvr8J_q#)udbq-CjT75l)&x-jgZn zezzzOo7g#suUiu*2K~m=uP*~RTh`C(tBrKoYza-6jWK$LizzppRt1PNou5 zjhQW2yqf|i%fwLp;=oNMma#oU6l62<>QslJ>cDV@?2Rpbs{793kN4L12J_F}E7?!Y zTj{R_D&tG1BL5$_{l_=zEa^|w>JQkVF4XSFj;}~Sk z5J|2?bSJAymgjD6i-pr0kx-!F(tdKseWMJ>z-hE*+)^F*W+8_l9qvE*5Lv-Lr-1vW z&`TFr-GV1mT&p8Ul5(4jcWv|VTGo9jZC6I&Nk$mE#x-ASz93!s9=dvk>Qh{>9kDi7 zF3@2fs3H_XbG-U1nU~KjVQOFFxDBV8(g77*9;vXNjnJ8ak<$?ChfmAZ=PplzJ1u9d z8`l-Q$7SyM!v+;Cy9aEZDM#Tf%2LL_F;^pumsP25SxhKl>v)7fdYDMQy|oW@~?@OHRN0puSKWXvvJ0?V0tFy6=?S63k>)+HhuE0q@r9#lG%;PVy=a2j1m2|P) ziWx&xuRUrCwH6#Kg6h$9j6HVga= zh!Kkz3yq+;ePd8|qV5^vkm8Q-px@c~E|-ZMNrt4UhbRQsAYS6a3KyE&wyGMlWhYU& zL>-ExNe2K!uT~K$ISdp1eSoemtY&v~3`rpgdx~WMU22a>u?Jb1%?)yop5BY0Z}DQ8 zH!=o?QAUbaX^L-0*nEbX>pX&d*$9#E4Ht)LbK5tv)b8@z7mCAu!#H_og5wBAJs89Z zdwl|1#)$-qnR&(O1Y>aBw_^#hVh>1u`#Tod4V_Qj`Ap*q*E<+}@4|)3)|q_`yMu{0 zk$h?}OnRh15KT5{8Wo80Q~l0bdn7A6fCvI}azR&$X{Yv;WcPOs*dOzD$KLt6=`_@N z13Vk%e8n~{MAOIn@DcGPn2BQtxk=&jMyLJal|Q-iH89z0UzKi@H^v_PBnHl%3R%!A z?7t)L)ld)P?C~bRB!HT^89?}*0Y7L#2?j{SjxsEybqDIrhc~Df5zDM@{N63Sz{Vcx zAjWT3Xwb%zf`?vgv#b6dA}^w;DPU$$ow7Ilj-fkIGQf;y__4Z-so}=Nhisp*@75g* z)ncnuG`4-jO${^=oz@*rxh>Npw&qFfuq4)462XzJZmSYq(GAt@U|@63V4^owhR7!K z!Y{3x__)tpJBO7wQpWx4U_-i`u`|uTAk6#(7mk2@{gDA6K)y=poV73Nts*ylg8O-V zfoHUfV>!_qUzIz~Zs!mfw)mO)$ND>Mj20ye0rKY7w?B^@ zM8ignk#YX0mu-6SkLSnHms>oXH)o3(dBFwRrgZ@(MjU2B8BA`sZSyDXE8CZHjlFL0 zTEeTGy%!mJ$d=?i?`| zp?pPtM!1DHHf&rM1d$Fs3v{ww6?;3+c@8`m1kK$(nYf7Hj$8S|8%1G!0Ujkrx<{SF zY?_nORmBm}qQvnxHtKz{oA0d->!*(HqURUisvuoMoidj>zCS8?Yp_kEo?7H>PO2_| z{~`cSc_Qkn%Gi8&GPgQuu}9|x`uB;=!c5$C=NI-^zvKn=|5-EsMyr&bn~js>zY}Wz zGR6FVg-Kv^4|MMjM4?OnPs9i7S$D+PB5k3oZQ(nRB*QiEHDbg3qpfrUu%6wsA2!Zu z?-rN?@knjk%=2}?{F|Vsp4ESxxvQG++47s&z-2Kv`)h2H!w&?A4v=eOF z8xUsuD3Rl47BbowDb=L7k75>NY`M{zt8YRqu$)*}zy4EA_WwT)Z2udFzh4pd|Mqd9 z`7hyu{>Oj&K>XJTg7v>;9L(}`2ynlsV+i6u5T&%9gQJoCzaz?jnfkZ9wtr#6ybm84 z;_9_$lYjDEKd$K*g1G}Dptnlo5r8Diqn4NFOl`wU0gFT)CD5Jj`|I%SiR!@h1;hO& za?n|VVK@#Ma#SKrh6R>~&W4T?f6l)lFs|bvF4pVN@Jg#0>ce3}fD`M5N%m5sZ;afAp8Gv7I1HQBzpzDrriZ&*?6Ar8;I^rNQhX z!3s~27?PL z8{;!jw9WuA#hYI&j|PYDb+(ESjnJ$p#_a?KCbAlb6MKi*w8D#ZCzzMdA_U#0tFY0T zjS7Uf?M*-9F`LnT#(-y4{;sI?@4DG6C;ot4X1*2Jl5NMF8$4bbQ(U}V_?2WhIVLTQ zx!@<(TLb*L#*9)a{Jl5_N?gO2zC63N-~l)fOn*L(Qlv<_ah-j5d5ne&Dg#PRj#e!Q z^JiZqg06(*cucKmH@Ze#CWCRMnuNfezwv81GK?MB#7X*jrclGIDfh44djxmJ+h!of zr$0ExLhGkg)V&yNexn!0&#uisw{UA|mQ+P6xZ8kSuWBfc z=vqUwLcXus!iz!S_MR^4cK<%uFGgj?243WHv`b>u3@-~W!U&&Z3+-FB)Q{DThu1JPXWd=U zW_K{j-nMazBDdsrQEu6wGt* zauPTBlSD4_hRESV*mP!!i2Uzm8aPe5;Yu(H_67=(roc>qO@TMio4xe@@limPlFUK* zHdg5(87E!`a#mGTo**x`MVN3?|AAU8S)vi7o0X9=bn7S@8#KKpyO(t8rhaR|Ma98T z^!e<3y%kbZY3k&Cdt~MI)7;?_ULQI7pzxnIVMI`CCRr~R4#}bmE`)sYXi>Kl*)9$* zh-!Q#VGD)n*GS@KEHAOFMYw?O09i=kx0LGb0Bvt=b$u$yo|cQ>yiHv364fZig@(oB zmsr$#5LA<0j_t{z4%#9}W5fP4zjD&0->-eq90WR((9kJ?UdWk?J~P;D;!R^F1Af>; z{9$q=@=0pVH)V1uZt-EJnJp*8<36w|C$i~oQ=GehZRYiP{y48@+$&?RI7fsE>2-n$ z>HJZ@A)-Luy<(XV=*Hn-!mq>!6cv2YAg13O3L)oP@0f;A)#<-W7+R-*#CZLoav#sS z?#V*4)R54=PvsT{Uoj5D*~o5})I+g0>*cu+N8dRmg=xwjHlI~jq z4SW&W=Uj&8d#EaeHqg28By{ot7HVqr6BNMy)4aOlkO!v1E~{y!&LkAfSZU`vby`i$ zvlpG4n-cvJ0gL&r{GWNO^*&fX0`Pj`&t2f5Oxh$C=U_5`s7zU}@!dRb1EtwO$PkZF zNBSt$x3FtSPRBqN{Wt+!zj={wHl4q{W6PZN9*c!t=5q=(zv0Q(?pIe#ZU=9V;YzMx51$bd+ zL6O1w+(4piUt}*v=g1+Gm35dLhA05bBbhs*QAv|9%=GgH48!P(3fjAittK?9?Q~`1 zr$5<(lLgF83O=pKKUok$L=B5F2U)X|I?}j8RrMF+FUjo_5MVIztDfV|lORWqjXR*T zG60h!V--ibggk{f5_IlA3U&R!D;l=qn9uig%+TEV^Czl-pF1BkDFO1xLZ&$Z56Fh` z2KH$oZDe-_0w-VeRyj0s{xm;RHVbB|EZ``Ilk7aO->Dba;-v(LngD-5hSOV8O9F1< z6RHY&oJ#dY1-N1uox(kKRmoNwJ@eBuOX#pK5AvPx7a^~DK`w84wDAXFbUZO$)Gbqn z*R}fy6@k)(xkgP}WC1IdLn=0zhCFgN8GQb=V23|~@vGS!gQFQm;E&#?e1;VTcQbuT znzr$`wjLxI+mUA+y_X>5%%s>@1H%z@@tOM~@6W*GKNQGV!L+_SVv!5k-FUs8560VAjG`fmeu2>hZe89I2_D zD1<%EQDM$(8nf$lW*HLiH4zZHcvmO(ru4LO8sdDFSN`>PE`#Ejh@V%&r(J z>)PA#(($anQ!zz~)G`?4Q9duP-wb-XJnSMAJFSPF#aWdnGU(=8>a(yUODtULP8UdO z*Blg-xrKEKlfV>RQC>o%8fNRZA%ZM5z4Q0n%$^;L862pF3uoQjQfi^JD^-3Q0aNVW zqP}fCu3Q*WD<`qh6`Ase6t}W)UAwwNn`D@q2HD4yj&cLvnrj)3h(j?=xlKT2HN{VE zZ7#JTIb^E(`AL21=0$X0P<|iDbQ2Nb7(c?RVbne?^sk&8GOp#sNE!TXLcHy(8Djbf~q5!Wn}CuSX|@^ zo<>ngEh4c;;Ie}>knr~M55$%g<$BzMHK^os9g-M$9|>73jaNo?A*lYA&??_thiw)K zBx~I}U}w7Lw0_gkRL6TWhClbzm~-<1wXQs_6g|37%V3ow}RBAit4fqa~w#j zuB2sKy2PG(91Op~z4fSx0Hy_LPA8ldKctCvSrZAsvJw>3hE*-(rW^icHPLZM#z~`< zR=ipGBoa6Wup!#*)TPaA|K3~=~dwkYizDVS}P zc|Ls3_I!}`Tr7o{EnIEjl|T27u3D_19X8+S{LZexAzVRhTs>Pmif|zfLs-{$Nos}; z*DQ8OVsJK(0M)$Eo5r2rhMmcHN(k>#Wshn{&f#6o7jG>997m2&(_AG$Sq_sP@9aL4 z$Ue4{r-Jt$Q_oVl4g9qYhWazvkLR@_K{Z9;xCd!1O;U3U!aAjQPH8;Kuk~tOrrKyF z%cTz=j8_@D3B*l_Y*7Yohq+eLMIZef*)3VDSi<$wS)MFy3`_y#lyt6fTh+u}+7$6h z&QfgHCceB&&UxI|-F$O8O>da@dg5ijMmzg}$34P;EprXAQnys4^n-ZVKIJ3dv$xx+ ziM*$Vv5k;ft5gOyh_oGNK0Evez|f1b3q;U5$#HZPnmbuxr*M|)gD?6UxjZm6V$m`+ z<5Rup#e2gIQO}*$Vh%~Baj2H6bv|B>Pm{ZJ_{v-LFX+0Ly=k%5xy-%jv_`O@*fK>r zIbn(y=dY27b&=KL`|;FAOhZ94g5y`Nb{Kt^qR@)tPS>8R)gKc9kz4C$;arKziZt`$ z8Ylq|-+OYZcMz~&u9M?}-_V8PrRHo%;H)<`llPU8o!$Xpg@w)k(oJO>!hYHok8Io{@D%iB3Uu2Q zaOibH6I>JR7(9~$ZB`R|z!4&(t_KMcjbVr43bUAFjGJG&3FYU!T2H>~mAzjVzHB@U`c>TaL3v{MH+}21lKtcJ zoxM&7ek0HtgS26fIt0IW*R;~!6ng9p3OxuIf3a5dB+5{&xspJQ$Kbcgj2sl&t9bk% z)vwl~z&>1~hWs;tYu_E!_T{Jqb`;O7lP8$_Age$k1O#3OYA5AGUO-$%Lo?CZ8db$n z{UA%AZ-oZ)la6~V)$*hc|1CWgHlq5*nXw|)%JhzXf;Te$vqsA&N3{Q~UDC5PDySb; zrT&%{H5rUcVz7KdRI%9^T_<}$=zdIDnR%Kr0v5jw%Zsb;XcuC*7XvaV?wbH_3eP=N zf6j)iW>PJUI8+^5E&bC6>&yWWvV$#o2 zTwn7MXvar4SfHEW@&cgD`5UjE==6Hm$+b0Aq1$n2ClObxr-zc&`#L42Zbl;G-FOG{ z@O^Hqn4)@nL!CZVYk-{~^7F1R)TF!6l0H%?&+c<+h?{`#DWSQaiuLoou={A^|I`B=Jz=~3T(dV>t8@BQjS&vHeATYtf+iZZa>{{JD>M3*U?_c^fc=4tWEDY+6jvcAi^=l1 zV^ytJaty&-t}@OCj=Ikl9@n6 z)zYc3o>q70sPiz^$jgt&!Z$2y+j;RdscqoJ+KfT?uIeb{HXcylO`~kak8$|5D^7$d zs5?*wiYLuMm%|Po4^Uhz@?ot+?$2jWI<(148{zWaJAf+kHFBVKp1_%J%21qO>ASlfu z*f8banu2o%aKZ|pKfJv$O8V)Ub-JHC-pTSSHM^gL`40!zFs|duqC+7eAw+2IFuCyo-GNEX8X~Eat-Ut z)wBl8$<+U>1B>yE&-A69qME!1!L_p-Eo>~phW`bZ1>3E=P~uG*){a*4!X>0Pv6+Rt zJ$n@L#~0zgdwPo>E+3TJAQMj;lzkh{*;SNy-ptwC_1m5=>-rxrsJ>f}2y%$-8Qkr8 zStpGQJY6AnK$MHG7jMuw_ZXr`0?4)@f-MrbNt#2bJs{%(K(xvz&GB^&?m19YzEJl2 zAzELk0^Y(wr|2Eo?~6a3Z(Y`J)9X)+WhwXFW<5#%$#M>$#lN2=!GtIAzP%z)G9b3&1$ z4z>WHl`pBcp`Af%z57GVq#q%(8}C)-NLs-JIm&p_^<*RB_Kq|=%GqvB?{OK>YS4GT zw$$bQ{BVEyy}yh$TY3okeAfzsTdW*wB(VY?h%8?IOm;4ekw6a~icKQJ4p&qL_pkq> zBNv=?C*Ue6P@N$4qQHkLBnp?*=cxCzEGF+ejFWum>iL>mGfH-5y2*^+$@>adFAX)fj=5{3hwF$C_ z)60KKZ$ZUb$$#yHS)=<8s^(uSpMNKS|4{Qh)6lZs6+!YwsByvn9qlKw!%Gr@Ep|hW z(VdE3>)?yJQit9wRlnE#JrUwi8>4 z@I6-fmn4kq-hwaOd62?>&RS(0m`>e^mi!I&!$Htb2C(LvymW~N3|BhgrStpVi#Vee ztE}W#E}ij1_1@@k!^XXqSt(*PDZjS`LaOpK%@%}ag&XMQ={YPyoSx@6#@LOAbp1*1l9ePJ?!e6@=GH(l`M&N zaUQKqiESuqD=HJoX*z}+I6;wS_87B4tZ1G2jOA^2+GO%?B}2eaKm%BBfg#JjI#g6M z;Un(M>TeA}Eb5-i0vnY&08tC=U&XUztsdCTJd=)HX*{vo}akfHSs9Fictt6XVjIlT+q@aJWyZY}#U16+-#Su%w zZ?b5V>Stku-BDfd=P8(+h}bf~0HWdeDzAWmp@QM3ZYSwXwyz|azh&_A{U9xfA|;fh zrBPPnnn*Bu%hL6|0#M6K{&EzicFW3Q81e2LSSbm0R6GTZnG0@M%V;0Wm`++-+#}?R zZX{KTvHJN+FS74@pW_$nZc)8fL&<9!;C;mHQ!Y^N8bjbWq`vcuIxgx{tWV%PR!bQx z7)(UOxSaPyRiWS2mnQqVU|3P|ii-9@SC-`g@NgI|bupD0@ds$VctE0TV6*pi74tFJ zAZ?=AK7`3$F8RSCna9|ikv~QN_jI<@pZtMSNR9Mhun|f`;(Lk|ZVH_Moo|JsD%o#RprzoJ(Hk)Wvfp(X2PMt`xyoKCzD`eWXoYPeBu6>fDEWxGB5$)|Ax? zY&%}pg-Q7(&8aDFc#C*Ft9X;`oAs9ljY(^DQsIsv4N}MWZufM%xIet)wjuo68#Wo$ z-1es`+s~=S-&+K?!lMa-9l2cgoZmLtF7Dnx>`a)Bz0jq15$42wa9XGu+OaD@h%R`5 zUQd&K-fzFY@bEPhT@+X^XrK&UpuSy^mye>`cy{6vg=8OBmCF`Aslg zWBdoNO?SMWzJt=?_{50G-KlM6+U^df!Q24`!H9M*Ay>_pG^eT80Zea9Q1^zE;P+{1 zp&g2MC*TznlAk&U)kdLmVqhNQ`&+(RPI{Zedv8el=rPv^ciU3fTWVrj4~+)d*+OGZ z;i3Rci`i4UvNay{Zf-j5ts@?lX=yqw^y|3nFqox1KNXG}H0L~+<%PGwS5Q!LE*37* z<|b03!O;D2x)-tb@W7s55T?LAXTAv8#PYmvH0kTHJ%Wa|K=p1G)EzkXH|K2lcw z3PwT=lL>!&B5t;=b6hlu8t(QlgZ}k(;1OVB!XM>aTKiD27URR!QiE)(eYMK=X(_YTavVPi>)>^a8fZ&Z9Am=r4^ZdhE}FNZEuZ4$o?=W z6m5+?sheVDnpomNSZya4(v`hZ-;0P{l-dn%3{5>c*MP{c}(UHKAQo;MDgWEKvbwkr2oPU`Ki!T;` zO3K5FyXm)r3^rH%3^rTPMC~EaJUAkiLDlryEo$s{0WXY@BSrfjD{Ajf5LB$*l-Zp4 zDv&WyTAP^V?vNY6W09q$?l`&|PSlShzIWJ*s=^pYKx}+dNAeP*Azz`5*1B}Xlj#O9z%aUMINTY zdrz*{3*@x(`AM7k9Vj3F>nXpMbdMRl^3gqo<*x?Z|9b98bN8>^nBX*{;ew(g-Ubjly&OSaI&|xoeGNX5$)}74VC6b@7!xlMYYXM}@~G z9*=6Wt($lC`Fgj6Zv&HxQasveKvp(!8OxESNgnk%IGIq&k~XNI6c(bah|lgyFUI_w zl(r>DrtsHAIXKET=t4I9X~9p@g)6kQf5tZM(e$2-oZj=_@;|@YqyAr0d(|RtasRuJ9W&qdPcR2p9umH8*%teRj8a+&2@3Rr8DAi$R<~V zdn-iJmR7wo+~T;M^;Z=*x|@;{5kU`cui3YruWMy_D=2>@1%}5hm?XLEXoSvVjE%iq zjK6S6o(~HM>~IVvEbNVIeAn}0`@Bz{BSmHE>bGc$fi#>a95h+{IZEn`9XlZ&Gyr8G z26qWPNJagJuFJtb>XP4C7-!2#u(;RA%IWr*;8tBe0VB1>Qa)CrNq{X^&HqDRo26IG z0zP)pmXI$Z>s^VY#kyO=ZK}%Vvms{ink2$?kv%0#+APZaXHWN8R&L+|QvZ=^UaFk{ za*6iGWV)F{-+e^+KAfmg6|o~DO|i#J&)pWL?$x%XbQfcsZ9Ao_llLzJUEs<|YTIQE zuRdbz_(UOf&J^wlY()Yx`)Nqh zkR_1@i10dmyaSYF;#NLc0!pe3xuAmcE_)-lfk`W9#2AEb6f>gK#DB!h+X9i?pwGl? zWys>@pWzOk=8_DJ@S^mL4=s;L9h6l>G6XK zxT52=cUR_FP>uS30B)2+($HF~+!x={d|}qLL3dFV^w7SRh975U5SZd=zKavV@tN9+ z7IP%`j;q^jWI=hV$Csk#dEMtk0InC#njV7+AV5<(`QbYtDk%{MAe-Ja0S~+#Mxm!#*Z11*hUg;5mbn#l}zgAo1YYrjDHD^6r__0^$rk!wW-P2FHX^Mac$5PNZ_*bDWoTJkH z(YykF1j2VGWA{P1?F;#hGJ1pA zz{&K}$Mf^B8E@;;D?n`_v40(kui1lQ8*=3+|HVH!#&`Gn$6dUsWpoFA5GXeMnLOsh zdBau!D7I*Rfy*@0fiqGCgArvf6+fm7A1Y-}hTU_m^nT=FN@W%Je8U>v+ zS8JEsy8h|mSKHR`yqcvsJ-~~9QmYrkYHv*IwVb(0f=~a%J<1f~~NPK&}RKWhX==e81UGEGTj$E^ZxC44=w@L7W?^F|yhrFMTDtBW{oq4jJ z1aRBKV>~!14iw?u&6*+(Ni#P%bZYQj6TgQ`0;_j&v0z>x*VR`WX~r&%nMNku+f5m> zri{h=XonnAP*X?i@XP%#Qh$3H(%&BDmnN2!RHh2#_{JWWFPN89M3?(!PrY-mxl7hNo z9am?ezyCMQadf!V5VC;qRlMI7z}{SElN@I$w`&O^mXmYn)HOOpAn3B+i>Ss)GHZy! zx=qie#Ft=lx)<7svv$Aj0M0!RRC~>?vr> z76TQSJR!$h8y!oFv#V^$*(A0{X@WR~2Yy!S8)QkAEYJ`rmH|mtYLjQRBYEBpL(G9kD1p)K)ks$XP7v09*PUS!+4 zr^Xr&k~veW76F#)Y}U5Y?YuXirt7*l2bp{3eK7A_Y!K{7Gmn%>ZuFv1OR~5?xSqap~GVFz!?ElD~XpTn-=1-0uQO2HiB&cOngpiSqcSk@;sB z&zW|x=`^ZildT~*d%``Q8C=yUu2%e}2Jy_8K-$ozo`z2h?PCS?*lLrm8yx$i)r!gT zn~KNT_end4#+C_;b`gDJB#p!Ofe=rVsay6Dw~f#{N1=;ZV&lPk!nUoj@Kt};5x~hMuE(|vCZ2AfRDGPjm7sza-76Jxi!@T$Oz>eY|+L6ftc<`IBU3X0O zJLCXF|Ja`W^ak&P*?A!9nO~W+vGW24XMLQktRqHh-(!5H-BEAm0Gy(}#fJHloxnz@ z-Se-;^}^#pc|v@6a7gMFaHvlY`a`%n7828-;F;RhgVq*#vDF3uW0h-yWz6tnerxs1 zIei(weB=G6p4h(pZ%6*G6{F+J7yHjDeSf!~R;XB5ul<1iS{Gap+qbIl?2y(>6^LcH zVUJ)WJpj@wnE7=D;u1-gOp=&K5a7CmIz zj>ztz_Jn0=TQcqGr?ax$1#kx_#{P3*&Bd#nshwU9)D9D6j9=YR0o@Qw>|fnc28Otx zX%%Jx_pvbveX9~B;8;&e&HRN|XjdCG`0#!5)7xntnH}zt9cq>40%-o0n4{9CLh`|I z{nbm2^Bt_um^KRXaMl_3*#xN_pbbSV5!&`mk1>kMnusEs$kXv8<%mOYkX4na_U6vQ zV-~`tUb}0L614k?_TXr1R6!@B97nJnIhsfF>tqnju25O2TMt>botmY_?hy{#z~`j6 z1(r6Kx`7U@jG+wzH{@UaP-u=LFLz+)Ia>fi*X8*<^Kb8PWEX!LxP%Z&G?ZbBO#Ii) z`oXpvt~6cu^w&7+Qz|`LL}WuR?^cC}M60X)6h)I(CWITCyLo%&pzJ0a)YG{0qYxpn z4!5zb`FQ)9swf_9lH`^mDbNSx9&y}^HEPn<35XCY%>yQDS(FG=!KT5sZ_t#gjHd`x1v_~L+%LLYGC-jp{xSeCqe{4 zDkHIPM`@({e(tz}z3Z00uCav;_SM0@GyFqqQeJ3$0lKj;=Hx{O?F5<_np`@1cITA5wi`#2X`B^2|)zo>`GQgqg3m z9DC)m)Zy9QjdN!C;2L|S3+wIdpRI?nhHPs(Dk=$&AXjnQE9vV~-Wmwfhy z5x`@(%xnKl88MIR6>`{@#yNq5Nr`{sZyDXLb{)wu^#S zK!H!ZjIWoe)FQvo3$T;|iefqCTxY0Q*tz(?<`tI-*Pyv3o`_08c<`HZ>(T4*_Q`T< zelZGCot~ri{rglCTm zbFK#Y8!G-#?U@bH9#v0@h|2+Mii)!7TCIq4XFLwpTZtYx)QkEnr)(&aR|TdydI?`( z3*K7((g1G(M2TT-_20}pWK^3!J9ola!&Tciyg^E~?Gz)+gzu1Kru$Nfge#09f2`EB z;`iR*0X4}()@3kyQqhb8>WuS*f6+O6X~XGU_Oq%;dgbO^cLs!(&{}OHbU%Yv=!tQr z3**uGS@-3y7FV#D%2;o2q01{sHY$Xqp;rOENl3`ah2QKl-N}Z0)p1%bUuD>$xlEG2 z$|qbfy+5!9)%PYY&N|6`%gTcH7Tl?Z_f_~gbA)`mr@?J?A)TsJkXQw36n;I^wg4WlvOiwpyhmGoii4YWfr(_Ox=^MU&aYlyE zYrzYg#7_Z}IVz0(9&){&YP6}JBpS{Yp8cX?zK2}qVbR93{`q!g`*{l4VXo1X9r2@R zl7xwu6~uyylFio)Guoe8B6A+Wfz9{2lyOW{kPHug8&EVujYWNtV|x(-h1x%UA}j1- z;(I-iVM9rsVpz!0Q(?CT)3<+y^({mBVDhTtVrM1ST_57wb{mY(h&3@s%;D%oAIJ~) zsnz^v_*AIQh3-oZs5P7E=XeU+y4i-5hyBd-E2sTG2b0F1ygl`=Bxmry;L!ZN>vjCg zp;===@4%~ZL2R&C$orti5{F(33js1i8b1d4frMj`C={8eWg_VJFKEJ1$TMiOreSSC zM`UC0a(#OD$##8k*4kVA6~?i<-y*&FyJ=uFuvq=s)w-)Io1@lhAufqx!fj;ooJ?iS zhR*xrxB_$0&0RYCNkLhP9YFPTdnwITs7OqV?|rc2vU*=o6r)-q9-+4Sy0D|Sy2%<8!h z@6lpy_D5|ma4lVq8^f4lc>x$IX?uch4Ue(Cp0sJ<-gHW9D_R7FW6O)OQvHd{Q6+0R zr=C%1o;k&t_NySwoQ`Do)%4ohhiS@@EjQZ000vGk;o{4B@NU*T8OscTrX-aaYW(4X zp`8aHow^D>$KwDXR>O|WQ;iwfsWQZPvTnj)g1Tb5z(>)feY+=Um5A+5d5?7;m!3$V z$U*gDuE%_k{Htt$nb+I{-Lull9CSmC5b`yY#tOdrvh7cnwC7T!*Unl}9V|iY5@8dw zbxL{e&uF)o0_qpvPg`u7crei%9wz5W3-)+f_I0U{XG$`};k;)e1`1KcX}!^dE`!pK z)AeAnnByMu&Yr#@*UcTjpkqYmZiuD>B@#la%tuCIeF8G}{2UvnIJ9^!NglO0P3nn) z`>4e@D9JTAGnf(Nws{j%36&xjB{`CLmU??IoE^jErK5_{o`0SfL6Rtaql>dR=vj7n{m8 zk}us>RcDsutbwkM8n0V%P_9`P0lxPLx&c;S1`ZZ>cbVzhur8oGc&G*(VCe{J0qA~+ z{xW!$pU}Uq!@=%j@fBnb%tS?J8M*1rP+(RrR_cgXl-@kr>j`03fVhA%<1&DvQ=~GX zN^;3rYH36ZD{KN-#KykP7hR?aWUanH#tyJ%^e{!x+1n1vm zqp^U%%(%cW*E<7^%9Op90wlNHK;)#TNFvHR?$}?xQ=Zhhv>~<~QZRCRnAA15>2J!n zel!3!Nm=rHkw`?PD8+d`AL(4rEg)CU!=bz=Hj|^!J+GJWyRw@_sZ{huf3u?Oqq*T2 zE50Ac!pYYW*5irknCKf%SSu2Ir=kU%&e=fOybF?Th)p$avu75XU_0KQwepqVYP_Q+ zr&do7r;dF^!%UpI{7da~R!{lmPkNs>-WL#tHL36J-EsyO&4*>vN_mo$D>5Xrjkkq~ z_!zn#4!{$&nxC!JIazIybV-Zf#NM26e2|?gX_& zm;L#?KX&M&L!jbBLf;IVqF!aueysem??b^ryzR;r+AhxJJV=~E2n69}!W1cBg83rW zZO4`Nq?(QID(tUEn9>RUOk-7TQ1i5aA`wgCzvM}~McjVG>_Xr1%f~QpC$%$*z}lm@ zJ};#`_VWm|7VG|gEHp_vnq5SrB!^bf@nrA+Ywx_nqFA=IKf{oR3=##&AVH!?lALpt z43d-NEFf8;1j&L(6p$o2Cjmvt2uRK-IVcDM!fo(+z}fq__dVzP{<-%w^i20a{hnS` z)m2l~tJXVDT4bwnU%O=kd)_BAkztacH460*O}Q@RC^!7i-3g=k7=o?gQOznKtrkyyKaATiTp{pb95<%^d+gk_l6=_e%-| zi{QP_aylIPxu$GGZ-a8I3q!i7nbRH~<_0HYuWB<}#Pk<3jVjHQX`kBft+6DktC_z= zpGsiN081!KI_I$jb5H8?py}dI zxrHnQ;hbjg+4YwSvCxstiLRvkG|CldXQ=0W{hk8P8;R4!TeS(a$ipJb zW=Eoow9WYBh?pP4mlRP$B~lRjN^V%flMQf*lEPJYC~AsPRbgvSHbm^(Ei6r8kGXqz zi;b(1_#)QJQ+!l69uzz*Dw>W}Dya&DO(*N%kYtc!gi`7%FI2`8F@-K1^x z=m-V5Iz%mzB*2EnIr z_N!BKEwGPe%3hlj6pO^)DGQYIZok6$&Wep-0&O0xZ!N-Cg19FwJ&wH-j+o}&4qd~G zW;B;hx6#kaT1~ORgRg9$> zDxxazBdiAfhOXPiag>u7%^=4oc>Q+T}{iKA+HxU()k#cU!ZMr5SN=K z)1(JJy5Vo63>IKSNQZNwC+IYdXZ=LuueeUW{Ukkqb$QWG7MZpyKXlt{*Xf;|$<62D za6|r4gzw%AGjHeWxa_ar`)E8Msd-qK$h-mckLgk21fXx{Xf^TU1L7R2;fEn-R;DB)EQVsXSI z5iJ#Pya~qM*iCo#3ZZA7odxyp`*Q^N)4$=#H`uhl;>LgXHW^NE0MY02c0VulK$Q0S z?6J%xENSVoU@4N)+TNVnupM13o|koVV|jM`P$?9uKsx`3dm4+m$0x zKSq={xmDL$!Rzx%crY5GFqLfIn{342A*RZp85}w(kVKDN;vT{&kM->nJ+}0Ts#DUF z+kDOx&7IN?U~_DK#beSM>TNTQt|V*`G&f@H*B0wh5i9MkQ=zw#0!Nk$rXxpCk{AY4 zdj{#andtFJ;(wbND9Hm^O-Y;i1qHxDeZoU)O zhGErz+?xF@ZFYApM##e?EeGYjt;V+nX!C(LHPh8~@L`_ygMOizg(rH`hsC%Gp&P`J zx69B!5C^|*A(eYH&|XK@^J;C(Yuwrf+G|fx!!+6-8TBp}wOy0;JOZ;A zOldA!c6Zh3hJ@F2_k3J!D|~1Ex_~{t`dYhHiP8vOQoOq#E3&ojQtGdPT?`L*4Lp@pR5)U_ z#>nhbg)g@!k?H}FN+GVsIN3Dnwyv1{eW*`>%#lgj4`$Y z=O+2lsAh}Z&ZnoKVBI9eBHQ_|0C@+X+ z<^5$jTssq?qE84OH>KxWd0u-?$Zn*t)zh^#)8G|3-QeYVe9*D8@GSBfKhJ~XtehpL z$qs2v{e#1azLVoa{PY>sn1CjZHZ+Y{ z-uB8_Z}63DRClMter$KF(ENA0n-;E&VWhKUp9eFyw=1Ob!=*o4~Kq4>; z+}#}J52|m;XE+ZsJe~^SHrnJ!rN8<(kUsmzrgvaa!I9SIUqh?zItM+$t_Aq#yW1_DlsUr(gce5?X^Q&_gQ}VR4F_Ii} z-BFH@4oKeas!3CuU5RFmybq2kv+B_UA10(efWDBdoY)^_a*YugkiOD0k@SV#F<7w< zJMullx-YFV(UD)OP>4}QpZXQAsCuHznO010t<}w=IPOh>M&ik=45~qXq1|pZwS&*J za|*{8X7?gOuisSq@YIp?{bHHxvsza>sCF`cJsrbW_Q|)rQ%jWTrzh-<0l9Al{JJ$K z3vLwbn#O-U`J#SbOTfSja8xwT8>(|FldraHUC1FlNMh$w;*hYFeIF=08t5;8w(9b6 zS2_$=i?}tb*W~W(tcYI^F?G#h$O{XsIXvQny4=t}b}CYtI7bvDNe*3UorO89^!3v6 zd`#*pN2$WE?stPf?Akxrr0*om7jdfTAu6(jGdHbrWu`){YeX-v!(Z*5T$SKd#Ur&1 zdNvTUnmgGqs*+!`3Cdv579#7S;X$_j0m@Rnt#rZNdj z+LR3I+T8DaV>v<6mP|ypfY)%tMKn|knLx1#hihF?-Yj;>$*#(=W0E?r?Pf^jk^d_N zQmG&{K1~TO&Tch)IHrNr!s7yY);00#O3IIVX*!OyzW_Mie$SA>|AC(;uZ<1I68>eCK+-^5*f2q_}2s^>>EHf~w+MboS___!gK4_VP@ugUN$m zYm~5q8R8^{wxAYQ6M@{)@Q>Z5pBCrE ziTTQ38e8*K4GqnX#a>4hT{tE;zG^Ix9N%oUGazcei{T}h#7-m6+Iox8FC&;NiQjjz z`fAT$QS+t#92Gb|+bBRIo7hs-z!>Rl|Jje(n3`A`vRK*}nwzrSu(vf2RZ@^dM zgf1;5rUJYN0=p?P(EouVbY*>kH?Wh6qzI_E_v#980&gxXFAM^eMnR7a0WOH#SV~16 z1iDWP0{H?d4}p(-mq8#GRuE|QF5n!H1OgG*r`9R+1AjoVm(p?q&VjWc1lZtrv|oS+ zNC@Q8V!~?f`WvYf_7g%_;^VnJdr+ak`+xsJq0k9WB0FpS@ zj$5Tn;)9Jx(>hbrmX(9lLA00nSY2Z3X3gpC%|75nE2sw~d= z`S+_K*Q!jfiDz(9#ucO;7-}?OW{9~t8Z=FCzRDT18r+^bm=irLW<;&>U>IPaY3X-C z_P3o|a7dYT^e+4|;f(gCOtByiitA9VXPPGQt5o;9kXgPC8yEw zejyd8C=Dyl2s22lNeIGMGt{L(c33-*>ACyqk=Q!+4P==jY)Ui_^F^_Y9a=YVBa84f zz7M~Pikpa89ef(-?#@2IK=pFPnLyMS%5xxwXFQ*ercN?EMk5^20gp`H0Ex=QkWeD51s6(jsQN8>N$@zNTKrq33D3tJBx-OHOD( zDMX#-Zh#t<=C!|ekZil?vUIgD?VptwxgUXqui=;tg9kpAXx+M#SwGaeBHzwjPr;p@ z28WkTII!94&B5)3!_sF9l`<$V1!CIKA1P`lA{4oU`4K2Xy(w_mAABPI^epRTiv(W) z$S7n|p!QT%tD#|@NLh}JkKQx=x?t>!ku>SMvF*O}hbna+Obu)~@te}DRl~@i$qJ_q zu(J`tryu!!Ax}kny5VG_qrfUz+U0K6)lWFk2_Gh^h(0DdbO=ptGrnDJneeUpn7ybp z3ABaXVw+eyHC8fSL7rB3yk4r;wO;fQ;Uh(~K>){yo;{MsJ^xM7f`}Fh7qA>TX_;*y z+ZEJJ!$^_+=eJ{o^rN`HZU#*1ZF?}JWc7Vatwd~8brAGOo9qn9>Z>amo+G#&KbQQG z-WcxL>PZ2wBEHy+D#VYDD)C!lLqV8-{5M74H{BM?O}3y6@{q~K#h7lFG06c2a-k7N z3nf&xZ4*C`{hGr)G<}M|BbA5K-FLvxU0(o!eku1|w zF36(r@gK_c?sd2n$2l8@COfPA1kLR_vmjh;t%?B)HCU@W1msoTaQo(5SrKKwNvIG}?@dp1aq11Y=#RoFU7$c+M5&wqp! z3?H3K$QAMGg{bdJpmA(8%`g_&=pj~ne_i~;=nB2z2HT~6E>vqwzvCD12pP0w_!N?f zt;F#ZR3$Oy`QarZaNk@|&=iUkhhny{ps!YRzTcsE;#v^*ev-PXDyc!ji1k;1kp2~59kCM zP>{5^f>^Q0UH`K{r56pogC8mHxgHDf#GL^6FB3asB}Y4ZCt$qdVq;`$XnF63mA$F? z>FDV!2unsnS^@+HgF$zJAJFLpNc8ON-`dU~{}$jZ@o5VP8yVCB20_4-AUJF=1RH$X z4#a>5ff0VN&+I?jz;FrhZ35Q%l>}#MI2(!qUpg*~Qh(-Q#{hV9>+hkkGKlv2pPUiAl*%GPAOCp6BM} zzbGrOsI024sjYj}*52{@P3PNpgYSoiM?Q>>jnB<5EG~Wgw7jyq^ZCo}-q-zuZ--}g zo!R+w`%}BH0lVPf;UVxyXLf<%+|CTghDV@aL&OnQMly83rDXR*#uJIjC~ZZd;!xSX zV&n)+uv2r+(d?X=c5d0Avg{v*UD!1aLW6*T!h>Lg1VJY!^qFCx|Lp%C^PteW z1luA(`(ylEeWT3yjP3{Kn|vEo3h~LbL(CP%=HIhzMoZ#8PZaIqdM9<>Fss(7PjNS` ze%YKbVdjfUpZPEC9DClPM|9Fddj>C8d7phXd+M3zW43}nV>4WdS*j!J^p%vo&&$Ai z$o9B|^4&ytRA235`s(N3+X5?hd?G5Zp=+-3+O@4bANn+WEc|@h!tHSAd1!!j;3L~qQ$CXMes0)#Mzzk?;wk^x|$EJ!EMnWSVE^)C4$whfY`s8t@$YW90Kk|3^Zx_Vzk4NrOs~|y&jS*=u=&^M=9tVS z#mZn1C>&7500v~|k_2ap80X&{&eob-R-75oi(%q(y=R2P=bF(kim?Gf)=_{T!F>E# zRc5B~m4mD(3(sy<7kl|k_kAa9V|%05jxuP;VO(44xMSBFewY>F}JZi=k zzVf@O0s@6D#pva7ysHh)=5Th@HVROCdxcNPW1B7TmC&5z-D+VX;im>YWP1w043-1?h)LQ3dIjQ-a1kkyg z$EgSCILoA4D`XER6BQlc-E4O6RCOD7n2ysVvdbqo=HSPBN7|7v2uKgMP{wS&t$oDE>KdVJ& zN;l4iM)yorojvZEI-QjOTDLTYKP#coTw|!4#fdkws4_L)D{@A+RWL&w#fp$c7S6(y z>9^01S$YIzG7~k|O*kQ^vtXRMn^W0Hh*6#a#zG?wQx29DcVD7HJ*sAM_#G5IoC@$X z*7~1Yq}U^7IXQ`h*hps7+)mP3-q>Ek_lY!gJ{EB(G_Cd43xD#= zik952r4UOgi0*yP*A8kU!?pR}8JHdjl>tNeKQXQ&ggZSLs9gMjAKK5#nyZ`6szW#XwaO~E=iEH);$?DA6`IZAq(yl(aW zCR}B=X0eH1tYrjttXjP82*Sy@j~qUsmZXVv;N!v;bF&?@?}ufB9$jNA@5w>YTyzKm z+__)q%XV9cjdEo;P%34TA9A}t;blPQ0ozk$az>WtQRvREHF%imt6#}o*BdZy%Z8Fa zM49((xNUD^XK_fxX_JJI^x%*n=VnN3TGhcO&Ec(GUQ^9l(|FOZaCdsjIA0IcRB6<) zFwc|~vWTBL6wcC+++9(K%hEtrmhFzj0lU(Tvb;Pg)sLBU?L5ulZp+)9c>vAs!yJ5h z%$w_E>fS@Mipnqju^capL#(U&eJ~dA9$xsRHF}PgmXg6z= zw;l7(JwQ9NR6%KjcHdQa%=QbNAVJtE&2<4*eTT&!QXbp0?=@K_IV>94>WxLe1PoWs zEh*rl-U_2nx*5z7bd>9h^=ejwq<9|i4g6!3q5R()PNT4CND%^XJM(N{0Lb5%x|vi^4cPN1gzy)M_WoaQFn z6e0QovhmbuFO%bsJ)`R=zA}S`CU_S_r75yJckYjL6X8+rK*>aPN>`&6Yv8k6O0 zuQwp}<1BWjp_=8-dtE!J%;PkD(|NSJ{xkK?#2w< z!Wom`E_He}(zL+!a>fO?U;;nob>{AxxfdxL?(dQkj!pESV zZV`Ck`jSRrGTA zl6&5PUbl*K_$g;enLR#v6_R=x=ng!+vN)baG&Gj%Lww|DIwPo+hkZVed{OYMA z+QLDRv;C=)({bH+aypvYHZAwTH&CgUP|X-B_NMU&`Kl14^>D5-gjn0q>=|0#8da*w zB5Cn>GHr~K=D2#@)~}Q(WI1s0p3oCJ9XC)f>kzrHM{qfH8$k&YdRWmAURWAuP!XFp5FPPTk zGiEenxZ}NMIK=6F_hxa$qf&@kv0N+FbWSIyoU$)`WlAGub=8Z{teHY_>_jmYKh{f( zA0m}_aQK1pqW=ZMF$2^5KjW?aD$ILP7(b5wM5b3s_E*5KvYwX#5TJXwB=QNH5LVgn zA}J5h>-?3@AuR1zLBI83fu)Q5136mgTZRToe{_&XHQT5OvsDy z900Tdplm-n^k0lS5BzfODxj{0@I%%MM$!xR;$Yn`E-r2o>k|6s((p?vkv~4V5Fh&c zM!-U-OSB_kW50H9K5^ z`u#W1XMNrOkob;BX~=k2|l;usGNSW*4|v>EGkdTTWOU>=K&`+^pR1 zap(OKEDqK)`~v3=csKkm@6J0TSls1?_t%!DTjNh~mzwk+g?-^72}_1`GrYLaA>@cYFz`AnFqmmESODx~(*=OQ{s-WfsVCUvzs`DGBnE+c94_U-f6syZA@wh#z{{zR doG+#RIVMz+ML6@U0nq|Kxj-o7M7OiE{{kQ3jQ0Ql literal 0 HcmV?d00001 diff --git a/oox/qa/unit/mathml.cxx b/oox/qa/unit/mathml.cxx new file mode 100644 index 000000000000..632fc566ddb7 --- /dev/null +++ b/oox/qa/unit/mathml.cxx @@ -0,0 +1,65 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include +#include + +#include +#include + +#include +#include +#include +#include +#include + +using namespace ::com::sun::star; + +/// oox mathml tests. +class OoxMathmlTest : public test::BootstrapFixture, public unotest::MacrosTest +{ +private: + uno::Reference mxComponentContext; + uno::Reference mxComponent; + +public: + void setUp() override; + void tearDown() override; + uno::Reference& getComponent() { return mxComponent; } +}; + +void OoxMathmlTest::setUp() +{ + test::BootstrapFixture::setUp(); + + mxComponentContext.set(comphelper::getComponentContext(getMultiServiceFactory())); + mxDesktop.set(frame::Desktop::create(mxComponentContext)); +} + +void OoxMathmlTest::tearDown() +{ + if (mxComponent.is()) + mxComponent->dispose(); + + test::BootstrapFixture::tearDown(); +} + +char const DATA_DIRECTORY[] = "/oox/qa/unit/data/"; + +CPPUNIT_TEST_FIXTURE(OoxMathmlTest, testImportCharacters) +{ + OUString aURL = m_directories.getURLFromSrc(DATA_DIRECTORY) + "import-characters.pptx"; + // Without the accompanying fix in place, this failed with an assertion failure on import. + getComponent() = loadFromDesktop(aURL); + CPPUNIT_ASSERT(getComponent().is()); +} + +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/oox/source/mathml/import.cxx b/oox/source/mathml/import.cxx index 5a02f8906955..ec338c451638 100644 --- a/oox/source/mathml/import.cxx +++ b/oox/source/mathml/import.cxx @@ -32,7 +32,7 @@ class LazyMathBufferingContext : public core::ContextHandler { private: XmlStreamBuilder & m_rBuilder; - long m_Counter; + std::vector m_OpenElements; public: LazyMathBufferingContext(core::ContextHandler const& rParent, @@ -51,7 +51,6 @@ LazyMathBufferingContext::LazyMathBufferingContext( core::ContextHandler const& rParent, drawingml::TextParagraph & rPara) : core::ContextHandler(rParent) , m_rBuilder(rPara.GetMathXml()) - , m_Counter(0) { } @@ -59,22 +58,22 @@ void SAL_CALL LazyMathBufferingContext::startFastElement( sal_Int32 const nElement, uno::Reference const& xAttrs) { - if (0 < m_Counter) // ignore a14:m + if (0 < m_OpenElements.size()) // ignore a14:m { // ignore outer oMathPara - if (1 != m_Counter || OOX_TOKEN(officeMath, oMathPara) != nElement) + if (1 != m_OpenElements.size() || OOX_TOKEN(officeMath, oMathPara) != nElement) { m_rBuilder.appendOpeningTag(nElement, xAttrs); } } - ++m_Counter; + m_OpenElements.push_back(nElement); } void SAL_CALL LazyMathBufferingContext::endFastElement(sal_Int32 const nElement) { - --m_Counter; - if (0 < m_Counter) // ignore a14:m + m_OpenElements.pop_back(); + if (0 < m_OpenElements.size()) // ignore a14:m { // ignore outer oMathPara - if (1 != m_Counter || OOX_TOKEN(officeMath, oMathPara) != nElement) + if (1 != m_OpenElements.size() || OOX_TOKEN(officeMath, oMathPara) != nElement) { m_rBuilder.appendClosingTag(nElement); } @@ -90,9 +89,12 @@ LazyMathBufferingContext::createFastChildContext(sal_Int32 const, void SAL_CALL LazyMathBufferingContext::characters(OUString const& rChars) { - if (0 < m_Counter) // ignore a14:m + if (0 < m_OpenElements.size()) // ignore a14:m { - m_rBuilder.appendCharacters(rChars); + if (m_OpenElements.back() == OOX_TOKEN(officeMath, t)) + { + m_rBuilder.appendCharacters(rChars); + } } }