From bf4791549132523d701241bc50944756d99d3a31 Mon Sep 17 00:00:00 2001 From: "H. Utku Maden" Date: Fri, 19 Aug 2022 16:13:19 +0300 Subject: [PATCH] Very quick test text implementation. --- Quik/QuikContext.cs | 10 +- Quik/QuikDraw.cs | 4 + Quik/Typography/QuikFont.cs | 14 +++ Quik/Typography/QuikFontStyle.cs | 23 ++++ Quik/Typography/QuikGlyph.cs | 54 +++++++++ Quik/VertexGenerator/QuikVertexGenerator.cs | 103 +++++++++++++++++- QuikTestApplication/Program.cs | 38 ++++++- .../QuikTestApplication.csproj | 7 ++ QuikTestApplication/TestFont.cs | 98 +++++++++++++++++ QuikTestApplication/font.dat | Bin 0 -> 262144 bytes QuikTestApplication/font.png | Bin 0 -> 24454 bytes QuikTestApplication/font.xml | 98 +++++++++++++++++ 12 files changed, 441 insertions(+), 8 deletions(-) create mode 100644 Quik/Typography/QuikFont.cs create mode 100644 Quik/Typography/QuikFontStyle.cs create mode 100644 Quik/Typography/QuikGlyph.cs create mode 100644 QuikTestApplication/TestFont.cs create mode 100644 QuikTestApplication/font.dat create mode 100644 QuikTestApplication/font.png create mode 100644 QuikTestApplication/font.xml diff --git a/Quik/QuikContext.cs b/Quik/QuikContext.cs index 5fb4117..6687880 100644 --- a/Quik/QuikContext.cs +++ b/Quik/QuikContext.cs @@ -1,4 +1,6 @@ -namespace Quik +using Quik.Typography; + +namespace Quik { /// /// An object which QUIK commands may be issued to. @@ -10,11 +12,13 @@ /// public QuikDraw Draw { get; } = new QuikDraw(); - public QuikStrokeStyle DefaultStroke { get; set; } = new QuikStrokeStyle(new QuikColor(0x000000FF), 4); + public QuikStrokeStyle DefaultStroke { get; set; } = new QuikStrokeStyle(new QuikColor(0xaaaaaaff), 4); public QuikFillStyle DefaultFill { get; set; } = new QuikFillStyle() { - Color = new QuikColor(0xA0A0A0FF) + Color = new QuikColor(0xeeeeeeff) }; + + public QuikFont DefaultFont { get; set; } } } \ No newline at end of file diff --git a/Quik/QuikDraw.cs b/Quik/QuikDraw.cs index eafb467..7d978af 100644 --- a/Quik/QuikDraw.cs +++ b/Quik/QuikDraw.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.IO.Compression; using System.Linq; namespace Quik @@ -33,5 +34,8 @@ namespace Quik public void StencilClear() => Commands.Enqueue(new QuikCommandStencilClear()); public void StencilBegin() => Commands.Enqueue(new QuikCommandStencilBegin()); public void StencilEnd() => Commands.Enqueue(new QuikCommandStencilEnd()); + public void PutChar(char chr, QuikVec2 position) => Commands.Enqueue(new QuikCommandPutChar(chr, position)); + public void PutText(string text, QuikVec2 position) => Commands.Enqueue(new QuikCommandPutText(text, position)); + public void FlowText(string text, QuikRectangle bounds) => Commands.Enqueue(new QuikCommandFlowText(text, bounds)); } } \ No newline at end of file diff --git a/Quik/Typography/QuikFont.cs b/Quik/Typography/QuikFont.cs new file mode 100644 index 0000000..e13b751 --- /dev/null +++ b/Quik/Typography/QuikFont.cs @@ -0,0 +1,14 @@ +namespace Quik.Typography +{ + public abstract class QuikFont + { + public abstract QuikFontStyle Style { get; } + + public string FontFamily => Style.Family; + public float FontSize => Style.Size; + public QuikFontStyle FontStyle => Style; + + public abstract bool HasCharacter(int character); + public abstract void GetCharacter(int character, out int texture, out QuikGlyph glyph); + } +} \ No newline at end of file diff --git a/Quik/Typography/QuikFontStyle.cs b/Quik/Typography/QuikFontStyle.cs new file mode 100644 index 0000000..78c4468 --- /dev/null +++ b/Quik/Typography/QuikFontStyle.cs @@ -0,0 +1,23 @@ +namespace Quik.Typography +{ + public class QuikFontStyle + { + public string Family { get; } + public QuikFontType Type { get; } + public float Size { get; } + + public QuikFontStyle(string family, float size, QuikFontType type = QuikFontType.Normal) + { + Family = family; + Size = size; + Type = type; + } + } + + public enum QuikFontType + { + Normal, + Italic, + Bold + } +} \ No newline at end of file diff --git a/Quik/Typography/QuikGlyph.cs b/Quik/Typography/QuikGlyph.cs new file mode 100644 index 0000000..437d22c --- /dev/null +++ b/Quik/Typography/QuikGlyph.cs @@ -0,0 +1,54 @@ +namespace Quik.Typography +{ + /// + /// Glyph properties with metrics based on FreeType glyph metrics. + /// + public struct QuikGlyph + { + /// + /// The code point for the character. + /// + public int Character { get; } + + /// + /// Location of the glyph on the atlas. + /// + public QuikRectangle Location { get; } + + /// + /// Size of the glyph in units. + /// + public QuikVec2 Size { get; } + + /// + /// Bearing vector for horizontal layout. + /// + public QuikVec2 HorizontalBearing { get; } + + /// + /// Bearing vector for vertical layout. + /// + public QuikVec2 VerticalBearing { get; } + + /// + /// Advance vector for vertical and horizontal layouts. + /// + public QuikVec2 Advance { get; } + + public QuikGlyph( + int character, + QuikRectangle location, + QuikVec2 size, + QuikVec2 horizontalBearing, + QuikVec2 verticalBearing, + QuikVec2 advance) + { + Character = character; + Location = location; + Size = size; + HorizontalBearing = horizontalBearing; + VerticalBearing = verticalBearing; + Advance = advance; + } + } +} \ No newline at end of file diff --git a/Quik/VertexGenerator/QuikVertexGenerator.cs b/Quik/VertexGenerator/QuikVertexGenerator.cs index 8e054c9..8cd88a9 100644 --- a/Quik/VertexGenerator/QuikVertexGenerator.cs +++ b/Quik/VertexGenerator/QuikVertexGenerator.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using Quik.Typography; namespace Quik.VertexGenerator { @@ -223,9 +224,17 @@ namespace Quik.VertexGenerator case QuikCommandType.Rectangles: RenderRectangles(command as QuikCommandRectangles); goto exit_with_call; + + case QuikCommandType.PutChar: + RenderCharacter(command as QuikCommandPutChar); + goto exit_with_call; + + case QuikCommandType.PutText: + RenderTextPut(command as QuikCommandPutText); + goto exit_with_call; + default: { - QuikDrawCall? subcall = null; if (OnHandleCommand(this, command)) goto exit_with_call; break; @@ -1393,6 +1402,97 @@ namespace Quik.VertexGenerator } #endregion + + #region Text + + private void RenderCharacter(QuikCommandPutChar chr) + { + Context.DefaultFont.GetCharacter(chr.Character, out int texture, out QuikGlyph metrics); + + QuikVertex a, b, c, d; + a = b = c = d = new QuikVertex() {Color = new QuikColor(0xffffffff)}; + + a.Position = chr.Position + new QuikVec2(0, metrics.HorizontalBearing.Y - metrics.Size.Y); + a.TextureCoordinates = metrics.Location.Min; + + b.Position = a.Position + new QuikVec2(metrics.Size.X, 0); + c.Position = a.Position + metrics.Size; + d.Position = a.Position + new QuikVec2(0, metrics.Size.Y); + + b.TextureCoordinates = new QuikVec2(metrics.Location.Right, metrics.Location.Bottom); + c.TextureCoordinates = metrics.Location.Max; + d.TextureCoordinates = new QuikVec2(metrics.Location.Left, metrics.Location.Top); + + short startVertex = (short)_vertexBufferPointer; + short startElement = (short) _elementBufferPointer; + AddVertex(a, b, c, d); + AddElement(startVertex, (short)(startVertex + 1), (short)(startVertex + 2), startVertex, (short)(startVertex + 2), (short)(startVertex + 3)); + + QuikDrawCall call = CallTemplate; + call.Texture = texture; + call.Offset = (short) (startElement * 2); + call.Count = 6; + DrawCalls.Add(call); + } + + private void RenderTextPut(QuikCommandPutText text) + { + short startElement = (short)_elementBufferPointer; + QuikFont font = Context.DefaultFont; + QuikVertex vertex = new QuikVertex() {Color = new QuikColor(0xff7777ff)}; + QuikVec2 pointer = text.Position; + int texture = -1; + + for (int i = 0; i < text.Text.Length; i++) + { + int chr = text.Text[i]; + QuikGlyph metrics; + + int ntex; + font.GetCharacter(chr, out ntex, out metrics); + + if (ntex != texture && texture != -1) + { + QuikDrawCall call = CallTemplate; + call.Texture = texture; + call.Offset = (short) (startElement * 2); + call.Count = (short)(_elementBufferPointer - startElement); + DrawCalls.Add(call); + + startElement = (short) _elementBufferPointer; + } + + texture = ntex; + QuikVertex a, b, c, d; + a = b = c = d = vertex; + + a.Position = pointer + new QuikVec2(0, metrics.HorizontalBearing.Y - metrics.Size.Y); + a.TextureCoordinates = metrics.Location.Min; + + b.Position = a.Position + new QuikVec2(metrics.Size.X, 0); + c.Position = a.Position + metrics.Size; + d.Position = a.Position + new QuikVec2(0, metrics.Size.Y); + + b.TextureCoordinates = new QuikVec2(metrics.Location.Right, metrics.Location.Bottom); + c.TextureCoordinates = metrics.Location.Max; + d.TextureCoordinates = new QuikVec2(metrics.Location.Left, metrics.Location.Top); + + pointer.X += metrics.Advance.X; + + short startVertex = (short)_vertexBufferPointer; + AddVertex(a, b, c, d); + AddElement(startVertex, (short)(startVertex + 1), (short)(startVertex + 2), startVertex, (short)(startVertex + 2), (short)(startVertex + 3)); + } + + { + QuikDrawCall call = CallTemplate; + call.Texture = texture; + call.Offset = (short) (startElement * 2); + call.Count = (short)(_elementBufferPointer - startElement); + DrawCalls.Add(call); + } + } + #endregion } public delegate void VertexGeneratorCommandHandler(QuikVertexGenerator generator, QuikCommand command, ref bool anyCalls); @@ -1410,5 +1510,6 @@ namespace Quik.VertexGenerator public short Count; public QuikRectangle Bounds; public bool ClearStencil; + public int Texture; } } \ No newline at end of file diff --git a/QuikTestApplication/Program.cs b/QuikTestApplication/Program.cs index de276ca..44f1148 100644 --- a/QuikTestApplication/Program.cs +++ b/QuikTestApplication/Program.cs @@ -35,9 +35,11 @@ in vec2 ftexcoord; in vec4 fcolor; out vec4 outcolor; +uniform sampler2D texture0; + void main() { - outcolor = fcolor; + outcolor = fcolor * texture(texture0, ftexcoord); } "; @@ -96,7 +98,7 @@ void main() QuikVertex.PositionOffset); GL.EnableVertexAttribArray(loc); GL.VertexAttribPointer( - loc = GL.GetAttribLocation(sp, "texcoords"), + loc = GL.GetAttribLocation(sp, "texcoord"), 2, VertexAttribPointerType.Float, false, @@ -133,6 +135,31 @@ void main() Color = new QuikColor(0xeeeeeeff) }; + + int whiteTexture = GL.GenTexture(); + uint[] whitePixel = {0xFFFFFFFF}; + GL.BindTexture(TextureTarget.Texture2D, whiteTexture); + GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, 1, 1, 0, PixelFormat.Rgba, PixelType.UnsignedByte, whitePixel); + GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)All.Linear); + GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)All.Nearest); + + TestFont font = new TestFont(); + font.TextureBase = GL.GenTexture(); + GL.BindTexture(TextureTarget.Texture2D, font.TextureBase); + GL.TexImage2D( + TextureTarget.Texture2D, + 0, + PixelInternalFormat.Rgb, + (int)TestFont.TextureSize.X, (int)TestFont.TextureSize.Y, 0, + PixelFormat.Rgba, PixelType.UnsignedByte, + TestFont.Texture); + GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)All.Linear); + GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)All.Nearest); + + context.DefaultFont = font; + + window.Context.SwapInterval = 0; + for (;!window.IsExiting;) { NativeWindow.ProcessWindowEvents(false); @@ -144,9 +171,9 @@ void main() Matrix4 matrix = Matrix4.CreateOrthographicOffCenter( 0, - (float)window.Size.X / 2, + (float)window.Size.X, 0, - (float)window.Size.Y / 2, + (float)window.Size.Y, 1, -1); GL.UniformMatrix4(loc, false, ref matrix); @@ -198,6 +225,8 @@ void main() FillStyle = fill, StrokeStyle = strokeBorder }); + + context.Draw.PutText("Aaah! the cat turned into a cat!", new QuikVec2(25,30)); QuikCommand command; while (context.Draw.Commands.TryDequeue(out command)) @@ -210,6 +239,7 @@ void main() foreach (QuikDrawCall call in gen.DrawCalls) { + GL.BindTexture(TextureTarget.Texture2D, call.Texture == 0 ? whiteTexture : call.Texture); GL.DrawElements(BeginMode.Triangles, call.Count, DrawElementsType.UnsignedShort, call.Offset); } diff --git a/QuikTestApplication/QuikTestApplication.csproj b/QuikTestApplication/QuikTestApplication.csproj index 786da43..b4f36c4 100644 --- a/QuikTestApplication/QuikTestApplication.csproj +++ b/QuikTestApplication/QuikTestApplication.csproj @@ -9,4 +9,11 @@ + + + + + + + diff --git a/QuikTestApplication/TestFont.cs b/QuikTestApplication/TestFont.cs new file mode 100644 index 0000000..66977ee --- /dev/null +++ b/QuikTestApplication/TestFont.cs @@ -0,0 +1,98 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Xml; +using Quik; +using Quik.Typography; + +namespace QuikTestApplication +{ + public class TestFont : QuikFont + { + public override QuikFontStyle Style => _style; + + private static QuikFontStyle _style; + private static HashSet _characters = new HashSet(); + private static Dictionary _glyphs = new Dictionary(); + + public static byte[] Texture { get; private set; } = Array.Empty(); + public static QuikVec2 TextureSize { get; private set; } + + public int TextureBase { get; set; } = 1; + + static TestFont() + { + using (Stream str = typeof(TestFont).Assembly.GetManifestResourceStream("QuikTestApplication.font.xml")) + { + XmlDocument document = new XmlDocument(); + document.Load(str); + + string family = document.DocumentElement.Attributes["name"].Value; + float fontSize = float.Parse(document.DocumentElement.Attributes["size"].Value); + QuikFontType style = QuikFontType.Normal; + if (document.DocumentElement.Attributes["bold"].Value == "true") + style = QuikFontType.Bold; + if (document.DocumentElement.Attributes["italic"].Value == "true") + style = QuikFontType.Italic; + + _style = new QuikFontStyle(family, fontSize, style); + + QuikVec2 atlasSize = default; + atlasSize.X = float.Parse(document.DocumentElement.Attributes["width"].Value); + atlasSize.Y = float.Parse(document.DocumentElement.Attributes["height"].Value); + + TextureSize = atlasSize; + + foreach (XmlElement element in document.SelectNodes("/font/character")) + { + QuikRectangle UVs; + QuikVec2 origin; + float advance; + int chr = element.Attributes["text"].Value[0]; + + QuikVec2 pos; + QuikVec2 size; + pos.X = float.Parse(element.Attributes["x"].Value); + pos.Y = float.Parse(element.Attributes["y"].Value); + size.X = float.Parse(element.Attributes["width"].Value); + size.Y = float.Parse(element.Attributes["height"].Value); + UVs = new QuikRectangle( + (pos.X + size.X)/atlasSize.X, + pos.Y/atlasSize.Y, + pos.X/atlasSize.X, + (size.Y + pos.Y)/atlasSize.Y); + + origin.X = float.Parse(element.Attributes["origin-x"].Value); + origin.Y = float.Parse(element.Attributes["origin-y"].Value); + + advance = float.Parse(element.Attributes["advance"].Value); + + QuikGlyph glyph = new QuikGlyph(chr, UVs, size, origin, default, new QuikVec2(advance, 0)); + _glyphs.Add(chr, glyph); + _characters.Add(chr); + } + } + + using (Stream str = typeof(TestFont).Assembly.GetManifestResourceStream("QuikTestApplication.font.dat")) + { + Texture = new byte[(int)str.Length]; + str.Read(Texture, 0, (int)str.Length); + } + } + + public override bool HasCharacter(int character) + { + return _characters.Contains((char) character); + } + + public override void GetCharacter(int character, out int texture, out QuikGlyph glyph) + { + if (!_glyphs.TryGetValue(character, out glyph)) + { + glyph = _glyphs['?']; + } + + texture = TextureBase; + } + } +} \ No newline at end of file diff --git a/QuikTestApplication/font.dat b/QuikTestApplication/font.dat new file mode 100644 index 0000000000000000000000000000000000000000..1c997c7d65011276ce537d1c96eeb4bbe8fdc7b5 GIT binary patch literal 262144 zcmeI53%qSrRsYS(-VZY^?ST}T37T12NpVXuvq)1RODm!W6r?Cd0-7X(SXAZ{Dw49a z)Kavo@g$ z)mMGh;wOLdCl`P8M}M^Vhky8o={x@QU;p*uB`*AM%e!@`t`GQt4_JKDH+|FM z)vtc_;_YvL`{KRteecx&*S_|(iwiHjaPhGp`?14ysm@yZHDB{J%RYlo%6G4O-D`RO z^{;>Z^1hyrruV-0y_fa89M zWATf>_=}4NJ?KGG8UOBI_GMqTtcPzU(6{}xPy4i~uD|-Lznbd0`R1D!*Is+=;=vDo z@UmR39o)a;9q+h!#xtI=c+;ESG|ioV{KtP>{N``|=HlzV?(3%V-}Y_ardKYW{NyJO z)meI9txu)A+`IJBOPB9eTWWc^4-N}{=4XCp<#w{J0Dtp0f3tEO-}61+qoy2^Qh%!- zy=R~P>7Ty%;UE6t1vvTd|Nie=>c9HxtCw}N4g&9b*SnVYdUcOJXFUc_fM-7QnOo}D zcfRG8TejR+-K;NyPx+KjDdth$Qp(ycV2+mZaF4lim%H3$@j)N-LDf99vaS2jlgB^) z@e9^m#^8PLd*6cjd*Hx<#Si_^4=wJ0|NF1}zQ;Z8aq8NX{`}AX{7_wA@+DugrQE7N zSO;2tuRYst`v2k=zqr_?NdHTj-uT8hEBQAO7JVu2lXx&w0+&q+4&j zb@4GD^D$fM*uQ`O^o+XS|NY;8%QKC$=2EF&o1p*Dh_}7%ZKdkB+2~T)JF+a5I-S2+)vfg;{#3w#+;osfIE7E`F{lEOnzr-q* zzu_@ht80D!f-m@j#XH~m&Sn01@zX#3(~EEa_HSR_PWnHl>)bB-kF4+?|M4Ho?-4H! z7ybXt&-~2gtKqvGzmU&>8V~lnzx%t(vS0kgU%aKP*HgM?o&3-L{LiU8^Zr9W^g|CR zf4}?PZ*l$g*Dv!ypOHsC`?Ej$ki4aLwC;W4Cw}52e=a*vxTy8JRj;0jCa7B0iQc+P z*}Y8vKmYSTU&Aqd)8{_-xr@_IJ8kiR2RvZ$IiK@6%WwLrpZci_@adrsedyxii!Yw! zSQUh?(iqQ8q5myeu2$c1#~ruC!AmZ=3!a^EV&zoOpVSAOMJ7Pr0aZHx8Y;SP6L z{P~~%`7$qh7;u^O2w7CJ2pL$vTJ5T}*YDFlL5WA+w{M>wPiujfopX);NbtPpJ+Ihz z)ral_{sv%;`nZq#xI^-Tvyv~#_h*0hXAAUJ&{cF>lw<6i@2Js#=(gVXy4SsKaoJ^; zE%>JJKCF#`%P+tDkao~!__crfr+-qmN#1?dv!1nh(vzOF_=%tRiRCv#FCa+zKSuu< zTh?U%6Q8w?{O{iao!WPQ_jgbH89EyNzUmc%jPF9^Lo! znrp6E=K02N{KjQj&r`epq)+;!Wm(q3nC~GEdB`M>FEiN%x=8e{vCN#`&;kK6-SeOS z{Ka>E=XWkHy6B?CPyN(SO*Cg!`j335wSjLYc=*E~-fi3N9`l&R zum0+$Xw6HT|m5e|XeZ z|9FNjUVt78KBH6y+3{&ldz!LV=QQ&`fd2VD_qorO`sn{}{nl?O%fwIBc!^Rw;yw6# z0WxfS&TrO7!K%DJYa8nZz?^J-Be&_4c#;qNzz>}0z1s9+KlWn_?s?nkOO)?w^k4Nn z|qaEt|jmkr8x#33tsb@*BqiFgMau^bcTB0cGCZ!`?;T+nu2as?;~}a95yb0rt1qXxIo=llyF!1 zO6iFwp13TFJmPt9^2d)K0)49*<>4c(B&@U3rs>(CgY zmUEFKc#Z zxN7W~fd{7$tF_+|lq46&Zk-|)(UsO$7P(3J}w@rXwp@;+}5 zwp;WCUS8MEn^9kj{=>_wTuh(+>}RVv3v_1w{MciUUCs^YL}@J}|0$=OvaExP!%6?W zy(8Cqo&KZK6SUS8jn#J1e`EsbGO%~)eWbEm)olOd@p%9b?B#pck9yRjGz5#NkJB^! zV4__BoBd4(eQf~p_1;r@&O8*LYb)hh=ibX-{_?4M^nd6Aux$hQOZ0fX-g}Q^`VWl~ z%+(uf4uG${F=9>BI6)s-Gx5j5uj5btJ+(6Q z6*>#>J!89T<>Gyp>zSkRIlu8Q(RZxr37n5@*`v@oh(Dw4E&AW$p^*6n$noCp^Uga@ zk0!rQe-^Jr+byj<1dY zJ)XC@ckQ|ZY!IIRyT0qYrfShm_;1QW>$fiRC@(2;9lQZR+S7Bpe2HI;*A=fdzo^@3xBLIM^#8twoP6@h#dlFJ z;|#td+tUX6ApDFp_Z6>r1zajpl*u2>Hf=|hpe(9G^^-DJ7z1}CaRqZLIoAm!j{*=Dz zU;p)ACp=dhNQGbW{|D#bTah2x-^84zU)1B}de?L5zvf$MJZkq^{(tDEzvDZ;W3r1O zQ(|Yro{0}ZZI2YVP8t7u;R|25d_DdqdgeSOK0mro${rJq5A8t41@M2-eNx^>S^c5! z_vbD@Xs?W(BbxzyCtn+R&TsiSfBn~g{gygazL&D*%NB?qMsMxu)#uOgxe{RS<{7?1 z0`?Vn{<+sl|NHbGofW{E;555L|6AklzL@Y7t-L%#?=PtNYN?KO>A!SL_=~AdrOXlb zf6#vc_7i+(KlzhCd4UZDz-FN`q)yk)IOB{h&paR3#~gFaREPfI&lB^se*66Iy^DHS zYec)DNi{up>zzDvUL4<*m>*lDpyq2Jxpl?p(ds?eO$4kn zx?f764}u!~hlkMGsJxy+Cw2q1EdbANfBV~SDW^K_d*Ay`zI^&!O0ic6;yPH$KY997%p?DEnSM9O|Hydq6?pTT-@Ik4=hFWl{J|g8r(EFEQTiT!&uLC%ia0TcV70Xwoe4vK>(ff@}+CnMb+p(dihdWzo&JNce}iV+$Uh& z^D^;TzTV_7(SP(onmgnHhv8%K?ZU@U-y406!26{4`TD>$@hAkFkpJ-~6zzwm*YOVx=zOB?k~IXqfp{aM&{i8qnqk1%@PXD3F4zb?Yetxqa3Gf##BR}#Zmogmw z!O-GTzTQ2p5wzXsJ^TCxwLSm%91BM1zsng;D_#DdOaI+3)Ax}@*({Dji~gfG7G0x% z?9YkoGW!3h8}L5G_v!a0Pe{O+dLH%y05$u&=S80_z^_Wr&@}>*HK4JM zPoljwKAU>bbN$+{{o3+-Gv4?a_mcQ@&-=65H8fj$ zd%)$ndw5)bPwcMRds_F;I_s=uS7oCkzxL`QchqDD#?z#k?%D2;80J7P+r;_bv^#A&<6-w{%$HGyr+KMo0G0X z|7(7$d@uI&2-rv7YLmx;a$Lv0ARW-zXP@1ygZjN5;+5!~iVb-F`RA)ilMRCB=fc17DjEhUKf0l<~-jP+;m^&(w=`WKWCj4PeFT~R=WJpv)+90x#NDJtbu}> zAFJB#y1JWV4+gaDk1&ovI@DLs$*OTUj)`j5Yk zAkwW;KjS_8kp=Ks@p=3WJ@WalvdDJC>cMW-(wE{>FKF#ekMG6yCTQ&~S%>~hUco-$ z@0WiUJaKCc6D@K2zpnh>^F61X&}zkGfQGxh(EHK5_H}N=FQZi7i(d31eWpq0i@&6x z=MU~Wl<0rq??TRT9CTV4>Hp~dKlEV!4!0%a&+X6RwZ~hJ^xxN}7=t<1JyT^`SEWd1@ckriZb#9qe!L62A1YNMXvhareI5A7)gXG%QQZ~Vq@ zOhxg(P<@{I9^KmBY4ILZG%7FoJGeel=s$8Mydmovcp;gMzK?wK*l&1IeShkJA44YK zTh-_|wn20~z79~<0Xr2q9N*{r+t8)Q=e6J1o&>f1W0YNo{&P+TKpZ}AhxAXHcmB+; zwSGJOU)TQMlCSh`*)3>0{G9I3P0^)^9^gk*(^a?X1#bkbOWGR`j`jQzk*x&ynAUhL z>1mYLX=SAUqw#;Dz1a1N?DweY5zuowIQ?h*G@j&PuSIL@6f=&z-ltlbb?86#V{aSp z?D1!6hvq$YGTp1C9*44bPS#G*f4*<6{oMCG^}g>pmhre->{s*W+5FxvZb)j0E#i_w(y$oCiM_k9eanqBWGDbPc+|{r>wWE0nis>Xv5dn^cLDPg|C3y zO?ekOLGggB0dY?Pv15Q5kL|I(B2T4pa+)$XUV`d4Qs}?O&6x)7;6MDXBEG3#BPrkY znu9TWgb%8>r_*OmB&Hbp8+1nEeN~=)W$}As%M#$@I?_J!xDQ!etG$kO=)dA9L&v?& zb>x5Ml8psUMYC1_AzcH-(lZ_!*x7o1YTTv7q!Ld|6HHO+MWir zIi~B-f3??nf97wAXOHjIxJ8{w%*SuXrzji7{5wVe8H3ms|Lydjz506QvX{nlZtAjv z>QyRzJhm?GDHgh9TznA#@E2Tj+EClW2Yv$ZZs1$Qdwc@m2TH)ai|ZHjT|S5Sp{wnl zVl&mA1N!3rfcoY>Z@ld9{od~_n}YoiePaA`pF`eL>$}$*ua9KT6jyHtuqeRq5nEtGM<~^_J8-0 z^)}Y*|K#zp?Zq&5n<;(m`DA!pj1iw7Z*%FIxhh~CDCOzhb6bt-s`*XCx;VE;^o6p> zHt1i^J@?#c9~o;dexuSGlBY)hvB!wMA!k4@@ew9Ajr+0G@CjbZV?99YkwG}i1e?G3 z5cze}7GK9UwWl$Tk$$gB|G`V}&Eqa2KlSuJ`aW~%|05sy$R<9C7Er(XI41=U1T7gs zb?W==R{Ae{7(SWkj{|u4`uiF)r?RfLsNz4!KTDaRQ*}l9i+V(#N=UjqES~-RL*Nyi$A$ zj}Oe+C}{cL!&CY`b$AQyc|lKH@;8=!L-miQEk2~y|09Y1dmmVz1&pIV8@ZMb33W)X zG*Zs{?D5_H4!)_NrAJ(c{`=XPksozgi@xF456&X@J1wG(k^Vb< zh_RErk6e2!XxaT@9{u)xvHSPe&$&_l(bQv%v6hXN^L#F!m-O$Rw{*?;;)9HD9lQW> zW)#zf{O+shd&?vJCog_?$m{5JkfE?sGPXT?wAux)&HhNf9lQiG7kroeZG4@I^xt(q zJ^w$~BlKt`ZF8I)@e^sC{{y~@XJd?7`v64$!Sy-*e?8ljc#tDS{uh3bx?JONBzPwK z_h=j>)yq03(Eg`r-$w5XAY&*N6M0p~oRm0#061RaiDd_kzIxKJfj=#MCG$vapcd+l*#_F-%avMr2p7dW&fgx;=RYV z!y8GTN4^%HLs`WvBku^ki0^CtmMVQ@Pl#f0jwK8+=J3r|7P@?~H>Rlyo zi~jprOs##ZJGKAM`|B}hSQn57{kg84{+#OPW%yKVChQwz?v!{{*Ad`*9rs${vw}Z_0J*U=FVs)uW6h)Juc$ohq}ppld*;e5 zeiq^;^%CA6@vX=Zt~=aq^xw~W$KF+1SLv5@q5A$K{M;txf7-yNv_GP_;_7cCiG$&+>B~Of{p!#C!GAH{j zpDR~!S$oAf_E^WUru*g@fQV+_bh|9u}9@^s_}T_28(%imMF_E;D_ zAGdYsKXX*;TP=nLa{*qNHEL96f}TTXdVtfs174Z)dXQ!1L(4PfGka=FW1)N4tp%(2 zyQrR83h$wP?aXc2ifj4(zT19U@}ZZRbL}yeqCRxD(SO<_of6**{xYt2_&oahNxq$+ z|9k`R+UZGY4~XUm?F8UMVxMTg>VZ#f#S_-I$2U`eZY!=E%2!KwivA;yh<<$E_kG`% zd8;_p%%xhpTlW>`mvOc0Z>$G5D_d^kTO}_riHk@cHtC0Ut`d zDEe^aK~GR?o9+{%LeSHptxNxTr)+RD1p z(i3>Oxz`@oKCWxEx)?8gTXd3h?QqzykS}U>EMyd|MT}j^Pf25n4yD%4P2O+m|9KC4 zG<S}V9j5e{VM{#jqAfy&uEI?UHc4Gr&4&-s2A{hS?is~tDL9c1u;tSFA>j+z20qv zv|n;5Wk+ z@f`p&$FY`z zv#bHcrb0Iq^Tyw-2j~r0-|@3WPJx!gAF^)wUNB?|0d@e@58oz>L^*HbMXCD{(R8 z8v!qaeb)I2jmIWZ;x9;^XH1}_wR&04wHJ|j8DrAa%B_0e_aO1zV?CnR`j$$O0b70= zu^#=d)u(!uqJJv!g1eRe(?9$ak$spq@JZkou?S?--7WN=wz7v)c*dCf-XN#{Om9moXIjn(2hlUHjZ`q9?hSG}8}|I~-R-hE2Z>K5 z<*+rur(%1@Z+fneoZ71te;2K*d`skBJ@ZsPxa1k}o$#`&T;sPO9uHk_)aN_BX74ce z4fy{#GM~2#{Rm@=%@4eSR`P!8<{GcINfbNeA+~AD!QQF8#+YD2Oo{ zBM$iO$b9*3qNPjlxn*E2X>_J0Dl+P3KV&Xfcdqy{o zEFPcpoA^8UYv@no2CZ^^z1uT6FGBf8_e;Qwa4r%)t;8ZgUqZW}$DCuxH|Y5>l-eKf zVJEE7SjK=c;m>0##X2_q8-HKD_w<9Y`8HjD)|Yf4aUgMEFXO-*`v0g$Jqq$Q0X}!V zaq-ww_|6bR4*NR$=6pW@w30Z{*yW&C9@lgoKQd@{%{R5zcEz=%v#tX`wv}HIvDa$# z$UgADqqX&ajsAPCb@U#!Hs$?X%Mu3?2NDMo2ZRG9`j3CL_O+0*pYEE2`?}r#byUvt z`14NRoGvT2jX&oa-TgX#Wcc})_He52y_9$WQKrR@fqVGfwc3{SKj&Bvzw&wFNa8@^ zz)s>oiT=PaH@bNE}EU*lRdYqW^oXkJ+D`w}}IZ z1BnBP1BnBP1BnBP1BnBP1BnBP1BnBP1BnBP1BnBP1BnBP14kPU5Z6rm+3@*m#W3@+ z!S~%`!^T+j#LE^C!}v~jx>I$poa(**{qMhwGef-2Th$r$yy?=0H4rJu9W0zv4iA_EJ9X@jl`&adz?B z-~RR~ZY%LtU;EnEPG@$tVhgPkkDi#twKj2|vvP?578D|u~z3T9@h5XxcO>7YQM7_iSw zZkXaNa?YFHTT8v3-drYrl>@ONRWIMcp>cj zzFovQJ@d>nre?B(M%agbsxqDcSYiQ-vo-X9-l>aWp%V!Lx5 zM+@k$$7AsKYzO^k4~ox^Qrn0zMcchCrEAV0e9K$jQmSIhJ?KHHJolix(2gF!XV&6# zu|DfO)mA;sM`Cl7+R~!`r8=2=PG?nT#Enu}?!Dm+Z*%+ z=s&SDUB0UIkNbYsjOu6nTjw)Tu1EjDyHUEy8dmyF(Ed??@2j23GiQzDeVd~H&~=Te zr^I4;<};tUWp8_}pYZ=GyO-!c@`%9q<*Bcw)X#dWogvAZsI>}txpfABpXmy&mUu|k zGx%o#vFS@~(>?GQnFc7me{{_tp1$g#uJg}7zxZCqZLY7r`s(H1OJ4GlL*^iD8jYi% zK6$G6%G4tmq5tR%q{pBf@)~sp}?7Yj26}a^8o_B0c)gxfc$Uz468y zCp`}`nqqe=4|o-0hI>0$JJ4Nm1~79IJs4#iz#-S)YRr6%r2oCS>ao(OgE+FiGJ5X) zLg%VBC?(DfbHo9hqff~E;GyF%ZC6>xP1Y&Bvz0~}*yVr5t5w#Y^}e^-IGWz^j(42a zTgHJkj^DkqtXG25PCKod|H2C|RJQ5-=8~QO*->i_>wal%S9{P`3($kLbg#a4$FZlr zku`%ej(pu_tyNoM>bTAN7@zZ-zPbJmJSv@ETPo}KbfzdY$j@8v(SP3Wv>#nBadf?I zuCWV&pNvt9{_9*zpBr8mbOmr-P>KFO|M}0?XPtOF&Mxt1)r zbM(^SI`jye40M=r!FC|%(F5o|xXyWO#2AO}`Is<|u(`R6gMG^Lutq?8!Otj@E8oc{ zpS(rCRf?VNYh>@dbJe>_ihWxAG~a_z?LB>c*A^V6zfL`p>%P@=VPK1wK)8n!1Q3Ju+S~ z4}EeT?5R(EYOx--Mbu<+=DvXSvxH~Qe)hAKWjZIYH|DXu{AO(xV6$z-#u86Pe%|f% zU2`ywr=WFq6?0s;kNz3`jMpt6Tjw&Cov&sLMC`F!U)-?>{R zwhR75w1LX-Rq;H&Ms6ql$InYZ3|emk*OH&e15X)w`}S4Yt6uZMcsmt^NSp} zTlAlP;Lj$AYqa`VOGQtxB_kJ((tnp{(P`BDm1^(ReW(AdJ@^6vkr(3`z`IyK1(E(c zEkWO=_mt8rue?&#EU>AR^7QU;4ut?34}FPcu)7MN>m~U?Ww31vqE9ILOYtoDF}8SR z)mKWzXYn51SIVP%@Tr2h_Bqbu)1oq^6dknyy_@IpZwB7`vv}>i3;J$Va|5!7scHTr-3_1CND5N+|kj9ky5|0DI02V8ZXMbsUQ*5h_O^aWnd z*U0Up|2`*6{;=3C1n|V(#*yp2M*orV1n4wdW8n6~$3On@&Ah4yoKdmqZZP=+-;XYl!#Jc#YD3^nZdm zF`Q$2BK-#kfT+Kej~R5DwM7u=Ke|Rij~7CJDS)n)?Ax)u{u|x8Wr z2v{q;j(CktNbvHPzkEwxZ!f;6vFzw?baDdt7Gxn)b+YjaR-@RYF?MBT-ldPeC#b4_vtYhu(n(6$==cij>4xA$Wc*V{q=X_xE8 z=ISNYFZa=c_tSk+Un94R{yQzBKXHw~HlsBFe7g6&@4cms-rm~vUZel?lRY;A#;DeJ z{CEVl^KWBWz+)0e%A! ze^frEj@v!@k1a{i)3@k7^i6)eF8hwqfBGOfl=rq|ExoUnM*5FzCZ6QDiPd+Bci|^v>F}W;*!{4L!eb)SGN14XYvC$urN)@G3%k0%N7u{?t-s`t{Eh0MQN8sSU4|g) z9Olq}#!rB4LTx4W@6p3ae`n-@=F~HX{`;AyQRhJWYxLjcf6h zUFY|9(0}}$1bpw3e`#zp>mznVbR6gueJ*2Xi}`(x)VoS4zDcY2MZ4c0bD$(2JnwnW zTfVaNO=Fu&zxN{jcRd|ze5v1V6JsA#DNpO3`zGlltm?qIQm`t7(~qyNwV*~@7+>+uMlLvzG4z~gv3M(962bprVEQJsdrN7p6# zFM5D}f_(C=#kZ5+HTsXgoWqEplFz--{gd$M;v2w?p5Ds+B+*~c2i6w$p##u_d*1V& z(|v6E4(?as_AU140j!a%Z}=TP;~CFb>X=nW%{Buqa+|#J#}t40sCU)3bH1kL7o)sx zL**UL3+sDxAAJLBz5ZBV(Pyv^T)^0u{49MAM&3Z}Q0lS=_4*zPuZP$mzF#U{yS<5e zoEMgUjr-{TdAH(M(TAuPt}q?HE93-vHgG1 zpThnB)t+8jlgoSU9eEB;vNi(v>6K^%GPPh8o|ZZ6JR;v>q;0i4@-d@LUN8K2t&Hyb znjzY%zLAdj{HZQd;WlN_?_YJ*Rm(s25b@mGi2b>wQ}jByX5D2?1DJQwpJ9alyU!*( zQhW!$@jv!9`!)NJRHj7#(L2Le0PL5R@3{I`qyMa@4*nj!FQ)hp2u9`uYY2Po1+`cO z{vO}YtawANH>57{Hmq|FvVl;a^OSshrcc91 zQveOA@t(1-lyQF8>A&hLrPwNvvEW~0pZV=`ut)#ls~kk1V?CZ{^v?o zUpV9k=J@+GAC*U!}y? z#xm0R(l+tA?pMlvWE_=qe9qsZ{QkMBqs^+eQjycf6C!=!n%)by9US}_=dXO$j7L3y-E7dIYW`UTE_*8=8Q zj9C`z(eDxZ&$8`vJ+DdZu)Q{yX0lZMmvvUHTtoM)zy1(f{q1|IxJy zH=t)dn~=uB<$vuB#@>WogYSX-t^L~2O$V3%y&m)yu0z+mloAIV~ z2Yd9N@pkYtN9NQs$NsN=5&vC497f&uaqQ74@B;lbG_w>38reDO_Vk{ZZi@b6k92(+ zdZ_rW(ckdN`VM?+jtb_&*v`{D=fm zH_skeLEI0l@~sr#CIPhUrvI-SV|^&CQ?0t{FzhF zD)b+oMm8ku*6QON`mZud;Rm2u8XNi+b;QaW(@oHS><+&7rWWHMzPt6Cy+ESf`1ND& zZRM{$!}nU?dbV1AcvEmo;5xWiMr$g0TYN$+=fBlQ>ex&4pFYaR2{}jlTkgwu58lq_ zu#Zdan!V}*bO7iZU7y<9V_mCP_nq#nLjU91mCffy0RY!TU2p|7j0%6@B)KlDeOq`~R29w*3En412LHsav`p#zK2qxqpqt?W^II+J+8a0B>E= z6DTk8A3PMgK5QxAz4WHg2LXBvl_8x&|HALiv_1k@1SG9x3cJUkAfM69Laq93f>Fwhpzx(~gy{fT| zzRzv$x}duDGX3}1mEvt!6XY9+{zT(2lERz0&DP^e_&U3)zKAw#n*LL#>no6ndOVM> z^{qA9`OjATBwu4SpXQ|OLDu&{Ui7u97GqcWNxeU#^xw<-b&dX$$Jg$jjE?@^p{CF0 z+#&H5%+;Q5*4xUp@3o6QUoo%m|EDkh9KTP&h(D>*fA@uSInBR?zf0H1s_HxMb~#yj zM$(5o`F=(}A9;QJbtC#LJrf9jWv$2S?l%lQ7*Z^xU_b6R74PX9-2&F;4ap2Yh6xAO|Q z|Nl0JjFs;L#b1-LW6cq8rjL(j@7nc|PLn8y&xY)k=mk7BaIao}z8&!(DcJ=&y zp%DV~eI;K$$YNO|@5ouw ztI~gLbj0ZtjOf<&%|}z>PzbQ2jh6F#*oOs*7wgac+Wr3cF7(l#$7}ZfI#535>HXfz z@;~c`{Fd2E%viXNxn*04#!)5{k9 zr(TZ(6W3PtiE|UMPxbzs_hr5*f7Dz19zgK77mMEe<1}Z}^q;di1-(0|vh(l@tjcpv?G75dM7 z_j5G*D6+pw+0=e^&1nf}vv*&Fc{ zW4`Eoz-R|-jT5$7-)m8d#YlPN9Q@k=bOGpYTlJQn`C7FJ`@g@#eNkv<&35iM)mx)o z$AUk8k7xDv#B1lxT4$BA&iFb>ocLIm|MvcDC;ewU6*~YNsM#j)hZCNVue6sAyR7OW z{>sQ&>V5WW*OAuZNjS|02cwTB>#N7rF118^@v)}=r#;?(_L{kG33ZLsqj#=D|EWW3AvPK3NnHPr9}B(} zdS@$LMISwv{?ljoduM&0L;HKSPxX(v?7AxUlImGc-cUZrU&gofZfwiGCg3BYdRnRL z5urKSEej0dk{c_&NF_xA`I0$*-t1#_-Yt;y%UsT`J@Ewv+x7 z!`k^#_UV-7j?>E?{ip5j`*88a7Z2gB_gUAY^q>6f(UI+e@y5rYG{4Z1Io;Y$`cJ$3 z%o=Piobjmsk@5}Lqai@QAAR7#FU7wlUz8EOzL9I!W1_oa515x@J@9?cHQR;jH{kU= zZjI{0FVw$F+=K1&k-oA2uQZ>Cu`T|Gd?lWnZ^_(rdZl)7UVxuXL0$0-0rHO0e|US> z7qQm5{;);2nPbF3LI)|Jd})nu)uX;CU6=kNkCwp46S{}*CH4ZoWof-YKH`i8U%TRY zO=@#Y=g@!r3w#Wbk>lKn^~c}vZ!de<%cfWnz7JISsE_%kJzb0s{r5PV`w#A!WxZhy zDy{GE&hDE>9lh~ze`;``G|p;cOx>P@9tXdH(*8^OfUd-K8GD`nW0U6l0nWSEWV1N7 z_%5+#3QBX<%fRFNdpLW{pZBhP4sBZg=iPDrEya+VOaB>50X*!gz7KQgKYj6inosz0hIktoS{ig9pB5`+DwtLF*f}?EjQQw)eGzb)GiS9&GBaX9cgYjl}o)*$?>9 z#kjA%-`+>+W-VdO6F{Hwp$XBo&IC1fX?X; z-#BoDemO5fos6B==X4vsnmRb!kG)17dx)~&WR0)(dTM$Ey?0&ukADgA86rgb@6VwZ zuYUEbC%r26PQGQVgY~Z@BSQlt?z-NA`5K@5S^_=^7(;B2F@Nc|$2suvr4I0hZ^Yc( ze~_*_J=DA68t&^OcKQPc4otX*4?Z#<^*S*BnLGM!rPSxn+*m%0wYQ0PgLCwWZv-B? z9}#)g2JbKZFO6U6p7TSyasR*iN6LJ30Owf8Jx}SHb<<_r(f#wj=MLYlIdL(!oBq>J zkA2KoxPLa!9hYkBR2(ml4_}Ip9`l!e&!zv=0YBq04*Wa&H8dgGW443-(+X?yFI%pEgJPcx)fML7Y#ex`=&Nl8va3xd&|>0qA*2uR}ee z|E+qUO)bAkr~j>b^o;olpAzLWrz^@^N|`4fPa=-5*R$R9pLZkQM{xSj+U|Prm^c1@ z&1+s$UGLmxAIsH#dt2PDRLftw@4T9?Q>DCqkA6Gvpl{{tqvwy;@SV`#9A#=XM#t zyXZe{LZ^*Rl=Tq#7Tp754xf(=-hJZZm~03A*E{e7MJ`~!5N*O9ggy{mN^5_;$}5F7 z!AIV7aQ_-I5aW#<8M!y|St=7#e9+jxfxORJ%i2er9(Xl)?bbQM)J2>jY#Zo-iT{gD zg875J2Ofoa-^0Te{b&6~|ALO1`OKL&HJ=%$+gdXi6L?d;Is3=4yF|Vrj)~WEIOspN zpGY&D=F&ds7kGpJI<|N8B#blqHr7StU+k%+nBLyM-9Z1*i-T9lDCn+;U&wj|?xCCG zTSFh153YOgejv~B9DgeO!kE{L2X$yX;5qzUCodnb89PCYRTuO2ezQlGeed8LenaT3 zz+vQncy9ay90!jE`rjL~e17QO$sCg$lf;31u=PA=RH=8uf;%ixl7M9^gBuGQJl^u^aWw?M>8)ty#}>&I{#T z&!y+R6y3NW`bEUD*udDcORNIk$Jnw@4S$=~J{-QG039zrnAj@t2SgXHvc%0r?~G0y z-8N_TL>m;gegS!78%w|a>|FLJDG&O8-z(VK<3}0Jx?o-a;BRfb&>z!B;y9s`#O@$H zDZ0uQ-l%Q73%^Kov*0E;Og-$ez$cN|6C?FdA8~1TFS=~ngB}|lFk_G2HtrLU&n9iA zJmW-v&}VZtBx8X6fjtU3dqeFe^>`JsMPqNnFM&OYtSfwb*%|OvEZM858@)6BYV;d? z(-`2VgnwP!Z^8Rx`@L;`&3YwpzhK7~J@2KX{FSF zYg-Gj z{jnCtI*wHOkFSMbm9v;wivetUaZL1^d5B*@4_Hr1^uXyqKDQD0X6!BUy_(7sVny09Z3ZpHN1z4RCtE&xoHsB6@JX$> z%h-Og!$)8KST}ZmKflK5Cw?0(J2ubaUWG{ip*LFl;=A>m`Rn72E!ks_D_<#9On;U4 z_Um3L-3j_n3?;yM|5Dp@uf_W-&uEJO3H&>}AK)}g^bgtu&&iy1AF0uIwDQfR|IAGX zaIIB8zAwJ7m$J|;KX0;DUj6s?&AIlmJQC?YdpY1s^~ZYeF@Q7{PkG8ywtR!#LjO5u z&4D!-e=U4KSbHL003YtSfUi&7_u+m*$Sv`C&0mIkp(8Orzu6lj@HK#I!5sPj+;h)W zv1W`z@2jpk^Gkp)q3(MMJ@>sj$Zh!3688XkLFekK9`M1-bM5q>e5^0XuZ~~vztAbx zCu9-Pc=AX2ly4=d?Q>Hb@b?nbVw!p!7x?j#EXr8|0_KM5_mpprd@MkR!F)o0#y&si zF~P0c*;LNkzwwQ4oN$;ifnGt+ogPEGp|{=+u35YN>>k>LPZV+|`>ig!?6PTpgw6?c zos!c}#qUAhXWWtJJsu79(l&p8r2nFMZ~mQM=(8eSa})wC|bPP4u6&khQrq7tw(_9b=zVkH1}Ierw!nDLQn4uK}yl|NGwe zzN&6opKI?e-DiChuojl`fY$=_&L#aIF#ue~j(dol{$eKWPgb>#4B zK9`*Si|)Y3lwv<%^I@N+(|@OVl=o+PzuJyY($8DuzS=MQg_rT`8vXY?rEA8*zxAk& zlDZBT{bvmX*U&XZVBagYCC5)}R-7jZUnRU!Iex=SKJ=jv-SVAFW5YdS&|qg`zkt)- z68#5n;p@Or-(yETbLc;|Ac1hk;|sHP^owM3}oksT4nCuq%4_%7* zqc$q#Olt?u*4498x?AXf%La&!SKkKyrqqwxJ)bkgYm50 zW61Shm(%}9gI$(&JuWm>5YOLb{Y7>G;76m6fWO;g>(uP^6uv6>)XsY&a7yXAn6hLbt@6~GOcG7?547{@2 zsnkyNQtZ1c$wslg$ouH5{On5AgDlOyPQYV;pubX??M(L?{b#J){!2V8jo&8dzve67cn-91 zQ0`M;>V$1p@^ zsQaaqHCnLF{%3sS1dn^%NwGx; zM({4ysrGLN{bw&d`da{+3f~*w-})_lcimqr|Hw1&7X7{Yt+At>%t`!O=kO^0PV~am zEjy9wMkfHBe*zv7wJDTzX08)#_LF;|M0bv(Ry+t{X0_VzsvE?-^2f6gBB2XOWzIo zO}tP|Z{Tvo2(RVy^??t3;PPEg|D%sR{sV&ON2WNdCEo-;&ka6C{qof1H1}`wJn`Dg z_}&2MC}S4$>$lqvpv$^nO3_0I@Odod@q5@t@qOO6Z{H+CL6iA|w-dMx9{&o#I`T7h z)O7E(58JT7`8ucn*f?6_=Ka*Q^EK!g;+n2}wN!L))AS!5qkL4Me{=a7+Pg{mk3Jr| zN(AB&W81*Lr#41&?=v@{o%;{^?`jRzd!f6f^D1};`bqd*_vfJ;Ix_TnE!~~3Kdy6D z+tEkLHjSO5wm$&flj4&iQ?PcZ4yEWQ_%^Hl;pd~e_9Fdv|0njMsIQx#|LC5z$Ai>u zwygdB%&+0?)Q(;XE%bE}+f=X2kwX8SzPha(U9|%;s`~6SDC*ah$NTT~j9fzlRFAh0 zU7hZe68BCJlD{Q0 zlOJ8E+gM9@46Q*AF53h3wg7#I+9I7Q`SFX@{n1qPlQp$f#_i|sPwVub^|Vz-=^5*_ z=q!C;tccl&PXs=bB_9;8NA2Gv{RcPQ?-Aa|-|5#aUozn|I=7l{nfsD?z46+8*7;W0 z`$v4;V?A?!W80$tj+^fPUaAj&73tRaro{X#or9&a$oiTi=vkuA4LqfE`;4W_8>+)o za7OLLmKpgDA4}Rd7rg&_k^Z}#*8QJ1LI3?balOj^zgUO=X1zt{B*4xazrW|#wbMVB ztMz=96kVObb%0z8YQC7Y_pt{~Joz=(T(ex4u;Bsn&2u{HK31omdg`)_-hu9W9q|2e zPXF;a)H_Jwn+3=U{){;VV88JDx`rMIqMn%ZIt2LssLV);ys7b|4q`3$%K3RC@*QZE zkF zZu?7Z!#`5M`VOC1%E!G;(vsRc;(MT#=%_eHvZPCI)idWAbQc+nK5Cp97pH$-AL}MM z13+t>_8;O)3$B#(Lw<&5$v0VR8}pR4%->nNW>2a1=b$r$E-3FNzZw1!;0S-JpOn}m z+;f{Bd^`6_I!-SeuYHfuXgq~j2mG<1MRQI+{d8rUQr~mD+vz`iyPp@yo|c+#Rve!r zh5plS>A|2w>WBOSkVo+mME50G)6W(w=?R_wGtXV`GIH%SZM*2d`v)VltKX!uHG;4% zn|hwwbv(-y9jnHzR%RXg@4gc79`bvj?W`5}??K0-4HtiHfzyAV*E>!Byo zFF)s6GCzD*1nh^Lt?c!YADbBT8GL3w%AXH<#dnoFj(ozJ;^no+7aL${kBsL%8n3sT z{=-A!j}8Cs^A5jjUki6L{f9^Q_&C@SN9@?br^8AAea-IeV^I4%)&5<+6?QS^3^q2_ z0_1Aw2p~P#4L95{{boJ$di+}br_PqV<7Gweeetv2Pd~{O@>HJI6_Nlu~pn=<$#vTpvcg z_zvNx={`lOgBV-d3q)KQ$y>-FfaF!yDCA%C_dx9%sNPKfFBbEr>HqWrI{(mFMm@OC z#gd-JzZqo(@aX=`uQ#RtcRvF5g_Pu6e{Z}N{iDsX-!bp#@0$K!d(U`RJVy)P8<)9D zel8xvhP>jn72}h+1zd5(6_dZNXq($|Vjo0XDOZ~3F@Np%cG7=*@&)pJaJ|4B|9AGe z$|n+i3AEGY`slmh{hj0g$G%Dd@{QNy=e24dlRx)sKR40otoymFc8**6VFx3$35Tw z=X+^+hQB-j&N@wtb+JynobU9X78)17|eJ5xesrv4e*ZVpMU;x|DEuG6rCVGhQ9xqd4xX1j{dP#$2@^dG#0ALbAHCu=|JD7G)of3AIlRq20=H{XQ(kL)Hu zH(P6e>%P`~>e+7jU$%PQ742Ok^dEX48v=1*6l2Ey-qC@e$K$&SN_$~6Cd_x~{m}iu zL+Dv6jlTHXN&jhwbnnPG=t3p4Ap?!Zo$ z4d39*Gtb;Irt;(9S!=yTFYDm+f0g(@9^2_ip#O}c7#Zs(dh3@)Bl$LU#m^5m4Z3?e|XSZy_=x_*trGFx!Sv0_kF%>H~p8+mbEOlX@ve$ zM!cBz{6lBFF4>l~Zo-3=XqlI}=HPw;0lptKpCV*c;(5^zY<^zHcGG`ftKD~xws<>g z*Ti&zcL3O@9QE$-R*IEGp3?bI)UEL+4>2-gJ@~VE{9pFCIo+iWe~#^i`Qg8r+Wj016^#2=UFKlUhWgsoVas&8(}IUdB*!Ui$7Z06s} zJM0$v?=eX6GiiM%k5wP-o?dPf^xx~)P4wSm*ZY}!_ed#TlTA4pq zyBd9^`anI*GyG%mHN!T8?+btID-byScYH@~Mh5Tw`5un=P5t*y(tmFU>yXEcz$S&R zx3wqV%jfl0dVILYW4F+M-@hGWyT>s>b`;=?AD`>D)9yKEYp6Ua@4~*vpUXC$r+2*_ z^1t^DTU)OUJZEheAdi&dV3H3#p9A_fuOC@bet+bv$+2FBYj^{Q z#qvBu|KGE-qi=v-#{FTjK7M z+jW0C=)cD{#ouhC?Y%gdsslQ$wVpLR?iVMY%Y-#qSM|k|GhX0D&}}1A@h)r#*sPHy z@tG_6iX0C5PmCT1Xh>{-{OxvqbfP6)do1HI@1veWdGW7)%wrxi@g&$2&?Tb_K$ay| zbM)_2IZxRm0PhQ*3?AZt!Fjpp0(9P8kN&GZ^xf!b*z<{=hW1b&KBw@;@GQzpy3_O@ zz6F~MV+CJ_4umnF-RKQjJJ6~0WNv6O`(Dv;P#%7p?CouL0d&UwB2>FjR(M!SXn zyG+FT80%ZLKn@S zpI6W;=g;TRf62JWCg?BFEqh&D<4fyfpjbRSL)WVIVw+Q0k4Mw0*6$d%AMCke z4?KR5=p5j$@R7sc8yyI~zwk+=JvK@IbB?#>LOx6UNE}EUNE}EUNE}EUNE}EUNE}EU zNE}EUNE}EUNE}EUNE|qNaNwkqPFltZJ8ukNDOTTQ>Gl`^Q=|lxM^PyZ-v?r@d;#+)?~dKO>?=|2fxwQ-6MD zXVU+iw-KlFcj83iK;l5+!2iZDXJ0zNp7R)gmA&VjC&Iov&fh`K=Nu@`enu}q9P=8$ z1Dti%SxcUxMgQ|#){+UV%~918T<8)Ie4C#mr446c)zQUeO~9-Ck`YIBn~7FlyCsKU-4%+8>5sb?jpRcUg(};OsTXn^RCMMo{&b8AXPTJ>MlkKrO?EUxmRmA-7?~cWz z0qK7k#(`g+ZZaL2)jE>rMdao(7JDuAQ4NX3$Hzx3udJ+uWl27>94XNJ=(ER?kdTl) zvHo|lhxGj7Xm(|)wsdX1wz|4)@SVKt&YY}-|0$WMs3_|5Tie=rJ=gS-*dM$fG;OG8 zzIc&v_!!9b>Bw1%F4p{5@W7)ZN`J$Sn;5OPQSu5`q|MI13!PF z!}RRz+tF{`-3Y?O!a}j)Z8^B=p`xXQiEx;F*4r1A4!kt>n9a*$a%-w}92@rAfX%21 zgf(Pd7ZnrBar@JITffZUo#~gvMACrMRn`nqcg&uip6>786^)H)xJ(jH_3_ zc62D#mBTK~_r7MY+HCLYDqTAto7?^K4MB2;!n|hvQzoCzwV=86^=FD3`9+mJs7QEf zSpT^E)aObIM3&+@K8*BNHVzI> z!kNo-9RZ_q4AVa&oFFkWay0vi_q0`2RZPrVE4;E?6>n3D=+KI7jZFp?@iJhLfn`81*d<(b+`r02L5Zbzu~z)9{TDP*4IQ< z?QSVujJa>z%}fVIwT{d_0o8T`EN6>LOShPqFmjb+J1Nclp2M^7p}O8=&PXgGy137n!DwBv^skzmr4P4$s*5oq-MzgDlH7tTGoSb!w4<2oU1qbK zq}>+7I=ZODpK>@X!?{f=e`II(>iF1uH%q@r=WCf(R}5_ras@fso_!S?OJv)Z`n;t@ zX7SITujV{F?eY-_6BAS1g2`tOoL|3w!4eA*(uly`s;pg{u2!|Lw}F>F&)=WH%I7tvaGP2F>3w~Cviz3Uc}l?PR|A!*swzeEGn?Kd zhHXPH@_eN!DJjp77h*+x_ixMJN=Qt+cJ118|Fc7j-|gX5 zORO1O$0`;m9hF z%P)zJSYNpGJS`_DjyJ+C{Z8Bu-qUEkmC{_BY4Ew1pi%TSo>5uFh~9rc-ad0@=ZS8Y z?x9(o)5FEZ#kg4AEvlh!VwQRBzkbodUb1?kqobRj-+B|_G^%4-rl6s562cB=xP2Qt=r}n zcCb34eCP)Yfh8_3KJ?Vy4YQjxXrU`sJ!^nI@LYE7_}7dTp`)W)JRQZyRa8Vg#AqvR%M2>z_Nmm%|GCqg(PCg=*oz$s&-%$9 zk{d1_JIB&X3mH*AadVT?(<4LX(p{P=S3XN$?B8>9a&g&~Yb>PcvN+oMiD-G6Kl%Gxapsdd z7OYV_9Domxe~RVh=l75xQ}oY;zTwPoY-rHuKKYwOUDv5{x{N%1&m)U%I8aZ0)p>uh*-K=^;(sw_uaU9BD{4$$_OKrB@;TNxM zit>9;9_J;)Lh6H8bor=uf`S=gC&X^vkg{+pQC_J|pQ zwTWX_qwK0D2zt0T;Wp34#uniTKuJA@-*?}B_lp6U48R~>zvCxEPd7F;h$$(tTCACM z_&i7W`&cyJbdPi1M#~nD2MD3s6h-g1gC=!(Y^C?!n2N@ZTH}OLPh@3lvieocNf&)! zcUB`};d1DY=PBNM3N6d=6Sj!U-~F)1VLf)%c7w^1iRH80uPWzr-PMDGLC= z_#%JkR12xgv!i8S*p5<&vbI=uL|F8t@?sMaDeLNzKnW&>)R)F@r>3O#n(ZE@RcDmN z2iFB9w+6sNiL(y60M$%w>4k-bhixk@I{;@Qsea}mUDE)*WT)$#(>C`pUc{!(^P0CH zh>V_I(qwz*&``XHI1#l#cTPYyz(Q-$9l$Ja&bUPV{&r9Jl1B;Hn|s{3H45DSdT-r7Y)L zLshi3S)Hk(m1rcqiN{Lrx3#?@LPG#H+Z^U%)onMOX&s&eTY1 z!|y3{K9`9~>}&ey-#e9KXdLP!IXI%6Qg(&2?GDtEDc_K(T|)%71vasU06FZQ!6Ni* z(~3V$a<+oY&U;UWc0B)zUS;{VzU@HPg%WX4lm8h>*Gx@~KsDOS04*q^!GI5{otQbE zKYw15JSehtK!U*HEtwD}L(ab&>+4%*7I$l-{-jBvVuJt5s@+@v&J9+9+L0kiLB~<^ zy4PGL)ZAuG80Nbtj>CC48JU?wWe@p7UcN-<5#9Rq`E$gtZ3<4qx#hQk$^I;8XlRSa ztpOiy?i?MlZthB95E2qDQYk4ak{4Y}s3B{k#ckeI&%C{Pf=|{N^Y&gfu5eb5_Hbd3AYf)iTX~jwvUmgon+Up$p*L#<%Bxj@L&qLjx;9?fEyB2 zzmAnYs5JkI-uFfj@9WpEed1+LX^q(bgPQKrD@We5P5!n=-`d))9ITBoo{eAxc^yZE zg|$SGv(GIow8hEDNaz+9VIz`p56TSU&$;m5NQ$i7DI2W(_B zL-kc6TfCzv`rP880;W(4Sw7=N>KBhyOIup+F^eF$1v|{AqQml}hAjek1RLWn9pIDsd^m++jZT=n%SCmBn&@W?vnYhIpqDYF^oeau!73p8s~^kw7Mm z^oOOTr91B@2W^eb%*=LwJ1`({M)It>AsROuRq2f$>l+iJw{Qzu+u8Bct>mk{zLlwH zZ(p?HpCdWrfUZ+*tGN^$hs&BLOLQHo+da=fR4~i=>FVkVyxJXPIe!~)+LJ?h5%}+n z-XYkmaN%QM$BR76f1>@1q8Fc2kd>W0xZGFgrg6+c(2piKLmf&y@3jApGcTz6?gMrU zRPF9YZ7nVR428h~Rr}3%r~n>XU~4?82u4&yE7m;36qJ+_e50ua6Pyz%LUU$4A)Q!W zr51Ed`u%BW)9>U@%A%Ll#%YRK0K@c&)a=;U>vI;G+a0itA$RVV@LUo&PuF$8DN?2P z|J{zWzxC6o@@-vxJ!|#fv!m@?KyXaPUXaKsB(>?9|6PiI;(BLBrTGyz$MJNW1QA=r z(0S@h@*DbdYcpo|Xy^p2dK-KX?m(doNf&l0VL|>oOr->piy}`6RGgyIlx4Aze|IIl zcY;nb3BSchR6X(XV)e8~AIz4$GMI1s{Y}J#8avS?pzo3`qD}L>MOKEFYOn9eR!m&s zao{R4sn5S#qQ|y7B<*)hES4Gb*Iqwib98v9PL@$>+92_Q7~mii%ZuVq>!rI zxnH@=neqH+eIm9-mRnxs`O_y0<+h${qYTaWD@-#(Hvisos1c}7=8;fVR`xsk>7|e_ zz|M|$d3jk<_FBUG-)jJ4zpra*W9M-sK%NhaifUi_p3Xd7P%8`N#ujiCk?!=^TsboW zxRm)I+#vc)SdisZn4ux8o-BND6YjS;=;wc-f zl$N>>l>-J`W=(zP{R2C0?(R0?ya7CH8hAkoSYlmiKZGm311XaxD9@QKE+*JSW%;AZ z25*mn)A(cDdBq~RmeJi1sp|s9CMI~2_&Xhulzl?Jl0FNa(N)Wuk1FtRke{MBe^NuU zdyY$QBG5;(1P9vM7OWAzZ8}nWLv8r}pC>Gy4Y%)46SerH1&v2z=lCWoubX@i9FaA7 z)>6G&3oT_E) zBIkOx^Dgw{etKpXb`ygxlVNy@b83bzJ5B1kJv%RIllZ1*=32n`dyn+ggF z24tP`%HCxUt6#Qvvln9kP?PdMjq`VzZQ@j|v)^OY5s{N=MGF?uNVQLog;6~m=+n-%GkCj0*z}+kZ ze@Bb&txVT*pZubM;^VVx4c9DFF~KM$MQ2p!6klV!6MxUu)z$X52`Y^-@$m8vaq!Lm z?ubP4RE0QCnaS6bW7(2>-!uzi$Z)*V_V)fbiC1_Pj&B>}>OM>l=IVe?Zhug`7-XDV zP?F-WVrnGRw_;uXNij><#3H28@sFutOq=O4f#6iXgU3jKYl-&c$rJOf(xf_ssQfN! zEkw$w@G?qzMg7&Fb zUe-UmYnlDx;lkeCAcK@F#N0 z)BhLFU}q;LurC&JMKQGEoum2p7eb~NTbe%x`85SYU6&fm;|a&yydv|gcQ|erZBFE= zvyp0ls;ThRqzgX#=lFs#(rVcw(Cc{i<_N9)p>8U=U$g=AkUY)fnU84P+}u$&gb4u! z0%-~rjiEqZMv979y2Yfy``X^}Ko`U^bPBD&}T{cM?e|2n5uCwXbzC1 zlJVYt9JJYu%U*LA7y2`xe~a|XsdHPrp#m#@i_OQFE3IfsD2J|!8EMTkP5%QF^?Kswy-92d2e@*Gw=!+k-M!|N zJNF~-F?3ZES8846l^darsd7Hq{ZlnDnX62s`yiU+roV~qq5}I$lxdAfjNxd>{m7Fi zp^mm{*Co6^ST8&BT<38dy>0t5HfENx;L7Fxi1v54))AYZpFOMEPZnaOg{qx~U@1AP zR)ZY)_Eq;!PKDD1UFUN_eKZ2(7Y1O5whtC}wtx>P3&(+!PdWUC7b0Wed?`qNB(B z+-eq!^9ji;ErM#~DQUlH@hfps&p_$2mKMEd2?aY-?OwOaYX4IJ0``O1Xd9cG^IKc} z_)0;dXxUiU@4^y@Ywj>LAF^H*lhS`&Zp3b1TM2xv!6>GrJSG2E_II+un9zeL15n%d zmCTY3)M_^oiSabZlQv+0s7|aqh5bY+2tan-L`v~8|;X9%K$dLl@DD;lTk{! zWgS(1C%cO%xQWyAR=^>_-rsZ&iSue&6wwdkfHWQNg!dN^P|U*h!}nuXGAJa9^@4l`2f;U4!SvLbzUYk<M8ku&1m;)=cwx=y37=kQn6a0mEGe27GOIAZsWG(mAuChf~(E?P9!E2y1skZBc=YEwC0ktyd_H7>cC)sqEE<)8Il z`Ot0I6+FSNqORTsiqgxQ%jWIzWg5|bz|@R#9h;(?;jPqj$TjDN{pbm_zkG3sP{CTuCdQR zyBJF+*$VPvr9~U2WiK3)9H$yMM|u6gQ;`k)oiGbz?$YPWB~L=0%rvim158QrT_I1W zP>WV+L$QpBm6iSFY$HfQdG66MG2@FLim%pmHh!>5l!LYJsn%3c8El|-3~*|T<9`g|L~ekvi2W^|0|R=x|*L+K*?>Yv9`FpY?SxACs!eyglR^{ zz|GCgy7rdu{>oSUT@(Y?0zxTJtIT=Al9HJZS!(L*?ULoj48lcYf~%|fRbOIuKVrbP zU`B8;T7YPea_D^x%GqR`@UIy=p6g^66vwiXkO+A1YFZEn0Xig|kAcG*DKVc9fR~mn zO9x2A(1^YOh5}fe-$0stbo+x#!EM^75W;C#6P6*IITlAj3L39Y=2+6gk9Kc7N-n*| zx37^Rm5@He#sB98$Y^zC*+Vrkm4W{P6ciPC8T0`>qPX>Bj)yr#KHBQnzcIgkM{6-! zwoZl#1@NA&%rEI%5a%Gq=xgX$v3>U1?oT!8ioU`6upY#DCMH<$A&rcJ53;XrX=X`G zI*Ci0<9!2ikz+VN&QaUoMR2fU&s@41BGS+FXl;4ZRd5af?~TV_+bSH7fYkuKhBS!ahEQCJ zmV=~-h)C+_efE#7!T+!q+ZmIdfE!>ehFStR!*CxBwS}~W%T2N|-&{%xR5|a-I^@vQ z(&_{viU(+PkVgnWroPT&jwEv$6-?gM3JbV6E`jG<9et|9R9^77jsQpPy0}&Ay=V#zbWYKJeKJhxY zK`p(3Ry~e^D5!K_)|zP!q<3&|=pGmlW<->7uRVPD(EI$Dmylj6 z%5|YrRV~2qzny@Wt1o=foR!ZLY>~ z4HQw7nhe@M#UFCYHX!*@7s||@SXV{+1BW$>K{a2==?E+d1c!TT@z{QP{Xm}f~@w~lO{ z!)xmY&Bwp-PzetR_Lrs=%3v$e$`E-Dva_Qa$Ku>v5C~6JAW;DQ%mB1?d_uyDurO>8 zYOg><>iP*oguV3HTbc(&QAJHn4r~`-=6G^;=v-!0PY5E2o+lS%$)LAy=>f4uLoHZ2 z@Rjh{#el`@0<#EfdSAFc6&XeF*B~e;Gfna-fd4X2?`=u-m&O&71~i@bdy=;nffs=fuq2)sV12Di6Y4zd~; z7=ozyZL^{Es+x6x;)B9#PSbVKchRmUF;Du`I8Bm(*FhxUTx6(CTU)yeDoCZzo~_5` z)cx`1Qb$(OS~1mN<0hA4e;@=~ zBosI^J3-&+Cnh!wo=Hd%XJf-L^FO%%oX#BR85L8csfZbQ>$i)Oh-pv)Th*nJq@sd= z>sdZflFnht9AUg{z^Ps|15xRc8 zMypU&1YAqEr;|z0jt{3@Y!XR^LbW8?+J62t5qe0Pt$|F{IhXp*Nw_aXt+kf1Xvv=-OKLgV)mf3KJ}~3d<^|h9Cw{xv_OI8OpFoXE?Gc)VjQ5I&z7r0lD`;JOIx5$K zT$(SEC;tI!YS8E_XxpC=4)7%1rUO`oqLrwA@SYWW{plqKuNfJ1YaPIhq@IybQL#CC zzQd7$lfL&J3j@O(q!0~i3nVNef{&4TU-&whj$j3VFsFrUvCVXXGYv(X#n&Yw0_56A z3Qnf!1V#jmS=LiS>jxtKrvgGQzoLSIkdTlNo^jR6rUy=QQ0Z-17}YS$&yWB1U4HuX z>7(BX-{JObEXb|bs9c)Bk@rJGDnlyv{M--PUSiPe+hA>6L2Xc4CF6PM?|}E-fS!tk zBToz*1tM&!0cxwxxN@#nsi- ze|uQp@=QM(E&6J37oZc1FUNxi4+?UnpUk0TKy&>8kh=g`9fMf%y-rj_geS8fPO#$a z1;F&@TxNcMuU0ogE6{iN?_xX9)){;I0L09`wLuJ-wMloHS8&+)MMp!EB|o|76pp-u zd+z&m9UpV3rU(o`i%o27{|Q_ySmz)k>U?su84`jc8wr?jZa81vb{duTAceO=lAHBE zq6L=_QKr@_ur&_XQKOp+P+y~=i85{U{W>|BHu>1fDi};Ve2E#r3-NfC=$A)8``9uv za*yx82iTkIcqyq-pYuOy*R(>rMZ5+r$;Z#1-;BLG`wlJ}u#w4mOqRlj8C2U603E9s zklU=NKC(ZI(W2Wih5maMRJ3J!H$Jrj2b2}T2UI=2PX(bL>g&5;aaE@+@dMxtTc5#o z+r*ZStUfv1c&KY8BJwx;`&V5lY_&`!*x%H&9k7mA4`>nqh$Tdoc7AN4>pU_e!R)3D zBC80Tsh5DH66+Sl*rDs5`Ro}vN`Q;2OQT?7Y}}V1HH0zuWxMH$`K=haTNZG?!1E(4 z)#PTt^1xR2MJe?X<;#WQMv2yfWtQ~A1~(HXu24HWhm10%Uft=0L$`Cj{%Og z8W{(k?BR%Tw`+lvH6XpbU!dRgZCTtUMgkHNGc%o^UP$C&qdLv*ZSkiYItNjIl7~VD z(hu# z#2CV8X=@8k%?h>dgFk6X;X{uwFb=(^=SLpP-B7Zazj+qX?# z6F^y`I<4Vy)b20mg(86OB1g%sigZ!-Ee7fH3te>tx>){rksJ?RpCx{>Mx z5!=t?3FV5@rwJ-V)p1tf!PtYmOi0r`<0f!Ei`i=ohiDs;g6WB-xRqCyb3+k7IG%Z1 zpgDlI1QT$DSK?>6b;Y~HLBL}rhPQ(|N0Cz)OpJAO04n-_FLQRj;x8MFd=KDO^P3{n!GegqszN2yMTy(cuUpl^vIEqPd7uoweA@w_ZOF=GZ0 zIK%HL0RakXL!U^Yy^RIPOY&dbuRB0499bg9TqBU71 zJTwu{HL~JTYuEYtxj7lJ+rEdTFOd}wu};7DEE{)m<e;Za3@^E)5)6lng?YC03E7$+2qRXT| z$Zv3V7+Ha{DL|`}s+Afz`TO^8odON2@02nF!%$POVitH@e=F>!4^O3k7%6&K%>q4% zTEKLbO=Q7=VeNmMw}$-yk@R_Xi9d9(NP(dFl==e#G-6-U$k5ZG&^Xj~lCo+c$6noX2Sk!cITp z9+s4VL%%rv?b`u`4>TfAf}Eg$i19~~v)>SMA~s2w6B%E7othd3kP0vH=(f%xcjCXqVIrzg}>n0{9KvM+}7Z`EAAC5HfcGxP?nMZ z#wQZn%06(iq04X=gVCqwC6D0?h+;6%TV~Z$`{Tj(f(z&xsEYD3GRPk1+3D$1BsuZYI{;J+XIj|nYX(-Y_}%Aet;ltvBSl}o|Hglc}3qiNs9 z$0>v#&zMimPi*q@^M9w&3CR|Z=C$hNS*ieps_OE94XiuBa@)1m!hD8a;|f%5raY8? zxlc$CW3GBYiqUg-cNaHlP&EqKxgw{afFZJFMl=mG127b!imn6xttAtkg))UeKgYJ) z(x)qoax~Bsl5;+&skR1FBb=Q6KWk&9h{pN}m`~8VTyHK ze=JY3LJL`>6qt=_97Z}h8Z_A>ULYGkzogWhtXDMmj^B^y`UhEEF`Q#o+1A?nCYaR$ zQ!47{5WhET?k9fMviLSvkdb5a+-qf!VMvUDfg!IStjnCAA0&sM;rid<7($DClWK&0 zhz0yU$u0#wJ-3(&G|0gjQOsrIV3oB9hxc6ljQwi}9~s$#+ay2A7boDYBoK@VwB!~> zGQ>P_0cqSqiL0A}Tr$UNUQXw(scF9>)CK5(?>r z&jWj+0h8{DH{-XuZoEN>LEvXsY%_)#gFcTSxAo3UG0#>w0}T3f(g9HpBL%94qXCyE zcDll1VulHRxE18)iVsI|(ZEc(G22WJain*S`5HTjN1d%4vqWDd>uWpWN6rUc!{+f@Eh|Gh@{L| zfT5YESp0_8Zfa`3&ublVXq5!ReB@RNvz&|^>#8s+zpvkB!T&eB>d`LB#muZYtjC6B zctwpJ1)~%L`PUD z1LEQ5?c`KuPb*r>eJT}p4T(8>a1vkN3xZ9&mqG+0U_Tfn8k4b&L*%PN&hL&V8>z1v zzJUET-T!%DIM=2zZmO-QpZ`>GSUvs|8atM%TdbzFPd5#9wR_PgAVX(}xS~UI2do6D zX9OJpg8G|BFAzgH`avK|^G;9zvj+oItz%>4z-ty6)pJpB8HYi81YUK%{tq5C(fZ6S zkdE(Gm4+ffDn&RXnqIQ00gX%Z;>8OjHQ98fNl_JN5PBo&f9L#LzZ%(n&VlpcFsxD0 zmwOP_%Jd(Wn0Pm_ZsTd-4NAkSFe%78k$=C41zt9E*t*78<$3@ZTC-=KI^pK!y}KJQ z98nEAMfC~|UOG}lj-F7p@eq5D-huQVShZ7~A<`J9IdHz-fw7^HlO3DO^OLKe*s3f|_^;#JQZpK2%Y@>Rr@H6u#ge@yLjFBV;WFvoMolT4 zm}qh#C`8f;x@jzQy?0etP`ukYo&atnq6b#6lPpXkIww~nAW?4)Kq4}qYk5vly8yHy z{s+f=7l&nOw!2(0?0$GHft^@E3mSxue%IbC2cG<)tkS$rS%wLf=;oQr%*XiDE|75) z#P4us-!E&|``IqzMGZKBDLD)kF!Z6ibXVwfrI7Q!HDIL~3);b8rdoZQ;8!>YoCV$6 z3Iu4`?!v$nJ2ue?Vq}B%-{+n^>3H`9LGe{pS%C5w{}hv1$OM}<>r?A2`XMU|>fhIV zAYm+1g3+QBv!Wzi*SOp3K_qt0N=Ri#fc#k2Cak@0Ifd$6cQoQ93E^L=p<6H zY1qoIa26SV;yaOo-j-ZmGyj9lHwrh?ntV-MP@*(2t~iI1zIfXAni1FScmUN4gyr4? z&$`vpGVL)`WG8(gUJw@3j5omI4(f1ks@`kM^4B^#=r=b6R?tXwSR>wb;yeK!^uLzc zCgmK$Aee7C#EzNDV+r$vz%gJ($Gpni-M`FWC@251iIYfFoZ-CVE04oC|GViz2e z9cbBdz%IFX&VIi{Vaf*>>gu-?aAwOE#()vJ?;k8z0~1?5uNkD620=P37&V(HNZUO*`B2yV#g;v%AeF1}JSp^ooD^XAipW!TzJBw&%%6~? zn)lVX-~Jmjf>{p@yL^_-YGw=>TsJXf-(BZT{sS;Weo|sf3;^2-PNj;5#^{Xb2!ofQ z2NL3-3|yLaU9sz(d>o{aMs8piFS2wP@#IA4{%TiFo=uP3gq7G;QANumVUaR8$CFllc-b69Aw#D#7IAV)m$^yEaTY&1P-XfpR59n^7Tigoj!tPV3*RZ#DJ)(2N@dJPPd zI!8`r@3n<7=jOpJ7>U>9@!>CTzM+1-~bQzD09Nr}wJNY~Z`15iEMY z7UTMvDalMqMlP-x82TZ-(`dB+=?ahfW(g)_Sequcd9Tvf$Y4YmfTpp10=EnY(HH%_ zljTOjwr8cckQ&B)I0v|)$l&;Wq(oteg8>1K$J#9p%&p`qL<--l3;0)x0m?HjaJ*l1 zQ98oWjTx33^iLP048lGZ>;h$sjN3HB8jtM#)!wiD{V_P7;?(ljmzFy7u7Dvde<_mf z4(dF~tEs6)ES`R%K)W=04Yf|6QZU#*OHWH03mH)gG{^V5IcFGieM5@V^qq`4geu@3)D0)P}`4{ytWUtfFV{`VSfJ<-CkEZ zSo+9FJa-~!c#1@s4}d+mcKteP0-bL@TLOHBgAjm9$G2HoU)`MnLRdt|=|>QZafTgk zli$%Zr`aE!A(|=%K~9&n_+3g8A0OXN^S=vi0sLwp5_k6YtjehV`Jn6MDBzGZt5Pu z8OR(I-~(SvYK0^Tg3t@1o(m8Rv%q|hx?uudqtJv510^78EL-qgM-4N8o{RbHaKl2Q z99I2!r;X@4qz9S2!opIL@oWa;DL}i}`1nlD-~&UA?SokKO?AG*4)70`uW90rSr59 zjg(*NH3oEzYZSV(W2H<8XqNJRei9*yD#%I#G}OR1T7nG{rBeW0?VI}e?CAXphtJm+ zS8ccNIQxkB?B-2A{meZ-@@nts2}sW+O<0E8K~2rz)A{JRPJvQcfFz!SqM6ew(khj) zMPFT2g&Ji9(cz|u$n^*BjV(@TS{B)Jn1qxA#SInx)si_J3VtTU#Rb6|&EW+8sB^xt zpsqk_qMjE7r>BQFNB9kjQ~>n0v}A2-TQdA%eAT0GL*JQ3lGZon&6^U{Th&G2ji}`7 zPD@L(%@H(2{l)OFrQxb$_G{!xM)=^MA(rkR7~Zp0=Tnr0SWuu|rD`xh@qtO&1&J31 zy6tkrFg!+1dW;(A9jy<2Sz1~;dBmje=kL#4ZU+29i5nWy0%IObnuRqd_ewy0`zEIC z=&3Wdez3E<%a{JH`2Nn9fQ!#%xKpsKGIRqP zxH%oz1Rmy|vE}dX{!xD^5q1#k)?qJT3AY|$r3qAbj}*%Fbn^M*$B%QUIlpi6H}yer z>RsqTH3*{)?y32$mR%#~e-YekrgBaKm)Ybh3vkc7gGe}C( zg3m<`SS8dmF_vi017(r_H8=cYGCjlj@5v#kmkK(X#DI9h$w72ccNKko3K$9}rl5EU zIa&Sv2=w=FH~4LO$tD+uD#t*NPdGqvoBv}naX7@T06qfsXbL!oD9DMrKG+i!Nx!}A zvXtN7mQZHx_O}g+K-TX|7^}^bq9tM6*CH=?yMJ)NJbj$U4gW~dfjJ^N{+i^p=J8Kz z5JTI+69`rV^hVQIc-(;%Sn#UmMQQ}xUZp#mRc0r$s>f0^31cMn)7U zTWOr~KEA#Qb)foZuTih+efDVDhY40*hG4gM0W@}MpWDTWf#^~B#SMfFc*-zgrt>S% z(BS@(*T{!uyhrY3+8p4oks)#oOvf;(qX1ezv|_|JZbX7T30QBcl7)#!VI8G&D4rjvW4fgR>E~82O&;-tIL3A5i{98cAQ2eGY6L zEb0WP$40Cqyax9+l-p3C!5N`I`!;6H1OxqP4jD6tYA0lwJCyBSLEK(mX7K8fqVwG^ zc|tI#e0+9Rs+BUGuTF_FM9FA9*W)xcHb$A7P!hnokk^)RUxw&N&VhIBT(e2-!fP=9 zNk~Xw=bb*L2BpCw!*7gh)$sF7E2Xbb62;@(SkzPHf+jE7`#1SyC<4_BP1dcjx-=9LBQKPe4^m&Z0HkkVKp7Z9=p_q8^NetyC*b+Umf5F@ z|Ni}Z4R3C9>iU(9MBU>+ZIsTE7MBgG9iOF)Um6Ujj&!EWA#a47do%37!h@R41QLNp z)U7@0dK8`Ho5?^Zowo1jYpMrfcH2h&X-JV_ZHc`|Po-6tN_wa)0?A7`VB*bcB~X9X zX76kzh`_7NV$BLpK``f|p4S0J0M+4*T^m3Fw$6hX2#;ufe=2XVPc!)Jf#3ZAvJh%y z41X8tvn^uRFS|LN*ZR|YwCHZ|=<5XG{HrG50Adikaj{uH`=8#ZCbb8T7trMv6{P|+ zmMY~h2A0LvI1Sk0w4#X1I^Zf$_W++sd9Og@EBHgx&?fB#egnNK^avg!ldQUUB~{=$ zjPDU?qze&%)8Z=UJ2%_JIC%E{) z*efap^~|V{B5%7X@OO9ik)<9Jbs5m6=~@DP?8Q16pEz+J}S zW*#txff^^jF6Aczz7uSVcO3=oIeH*H;6egZ)#bpdRG|<>zo~DAhxVbe(gM@;O-NUJ z`)$K-;6W-EJx}cfHe1!mg&8f5MA3e{jEdAQBPFFPM5|F1qXkMU#BvV36$F3ka}F42 ziJv#zea`+4uzlWl)Ke%7Yi>5PJGkJuR0#z=Dr4`s?{%R+S+t)M^tt<)E zqD8 zwKOLKsI2H7UfD;&NDDkRp)WaQ<)ItO5yCkH3-1k+LJTEncfrH9@vAW%=6%lspoH|uf%I%o<$9UmvlPV#0%KUwH(~@ztAvf*4!nK?F?b`9IxU_dk_=+`o>IkrGOzai>FyLdtxcjMT}< zh%!RS9*HO+DW{M>{CPg02Y37SqKuD|gw28Uxf%?i!FlV-( zlF=OmI1QR8h$sJkQfjKC@L2!w@S$OoLx)zP`D2@T0~R`$+2MlYRhI-+vOcc-2CU@W zh{Ij7NGq841KV+++N?=LZ%#I4lqWf&G7N7tQxmneZWdAY%I*7W)WUWgK6u;LV6vRK zx9-qpF(|M-7`|R9)-3Ob4vH5R=g0L;7EGbKlbt)_abngusbwxM`kQ(F93GA&wE~$d z^r#Igf@qJhXUl-cO@{p0E78?<}Y?(o*TTHDvb9XvRmLgaUo|tz%nu(AQ4@`_NTT2D0__60%f1(~XS= zbweLIZ{4V1*}?h^Gw~Q|EBxmMb5bHle*L;PSQ4ka1bGekkXn5XB|v%O%Q!pFJ!Ml{ zfy8D6_NXTTyMYQJbL@K^u&_I3^*U7R@S!)S%81VzGY}?31_GS)`ukur$PzD#j2<@% zk|=MePPJiAVD==RP}V{edXto_z&PYqXf4c5GGCOJmnYlVdO_8{T~*GA;=Z&A-H5ZEajYf08#b?6w{E+Lox1eq z@O68%r-ZQmh9_v!uPFQ8@Z)hAM{)V}N1wB0K+b>e(Y=h(i)Bp) zb+_Xb?m9Vo`s~>XaL{3RQgWU>flgfs+Cm^Og25{8qNxTlwTrw4jaq3*!x!IsK8%+z zyey@kgFNhhu6P9BBogfH>_W3!H=?f!9ZxQ@m?#fgkgBqZdQ)39PCPKjl?=beUq!GQ zo-ArI*y3LM4l8$1=$UJ4*7JsT4PtKe~Uhcr}&$!&8yf-}v!+~{6Xvn!;NQ&fbNCsn&6z&`76n(@~^oQQf!1?>h z-MTfzgz~*Fe#h=;uaPny8SJ&G-0-&Aj19?@9nbhvIrVs9XVy)~b1aTv7SO%x|= z61R$x*A&VrE5t(@1yBGIBwaeAA#3~qEkw}Vy5|Rad&SI-)@O!a%sF%BjEPb_^U~BY zm`;P!)6=&{O<&G}^#zlkO^2RRf&n^D?l(3`fP0P8+tvT`r*>%!j$*mjA|M58{{ke{ zGBkOx5pM1mS+mA&|Nks@9-v69P@XW~F~q)*JwsHLK@^7RlQh(zO0dGOMF2$zp|4 zjl&)g2djzzgk4^y!)R$^uSB*Sd<{NCd;6ES>XQ6jZl)HPbgi^!J={B%v}>#^_&-}V zQsTu4Ap61r6{ohsZJM?WF-&kEv-zGHtY)W>W7}On2&}F5{jVq`Rb8S*mK|5axn4Tk zCt`TU_k?;*a~WDV&=lezrDfDVU&gU1y3x8cs{7rlO*H=yjI-t~8v7h3R*M{+DXqiN z4ACX8z63Tts`ggYwRkv6)jG&yuOvwmcu{R4mjF+GK%lBE=*-dzgF>*GDIvx6%A7^U zXY_cV&ES`Ag){;-A-TaV>9h;m2Q$Rp|$EQ)0}i` zjp+h`aHbuU3|~E<{s6TgLt_3D1BUh@uRA!Cg8jFvC$&ugzFqs2jT~>Abrw9g;jGrE zEhGm=1b&hpbi*T=-g1kJSg?G3isheL(Oh;i<c;WpkQ8-!J_21Gi zBWWnI9%G|_7%ch?q5U|&68(&%vq<`bajZsjf|LQiu(=&fgX3P1< zaRnmpyd_>hSoki}y~~83m@|{mk_)*M)xAfEN5U|R4I@W1>}U8dU_p;bI^AJBg&I0S z#@kW*v%8GY?*7d=hQ=T#7x#?!_xH=4(3?+5A3Z15D95Y3qv(Tf(W6Ad(Pn>eU+ASn zzcqOauRLWNeaRKL3ecLo5zYNXpPA12U!fmnn`u07F2kOETeZY0|Jqk(ro;^bfHnkt zK}u*BkQY4Ca8YUVc)ubTY^m%nFqW1Yd*W3J}~yNv7$(j0oAPpY z9P^^!Mx17~f(C;~o{a^I&EF}olAH5kxkvAWCc zu99=|m2_<`${tV$*jJnPwJhO!`3b9yMzvmx+580Dj31KwdwcI5GCA0dr`*k~2UYML3(J2Y!9@l*nTwe3I4U3WNjh_= z;R7p}VI#j&cROixkSCwsf<;Z z)zz(dJwLXb>)kCKZEbGkG3prVuwrch|Cu#b18`tkB$w$$khDFSgAA-=!-0s;hsXAd=^x;2^4(Fv^#y&d$ICdRrKas6?NXiL{3VR zsJ=TZn>2oY)lTmZd!W8Kz+*D zuH~@APUx!(dg5B07vJ1Y*z9^hf_$jhllh|8_=JA8=Nt)GMF*ZoE zw-U%wJ(={Jn{O|4()@Jiu#u6_;P~Yq-r}sJVWA>wlRjsG5G5oksuG^Zhe^UM{I8}v z{Ky)}x#0k@^S?^0pAQ8LQB`f^p_sglz}ar=RbUq&c|5{=4JUdu|ci*(}~WgjG8 zdH4GJ8}e@J4(orJy7KIq0^I)0_ioDtSk~+zLrtQ> zZ=4*&wk`OrJ9X;R``;_cqSa)_5~Qo*MiAM|fb-kl8+NsNPH7M>CtB^`FP>3h=|-DsngvsItD@8;%~>|^_8A1C`NrLQN0jE_#<2M9Ld>-mc`=Rylydo-zT1;Mv(rI=1i4Us<-`l zE38rE8w$xk zuke+>eM(n1Ja@(baWwi(mbPg^>A%4kV4O9 zO)TDo!a>JbyBD!w_28~GDvTg2;>Ir2Ayb6mf!dI6m1Stranj{3hO5~E6O}+q+|RoZPnA87bX;6L4S`y(p~#zSwCm2^ zY0Nd;GBYzndg$qNx*8dyYHs%EuipS887rbTt0vc;U&D4B47=`u7Z?7XEx$1EbOA8r zF26zM|e#pnKs1DUlmh zuYsS}K$Q%*J0zkY;80<_%~t#c;ZF^a=D!B$rTmh=Tvvvpekca)5VyHvbfn z)quSt7WunAr?uypo$l)xQ9S@WKwZDG*hO+TH<7_ps!ur{AgQdPGCt3zkUZ_6nQ73` zUCZuYUQx2Bb7wVi;lhQRkDtCsa)I0_e{G}neKC|;9+;)Et3h-Blo9;k!Gjx;_Bq+v z1v{C&B44`{2i*;lwG^4QV>K7P>OnM*)xJYb(6+1FDWSEEU9Hbz`1|+FiK(eRS9c}k z`X+^w7VZgzGE$%2yI1q=|300$lc;ZK7+;w<(_CGB%`eMyH4z#2E!LQN;iBZah-&0e zQ0VD592(GDx|lxXw^mTl*2l+m83%{um5p_>(p>!(d)&<}EXMth*gq=@3Sw;-sXI_x zTk}n^R&TT?SKAwd^*!HYffqA7a)#T?Ig5YYYj_#w-f8PeoMah zg@|it(C1=fVRsj>-L0U2K0D2_@iorBESxE)&!0CNb8wm}c6W12Xm4+qE|K0C<@eBe zen^TS-b9Tqa3dUiJ2O)qTT1W1K$RtRYJOhokIylU%;>_x!g&8uG(sz>swN;s)gTi+ zVoWF=nrphZxER2-EC{5zXy`r-h=o0qlO_-I^X(iQ4pdZBc+#9TDFiXYGKt3YH?;p= z54<&ALqCtA#-c64ya`Fkd_Y_*AriQUPa zk-r89VZQt&59`m=I5O zU0pj;U=4F4D^d5r9D>!F-^r()Mpg@dQr`Pz#IRsqF zUi_e?>tDTkm5K$juuuZ4AQRyihQ?+mXXk3=M6zk#q$4dNBI4ARlov0Qh5`v9W4?tI hZ~y&&`dSk}abfL!TqbB-hpQwGY8~45P~-UJ{{<~}DsBJ( literal 0 HcmV?d00001 diff --git a/QuikTestApplication/font.xml b/QuikTestApplication/font.xml new file mode 100644 index 0000000..7ace8aa --- /dev/null +++ b/QuikTestApplication/font.xml @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file