ForumBlobPost - Utility (Ver. 0.4-0.51)

Post your FreeBASIC source, examples, tips and tricks here. Please don’t post code without including an explanation.
sancho2
Posts: 547
Joined: May 17, 2015 6:41

Re: ForumBlobPost - Utility (Ver.0.4)

Post by sancho2 »

St_W wrote:Hm, yes, the easiest solution would be to allow attachments in this forum. I've no idea why this isn't allowed as the necessary storage for that shouldn't be expensive at all these days.

In this case however, we are talking about images, which can be easily (and safely) stored in a number of places outside the forum.
MrSwiss
Posts: 3910
Joined: Jun 02, 2013 9:27
Location: Switzerland

Re: ForumBlobPost - Utility (Ver.0.4)

Post by MrSwiss »

sancho2 wrote:... which can be easily (and safely) stored in a number of places outside the forum.
No, and no, we don't want "external" storage, in the first place.
(It tends, to get lost over time, for various reasons. We've had that to many
times in the past, also: me and others, don't believe in the "safely" part.)
we are talking about images
No, not exclusively images:
you can transfer .zip also (which may contain any other file format).
E.g. compiled libraries, programs, icons etc.
MrSwiss
Posts: 3910
Joined: Jun 02, 2013 9:27
Location: Switzerland

Re: ForumBlobPost - Utility (Ver.0.4)

Post by MrSwiss »

@leopardpm,

it's far less involved, than you seem to think: phpBB could easily do most of that:
but, an Admin would have to "enable" this features (as in other forums).
Secondly: it runs of a DB (MySQL, iirc). All data is stored there. phpBB is just
the FrontEnd ...

[bug], [commit], [commit=], [wiki], [wiki=] = never tied them, can't say.
= works (strike trough), whilst = teletype (aka: fixed Font), no longer
works (it did, in the old layout) ...
Last edited by MrSwiss on Jun 15, 2017 18:21, edited 1 time in total.
leopardpm
Posts: 1795
Joined: Feb 28, 2009 20:58

Re: ForumBlobPost - Utility (Ver.0.4)

Post by leopardpm »

stupid question: would a forum have to be hosted by a server with a static IP address? Or is there a way to host through a dynamic IP?

didn't know the "s" was strike through! now I know!

this is struck though

nifty!
MrSwiss
Posts: 3910
Joined: Jun 02, 2013 9:27
Location: Switzerland

Re: ForumBlobPost - Utility (Ver.0.4)

Post by MrSwiss »

leopardpm wrote:a server with a static IP address?
Done this way, most of the times (just about any, non personal site).
Even, if the Server is only "virtual" (one of many, on the same HW).
leopardpm wrote:Or is there a way to host through a dynamic IP?
Yes, you could use a service like: dynDNS. (dyndns.org)
MrSwiss
Posts: 3910
Joined: Jun 02, 2013 9:27
Location: Switzerland

Re: ForumBlobPost - Utility (Ver.0.4)

Post by MrSwiss »

Hi all,

I've just noticed a small logical error in the EncBase64 procedure, corrected in:
version 0.51, also updated comments, to now reflect the BASE64 encoding/decoding.

ForumBlobPost_V051.bas:

Code: Select all

' ForumBlobPost_V051.bas -- 2017-06-15, by MrSwiss (ver. 0.51)
' original thread at (current end):
' https://freebasic.net/forum/viewtopic.php?f=7&p=233399#p233399

' Credits go to (in alphabetical order): BasicCoder2, caseih,
' dodicat, leopardpm and, unnamed others, of FB-Forum
'
' -- compile with: -s console

#Include "file.bi"

Const As String ForumExt = ".B64"

Function LoadFile( _
    ByVal filen As String _
    ) As String

    Dim As String text = ""

    If FileExists(filen) Then       ' crash, if not existing!
        Var f = FreeFile
        If Open (filen For Binary Access Read As #f) = 0 Then
            If Lof(f) > 0 Then
                text = String(Lof(f), 0)
                Get #f,, text
            End If
            Close(f)
        Else
            Print "Unable to load: " + filen
        End If
    Else
        Print "File not existing: " + filen
    End If

    Return text
End Function

Sub SaveFile( _
    ByVal filen As String, _
    ByRef p     As String _         ' string might be too large for ByVal
    )

    var f = FreeFile
    If Open (filen For Binary Access Write As #f) = 0 Then
        If Len(p) > 0 Then Put #f,, p
        Close(f)
    Else
        Print "Unable to load: " + filen
    End If
End Sub

Function EncBase64( _               ' direction --> to forum
    ByRef iStr As Const String, _   ' source string-part ASCII
    ByVal n_sLen As UByte = 3 _     ' length of string-part (default = 3)
    ) As String                     ' BASE64 string-part (return)

    Dim As UByte    rmdr = 0, s_chr = 0
    Dim As String   s_stmp = iStr, t_sret = String(n_sLen, 0)

    For i As UInteger = 0 To n_sLen - 1
        s_chr = s_stmp[i]           ' get a byte, then check value
        If s_chr > 127 Then         ' if leading bit is set, then
            rmdr = BitSet(rmdr, i)  ' remember in "flags" byte
            s_chr -= 128            ' clear leading bit (MSbit)
        End If
        If s_chr > 63 Then          ' second bit
            rmdr = BitSet(rmdr, i+3)' 0 & 3, 1 & 4, 2 & 5
            s_chr -= 64             ' 6 & 7 remain "00" always
        EndIf
        t_sret[i] = s_chr           ' assign to return string
    Next
    t_sret += Chr(rmdr)             ' add "flags" to string

    Return t_sret
End Function

Function DecBase64( _               ' direction <-- from forum
    ByRef iStr As Const String, _   ' source string-part EncBase64
    ByVal n_sLen As UByte = 4 _     ' string length with "flags" (+1)
    ) As String                     ' as ASCII string (return) 

    Dim As UByte    rmdr = 0, s_chr = 0
    Dim As String   s_stmp = iStr, t_sret = String(n_sLen - 1, 0)

    rmdr = iStr[n_sLen - 1]         ' save decoder byte "flags"
    For i As UInteger = 0 To n_sLen - 2 ' without decoder byte
        s_chr = s_stmp[i]           ' get a byte
        If Bit(rmdr, i) Then s_chr += 128   ' check "flags" and set leading bit
        If Bit(rmdr, i+3) Then s_chr += 64  ' check "flags" and set second bit
        t_sret[i] = s_chr           ' assign to return string
    Next

    Return t_sret
End Function

Function ShiftB64( _                ' ver 0.51 BASE64 encoding
    ByRef iStr As Const String _    ' source = ASCII string
    ) As String

    Dim As ULong    n_run = Len(iStr) \ 3, n_rem = Len(iStr) Mod 3
    Dim As UByte    s_tchr = 0
    Dim As String   s_ret = "", s_tstr = "", s_estr = ""

    ' get encoded string (8 byte, from 7 byte "original")
    For i As UInteger = 0 To n_run - 1
        Var sPos = i * 3 + 1
        s_tstr = Mid(iStr, sPos, 3)
        s_ret += EncBase64(s_tstr)  ' encode to 4 byte string
    Next
    ' string-end processing
    If n_rem > 0 Then
        Var sPos = n_run * 3 + 1
        s_estr = Mid(iStr, sPos, n_rem)  ' string remainder
        s_ret += EncBase64(s_estr, n_rem)  ' encode rem.
    End If
    ' shift every byte to "printable", add 35
    For j As UInteger = 0 To Len(s_ret) - 1
        s_tchr = s_ret[j] + 35       ' apply shift
        s_ret[j] = s_tchr            ' write back to string
    Next

    Return s_ret
End Function

Function ShiftASCII( _              ' ver 0.51 BASE64 decoding
    ByRef iStr As Const String _    ' source = B64 string
    ) As String

    Dim As ULong    n_run = Len(iStr) \ 4, n_rem = Len(iStr) Mod 4
    Dim As UByte    s_tchr = 0
    Dim As String   s_ret = "", s_tstr = "", s_estr = "", s_tmp = iStr

    ' reverse shift to "B64 encoded"
    For j As UInteger = 0 To Len(s_tmp) - 1
        s_tchr = s_tmp[j] - 35      ' get shifted byte & un-shift
        s_tmp[j] = s_tchr           ' write un-shifted back
    Next
    ' get decoded string (4 byte chunks)
    For i As UInteger = 0 To n_run - 1
        Var sPos = i * 4 + 1
        s_tstr = Mid(s_tmp, sPos, 4)
        s_ret += DecBase64(s_tstr) ' decode string
    Next
    ' string-end processing (shorter than 4)
    If n_rem > 0 Then
        Var sPos = n_run * 4 + 1
        s_estr = Mid(s_tmp, sPos, n_rem)   ' string end
        s_ret += DecBase64(s_estr, n_rem)  ' decode string end
    End If

    Return s_ret
End Function

Sub GetUserInput( _
    ByRef sFle As String, _                ' file name (with or without ext)
    ByVal mode As UByte = 0 _              ' 0 = default +ext, 1 = no ext                
    )

    Dim As String q = "Please, enter INPUT file name: ", a  ' question/answer strings (local)

again:
    Line Input q, a                         ' ask for filename
    If a = "" Then GoTo again               ' file name is mandatory!
    If mode = 1 AndAlso InStr(a, ".") Then  ' ext check in mode = 1 only
        Color 12 : Print "File contains extension, enter filename without it! ";
        Sleep 1500, 1 : Color 7 : GoTo again
    End If
    If mode = 1 Then a += ForumExt          ' add extension ".B64"
    sFle = a
End Sub

' ===== MAIN =====
Width 120, 25   ' we might want a larger console window

Dim As String   sFile, sQuest, sAns, c, d, sDir = CurDir
Dim As String   sTitle = "ForumBlobPost - Utility, version 0.51 (BASE64)", _
                uline = String(Len(sTitle), "-")

start:
Cls : Color 15 : Print sTitle : Print uline : Print : Color 7
sQuest = "enter the direction: to/from Forum [t|f] 'q = quit' : "
Line Input sQuest, sAns ' line input accepts a string-var (input doesn't)
' evaluate user input
Select Case As Const Asc(LCase(sAns), 1)    ' check of first char only
    Case 102
        Color 10 : Print "Enter filename *without* extension, please!" : Color 7
        GetUserInput(sFile, 1)              ' f/F entered, extension ".B64" assumed
        c = LoadFile(sFile)
        Var npos = InStr(c, Chr(34))        ' extract "original" filename, shorten
        d = Left(c, npos - 1) : c = Right(c, Len(c) - npos) ' source string
        Var r = ShiftASCII(c)               ' decode
        SaveFile(d, r)                      ' ATTENTION: overwrites source file!!!
    Case 113
        Print "quiting ..." : Sleep 750, 1  ' q/Q entered (user abort)
    Case 116
        Color 11 : Print "Enter filename *with* extension, please!" : Color 7
        GetUserInput(sFile)                 ' t/T entered, get source file
        Var dot = InStr(sFile, ".")         ' get dot position
        d = Left(sFile, dot - 1)            ' extract filename only
        If Len(d) > 0 Then                  ' check whether there is something
            d += ForumExt : c = LoadFile(sFile) ' add extension, then load it 
        Else
            Print "File ERROR! " + d : Exit Select
        EndIf
        Var r = ShiftB64(c) : r = sFile + Chr(34) + r  ' encode
        SaveFile(d, r)
    Case Else
        sAns = "" : Color 12 : Print "unrecognized command" ' in red
        Color 7 : Sleep 1500, 1 : GoTo start' all else (ask again)
End Select

Print : Print "Done ..."
If CurDir <> sdir Then ChDir(sDir)          ' restore path

Sleep
' ===== END-MAIN =====  ' ----- EOF -----
A test .jpg:

Code: Select all

P2140875_small.jpg"b;bbC#3,-),[)#$+$$##3#3(##bG>#&L#&%#%&%#%&&#&&'#&&'#(+(#(''#(-*#*)+#/-/#/.-#..0#153#014#1..#393#467#888#/2:#;97#;57#87bG>#&L$&'#'('#(,(#(,7#0.0#777#777#777#777#777#777#777#777#777#777#777#777#777#777#777#777#77bG##4,+$O#$3&%$E##%4$#&4$#b'#>B###$($#$$$#$$###########$%#&'(#)*+#,-.#b'#>X3#$%$&#&%'#&((#''###$`C$%&##'4#(5D#T$)364DS*ETC7U$'4D+&F%T7$85L4SG>VEUS%,-$9:;#<=H#IJK#LMW#XYZ#[\]#&'([)*+[,-6[789[:;<[=FG[HIJ[KLM[VWX[YZ[[\]&?'()**+,*-56*789*:;<*=EF*GHI*JKL*MUV*WXY*Z[\*]%&Z'()b*+,b-56b789b:;<b=DEbFGHbIJKbLMTbUVWbXYZb[\]bb'#>B$##&$$#$$$#$$$#$########$%#&'(#)*+#,-.#b'#>X4#$%$%#''&#'*(#''##$%ZC#$%#&4'#(DT#)5$C4*DKT6E+U$+%7%47DT$J,FV#5S8=EU4_-9G#WDH5T:;,<=I#JKL#MXY#Z[\#]&'S()*[+,-[678[9:;[<=F[GHI[JKL[MVW[XYZ[[\][%&'*()**+,-*567*89:*;<=*EFG*HIJ*KLM*UVW*XYZ*[\]*%&'b()*b+,-b567b89:b;<=bEFGbHIJbKLMbUVWbXYZb[\]bb=#>/&$##%4#&4##b#EGFL9aI1X8-WL77aWV,TU&?2=D@0#DX]6D0,:EZ]A8L#NG3P`+\GE-C;YN?6'W&AMBQ+L8:JP)#?5SJP+F^]WXa8/U62)IA=#(J+@Y46`:Q\IWF2-*\`KK#I6'Y*?+`L;<?V+T27)'[\\%,G?B60*4UG1RT0I=L#OQT,?@B].3JPD-\7+#,`V#024],A%AL/.+C6.;^56A(V_,I#%-`L\?G2bZ#M6)IL#(OUL^>S0FL7/GV+&<X<_OLV&/0*7+/YLS\b`H]]5OYC(-J`#.54=@#V#CL+1\K7#/0D[#H2=V&P/]C\I?=6+TL#%OL']M7'6R+I$94SK*;GA48^2,UMI,I#C.H$Na4[FO9JCNT4S;E#N.[0&UEVKYM6LA*J9RCHNX+H:[@M^9/=Z*CN8U?S)TK@-'26AbN,7ZIO+N\XAC&B=A#N:945R8L4D<L78X<6D%*$6EJX-$/7.Y=;,2:SL1825_F$=88\G8'+J)@LDGLN1M$`LP#X76S_6N7F9_A*5J#B<$[ZJ95]6SV)K]+]->#*A/`L`(0LbO#E<'AW#6CG4Z=-V4#(Ra?5B691C24P#]'N+V*F1])V+L(&;+1(W+/ZJ:B%=9K31O&PZ&[JaJ%=]F-)D$M`L<P9?:]6>;E#3%-LNX1W;/G$+D^54A0J\+CEJTJ]3Y]4BYWFb7]#=K]3)3(KRO#+UK[G(Q^HD%CE=4&*M]S<D/#@VH#4Z/=L=[TN*]17#=%V/LU.W^L,A&7,YDX<G/UO4)F\K0;8L7<?WX*F3^SC(EU\0QY.US)SM[Q*4K=GU8T#(b&K-C;J9HM+^68<\=\(8U7/=()5:7RP7F38,XM?*JP#XDK^7\+M(,L9O:+<].F-@2M'8#D*7+$EXGL9F842H1-a`QK$NG0_6L#GV]2B-K#]TWWJ).I/6(N2)`K$#G^E/B]52<1$+N$]5I54*M9#6.WI:7?5bW#]##K7[/0Q[,CQ*&W#6G)UL+;0D>;7/#/1L&GaXTD7)G?3'5JHS-62Lb/_=+#&0WW=ZEO1LM*=#&2P7-E#\-GSLH/`MK%L[/0#W,XY]a41>`]4Y@#6=H:H;&*]/\3TT+-[N_=2`((`KE$WJ)VW5P[IRRC(I$/IF:RR0UUE#9GW)GIW&HL4X<#7/,4S0&'IEA5G8VZ](QCJYCR3\<KAJH`[K'AC49#6+KEM+RF*A0KNW+?MV$J3==L6RA;G>S+*^`I8-J,8I-T67MIQNT8W.]I$3>A`]X70D_N6ZbF++$C69R83\ZGWN;+L6R*;K'4[L)5WT&OD_IMWLX*-%@VN6UJ-CT1@(Q+$0O)FH1-b41C&7X6*-]M6$a*-#<3LCO529O?W#&2979-$0GK7#'&P,]-TNX,#);V-)3K)]54=#-#KL5^5I[0#XVW/6C+I42=%CR=F-S)K$3>2H1)(F;/MV+[C*%SI;9&W)P>7&HP#-C9*HS+E51\;P_;E?]VB#DLQWW@E2`,W0&16NOO>*CVOR.3M99YY5^(F)0J#W+C0(Q2AN;?4_V,C&MUK]Q)LUM,GM/=Q_a#*A'_7VbPO5E0M]]2*_2FZP7;??_/a'_TIDP<#\W_&/@a8/_BQH1DYE[.;Q/6[1$:4(X2_0>(]*X&2+2B1CH4X+^R_\3E;IL^`S?EL-W)R?UV1ND&aC.`B+*X>,_O_F5PORF<;97N(2'04,U$_`bN<)[==D;@6^7)?6a,FH```P-P/C?P,K0>?B>')O`:MN]6$9=9AM6TAN0J2UVPCW)4RX.[H/))U_#S<Y%]F1@^FHA[9B1DR6,=OHL_RK/-&QOXKY;Q<;+@N=Ga0Y#DFEXN^`9J+7_O4_B\^FSAW\GH9A?+-E+S*%11V5O?FJ$X[KWY8Z)U_*#Z\F_20*CL>_D,)U.P]5*3)C#JQ[-@N5Y_JSHAN(Za7a09PX\KE^C,'RMK49AU++OQ2#+b#-L6`4BaF[DBCRV(_,DH?[Z9MXYQH:.4_TQ2)+K#D#-;BYK\_EO`V;D`CXNB5;GO8a>@,^5?bN8Ua0*TKAV[749aT:\O>=^JT`32`5Pa*Z(-X.:[PQ?)2%&J:K&[=P]/*/PF4/2A@)6N,Xa+0()`0TB^/U5WH#7N%)Nb-W_2+P)N[b:4,W1R2[O*&96-D<FW>>-J@?bH?&2A@L6]B&(J:XVN0]$B-NGY5AX@(R\YP&^/6.Q.^(8UYTC?%1DV2]U,6K@WNSXPKQI<J)6MLJ[FC=#]RAL[ZS`^$]=P18:Q_MTS6XV><=SLPAI-([L?A7LS\A<8=`4BCFUS>TY5)?P)%=K&2Ga8ZS*b/bABU55*2U](]'LU_ON4C?H1&->F7A:8JM2[*>\4E6RGb6IQP6;6*2QULF8NY+9S1GP24%@\AF'9`.2FJ$RPB-[6O6,%3MNa^SGY\J2O4@V>>IB90D_:>*$M,19@MXb2$_&(L>M[QJ;S2.BD+W8`Z)RPG1OC;M%$?\$XH2K06*R$N&a7HQ?:O]Za$J?V%:]&]>0LRV8U1<'U(1Ka/7HGO-+MP[6_J=9]A&P&aU,S)T2O=J%$X`D9A+]8']O9?D&WO5?$7\\?4Z(6&(JAUSQJ+_E:b^[\E2],[:7/\51(;E[5OD,K-'-#9LE<SVCBDPZR%&`0RS.1Za+\2)?]7=)()X9I(``>'a(&._A&IQU>#G2Q_ZP#2]E12$R1:%V<Q#.4:]FP&',`,8;Q]ZR$b#><0DW@%=W6#=B?]7b:2/$U0G3.*<G.@Q(8aP[^Y%0Z4?'BMGXXb<QBEY>`XMTZB0,9UK5DU'aZ6%9V`CY-&@>)a77A=ZL-B+AYPD)H]Rb&X@FJE@#A^17[\J;0*GH>XNC&B1<_*E`X[S%K3&<7HbW#\N3a#'4B^A*#V6b-QX6R<&9E0O`#&SbI)'68;-A]60&CW)X=^b-*b+&aN[CA.GG2DLZb#+L$D-6=5DJZN1+b#4L\-9,A,MWb8aHGVa=J2=^02+*W<%QB0;C319G)]3MBB<@[_NV7A*[NKI;]4a:1;Hba8Q]#A@PB=KIaFaL2B8,OW@**=a?[VE\99+@ZV+`]#YN73.[?NGC/YYXR8RJaELGUG26,L3UZLF40.&6MU8P2MMLB=`G07G?YaB069..^;QD'>'CL[&*&#^LFH5-''@2D6B4W]a[8Jb9.aP3;[9`a0,,OQP*QDZ1/RN<)<%31\@32\R'794K_GQ1I``L(U>\6DV-/;I5a7/;`[<=IQ9*U`JbC`T+>E0a-H15+XF5-A:$:0#(T?Zab#=,O:_#(28,]A8'8>4/(/2@=L[6.+?I87IRLF-*T>6H%5?9FH-MIMO*?-3*+K4+H>J?`-2483-S^=SE?1WH#Y>&-@8X2PC=4YQA[W$#[SG/B-F2YVNR0ZJ+9$=2AKb3-L:?AV/2GZGBU=#%3Z&,9;QN(843-TU`Z`S#2XUC@63C[O*TNF@+^T1*@K%,VULS0$P9[_>3L/H:/%_4YF0_AWSQ_2K%60X7T6X1\]5][5JV\J690A1a$#H<,#&6`](4B#P&#@MXUQ'>&?aF`NNM1SQA@IM8$7CLQ?FAJbACB(:.N8A)1Y6Q+#;\@,LZXV=8ZRDX0-G`6@G''L$H2;R0>2/M/%%(XT4'0-_:EP`-E';HNTSF,<MG`a77Q*-Z2P*(#=70'\A:?C1+JXIL2*VEY6X5+AS\+.VRa8LOLGSXR+U6P6LbL<A\M:F5SR)2RX>N/+9:3_H*.CT;&$A)?5^B=+\W6F1U>`0:T-]P0@+@+Db-TX#UNX`Q3X2$V_CT/1_D.<:Pb4aI8IAZaT`522_J*TP?2\8<?VM&D-Z%>#4SWXIX^b<J>,*@(TZ=_G9P=a9B97X5b<R:R99;UNZa)V#HK0\JQ7a8>BF']QS7+*/P*@,PEYOIX4O;-=%D)[.W=\]9>FW>YL*)^326A1S?+B[GHK=`_X%@V^PIaA#D`X$7b#'P:81_19`[$AC/F$._VR9]PX\:4Z%=.[FbXV*Y_RILS-D&\^D_^BX<&)Q[X93S$<'+H\+OJAPB(T]b%X\<:_B>6/GG,PVQ#,abB)#9HRF\L^0\\Y3=G6QR0N=[A<6QVT[_:,R^^0K\918&_>C`Xa=HQ\_`LN^JAKYAJ28-[\*0_Nb[`M(\K+^Z'?]GaWb@@_>8L^G]L1%\25[D`,CI&OT)JS=^7B>`N*/7Mb,(_46#W'=A^%2D67.0VOaV_a6aa49PXb=`.):6,GBM@;0?aVM;HVS&[ZVQZF*$N?^EEYaNZXA)bTE8*CBB*ALU^DUHQJ2A*KS?a)'3U>BAHD20#GEWab#62=Ba*G/;_4C_XA]OWB4JM>2'>6&P9J6-[JDaU?CPRYO9'b#>K8<P20W`b]b_#DUC.]*^O_+6Z9>JC*$BD@A&L6(EW:*T(<2S7_4&N@A`NIL9bOB7-E))A^SG.L*I@7HB2a&B8>YQ:SEBSB[X0_2;6:`Z]E*3a^?L5AHbUa*Q6>*^H>*DH_8XN^G][)J`R_$\S?`,a^\@1*HX=9B_XB&*JPJ7ER&`HF+`)Y$U_+DB)FGa:FKX`F5I0F5J_1B4=V#`D*>@Tb#P(1S6TAQT,W&>/0L^[&FaQ8CQ^[PMXB;-[B+\\=b&][R'9GIT/C3=ZWCW6SZ@4UX?3XPBF5/:2-SW'`J:_KFHbSU9_3_'4,::][I2B=69%A;Lb[<]a+#D]Q5;JUVbK3b74<@?JP86_]JM#BA.?A%,K:_=2[+XaX[R`[;WU:R?HaZ8_A[_VCbB,B2$_&D_<aN<[).<^N\=C3$IR[3/%b'(:F`$)(aT@AK_a>Y(O,NA%a^AHJ\G1XV%5YQ,=AJW.^[=N?_Y#6%+&(NSQC)UU14O_NMbI2aMZ'QLJb2N%a7NSI\0E[&T4:]OW6.Ea+4a9/T*/'/)%+)H[B8'`RDOR<LHAH,(a/(YQ/N5W9QI(B*$%S]T#?TV3SN^4>P*0+4X*/@=7Z*;LWIB`3;1VIMBC/C.JVN9^3I3367OC7R>6_PE#7%8S;CS/7/:T7M^AYM(+]7TK[Q@6+Z*>=<)G*@=M;RE-ZRMJTU[*:>-Y^FW-(ED$YL+Aa]<8NB].B1U^;G<`\VC=9A_/Ib3_[*&?_F829.:DUV:&1I5#GZZQ-:Z%Y4<6I@6C??,XM=X[N2\Z7M4MP3JQ4*`J=A8E\<-JTG@V@T(F+*TH<N/4K:XUQ(LVCSZ,E`9CLS3>UL@VJHHC&[P`M?_Y+Y%0#V)&/YIF;_F*@>F[1a`J=LaH$?PV=9\a$A07Q:O$:`W?BJR@]>a*?\LJE1_ZT6WR&2T5*2'.AF\@,XbEFHZ*D*+&+aBN_2RI\#W#P+N_PJ/>UOLX*@$>50NW5U;L5>782[%2A7P(GR4^U+2#?A'TP+UL7CO5C->B-2AT*\=0A>\[5Y;*Y[%*\XPX>.CFEC%\C\S#YJ7)/@@USa;I`\`W/>'-'3\:KG;C1b0P,543+&VSC`DC)#,]EE@G'Y/4YR-#1')EJUR&I$$L)T5?3&6EI>4G0%'*24[?E:B0-S.PH<:G)]5^7%;=<S\.'$E$$^bF=$:PW,+@\/V3[#H_3=35.WUQ>,^-#2G91T$M`KP,aK].U*RC#&#1+MX,XJ9*#(L;/S3FAA27#>:GO_(Eb,3aBP9CGLCV)4F9F>$:/=.U2=R1;FSSb]R7V*aQ4/]T+P8#Z>FbZ_71*?9J/XQR>,TC+W2NUT=\%WY2HUNB9R#Ea%$:CT<05;E-)#LF^1C12SCK`)12%a&J$03Q`.&>U_1I-?a+#3>/>)%_^Q\1N:,&L$,>5(Q9?04FKC41b?4T7X`PaNX:9Z-4#=H%_R$/1[OP9W@*]XKW:Z6&,097M9(R<21\#RYXM'N`0RGOQJGH'FCH+LI6b80XA9=4_.,TD>a0b'XaYW(6OC<MBEEYZZF][J&[;.WK6ZW+HUK)\R7P7X5\QC'\M_D[<,&$MBbQUNC,THV?:]>I8.-+P?=M%)[;3\1GCY^GYPB4Q*GaNB:Y'9&AG5OB&AU4U]%Y>?%YR`aQ_NX.+4V%MV'#';C&M/%JL`.N>#Wb#3,_:TWF(]BYPDR2'1K=Z<J=,GD6J'LYZ%*+-]=,I#>U-S5Y_*YL)N]H4O\S%#:#;CXYNNX2;Va'2C0K=0A(75FOZR%@?R9SU8&@-1]]Q^_C2_DA(LD(ZISJ\UKNER&&a*YaI[H(TUTU[`4W[<?-H8H06%bA1_?O+,%?XC;A8H92OH5F[F.2PSWN:7`+J6\N1_UI#DH<Y/+A'VJPB:\_G9OWb<;_$X@6X^L2YNR:<^D>.N?%Z5.P<E+_SOI2/WSRG_J6T5=>%A^84_U[NXERRL?>_SN?X,P9G48)RO=Y,M$:FA-S+_+1YWTFP/@F\Z,VV:a%bT@J.PMD5@EN%a]K$W3HE&:.S%MYFI@@5#>>CC%L]VZ?:,1bC2S<QL'T]0KP(KTUVG0:]/\CJ\&8F4?VF6`1NWH\bLE`F)[SG]^`](Q`LQ-9.\_;\KS^KP+X:A4_b#>V?Q4LT*6=TS]VMa5H>G72IHVY(Q*F/VI3.EH_T19FMMU8[BORNQaQ8@32&RFbGBT4H$I1:=V8#8^3$OAQ>I`*J$06`N,GSJ6O`\^D\XL+XPY5B73G9:5LOZW]'M74@U<EJR+IU7#V1@RSNO_Pa%P0Z3[%N2$8B>S9./I^88%+*C/+:A'_:S8[N&P9:0?HQ=?aFJR/.UR/9ZR+;%?+^F/+F3bYP7.F:WC%KAQJJa>\^36MAP,>.`/0X@%S`99X_(E6I<2=O_SOEX.%LWRJ`Y.>a,>HE)>DJNa]%BBYW>,baI6bBW4B/0/%4_Y4.?D8I>VK_51a#L2Hb37O^RT,Y9JZ5>OMC>a.6@+G)-`TRZRG/UR:`X9QaG)7Q0MP>=/N?_bD^bJ#%XE[9,N8OXNPK#\-[B0#^O-1)QG#&<+1b-,K:a`,2'5R]FQ6T0aC,(0;_]--$]`TL?:TBQ@9Z4=@%6@&E.O7-<%@;U#S`+$FKJ)Z-:85BUQbBT[:`2_'B+@BV2)*a86MPJ[8AJ9XN(MN<OX*:#8>2'<5$X)G/@-H.)&\B&GZINF;bC`C5W$B;WK>U(`YL.V&b,<V,6WULb.M>[1QaY&[$@^b\R4-W;::AC1&>>Y1M28_7$,?_\\Z2D&APM$A+KW/5416WO:WINV]Kb>U<VJ71SZ>I0RO>*$QYJbW_`>LJYC;B[=U4X'1$CX^JLb4')aI0N?*N/:C9J.KFC(@L2WIIG;NVR(-U7,3\LX5,=[K9N=IU[;'R[5J;_,FZ6RB&AU\:RO8B`.,*@=N4RaDbS??SG`M5'IQSSDb'aaXJ%=SD8KAS*+/U`[LTF/_[SVYYYN=&@I,YP^$A'=X]8*',#%V7+P(26LWJA4;*X>W:&``-FH28W]@ANT+X86bZKHU)a8;E9;:PS'36YC$M*#.#YbR9_*$`AGPE@:b%(7EY>29]-10QG@2V+OU[BCS&)G)V[_:KR]'b..=[&[a8PP0%H*`X?*V<IV74\G0Y36=%[;.T5L'_*bGV0U*=/-5Q0P<QEGZ-&GIQT=-7M(0CU*QU;41b0)2G\]H.@&+_QRJXC9>aT_;?/0JAVMP-GRY_9#HJKW,]9U@I4*VS#[+7bSX@IT4F*J$`?Y-6\+($1INTPSY'Y5(?UDT?bI#?9E_)M6@1NU2SMa>?[1\T3B=ZCQSM<(-C*P#,EOWDZ*(\4Ab3T+-^0&NKM$Y,)%$?*5J=58YT(0aJ$6@$@&SC)%EI02=>F=#*/T/=<G>[__S,?X<NUPF&20-V([:^*CGF[5[&[#E.(./DTNVIC]aSJ^R->0P1(BU[TM3CF^N:0`U)SV)ZF]$K[6aWY`Z+C*5FF-'?CGS*TU;T#^8A\G)<UH1\;<?74W@_^0a%D_^Z#KMGV?'<8A;$UBD*FX[7TBD0V*V,[@3V4(0%\09I)UA45B*[F+\XPCHL);%3S-#+)#,X(aWR'58_A'/?GJ=88%YJZT9.UJ?1,FC+7H\15Y:*G+BSN9TF1Ca?Y?E<#0W5B'V($#-/?&FaXOE#1'USD'\CT4?3%4;VJ%@51,U:\+8M<3+M-'^8[V+?WPH6G4.`\F2R3NbPX-[09((GbO#-CG='1D1+;NKK:CT<[$IHE:#)@[,FA:a75R#CJN=H2^Z]`\M)%[;$O>*[2G\XEBFE50,F6?Z>B2`72%R\]Z7F^MF;4+JJ//Fb3P6Y)^$>J&a#XE0GQ0:*QK,$>=]BQDK39GOU$];;0@`\_HLU\A;)S=;?XE<[I'S;a*E4?BYT:WaX<5;O1^V12E?`bS=).KKI&S'\+:$B2bXIb5<C?7[MN`9XUX>$*JQXLa^UU3U[JIS@T/L?2`'7>L2*MH\@O`PG--2I6Q0/X@&.V1bZO#PHVVTOM+0_#D81Z#1_?)WJ7+,=.L,_.H*U+H*<J,$P9VOFKTX&3$H<;7/JR8=,6[WO#]>>Y^28U'VFJS/`A:8<<+0UJ*68+PM,JbLY5[4Z,52F?HJ]:]RMT+9TL/SE_[YQ#6>?`@5J_REN4'<a=X;Q^X_Z+Q_T7^+I'4->?8?%N#Qb;`IN&Y]XZb*_T$Y4<MAB*b\LY_,?K4AF]V05GL`?EB]25F*P_E]P`9V>H9aHbQ#$_5_<F0[bC`X)X1VF;QBb#>R_PObP-O*6EF.UX-0##A^8]XCG&A0W5\[Q]R<11WYHRW=.YPIS@ab1WF27LK6A;UM9a<>A>[+#a;W2U_W/\48GFK@]TY=294_15_R_JVH[ST[,]2a>8:*M?S_^*S;`_V_T?F/GY4\)N=.a^.[A^R$Z]LI-_F(OMM4P<P>.`;)`,_ON01-1Z4YT^(O;^Y_:/8H8IZ:7=$?YSb?:>15<H%/;WW2*YLb1E'MUUF.4YTG5UAKHP&E]A-DLLR]YJAE7:<9Q9BY1E$61LTa8SS\$#K*?A<A@VF>AB;a4>HF3\@N.+1HU_BW(%$QZ(4.3,%FS`.b=EOWB3.?N=b6.\MQPR/&;%P#a>L;S-&.601>+CT.b^[8T<\:B:<WR%4OLVTE$X,?OBL=]G35FWD\[7)A]JWPH)[H8H*\XKF^AQa*5ab77O5X>+O5%E>-CK*<>M0N8#$?C$5VZJ`:/:R4B..W<XR0Q5WE,&`G4\4A);(T&[7O8X`#PJW\G:YI`B@PND`[Q=Q,)JAS<a?LG9QQ76/b##,?2%Oa>`J@bPFB#./D0*H+XPDQ)>3'ZZ/.K%E&3%B98*WKI](\\91)-8(AJAR=0_R=X??Z6[$1[:HH2a%#F?`:1B>5_TC'5\E]+51TCCN>F/R6#<a\[;WU#2O;\P'@JYW;5QZW<A9UNNL`=9DBJ9WW,_BNWQ\MH9D$EREZ)U.b=UG2=[C11^>W7_>,QI(\U4TI[)'H);]966XI++H`$=0TH7a8Q=O*\C_R.:QA#a'(=GXM=0>>G+<7_'_AMF*'>L*KSU'V#?-_B2]L]0OI^I*>B<b1:Y-:+G$1;1X87UQ+X\G`O_F#>+;J%.FDP@/&<I.06>4$MUU\+FY?T$9-Z26<VFR'=RE+ESH8PMb,IBRYKI6F*;A-<;\1ACU*`Z'Fb2X$(+[BAH@%@2;8b#6KL9[FY$B8:%B5[E`%S-,J#\NZMb.Z7bZ#P`WER-TaR]=`[>Q#M?^Y]8bR-9&Z=J1P6_,S'JU<F.B\I<=BEF#CR1(_[@.N*YOF;0N^'N`^T$'LOV;A\%DbPUM`J`RY]a+-_G,/)/7.3;N1;G%`*FP9GVR-#.)=[J%#??:`VKP]74UO8_;YO15$)\=GJ[@W(]>WO^'6JG6?M&([4UV+RG+/LZXC'F9WO$[E\W_FX\NUC42$KT=@QR1TP]3QF+O+G&:7#b.6B:Q=[CN0HR>J*&',0@-R%&=B-aJ6&*#QNOM#&G+E#N\WBFRA9*W$:5>0OX&50*R?=-a_&&*A`2$:`aNT_)=X\aXU[.SHLKBF#*&C.bK-`;=[QIN_3_:A4CINN.8Y3#Y4YL%,>$L*CQIb8PF2(2)PF*,MP?a&4$/Ba[:G'TVB]:F2[`JTO^U7[L]I9H[TGFU\CaY@LD9,'O/>T&JKL?U)JV=FMJ_-);S&%TY=I:OVPO[(\@CM_A.TBJQ5;#aI80??O#US/V],`\^N%0JPV[:*>Z:F7VUb#MPD+#($U?=GY),_/VL2XO,YGF)G5#MK]B@QM4_WJET%(@+Y?9.]7.@Q'Oa.%J23;0Z^55C^ZZP:UA4U[b;JXG,K@83T8@J.%].XG8^(XVR3H%T#@;V_Baa]5^&H/#-F0:#P*B%Sb-CO'T#)T#@$@$+QaWA\D1@?R<%\C?5VXNB-OR))0:F#YaYWbCM>C#PA*/>&;#,CT(^#LU*`&HYM[=PUb]OWN5.[+ZW8CSH\G669A9R.[)JTX_>8_L#LPPJ-bM88+1a>&1)?5<68D;KG(*KB'*U:H;NB_#%1)OW67$9(/E<>SaCPJO-;N0b-C<_%*'BFZ'-1]3T(E5CVZZUJ$$1W_L>07$N*0BBA+N_9)?a;^K:FL+W%43)TH*(M[^3\a7O$<?SP?T<8P3O/V6WXJ\S/^%)_&'>CXb`#I='KO(:<1\;NA`2V1=X4--b)V1A*6_ZL#@G/.ZB7F_6R<I''//AM')*GSbUPN.D&2EJC#V,5B?.J/H=,3a;OB7O3%ROS*C-Ua9[?&/)6'+RC,$.G1;))(L,+PFZ(>;341)]]2-QG2PFS17DV1\(aW$<&Q9G#K7C?3F'(`]%45FPV]\-#P#bYNM.U?344NCPX@Y+aXK\%a&N)<3*?G(4<]65#-\-F&Q,:2^)B5SB_K/;A:8P&/B#V]K$*40UX2F+)%D?J$U/-/YQN(V^AV&Lb*XERPZ'+PG_Q*;3>2*3WA&I>B<1,;X2+2A`>;PEJ1[ILQGZAJF3@BS6)b1PMC31a`-&5Z,3;bb3=XUM.>8,2)D`NHT?>O\$0LM3NM0(/U[D#*T^?0O_OW;LE2-aJ/*K[5b4PY.4QPGW&S8^)2a4b`MVDX><GYYD32b0BVA$&;M('8Z-FV0aa:aM)b3,CS`I;OI&4:IV2P=H/J21^F[$B*]]2)b:V;?'^:^?_-[O<TDXb#)0a[SG[54(WDb?#R@J5ZG+-2OTEE`,SNM[R><;0AJ;DEb=6Z2'aDADBM%A>'[AI<9QI<$GJJC)NA].A?7UA75P)\O)?>&\^,IUNITB[0K8M\F&Y^$;1`*<`U]4XW=Y1&Q%J8P(7V),=ZMN;#Fb%T+HCaX^NFB:8,DWB(SNWJ,H_:V6OPbQ#Pa#1_\2J8[9BINM,^E-EQ-Qaa[P$N[F:8.8$A).V=IJAFM^2UQ&\R125Za@A.#2+1#?/B-EJX`b&&b5.0'7:=P8b0_FL(OO5?LaKPI&B/+DGUV.TIR^@F'-%GA%S$F7/`TQ*$RY)SMHYZSJ&ZE_U_.@E(JMX-`&>Q)<K$2>5H@&B#T+C9+R0Sa>:FJ8?(`<=H0P&YZPL)HQAJ?I^9T^0YY&PGWKA6[HXRLJTL0>LD>=.FH9?0X]LI,AG0=M+95;=TUOB8VF;QE\T#(aB1[LN%R^JbFT[>%a.HRTI6(,`5GN>$5.(=?0P6,-)_QXC\,I6A`-RC8b]M=bH@H*]*[([4EF$F3D.5SC#P9Y^b#6=B1LS9T@DZ6RX22<&R^\#U(U%+IBDI?<T1F'IV$X+]:bMD[MVL?+B;W8PKKH_XbQ#,*#-bJT>>@>B19_*+_2:K8)1>6V5OG-9@A_7TGaCP2b-`,<'C$7WJ#0_ZG8[U%R@PGbLG@I%.RFGO,IJ1\V-bLG6B^*6'FP\R)*_&I80D@Aa:.]8QX&0C?O<POWFOO?5S=J+1<7J#1'`^:PPS1a^9S`*->M&=`20Q4:NL'Q/3MC.Y2EE&^WY_;6X]:a2W7'Y;PZS/L1LVRT6RL2Y1P@ZPZ[W3^5F\39W')S\(:0*74EUGb\9+;3JQNN<3XZ<W^(8X5.W:YTU$/$#B3*95b7@U+-;?WP':`3DA:6]1@FZP_LQT)JY;2&[L;&AS$<OCVEA=L(N]7QJ@<\H:GF6,E$%7)+X=U=*'/0JHFb/PWFJ/Q:U>8?;X2B,[@9Wb02]@8JK[UR_-';+P>O#0N5=]*-L3S.#28NXFbY#Y'EaJPX(RPI<%.#D6bQ#?*S[:UB[QY_\XR@(\=57:3;B@K=^`[F&>XF.+G-527KF`6MZ<1O`([SJP9]IJFb*,<N>_%D&*%('L?CbL@?RD,AGLF,)?85U)#+0W$0FQ.WQ1%]64[Ib]LaU]/2O>TK$3\FJ\b%J5EBW^V/3>S:V:Wa758C9JUPW^X7\&7.J#XC2A80&OC2%`VK@Q_?&^Q>CVZ``T1/*D?[G0X1:B/C5F*\Ja1Z.YB90a940(31?^8+4b#=/GR14RA<%2NNC^UN@QQ,H-?DA(W7;\&V31>CI4[ZWR/Qb&]&`I0:TZ&P:94\0OEOL6H\_D?XNH>T#CWUJ?TI9b*N_T`SKM=::$5&VIUbI\UR:F`[$-K0bV?#6?TJ$XPZO=4DF^+]MLEaDZ)9F#..?#`#`0`+FC$;DZA3[?b\XM$R<C5LNV6>1V:HCE<:C8(S-[CIV$2Q`^-)GYM,>'^B?E[=,^MB)S1#V5O71T&)/5#FE]]KFL6b-]OT1@;X'4UI8,?5YJ`B13T1#8ICGCY3\b#5b=GS0UG6W'K/3JIX\_]5]33?2-WO.TD.6DT/6O2/63-'71.':%b.8M/HUM,&UCTM(&A$;(%>NOGI$IaZRJP<N9OB)\UM#a9PFY\<_bM3UIG&8'AaF?K+45#MQ00L#)DE5E])PO3<*B+0JC\80>FK7CDG)+ZXZXEBD/4<a#UU>CL/1`(<M_&MT`Ba;*?6+$X;%=53M-;>S_M#K+WYa7%@IS<<:JH;8)SUGATD3b2XHO+D46^HUG660&KVJ?B5PB;T&RH571-P:_SOL37%0&[$%V*/L*&+6=#N'S&-<^_'UFTF*Q`Ea7'I88C[4B?(3>*4WWIB?NYA^UU:`'<:[;:3F?A%`N?(9_P^)0<%a37bPW#WJH'R\8a*+\2H39U<P1^4V;6X?Y*F;P'ON\-1E9'&GG/@A81EN7V@V1B^/OA@F?47P([^9RTRB/0@(XX2`AF:NbN7^/A@5ZD/+U'GTL=A;SY^FT:6A7PAQFS```a25B`VQFY%M*M05.B4-\HR+8`*;>O2`aI%Y]FO[B8N9@=;I:0^5UU/2PI_,B2R#a)3[^b(4_%SS6<0X^+EX`[%@IGF#_bM_CFFT;R0CPW4U%H_a_/3$+2ZXP&XD,Q\CH[\:,DU)V#V#2)I\@<TAZP>KP=%_*$IA^4H_Qa\2Hb<<RYNHPJNCU^QCWC^`bD%@/][F,N=NUO)C6IOP+Ra>TQB.EZYO`N^CJ<MSG0RNNF1\0JM3E<#`YB3CQ_`?=JGaA_HV@JM=Z-'VN_;J-:=/+$HL^4bb#V0FNNa@7TO4R9?I/,*3PV[6`9/^+C3(99TAL7bL#XZ)b2L)EH.E:WET_;1[\&G]Aa/8JO`NGM#72?1%;##$21]^T&A0]'1&BQ+$^[>[BFG2XBPF3'1_5Y&G`\@OC1=`MY,`M&M5)V3_RF&bVL:/\,(3T.)H0X02Aa=704:)G:A&0C)1SM4\,IX>BQG.C/:CJQ]V[9aB,SQa?7H4;T&[G^O'2DH``N)LUMAMM?&/6(*)^$<<AC-8\5QR7'JBM@6T[UM-]4]D?__X\2('K*P<5A']J699RZ1\'51)>UO`M`<-RN+B#C?L:*$J^8ZEL7=0[/-?GIZL04(FS$))Y#(1,B#O=VR>$Z137JMYT2OCN6P0[3.?6@)O[_Hb]8a/K9`]88_7U0PII5;#40b>-7UO$1EH)?31#CJ%]YH_aG'?FB67WNXA4SQ+#W<`LHT3INJ'1?aJ%QK+`N=0,%R1\FWXXB5$0#.Mb#=U*/:H-K.A^P\Q<<+%0DH/(TK^QU&#FJBX`X%YJ`;1QFH9YBM1>G9RG((,T+DP[9&*F%%[C1+A_XVMb;$R0*`_EYPTI;^CS(-:<.OY;/'ZN9]W@R..B%Q=W:2T_ZK92]ALFHS_Y*K'bZS<L0UT8C2_S)Z&M=F6Y1JFNG;C`AX+9b_#4JUTJP.,,FMY.6R1>FQ21;O*%-G@M<GC#Y.a1QA,T3/4%8'L#C2/8@SA)X5;\JLG#]#-Ka:D_b5:_:NC@J<*]*2+Q_J2Za;PQ/)SO^bK<$#$CY9:(1L)[NG-B'8]W=T(7Y^Z[,DF^@L;Fa=EQ-.Q@(b6\R1EBMZ]L1'+ZM;CWWZL_(VFN`PDFN[JOK4#@NLBaD<[.&Pa@[ODJ@M(WB<6[R-I&H`DF&<;&JU?XKZNG0YH8HK7OHJ%U#=EV0OW8&?EPI6V&Z_@1^DEN,,W'_:)IV4<]]2+a9K6A'QBDQ)BFWZ0LTX&$b?6P.6LALX3A?[:+T'QE(`Y(G+YGYB,F[#M>@@4W><R.a.Z4_UDGF)1Z:^#0G5KGN;=_1Y;A+\8'TO2HLN_/R\[0a@a.85`(X:U)S`<P0Q4,D*9[3H#-FU(*HO&\>#U+`$N-1EQKPb%H0:<PSZM6bO#PL3#IDZD>;?FL#41)OTQ3J?%\X46(]AGPN*LNV^K^;WG,6ATC&;0/_9CXb>2-%?E=>^>.,*O3_5K'H#%LDFB7#&]W<5(8`\UUJYA^L?C1<&39,-/(;$*_F`A8G:W-)E59:]aE[IX7JK$SFa0OTL+PQ]MG_LVaYW6C/,BQJY5NHH2=Z>4@.[F2,@J)+XV)`7#C)L&b1F8Xb6&R.*M]QM;$8*P(W)6%1K%AO^17]_FCCL]:,`b#A,'PTX6(%6EH(E3D[>+;_B2QX7.:\LVDOI1%\D)#?WU'G]AW(YP9O%&C*G0a]U51K?;>(B\^J9&SYYI#$F4ZL4#1;#83JN[9)M]@)WS<_N?/%)b1N=.8aF(0Y]AJED]W#@SKY#&W/*J_GLZQ1N[<E1@F<-_T,U72#F`AON0:(Z`8UK[9Q4/*$>#<X+]FTP6/KS_,DWD_$C%=2UEP076?)DCGK8,_2^5a..`7ORAFFb(-#)&.\K>[CH_FLQ21b:%aD=<\a@^43YCEBG.JX[LZD%?1THJJ`*PBDO+N,\;aWS/S'HQAF@I=H%A>_B;@7NVBBNR4=[PIC2Xa[a^USS+Qb=8S>HFTHY@*GZH:*#[Q>E=?-9KYK%(;;+FFLLb-_S3O,/4FQD*->'U*W;WU?2)1C_&Z)KbY`C\P5U+TJ#.X,),#%b&\WZC5:&,^Q/8)Jb[&b#1K`H>E92+;,J%M?2CZG<8;.1*TG2</USV^A-A)=B[?Hb+\_#b/VX;Y`<K.3/OS>JU_TF5`GFA_42\W8>K],)H3;TATX7:1?1b].O`9CZ6J3.#QIS'E'G&>U$#(`/*\(YUAU-T@Y`0HMFV.G395G/0OSC)U.[/$5))TB_$?X8TWLGKAIBSF].>F4HH9OYW:0:QRPGP@SZ4JSS(,@&Z=H(^E[]$4)O2UN`8`-Z##WH2-[`Z6^[`81<HT](^)UTP_HH?QNX#*D:YR*N[6T`)J&Z5&HVMVBJLbWK6/Y:aCZbAB89S2B=P5T*7S]N@^B/)YJ/K?bX#L()P7/7G_Pa]SN>0aL>[J=^S#Z@K_\=\QO-GE@H_(D*0^%&-.2$+:V@K3>\NY3MA;-_:96XKKHW/GS6QJ1FS@/`[RO<Ca^ZSNJ+95Z[9K,F)^B+F=LYb:a+DYF%(W.F)[2G_\'\)^A;HC*[5]bR#-aG,SW2.ab(O?MZ6Y.%(C_<8FRXD.Z9INMPN2,$=%b^]IZ]2@+BJXPA^@H<C&,O$CB$Aa=\BWNFD9)<A0AB$Cba#&=)J'3E0N(CX61:\?J)R2\0Y.B=1^0Rb&YUC5UJ>%^E'[_ONG\2>>+;AIQbD86,9=9F$7`S2%_/&'bb#WBI$_H6I&H^Y]PaCF;@W'VZ)R\U13aCIUPM`G'X:UF:4OW2I#B-QW('2\aK+JMM5L]9')JO6_11[:O76+46*E[UR6_FH^>][R<MVE4PPPWN+2$#;`EBFB6L(*SHXF]5R/XR`5P`RX@V1NL?<-\_=@*R#4_GM?25[+K00`E+NOHaN.&]Q@*\)a9.T1C@WN.]NN#@E'+/GP?:JVRa5_*RE2$R0^'G96.NG']+?FGX[$:X4B:`NBV<[N0\:X02-=Ra(@#[B(*B-KPT-82HDM`=V*X=XR%`B,IRKPWM28?KLYaaCC7S&NS\U)&&I-GXNBQGGB-M1?P@[/K:V6W@C226SJ2@XR(8]J_RFaJ%1Y6XF^YCS?9Z<_U,b\`;:?Fa3`&>GCb?Y1MJ/*`>WC_&R.*+<7UOSb2WCMb\.B)$WR+B]&0;E^W(5C]?4VD=WaE0aWSX*0XMR%a1I>&IaF-(BObAVZ+9$IE#bHOAaCXQFb4E+J_^YI;CLM8K@EYZ`_<1XL&M8*5C5W9*Nb=2a+aI2[RL[QSSV^Q1UVL_*-:<2HZ+aZ485O[&@M?Y6>BY<&`;WLO65C4)G<Z;*%$3'4:GP*VTUT%QF4+KSS,[M2\P(`A<*&IF)HU*EH76Vb[&B.A9058WOD]=?-Ha4AJ-(,$W^J42:a;O6;)C\>^CV4NR8R4[@G/W'9,1).FX/W2XPSb$LXDWG[<B35G2@4//JbX+=]/1_RS:6B1E+Y)ab27=A]0DA\`0=%EPT1].FIEAT,[BCaUCVZ6I='KFXBNL5+1&U[X3J0W\Y]C\WO//13S<F&?2:F#RV5HO\[NHAVL?#11?\<>C?aDTb%L:Q,%[(;;+`NRPR;66%XTQJ$R9?L:U;9ZH]-#RO2@`0]CNa**,JM[X;CM#_V-:`+bP#%\E\LSOR(#6_50ADZ/;Ja@]:*WPb8RE2VM;B,DH=*'BbD:6T8Yb,L=F.\'(5'H:#-B,GDU7TZK1']&70M[\:$DUORW^@0'[])K@D.J8.RD3;5\S++#b,)+>&NB]1a4ab#+,P_\]ER,(WCS:MYM>LU\8#]SG92_SSPbQ##OCSN&`ORQDW>[.Ea$2QA>OG7]2KG,XDZ?%V*LA#V>S2+-aQE_UE=FI#=aPHCRV7>*7%GOV4I*8NZ13SH?+QM`/AWC+94@THRObVD<NA*LA<MU<0\;H+QFS#[%N-;Q,],(7C+B;ZS*;?9I:/_V$F@]..0T`(`6J;C5.<NY]D(IQBA/*TV3=b_V%#&)>?:N9B_,=T*)2_D9,RDAJ<_/]S3F^O:]'7LR][*&+V'0aHVSR$M#G?`4X10J/`.51]3\ZZY$:9_D^MAL87XZL99+<9AL6ISUJBE/7#%/7I_1-B*A)^TO9QW@05aDY8@_/&:804-/'G)OL%-N73V1G[0`U0FBA/AG&6QRBEP64']W\UYGFY>#FA')29M$=?P#5F/GNWR2-TIP@Fb#>+FOH3L=X,%6NWH#H>KTK[S-JRG%#*RWRH8\8^/SV]7EZ_&J?;_;<6DRL0[97B:T`QF?%Y=7239%,1P[0>;*,LB\A;\^+8F'.$1]5R#bQ#0H#6JaP=B>2,F>ZIY?;CDVX+$J_CB2G83[Y.YNUURDL_:_6^\3Z)>[4:O4;``b\A`N7@W`<a,A5^^\[E5+ESG7LBZ@371C'-JW5OFX=B*>'[PG]+2I$\EYE+%+DD$O5V3F]6A].YP2N-[7U[**R=YA@>/ZP:LA$&%[B<O^S6ZNJ$`N0H7/:YYU'2XM<('KK=,G;CM7-/?6)3:8@_B[P]]JZ)NBNOH%R=@$]PWH)T\&M76BJJ*D\2H@FQI4@Qa#,)AN+]Ja4GPK1-<SO\EaK`T3)]W@;NH2]/Z56R(bV6H'UU.II9/DQ#%K:[G:G9B.,5MNZ'ZZ2I%YGSM%]B`\C`G2B^D$9A4B)A`01_:TQ9DI:[LERE-FP^1X\1V301N9'>V\EW\,+J>-6NFYS\D3[7^+H#9+IGAB0-<S.?[%N0C<,[@a#WKGD#W'#b%C74(MV$.A[DH$/;Q;S$A?IX]=B#K\@N6PR=YXR36&^=+=)HO,#?'%BN9%K81*%F5Z`LADG^==L`NFQ`KHE-P_2;CA$_]bTBR-F^>'bS*Z3'@1\(,8MPPD1.#($N5TN(B4T7:&`BT?&DaS55?$6NA[1'Q@5^]X_`]:P?YU^`R'Q]XKYH4H-^K$8+bM,#aJ)/]=6<L,\*4P8GNC-&G('+F\>B:W%%*$HH&&91_bb#A(EKZQQ+#L$#T*Yb$K)=%'GR&)/G6?I]]I^SK0H1@7:E)?F$V$61OB>UM)L<#UOY@B*//FK?6aH8E#SP)PY-?5@$*DAFL6^\bK[Z.0=F<+P^a<RG(D$KH&O)1B_E&a`B0VEaH7O99L^OC099S&;,LJO+&#`a(\)CaX<^EPV;[a[1,E\3Z'=71S%\O2DFa#G%2S7RY\(^4JF18I6V@AW.]\M8>&&[O#GCF&@6[1PN0)YE`=/G1ORQ&4bJ_5`;2@BX>\*B/3WP1J)TS<1II,4=67G:GJH?S\3MS_T066EPaH=8_NbZ)>Z+>O[+^UM>&[QV@%`B.Z]35_5^J`%5C>PG\'Y4YUM<GJQTL3A\N9)B,XH0C*WZQMQU?-V0/9>J,(UJ#*,^;]bFSRAa1A%OX-:\VQ2H[*T)aFa*a4>LYTB;M=_0'N]ORSC7&Q=-b;%G2K'OB-8b&RD_JFC9bF)I`Q;YDH_ZB':2B8TWb@0ZBSQ%$CZb#-0ZY-;5(JT^M:_9(?9T:5T.PESU^`_(^/?=%[_>#Y:]N`SS(/BM&)$C%#.R3\NKAA&-M=]2>G:7F7R\2C`*)0Z.D)ACDFTY0I.D#[2ZN\(EQRXA]Z3KKaVXYZZ(_LDG[:80-\QQ0/_UCWC4BHJMb97^&5IaZ[H^SI6V$Vb@:0TBKU7F,Y-/\PU`5*^;*J918:1S2Eb'=<3B'9X8Q_=ZK&%8/'U?%2V(:?5TBVbQ+0T5:G.YZN(1XF/PDb06OB=8a5YA(SO#[:T5@-[PUa,0HR2A<WZOa4C[=TR2<aK;aC,7&(RDL9X=OG,TT[\a4T=A-S5FT0Z\J0/aB@G[b:K1=:69b#61^A-P'9QTG2[BOA7744'A`^X79bB1XV5/V@W>213=Za+YDC-L24Q+*GaPXQ:L-AT*WDD0\8?XB85NAY,8Q_V&PAMB'$;DQHY>-B0#_K-_(GL$6MKUO=%@`9QK*#:P6GUGb#=a@bVCC:PDKAX%3'9,G9L=*-)Q#EYENS>#`$P_Yb-@8Q@Z/S`)LSN=&TC9.;%'X9'5>G&RFD;.B/R4=UKLURFS(-\M=PO[V,RPa>-MS8<`V5[WS/ZJHO1\5HI*J%F\]M>:2D`B'KLYHG@6W6<^[&+`aUA[&`,-%>L*`I9&=]9N,_NRC;9H9,FPC]:,Y0Z/#_9Q<YbJTJ>)KR%'N@25S(aDb2<.ZJ`Q=<S6[0<>+_0$OUU`(QELKLH\_47*WIJ8N\PVX_4HH'G4*OAMR8-I#^X0=+)P\1I8%SE2^0a?B//E3PAJY]G`/b]K,#1S>DY61MJ:1[-Z2Jb@Q81S2)`AW-($RMERHFS^S(8?0&13CCP:H[QFYb]S**B#\P`1FTNA.1@\]1=MM6S'D+ZFH[X-8H$,VASb#40-_5>[PM2B,`a,M=J@MK\&4@D(4ULb<392J\Z9B*R2&KGb4P'PW[aQEZ(T%N@X5&%:[<$Ta]%&a9Y\R<EY4OV0>;RHM*FQ.WA)&CNFa&5-bH*[E6`,&.QVX)*9bQP%$$MZ[NP[9M^8D+Z@4OBM$,]7V2NU>]ZUZ/R[2Cbb#/0R_@6Nb#6%TQ0^=LZU2H`&R)#9ET\&KO:[`$/CWI5a,>F^;-_L;2C:?&/BA8R)a4`B.D+_<EZ>[aK<;>KAMR2AJK^EbTO5a8@HS2:'5N^a?^PXN\U=A;*)5Db?_5bQbZCDX-YSb=`9Q?1]WF*J)L)]<ZZ'FD[<(EULXBY7LDBU*HT?>22$[GQQ\L8HV/1)5'L#V7`B:KJMV+]'<C[]V6W&L-9)<DXK=`=<V/@1'=)Z2;>_Q[RPC^VP^)P=(?Y;=-QN\>)aC?=M,/98Qa&:/>AU$1H#_=/^*YbE[8VD^BR(M]WK6aZ&KU2VX@JY90TAO*.06[9_NV`]^XPA1G8U0G*Z;K'<;8bMQOM>aGM0*#4S>?V)PE%(K:\KPJO?B1J^@_&,;9$;M$C$P?^)Z9)18*4FP*521':X4@,OEXH'S&?IZ@R4?:a9bT221FJ[JB<,6<F3&F:@*?;)Wb<GVI'_L2PZ%[_b#VL9a3N5%L^M6\6A[+b#AB'A8TAH[bZ#74W_)ZB47T65E;_P.8(\@KW#)#.U[aPX-9[G[VQNBXC_9T`R+aRE[F507_=N?0#DPANXW,Ra+^aQ6;4^$SBD;B&:J8$J%>N`-MP+XL'Q/1%-9]:V'2^+U8<R%UG/S&H/$*>A\R9B_b6^+[\6&=BQFI1=B&\NDK?AHXQ%(H^<aECSC44;P([?V#0*'1'8IFXY&7RXK5O^LR9Q9'E[I@MTM\JH,=QN%T&512476?78\(bKP7#2X_M$ENEaG[06W+b=.745EH6.NSM,6VE_IZ-<*F#bS[#;JX'`^TO^#Y7[`D`P94O4PXHT49(M^0^<PGJCB8).QBIW1>'?5TD6B;8B0b$MNB+%:]V)\CI.^YP9W`RYU=bN$Q\PA5+&5F/S;'aJ($R@U0S^*-AbCG9=*(OH'[I&%]V)*[..O58LV*PTQ*_:-:B'/YG/b*WH7/T1*74O]H\9^\NTM*QHaP/^W6?Na\H5J##/S>SQ,J_P3\8.9Z'@F=E2\?<$@IHP(&IYA85#11=VOVU;:0BLBWBZ&W][-VFE>KP8>ZK4I8(KF6W^H*2RN@VD`F9_<O(&Z,M>57X<Y.O];5D#bZ%%5+aCJ*4\ONU\UJ7CHQ$Jb\THYFAHM-IYT,VZOIZ4*/%aS*Y%+JOb#8P<=:_+WRV*;.SPM:XY=_]?*W5:'G,/.3Z#a\G_SF9`26G*Rb0OP#+.YBR)]=Q085*<$CK&FC,$1JI\N.VDB=b&&=^QU])O];V7Q#<MF9WPF_).LGXK,F4[?YC(*U<aI-*OVR5.B>$XB,0=:YR14'-SK(`#.C\VX<G2(80V$KQ&aJ(``ZIY][P.bD7NUNP=7)6.[6E29*.\U75%4>3`Y_.8O*6[E\9.2=R&#:Z]/Z14L]6Q'QQ(G@N:2)7,+QR&MHE*3-AWR0,a=aa36WY'5W^N+P\CM$HE(a1IGUK'A<N`2X6?3>],)@U'[R5VXBO(b#>3%,WJG].%;7F4\2E<IG>&;T5R)aAU[*AM2TW.'G9L,1%DY&$A:IXF8RGA9TGZ'_1RE09Z*:5AL@DML=C8^@=0J72UQ'6?-[5VWaQ#:?9[B*MS2+@_$^\`JF_>^,OX>\(Q0`']&S(\GZH2?9L4^?W5@4<H5(^TUG8$:&9,Ya>8+^,V$%^*-)]N5QAa<KD4'KN_*73$[bR#5#WRb=D92'(]_L8AB45;N?-JUT;a_VNN=N2D;TX`PV@P;\+OB^#+FH:C$312`]K=Z05BCW]:E'<*8Z8B/'HH]V*?$9H\[a6B[IS.4REXR2Mbb@ON`a;?^N.&Z1V37>B:=,/Kb#>S'TVR'P59M,]Y;PEFN+P#0*GACTJ$+*Z7TB\I[4[AF/^:^ZC,H99RW@//UG`J\`R0_&_S*C`/)I`EV1^6>SX/0;,0QGJ6?Z/++I;S>B#R.59TLB]4<7ATV)*=;@0'-T7)#JO#$,GB1B9VM9W>-)E;9T&#,5$JP4/[4/>#+6^N2>a#V:H]8W^DGO%H9(^;\)97^^Y5]+LIaFC5V)'&\5Y3+C9ZT_8Q'C2H2C<ZSLT=X`JA@OF/H>IYYE;TG20`8B>aOZNLQRVPW.Q,QJ_4HO)L-$55`#$2_W`8I:9=0AJT_0X[>X5,4'PC9UH3U;=?/4%,_bP#MFG'E8<8H^7]K4WX@A_&JT`0@NY@M6?)F1?3,QU-bO.G1+EO/?1FJ\,*1[<Ma%&S/A`T2PW><AA`L;G(%R%4J3V26__K1]SC4AQ<E0VXX09223_W[_9bWS**WB;M(%9@`UA_T$85]XHRN6XW;O:PFZ'1B@H%D9-HC#5[FUYQ_P$RK@W==YQ]T8%\5J'0&,C5PWB>'Y@)WZ(%_+$5S#,B%QAWS<7U\EE,^`A]Z`=09VX'JHI`<A^`*[@(#5`WN%72VbP#[%3*b#5Q`NFAP/8R+]E2Y/9Y]X/O-XD@]`C'RAP5J>$?^XW2D?^R#b:=.`%$_`=N-Y6-HP=G8+R?<)b)`TL72AN*HZMZV0_V.K+(.L3'#1.2:TY8V2Y1/aX?T@YN>,Z8XP)3^U@V%S.#%8.+K>aZ/WL+RZ.;\PEV^.%R($bBEMXa8Z/7W,0O@4CP<Y>FS>G7NaW-ZRB,aT4_[RL(NPS`O'?;1'_]$aGL$$ZB2DAR\_JJP&ER[:T07V],\P73@FRD1*3>]bS]D_YHFLQAH:086XA;a4YL_T;Y:LS@2_2a'3&+XHG8H=-=VE(0L5TZaIK[$F`bX<FB,MD:5>]=?5@=`]XaA5G5]J[SJZ(\@NHNU5J_`DH^.;AXK/a='0=Y>.8</<0JQ]9JGL0N*3b:5[RR$:6b1_H<TF?@_-a2<PET/O-4B]0&BTBWE`0^&:]]:(H`=*H1TG=]'a)HSA%7ULOTQ9@IRUL))^+9*Q:\X0/-A-IA-]]XX1J-7H2:BGAW`b8R_-J7aT,<W6M>L9=2ZV[<DG#B@I=^J/AA?WFLO_:JTJ5E6>`2&G1<$#0Y\<;'/UI\Qa3XRAV%[LUG[UV?-aB@-%I#))_=DTT\AO'T(a--0Z\S>W6L'3F-b#5MWHYYZJU:KUH^Y\Wb##P^27.S:OR^FLFRJMaZ2L0/'V=)a;[Z]^`:OLRa86GWK'K]`7?9#Y]0#2H9ZPNO=ACB\@#N/&\(G/EUUE0K.95_2)GHMW8E2\719U&04#,(2MU9>-V.^[EPN=9VR,0bXB1&B)2K40YM05F_S(NW6#:8Z^FYY281a@N[(^RU[V_)aK,V4_6:JLSH<1T<I8?7.TU;?QCL>-+&A[*_NK\37XRT?9HaJ8YXPJ.&SO0]AD2PE&?^/UW(R$'A$GHTL?^B)bELb.+[VEQ7A3+4':bZP.$0GOP>47D/%V%,26b8\^9ZbR?MAY+]TR6,XLFQH6`8Y(9_Z0DVCFY/,4C#^A4TXRAN`2AOPWP`^%XaFZ'.^>Q@IYXE5\^Q$J])G+(8&WV=1]\]9U_EL)JOE?0RFR`2:=K*M[R^3U?K'T12.D/'U,5?B#GV[:^*B.<_OWT2-5RL51`,Y+:GY?*^#O(TH8b,L<Z*_->a`8JXXT(W[A*DH$]=:ZE4%(*&\R)1X*XS9:BE@:^=1;-C`%[C75._#E8A%J(;8:475SNVA\9F,]74MZ2)TK18\6D`2P[^TY:BD9DZ^AVG$&$XOG-%]X`U%T_O08\Z[$:H*L6.4^MG<M==;U;[W?Z(TaJ\RA12*RA#=0SbY)YRF?HNUK'TZ>F)CTb<H9D6AB1MKaGX*M]BX2N*D7XI9]'X)F9L%F-VPP>EOYX^87%R9`:X4`?4*OZ:6N`2+a-0b3#_@TDNDS[1J%DT]3&3GX]O0aCN_<][HEP2)=%OSMZY0,>19W\<)XWI`Q.R=bY#(=U:=*5*PF865D\V\5`\@]aC/JNBP\Nb2aF[[6WE4>POMUZ@KLO6$S'a*-/ZR'6>*D)'KZbM6+BGOY3)`*OXV68GU>493QF.LHC6?GaEQMNU0K8]V/GAG0\]Z4D%)E*W,JJ,F9*89ZNS//_&I\<?*\@+M-N'^Z.D7[Z-&&aYbFMB'Z6U2G[#ANE._<+I_`_%2+<CTA82GFOH]'XB<aL<;>S`:*M[,F@74aWV4ZT@VMZ\?:O+(F8-b#=M8BB[-V$L>]`B#XE@AWT)*.VAP>ZEE5*V=X1a%Z-Xb+2]YJ(>.RE$[]S;TXB9;QV3`2+JXQ9]6A]T+/3]Y;/DS+&^\J,RQ[F_N8PWb<WJ)]A7NH4)@A.8;?$,bJ<9C]FG#b.=KW]B<U6UUObGaI56G-.THLa>Q?Rb##PD1VK(>&-0_`>M[^V&aI>:4TX*%C1:PH@(0)+b#L,E\B+U'$%V23MNB_A@S^5CJ*b..40C\XB0.6C)SVH;^*++,)GT1)]S[F+ZPMF[&YR8YU1SPW@5M]40PERQ,J<8W,L9/2ADaCL>63Y:?^T::LRb#0,_RS`1LX\@1L$IYXM;:]bH*<974))/8=7VZ,U48W-O31BN9bX#%\E.N[Wa0EbGY*OI`Xb\1aDQ&*-@V/C6a,6\KQ<G9BM4\('.D9[2BONHaX1XJ$BX'TJ:(PQQP$Y19/(_-.M8>&#PGJaC??%]9G`YV)P$<2>-U2W1*TL1BaJM>N8,Y@*27W*B;ZU$=_\T`M:N0,]7%N2G(&%^3F/a`^T-QQ5bGR_*Z6:)*)/PH_[CHG?7-)+[\]9b#=LZ4OLF8:S>[N,%]/$FQMMP`G2-C0%(.GLHV21SHTNQ_Z_:O@USXFb(=3+J$'=H/#:4;UZU`M+OBT::&.aN\H%UZb*5R8b.(\4B2+V[)Y>]8`&\/1+NL:A64HLB>3,TXYQ&VR6\a7^0JN&%33AYA$%D;]]]4/b8_2Q56bUJ0I=N+PSX^+7_6L[$BHCX`T**.Y:J:'N8#5/[2J9M3ba#(*%SK.b>R$)W)H]0YBEU(C&65U&S]]G:P(NIG'DUM*'%%U/?T27-TGQN%Z3C$;QT$`QK5L[<-:O7U.bb'aM2+/WY]4VTLaTPY:AU($9[YT,[50`S>(N9TbH#60#:-#K&A5<2:HYXM,9(]T)S76/2C3,IL.*>[.SC%2+GV%7K[<EF.PZa+[LEGHK=9@V#-,]bN]74:TZ<&VG85KUB2WP`9@HDV6ROW;IUYH(O$)4T/?%1b]3N_K`F70SISJ(H<(P+A);>/$7?WP_]40`;YV<PWGA2H=Z2$8J:G6H(E)F@S7M&#1Z;^8a<G,(;J<-G?%##J_OL0a-6H7U5$4[?A^$aXH<8H('%S(27#ZFO&'+ab.O9=P.'KA'C/]K:&#$BSYYLQ?$S-/H8$*W1a;1b1<9?^IS/5\U'C(4V#A;`T*=6LX?^0X;I9T'%bLN7?FHb'<;_2JBX/[Ua\XGPQQXa?.\0SM%%S5E*bV,1]YDGT>`G-X)E&Ib[6:MG4I_UR9'$SYNO*'>F`1OT_\9ZC^69&&Q5P4^?^[)%PX^H<?O>aa%F2$]AG/*_`LMV86AJ^,MU6,]>a+%59FR']Y0J$I&#YSR);K$T\21Ab#=RbP)Z-GMXLK+P4;U&*6ZA\BR(;P3I*>&I2=H@Q@%%6,J_2.GB8XE96;1$\'#B_U&[W_a[RC2FA=DT,GQ8:W.>L(P2;UIS30*_JK:]JS@N9U8U'AV+&C]W&?@ZN5^<=KZS8CX`H5]*b#5M9S&F3C%(LBaR``<0OG\JAb]GNaDC%*.OCBAb%_A^EBA#0)JT1H(Q<DY4C55\7GXT*J:/Z^\VLA^OJ[\I5C_(?GT4=F*RL9Z=7P.M<H?V$<.;F`52\NY<8IAM)(X6>J1NER%<b#>=5bM),EUHYY36_NDH(_BC?%22QX7b+@%E9JVOGO3S2=?:ZG_]`N3'S[:8a@<0^/;=1D/MX*JDP_GI+4&#&9B;;OG&b=L)2(Z=1RBE\O.X`,<_bT,ZVC61,58BW&+1-#<]A<GKVA\'L-Q^FT)=0W?B[DAC+a`G[;S$+4LO<IV^,^K5\KD,WO^a[R?<[RU^`I?B;N\9+aK6LQ<H/ZEO+Bb4=]QV,_76T:;S.><)=`V0[RX)=24-_GUT:*@Q>.QUa=*)&4QH'_/b&L-N\:U>.G*J([,^,A3)9J(PDH5W`R[D2)6VI=FB>0@31$B)^&<;`]>8R9+[B&bB1W'LRXP`E2`,X1MZ?,YZJ3H1O`E#O2&(AN&W4BHL4[?RG\KT/bR#,DG*J&:[:.bbXAJ2RR8_@5`C9Xa[WP?)V2U5.O54:L.T>SV$/HM)4>Z5V(H][QM=MP=X_]0,$X:;Pa^MaAW=)07IU[H5)`5a\TA^N@B4*A<]__?VJR9C^:O2ab.TR(RR/]Q`b)2_$VTXDH-%P5R*\9,9,,6<Q@GZRI'V[6A<]G[J5[X2YD(Sb#>$9:,9=(V45G&</0:UK..WOOI6[[3[#<5C&-0\b&HTN[NZ=[_,F`V1]7aB'4b<=;^?GZRV[CEUT@H3K>&F:G5F$2QV-T$).6V4-JZ4N2).[ZU*Z$^RQ_4.ILM5FG$:3W;T0K3#*/>1^YOGYP7KWb[7N]9J+_ETH9/.CKJZZaL99(a=2B4^'M%S;33#CVC]:\^D/?P[92,.__3S``bZ._R#3MK=(?QN^I#;4=%A+%&CJ<>GXWYX^2,<>'RAM>''U[QHRI&2CLJTE*FF;C:5OU:I31V4/62,?IP7M%Z=ZD)-UJK2=Z@$@:<DU[\6&=]H^[R267XQ5^FTIBJP>W\EG%1:G$'<11U]a85RS[R$_F<E>P>J^Q=2%_KVSGY081/@`C41P'T?(KEF_]H9ICWJL_-:R[Q.$A]@[>UK2`VD@E>.P%S[/P=LMK:QRI362,=3W*<Z1?8:$b]X)T8N?_ZD:OAX>,HJ)<.&'Z?PVPUM++G?T671#WV(T)\]'a68TR1JQO'<[Vb^?[`2E0:GY]N72G1K-*Q.)Q.<b#5=GZPZ_TBB_AK`(_YI.L@G\EE\\;[\_0Z^B$a2<>96[6A\J@QN5I+*F@J/T#R:JGLZ'WX;:LA_$a,;IaB7S:bO@D@KH9a6$a>@D<34@QO\`W4UZB,V;FC//A/&/LZ9^L.6.P[/HQ%JH0BQ6VF]^P=C9DR^GT,9b3(87KYB(_DPEZ=4DD_@-ET?HD@;,bP#$EEb?WTb<X:C/G)=Y:*H)*Z;WP41[+GA$JI\2K_NQbI#(D%D>C.6MZ>=W4Q4+694N+[[RU9BP]C]99a%M*VT\$UJa(Zb6Q+D6BDLY]]G#HCI7Q:9C*$a[`XNZ1[`+XR>^;9PGTaa._-0%,JCG^/Fa_YOB5Jb5_8\CR9)62ZJYQ5:D0Z%M>a,H2(,_92R#/W(;a^I^F%V1B/I/A]^N;C:V?<O4K8&LKI#%.'(Wa`b4VDVVJ5&BSb17[?5TUD_0L7%)IH...T[VA)0VO<G/ZM<[:^OKBTS2@<&087@_b#OYY/,9XAFL*O^9TR2./YRRRJ_bD`N,G,,X>1H8_%@+5B*CFT@1+=<G%5[N+YR?W@b>_H^`P''9,.^K_19U@E_N*45%W6W9[;7LaJX`]#V80_RV4%?VPaVY0USa<BW(PVDLP86BOJ`8HLTOA=M,T\X>@^]_=3SQ6BHY^Q58IAX/_XVMb4G#^MP#'M[N]JZ(,9_$EWNPU+@-DGPINE+J^*UR935(G<TPSV:#6'9]WWXR31bMB;+=`J*.I&18W(=KMZ:YIYN>W]\^_63-L?7SG7$4)&%@;0QIJU\[##3?Ba'#]b,G[Q^D\U27_.ZHCGbU0Y9aUUb$F+I69N[PDb`)?H+PX'9'1%$Z>E;TXI[K*8LBA@]:.1_VN8%9BL4M.9)THG$V$K3b#5#*X:b-#_b#'0aJ=U;+:TW<$aK<G1FB?AG^9^R@*_Ga0?[^FPQ:FJ`1N3^[F;+JB?OTAN<MS=A)J;;?(\D,,)0<8V-JC6PF\,PB6$_^SOQCVJMZY+TLZ];\X:^,0'7?bZ#]+S-Qbb#$GE:*bAUY$(L[3VN4M\+TV5N](L0\T.?V.*6<BDL<>4S':P=AS<S`J2.OE*W_5*HZ,MZ]'I>_(`QGYR2KGR7`Y-32&\([`VHRF[bEN=[I^C)W`*S_OG+=5LMH?F8#HD46G6$?JE`X(4HY>3S+1%-:FIaA%9[b#6,LYY]R.0_>J\I-PMF]Z)TD&Y399X8SbS=(#LaX>Y.[;X^+ZHH,M,^a8U:8X/M+:CHGOS#_A&F6+J]8<\GKGT^a'SF\'%$Ab&2DP2$J:1$18Z(3FMHZGb&[VZ80VA+TI1aU>_Ua6T*b.`\7UB45@48D9M1>C#%Y/'&WC:NLN+Q;?Y?CJW?]aZ8I`4]7%#Y3N1[$*'/4,O*H=N`C-KM+MBG_\:&'ZGb#[,HK-J.N(EP4@/T^?%DA]4WCNRSWC%UUQ'T7AM<P9V15/&MT`?U$C3G$211X+=5_[2T?b,ZK=_J:I:*JX1`#P7XO+-G7HTH2@YK$a,X@RX<S$Z6:&AZ`M<C4FbD=+STA\.@`T'XJY.0.)D#Ia.OFL]NN*bX9&$I^Y7W9?_;X&3B`[.-^ZM69G%Y\JX`\NI>F.KWH_:89)X%)YLb#]P`M7B==&`&IYEGG6<VG6\.<L)^ZUE-1&\F&NQ9_9a;L-$.4122<K/DXR-V(:(Z-4]$&ZLAaFQ`=941bL.H?$;X2R^1.$.1J4/:MD@/9^$1[A4%G02.?_/_Q)M]%`%`#8;OT:)4$%HFJ&,[b#6\E(9MH5'SNF5+UC/12FHN(S>[b=3LT<`[99RH;.^7MP5@'$\-3#H$[#:T[9a0b>1G=?Z$ZY;.Y^<C8S&$?P`?;1,<I'446UJ$-WJPV)[Y8PVA<6aZU?<UFPC\O$U?%0%S)<=_T`K`<M2*G9PUaP$Q<T1<H[UV3Z=-]XP)([\[O^-5XF;V`_$`7FW+2$^S7IB0)(O8Z)_3L/.1:J57b*@X?58X\23@3U<?3,NX'=U?@[]\-<](7O:7#TJF?C*.240,FE:?bX8@Q8/Q<[T1T_$:-_W#86WND*Q%^XK]=WPK9(A(H\?,97@CR3Z3,(<[#Q(Y#$%M,bP#X8UGY&*)9D4T@#J3VaWW;HU5+3T?+\7)1V,XH:.5b0G1**$KG/A`[Q?N?ZH?A3U/;HI2^*(G2bI#@<SK*7/*;.Eb93O\QT53(?=5EDH)9)a.66GTP>..K5+HV^'%&O6*?^W5%_02<3/F4JP')FIGY]W:bEP0)`,I0%]6PbTKAP]`%Q:-bD/X63`1X5ZP_UE0Z1Q%XC#G2RN2Ha-N%(_)YS])&CS5b-39\8*;6HZZ*@?[R7\0K._RVB;<X.L6UEQ/U*9T*](AC:J1__TV_b.T91`TV]@MA>>X6`JH\+Vb#*PN@_a:C>]>LFB8W)@;X^KS%<3a;HW2L0**524F;:a0_FTT8:0.:'T[D=AB3W@Z[Q8PQE6HK1?OK,R?XQUB9_:_(H;'RV9`/_3\HWFXB2+X+OR_>H\KGG*P*QY<#MOQ[_H1M2D=]F`%4Wa`V<L9W.0`>5[[JT16PRB6/ZA/#T5QB'I&BR,DGYHR_SH)MPN=%5VBM=>U#GG_ON.L,=b0]>S.LWQNY94/A@`XK&POUT;\6Q8TWQA/aU)E=:*)AU;@G=:M282_4SHVEb>-_A&a:X(SXa2(I@J/UM]]/4I`3S.ET6O:;V6$+JZ=WbZ#0aC,A2.SaF@IX0[)b=;`$0%0H4)<K_@Q&?>CV:bA`N*@Rb<WX\H50$TQR7$(36W04K%*#C,N[7bTKTbMO8:_%.B/NU`)b$,A^L1+RG*8:<1$K&\V59OGVVE)(J)=[M]+UP<WG\I*^5Z4:LY\8KbWY**_1(Q@\ZU9@F=A\VU5N@T3+YOE8&&#P;3*b#>A8:-//*7*[#9a8SE%NAPQO,A8`/;KW;X7Q18@\aIYH29aI_):'B=V168Fb02Z]aZDH?Z@PG1E=9a_\A[ERU+]1;F%.B9TC20C/D(?E)Q.$$ONaa^XHAVP7XU`VEG9(I&65@(5YAaQ%,>B$SCD5#+^UD[[2]UP77`YTJOJL_MZ[8UI[<6a?UZYREIL6.W:8[8#OM1]*-=1D.'`8GRXE*`=TRZ-BX*XJ':G1>MLbV1OQGT@PF4Y69ZQI;^E8ERL@G_4F28V)Da3N?/Q,<3(^B\&L_^+=>=Z,()]M)4IG+[>Y;W[#J>a1`DNHBB.b-4Q_6]E\W>.KP`=@^4373A(XY\Y>P6QG:$YVHU]IHF<U$$<5,3)W=E?8Q2J6EPR>b5(=Q09<XK<3L0bb8I98>U>HO@43b-CI_@J6[`FE0bXZ`a&.,T,)LZP=]Z/b#=`U5X=X`ZJYXU4D\NEbTIJ(OQQ78@KP.?MZC+2D;Z(1[FF>NC`4b:J09+2X3=[BA^6Z1A@GI&>&bD#JT>?8H7P9(9?:OGDTF>?b=;LNOB-a4PH^J?07E09[@,PJB?OV*R78@X6\4W@JC&U%S#NOR=3_>5AETG`XPYIbaN9ZQ$G.+3F24?$,\b>YH`,R:@Q\$O1(\LB&b.J+OOXKQZ6&NZD.Z>S`M9N07]BA?_*7,PU)%5%4QI[6O=@S$--UVCB)<?Z[QEZJ_3]57B?PJTLOVH4SZa#9%N4Q@LX:Z0>=\PZU+D,P4?0-;906+%<F&'[T=:96Eb34E@B0SXF,F>%9DCFH3AR^\&J$#=P$]bQ)04X6`K.*08I:+RS%,TLG.;3JL9GE\9P*FW*%OIIKB7'=`^'Cbb#KU)7@,Vb#_L%;7PV-%[]TB'G@A'AC<=F;+HJ65)]BSIR<a*Ua2W:aP<TH1REOR(X..+.:_*&I2M-+/7T'UB(E.OECQS(;]46Z;:3S,#XP.\F982-I2Y(:RAV#YVU9+(bC:]0BUGRF:HbO@_]`ACPF.K6OQRX[2(2P(</='B,X>V;<$;YV[>J8Q$+]186bIL0]1P<0Z0'W[ZQ,/<6N=>$71*\>FC)K`]BB=EMWBR&:YFK4XKPN/C2QL]=M^/2[@5&,bb#C:I.J(Gb-a*H5]WR)R1OFP30U;V$GT<>I[B99_XY6*?(aJ$[=H.P6A[.K@K&UY+FTST)VU_O##N*ZX*:O]/-JF:b(WEb'Z#YaX2N?1VY<W^[8QZ4F'74%4J'-+2>?GCLO?31XGIaJ[PbE26+=@:9&CR>L5C;1>I0%9TTCbUW@EVBO25AB]PJ>];RORYP\];2NMM5AY<a[P_P5:aZ.-a\&U.C?bR#A+CR9`B*-S_I:DR>+O(W.+]OOF1;+CS/MR(R&R(VN5]E]T2ISb4,a=%B*=I\A^M2P@6-P$]?7>J=3UC86S'GU\^J6@E^(Q<,TX0.W;`T*H9K`M1_D67IM\0*[JG9E:.NW$C=C^O)+`#[XG:0ZN)VZ/E5S(F*/_M/#Vb2-0860?ABOHDVV4:]B-PW9G6JK-/TT?D^B-LPC4]8(<DaQ*^bTPa#<:O4<YJWM$WY5U($#@5(-)@K8S-KY/8U[F+N/?`$#?`K*',F/]M6@/<#*@R\T%(FRa8b4+CE;8:SCNA)CS5`2R9b#AL=$@D(ZQ$6+F^Kb8@91<MH7)1^6#3?XB3@<,T9+bH#[ZS10*I-a7R'/KP@YPITXa3bR]FGLGG:\#:D6KAB*ME^+\?%T,/,H\9*N+U>,4,L8FT881LTP/U(&Y?BT#/4%,-'XK9AS+C\1].T]JbXTOW:a<^@?CV#SV#0^Y[=8:P[A+SFAWP/GTI\/<.;'HO.1b/?b#=-QFM5^$M%U)K9JI,O,OTDX>7IF$_&RRS%3K.@&$(+*'>YC/.\%1`-#G'JQT`#6;`b#-L(P<V9K;'9GGG3^ZG8K9IGJN$`>3**TB=H:>TY;,'87R&-'3>U`K#$9/I4#&%U5S#&B;(XHQG4AJ(R``/?%+\J%Q?(TB*SM^[NUM?H91DS1][7(U-B]VH).S,b#_,7X`N;6_5*5U87_@,]T(]<P:DVC;/HG#_?\a[0*&VMS(LH2M?.X`PXQ@:W4/EM3V*R.E5333$:CDQ2*9O`-KVDbVI979S5H-M8+\6]:(>E2(2YZ:CIb#527;Q2A.+8J.GH'JKM]XPZ(\^8SUS.IG:21A@I^7C*;BMa<aA9Sa9Nb#6+Y^90']9W/E$AQ%Z2Y;#,&^,))+42CJLBAN35_X,T^'LT?LBJ)_%<L`[TJ+OP8%A\GC`LM#C_6&)3]GH6BE3_U`_@_2VCb#>=M]W18I2IVC*M:5,@\SA%0;5O@J1[$J6N-JR_MR,Xb#>+a96a;SGT5X^+AAY\/U5[2)''5+N]#$KGA),[L7)M--Z]]>BM7O7I24R@]`O8<RNCEYC#)5E2'GCbBQM8H>.TIT>C1#,R$*Rb#M0GVO6H85Z#-4#=N(%#ACb#G1%&$?2Y,Rb8_Wa,0T/SR6=P$*,@*[#ZQ?R`:X3.F1PN'X((K:MJBT<1]#8)U*;H0IXQ-CDUCGQTAMNZ5GF+HZ48\<#KU\LL<7X#>+U#1-KTWbb#[Q'&?[2Q5+5,\BVZI?;2-UW2,bR#.FCT8#b7PJ<.>X_()G;_5$2?G]T1B8*].*KI0Ib.ACOS>V]1L#HQS^:-R.QTV7H^45O7EI*PG7DGCRa9[b7%a(&M4@K$TM@@>>](.6,Y^Y\VHH<2#5/#?47KN@`WN.V>80/_`5R?E*V.Z2L=1U-;Q+[%D'$W;<%]75`-(#]>%?)/KJG;94\F1B8&>8,]6L)TUCPaIDT$DU`3:+^6G#'VA>)\2=]E&84N<N#4Y12\BACW[:>.#P`A]?3+?LA]9,`<:FC]L74MQ7DV?CQB]+7-F(,@&GRGYL_+-UQ\JNCLJK#G/ZJCD0(&I*H>6W2YYNBTGA$W(ZMC<^:I*Fb>XJPB9XGB4[OMN@KB%V?[_^**`bV;3,^GM13C$2>1V$GACAA*=W_IBSF&9<N7SY3GFLb,=\O##)'?Y_=8ZM9X,1V*1[NBY[A\(5JB']>/%CK7S>+W^/BB]JVaFFSaOXBLFER2&2::<H3A^NN+SS'4(Q9LI*K5UT[<;MY\$bb#9*WHLBTL=aKNRG4ZY33AN/-\Z4;NLB#+]:Z@Z#GB(B+\PW7&HN2SLF86QH>Y,)T^MS%B?-3\3QW1=JJY*SRB(PM%;<ZM4'P*%0#`OFS_JT>-FQUbP@;QMOY>L=>PX8Q#18>RG_8ab;OW)2F`+9LI6SJF$=aLBJCSa>2`>]D.Pb0<JQ(ZY,M_NQB5W>^.)6CFJ(;D5-X_'4-12\4)LUP'Q\LOb#6AaG%NM1M6CAJG[b4_Y4J9(*$<*<9Z\\+*`U>_N#0[.TR&FQ5>H$F`VH[WS2a]%4Y0Q+R<&?+LUOUE.C&]QX<WZ<R'\+P@`&]&5[EXI?N;`\@C>AG6>)#1*FEC]][XF1M+6JD'_[6(X@XJ3`7:_F>%M95U2M$9),M0-8:17@`:CVS4ZT:6=WR.0:+:]+1OYT4LYC?SU?QFS<b;*NY@7=-X_M%O>?Z(\U$TQa7@M%b^EOC01TTA2]T.BTV?TSH@_ZYU'ZY9U(QGHYS(,&L[SS6'?GRJK8-2_a>`@W2R*=QMM]VX(<aaNVT/(G)3>.M%:CC#Y1W`N;QF(Y1&?TIA`V$24@/FO?L5U2S#/='`#)G.0+4^<Z4@FHI_6-'UPYXO0W8EUb9`MW@FNF#,4QQ(F1Ga3YTN\]EMV=9Q9N#+;/K$7U4?@`G*CJ)_MJHG'IEL$?2?U`4LZ,87#[#@2F5AW<YQ*9(bC3(?GD3$_bP#AL%$%'#,.GO\`)<DBABABFR47:KAC$S[??$=\<&4TVI3)OEGPFb=E)TIQ*$+,\PT0#>3T,OV%>0Z0_*AJNIL.?<.'IC_(8E&FQB,Nb)D/0O`-S:D\*1X/4')+4$>CUP#JJ<AbDI#-5]D@Z`)K\G-Z_.WN0^I,R=C,LY$,N611M$L$@R=#;[/GK4#3]Ca7;QCK<@UU-X#OR?QW)A5=<--H%9]?6%$,B6=NG-UIUE<E[%Q)[[P=8R'BaA5GU%GG][]FUaK,=XGSZD#?GG&\EV$77J]K)C$$C371[VC*Y6_<V,,#3SAS]$?^8U#G\R\$7O%2L7Z]5^',G-/<8\3`Ca24R_/'V;(W$L<GC[*H=Z@*7$CFH.1E[A@[#G_]7`A5)`;\/7S2>2MB>1a875Q3U:(_57U,;;$IE.\P_7S>B4R8;3_^8S\'-O/^.2*@#B#V:U8A5F59D3:C2R_X_aKA?QY1.#31:3_`K3%M1E/$%^N(B$Y:472J<[)%Y5?S*W@`V#'^(M#@=>)`-$//`FKT//Q8DY]^Q#K&U+A:[L:./A]GUTNB[:b#NP7LOM/'<*++G5V*@>SM'G3+_1J<_F5&8:5*E_T/977,U\_LaQH[HKT/JQb#P0#/4+++.JI(#;CW*_MH9_?AB4KY4GC^*'\L2bH<^T+Z)Q1S)]&LGO4-'F15[+_;FVaZXO2CL^;Z[;.R5;a&aF]A`@25U)6/VDQ)N+8HC4P2)]J3\NWEUBJS6><B,bLKET2U+E8a3E_(@5^]43/``6N3XA21=KNYBOD^(1QD3)?(C3B5bN+/SD(E=__]aP1P=`Z+X-N;2''`?aD2/TN7?G^XX5I9$`V^'ROJBN8M4T7_MLA4T([@C*\8R6J.RL?3)C&_*/QCB.LM[60N[`2*8WOWIAB8ZT`AQ_9\@13%L)[`(XY#$,:WR=+;LY:NYSH=NI5a0;@7ABFP2a@@70?Y%3ZH+D6<^P[['LOGJ[:5]BK4YZ.:L?0-_8]HD0<_Ha#a`%UA`:0+5'<Z+TZ#^+WJ7O8bV1D9DS<^+C#&5'M4\'4%/1b^7'/P_XNI)R:6(#,BD>P_#-GTXXJIH4FU0M/$b`#NTU==CNL1B;UR@MKY6P_(22H'#,2]%Y*/][bBH?#S1CF7D;&9_&DF*5Aa7)L[-4+8BEJ&O##<2GL02^(-%%8*b%`MW@OFDQ[&/?QN1P]4C[\<&T0[;._X2QT]H147_JH;'4B[R7@]8^)'/T8E+SMF/BE4QQ7UC#6#UM,@VK#3O/>[U=VR'3_*?>`^6K5B.Z\EJ\>_?^G$2LRI@5Q-K0K;X`aXV.(Y-3MaQDM#I0E+OG;[HNP/,]\2Ab*A?08+E^4]8'^7TCbB>*AW/:0`-NTAF2@M$I6M#$F$A1T`L5#C3VV14#;ZIB\,W1QH[<*abG#DWYK@_4`?Q^>5%^]539S)SG`+&&XCG$1$$Y#_V?7ZZ`X?TC)@PX$##0*bH7_7()7N($5\2_`'ZX0^KF0>*&&<W#?,HKX8M_6A*'#-I#];%V7Q[D&T,IZK42A#Z4CQ:CTCbL]7Z7UH.AY6/:)N*Y]#.[=ON'E8C%MU&:_XLB7MS&BV@#^#`4,ICB2Y<K3LL#Db,']8KBCGE[UYLH#+*59#E.1S*Z6#F*CGXDXGV._(+*J?_GF9@:OP=3U(\A2*C0Wa`0L)Y-5#U8S=>5CK[VN[3b(Y&SY$G3J5M2;1]^6(U1L#MX7F>5`aX*FO%A/[DI)YJX\YG9U&D>9)#];CWC2VCB+=J%)#`P<?K,@2`#0@:+UR</[F_6J=?1$=L(R92I$`*%<G-)+;@A(S*4(I#A;FU#CJO4C/OLF)L]$9X4\ZaLR\6L_(;N<)2+D\?IaWHI-?S9=$?,FCaK`L$9?ZOV.I86-:M'AVbH#9L9E4GMC*/=/UR(%T6D,5W,5\[8=*'<A\K)(M(REMQE$_*^b#=L34RDUG%b$IS6J38U&'LO]VD)#51%\@[Ya8M\TV#=*VA<;;2HHT)DC1S`-)\4Q70-8H%97@3_U#G,F[]Q74N08-:CCBS$?^=5A<H$+>/=YC/7AJA)b='/M/$Z,H<4OV6`XE-(V8>,,P<7>TXWP\5b)_0PAA#X\EP?_7U@V.`7,5/+H)S<TMV]8a>O=9\EEDW?COb;ZLLa#0$-X7J/-%4`\\#H*TH98:?6UN%%U^`#:N+?J%/`/5$&7L9:K8A6:H.OEG%:]/]Kb#003(JM/@_'_O*(&BVI&5989;U=.R_+S$X`X5GW>:#T7_BK'<WRKM2`@0%HOCHOSLS1?E$:'$_E#;9^GGFWQF6bAEUR;Y3NCF$?BV=:).9T.IAH581K>VXS]=,0D);F)H[L;?T.C+R[HT6(G6+7+-1BDU;N]T4[N?%T4=;M;A1,`*6E(_6Q%/C<T6ZWSS:+_LO`DE(N=ZS<HT?@A@^&3DMO8\IMGUJI[J=HIZ[*5C'4;,aa9JC9M/N:P$M50';.F;*GR-S?$+b7Z[41_#_\Jb#6R#54$UC<8G+T*=7.C6#R]5^@,VK,S>$M.CG`6WI:ETD%:NVOC@`1MN[\9';7S#;;OJ6IPD?H0CP4V3Q2FK.&+J#Bb49O?,?6TY,M3[=JaDUWA`LEYD@KbK<4,^bLH[O(N;,/-R\;57A;`VLb#+%1OC*LaVQN.V$?6(7;.34(?,2R-3B,:]E^>5(((?*?C_/W,\L]5?G<#A7MGWG>&/)4L0IGQ^Ra6UQ:]b-S)6=59H+8)^'Y3[?33QU2QX>_V^[:B8b%.5)P<+@YAS`82HC%9^6'U]Q.C;`LAPQR`^6aZ.IX4)1V+,)a[#<=I\GX+E>+))7XC/^LBM>TXP//OJJ;<*##Y_Ka%K<SZVOK$]QEF$61P1MN'+P^E5S+1#&#N7B9bJMM1G;DF>F6H7QQ>^IW2O-D.0'RL.35a8Y_I%%(;S\HF^AaG7T@T+AVH\DF2]`&L);.J^Z/TP^7Z%aKaaW*'5>\H$Q3S+OSGE3@6O4)C-Z5.A7NV4aQX8Q3.FOK#Qb3\>Y1MH,?U+?TM4%):L*I`+Y8KCIB491L,A'?ZC).$_(0,S\\b[_WFUL:5T;,A7T@EZJKLH+*\>S/:ETW[C3:T5-_KOZV#J1*^=#%I,>&\\%6b?T32F=B0IKFE#$V\>0:*JaNN)N3[4+A%&&2WQNZ5`??8K_'YU$T;*W5$);3G[22R[K)#S)UUbH??N9;%$<;F4>IRP;M1H;$/[.%#,HB5Q(a?9%K\2;5@K%3WS_$U\47?8NH?IPBL>6H?T'&J3]bI:]M3'QZ(_TO:`MPU/C9_^<8*-)]b@S%E5'%0LIQSHG3C11KLK*-S2APKCHHT2XA_(ZEA,I\'AS%-Ja9K45)T^4)4/1&a7#2-I)VK$@]'Q$N23T\5AK2+/L'9;\H`(\;+D#K-TNb?^5Z8853A-1'S^2'N9#BNa`GMTT*$,?3YYHBJ,PU%GOLT(CR$WLZ(NN,*bC.64BJbO6X.)[+X(O[Y*B,-#9/43Q.V2JY[6S@F0\J9\+]&>MCS0$&%$?KFI6^4*MV1E5V5S#D<;Wa`,QGK%5OD8[I#Y?/QO5V7+Z7*;QEQC_a<P6B8;^=/K1Q4>G%8<@$[(,5..#37D3((;H$\2KA7$'#35HQ<.5%)/Z5CZ]W8,R?WKXQ;WFIK$`XE6E4//I@5^@/\2/VA8K*J'0?<Y\VCPH4]:+@[^8^3Xb.,]IF6H`J&-8XE_.NN`<FF+RHUC;CD9)_<;UA2#T3L;9\KLG&W8HBL6%V:YPFNERM&5PARW\XA^;\XKJ#A;$:M(M3V'UST[&-*Ja.8OMXY.J(>H_:Z^X4\0-R/IT-&)(&V1_*XR9-[VJ\IBNTA@5OFV01QE4RRP_`$27/-0F>+:O\_XO4[2Q]@[2H8WH\^SBV(OQ&X(4O_XA+R_:8:)B#YK<'GRL3@2';?U0'?J:`DE;V\[VHUab=D_RBRF^&A-M,_?BQ*[b:a@`34PRaRLTVLTMR:ZS3*HPR@:>M$/N2S-UD]G39*\I)B?=[`_994M9[EM'=PPK'8'-8&\<&+AJ0X\QX$L,FFNRN*]'FS'4BL`ASPE'@)5>M$D.KVS#-8G`SG/FD/-IJOa&bH[):-=\bD]_O=QDAVN\Q350D:9>J<1\6)/CQYJ7aVU'`_Q=P^aY3b#b,$4?.IU0EMRY2^B_Xb7^D1:ZEHL*QG]@E_:4,N+BH,X:@01*)'ULU6']9.>X?:>C>K'0_QIL[#$K3PHU-TV%=SN,W_REG`>1L&)A:F559:2;\PFW*6W;N#,S3*GUTU$#)=)3[*J<#`$`5*-_Q:HD7_J5PPQFN-^0XE.IS>*1QH<HR$V2/YQ#OJ9?BTQ7K@+<`<ZaPB`<?U%K987H`XY:?CRZR@@XO8'Y^U>>^?00>7V\&+4;OI:N_XU\T['CG6G+ACJ/H<*?K(aX9Haa.TT*6_P0LR6[76/YBSB*WLH*Q8EM5-+IKU#?AQO%<,C'5*J8,N.K^50Q*$T%`^AF'L@W<M]5*?PNT^?X'KMTM'6b*UbJ):X7ZH.(HOD@SZ/HD:J?WKG,*7_M:O]GD/`MU?M,BL-651ZR8#K3?O3L`<HQS12&SP@*<T447C#V#S3&%,')0F&0NK4+/W;I]1`,,aWF9I3*CD$G51Y`XL.RUOHaE452/$#_RK4<#,'/X-8GO_&*.XO)#@O:UC?%%GSS6\H51@5@N^,)`YO2Yb==7@'GaS3:S5]JX]3%<(>G,6+G>U$C>P6%@`K/1FE_4TW15,`LU'G/DU1>V3):4DL9J4TE1/U&;/GFUL#%<W#@&Q7&0$31<`V5CQ^5])DG11)6L$2?V5>T@FY#\GJF5&:_Y=<E&T6J%3&59$R\GVBW>$<GCTM%%48+R*bJI4R9/?IaE?J*;B*TZLJ+(?C^.Z3SD7V/AZW6OB9'%'5>FQ7&$2X#.)4GAR\#F,^S0a<`JMXZ7'CE<O45@H11NK1D%=L&ES1-DG5b.2HM.><#M9`C?F)KQV]3Y&7JI--*YJ>)G]]6S4_D0/(/FCGb[=3G1T%<UG5<`[JJ#A;I:#P8`1E==##=O)4*aM&(;'$a88'<AaU\0%O>IQ\:K?M?b3&Y*b8:E1S#XP$$??(*J;Q,UL888E[?H-?JEAbM4C++_+H7F@&898@T+NN0^K-T11F#9[R=[$6]*T#A(+<\+W7WP(5CJH.5>Ta3Y`]=5#8T'XA#F'`B`?^7]O>7^YD#:V9FQTK3.Q)8W?1ZL9bZC*ZLI0U9/,Z+`C]A?[R#V,//'D>YN6`]OBJLJ9D4?%9b+Z2<1T8&X'GL2aDF3:_L>T+I@Z=:5.$AY[G(%;;965M0'&3[.1M[L8,^><)QWaF+WO[HVL?_KCVBX#LZD++V\IU[SCU#[Y7$,HK3$'><H4aTJJ_ZYI>2*L6?#1>`EMG-M$.5$&RP<^DWJLF(6EPC,\[\`TB/QYC..T1RA[3:&J#?'V((]^7XE>.:%>U]S`L.?)'DY$=#]/F9I8-5(.5;NB?$8/%#K^<2*A16bM\b`#[E'(R^?;&45/SLH[5U@+<VU30#Z@`M>S5.EK\-U([CD1,RO=#4D&Q;T3B?(FB<=EEJNK>IOJPZ/#R&%SL'2NVC+/QJa-[%3?S^*M/N$CJIb\(C5N[3'Q-N(L$8U**`#\J,Q#4ZWUF6)Z5O:>O63)%Z:0$aR\G[M<@+96WUQU)a3;C-&N%#M)%S^+aI5ZNB.I(*M;,C6SU#K?]SU^879(,+MH/GACGV[-*54@S,/UG%&U1U+a7$-?1U?Y+@V8*@YB7JbLW/(GEI=(1+U\)S,`b]%bYC]$KZKO;$5[#*56W>P'N\;SQD:?/N2BMCSUI;5Y0-257)W)]]O74*[M1;M%)EM),//`RQAbA8W[#DQ_CKA]9_-T;8],$\'7)M8/G`WWXPb#6;+-*\QF?Y?E#U^*?Zb_M(@'-ZL(C<K3/W)_72O6b[R8&Q^$;+b$31.T,EaM1T:#H-BUGSZ%C5]FDY/W/@F>W-*J[5)X++I+Z+0$GQ,OJ&<J&C'I@GI&E+P$Y:@><?G/$LIN-4N=\C957b$+7CW-;'F.'-OTA^8^^B:SG).@a.ADPU/(T7;145'(/M]%S\-66KAFCYGX;8C9-'O[J^#>?bQ#`=E'O$K.Ma'))OGW\CO2MF7S,?-+D7b%+`3$AWP/8+);F[/MFM#aFQ=&b(?_/57IG?`S\=I\P=a>Q8H(FMXQS1(`*[H5&,>`'-]&P1W*;I/,+)/[G#Y-:^.aOTX[3S`;I/H2;2QSFRB`_&DK4GIM;1#2GaO7UO*%:G,RGJP#W_YL$%M.++YC.O?JbL+;?*5F25?X=^A&Kb+[DB+G=OL'V)&O,FS/A&(=]%TU_<*-V1B2ALS-&5VOD@K(4[0'?B'JZMF%Z&TaDD381%Q'QJ<AG/2O\[N*@3V+ZI59O#DF#?Y<+D%]C?45%NKC8#;[JVS$_20-AZ.\%4C=;\G^>_%8FD;^5)\a8OS?%*CDWHB\/I/@;)a6*Q^0SR#\OU1F_(W7G#AU\X_YHAR@_H9GMY)O41RMG0E^S@B#*R(?]6a$UL0E*HaOFZ?4+'[V;:PR>OCH,;%JFNG4W?O)V_7%,*Hb)^E5\D[<Y_Y[`G81GB&=X'_N/P+WJ'4K2DUL#,`FPL#II&GAS###R%BMK+74\@Q+G)0aB(AJ$D;+2#.Q,L7QQALB7C.V/FM-#a(L4'L\?S>CJ@3MT,-/EHJ*FTD`M'\aK,WCSJ.-RRFD.07;'V$CJNa#,EA(F'VM-\5^+\>*AK<-WA8Y'U/C<G#AM##H,J.;O)C?T9`@Q[8.*O$]#^E@@(UD9@CPE+&TTU&CF<;&B?LYH:.*#C#H?F_TGB=ANa;@<HBCV3%82AQXQX3:Y\CQ&K+-R&.P&4$2<TFK'M'&%*J:;8bG(</AG#4Q)Z=C2MKXE\H5\C[@[JJJR7%Tb5*1#6T[C%:[C%%>UH3AK=NB6>WB=42P=)E?2S`_C&.4X86U?>?C^19S>&+$?7JH-,M3]I4*F#]4O2E35*3PZ6YQ[X_,LD.*LZT2S$XFS&.5IV2b#+L=JbT_TQJ']7WC90*V6B1a;7-#75UGHL3)2K6&?]R$5I:^-_U-H$b?)#L+I\R0G#(Y+2GJP-F@.E%J#*NME4;447_S/b]^5C4/^6%M\B-%]2,6[7a0U)bA;abE>--N(M4(+&$B^)IK%V+#C#3?F>52/6`BS4(?M;EZ)&T/0V17CCD8G6&T7_UO_A:7/6(_,3_Z<?)?AWI34/$>;OR9b#=9C&42PC.b]'%#+,X,A'076'N85%C.VUK.=#K\F)E>8ZIZ8@W0+Y_a$P44%]&Q_M]<a:*2<)b,*1U?-aFC0W8[0-1PJ?,^6%<WBK;&WRJ\&?'5<?PQa8;]%*KX%<S.]bG#W$%[Jb%2+]RD?CWa7$+\?O;G(HKCS<Y)MDE5G/BQ/U`*X:N5W5CSA-8+A@Ob)$9NFM)9QO(1&^S3'ZO/#0-QF9TOPQ[,J0M-(?C,+B>K1V54\AQO*K:#EPR/;HDNR+bL#4<]UM%*=$Z20A0A7Z:T<FN09PT*?Z,H.UTTG`?\@^LZMAQ\07M#\\&MK%,,$#5K\G#U+*<UX3,4PG65-H]$8/-`L(G'UY#/KF.44,4<HC#A+1EM)=[8A&]K.)G712-b:=YL@(Z>V&EHIC<U+[;$R=B]MG&V,MP\*W#IS%H:GV=ET*IV-EMK,)W1C,]^K2N;OMUG+N)6QH$'U$U,N:.4)\'M,D3#F;OAX2&;/-X[#A$[R=Z#PN$I1J?SF$07@/1MF+W821aGC4B5?)[TJ;()?SS,P+YKG3:,J'$*U7YU9<&W#bY<,
leopardpm
Posts: 1795
Joined: Feb 28, 2009 20:58

Re: ForumBlobPost - Utility (Ver.0.4)

Post by leopardpm »

good job... i like having the original filename and extension being the 'header' of the forum blob...
caseih
Posts: 2157
Joined: Feb 26, 2007 5:32

Re: ForumBlobPost - Utility (Ver.0.4)

Post by caseih »

Rather than do your own Base64 scheme, is there merit to just using the standard RFC 3548 method of encoding base64? That way the blobs are decode-able using standard tools[1] if desired? This is how blobs have been worked with in Email and Usenet for decades.

And the file name could be placed in a standard http header line before the encoded text:

Code: Select all

Content-disposition: attachment; filename="test.txt"

VGhlIHF1aWNrIGJyb3duIGZveCBqdW1wZWQgb3ZlciB0aGUgbGF6eSBkb2cgd2hpbGUgZXZlcnlv
bmUgd2F0Y2hlZC4K
Or maybe get the forum fixed to support attachments again... ;)

[1] https://www.gnu.org/software/coreutils/ ... ation.html, https://www.base64encode.org/
MrSwiss
Posts: 3910
Joined: Jun 02, 2013 9:27
Location: Switzerland

Re: ForumBlobPost - Utility (Ver.0.4)

Post by MrSwiss »

caseih wrote:This is how blobs have been worked with in Email and Usenet for decades.
Yes, while this may be true, the objective here, is different from theirs: "encoding texts".
We simply want to encode/decode "binary" data, at top speed.
Therefore the part of: "choosing an Alphabet", is a moot point (causing slower processing).
Reason: a few non continuous blocks (see: ASCII Table)

The method used, takes (speed) advantage, by using a "continuous" block of identifiers:
0 to 63 ... then simply shifting it by adding (value) 35, to the "printable" range.
In other words: the look at the problem is, purely binary processing ... (no other limits).
caseih
Posts: 2157
Joined: Feb 26, 2007 5:32

Re: ForumBlobPost - Utility (Ver.0.4)

Post by caseih »

Hmm I guess I haven't read the whole post. The subject line suggests this is about making a utility for posting blobs to the forum in which we can't guarantee any particular character set with which to encode the data, which is exactly what Base64 as described in the RFC is for. Guess I misunderstood the purpose of your utility.

I'm not sure what "top speed" means. The standard base64 encoding tools we've used for decades work plenty fast. Back when Usenet was in vogue, it was used to encode images, sounds, music, and even video into NNTP messages. And it's used currently for email attachments. Seems fast and easy to me.

Smile.png:

Code: Select all

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
RK5CYII=
It's fun of course to work on one's own solution.
MrSwiss
Posts: 3910
Joined: Jun 02, 2013 9:27
Location: Switzerland

Re: ForumBlobPost - Utility (Ver.0.4)

Post by MrSwiss »

caseih wrote:Guess I misunderstood the purpose of your utility.
No, you didn't, but as can clearly be seen, on your example:
Standard BASE64 takes care of line lengths etc. etc.

We don't really need to take care of those additional considerations (which, btw. makes
coding more involved), than the bare minimum I'm doing (therefore, more speed).

If you want to recheck the RFC for details again, you'll see, what I mean ...
caseih
Posts: 2157
Joined: Feb 26, 2007 5:32

Re: ForumBlobPost - Utility (Ver.0.4)

Post by caseih »

Well I don't think you would need to implement the complete RFC. I just mean a compatible encoding scheme with the same alphabet and same 3-byte pattern (and padding). The beauty of Base64 is that it doesn't care about line lengths at all. You can have it all be one line for all it cares. Or you can add CRs anywhere you please, since a CR and LF aren't a part of character set used for encoding. Rather than describe how base64 encodes 3 bytes into a series of characters, I just posted a link to the RFC which describes it. But maybe this is better:
https://en.wikipedia.org/wiki/Base64
In other words, one could just implement enough of Base64 (or use a base64 library) such that one could copy and paste the text into the system standard base64 command (or a similar utility on Windows) and out comes the binary.

I guess I'm just wondering what the advantages are, besides education and edification, of your scheme vs the Base64 standard that everyone else use. I guess this comment probably belongs back in the other thread, rather than here.
MrSwiss
Posts: 3910
Joined: Jun 02, 2013 9:27
Location: Switzerland

Re: ForumBlobPost - Utility (Ver.0.4)

Post by MrSwiss »

@caseih,
RFC 4648, section 3.4 wrote:At the bottom of the section, it states clearly:

There is no universally accepted alphabet that fulfills all the requirements.
For an example of a highly specialized variant, see: IMAP [8].
Reference: 3.4. Choosing the Alphabet, here ...
Different requirements, lead to different implementations (it's as simple, as that).
I don't want to implement anything, related to, or compliant with, the RFC 4648.

You are as free as I am, do it your way, if you insist, on RFC 4648 compliance.
leopardpm
Posts: 1795
Joined: Feb 28, 2009 20:58

Re: ForumBlobPost - Utility (Ver.0.4)

Post by leopardpm »

MrSwiss wrote:You are as free as I am, do it your way, if you insist, on RFC 4648 compliance.
I don't understand the 'need' to implement a standard (outside of all Forum Blob posts being the same standard) RFC 4648... as long as everyone in the forum has access to the encoder/decoder utility and if any other utility posted (for instance, one with a GUI or with the ability for windows users to directly access the clipboard) uses the exact same method to encode/decode... then there is no real issue... right? I get lost in these various 'standards'....

we can call our 'standard': FB-Forum ASCII (FBFA), 6-bit encoding for 8 bit data through the forum
MrSwiss
Posts: 3910
Joined: Jun 02, 2013 9:27
Location: Switzerland

Re: ForumBlobPost - Utility (Ver.0.4)

Post by MrSwiss »

leopardpm wrote:we can call our 'standard': FB-Forum ASCII (FBFA), 6-bit encoding for 8 bit data through the forum
Well, technically this isn't correct, since some of the char's used in the Alphabet,
are in effect 7 bit coded (induced by the shift, of 35).
The Alphabet: from "#" to "b", all char's in between are valid ... call it: B64SH35 ?!?
leopardpm wrote:I don't understand the 'need' to implement a standard ...
Neither do I ...
Last edited by MrSwiss on Jun 21, 2017 17:00, edited 1 time in total.
Post Reply