From d6368459d8b436638254a3dff568f8fe8233736e Mon Sep 17 00:00:00 2001 From: Yuliya Ivaniukovich Date: Fri, 18 Mar 2022 18:18:40 +0300 Subject: [PATCH] Add ability to disable annotations including canvas appearance-data (#963) --- src/Page.jsx | 6 +++++- src/Page/AnnotationLayer.jsx | 16 ++++++++++++---- src/Page/PageCanvas.jsx | 14 ++++++++++---- test/LayerOptions.jsx | 23 +++++++++++++++++++++++ test/Test.jsx | 4 ++++ test/test.pdf | Bin 342905 -> 340185 bytes 6 files changed, 54 insertions(+), 9 deletions(-) diff --git a/src/Page.jsx b/src/Page.jsx index 8424469a8..7a665d4b0 100644 --- a/src/Page.jsx +++ b/src/Page.jsx @@ -6,6 +6,7 @@ import mergeClassNames from 'merge-class-names'; import mergeRefs from 'merge-refs'; import invariant from 'tiny-invariant'; import warning from 'tiny-warning'; +import { AnnotationMode } from 'pdfjs-dist/legacy/build/pdf'; import DocumentContext from './DocumentContext'; import PageContext from './PageContext'; @@ -75,6 +76,7 @@ export class PageInternal extends PureComponent { } const { + annotationMode, canvasBackground, customTextRenderer, onGetAnnotationsError, @@ -90,6 +92,7 @@ export class PageInternal extends PureComponent { } = this.props; return { + annotationMode, canvasBackground, customTextRenderer, onGetAnnotationsError, @@ -355,11 +358,11 @@ export class PageInternal extends PureComponent { } PageInternal.defaultProps = { + annotationMode: AnnotationMode.ENABLE, error: 'Failed to load the page.', loading: 'Loading pageā€¦', noData: 'No page specified.', renderAnnotationLayer: true, - renderForms: false, renderMode: 'canvas', renderTextLayer: true, scale: defaultScale, @@ -369,6 +372,7 @@ const isFunctionOrNode = PropTypes.oneOfType([PropTypes.func, PropTypes.node]); PageInternal.propTypes = { ...eventProps, + annotationMode: PropTypes.number, canvasBackground: PropTypes.string, children: PropTypes.node, className: isClassName, diff --git a/src/Page/AnnotationLayer.jsx b/src/Page/AnnotationLayer.jsx index 9e56aa43d..1a512535c 100644 --- a/src/Page/AnnotationLayer.jsx +++ b/src/Page/AnnotationLayer.jsx @@ -26,9 +26,13 @@ export class AnnotationLayerInternal extends PureComponent { } componentDidUpdate(prevProps) { - const { page, renderForms } = this.props; + const { annotationMode, page, renderForms } = this.props; - if ((prevProps.page && page !== prevProps.page) || renderForms !== prevProps.renderForms) { + if ( + (prevProps.page && page !== prevProps.page) || + annotationMode !== prevProps.annotationMode || + renderForms !== prevProps.renderForms + ) { this.loadAnnotations(); } } @@ -96,7 +100,7 @@ export class AnnotationLayerInternal extends PureComponent { return; } - const { imageResourcesPath, linkService, page, renderForms } = this.props; + const { annotationMode, imageResourcesPath, linkService, page, renderForms } = this.props; const viewport = this.viewport.clone({ dontFlip: true }); @@ -106,7 +110,10 @@ export class AnnotationLayerInternal extends PureComponent { imageResourcesPath, linkService, page, - renderForms, + renderForms: + annotationMode !== null && annotationMode !== undefined + ? annotationMode === pdfjs.AnnotationMode.ENABLE_FORMS + : renderForms, viewport, }; @@ -135,6 +142,7 @@ export class AnnotationLayerInternal extends PureComponent { } AnnotationLayerInternal.propTypes = { + annotationMode: PropTypes.number, imageResourcesPath: PropTypes.string, linkService: isLinkService.isRequired, onGetAnnotationsError: PropTypes.func, diff --git a/src/Page/PageCanvas.jsx b/src/Page/PageCanvas.jsx index 906f39ed1..f256bd6b6 100644 --- a/src/Page/PageCanvas.jsx +++ b/src/Page/PageCanvas.jsx @@ -18,8 +18,12 @@ export class PageCanvasInternal extends PureComponent { } componentDidUpdate(prevProps) { - const { canvasBackground, page, renderForms } = this.props; - if (canvasBackground !== prevProps.canvasBackground || renderForms !== prevProps.renderForms) { + const { annotationMode, canvasBackground, page, renderForms } = this.props; + if ( + annotationMode !== prevProps.annotationMode || + canvasBackground !== prevProps.canvasBackground || + renderForms !== prevProps.renderForms + ) { // Ensures the canvas will be re-rendered from scratch. Otherwise all form data will stay. page.cleanup(); this.drawPageOnCanvas(); @@ -95,7 +99,7 @@ export class PageCanvasInternal extends PureComponent { } const { renderViewport, viewport } = this; - const { canvasBackground, page, renderForms } = this.props; + const { annotationMode, canvasBackground, page, renderForms } = this.props; canvas.width = renderViewport.width; canvas.height = renderViewport.height; @@ -104,7 +108,8 @@ export class PageCanvasInternal extends PureComponent { canvas.style.height = `${Math.floor(viewport.height)}px`; const renderContext = { - annotationMode: renderForms ? ANNOTATION_MODE.ENABLE_FORMS : ANNOTATION_MODE.ENABLE, + annotationMode: + annotationMode ?? (renderForms ? ANNOTATION_MODE.ENABLE_FORMS : ANNOTATION_MODE.ENABLE), get canvasContext() { return canvas.getContext('2d'); }, @@ -142,6 +147,7 @@ export class PageCanvasInternal extends PureComponent { } PageCanvasInternal.propTypes = { + annotationMode: PropTypes.number, canvasBackground: PropTypes.string, canvasRef: isRef, onRenderError: PropTypes.func, diff --git a/test/LayerOptions.jsx b/test/LayerOptions.jsx index 6e4cef178..373e5748f 100644 --- a/test/LayerOptions.jsx +++ b/test/LayerOptions.jsx @@ -1,14 +1,23 @@ import React from 'react'; import PropTypes from 'prop-types'; +import { AnnotationMode } from 'pdfjs-dist/legacy/build/pdf'; export default function LayerOptions({ + annotationMode, renderAnnotationLayer, renderForms, renderTextLayer, + setAnnotationMode, setRenderAnnotationLayer, setRenderForms, setRenderTextLayer, }) { + function onAnnotationModeChange(event) { + const { value } = event.target; + + setAnnotationMode(value.length > 0 ? Number(value) : null); + } + function onRenderAnnotationLayerChange(event) { setRenderAnnotationLayer(event.target.checked); } @@ -55,14 +64,28 @@ export default function LayerOptions({ /> + +
+ + +
); } LayerOptions.propTypes = { + annotationMode: PropTypes.number, renderAnnotationLayer: PropTypes.bool, renderForms: PropTypes.bool, renderTextLayer: PropTypes.bool, + setAnnotationMode: PropTypes.func.isRequired, setRenderAnnotationLayer: PropTypes.func.isRequired, setRenderForms: PropTypes.func.isRequired, setRenderTextLayer: PropTypes.func.isRequired, diff --git a/test/Test.jsx b/test/Test.jsx index 04fe161e4..a6777b079 100644 --- a/test/Test.jsx +++ b/test/Test.jsx @@ -48,6 +48,7 @@ export const readAsDataURL = (file) => /* eslint-disable no-console */ export default function Test() { + const [annotationMode, setAnnotationMode] = useState(null); const [canvasBackground, setCanvasBackground] = useState(null); const [displayAll, setDisplayAll] = useState(false); const [externalLinkTarget, setExternalLinkTarget] = useState(null); @@ -171,6 +172,7 @@ export default function Test() { function getPageProps() { return { + annotationMode, canvasBackground, className: 'custom-classname-page', height: pageHeight, @@ -217,9 +219,11 @@ export default function Test() { L=X=AgVE)Ii5VNk;8g?e(sO$Za&44z0VL1D3Y0_4X{h?T^la9AP*3P8alp{a>n zC@^|qh(ti6i6tT~OQ5G4*H%3Drf@vjBtrk2?0qombZGi_n;>KFd*~cNp;l6c`(`g93A-6UJB8?tkCuC7E4tE zJLE*yGB2;I|DGMYr`dg{G>TF$=B!-qJR()U+qskFOMf!18?l92zkakN+jP&UL%tU# znqn^4t_jC!JuV5-vhNP`%qa$~qu&p>zBOZ5GCT%yymdxG8^V>rdKlV7YA7kBN!r=%y=46|UCmT6B%F zQ@+-B%vhl-oL5(Q)r&FK?mHulsOPk~M%{=f+NRPi9m{L9V|B!n^3biam6LO}hh6Tw zU68WVtT^)H=-?xW!0g#KshL-=pxP!c)6m!Snf%B)*faZvo%>mJ-IXg0Cp$Hc@$OO6 zF`B%%aZX0(f)t$`jYBqTFh)j`8%X2+vM%1$fjTcN^K;j?(bl2o-_@Q@-*{Ks8oR27 zW3CmLX&Pj@rq#u!-p=ld(Ig{To1@Mv?Jv?C!MzMEY}`piX@@RP%k-l5vc&rsy$((X znYUVJQh-KwzW+)){Y=ajMAuYt~J5hH}M?u3byS`L4JnQ)_gV0*8GggzOyp& zeP^B9?>lRhZxkZ!kH=F|p7>82g-kDDy{!DaotKfOrvrmUk z|LHgXF!`fvY(eop+0t$0Rslj+;>}fe1*KCzw%$!k!v9EJDy>ZTvgqiUw2Gh2-J^2~ zUow97jqBPbHM#UL;h7X){qS(jT!-h^pTBP2;Q!3D_NK$VvJtpOlaJSJ0^2V(Wy#8F z@sF&^K7X#e+m)7f>`YZP-S&3jCT!~0p103?=5_aMNYQ>$o;P*FD}qmflw0NZ1h@8jyu;;hquI`_Zpw~_h1o!XN7 zxp?ctfVVc$-CSH<`j6M?qRlb0z8|)cEnC-eFZW1Fvd;aRoK=wA4THGg4Yn zSJ%>3)r(Uv&kJihb;E^6n~>9#Iq4enaEr(I9o`ICL~)b))$u;%mS>y1ozrTplh;`P z)DB>HpLj~lYaGej#d)*&N<`W9ZxhwIgx z&)u|Oo{81WX}A$~$L4N69CX5^@s!oN?h4HlVNn&B+Y97#=dC>d0pm|QzT(5SHTun4 zdRC6EU$jjY{p{XB&e)5Exo`gP7F~Z!O@0u+OZ{?s)AmRBqVgrthj5D{Pj#(d|8wMe zNzt~t+gUH&_s!}rS#QbgEW8lwJ3l;O_5O#hL4BV}M4#QBomzHnpK)H6?X@3L;fNMT z+NtFaOb?tjd0hCZG^Z`RNxrH3QGmRDM~80U{3f05Yj-- zmx>?cH8g*VzlFXlh;8drR+vU6-FS?G?rbvMa{2N!=!D~y z^{3w0sg?I!c%8Djmsj3ZQ&E@FbbfZ>@|r}asK4wR?xh-S`mlF-QO}4}qokU8z1{j@ zQD%-8MmC>ss$X8Sd*|1NA0>MnU2kBQN-_vv-CUEVJ6G!*_};;I8qy$HE~Z^!Mo1tIsP8Dh!qH#V(18)G7pN!9Fz zm=^Vhtr~*Lt3Bz~)d6S5v`!FPSL-Lf%^1`7thVs;>w`v>$GyZ49$hghymF>vTJ4VX zDND=(`(^4{YLdK>XZ3Ws37mmi1l+-u3=V_)O-+NR4puZ20w`!m|5naOHedJEz#6Zb z|7?Dj`|}*XQumivt{=R!*P*7vTC&N|8^?C=YHuq(Nr+zQra$#Xx|J&ny%3|-aE`Jq zT^cucq)l-3OvmjbZ@jo$E~0fdnag_b20uU3em86Wn6PAQ9QP_@!uzyv1F0i3qNVfV ztEEq0_93HJofQVvPFV2WfRCO~!o2skX=HJVKK(U>*fuUKk6C9dB{ zCn{ha-)>u;^~7yO`}-sAjNN;3d>)b){EjnX|KmFKwRC|yVdbG`wP*L9zHuxBFX=7B<#^bR-+Qfg8c4xN#!iyNgl}B(> z|C)2G(@J}l;{ku$l8N1W7aU8pm>s;|*#7k7$|LqAk4{Y4a@ajWnB7*hwa?bmP$MuS zaZU3mZ!I5lb#69Z|M<9u&-?8$vYPgHe&d~b(~hNGt)Z0V>XG&>zZBMM??1chETiNE z5lyY+q~3DYeS11Qd|LduWVXv+APkME$`*c$I{a!hlH{@P#-8!TU4g6&vI&w_|LE-W z&qsH3r!)v{S8r(A_~6`WbdXhb{){XSXyf{`PWL1KZ19a}v0h0SWisxI)4Ukjvn0{3 zvFb8ZxN&#TCAa$46Xp`ASg`2i{)){r*I$oFmW<wV7s?q-H2*7Md> zT>SGv#ldCTg$ePcVpqeo%w21|y93Qi+-_T$HO<=49lzjG#*95r++MzmTS6Z_-_5;` zi1Nv>k!hYktNy{^oZ2@BK31U|v%mWS;WyeL4p#SgBCH+CziDTCGb8>2##pVRR@An- z^S09(jG#=v_2P5G^jQyXXw94EWAWvkJp98c6W{snzM_V{oSi8d6A@2XC`}6swaXn} zErWDvQ{0wlXR3Ldxtq1R$c&cNC$pSqgp{U6`YbO!PVvc+k9)A*PiISg&9oH{_iW5Q z61@IZ^0Y0a<2iPTwg)G%4~wVhmj-t*E{}*jdR@yMn-=S8QKGrT5-)a4JP|(gY=X__ zTcK@hE^IOPzO^FICh*{=QuFdlhY1(?ny!z%Q_eR3)2voKVHQ&=`p;pea3nQ-D$yz!)J>t3afs&#CD$i$v%&4?-xxHCHXI$ z|L!!Su;|V!gVR0{rD&)0IueaN!+saL(!SvgyI<2xO(&OS_*;J>{zhXstjeEASPak@ z{@*kv31$lKV~l?wzZr!0+}dsTbDhT%!(i+|-@Nsj9)JC@gxrBh%nXK{_+zTA=6SUK1T$%i7eK^M(fFqG@%vJr3_K z80r0*Ju#od+O{M*=3r9^eS>|^^k!~t<25-&tDJF3qr3dxl*qE0yPZ39q#*>?sqc$d zpI%+?9+T_PEh~AA>g9}(TWvdju&qUyHU0XvPhWG#*=OA{IMV!TzM9*oC(W_z?7A{p zXC^lvBxF~gd{;KZ)VA!wl4ZB29WlQXqjkW&P<^Yr)0r!eY>VC$W`{H!xQ=*!eB$_} zd)|&MiCBJ?Y#^`8skW-iGU)OBTCuO7==4;J^I=_@es(i8LsMn<fMmK%^$8fiBMSD>*Pk><{L#o?=8 zdg#6=w1^OYB|O1=`X<@^$h>~c!kcz2?07vv^8MFY`V(w0An85~HbMNxY*lRpXJ?4c771qvMFJF-3Mb-V$d8o}Ys*bQhlSW}j+-tEUQ5I znJWqsabvh5ZUP%7Od-KwG@9N(J)nw!fVCMszC>;c8Xa0VB9%a+9bbYV>6#9}!Dw*( z0B=Fe<|gEBHX0-IU?qBUd9iU46q$&DJh||M1ckx;Agn#Y`tg3z-ZVAEv+djxR zqRJ9T|Fi@OEV$rYiqS;E5aWYNA7C7f#SYUt6;!RmSx5bz^&w-=H5y|qpKXsAJ07-r zt_bq<2=(N$g&Z!VvS=(ZmpI1C77CF@OW@v~j{rEIQrmMtpO4FyKm#_1!vfQim)RrA zmTMTV)-YDD)G$WO8eur#I#`wOz+FU3Bn9@Z%JUWoUxU#qh#`CY&x{dpB>7r` z@&B+}iZY(fkjJk>Oc-XXPS${XM_@KGNWaTu2V>K#Y|~?Lb&MMcP3g;JpBltgSx})B$2)j06=S6mjeze<8;c zBpq8%M{q#LVenWAmJD7$P^V+?Q!$vScJiM)5T?e%k_%a7+6q5L;wVJm#(NGRuS3>+TA#FMb#N(EQI3;Yad;Rt|3GM+)EQbFzqxD=Q^*c277#H9iTzk=>ZQSFyyj)4J-Mkd<|_&FaTH}1NjZQB$lko1&qqe`5I>GCMsvel84+F1o+u< zO&>YEKqGtf5P+%#QL0mOtH#*M@mn=+%o{tXaFy4=YJ^Fc%1wJT{v0Bq$gHrwl_act zHB2fUdo@1o8YDqc8Lo;%pnQQ`Q&+xQu9-fJj;aPw(g`fk99tPvpt(J6h>prU8DugM zW@Q|TNQCVX{snhK5>bTAA)ch_NaM=&>c|>%C)Ktns^ABL$-sLzJRVe*s>D3U-%lBh z{J9bq2b8`b8LzfLx~S{QFIgbbo{AWQn&TgY@(_x+D53)i&BlPFOvO52Nx+gw_9)VC6<4EUA zejNqV&hP}Ehe{Ff9r@sV;bNVF=5XcumPjkv5LFlu`X>nm3x8h?=76n?UB9lTSSp0O z=-1I99%vE5g=`*|9f$H~Ed5*%Xd~-CuDB)=}zImBoQwDWsts4fdQt)6)gGj$ma0V3Jlj(FQpm zQHile?m+^F$+rb2GU#}!U`>ScQQ+{&9hQz1huMKt?Mb%L7u^YhF1b8ut6mNZo!*&KuR?L{7+G7&}eW4B9j0B1pzEYd8CPCc}9aX zF&vvfkpV;TxO@(LOok)gu)0HeZXV!+9s~g3E&KwYN{aBF7z76l3j8yn5XckMF&GDs zMfC>vPaPI`6h~MR!GTHuAremkkl=_;#E~3G7?8rSL{%7=;5B|Zh75h( z02U$^6+BZHu!l<4We`vV6cdbbbV)=9klJ9*!O~Pv8G^*-Kq8WHC_LVQL;>m(adks< z6}=1DuU%553DVH5USja%1S1Ed>dp27Jqs|b$ZnZ8HBM(OGJ0*A$HcUtGHcaOyXK>lG$}oyA%c!CbRaNKwC#~V}{~xu+&z9W`0Pkj2%;!d-E*|dxp_!MR=4LS) zGM?@Ba!+E%=jsGMcSQI3kF8H1&7Hry@^flt$D>PRM9(RiS^LwMsFd@M-p)?^dMxB< z$^JE4rXlO_IB|xfjX#C`W#gn(?v)j@^B;Q8D)8Cre%VNva(Q`P`$>|0WbUb@E(MsY zq(Uzvs%$^%`IyL=Gb7Mpbq|JBp#FmU}z7$s0jJ2gAPImvSSocu5B_Kqh@uY_f& zt8waidB1CCD#ES|4hf9GLQWaNRVjcMqiQ*Vx*UoYag*SNng|p*Y@UcM6~yqlDG)~} zVX@(sArvP~h-HbS0zOMBfrPQb1a3S8pBW(ukI&(v!0X9HQlW$^216kCP)Sg%h$Tw` zVHQV$qNRL3R|0WZv9X|!qr7mU`4E@S=Ov1HVu&l?u*7i?urK%$!xsX|P>hJhRuo;a zQXXGHm(PunK!Z;rxUC5ZcnMN5l*koH;)GH$D}kfr1CWnq$v`wva0Q+exT*&ws^V#A zeAu93wP+SVmxx##u7D+qhhlhuG00EMhgl5tfseCNf^jWDiVSl0>qYz;Kpw%cpw2S2;;d4(JT>oqCkU`*}}wBC3oN? z8p8!!1|4T`q{l&^g$znleu7W}Ie-riHwF?Z4(@;_4kQz>z!^3H;&5X@4;o73OT|iY zNs@(PDUcaYD1sz$U~ce<#g>A`sz3_b(0Ev?JRt{Gzk(c_%i;0)EC}d+5FRijV2RmM zxCah!DDdPWDN6)5?1ZueZXAmrqg-NO6fOyH5FJzzYPxQlt4|h^0hkDW_S(kimfi zI2ObjB*9V$f(5)(B?zEaSc+UFGItm<&=gRa3^q%i5{Rb+;td1h4U*;pL4YwaGhk*+R00yx*yd)lsp%jBui6~VfN?}CVKopS=@03PItEt<}&{~#Y*mr)}GM&li>OaYL z(JNlM26ZlR(a1*s7(Kb+i@ANgW^iApsrSZ1Nbj3Z$M~U6-E%ek=IH&$b_?&DMI+o6 z*?hj)pK<0({4(qQ0OkU%b%gDGBRS-P%s+F-yS;v>WrAAl``8NQw9nwu&TWY3*hVh$ zm?^DK?^wj>*Q-(&kgGCVg>Erd%+EjEu==~Kzp%m_)t9yG{CCqa+2WiXwx5eSZK>Pq z`~7C&%IMVT$bx-l^LHR$9J4gMTC5jSJ7V+E?+ZxNy>B8$dS1;=wc0*LK!0+(-;Lk4 zU;*#_H-~IZQA5Qt&ba=JH(w1J^7wxJbMsP{X8OgAcon9Zdq45xIJ4vofvZl8aK!a> zYFB;RTj-ND>bMnry@Gjq;m57Kk4UR+?L{3eHi6PHMm0^W@2>EiKJ5)OPp NV9FG)z!`eF{|C1ijfDUJ delta 13933 zcmb_D30M=?))GV%izu?Xz<^ajg=8{WCWB`n6HaVHxVqq&2-A+scXbI16Q-5wC}EV+s4URt3X_$&lmQdN&ndzo zN=(`n8H~785@Q$vjLf0q@+lRXDWMRwhD$K`XC9oa*Q!z}W3~|VE=;3J zjAj%%()=A|{z^b%2qQEatr4Wf8F5Ep!bB=Zt&G%`WW!`4OsbHEilrDS5yMYWz&QwI zz!*ZpIK8$=2lN>WGB3hZVVYj4G3b!+s#0N8sxX==R;#F#xXAGEKEgERI0N9AjcL}9 z0TZ#6iDqV$X<9Wy(6zN#s*s?ct4cb^T$=5N6lbGyq*GyP(KsVoOle?qhNmQDAq9FC zMk);ygAo}O9TOANJ4#ug9;a6eV>Bvlj#`r|%us70GzPWx9U(_k29;i|Givpi49J0b z!qs|%F)B}~hvf#V)AEdqMKC_cm}kInIfKcT2LUXcRvhs2tmxgvmo8A|q7^GlfHkjH zMQCyhC`=@bFsRUikxNCOGxKwZ7+#{3x_C;Rn`izhqBxf!hDpUZtnm`_3oe%s%(}`j zV@gCKVWwpinj_Un6%L0X3=SR1ST{r}A}~Y&!^IL2q6-#Ag2$>0C^5)lSxwCg9j!qd zty>qVFfvh?q}3NH3xp~qhO-rbmaFX`x@l>%Mny%~jzSy4X4KyqSZrh9*k%KV3_*Ic zH}lxPv@?!YJQ$ka&N$g@XJ$LH#bk!E4Lzl+|377D5zEjdtTv|R|u0=FC>j;%mt<``hPEScd z{{`h4jXFbLp-`vS=2H`lrJ<9w`9^9&p)x;IS0L0=N|iB0moq*XMGUt0w%xT%0J2#( zOpqF*YWB@ctTOK-@H@Cj*yP)ADTJ2-tv*$!R8h@QLl~(x8j>k}l(tZ()gT8+!u~8U zQhH%@R9Z9z4xFm!>+jzZX>C@Se|ed|!;Uh4!87OPXu*VV8@5om=Znz)WPqkQ5n2v* zLJkIWn9Luc`2zIY#ADnXp=<(j@>@h?{(vmDS%KCFW{$`NX^zM{HuMw>a$_l(6CErG ziZv{=O)rJ;XR*9QEc>4=FEkC73%WA4uPF21xT7yA7#`2!i4%POSHnv%u_ZQ0F)`z% zz=+oH2iuC3qtUD+?Vq-@IZ?E+GsnyWxS1Efoe3K|TSG3gb2ovj%Z@`c1T)>6waI9} zW*hxoP?p$4h4|*E5E7{^$a(9KAci#g?P4-%Nu8U+n3z>&pyZ22{4zNq)(IGEBk1PL|}&NwHL7&6P+74=pthYx%{BY8=CGIr@9cDC9URVHS~pl`u<4 zwq*#hIT>d1C>n}BUdu=z*ua{xSO%9N%ZNy*(xhS@%Wx8ArdqVwG5r3AF4F&}$RoqV zmfGU4+|K{Q>(Kw9+=HwI?ZLlyJ8$cCn0n5-5|~P^C29p&!V69?_27=|C4!`PSkA{9 zhMIC1Tjv9HpU7rm4{G)}%}Y8V2bQ|pSQ-*sNNTVb`22UQCiT0?Z^>Bk1Z8l@Og;YJkcNbu2J3DCB59V!LhB1{-jWX#j*gEF-FDmA6b!xEMG zpra^AW}&7JN>r=#T7!1H5zEl(bAmC`&MyRhuDwN~p70Ow616#|178R{$67&bV=(^H(Xpu|`Z3;v*Sx*%=X~oQd#VfLOYvU;xi6IM9YcQ&SQjZ76gQ;^Yv@s=?qgEM< z3WHhtH*3@^IL_?xCMIN1X*Dxp_K9XDxCXX53goUBCLr;^G+GT-OhFl=G^!0)p|VJ? zHZTgvW159F3NW`Cn`p}+D`=+85n96dQFcdl=(zk;W1%n!8hcQuqK*cHEiqvVuM~8l z#RQZ4f%Bl0g|03oE7xWX)^?6__w(1cS@8ctBe@7qK2OGXwSNfU%uf}fJ=f>Ui_m@ueRI-mCVjQAcd=?yZYkcwx@h zf&N`aBsyeaL$`&5hRk189$iM~D9c-XG$A2AZ1zK@vy-biPKSF4hmiIIz)_svRio4zHiwB~n*rwcoe-FHFPWotvLxSHonD`!uA z6yK|cc5{!bahqAGahzJ+A@0wu4^^DG+?VAvQ zS9d!TnKSlfR^o=bZ%>uy2jC@#uj?wi1YbIrwesntJb_e~7}<-Dg;zG^vC(le^n8A+$v0-a=zT9Taa z<20jkYo8HONn5(!pe60vcm%b&>EPFDwsMPF z;9W~qbK73fzjNT{mfmg`KK!L7JJh{8ZPmvs>vvbHE;u{9Sb6JoKnCW%f?IqcXcTzA;F{(kL(0ZB|N+-v{5eYd_tMvu?;2ADD@FTOtJ^}h=q zzbqg6Rn_Z8)z8Twf*-G1ou0bq*!lL?b*-bW)=auO=AK*acY{{u zU3({<-uBQHbJN%P9k@CF=f=2(9FLb#k3)VNk}i7qc<0I;tNq;Xo{6sfNmM#QHF@IJ z{VRS@e0plrtJm7|y)VQ(7@c-#{r1QG#}+$D&m5mzIsG*`YEw_)t$VlM{CmukIK%ak z@{M0k(5%=qXZfj<@7&&)`)I|y*9B$QYi|urZmddw;`BT;g5IO~a%aCokA|Mw?@%~> z|6zq;llj{Y*I= zMB%(OKh?Y%YnJ8^!P=F7eJQf|7xTic&* zRHlsyy)f_B-7EHnm%jFjbN}`Cw7DG?ZAcuS;*Wpgir4k1npJYXL)eSfeyP9Qn6~7_ zMIYbdYyC@A1y?T49r1PH^y;DWj@_-TGEJQ0@$2jcS+?uH^c(xR?jGjbt>TiSV8hKP zn+JdUbBb^1-u{`RqA#!8?J>vctF4Fnk38#SI-YlnE;?a;{}(~u+G2VCnuMz{V-+mg<^eoJwZ-yHe)kYJn7qs2k8xn<+m-s@Pl z8O!}RH7jl9*>W;HzeDjr-87dv&-))524$?&BapiWK;dij^@aIrM>qX8RTEG3?y4RB(+Wode_ayew z*Wb~uyGsohuFMG3G+z7pp=aL1$-eYV?V0OcFK+id^T#XM;I6 z{o--{q7{V?(|4UWtj$^VYs;>5RgjWb zU!OR!^(v2bJO3CqGCJ5PB=lX6J>Ew`C^KADgj^WfqxRNZoGc|X?e}< zz|ZGR4HfUKX+L04ga40D%j4_6$ny`LcFl3nCC}iOfmG_d9&?A7PGcRja*ppG@`@HW zt`p`QTzfn8_dO35T*S9O8a`^$_K}-==GK-zzxRf$&9r%Er=Po8k??_Rk9co);!kSgpSneRs!Jzr{j8x_zvF}3Cn`>j5#Fkbne=+% z@n?@e@@^ZyY;$gH%fa^Ebkul(+XYS-@9-;5kh4_Gz#(Us}&5mTXXh**WbF0Hn#F!gez|veUB&zB>(*w>4pZKCke-@U8g~5LkwY6^UET4< zd5#0wlSu=c(we3s6IF7}NicMeO<&Fscsq+pDN5;gjII>m4j$IyT=T&flfjx+trZZc z6LxN`;QhPJ#i+SDV^H9fG#itO=QD?zZr_?h$W18a?pibp=cUQG8`~EQot{k85M|I;ERwjiV%S! z2?Zi6!OCt6uC6^91Ghh{#{`*)Lxe*p zO|CHyET$mQ7B$WHa_Vn7;pG(KLWJTWauFUF?qcfi?Gzalrq3DQ7oC@*qk1^g!qB^N zoVLi=KQIu(N(u`!hQ4reWoqzt^6CcprYX-Nq87~hqi`#e5vWauai$48_x_k zyv!IW(XoJA(if(Ku7on&RNl?WpXGl^c8wpcHs}hJrO{dyQ)n|+e%QSlI1XjG zf97IHW(qZ4n5v!(T|QDS%z$%LxY7cSMaWz(LcOFEA=8y(`bzK|ogJnyHHJC`m>S@J zf>9W%qdU_QiCrBnJzq;Kaqv0X_MA)hN5n&6I%eL-P<5lNG zkOs^fmDxM`=e?~rcps<}xwH+ejG0Z#TIW{kb`1>q@lK~3(?iZ4j6VAHombssuf2aJ zu(6lh(jyoB@rS*yEqLE8sb)q@BR*(|Vr;A7N7nVobU#`xtUUCBN5=D1+^H)U=Y4|u=ATE9Bra2abM2=Ix-JX#%S6MC_ovVFULV|zvqd^b8m zvNM2gH3#!5ju70RQ!;l}|Anm+7QPd#a}ftPK8x&Cc_93v+ueoEmvrshRV&GsBXlkG zH+;Ih*HPCcDYD%!htxr{1*GF4o!1WsN`q#OD{0p~xgC}4;$7|Nne61f+CBeg_q0Rl zI|ZiI?KVe*T$$Zj*Y#m_;Z7&lWVcB-9Ilj4X=v?7M|RsbkdQ=l4x2Ol&WxU?+nxG3 z*m$t*otc^^ulH}eJN3KQ4dbRfN!(lKT$T9Bvtq!JpFYUE-cV003h7a??_x;1ppKda z@qcQ3-n6(QL04_xf9LzId*%;2CJ&V+J_y-DP7lZ1mO7K!Ze5IsU+ zUj5j3+Pcz3aD$B566_rTM7S_94~*b}NqAt89HVV#rGey^$n1a!Cg*`!_N;XqG$|DIZF3w31Z%Vh%k>Navn(_b>~b7X*w6iBM2no_IR`i0*pOSMDj=i?v{(kk_2R6J|vGI zB#$5pMi82{7hyO=F%A(0k0c7NBq9ZmAmEm{^RWeK(m(iqE+UU45S;Aspa$fDaRtFe zTtRReA`y2&t|T}_F)kik60`Pk5myi>NqNSa1)-Z=A$V%Ig32KRH#xa59!cQ#Hy4jb z5IB`%;hFW1!|gK`kP!ukY={fvkpzylICyZ;hzsKpL`?HYBIc0AyOoa=xm4sm$4l%iSJc3xmJKdaq;}V|5#S`Bld*l+~ ziSOu!4~H51@Q(D4^Tc&F@Wgj?g^I&8Pke_2mj};Y5VQZWMTGXP1YH(DpQh>uU?jTJ z&W4GhxoMyALJ5LHz_P=WN)&ckHQ>o%M~E2uO+?^NRiq%X?O>^bw9n_^%06oI+Tal) zTx4H_5MsFkR=O>on1sD;h2=5%9{~+ibQuYKnwTL75ZF!&2*xh4jCv*frH7vRBP>fV zg#3#Ji0NLaQ%|P#G2DE;1o}IAqq#PQX-Sb7{