Merge mozilla-central to autoland. CLOSED TREE
authorDorel Luca <dluca@mozilla.com>
Wed, 16 Jan 2019 00:22:00 +0200
changeset 513980 903466ee22ee9019b7c26f978fc8b676f12339fb
parent 513979 d94c4b92b44b313a48c3581d6804950f1235b7cb (current diff)
parent 513941 2bf2c209f520c75405b70ed5a5a12c2a8938dffe (diff)
child 513981 b9a450416f051fa67283158076231a1ead46ba1d
push id1953
push userffxbld-merge
push dateMon, 11 Mar 2019 12:10:20 +0000
treeherdermozilla-release@9c35dcbaa899 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
milestone66.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Merge mozilla-central to autoland. CLOSED TREE
gfx/wr/webrender/src/prim_store/text_run.rs
gfx/wr/wrench/reftests/text/raster-space-snap-ref.yaml
gfx/wr/wrench/reftests/text/raster-space-snap.yaml
--- a/gfx/wr/webrender/res/ps_text_run.glsl
+++ b/gfx/wr/webrender/res/ps_text_run.glsl
@@ -58,29 +58,33 @@ struct TextRun {
 
 TextRun fetch_text_run(int address) {
     vec4 data[3] = fetch_from_gpu_cache_3(address);
     return TextRun(data[0], data[1], data[2].xy);
 }
 
 VertexInfo write_text_vertex(RectWithSize local_clip_rect,
                              float z,
-                             bool should_snap,
                              Transform transform,
                              PictureTask task,
                              vec2 text_offset,
                              vec2 glyph_offset,
                              RectWithSize glyph_rect,
                              vec2 snap_bias) {
     // The offset to snap the glyph rect to a device pixel
     vec2 snap_offset = vec2(0.0);
     mat2 local_transform;
 
+#ifdef WR_FEATURE_GLYPH_TRANSFORM
+    bool remove_subpx_offset = true;
+#else
+    bool remove_subpx_offset = transform.is_axis_aligned;
+#endif
     // Compute the snapping offset only if the scroll node transform is axis-aligned.
-    if (should_snap) {
+    if (remove_subpx_offset) {
         // Transform from local space to device space.
         float device_scale = task.common_data.device_pixel_scale / transform.m[3].w;
         mat2 device_transform = mat2(transform.m) * device_scale;
 
         // Ensure the transformed text offset does not contain a subpixel translation
         // such that glyph snapping is stable for equivalent glyph subpixel positions.
         vec2 device_text_pos = device_transform * text_offset + transform.m[3].xy * device_scale;
         snap_offset = floor(device_text_pos + 0.5) - device_text_pos;
@@ -169,28 +173,23 @@ void main(void) {
 #ifdef WR_FEATURE_GLYPH_TRANSFORM
     // Transform from local space to glyph space.
     mat2 glyph_transform = mat2(transform.m) * task.common_data.device_pixel_scale;
 
     // Compute the glyph rect in glyph space.
     RectWithSize glyph_rect = RectWithSize(res.offset + glyph_transform * (text.offset + glyph.offset),
                                            res.uv_rect.zw - res.uv_rect.xy);
 
-    // Since the glyph is pre-transformed, snapping is both forced and does not depend on the transform.
-    bool should_snap = true;
 #else
     // Scale from glyph space to local space.
     float scale = res.scale / task.common_data.device_pixel_scale;
 
     // Compute the glyph rect in local space.
     RectWithSize glyph_rect = RectWithSize(scale * res.offset + text.offset + glyph.offset,
                                            scale * (res.uv_rect.zw - res.uv_rect.xy));
-
-    // Check if the primitive is actually safe to snap.
-    bool should_snap = ph.user_data.x != 0;
 #endif
 
     vec2 snap_bias;
     // In subpixel mode, the subpixel offset has already been
     // accounted for while rasterizing the glyph. However, we
     // must still round with a subpixel bias rather than rounding
     // to the nearest whole pixel, depending on subpixel direciton.
     switch (subpx_dir) {
@@ -210,17 +209,16 @@ void main(void) {
             break;
         case SUBPX_DIR_MIXED:
             snap_bias = vec2(0.125);
             break;
     }
 
     VertexInfo vi = write_text_vertex(ph.local_clip_rect,
                                       ph.z,
-                                      should_snap,
                                       transform,
                                       task,
                                       text.offset,
                                       glyph.offset,
                                       glyph_rect,
                                       snap_bias);
     glyph_rect.p0 += vi.snap_offset;
 
--- a/gfx/wr/webrender/src/batch.rs
+++ b/gfx/wr/webrender/src/batch.rs
@@ -824,17 +824,17 @@ impl AlphaBatchBuilder {
                             GlyphFormat::ColorBitmap => {
                                 (
                                     BlendMode::PremultipliedAlpha,
                                     ShaderColorMode::ColorBitmap,
                                 )
                             }
                         };
 
-                        let prim_header_index = prim_headers.push(&prim_header, z_id, [run.should_snap as i32, 0, 0]);
+                        let prim_header_index = prim_headers.push(&prim_header, z_id, [0; 3]);
                         let key = BatchKey::new(kind, blend_mode, textures);
                         let base_instance = GlyphInstance::new(
                             prim_header_index,
                         );
                         let batch = alpha_batch_list.set_params_and_get_batch(
                             key,
                             bounding_rect,
                             z_id,
--- a/gfx/wr/webrender/src/prim_store/text_run.rs
+++ b/gfx/wr/webrender/src/prim_store/text_run.rs
@@ -58,17 +58,16 @@ impl AsInstanceKind<TextRunDataHandle> f
         &self,
         data_handle: TextRunDataHandle,
         prim_store: &mut PrimitiveStore,
     ) -> PrimitiveInstanceKind {
         let run_index = prim_store.text_runs.push(TextRunPrimitive {
             used_font: self.font.clone(),
             glyph_keys_range: storage::Range::empty(),
             shadow: self.shadow,
-            should_snap: true,
         });
 
         PrimitiveInstanceKind::TextRun{ data_handle, run_index }
     }
 }
 
 #[cfg_attr(feature = "capture", derive(Serialize))]
 #[cfg_attr(feature = "replay", derive(Deserialize))]
@@ -219,17 +218,16 @@ impl IsVisible for TextRun {
     }
 }
 
 #[derive(Debug)]
 pub struct TextRunPrimitive {
     pub used_font: FontInstance,
     pub glyph_keys_range: storage::Range<GlyphKey>,
     pub shadow: bool,
-    pub should_snap: bool,
 }
 
 impl TextRunPrimitive {
     pub fn update_font_instance(
         &mut self,
         specified_font: &FontInstance,
         device_pixel_scale: DevicePixelScale,
         transform: &LayoutToWorldTransform,
@@ -255,21 +253,16 @@ impl TextRunPrimitive {
         // Get the font transform matrix (skew / scale) from the complete transform.
         let font_transform = if transform_glyphs {
             // Quantize the transform to minimize thrashing of the glyph cache.
             FontTransform::from(transform).quantize()
         } else {
             FontTransform::identity()
         };
 
-        // We can snap only if the transform is axis-aligned and in screen-space.
-        self.should_snap =
-            transform.preserves_2d_axis_alignment() &&
-            raster_space == RasterSpace::Screen;
-
         // If the transform or device size is different, then the caller of
         // this method needs to know to rebuild the glyphs.
         let cache_dirty =
             self.used_font.transform != font_transform ||
             self.used_font.size != device_font_size;
 
         // Construct used font instance from the specified font instance
         self.used_font = FontInstance {
index e9b2cab05f4a13ce21acd745e41c417805d920ec..895d42eaf5ce4f7ff138f2fdd88893553a658ec6
GIT binary patch
literal 19504
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
KSK6Tq*Z&v5@gbK0
deleted file mode 100644
--- a/gfx/wr/wrench/reftests/text/raster-space-snap-ref.yaml
+++ /dev/null
@@ -1,10 +0,0 @@
-root:
-  items:
-    - type: stacking-context
-      bounds: [0, 0, 480, 80]
-      raster-space: screen
-      items:
-      - text: "a Bcd Efgh Ijklm Nopqrs Tuvwxyz"
-        origin: 20.5 50
-        size: 20
-        font: "FreeSans.ttf"
deleted file mode 100644
--- a/gfx/wr/wrench/reftests/text/raster-space-snap.yaml
+++ /dev/null
@@ -1,10 +0,0 @@
-root:
-  items:
-    - type: stacking-context
-      bounds: [0, 0, 480, 80]
-      raster-space: local(1.0)
-      items:
-      - text: "a Bcd Efgh Ijklm Nopqrs Tuvwxyz"
-        origin: 20.5 50
-        size: 20
-        font: "FreeSans.ttf"
--- a/gfx/wr/wrench/reftests/text/reftest.list
+++ b/gfx/wr/wrench/reftests/text/reftest.list
@@ -63,9 +63,8 @@ fuzzy(1,113) platform(linux) == raster-s
 != allow-subpixel.yaml allow-subpixel-ref.yaml
 == bg-color.yaml bg-color-ref.yaml
 != large-glyphs.yaml blank.yaml
 == snap-text-offset.yaml snap-text-offset-ref.yaml
 == shadow-border.yaml shadow-solid-ref.yaml
 == shadow-image.yaml shadow-solid-ref.yaml
 options(disable-aa) == snap-clip.yaml snap-clip-ref.yaml
 platform(linux) == perspective-clip.yaml perspective-clip.png
-options(disable-subpixel) != raster-space-snap.yaml raster-space-snap-ref.yaml
index a3cb79b38f1d600e9ad6df328c2c601135e5c1af..1dae24cb84d0722edcab962971b69819ab5be985
GIT binary patch
literal 11350
zc$~FbRZ|=ckPN}y-JONS2^QQvNN{JdB)Gf#!r~TWad!(4+=IIY*DUT1_x*%>xSOh(
ze(IO$nW~<uiB?yW$3!DT`|#ldrlNw3=6|^VU&^2${Z|8`uZ%x@08%Q-NPhLoKJ|O_
z{i@x5_WMV!CTRr^wk4AasyWIvj+}EIWu11mf#`<V;a}hP%;$dZ+_iO&HTk9m9d%p=
z793J|6u1xx6iYSMYxUHx#RtDPn%M_PvL(Kpx!yh3RabN_T~wbxZ#Y&vR#T?7e&Dm6
z=K7JBs2Liej}(_e#y8GmTQr|%o+e3OjD*>UK?e9_n_)GrP%haI43$&DB(o;v)BHZo
zHTHi)*-lTsBG&m0FN^!08Iie~UH-Szsrxn%P;&olc=M=r@eVc`uuHTj+B!^58Z6YH
zA^1p#dwV|xms-07FGp|2^+7nN70|=KVj_q!VDVi@%tk2f@SM8ub@83iOgvg_MLh8+
z8QLue^#rw_;lEx6NO1(<%}YwvgiQwiQ0IUFXo&;0(!z{VocV)X*5krV0_k7;G&M5|
z3ng@kx%i5bt`GSn2TO}Sw6#gdA(`=mvpyy#2MrgR1c;mQluzk%2<caQawbsRYrUrj
zfpUL-L_!Web1?HWvehD)+W&}#HvdI<wH6MN4w(RNqTUU1yJk1djG#=fpkiQGHfSPy
zdrSBTo7I;!ye-numY3#InVCu4QvRkKnM7)6m_KLu7f4v93`-&I#`iqF6_{O_qGtrp
z;$~$9)5`~qrNcqb*Whq~yp++s7s(7j035&FhcqCZrq;p}!(1jWY+(smFbC$E#>Sy@
zT>qw$=X_rJ#tBCm3)x&oq4<o{)KU>)*ow2<f|(&sU1vaT2SsovMEUUgD&bgL5hx5<
z!`wTp+$$8TF@}f1=D&<8<t#0JTv(`>1ROh}KFM;G!OFX+TD>$<b1aQI$@JRrM*e8n
zOuVDLWS9sgUfeqdLBA+XD!2{YZz8KfbtttkqT(&XN~EVzQRGBfGeh(7rzQWDx&0lc
z)<x}KQAyEVH3)uvUa0Iep5(h^Hw-rZ9W<)coLk2E=1+W*;lI&^>G$;S{#g8W9((D%
zcuP<5tx!JregnS7NMo3l0{FJ0T#?MkD7q|$dN;Q6_~N}afa=b_H?FIVXt#lpl3JeF
zl@I52t@=r!9^yq6c%W}K$3(-cwYnEPdJD?SX${HGJ^G9RyU8h_8=zi86?rNn6HzTe
zu5E;VgdIiR7?{+&y<s9eKNe;4YYqA1N6GD=AnrzC#M5uA7jii2r;XvtN#VtB3ejMx
zkbL~HI0DC34wxRM=koX)vOO1{w|1W&TcY8~L}%zp({U^`K%^s8Z(zp7I(v@)lJ;&c
zj;fiI(6PFPtEwz-ImaIs_zS)M5xv`#x?rQT$0HDfZ--BF2!lyRr$+XnEgi?$0A7&7
z^NE1sVOuPk`ZyiLxSb*FMD+K!Zgcnq6THz&+d2#;fgqGEjJVGkn1)3ZKZH|m0=eMj
zq-k&lH$`sPwbB!V4!^*BnO^id5%i!%mJ)%__JBY?FNB#Lo-j|b@R9z{xSXsJlNKQ}
zMG9@UrPTJ&(+%|diqBe<PdIZpv`eu*#_cx{Y_@jarstrGYX!w=Qbl3mp=lhtU@o~%
zpWDM!lQ0fG+6_h|V(_08wCe*n*TaC{mIcTtHnIjkjqr}x<%*X3M=)FHcK1v&?gMEQ
zg)-Byr(mU9`i}@ND~wz#7$Z)yiCOsaE-`dDN(PYA8I5xF?I6Jbih3$+Cd$l<6vv=a
zJJFYK-drnjH?qxL^sMl~ZYHCdAJz(Dqru(bxYh{ASlIA~lW>vP^cybdT6Jc1ZiMZ`
zr#)Ui00J;6$FGo(7eOO{28oj{6t%h0|IYn>(3dyZ{ok^^eUA+kjyixPhuQjzl-D{_
z7}STTesr+GzdyW@tMi)a2D20=nw3Pql`1FeEogg|FzR#iKC1xd=NLCn3Zh83m_JeH
zx2mMx^`@&i&;onZG?4dd5LCQ~E#y?)Bgtio>fg)EHg_zsPQJ~nD@obk5Oo8h6GdT5
z8yPF$p=ZvYyu02OZ$=3ruXT3fXEV~#KH-jsoco7Z;;{{5X1FJuoYtDN4IjdQA6&=9
zoHOqPowm=qJyXn#U{?vchJpS>N9M_P6plb4BvWN-3wqFZAzb|({S}x?^w_W?0R#Pn
z0Mr^Bk|cy{$MSC|X%RcY=ZHG0*}W&(D45rZb2}Eq_7qa?WFV!dDHwtYmQy#PgIN_z
z{TWwJk3tZ@vUPF}f0Eyhw%Lw#z?}3V&YL<9<CTqM1cR2<@g<x`QO3JyS;RQG7?C7)
zr|Sj5yuz~}Qod#WQheIudkIRXxey^kY50O1Q4&<4X<LI}&>NvGrE=&-(QqH4v)vlb
zz)Lo_9y3yYEc!Z^r@23@-%iK9pCTg|?0-!KUB?_11ZW~7LD_WYMOwP3>L(o##sNpr
z-&CF8mi|MI5J}=t-wWX@&Vbmx16P#Zuph;rHPWA1Yr@BH;*Qmmwxv(|B)?AG(tp~7
z^Vew?wuS}y&jtK9H={J;#U)FXFz{5Y6z4ql@dX|h+xf(Qin*WBS#_Loh4kawPMCx~
z73ex?{KDvpBGgwC*O{Um8buV_Bgix##|zHs&GE>OLxDja0k=~<BVR`UJOe?*ykzcw
zeCFBqE#86s^>u0%z<IXbdLF1{f|VJxX6eR)<ixu58aPtxL0>GW`qp*mbq+5MO+k(N
zz5~5U9s)aebTfy|$(M5NpwbaxjM?CZBGML8YIG`+8I-<z0OZ%5MQ(<}uM4~^WI6dU
z0)k?vHszYC@vB?Hm!WU0chCF<{y;>ILSn;N&fR|<yk)@Lpk@oKlw#$1{S2(_%aKf;
zfE@;@b@<k5&f(IhP4mDhye91BBL9{uZ1bfntgjKAJ*ys=O3<?Yu-u4zGrLH{Hs8^>
zpD}2+0*JX-!XM(4>0>f^Tp9`eaRnf&RD-_KS<c10vK;+7OEMR;En-!C0(9l4Xeqf4
z3(+K*<p^1-?lfl-F530BiS2s=s5$GHX@@S4<D^?)&LDK+9#Y;NbTf5m_%*~Jo6Aws
zMueKk7)AT3a`|L4p647f?3Rdc@3b%LY00UiTkpwKTM0RLLNr+Qk$nWH8e)Da<=m*G
z0`+F)){l}Q@E<7~y9rXunkF7|V*b^tm-@Tu>#L}i1nm*doWeiq>;Xbu_Khz-nDP<C
zpaDn8#A@o#jg#9mLaICuKM&HS$}13JV!nppG7#8&8g)NTYtPD>2ApQ3m8>SXa1-z0
zMc-NEdfiqS#JBJ1c|osSRP53N7*?}1Y7Yb}Mqid++{i|$0ile%kGh%cfkFU8z2x4K
zM;{D%ES2r6MA`?38yaCAh?7dZxhs~idpJpE11*;9lZb!3*sz(L@pQ|a&FIJ}Rujp=
zHvO8zNzPx0P9V|Wc3crlv555p?E2*uv>(p=DYwT#)rQ)`I9P=gB0&$#&$!>u2kqqv
z?`%3EUN<mpsa<+fiH6gP3%yqTF;c6k%ZqN%q-R;^ga<I?Qc(zi0=g64zwDFAnT;YE
z#yurUi_J3)!Pz`6k3VhzD}q1Yc{adjeW_IG<IK98cf0%Ehjk5y(hQ#h5v?rs+^K?F
zH}ZsW>66D0fu=PMUSD;Tgb3D+{bN#5g@xz$7nq?6hcWT7qb2PrALsv351EKWAJ_uy
zls=GSl-7NI<4=>Br2Wpd`}L~-!S&=*Hc71vUx``t<BtxrH|7@oFEnh@K+j6z@^+(6
zgEPTV(j4Baa;=_XWf+DicRs|Bre?0vWiBHn{Rz)IJ&8R)D}L@))+SSJG#Hi7KzG-E
zms(w*3$H()A%*1gWzjwj)h`OEZ>uOO#fa*Q)v0Zir&R+563Xa%O!NX)Bz$;b1pWhr
zIb<YdUyv5GD}x5X#W|^sm@Y&qGIu`vqN9N0gp_Q5Kw*Z4G%jVk``k?hwuN*6n@6{0
z&+H+a8K;vZ_tDA#{GfkgQeK=~B<QI9pntlaDGVzhc=^^^MFwcAv=%gVi@p8i6k)`(
zzhBO8+NRme_^MG04&*GwXhzYL1J_U8VBE=h6nsiS{`CiZdYA0QamP=D*d6lco21<z
zo-NPrPzNhai~vpy=xOBHu0P5zkNnTxaB3;t5xZ&jN0{vi*#!MDH#&Cz0?DmZ3!s;9
zZ7(r4*0euULZU2W_$Z`-bg|Ml_~cCOlxz8>g4jNhgg&8kp(B*=PFt}R4AD*vw!4HF
z$Ft5gJB$=+fmH0lBKoDQmDKSO_xV>>hIQT!p$O^zCGEH~S^G?xM*7p-GM2g?Vo3fI
znnyVv`q1R^lVr7}rTd)BBsR2e&KQ1wfLNnQFm_>lq4#&JlP7?klTkvu!Ok;YeQOBP
zHBv`;M+k2(<1CRfg#aT!;0t9CxwJak74BLG;V3A+Pdx(}bZCDhE{;(AmLc4aGB9U!
z6$6Wn@_LQJilZZn8Oc=8Z^nC~Tr<-%K=k(^a~t|LNfuv;1*O@~7k+r|u$^Zgr0S<u
zC$1QDVjyK)G!e<X5%Q3`E8toN-r^X3Mck(~2d9piN2&BW!IW9#yMkPH+sUdlHE~>v
z>8%@RcCgD`R3Cc(>X%o9IZUu-qLZmngw|{~VF+F_lzvBEHL-l2F+-?#hAxwk;$ex#
zII%!D{ApoT@qv}Pp)|!ABDuc&km4@{J&C(vy+z3Zc3fr2<DotN$w|%s#`A-@Wnf?E
z-k^@O9(N)`eID84erS%QCcP_NLMZa?E{wE-Ve(XPXy^+;OgjWOi8Qg4zs#1qu}8Z)
zQ8r#8Qd$n{1>O)0N?o>G5b7E4g*_s~WdhFi5&Do+4$|nmtl903)A~{gq=v$$5^h$W
z&2A_Za==63oCVy^<`|@n<^tjMTpoy@bl+oMN<z8*(M9P1CGvbe$<2*frQF4A3GHLj
z5)tx5Q;ao~VYKW38GgqpxB~X-_<{<y3^l2Q8FFHaC<I!a?0e^ISprdwhb)e6&_?6z
z_12!CES(orz&G5se!*rt_91j4bC#bm+_hM6jwCY@DDCr>8I`PN>|>$4>#_5E`)dUF
zbb4I6Td|DRb;~n8Dpa2%&uRo~jw+pjkIwUvI)!stAHm!)te)8X^4NuT7fs`@wV6b_
zb=&5ClmugvIU$2W@Ls~FC^|R(7_aK$el03tMC{?_b3R2WtqC)agtL%<4`U0pdFaTv
zoIokdOCAKYLvy~QutX2e4&Be(3mcJM3}_%p{v>{O`Bey^Lgi>Az3RHGb{Sg;geNB@
z*O?ENZXSQ@o|<CL95c&&VcSb+hejcxG;F1U<d)&GFJ)?sdI$@5A|Kikz6RKtQbq>&
z$(-rRRHoDFb)oFa2}Fp}#+sf=ZCMi+;KLoQm)A`}L+9P#jo2}r_@R*+oRACF1OKJF
zLJgJMINHTk4qXNe;nyLNY~_uZ-EHj(6IJf7smL^66e_Bmib#s$ykY@F#ItIiL%!6l
zj+#nQ<xpk7{1SZNE1N|rITu+&q1dxfhxr5jq!$_^AoJ~VIdK38c(hK1pYi8H+1Ej@
zbEMw!y{BECjV3Clc%C)UvKe*eo)g+F1CR||O#_Y$9P>T<qG>Cm&V;-bveKg)`nb|!
zDF^?$I`+<7ei8v(I~AO0XV=;5+9>%Vuxb9RFW$vWF?mLiV+@II_}-Li->+@V_*0&D
z`mniIz)D7Crr%beH_;)SZ7nQBYW-eooK!)mYO1HLjdRCo2;KG)T^^5@^3UbbGSyd;
z75K3|t`fA-nNG9MT`fynPhME<!xSXg8GA0!&olhLFw6C=Ee~OW&H)00doExIdx)CX
zJMB$pAcc*=-v_Cc81#b$Tl7Q4N6aU|zYxHl{92;$Ot=>if(v32c9SJR1;1#Fh}YVp
zHR~@Wu6f|~cS?FCV4itpfnE1wN?fimDr&mH9dGD$dW15ghak&d;ieVh0`KLxwNsxP
zPnBK)hC7@AyFYvkor0)?S!mpj${b3>1_`;e|J|8%c}__ASsHgka^;+gqXE=p_CM-|
zAJ5CO^g?O7G28Stsxm)^wFN7q7&%7TEF;v45z2Y;@PJRtoZJc<uC)l<15itM;L*^x
zs|_M+ZWwLvtao+NNk#2LGN{D+-ne2TS~1EHGbP8fzRP%TI$M&+<FZ#u*gU2=+KXEU
zJBlEcn6&4^4ZLVIn8r7gh|U1DYo#0=bd8b{zE!T%hByeR8&=jN42D%hZpAKp6#f9H
zZ*P0Z9sS}{N=0RpQruv^iJAwfsG1uvDX=%~oz*M(-4k_RH5~JJU#lz6#}PD7+P~r<
z`9YMRcD}H2#k%4Q^%U|xpJ7?M(<inV(b8$C5d{A6J?0A&e?Eu-^&5cOPJgTS{8Eg_
zIFPzMk+vz5&1t-j@HUvRm2f0nz(V>f_lQWZ8F$bymq#g8n>X5GO=q%&l75OUf@d<%
z>~ffxKL>=M8*=Y9we9jt`5@&7QSA2qO{kvx^?99Ja}Q`_7%*l{fm$=TpeUIXh2Q5s
zAZ(JLd9p}mFQ<1Z+&b&dGw651Et#OS{lQ~~*?n;Tr=D7bm{1tx7o_lPh{7)<XSU7K
zP--fM&c&VEaCH}-E1a2;HpGXVi4ZwNBQym(jK%mzn(N-v!c8WDKQ~4Zghr4>=wO2a
z#?-C1-!rbdTj;gFGauIuVY|~7Bs731cj37`&vD`69X3c|+Ce83+8Sf3%8X8XRwt~1
z#wCAISv2o{E9x`5DAmu*WoUv$%iqb}rIoq49Mag}S7%8n24t34<ox7Rq=4p_OoEi$
zDXTv94lq}{i!=H9S*E$5w0W{@NKKEoDdH*<FBer44F#@fjG2sahU$*OD5+d{Gkj&g
zsfF`{NI?q&U&i9Dm)Ya57UDMk(~2;eJlx9SJd0pcXqbc%5L_5TK_7~3FG=krIN!<r
z#P=H7Sj@HS5AsO5@(?hfSXfTK7O(g8<2CRJ*VsYRq%^lYinO{}QhnsE@Kk1oMy+i(
z$=Cl~k0^a{G+($Vy(r!T1x`}eJ5~`@`}3FAMJ_(n{l1}K^~I+3Ys5VCb-g^BCd$qz
z8`9%LRrC?(nE*Mh(oL5#(4M%_S~T>g6%AjJ$)5EB^=PuESoesAvecB~#jxGO0|#<P
z8f{M$k|(>ntkK>Zu2>f#)Ir-r+J5W%1IX~l8i&T=xlTx}T0g&$$^QKGLArr*W{(eH
zLXAZZo`^&9VlNr?hD{lS72&8r`u0Hcv>_D3yQDRrIolwY1Aq^4%LXKeY~}#$y^qw<
zxKDm584I5{TME87A-9{|V$zTZ<Zq^MHYoq9iwY59!fuHaAH?tV)W~z&Zt)hw+NPb4
zT*~A9iB6}A>jFaXk=dSO9ODaau-PZA^9ZHF7N_G+NsDs%)~D~@H_4kg+o_#&r5^a{
zNp2uXcYxWmLQwouT))t2aO+a!j2_R^tq@O{;BB&AmC;aPey1L(cxWB~)fD#qQnram
zfUX#2aIozc4;FERxf~AMU<7Sw#=jeYLQ4#&d2dbchX^{T2mEyTJv*~%z-vB#)kGYD
zxx=N6DwdSH=1YGNH!=N;W!oja6@Gx5O-U2j%I+~RJ+q-1nO#x&t0u(0Z-PovX+~D(
zXT?_zEv@0zX>*R@Z^za~P+-DoIwSU0^n=OCMOUPr5*gM(7sS7iyqj_VfXidaNBvtn
z+`BzCtlMR)8vWXNGMSSAw_jwJeSV7~X1tS&(9-;Sucpf0r0o2ejASC!r%x6wxrK6n
zd=szKx4SEf?1+^)l0)1p3%y=1C99kTq?Z<guZeFTeEW?kPFZ>_^~NuT9IC!f7W6rx
z->D!=T@!-}TJZw1$Vpdxstl?*5-n-eog!1}zhGNj<;2hUPk`BmiUkh>$ZoaRW`r!0
zXF6B|5wiLt)fe5rCS4gkAyF)z_bj}*sUXS*oJ19hxKez|Pi8q44_6-#8rq8!BsWHi
zpMooO_;{R(@5TQ@gr?#zXtNd-PanV4(2cR(3K!l22Xx+$YO5w^VvId=V&afvb@rz-
zoqQp@Cir$3N&PmoC?|Ov^!{9=Qm(Bi#PCGPtqf%uMK5IP#6%Z`_AmP5Q`Y-sH{10r
zTo{!%QW!(W(*^#?n4FFb*o^iI?$-8s4RD0A`dbDUN<)If+9~vDZ0_p;=q{S@dTDcP
zp??O?F#JSQP>n?@R>c;B3KY;)W`eSFe5;CEPmCffX%juwGJ5COCS$V%DlOfjB>v1*
z`AKR%rQe{h9*J@PR?K|vuJdftnM^Sv0<vC$N}u`oo8Bn_xyQC1z`^12z@Ga0?--D*
zgdgOCh3%ma>wBNMO7)ys?wik(Ty_aOYKesu7e9P_6NCsbnNJ;N3a$aAvPYH<G7al_
z+$f3@$(^iM%#4~bp0q#J5m?cS4oAIwbl(kc3pe`pN}ySTvVA-JR9CW0FVNK0ZryJf
z$?LqAgpMCTiN@})M=2VN*b7!rh4g;y{O}ZaYzE|%GH4-nMI+1{=2231B5tWf7xcoJ
z@!SaQ{>Q%>yDymWN+y==gD~+5s9W1vR$m0K_ja2rf>G2h0E=9Qq~2=Y?V`xRc~~o%
z+;%|x$C`V}amS6w@-kdgYjJSkP_9(+F#D!g1-H?_IsG}!91jEp8NSdrqi<)@H2);4
zkthnWaz)bEqln-plGzM{k1GtfJ^9m9Hr0cv-}ZO2)6l_EIkQW8RC;p)fc?0b7ud()
z`A1hfcE|J2t=`5JR@FND5m(Aqov#3v3YsA#3Nzj7!<aMG4@}Gp#=~trJ9vi&mvCMH
zi_5dRmS9lKjk#o{V(fFAE!jl>N)5$Lte!b9`e$Mlx=l)n-@`z7v0+ww>KDA?U?xEj
zsDZtPqszs9IQl}#EiOi4pMaV7*uq6cIsJG`L9>W+n*YTQr;&l%SMi@w#biohbL+y7
zWaV&oZ4;4m;jjhOcjC0kEL#tb;YiZ=h*$a_)1Pc5BL=~gPyJrA-SP*SexdtV0Apv7
zCO?wjhuKo8w@el~pE)oOcl+6_9<Jn=B8D-Y20BKtJn2NmXfP8*bhG0**ks-;h?Uqd
zuDCvH%gB*!F;ArQ=^a-vUp!fCOWetku>1VY9v@_0QqovT357_Kk86lG6o`(*-i-W8
zO9Ia(v~(Z{Eo8D}+DPfQxg4sPJpB39yLCN<yLrtoMO-_&zZcv@eCc3GToY&6YaVCe
zDv53a=?LDZq^3clR3qvN>Lz(395%e()2!-Xh+$@PG`G1A%sZMDLnvUHC+-OA-X`R8
zvmCp(N?&%^`g7r{5Es9d@QoRwTHR+hjhajw5zCOc$*kJ<?LwLuv!D7Ch$e~2M*lrU
z4d(djvz4k#6VKJAF`Tmdx#;F^^E257!`h@0mf3Lj51#wl6X6fndniwH#5-W2TJxzb
z52Mx`I(IHpPk7}NIj@Nw64n+BW37LE$ub{Y5fZaRg1<IWN7$-E+*z_?si0bT^L9}M
zKz|H$m*FjRL#MgquzFPZB#YgOQ+g`F-QA>V=R(w+7Br)1PAO9wQUC;nzZUOsvi3+_
z>qq+U+9uRm<Y?2#6r0J4qH&+Q!^Eq?_^vObiE*u`xSx|kFbvb<cEa~w^?bI!aCvMD
zsUGt9Wjvlg*jkFNJ`W;=uS7=PK*u^}b6FKKuSY!<+scrq$T#H|rg7_g&<dGzLmRsu
z1wRQ>3k>t_Uq!gM+^7DKFpj}*ar^87R?+K{V$O*LZOue+++hmAU`5G_nlP8{FQc*`
zFVSbMD#|yKmT8iR?Y_Z3ZGznGIJ(1EdlA}Pz$b!%=&W(|Y(=i$$q5=}lG@Fy%-4hm
zTo_2%GsQJuauMDxvBT7Ir4KW-x;k%6PQH2XZF8xZyTW8&Xx{{Y)bCObNeL-|i<L#O
z18!wTID==f<K>yFzyx1s@fTct$dos3pw1hzTJzzkLxpjUm()9I_O9`RU4;%6rjw9D
zmi{g6vYVC*aaPnnj3|<@H#h5YagI}+st+b!l1FAadI!aSWk-K)>L{)pYEJ=fImhS|
z^A*sp*h9U>oiV-)Z}h*I6^g`DW&T2vKkNwU_BRfVVB_~rGqOIDu{ufmoA)hNr$8Wy
z*4=h7e4n;kA5~H44@oXE@6ujo9ikS?FAsC=3O&rslIgQ4iQiMjt6~Ksep&9V-h+1;
z!?V^}&b&qksCFjPk>W2iu|IR@9@^Niy#7h<_9nX6sko>7ns*(Y$-}%oGxnmtLsPpS
zPn=YX-1vkK$Yfsc!h8#t_j@lzX}PT+7d>05_jIB(5Z$qr0&cg|lJujOBiB95W=(rG
zkMa1<y&*m$Efq|F5{v#i)C|{*{H`k{(MW&$c!ybj%Lu4^zU+9V2cC(dT-#DJy`uTR
zm)l|<6woJu-}Hp#-1{WbfEcR>d7ppA<tws{>*O#X?blRmn?58?E-yt6m`2Og7{SLA
zV(oXthz6HVFQ<J}RO0^KZE}OSh;<SU$|Kb3;(CHtYeICLrkV_A{uzur81C$f6k-2(
zG_&8&o5--40btj5ZIGu5esSOrEadEVIwKe8(HC~xLlAb1bT+fY+{p2vFqJ>(t3fwQ
zeg&HFcY}W(kt*ILw@qzv*6TXI=s^6u^V)f0h||`4q^sY9$CcetWMTz#pDEr5ya|~N
zWivBEV0{`QnR7w&!PXRK8DLPC)s@{sQ5m^|egrK8=>Sry2JW%e=LZWo*T;+*46v%G
z+-jFGChKI8qk{K7+Qr**6tz%A*9@qtH+R`#K5o&BD<u~AO5>3czjL4VMg1QvxQ&nc
z72L9g{_1felm<pm$DG|fXhW)-pGP>?!#MQ2o+g~cgRnrVZa^d47&Hr8@bS`S^<|uB
zD3mh(0VJ=xEE3FV<eapo|Au6iV>fIM{`2#npF+8b+u=EG!UwQi$C+GhujZ{th7XcF
zI$q?_bwsqHiZCh}7@?vHA|#p((b1@R<%%4Y7E2ChZlf_z%RU`5*EnjMqpbn}A)2Jw
z-9*RAfhj(kW!|tfFTh<mRqsZctnF#@$kLuiRaVbgQls8qQ{-1OD6moB0p+e4C}S9p
z>X1df*2n?UUDa4l#w-In^mZA3_g5Tk#`o%KK-Eq}=fb=*YZ6C@UpBf>i>~%3!Qo%U
zQF7@`Hwe-xM!-DPZ*`jpi&m5!eICG12t;B<rAw0>JwmbE6ZgRI`!tR3vYpTX?<>5R
zUq6_Ckn%~gqpKeAhw7mjxou>vBc8uBQmop~y#u9XGue?uq(CJspK8X3iZ6TOs{A+D
zEIgcrTD+0@AlE`km@;s4&$oQ3mfr6Tubl&Pck7n!rO==7XNRlVOk}-qC*tqxFL_M=
zgx#3nC&`v}CUUC<*H4nd3^fS{!Q{W|>|ywp?zy4jK!x(!LFjMKtpWF6K&?)iFyl&}
z1oD49(XQ4M-#L<m7;OsBY&g?OJV*Njx>)jxe&hbZd90wP49>{7ycKQ($hAF^v2K#@
zYrq>A?#HkO)Z@M-0))m+|82%dvojvu8zkD@fKrc{s5o1r_FX%-K2K6k$_oA!K}Lq?
zIsMj7v}doqFt-mt_RB@3_%YcVmxw`H7efiJci<r3=8FK}a30@NlAKSajSnM1pbIT@
zl6_*NJxz2LI(D({2KgE?8FV`E@s$?Tf2ItDi!{<dN@+F1s|AoJ)UH%}0pS6e7NF6p
zuBi!8?C=)v4_;117?HH5(+87V7iB7U$BqYEahwNRH;lOU1G8JXMFfdox~l1-NY8I+
z1jWMBdI?T`00%a99hy9j7UF)Y(u#B!n|7&GV?WLCB*b>c$u8epk*x~LW~QLDaFPzx
zq)Kfo3eOvl4R_&tE^OlUp2>IWWs3uUtvYTXOn%bm7Ac9Gz)OzoEn(p8vqlz{rw|Mr
zjAc`e$<9y;>tJAr228Q4_WcRbf>957c+&Iigxk!ANDH9VAKGG(b?f}PU#gDYzFkk&
zGvr3lGNU;CRoJk826t&B<HB+MP^vZVjQmm2w!?f-m)N~Q{~(EB|9T2sY<X*3q;j-&
zEL-G=lA9&w7cd(mD&OFI>CxaPBH)OZRS{9o6=)<pIg!uj=fRDyDlkz1SO2I<ISh_}
zuB&b$)K}^rhmZfYzdIFqxHaGnW?&o>x%R@jb{(E^<BolmKW+6J<Cr?}vhHZL!`qiN
zFKWNN@=J!CqsR2Wq2?HUpMqkyfhN*%i>g5yLFeUnH#8gKG^V&kyXQhCLDDu!+oaQ>
zkKZ+PKCm5l*VoZ~tQ?D&oMFhe=i7!Y#l*e}30WY!`I9t{F>?tW4d;Wbv%k6Yd@h%_
z{*I!}h_9zkCgW2gIOK%lOIDSU!DD787;_<mlL=95tqQ=1M_EH6SZ3c*NpJDYU=aHJ
zJR!Jg+mlMpgyB2bpc|#y>6%<tAQ+~aMF=!tWeQfAF)b19N=b2?1tSL`ODly;aD{;N
zIf)<^ZYq+m0QwEDu`pg6_t{8=(bC+X!6^vx9I#<&a|C$qrY6|sj3oYDfQ7`5tb(NP
zz7)R$sU;UWaJ=}3c%HE`>Kwb_>`x0~GcbQSLbl3t%xg-V9x^n<ervtcavzJ3OYe7Z
z(dB3OK_3fWeT*E59x1{!!bD=dUet!kNYr)rjrd*IvWxyU$bR}bHfly^d9X#-%Odhh
zheN?@KIJRNXQJtOuvm-yw!c8KSVLd~l{%>HCaSy%^)a%Yr{yY^(@!g;JE94dj`4d<
z%7e7}t+#0<*wwH`vXq285xrjLOw8n$jZ?f`2IH2J-H_bJxGF?CZB&sw+$ZT&>W!$d
zwyu{*n|7}<d&-!4am1W9?_~3-+RaCGec>ayEESM_^EP0f=;iqh1%vjlSdgAU4=?D5
zrn%GkjfU&iD$0b7kt2lF{LXbXx<#x~=CX^$jShdyV3lPG3&b`&kLpL@+BfdyPyD18
zcjBsoZV%)uGI<4*009B8EqKP6@_j=Bj|ZTb<4^6+0MTZ%KzS;BxKiE%7YhGvEl+-R
z)rxLNv~6O(mYFH;uv-*l9UYWQHGEiRM?B3D#z~2{T7fQ=j=agqYhP;~zA!8YI&dT;
zmXC1r=sBzw)#MH+>8Ev?vV<f{X<_3O2yL^?X8vPwJk@ZztE#}sJxxf67x_p)RH1f9
z8P&c+?VY2*UH`6?-|A7H>sgKz;G=8Q<s*l<VO&xu&EDwUcm%RBnq-xSe1KAA=)8X$
zc_&AWN6px{cnn8}F;JtFxy*h@kuFUxPZEjTDM4JbHWo&I?uOUMaDRI0Qsmy$wOnIZ
zgDv!oaaM9}U#oW)%dV3P&*hE06Jk)t?OOTI#PU_F04FUQzaE01V`=4$Olw(KxstPO
zj(<OBsZdnv4v+cTff0%t>o}fwLI&(~LdP4YK4yL2b;%sBhl*i#JbH%fhwWkgx52Sw
zdR`AxK`yYS5askeOXju0E)-adf4w~{vNC$r;8vAbm^<eUYd~U996*12^CnLCjjaaj
z=*HU{)>buDx*E=-Mb)BwXp==QP$3D<5|{^AiNB|Y+<Cb3l&GylsxezGRl3Zir4+j)
z3LhL~#ZcfsZ#@X5g;DCo^Dr=1x&y{WqS~3uSzuna$?nJV(Gl$hQ<p2RJH5%8LF}_;
zs;WGLmN5EMC965be|c`gWX??L`4)_9IibWkIY{Pv8+C9j96G6Tr3bDiv3AisC!r9p
zOS<W4E?0ln`1@KD!l7?E&mha9!f8P}s8Y$LtslqWk!`fG`eHXZ1$Eq=Y79V&Sr}fi
z!#>LZx?2oiCk_i6j(brxo>@kq42BDPBsq49u#_nQshsn|3FAFmXHoFxq;%uk&jv3G
z49l)x2@K23a?QH_8*EsrDTfP%jQ0Fw>EG(fOb>49q;y%C3Q~BT(O(fCR$3{yfmM~E
zZ2kWI!Z7pj;xH}0%zXRRw04wTXV)b?=g$1I5qH8%$Cn%}Y`bJhA&rPFS6GtEdVBE`
zqLtNiQ{hV0=+pupJn&ePDPEouS=^>UR53lL8p1}4eyc<|OT++lZ~T@_20U`@2<(1X
zQ25h3vn>+?K<@MXih-;s#q-_yf;Ske_ejC&vY<hQX<<3m?JH6*k6Y|Nt7YVzphVB7
zMw$P5CRZr=O(LLy;ylsJPYpEd#X!e7s&cs1_;2gs;aBmAR#66zK_dm~P#ji(CKD_i
zGA^bc0WuR6<{wKIIf<P7BYXnAKPzSn@ozMS1ixyX+ojuIkv?1b!%{)Jj<6ufB*?Jy
zmDuV0OnyMahKiM7p}I$!d0<M;{fgLr5&YaFgYfZO+Y0qCKV_9X<@8D>>-35~wB1^C
zHPpWzyG0T&NpBt<dQH{qT#vDzZ&cOaP9eTuFu@|eZ$aL{!ZzIZrXRmwx|X{ygp^h+
zhCg8SdmejCU0@z}cr1VlA%IX5&n~r3YlebF645z`KrDaSH`rYdIw@DIrBOBfR5i9K
z{xxFr{1&JI<+&mqt7i{5O#QHLrEgL-Cfsp`xM*c~l6;C=H7xe{r#)KiQN;O@iZjG&
znVNGkAEV<QWai&8_U6sF%6L{Y<@+*mhwoC4y<sCdI{C$-gr{TKW5)v8Azx>l2I?Fb
z^zE?zcw8SR1AUozihf(>Kfg}4uM-v99o+1|Gb1$tPVqnHoZ<q9@4V_UO*)2ofMeiI
zZ^oX64m|&Ql^vy~EH5=m##KL@|D?|BQK^3ax*e#rPR)8PJyilKX+Zs3IoZk8S?#+3
zHE|F=(>{;90NHQEWv)U^0!w%XZd~S^YkhdPhgaLl#TU=wn?Gs2QdcCiylah$u)M&E
n=JO=`r~V)QVE=cNh<D@`7M4IhntX>3|AnHgnoNz9S;+qYBx2?q