From 4cbc44edaf20dc07bd22296153761137b27d8eff Mon Sep 17 00:00:00 2001 From: Marius Date: Tue, 21 May 2013 17:40:23 +0300 Subject: beta 2013.05.21 16:14 --- metapost/context/base/mp-grap.mpiv | 125 ++++-- scripts/context/lua/mtxlibs.lua | 1 + scripts/context/lua/mtxrun.lua | 79 +++- scripts/context/stubs/mswin/mtxrun.lua | 79 +++- scripts/context/stubs/unix/mtxrun | 79 +++- tex/context/base/cont-new.mkiv | 2 +- tex/context/base/context-version.pdf | Bin 4127 -> 4136 bytes tex/context/base/context.mkiv | 2 +- tex/context/base/l-file.lua | 22 +- tex/context/base/l-gzip.lua | 54 +++ tex/context/base/lang-ini.lua | 6 +- tex/context/base/luat-bas.mkiv | 1 + tex/context/base/phys-dim.mkiv | 27 +- tex/context/base/s-lan-03.mkiv | 40 -- tex/context/base/s-lan-04.mkiv | 153 ------- tex/context/base/s-lan-06.mkiv | 53 --- tex/context/base/s-languages-counters.lua | 52 +++ tex/context/base/s-languages-counters.mkiv | 30 ++ tex/context/base/s-languages-frequencies.lua | 33 ++ tex/context/base/s-languages-frequencies.mkiv | 38 ++ tex/context/base/s-languages-hyphenation.lua | 135 ++++++ tex/context/base/s-languages-hyphenation.mkiv | 75 ++++ tex/context/base/scrp-ini.mkiv | 2 + tex/context/base/status-files.pdf | Bin 24732 -> 24742 bytes tex/context/base/status-lua.pdf | Bin 211790 -> 211973 bytes tex/context/base/status-mkiv.lua | 30 ++ tex/context/base/util-tab.lua | 4 +- tex/context/patterns/word-th.lua | 482 --------------------- tex/generic/context/luatex/luatex-basics-gen.lua | 6 +- tex/generic/context/luatex/luatex-fonts-merged.lua | 18 +- 30 files changed, 806 insertions(+), 822 deletions(-) create mode 100644 tex/context/base/l-gzip.lua delete mode 100644 tex/context/base/s-lan-03.mkiv delete mode 100644 tex/context/base/s-lan-04.mkiv delete mode 100644 tex/context/base/s-lan-06.mkiv create mode 100644 tex/context/base/s-languages-counters.lua create mode 100644 tex/context/base/s-languages-counters.mkiv create mode 100644 tex/context/base/s-languages-frequencies.lua create mode 100644 tex/context/base/s-languages-frequencies.mkiv create mode 100644 tex/context/base/s-languages-hyphenation.lua create mode 100644 tex/context/base/s-languages-hyphenation.mkiv delete mode 100644 tex/context/patterns/word-th.lua diff --git a/metapost/context/base/mp-grap.mpiv b/metapost/context/base/mp-grap.mpiv index 34b1bd1cc..5761931ff 100644 --- a/metapost/context/base/mp-grap.mpiv +++ b/metapost/context/base/mp-grap.mpiv @@ -67,21 +67,37 @@ fi input string.mp % Private version of a few marith macros, fixed for double math... -newinternal mzero ; mzero := -53*mlog 2 ; % Anything at least this small is treated as zero -newinternal mlogten ; mlogten := mlog(10) ; % Would this be better inline? +newinternal mlogten ; mlogten := mlog(10) ; +newinternal doubleinfinity ; doubleinfinity := 2**1024 ; +% Note that we get arithmetic overflows if we set to -doubleinfinity below. -% Safely convert a number to mlog form +% Safely convert a number to mlog form, trapping zero. vardef graph_mlog primary x = - if unknown x : whatever - elseif x=0 : mzero - else : mlog(abs x) - fi + if unknown x: whatever elseif x=0: -.5doubleinfinity else: mlog(abs x) fi +enddef ; +vardef graph_exp primary x = + if unknown x: whatever else: mexp(x) fi +enddef ; + +% and add the following for utility/completeness +% (replacing the definitions in mp-tool.mpiv). +vardef logten primary x = + if unknown x: whatever elseif x=0: -.5doubleinfinity else: mlog(abs x)/mlog(10) fi +enddef ; +vardef ln primary x = + if unknown x: whatever elseif x=0: -.5doubleinfinity else: mlog(abs x)/256 fi +enddef ; +vardef exp primary x = + if unknown x: whatever else: (mexp 256)**x fi +enddef ; +vardef powten primary x = + if unknown x: whatever else: 10**x fi enddef ; % Convert x from mlog form into a pair whose xpart gives a mantissa and whose % ypart gives a power of ten. vardef graph_Meform(expr x) = - if x<=mzero : origin + if x<=-doubleinfinity : origin else : save e, m ; e=floor(x/mlogten)-3; m := mexp(x-e*mlogten) ; if abs m<1000 : m := m*10 ; e := e-1 ; elseif abs m>=10000 : m := m/10 ; e := e+1 ; fi @@ -115,6 +131,7 @@ enddef ; % New : save graph_background ; color graph_background ; % if defined, fill the frame. +save graph_close_file ; boolean graph_close_file ; graph_close_file = false ; def begingraph(expr w, h) = begingroup @@ -169,7 +186,7 @@ enddef ; newinternal log, linear ; % coordinate system codes log :=1 ; linear :=2; -% note that mp-tool.mpiv defines log as log10... +% note that mp-tool.mpiv defines log as log10. %%%%%%%%%%%%%%%%%%%%%% Coordinates : setcoords, setrange %%%%%%%%%%%%%%%%%%%%%% @@ -435,10 +452,14 @@ enddef ; % Execute c for each line of data read from file f, and stop at the first % line with no data. Commands c can use line number i and tokens $1, $2, ... def gdata(expr f)(suffix $)(text c) = + boolean flag ; for i=1 upto infinity : exitunless graph_read_line$(f) ; c endfor + if graph_close_file : + closefrom f ; + fi enddef ; @@ -1037,44 +1058,45 @@ endfor cycle ; graph_shape[34] := graph_shape[24] rotated 45 ; -% usage : gdraw p plot plotsymbol(1,red,1) ; % a filled red circle -% usage : gdraw p plot plotsymbol(14,blue,0) ; % a blue square -% usage : gdraw p plot plotsymbol(4,green,0.5) ; % a 50% filled green diamond - -def stars(expr c, f) = plotsymbol(25,c,f) enddef ; % a 5-point star -def points(expr c, f) = plotsymbol( 0,c,f) enddef ; -def circles(expr c, f) = plotsymbol( 1,c,f) enddef ; -def crosses(expr c, f) = plotsymbol(34,c,f) enddef ; -def squares(expr c, f) = plotsymbol(14,c,f) enddef ; -def diamonds(expr c, f) = plotsymbol( 4,c,f) enddef ; % a turned square -def uptriangles(expr c, f) = plotsymbol( 3,c,f) enddef ; -def downtriangles(expr c, f) = plotsymbol(13,c,f) enddef ; -def lefttriangles(expr c, f) = plotsymbol(33,c,f) enddef ; -def righttriangles(expr c, f) = plotsymbol(23,c,f) enddef ; - -def plotsymbol(expr n,c,f) = % (number,color,color|number) +% usage : gdraw p plot plotsymbol( 1,1) ; % a filled circle +% usage : gdraw p plot plotsymbol(14,0) ; % a square +% usage : gdraw p plot plotsymbol( 4,.5) ; % a 50% filled diamond + +def stars(expr f) = plotsymbol(25,f) enddef ; % a 5-point star +def points(expr f) = plotsymbol( 0,f) enddef ; +def circles(expr f) = plotsymbol( 1,f) enddef ; +def crosses(expr f) = plotsymbol(34,f) enddef ; +def squares(expr f) = plotsymbol(14,f) enddef ; +def diamonds(expr f) = plotsymbol( 4,f) enddef ; % a turned square +def uptriangles(expr f) = plotsymbol( 3,f) enddef ; +def downtriangles(expr f) = plotsymbol(13,f) enddef ; +def lefttriangles(expr f) = plotsymbol(33,f) enddef ; +def righttriangles(expr f) = plotsymbol(23,f) enddef ; + +def plotsymbol(expr n, f) text t = if known graph_shape[n] : image( - save b ; color b ; b := - if known graph_background : graph_background else : background fi ; + save bg, fg ; color bg, fg ; + bg := if known graph_background : graph_background else : background fi ; + save pic ; picture pic ; pic := image(draw origin _op_ t ;) ; + fg := if color colorpart pic : colorpart pic else : black fi ; save p ; path p ; p = graph_shape[n] scaled graph_shapesize ; - draw p withcolor b withpen currentpen scaled 2 ; % halo + draw p withcolor bg withpen currentpen scaled 2 ; % halo if cycle p : fill p withcolor if color f and known f : f - elseif numeric f and known f and color c and known c : - f[b,c] elseif numeric f and known f : - f[b,black] + f[bg,fg] else : - b + bg fi ; fi - draw p if color c and known c : withcolor c fi ; + draw p withpen currentpen _op_ t ; ) else : nullpicture fi + t enddef ; % standard resistance color code: rainbow sequence (from /usr/share/X11/rgb.txt) @@ -1090,6 +1112,16 @@ resistance_color7 = (148/255,0,211/255) ; resistance_name7 = "darkviolet" resistance_color8 = (190/255,190/255,190/255) ; resistance_name8 = "gray" ; resistance_color9 = (1,1,1) ; resistance_name9 = "white" ; +%def rainbow(expr f) = +% ((abs(5f) mod 5) + 2 - floor((abs(5f) mod 5) + 2)) +% [resistance_color[ floor((abs(5f) mod 5) + 2)], +% resistance_color[ceiling((abs(5f) mod 5) + 2)]] +%enddef ; +def rainbow(expr f) = + hide(numeric n_ ; n_ = (abs(5f) mod 5) + 2 ;) + (n_-floor(n_))[resistance_color[floor n_],resistance_color[ceiling n_]] +enddef ; + % The following extensions are not specific to graph and could be moved to metafun... % sort a path. Efficient en memory use, not so efficient in sorting long paths... @@ -1128,10 +1160,10 @@ def smoothpath (suffix $) = fi enddef ; -% return a path of a function func(x) with abcissa running from f to t over n intervals +% return a path of a function func(x) with abscissa running from f to t over n intervals def makefunctionpath (expr f, t, n) (text func) = - (for x=f step ((t-f)/n) until t : + (for x=f step ((t-f)/(abs n)) until t : if x<>f : .. fi (x, func) endfor ) @@ -1141,24 +1173,23 @@ enddef ; % % example : % -% p1 := addnoisetopath(p0,(.1normaldeviate,.1normaldeviate)) ; +% p1 := addtopath(p0,(.1normaldeviate,.1normaldeviate)) ; -vardef addnoisetopath (suffix p) (text t) = +vardef addtopath (suffix p) (text t) = if path p : - hide(pair p_i) (for i=0 upto length p : if i>0 : -- fi - hide(p_i := point i of p ; x := xpart p_i; y := ypart p_i)z shifted t + hide(clearxy ; z = point i of p ;) z shifted t endfor) fi enddef ; -% return a new path of a function func(x) using the same abcissa as an existing path +% return a new path of a function func(z) using the same abscissa as an existing path -vardef functionpath (suffix p) (text t) = +vardef functionpath (suffix p) (text func) = (for i=0 upto length p : if i>0 : .. fi - (hide(x := xpart(point i of p))x,t) + (hide(x := xpart(point i of p))x,func) %(hide(clearxy ; z = point i of p)x,func) endfor ) enddef ; @@ -1169,9 +1200,9 @@ enddef ; % path p[] ; % numeric a[] ; a0 := 1 ; a1 := .1 ; a2 := .01 ; a3 := .001 ; a4 := 0.0001 ; % p0 := makefunctionpath(0,5,10,polynomial_function(a,4,x)) ; -% p1 := addnoisetopath(p0,(0,.001normaldeviate)) ; +% p1 := addtopath(p0,(0,.001normaldeviate)) ; % gdraw p0 ; -% gdraw p1 plot plotsymbol(1,black,.5) ; +% gdraw p1 plot plotsymbol(1,.5) ; % % numeric b[] ; % polynomial_fit(p1, b, 4, 1) ; @@ -1298,7 +1329,7 @@ vardef polynomial_fit (suffix p, $) (expr n) (text t) = endfor endfor % normalize by the number of degrees of freedom - fit_chi_squared := fit_chi_squared / (length(p) - n) ; + fit_chi_squared := fit_chi_squared / (length(p) - n) ; % length(p)+1-(n+1) fi fi enddef ; @@ -1342,11 +1373,11 @@ enddef ; vardef power_law_function (suffix $) (expr x) = $1*(x**$0) enddef ; -% since we take logs, this only works for positive abcissae and ordinates +% since we take logs, this only works for positive abscissae and ordinates vardef power_law_fit (suffix p, $) (text t) = save a ; numeric a[] ; - save q ; path q ; % fit to the logs of the abcissae and ordinates + save q ; path q ; % fit to the logs of the abscissae and ordinates for i=0 upto length p : if (xpart(point i of p)>0) and (ypart(point i of p)>0) : augment.q(ln(xpart(point i of p)),ln(ypart(point i of p))) ; diff --git a/scripts/context/lua/mtxlibs.lua b/scripts/context/lua/mtxlibs.lua index a34ba139a..7f52ac8bd 100644 --- a/scripts/context/lua/mtxlibs.lua +++ b/scripts/context/lua/mtxlibs.lua @@ -78,6 +78,7 @@ local ownlibs = { "l-set.lua", "l-os.lua", "l-file.lua", -- limited functionality when no lfs + -- "l-gzip.lua", "l-md5.lua", -- not loaded when no md5 library "l-url.lua", "l-dir.lua", -- limited functionality when no lfs diff --git a/scripts/context/lua/mtxrun.lua b/scripts/context/lua/mtxrun.lua index 422946ceb..c1d345ef2 100644 --- a/scripts/context/lua/mtxrun.lua +++ b/scripts/context/lua/mtxrun.lua @@ -2843,7 +2843,7 @@ do -- create closure to overcome 200 locals limit package.loaded["l-file"] = package.loaded["l-file"] or true --- original size: 17375, stripped down to: 9486 +-- original size: 17682, stripped down to: 9745 if not modules then modules={} end modules ['l-file']={ version=1.001, @@ -2918,11 +2918,21 @@ local pattern=(noslashes^0*slashes)^0*(noperiod^1*period)^1*C(noperiod^1)*-1 local function suffixonly(name) return name and lpegmatch(pattern,name) or "" end +local pattern=(noslashes^0*slashes)^0*noperiod^1*((period*C(noperiod^1))^1)*-1+Cc("") +local function suffixesonly(name) + if name then + return lpegmatch(pattern,name) + else + return "" + end +end file.pathpart=pathpart file.basename=basename file.nameonly=nameonly file.suffixonly=suffixonly file.suffix=suffixonly +file.suffixesonly=suffixesonly +file.suffixes=suffixesonly file.dirname=pathpart file.extname=suffixonly local drive=C(R("az","AZ"))*colon @@ -3215,6 +3225,60 @@ function lfs.mkdirs(path) end +end -- of closure + +do -- create closure to overcome 200 locals limit + +package.loaded["l-gzip"] = package.loaded["l-gzip"] or true + +-- original size: 1211, stripped down to: 1002 + +if not modules then modules={} end modules ['l-gzip']={ + version=1.001, + author="Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright="PRAGMA ADE / ConTeXt Development Team", + license="see context related readme files" +} +if not gzip then + return +end +local suffix,suffixes=file.suffix,file.suffixes +function gzip.load(filename) + local f=io.open(filename,"rb") + if not f then + elseif suffix(filename)=="gz" then + f:close() + local g=gzip.open(filename,"rb") + if g then + local str=g:read("*all") + g:close() + return str + end + else + local str=f:read("*all") + f:close() + return str + end +end +function gzip.save(filename,data) + if suffix(filename)~="gz" then + filename=filename..".gz" + end + local f=io.open(filename,"wb") + if f then + local s=zlib.compress(data or "",9,nil,15+16) + f:write(s) + f:close() + return #s + end +end +function gzip.suffix(filename) + local suffix,extra=suffixes(filename) + local gzipped=extra=="gz" + return suffix,gzipped +end + + end -- of closure do -- create closure to overcome 200 locals limit @@ -4967,7 +5031,7 @@ do -- create closure to overcome 200 locals limit package.loaded["util-tab"] = package.loaded["util-tab"] or true --- original size: 14491, stripped down to: 8512 +-- original size: 14510, stripped down to: 8531 if not modules then modules={} end modules ['util-tab']={ version=1.001, @@ -5245,9 +5309,9 @@ function table.deserialize(str) end return code end -function table.load(filename) +function table.load(filename,loader) if filename then - local t=io.loaddata(filename) + local t=(loader or io.loaddata)(filename) if t and t~="" then t=load(t) if type(t)=="function" then @@ -16037,10 +16101,10 @@ end end -- of closure --- used libraries : l-lua.lua l-package.lua l-lpeg.lua l-function.lua l-string.lua l-table.lua l-io.lua l-number.lua l-set.lua l-os.lua l-file.lua l-md5.lua l-url.lua l-dir.lua l-boolean.lua l-unicode.lua l-math.lua util-str.lua util-tab.lua util-sto.lua util-prs.lua util-fmt.lua trac-set.lua trac-log.lua trac-inf.lua trac-pro.lua util-lua.lua util-deb.lua util-mrg.lua util-tpl.lua util-env.lua luat-env.lua lxml-tab.lua lxml-lpt.lua lxml-mis.lua lxml-aux.lua lxml-xml.lua trac-xml.lua data-ini.lua data-exp.lua data-env.lua data-tmp.lua data-met.lua data-res.lua data-pre.lua data-inp.lua data-out.lua data-fil.lua data-con.lua data-use.lua data-zip.lua data-tre.lua data-sch.lua data-lua.lua data-aux.lua data-tmf.lua data-lst.lua util-lib.lua luat-sta.lua luat-fmt.lua +-- used libraries : l-lua.lua l-package.lua l-lpeg.lua l-function.lua l-string.lua l-table.lua l-io.lua l-number.lua l-set.lua l-os.lua l-file.lua l-gzip.lua l-md5.lua l-url.lua l-dir.lua l-boolean.lua l-unicode.lua l-math.lua util-str.lua util-tab.lua util-sto.lua util-prs.lua util-fmt.lua trac-set.lua trac-log.lua trac-inf.lua trac-pro.lua util-lua.lua util-deb.lua util-mrg.lua util-tpl.lua util-env.lua luat-env.lua lxml-tab.lua lxml-lpt.lua lxml-mis.lua lxml-aux.lua lxml-xml.lua trac-xml.lua data-ini.lua data-exp.lua data-env.lua data-tmp.lua data-met.lua data-res.lua data-pre.lua data-inp.lua data-out.lua data-fil.lua data-con.lua data-use.lua data-zip.lua data-tre.lua data-sch.lua data-lua.lua data-aux.lua data-tmf.lua data-lst.lua util-lib.lua luat-sta.lua luat-fmt.lua -- skipped libraries : - --- original bytes : 668507 --- stripped bytes : 244711 +-- original bytes : 670044 +-- stripped bytes : 244968 -- end library merge @@ -16074,6 +16138,7 @@ local ownlibs = { -- order can be made better 'l-set.lua', 'l-os.lua', 'l-file.lua', + 'l-gzip.lua', 'l-md5.lua', 'l-url.lua', 'l-dir.lua', diff --git a/scripts/context/stubs/mswin/mtxrun.lua b/scripts/context/stubs/mswin/mtxrun.lua index 422946ceb..c1d345ef2 100644 --- a/scripts/context/stubs/mswin/mtxrun.lua +++ b/scripts/context/stubs/mswin/mtxrun.lua @@ -2843,7 +2843,7 @@ do -- create closure to overcome 200 locals limit package.loaded["l-file"] = package.loaded["l-file"] or true --- original size: 17375, stripped down to: 9486 +-- original size: 17682, stripped down to: 9745 if not modules then modules={} end modules ['l-file']={ version=1.001, @@ -2918,11 +2918,21 @@ local pattern=(noslashes^0*slashes)^0*(noperiod^1*period)^1*C(noperiod^1)*-1 local function suffixonly(name) return name and lpegmatch(pattern,name) or "" end +local pattern=(noslashes^0*slashes)^0*noperiod^1*((period*C(noperiod^1))^1)*-1+Cc("") +local function suffixesonly(name) + if name then + return lpegmatch(pattern,name) + else + return "" + end +end file.pathpart=pathpart file.basename=basename file.nameonly=nameonly file.suffixonly=suffixonly file.suffix=suffixonly +file.suffixesonly=suffixesonly +file.suffixes=suffixesonly file.dirname=pathpart file.extname=suffixonly local drive=C(R("az","AZ"))*colon @@ -3215,6 +3225,60 @@ function lfs.mkdirs(path) end +end -- of closure + +do -- create closure to overcome 200 locals limit + +package.loaded["l-gzip"] = package.loaded["l-gzip"] or true + +-- original size: 1211, stripped down to: 1002 + +if not modules then modules={} end modules ['l-gzip']={ + version=1.001, + author="Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright="PRAGMA ADE / ConTeXt Development Team", + license="see context related readme files" +} +if not gzip then + return +end +local suffix,suffixes=file.suffix,file.suffixes +function gzip.load(filename) + local f=io.open(filename,"rb") + if not f then + elseif suffix(filename)=="gz" then + f:close() + local g=gzip.open(filename,"rb") + if g then + local str=g:read("*all") + g:close() + return str + end + else + local str=f:read("*all") + f:close() + return str + end +end +function gzip.save(filename,data) + if suffix(filename)~="gz" then + filename=filename..".gz" + end + local f=io.open(filename,"wb") + if f then + local s=zlib.compress(data or "",9,nil,15+16) + f:write(s) + f:close() + return #s + end +end +function gzip.suffix(filename) + local suffix,extra=suffixes(filename) + local gzipped=extra=="gz" + return suffix,gzipped +end + + end -- of closure do -- create closure to overcome 200 locals limit @@ -4967,7 +5031,7 @@ do -- create closure to overcome 200 locals limit package.loaded["util-tab"] = package.loaded["util-tab"] or true --- original size: 14491, stripped down to: 8512 +-- original size: 14510, stripped down to: 8531 if not modules then modules={} end modules ['util-tab']={ version=1.001, @@ -5245,9 +5309,9 @@ function table.deserialize(str) end return code end -function table.load(filename) +function table.load(filename,loader) if filename then - local t=io.loaddata(filename) + local t=(loader or io.loaddata)(filename) if t and t~="" then t=load(t) if type(t)=="function" then @@ -16037,10 +16101,10 @@ end end -- of closure --- used libraries : l-lua.lua l-package.lua l-lpeg.lua l-function.lua l-string.lua l-table.lua l-io.lua l-number.lua l-set.lua l-os.lua l-file.lua l-md5.lua l-url.lua l-dir.lua l-boolean.lua l-unicode.lua l-math.lua util-str.lua util-tab.lua util-sto.lua util-prs.lua util-fmt.lua trac-set.lua trac-log.lua trac-inf.lua trac-pro.lua util-lua.lua util-deb.lua util-mrg.lua util-tpl.lua util-env.lua luat-env.lua lxml-tab.lua lxml-lpt.lua lxml-mis.lua lxml-aux.lua lxml-xml.lua trac-xml.lua data-ini.lua data-exp.lua data-env.lua data-tmp.lua data-met.lua data-res.lua data-pre.lua data-inp.lua data-out.lua data-fil.lua data-con.lua data-use.lua data-zip.lua data-tre.lua data-sch.lua data-lua.lua data-aux.lua data-tmf.lua data-lst.lua util-lib.lua luat-sta.lua luat-fmt.lua +-- used libraries : l-lua.lua l-package.lua l-lpeg.lua l-function.lua l-string.lua l-table.lua l-io.lua l-number.lua l-set.lua l-os.lua l-file.lua l-gzip.lua l-md5.lua l-url.lua l-dir.lua l-boolean.lua l-unicode.lua l-math.lua util-str.lua util-tab.lua util-sto.lua util-prs.lua util-fmt.lua trac-set.lua trac-log.lua trac-inf.lua trac-pro.lua util-lua.lua util-deb.lua util-mrg.lua util-tpl.lua util-env.lua luat-env.lua lxml-tab.lua lxml-lpt.lua lxml-mis.lua lxml-aux.lua lxml-xml.lua trac-xml.lua data-ini.lua data-exp.lua data-env.lua data-tmp.lua data-met.lua data-res.lua data-pre.lua data-inp.lua data-out.lua data-fil.lua data-con.lua data-use.lua data-zip.lua data-tre.lua data-sch.lua data-lua.lua data-aux.lua data-tmf.lua data-lst.lua util-lib.lua luat-sta.lua luat-fmt.lua -- skipped libraries : - --- original bytes : 668507 --- stripped bytes : 244711 +-- original bytes : 670044 +-- stripped bytes : 244968 -- end library merge @@ -16074,6 +16138,7 @@ local ownlibs = { -- order can be made better 'l-set.lua', 'l-os.lua', 'l-file.lua', + 'l-gzip.lua', 'l-md5.lua', 'l-url.lua', 'l-dir.lua', diff --git a/scripts/context/stubs/unix/mtxrun b/scripts/context/stubs/unix/mtxrun index 422946ceb..c1d345ef2 100644 --- a/scripts/context/stubs/unix/mtxrun +++ b/scripts/context/stubs/unix/mtxrun @@ -2843,7 +2843,7 @@ do -- create closure to overcome 200 locals limit package.loaded["l-file"] = package.loaded["l-file"] or true --- original size: 17375, stripped down to: 9486 +-- original size: 17682, stripped down to: 9745 if not modules then modules={} end modules ['l-file']={ version=1.001, @@ -2918,11 +2918,21 @@ local pattern=(noslashes^0*slashes)^0*(noperiod^1*period)^1*C(noperiod^1)*-1 local function suffixonly(name) return name and lpegmatch(pattern,name) or "" end +local pattern=(noslashes^0*slashes)^0*noperiod^1*((period*C(noperiod^1))^1)*-1+Cc("") +local function suffixesonly(name) + if name then + return lpegmatch(pattern,name) + else + return "" + end +end file.pathpart=pathpart file.basename=basename file.nameonly=nameonly file.suffixonly=suffixonly file.suffix=suffixonly +file.suffixesonly=suffixesonly +file.suffixes=suffixesonly file.dirname=pathpart file.extname=suffixonly local drive=C(R("az","AZ"))*colon @@ -3215,6 +3225,60 @@ function lfs.mkdirs(path) end +end -- of closure + +do -- create closure to overcome 200 locals limit + +package.loaded["l-gzip"] = package.loaded["l-gzip"] or true + +-- original size: 1211, stripped down to: 1002 + +if not modules then modules={} end modules ['l-gzip']={ + version=1.001, + author="Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright="PRAGMA ADE / ConTeXt Development Team", + license="see context related readme files" +} +if not gzip then + return +end +local suffix,suffixes=file.suffix,file.suffixes +function gzip.load(filename) + local f=io.open(filename,"rb") + if not f then + elseif suffix(filename)=="gz" then + f:close() + local g=gzip.open(filename,"rb") + if g then + local str=g:read("*all") + g:close() + return str + end + else + local str=f:read("*all") + f:close() + return str + end +end +function gzip.save(filename,data) + if suffix(filename)~="gz" then + filename=filename..".gz" + end + local f=io.open(filename,"wb") + if f then + local s=zlib.compress(data or "",9,nil,15+16) + f:write(s) + f:close() + return #s + end +end +function gzip.suffix(filename) + local suffix,extra=suffixes(filename) + local gzipped=extra=="gz" + return suffix,gzipped +end + + end -- of closure do -- create closure to overcome 200 locals limit @@ -4967,7 +5031,7 @@ do -- create closure to overcome 200 locals limit package.loaded["util-tab"] = package.loaded["util-tab"] or true --- original size: 14491, stripped down to: 8512 +-- original size: 14510, stripped down to: 8531 if not modules then modules={} end modules ['util-tab']={ version=1.001, @@ -5245,9 +5309,9 @@ function table.deserialize(str) end return code end -function table.load(filename) +function table.load(filename,loader) if filename then - local t=io.loaddata(filename) + local t=(loader or io.loaddata)(filename) if t and t~="" then t=load(t) if type(t)=="function" then @@ -16037,10 +16101,10 @@ end end -- of closure --- used libraries : l-lua.lua l-package.lua l-lpeg.lua l-function.lua l-string.lua l-table.lua l-io.lua l-number.lua l-set.lua l-os.lua l-file.lua l-md5.lua l-url.lua l-dir.lua l-boolean.lua l-unicode.lua l-math.lua util-str.lua util-tab.lua util-sto.lua util-prs.lua util-fmt.lua trac-set.lua trac-log.lua trac-inf.lua trac-pro.lua util-lua.lua util-deb.lua util-mrg.lua util-tpl.lua util-env.lua luat-env.lua lxml-tab.lua lxml-lpt.lua lxml-mis.lua lxml-aux.lua lxml-xml.lua trac-xml.lua data-ini.lua data-exp.lua data-env.lua data-tmp.lua data-met.lua data-res.lua data-pre.lua data-inp.lua data-out.lua data-fil.lua data-con.lua data-use.lua data-zip.lua data-tre.lua data-sch.lua data-lua.lua data-aux.lua data-tmf.lua data-lst.lua util-lib.lua luat-sta.lua luat-fmt.lua +-- used libraries : l-lua.lua l-package.lua l-lpeg.lua l-function.lua l-string.lua l-table.lua l-io.lua l-number.lua l-set.lua l-os.lua l-file.lua l-gzip.lua l-md5.lua l-url.lua l-dir.lua l-boolean.lua l-unicode.lua l-math.lua util-str.lua util-tab.lua util-sto.lua util-prs.lua util-fmt.lua trac-set.lua trac-log.lua trac-inf.lua trac-pro.lua util-lua.lua util-deb.lua util-mrg.lua util-tpl.lua util-env.lua luat-env.lua lxml-tab.lua lxml-lpt.lua lxml-mis.lua lxml-aux.lua lxml-xml.lua trac-xml.lua data-ini.lua data-exp.lua data-env.lua data-tmp.lua data-met.lua data-res.lua data-pre.lua data-inp.lua data-out.lua data-fil.lua data-con.lua data-use.lua data-zip.lua data-tre.lua data-sch.lua data-lua.lua data-aux.lua data-tmf.lua data-lst.lua util-lib.lua luat-sta.lua luat-fmt.lua -- skipped libraries : - --- original bytes : 668507 --- stripped bytes : 244711 +-- original bytes : 670044 +-- stripped bytes : 244968 -- end library merge @@ -16074,6 +16138,7 @@ local ownlibs = { -- order can be made better 'l-set.lua', 'l-os.lua', 'l-file.lua', + 'l-gzip.lua', 'l-md5.lua', 'l-url.lua', 'l-dir.lua', diff --git a/tex/context/base/cont-new.mkiv b/tex/context/base/cont-new.mkiv index ecf92987c..ca982e6c5 100644 --- a/tex/context/base/cont-new.mkiv +++ b/tex/context/base/cont-new.mkiv @@ -11,7 +11,7 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. -\newcontextversion{2013.05.20 02:00} +\newcontextversion{2013.05.21 16:14} %D This file is loaded at runtime, thereby providing an excellent place for %D hacks, patches, extensions and new features. diff --git a/tex/context/base/context-version.pdf b/tex/context/base/context-version.pdf index 87a6493a9..37755f842 100644 Binary files a/tex/context/base/context-version.pdf and b/tex/context/base/context-version.pdf differ diff --git a/tex/context/base/context.mkiv b/tex/context/base/context.mkiv index 1ec2a4366..34f457df9 100644 --- a/tex/context/base/context.mkiv +++ b/tex/context/base/context.mkiv @@ -25,7 +25,7 @@ %D up and the dependencies are more consistent. \edef\contextformat {\jobname} -\edef\contextversion{2013.05.20 02:00} +\edef\contextversion{2013.05.21 16:14} \edef\contextkind {beta} %D For those who want to use this: diff --git a/tex/context/base/l-file.lua b/tex/context/base/l-file.lua index f25490749..deaaca735 100644 --- a/tex/context/base/l-file.lua +++ b/tex/context/base/l-file.lua @@ -115,11 +115,23 @@ local function suffixonly(name) return name and lpegmatch(pattern,name) or "" end -file.pathpart = pathpart -file.basename = basename -file.nameonly = nameonly -file.suffixonly = suffixonly -file.suffix = suffixonly +local pattern = (noslashes^0 * slashes)^0 * noperiod^1 * ((period * C(noperiod^1))^1) * -1 + Cc("") + +local function suffixesonly(name) + if name then + return lpegmatch(pattern,name) + else + return "" + end +end + +file.pathpart = pathpart +file.basename = basename +file.nameonly = nameonly +file.suffixonly = suffixonly +file.suffix = suffixonly +file.suffixesonly = suffixesonly +file.suffixes = suffixesonly file.dirname = pathpart -- obsolete file.extname = suffixonly -- obsolete diff --git a/tex/context/base/l-gzip.lua b/tex/context/base/l-gzip.lua new file mode 100644 index 000000000..5100e4722 --- /dev/null +++ b/tex/context/base/l-gzip.lua @@ -0,0 +1,54 @@ +if not modules then modules = { } end modules ['l-gzip'] = { + version = 1.001, + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +if not gzip then + + -- no fallback yet + + return + +end + +local suffix, suffixes = file.suffix, file.suffixes + +function gzip.load(filename) + local f = io.open(filename,"rb") + if not f then + -- invalid file + elseif suffix(filename) == "gz" then + f:close() + local g = gzip.open(filename,"rb") + if g then + local str = g:read("*all") + g:close() + return str + end + else + local str = f:read("*all") + f:close() + return str + end +end + +function gzip.save(filename,data) + if suffix(filename) ~= "gz" then + filename = filename .. ".gz" + end + local f = io.open(filename,"wb") + if f then + local s = zlib.compress(data or "",9,nil,15+16) + f:write(s) + f:close() + return #s + end +end + +function gzip.suffix(filename) + local suffix, extra = suffixes(filename) + local gzipped = extra == "gz" + return suffix, gzipped +end diff --git a/tex/context/base/lang-ini.lua b/tex/context/base/lang-ini.lua index b79bd0661..642213253 100644 --- a/tex/context/base/lang-ini.lua +++ b/tex/context/base/lang-ini.lua @@ -130,11 +130,15 @@ local function loaddefinitions(tag,specification) dataused[definition] = definition local filename = "lang-" .. definition .. ".lua" local fullname = resolvers.findfile(filename) or "" + if fullname == "" then + fullname = resolvers.findfile(filename .. ".gz") or "" + end if fullname ~= "" then if trace_patterns then report_initialization("loading definition %a for language %a from %a",definition,tag,fullname) end - local defs = dofile(fullname) -- use regular loader instead + local suffix, gzipped = gzip.suffix(fullname) + local defs = table.load(fullname,gzipped and gzip.load) if defs then -- todo: version test ok, nofloaded = true, nofloaded + 1 -- instance:patterns (defs.patterns and defs.patterns .data or "") diff --git a/tex/context/base/luat-bas.mkiv b/tex/context/base/luat-bas.mkiv index ddf901424..a38912716 100644 --- a/tex/context/base/luat-bas.mkiv +++ b/tex/context/base/luat-bas.mkiv @@ -26,6 +26,7 @@ \registerctxluafile{l-io} {1.001} \registerctxluafile{l-os} {1.001} \registerctxluafile{l-file} {1.001} +\registerctxluafile{l-gzip} {1.001} \registerctxluafile{l-md5} {1.001} \registerctxluafile{l-dir} {1.001} \registerctxluafile{l-unicode} {1.001} diff --git a/tex/context/base/phys-dim.mkiv b/tex/context/base/phys-dim.mkiv index 73cc2ea25..fe0f3f3b9 100644 --- a/tex/context/base/phys-dim.mkiv +++ b/tex/context/base/phys-dim.mkiv @@ -518,15 +518,24 @@ ″\else\phys_units_text_doubleprime\fi\else\phys_units_text_doubleprime \fi} -\unexpanded\def\checkedtextcelsius - {\iffontchar\font"2103\relax - ℃\else\phys_units_text_celsius - \fi} - -\unexpanded\def\checkedtextfahrenheit - {\iffontchar\font"2109\relax - ℉\else\phys_units_text_fahrenheit - \fi} +% \unexpanded\def\checkedtextcelsius +% {\ifmmode +% \phys_units_text_celsius +% \else\iffontchar\font"2103\relax +% ℃\else\phys_units_text_celsius +% \fi\fi} +% +% \unexpanded\def\checkedtextfahrenheit +% {\ifmmode +% \phys_units_text_fahrenheit +% \else\iffontchar\font"2109\relax +% ℉\else\phys_units_text_fahrenheit +% \fi\fi} +% +% % but, as users don't like this ... + +\let\checkedtextcelsius \phys_units_text_celsius +\let\checkedtextfahrenheit\phys_units_text_fahrenheit \setelementnature[unit] [mixed] \setelementnature[quantity][mixed] diff --git a/tex/context/base/s-lan-03.mkiv b/tex/context/base/s-lan-03.mkiv deleted file mode 100644 index 6b46a49b1..000000000 --- a/tex/context/base/s-lan-03.mkiv +++ /dev/null @@ -1,40 +0,0 @@ -%D \module -%D [ file=s-lan-03, -%D version=2010.10.21, -%D title=\CONTEXT\ Style File, -%D subtitle=Language Environment 3, -%D author=Hans Hagen, -%D date=\currentdate, -%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] -%C -%C This module is part of the \CONTEXT\ macro||package and is -%C therefore copyrighted by \PRAGMA. See mreadme.pdf for -%C details. - -\startluacode -languages.words.tracers = languages.words.tracers or { } - -function languages.words.tracers.showwords(filename) - filename = filename or file.addsuffix(tex.jobname,"words") - if lfs.isfile(filename) then - local w = dofile(filename) - if w then - -- table.print(w) - for cname, category in table.sortedpairs(w.categories) do - for lname, language in table.sortedpairs(category.languages) do - context.bold(string.format("category: %s, language: %s, total: %s, unique: %s:", - cname, lname, language.total or 0, language.unique or 0) - ) - for word, n in table.sortedpairs(language.list) do - context(" %s (%s)",word,n) - end - context.par() - end - end - end - end -end -\stopluacode - -\ctxlua{languages.words.tracers.showwords("words-003.words")} - diff --git a/tex/context/base/s-lan-04.mkiv b/tex/context/base/s-lan-04.mkiv deleted file mode 100644 index c04be9466..000000000 --- a/tex/context/base/s-lan-04.mkiv +++ /dev/null @@ -1,153 +0,0 @@ -%D \module -%D [ file=s-lan-04, -%D version=2011.05.01, -%D title=\CONTEXT\ Style File, -%D subtitle=Language Environment 4, -%D author=Hans Hagen, -%D date=\currentdate, -%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] -%C -%C This module is part of the \CONTEXT\ macro||package and is -%C therefore copyrighted by \PRAGMA. See mreadme.pdf for -%C details. - -%D For Mojca. - -\startluacode - local a_colormodel = attributes.private('colormodel') - - local nodecodes = nodes.nodecodes - local nodepool = nodes.pool - local disc = nodecodes.disc - local glyph = nodecodes.glyph - local quads = fonts.hashes.quads - local newkern = nodepool.kern - local newrule = nodepool.rule - local newglue = nodepool.glue - - local get_attribute = node.has_attribute - - local tracers = nodes.tracers - local colortracers = tracers and tracers.colors - local setnodecolor = colortracers.set - - local function identify(head,marked) - local current, prev = head, nil - while current do - local id = current.id - local next = current.next - if id == disc then - if prev and next.id == glyph then -- catch other usage of disc - marked[#marked+1] = prev - end - elseif id == glyph then - prev = current - end - current = next - end - end - - local function strip(head,marked) - for i=1,#marked do - local prev = marked[i] - nodes.remove(head,prev.next,true) - end - end - - local function mark(head,marked,what,how) - for i=1,#marked do - local prev = marked[i] - local font = prev.font - local quad = quads[font] - head, prev = node.insert_after(head,prev,newkern(-quad/40)) - if what then - local rule = newrule(quad/20,.75*quad,0) - head, prev = node.insert_after(head,prev,rule) - setnodecolor(rule,how,get_attribute(prev,a_colormodel)) - else - local rule = newrule(quad/20,0,.5*quad) - head, prev = node.insert_after(head,prev,rule) - setnodecolor(rule,how,get_attribute(prev,a_colormodel)) - end - head, prev = node.insert_after(head,prev,newkern(-quad/40)) - head, prev = node.insert_after(head,prev,newglue(0)) - end - end - - local language_one, language_two, tag_one, tag_two - - function nodes.showhyphens(head) - local marked_1, marked_2 = { }, { } - if language_one then - for n in node.traverse_id(glyph,head) do - n.lang = language_one - end - lang.hyphenate(head,node.slide(head)) - identify(head,marked_1) - strip(head,marked_1) - end - if language_two then - for n in node.traverse_id(glyph,head) do - n.lang = language_two - end - lang.hyphenate(head,node.slide(head)) - identify(head,marked_2) - strip(head,marked_2) - end - if tag_one then - mark(head,marked_1,true,"hyphenation:"..tag_one) - end - if tag_two then - mark(head,marked_2,false,"hyphenation:"..tag_two) - end - return head, true - end - - function languages.startcomparepatterns(list) - local list = utilities.parsers.settings_to_array(list) - tag_one = list[1] - tag_two = list[2] - language_one = tag_one and languages.getnumber(tag_one) - language_two = tag_two and languages.getnumber(tag_two) - -- nodes.tasks.appendaction("processors","words","nodes.showhyphens") - nodes.tasks.appendaction("processors","before","nodes.showhyphens") - nodes.tasks.enableaction("processors","nodes.showhyphens") - end - - function languages.stopcomparepatterns() - nodes.tasks.disableaction("processors","nodes.showhyphens") - end - -\stopluacode - -\unprotect - -\def\startcomparepatterns[#1]% - {\bgroup - \language\zerocount - \setupalign[\v!nothyphenated]% - \ctxlua{languages.startcomparepatterns("#1")}} - -\def\stopcomparepatterns - {\ctxlua{languages.stopcomparepatterns()}% - \egroup} - -\protect - -\definecolor[hyphenation:en] [r=.8] -\definecolor[hyphenation:de] [g=.8] -\definecolor[hyphenation:nl] [b=.8] - -\continueifinputfile{s-lan-04.mkiv} - -\starttext - - \startcomparepatterns[en,de] - \input tufte\par - \stopcomparepatterns - - \startcomparepatterns[de,nl] - \input tufte\par - \stopcomparepatterns - -\stoptext diff --git a/tex/context/base/s-lan-06.mkiv b/tex/context/base/s-lan-06.mkiv deleted file mode 100644 index 43d59a2d1..000000000 --- a/tex/context/base/s-lan-06.mkiv +++ /dev/null @@ -1,53 +0,0 @@ -%D \module -%D [ file=s-lan-06, -%D version=2013.03.22, -%D title=\CONTEXT\ Style File, -%D subtitle=Language Environment 6, -%D author=Hans Hagen, -%D date=\currentdate, -%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] -%C -%C This module is part of the \CONTEXT\ macro||package and is -%C therefore copyrighted by \PRAGMA. See mreadme.pdf for -%C details. - -\startluacode - -languages.tracers = languages.tracers or { } - -function languages.tracers.showfrequencies(language) - local t = languages.frequencies.getdata(language or "en") - context.starttabulate { "|lT|cw(2em)|r|" } - context.NC() - context.formatted.rlap("%s: %p",t.language,languages.frequencies.averagecharwidth(t.language)) - context.NC() - context.NC() - context.NR() - context.HL() - for k, v in table.sortedhash(t.frequencies) do - context.NC() - context("%U",k) - context.NC() - context("%c",k) - context.NC() - context("%0.3f",v) - context.NC() - context.NR() - end - context.stoptabulate() -end - -\stopluacode - -\unexpanded\def\ShowLanguageFrequencies#1% - {\ctxlua{languages.tracers.showfrequencies("#1")}} - -\continueifinputfile{s-lan-06.mkiv} - -\starttext - - \hsize65\averagecharwidth \input ward \par - - \ShowLanguageFrequencies\currentmainlanguage - -\stoptext diff --git a/tex/context/base/s-languages-counters.lua b/tex/context/base/s-languages-counters.lua new file mode 100644 index 000000000..436e64a64 --- /dev/null +++ b/tex/context/base/s-languages-counters.lua @@ -0,0 +1,52 @@ +if not modules then modules = { } end modules ['s-languages-counters'] = { + version = 1.001, + comment = "companion to s-languages-counters.mkiv", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +moduledata.languages = moduledata.languages or { } +moduledata.languages.counters = moduledata.languages.counters or { } + +local data = converters.verbose.data + +function moduledata.languages.counters.showverbose(specification) + specification = interfaces.checkedspecification(specification) + local list = utilities.parsers.settings_to_array(specification.language or "") + if #list == 0then + return + end + local used = { } + local words = { } + for i=1,#list do + local ai = list[i] + local di = data[ai] + if di and di.words then + used[#used+1] = ai + table.merge(words,di.words) + end + end + context.starttabulate { string.rep("|l",#used) .. "|r|" } + context.HL() + context.NC() + for i=1,#used do + context.bold(used[i]) + context.NC() + end + context.bold("number") + context.NC() + context.NR() + context.HL() + for k, v in table.sortedhash(words) do + context.NC() + for i=1,#used do + context(data[used[i]].words[k] or "") + context.NC() + end + context(k) + context.NC() + context.NR() + end + context.stoptabulate() +end diff --git a/tex/context/base/s-languages-counters.mkiv b/tex/context/base/s-languages-counters.mkiv new file mode 100644 index 000000000..fa938d65a --- /dev/null +++ b/tex/context/base/s-languages-counters.mkiv @@ -0,0 +1,30 @@ +%D \module +%D [ file=s-languages-counters, % s-lan-05, +%D version=2011.05.01, % older +%D title=\CONTEXT\ Style File, +%D subtitle=Language Counters, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\startmodule[languages-counters] + +\registerctxluafile{s-languages-counters}{} + +\installmodulecommandluasingle \showverbosecounters {moduledata.languages.counters.showverbose} + +\stopmodule + +\continueifinputfile{s-languages-counters.mkiv} + +\usemodule[art-01] + +\starttext + + \showverbosecounters[language={en,es}] + +\stoptext diff --git a/tex/context/base/s-languages-frequencies.lua b/tex/context/base/s-languages-frequencies.lua new file mode 100644 index 000000000..16213a412 --- /dev/null +++ b/tex/context/base/s-languages-frequencies.lua @@ -0,0 +1,33 @@ +if not modules then modules = { } end modules ['s-languages-frequencies'] = { + version = 1.001, + comment = "companion to s-languages-frequencies.mkiv", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +moduledata.languages = moduledata.languages or { } +moduledata.languages.frequencies = moduledata.languages.frequencies or { } + +function moduledata.languages.frequencies.showlist(specification) + specification = interfaces.checkedspecification(specification) + local t = languages.frequencies.getdata(specification.language or languages.current()) + context.starttabulate { "|lT|cw(2em)|r|" } + context.NC() + context.formatted.rlap("%s: %p",t.language,languages.frequencies.averagecharwidth(t.language)) + context.NC() + context.NC() + context.NR() + context.HL() + for k, v in table.sortedhash(t.frequencies) do + context.NC() + context("%U",k) + context.NC() + context("%c",k) + context.NC() + context("%0.3f",v) + context.NC() + context.NR() + end + context.stoptabulate() +end diff --git a/tex/context/base/s-languages-frequencies.mkiv b/tex/context/base/s-languages-frequencies.mkiv new file mode 100644 index 000000000..01a1f5682 --- /dev/null +++ b/tex/context/base/s-languages-frequencies.mkiv @@ -0,0 +1,38 @@ +%D \module +%D [ file=s-languages-frequencies, % s-lan-06, +%D version=2013.03.22, +%D title=\CONTEXT\ Style File, +%D subtitle=Language Frequencies, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\startmodule[languages-frequencies] + +\registerctxluafile{s-languages-frequencies}{} + +\installmodulecommandluasingle \showfrequencies {moduledata.languages.frequencies.showlist} + +\stopmodule + +\continueifinputfile{s-languages-frequencies.mkiv} + +\usemodule[art-01] + +\starttext + + \hsize65\averagecharwidth \the\hsize: \input ward \par + + \showfrequencies \page + + \mainlanguage[de] + + \hsize65\averagecharwidth \the\hsize: \input ward \par + + \showfrequencies \page + +\stoptext diff --git a/tex/context/base/s-languages-hyphenation.lua b/tex/context/base/s-languages-hyphenation.lua new file mode 100644 index 000000000..660392f80 --- /dev/null +++ b/tex/context/base/s-languages-hyphenation.lua @@ -0,0 +1,135 @@ +if not modules then modules = { } end modules ['s-languages-hyphenation'] = { + version = 1.001, + comment = "companion to s-languages-hyphenation.mkiv", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +moduledata.languages = moduledata.languages or { } +moduledata.languages.hyphenation = moduledata.languages.hyphenation or { } + +local a_colormodel = attributes.private('colormodel') + +local nodecodes = nodes.nodecodes +local nodepool = nodes.pool +local disc = nodecodes.disc +local glyph = nodecodes.glyph +local emwidths = fonts.hashes.emwidths +local exheights = fonts.hashes.exheights +local newkern = nodepool.kern +local newrule = nodepool.rule +local newglue = nodepool.glue + +local insert_node_after = node.insert_after +local traverse_by_id = node.traverse_id +local hyphenate = lang.hyphenate +local find_tail = node.slide +local remove_node = nodes.remove + +local tracers = nodes.tracers +local colortracers = tracers and tracers.colors +local setnodecolor = colortracers.set + +local function identify(head,marked) + local current, prev = head, nil + while current do + local id = current.id + local next = current.next + if id == disc then + if prev and next.id == glyph then -- catch other usage of disc + marked[#marked+1] = prev + end + elseif id == glyph then + prev = current + end + current = next + end +end + +local function strip(head,marked) + for i=1,#marked do + local prev = marked[i] + remove_node(head,prev.next,true) + end +end + +local function mark(head,marked,w,h,d,how) + for i=1,#marked do + local prev = marked[i] + local font = prev.font + local em = emwidths[font] + local ex = exheights[font] + local width = w*em + local rule = newrule(width,h*ex,d*ex) + head, prev = insert_node_after(head,prev,newkern(-width/2)) + head, prev = insert_node_after(head,prev,rule) + head, prev = insert_node_after(head,prev,newkern(-width/2)) + head, prev = insert_node_after(head,prev,newglue(0)) + setnodecolor(rule,how,prev[a_colormodel]) + end +end + +local langs, tags, noflanguages = { }, { }, 0 + +local colorbytag = false + +function moduledata.languages.hyphenation.showhyphens(head) + if noflanguages > 0 then + local marked = { } + for i=1,noflanguages do + local m = { } + local l = langs[i] + marked[i] = m + for n in traverse_by_id(glyph,head) do + n.lang = l + end + hyphenate(head,find_tail(head)) + identify(head,m) + strip(head,m) + end + for i=noflanguages,1,-1 do + local l = noflanguages - i + 1 + mark(head,marked[i],1/16,l/2,l/4,"hyphenation:"..(colorbytag and tags[i] or i)) + end + return head, true + else + return head, false + end +end + +local savedlanguage + +function moduledata.languages.hyphenation.startcomparepatterns(list) + if list and list ~= "" then + tags = utilities.parsers.settings_to_array(list) + end + savedlanguage = tex.language + tex.language = 0 + noflanguages = #tags + for i=1,noflanguages do + langs[i] = tags[i] and languages.getnumber(tags[i]) + end + nodes.tasks.enableaction("processors","moduledata.languages.hyphenation.showhyphens") +end + +function moduledata.languages.hyphenation.stopcomparepatterns() + noflanguages = 0 + tex.language = savedlanguage or tex.language + nodes.tasks.disableaction("processors","moduledata.languages.hyphenation.showhyphens") +end + +function moduledata.languages.hyphenation.showcomparelegend(list) + if list and list ~= "" then + tags = utilities.parsers.settings_to_array(list) + end + for i=1,#tags do + if i > 1 then + context.enspace() + end + context.color( { "hyphenation:"..(colorbytag and tags[i] or i) }, tags[i]) + end +end + +nodes.tasks.appendaction("processors","before","moduledata.languages.hyphenation.showhyphens") +nodes.tasks.disableaction("processors","moduledata.languages.hyphenation.showhyphens") diff --git a/tex/context/base/s-languages-hyphenation.mkiv b/tex/context/base/s-languages-hyphenation.mkiv new file mode 100644 index 000000000..769c3d059 --- /dev/null +++ b/tex/context/base/s-languages-hyphenation.mkiv @@ -0,0 +1,75 @@ +%D \module +%D [ file=s-languages-hyphenation, % s-lan-04, +%D version=2011.05.01, +%D title=\CONTEXT\ Style File, +%D subtitle=Language Hyphenation, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +%D For Mojca. + +\startmodule[languages-hyphenation] + +\registerctxluafile{s-languages-hyphenation}{} + +\unprotect + +\unexpanded\def\startcomparepatterns + {\dosingleempty\module_languages_hyphenation_start} + +\unexpanded\def\module_languages_hyphenation_start[#1]% + {\begingroup + \par + % \language\zerocount + \setupalign[\v!nothyphenated]% + \ctxlua{moduledata.languages.hyphenation.startcomparepatterns("#1")}} + +\unexpanded\def\stopcomparepatterns + {\par + \ctxlua{moduledata.languages.hyphenation.stopcomparepatterns()}% + \endgroup} + +\installmodulecommandluasingle \showcomparepatternslegend {moduledata.languages.hyphenation.showcomparelegend} + +\protect + +\definecolor[hyphenation:1] [r=.8] +\definecolor[hyphenation:2] [g=.8] +\definecolor[hyphenation:3] [b=.8] +\definecolor[hyphenation:4] [r=.4,g=.4] + +\definecolor[hyphenation:en] [hyphenation:1] +\definecolor[hyphenation:de] [hyphenation:2] +\definecolor[hyphenation:nl] [hyphenation:3] +\definecolor[hyphenation:fr] [hyphenation:4] + +\stopmodule + +\continueifinputfile{s-languages-hyphenation.mkiv} + +\usemodule[art-01] + +\starttext + + \startsubject{Normal text} + \input tufte + \stopsubject + + \startsubject{Compare hyphenation points of \showcomparepatternslegend[en,de]} + \startcomparepatterns + \input tufte \quad (\showcomparepatternslegend) + \stopcomparepatterns + \stopsubject + + \startsubject{Compare hyphenation points} + \startcomparepatterns[de,nl,en,fr] + \input tufte \quad (\showcomparepatternslegend) + \stopcomparepatterns + \stopsubject + +\stoptext diff --git a/tex/context/base/scrp-ini.mkiv b/tex/context/base/scrp-ini.mkiv index 289409933..fe62295bb 100644 --- a/tex/context/base/scrp-ini.mkiv +++ b/tex/context/base/scrp-ini.mkiv @@ -75,6 +75,8 @@ \definescript [latin] [\c!method=] % resets the attribute (also currentscript) +\definescript [test] [\c!method=test] + % a new trick (at some point we will predefine more scripts and consider a link with the above) \appendtoks diff --git a/tex/context/base/status-files.pdf b/tex/context/base/status-files.pdf index af025dafd..52886b14d 100644 Binary files a/tex/context/base/status-files.pdf and b/tex/context/base/status-files.pdf differ diff --git a/tex/context/base/status-lua.pdf b/tex/context/base/status-lua.pdf index 515324e4b..165f0a0cc 100644 Binary files a/tex/context/base/status-lua.pdf and b/tex/context/base/status-lua.pdf differ diff --git a/tex/context/base/status-mkiv.lua b/tex/context/base/status-mkiv.lua index a112d644b..efd84f854 100644 --- a/tex/context/base/status-mkiv.lua +++ b/tex/context/base/status-mkiv.lua @@ -4300,6 +4300,21 @@ return { filename = "s-fonts-vectors", status = "okay", }, + { + category = "lua", + filename = "s-languages-counters", + status = "okay", + }, + { + category = "lua", + filename = "s-languages-frequencies", + status = "okay", + }, + { + category = "lua", + filename = "s-languages-hyphenation", + status = "okay", + }, { category = "lua", filename = "s-languages-sorting", @@ -5399,6 +5414,21 @@ return { filename = "s-inf-04", status = "todo", }, + { + category = "lua", + filename = "s-languages-counters", + status = "okay", + }, + { + category = "lua", + filename = "s-languages-frequencies", + status = "okay", + }, + { + category = "lua", + filename = "s-languages-hyphenation", + status = "okay", + }, { category = "mkiv", filename = "s-languages-sorting", diff --git a/tex/context/base/util-tab.lua b/tex/context/base/util-tab.lua index ecf36b137..a47c0cb77 100644 --- a/tex/context/base/util-tab.lua +++ b/tex/context/base/util-tab.lua @@ -406,9 +406,9 @@ end -- inspect(table.fastserialize { a = 1, b = { 4, { 5, 6 } }, c = { d = 7, e = 'f"g\nh' } }) -function table.load(filename) +function table.load(filename,loader) if filename then - local t = io.loaddata(filename) + local t = (loader or io.loaddata)(filename) if t and t ~= "" then t = load(t) if type(t) == "function" then diff --git a/tex/context/patterns/word-th.lua b/tex/context/patterns/word-th.lua deleted file mode 100644 index 570b64c09..000000000 --- a/tex/context/patterns/word-th.lua +++ /dev/null @@ -1,482 +0,0 @@ -return { - ["comment"]="The data is taken from http://thailinux.gits.net.th/websvn/wsvn/software.swath by Phaisarn Charoenpornsawat and Theppitak Karoonboonyanan.", - ["copyright"]="gnu general public license", - ["language"]="th", - ["lists"]={ - { - ["compression"]="zlib", - ["data"]="xuXnH\12~\21\30THICW\5e!V\20Q,(gL7x;\24c=y,qC4\7R3B\1\19Q\25G.\127\1gzri\30O؅-WO\8+uY]Ǐy{\30H2=0\"\23SDHdA\22\11\6R\23\15$\28(gN }į\25\19ap=l\ -T+u\\'(.re\14GHbc\3LJ@%2'ǽhj\5;Ȥ=V\11֑T'z\15\16pPBMD\3xm]z\12\26\180\21WKX-z\22@T\23HO\6Uf\7\0002\0318I\4Ja\3\0E^L\136^\1\15ݫ`]^\4\28\3\24!M/a¸e\"$\"O{\2KݦHxĄ#\30|#]³,/i\14yvc\5\8\5\29FNd*M)\\Z]\22~{&SEw{\2AspǔƬ6dL\6\26F\12:e1\21ww$RUE6ͯ3\27DIA\8\1\22~Ûw\20W\0\16V]!ZSzjMd\23\20\127\3'qgOh)Gaԉ9\5\21J,. + Q;|\76,p\240WB]&FMbcnp8\9'\3\6 \13\9>)\9\18z4<\13B]\26!U\21V0\4\29\"l8(Yh{\25.\171WH\17uJ-΀6\127\22Gk\20>~9KP\17y\5ʈ'oJ`0fpF\16tMK\31_?)3\26Tn?\1\19T\18,\13l2\19#`Y\15\7 0(J<\16.\15\1^=p\3`$\24W\64O+\3,b4\\\0269ۊN\28krk\12K\30b\19ǓOeN\14Syl\0K9\3j-\30۸[\22;}ڡx\27|d2WKwt\23\11s'W$Y~U7\2b)e\02y¹x`nVs\18j\3MO\2\144co r\0\24%K\0\\\179\82\15\1n\14\9=\6DJo\16yk`2\9qz3)\46ټ&҃:0O7Ѕx\0225\21C\2A%|\ -i\11\4\19b\26\29\\\24LRrJ`xAeF.#ւ6Ui\7ҟs\29-D2SW,B0f=B%!7y\0063)jU[~Ab#ڹ:y_s6(Mo¾\26uzgוS4bp\23ߚ5a\26[w5XZO\11-\21ss%j֌\15\9@p!Z\28&\30V$\23t\21y\22\25O{\25\0056.\23r2H\5*TrZ\0RzV#OX(&*dw6\31\0201XR,)\\\9okв\31\29`P4pP0s\22FjYX\"\1\28ڸe\24[ЊK}d~H]G,S_5q) 2у4ўeL\23A\16\5lI\"\ -[T:t\16%&\12\25\21=\3*{>\28y͌w\16,nJ%{z\8%\11\22p8\16c|Ejٲo\\\1M-R1~\2\16~\17-,|\29\8\12y1ǒ_\23&ǝɥe\11uwB\11\1/*[j\16`Dm\30zmUjuu\32tl~ӹ`|Un}E#tVѼvI~SJhV/\13b[[#Bm5\30g-?oV骁IqS~ȭ\13\6\22\2C?:", - ["filename"]="tdict-city.txt", - ["length"]=5991, - }, - { - ["compression"]="zlib", - ["data"]="xmRj@\16|<'*m\31ژ\6[E6(>B~ީ\12*NeTVD\3Il]\33\31lU\0.%\27_\19\31!yQ9\11{\132J(G#\28RKg{k̒9@)\19\11jD\78\28OQߡ\49nYF\7*9\26N+%t\30t=2L\5\27)]\0242gN\ -g]y\26[\0\23V`ߤ\29X~\9k;\\\22)7O8fY\31\31\21IqK )Du\1z\0\23\27\11", - ["filename"]="tdict-collection.txt", - ["length"]=708, - }, - { - ["compression"]="zlib", - ["data"]="xڍ]H~\21=a\21\11\13\25\5s`U#B\29\12xmQWY%\8G\15YyMn+nVdo\3o\31ێؗv\14Ӄg_hvK\0313}o/Qg鳐\22>\19{uúݤm\27n\127ݾp-M\2\4Zݎ\28\8]~\22\\V}h\13x\21x%?&DUZxC<}@_\6vK\7~O2\9KV~V|\127\29k\127&\\X/\ -_Xۿt\16x_\0027\25;\19Ud{c:~.dz\19tn̢c\3V\30m?g\1u9r?\23\2ւl\22n;j\"-V&蔻PTeUt\15\8!>߳k`?qTȟd3if\8}O+\15=\23\29ݩ'N7\20lUvGe\14y\127mE9\27\25wDz)V\18h}o\127{/tklFPO\15$܅Q5{N#.s\285>E\18\9;\5\26\19XVC\22\28\22m-.l_fh4J\27\19\22I\ -'9B\29FhSH\ -\25g-\0067Qe\"%\1\31EU\14\14w\7}=G^\14?\8xemJ!l\30\17E!Rר\6y\11Y\15i\3\15Rlo`?B#5jHOaX\21\17Il\16\ -qP7\177U(<;\4Z=ZZm\9~wu8iUjL(Èz_\127tT>}\ -UXԸ\11\"=\5<τ\15\14vDŽ\13)\30\8D/>hQ~\5=\18&j;|#\2kb\16\0189wZ\0284\3ja\12\1PF\21կ{#}GUdV/\15<\ -ۼ}Eҁ62\31ڌ *1ѕ@XC%S5<\16\16\1u'\16J\7?ǰ\6;މ4T4n_t\22l\"`~\15+8\27՟ʑ\0110\3\27\2SY\23f\7(ͦ\24X!*(+\30k\0흻*A\9\\QY\18tF)AI5[\4)f:T;{h.ӻ\8W:jMIz1Si.{a\24v\2eVg\20&=v/T\31ִFg\14ej\15|\3~\25~*7&FO__k5!]\ -%\28=c\2{\23r\13s@P\1\127rk\"[aM9L#y<:Ph\21\9Cl\273(xP\\\24'\27\9d/$j\29\0092OP\127*\11{`]\4?\8O0N\22BF0U&A.bj\1\"T\21\9N`\29]?\2r$\28䟙E*\31ZRsv\9M<03\14R_LNa5\18\26EA\6ro/f\22ƒDH3*\24I\25_₱(ogrm*\ -\0087\24]bO\5\27ݕa?\93C4i;\20%%'y\21,&P\176%Q\28e/.uzjOfdc{b\27W\6\13d\27s_~\23W\27%\20ܯHsՄ\4y(E,`9]#\27O8\23\27\\A\0057YTl\286B\9FPf$)#x\16㖏,\30\14\"s4+\29\22m_\26Xlſ\1\27ѯ\9_=5N_\17|kG;zuaLa..Cp\13\3\7\27#I\14\ -@\27V4@J̒9^\19;\9|\12]C\127+Xb/׹`Ӗث\12\19\20 \18F05',\2<\1'Ήʇ\25rf\22T7\7P\21L\29\\_Ő4/+[L(VNU\7q\0ln\25\3B˱=U\11SRؒqVEs\ -_6t+\ -ߕª\0049F*~\1m\12rB|v'\26\5\\o\23:R\ -'\0026\25K\6}\127&\29oUZ+_k\8a#LS~\5%O\11\20\5`K|0«K_h#RX\31;p6{MC:w\0\6[|=7\3dZ1\22i@M2^r$5\"+\4\31u\3m\27xP$XWۡu3D\137n;\24Uْ.\3#.\25B\25HQ\20~:+m\6\0170\27])\7\22I\29\25GF՗{\22'no\4hX\22r\11x!\20Ŗxwߖ>Xh~)\19_pnB,]ޑ\13&b1\31_/9\29q)KXϦZ\22\23\14dfunN\22&RH^)\127BIYA\16U\19z\26\2\11]$b\16\31=UݗhyɌ\6'3P(\25\127hR\0190(OrKwv\2ڶ;k\16ۥfN\24\22bD\5Q\22\4iI\8M\ -bt[\0000\138utjM;t羂W6'҃\13»4%te\31+Mh\9&ˣ靚ka9b\19J\27\0164l1\24\127D\4Mн\"lq9$PdEF`o\17{ה'\22\12\\n\7\14:ZET>@\0138\14\28Ӹ\31Pg\47?!m皹jXI4?\\s;cN;S2\25\0043\6!\24@q\26+|0fc|\7yO\29#[\0287)&\5Tz\"oy>扗OM*rt̓\8fF<ڣ?(yc\15j\15i\16gFd*`^%X6^h\1\28&sv\24p2IJ\29bWqJ*.\13\19mU{'\27f?&7#^b\12\18EFIa\12c{pqQF\22\19n=\20\26\19B-O\"V9!qI\27Y\31Q\27\19~`\27,矎ܟ\ -ߩ-B\9g{N\ -]=#T|f[z`っ˥9fV\26W)5σm\5jds\4*}\13\21\"R[\29?ku!{a\ -\30Ns\12pҽaP\292~>t}L,\3\0-\22>$\3&\30=&C\26\17S0XǰLp\27\27z\1øՃtXu\1%j\26\20ldWV\14\1>%s]n{Yq\17\1\22凹w\03tCmt:`\2i*{1TH\3OH.w;\5}\19d&-y\24Z4̊T~\5=r\14\18\17Cb\11\7 5$i诒$\3%>{qV?H%m_\\8I\28\8*q-\18Vk24[˒5͝Ec!]\11)Y)-\9woǘki\16G8R4:r\28s\26\25ȸLK\\v<4\27$jD\17щd\124ff䤻7w\9\12.\12A\127;]e'\0ܒ\289\"w]>,[un#Z\30^o=UlKHXJ8eGde-S\31ư.b\26N\25h{.\11\4k\18o/=4-L|(_+\\\15¾/W\0264FRRz\0052JL}\\XCURU3z,0ߩbh`\1270?51\27\0178J\13QZ\14C\249mR\12\17\1277ӎ2,kj{aG#2\ -@Tv`\8>C5gX\6=\27a\17y\18:I:\25Fv}w\25b7l.\8&\20&\11\22nG\0049\30\ -\"wۍ/ld\20n-{؄k$1\12)j\17󙪁Re\"dƷ+U\29\233\16m%Fl?Z!\7w]\21OfSMO\23޽IHJ2JȳUpgtLa:0Zw\30s) ;'+\1\31{u\20\30z񨄗֭Wn[[ZD5v(̹yʽ2w%|-No\11I\18DMk\21~\13]q`m,\13_p0H\16]\"\28Q-]\22ȃ/+?\"|xv,2dȋli5GpȘ;߀\1\7\14.`\27\0\30e{$\6\9R+\29~\6p\27\24\5p̼\23!\16lbrkڄ\6#\\0`6\30U\22\18Qeq^l5RⅨM\5\19B}W\13ڷȎ\24\23n\23Ɯӎl\16.h,j\17TBP8W\\\19E\3\11v\5|Dځ%vWr;'\5O\16MX9=S_@\19+n1u\26}(\21\13.68H\13t\0271aVKy=\13ֈeo\1\21WY06CŹC\6zJ·\20s1\3\27\0185\23R\26S\2\22R0\11^{+\18\13޵~+\\\18c~\0074?1`\9\23-\19K_\4!\9LB\9\15\5ly6\127!nB`\2ȑ\216b |bZ?\"ϐFSE͑۸pM\"\24\4\15J4MU\13X|6AL\18z\9\15q\19_'>\13:\31\13ٮv\23'ҵ-\20\21]\5\15_|Țp5:nHX',\9z\3Urw\19T͵ԩd\19Kv\21lF\0MbX8^Q'q\24G(y&\309PUW\21~2#<|#(rb|{Hqzr,jwSĢ41\26\11C}[Z\29k˶w\0-tra\6ɟ\228%b_0\2f{{SWN\"zČ*]K݇7Ի\15w\31Mﰃs;Hc\6?\13?$;wT\11'ZOk\27\20.\24uPrHYv\5#2(\25qmHhu8(mʼ\31W&ڈ]ӹ FqZ\30\12IO\12n;-v\12\31}B2sCMI8%\23IK4:H\26\7.ɓ坋T1*a5\2 \0\5ܹm&5Ҧ\20\29nY~\11K\29Χ.Κ\28~s;uR-sM:\17[\12W›E(16p>tof3\2QޢU-\11OHBk6\31eyLv\29<Ȃd!()>T%\7yt\17&\31:u-\31\127\14J_f8'\9\13Og.\9o߇b3(\14@k\11\24ľ\29l\12k\4Aó\25q ߍm6\127:E\30k!̽\27b}q\15\2~\29 Y_YR[.yR\2͘\24Lo|߃<&aq~!ubZ\127\24MWew\3\25ch\13C\12vcOy\7B>FgtA\27KIkuҨbԨM\21Ԋ 1#PWK\3\20^٩3j\ -ƺ$8]{\12P6'\27$8'*]wq\7\\4aR\23\14y#\5k9A|x\0f\20L%AqUQ\21s&QDHk\14\0 ˁ'b-\8i,\20\0`\ -\"ih\0Xy_k\15ί$;53{F7Q\13=}¸v4w\29QJAW]7v\6*)_\25ZVp\0183v\8\27\31x塸ݡz/aX逧}tEeQ\9ݒv\8\24\28t\6Hq}JZ?XÏ-\5C\21Db\25u\27`J\ -\16)cGrQhM\309ޘU'\1\5GJ6\12\6pxLb][7֒\19\22|YO\0196\30[rG)uʹ#Bjg2K{=\12K'[d±SeyG\14\14R$ހz/:\27vrVzLv\11v9\7<\259oj(\16ر1i>\3ʼnDv%r\3Yrp\14\0189\8B\7ܱ|\24.:03']O\4\14ʿ1K~(V\14`%Ѹ-\29Q!Sw4P^\7ah%Dx77a\11\29Qc\9Y!*=J4--c\6TiMo\30<;:#ʟ|wR_$\22xS\23\27ʞxK\"+\13=Yh7", - ["filename"]="tdict-country.txt", - ["length"]=5128, - }, - { - ["compression"]="zlib", - ["data"]="xuV\11n0\16ZHiZmCP\1!Z\26tm|8\14M(3o\24\24]\27f\0253eQ\11˟[d҇,\1o}\12\22U\19\30\25A^|nà0\8\1ju7DV\20k@dL\0017Z&I!n\27v{\27zDoP\13\19!G\25\"iy\18\14\12~M\31\0Y\24uw@Ͽp'\2\21sp4SkԶpR\4u\0\18F\12ܰfȎZ\27.y%Yqխ\28\4I\31]>O\119\127KKVl!>\12HsFukX4J^\\\16d\13\4esr7\25e~-k [\ ->Y(\2\7\3T9,O%,\16?\8bM\29g*o&l\6M_w;\18cw`5/ 3\3͔Kv'd|\8襢kma2Oâ\\C6\8\6nyS\3T\0058|?Rp", - ["filename"]="tdict-district.txt", - ["length"]=2762, - }, - { - ["compression"]="zlib", - ["data"]="xڅTK0\12J:T:*3;X,\0163T\25J69J8lBi1~)<:hO~\30ZO6#&\34[\8\18<\\{A\16\0071\31\6*\5Py(ɗ\0292\16\13\12-=}p\2\7Ê]4ACz\23\26,vx\8`\6\5 \6|V\239I5Q<\20pA=\2\5j&X\ -#]\26Woƽvm{8\22\3m\16(ѲF%Kp\29sTYhc)uod\22Ze`+Ys\22琒!WU\19O0;\8%3PfB\28.U\26|nJB\9ъ>\12c\281[ȓmO\4:'QᵹJ&CCR^o\22á_$÷2t\14\9A&6yUU2\"f\17\0193,G*޲\24\19NW+|\13^a˼\29?ty\0|\21qBv*ݒ\127\19z", - ["filename"]="tdict-geo.txt", - ["length"]=1324, - }, - { - ["compression"]="zlib", - ["data"]="xm}j@\16ůQ\"h?h7~Ć\20%6sf׊\21’73oUWTN*ʻQe\":.'jp挃\24\ -xNt|\0k\0jrShG/\8aJJ\4\30UV\27vqNe?\26s*ό<ީ̙ME\ -=\24\27Kjb\23w,{g\21RmCqNmH3Dl\16)Pjъ(غ\17\14*\22\13n̕Q\0054>Hp+ߘ\4h\0128BаCfEh{ho&\ -}_1q?p!\18\19^{$'RaY+[duwgW@\14\13p\19K'\29y0g+8:_K&,A\3\6\12Q\\\0\15\16\3pop\30n\1275n'v\26o{\0133\"ط2\22\28ļ \"hU=\21\15NAI0\24%\24\11q\8\8r+(+\0228@F^_OF\1+E9\\\30Ip\18O6\24KI-޶-\0R]Ro_#\30+bc\27ITﵤd\20Bq\12T#%\21.Q)q\18b\22ɾPd8\18'ږ}\20*ACUT*If,K=hPȅ~[i\30MMFڿLl?xX&#\1#I\31&S?\22?OܥFuph\13>FtitA-|ӄcl@a;w`x\0085F\\\0276_PEZJ)Y}\6kC*\29f.\2--\17:ՈjQ$04Ĵv\3\9C[\1y\14lMƇ\15bA:)ђZ@;`Wsm\9@sz׸mɋ\\?x\15\13\0220B\"wwtyu{m4\127\9},oZ.\28U,\25u\17:-mR;a+\26S7);\30SPO\23{\24V\13&\25h|/:ʬuT\22=\28\4\26-Kڟ\9\22gtȟkc8\242y::'\26B\15S", - ["filename"]="tdict-ict.txt", - ["length"]=6299, - }, - { - ["compression"]="zlib", - ["data"]="xeS\1J@\16JjB!Vب`IKPB\0274$}3kP8E%W9L*y\22|u\1Į\31j\31)-L\15i5r!\5篶", - ["filename"]="tdict-lang-ethnic.txt", - ["length"]=969, - }, - { - ["compression"]="zlib", - ["data"]="xڅZH\14~<\21ifa\4\19pAM.%oã\\ʟ?\3̌)~\\[_o}~we\20[܆?FЭ\2(\19[\0144`|K~?h\31\4.Fj<е|vT++:!\13/\25@t\0\29g\6D\1277!\27wqq\127\29AF,}Fl\"TZnr!妅|a\8٩LK.|\8|qG\15o\17v\28\18N\15\0133QJ\14\1mn\5X\26\0\15J\1(\1D\15r4\244\0084ߣAk\17\ -4SN-0*|\9P K6‡\17B\ -YP\25H\" [\7\9е֠98l2Q\6+n|q%7/eкLxjRdyGmZ&ҟЋM2\30^eƴ{;I9\23\20.\2\25K1XȔ\5?36\13D~3\"\0310\31#\16^3B\14@YTKN\2sgtA{,~\22rV/\19G_G\14\2:[\276w+@>h܃&>nN\0273\23bE3h\22AXy4F\0)(0V\12QQA\1\"VB0Ý\23rHYכ/Ѕ\5j![T\6*K:\30)\209\1\13Uf\13\2\ -0~fl”܏\7~\3mrDU&\19\6\6\20!,\11\24\23T|:\14QU\\\4\16ry\30\11?\30\16I8_ \24LEH-\24@s vDP\1^P]\"V\8䦷K\13\"\1$\14Py\13>/-c,w);\22)\20\16q'7=(%l\29\1\28[\18\8K,\1d4j\9=/\5Zz(V\7\16Q!\6qp\11+5'uO\02470:hux1{{%60j?\"=\13\22\ -\4n9\127X6\ -̃r4F;P\24h~Goj\2ºY#Vb\2A\3SlE|W\24D\3Ae/2Aϟo7/L9;4\18O+U\20VgMg+l\12f\28%Fok)7\22\17֩!mik\28\1d\28\25\29|\20;ag˜s\22f\2nr'{\0309ӪZ<\5,\25śR:#K֥;!Q\3_4A(%¿ْΩ-D^Ъ\33\5Y!\6\25;hŭKgVȰg\11m֕\22&l>DS}.ʅ;^\21\26=e\31LV:0@%/Z:˦\127a\0\13\21?@h9>\17\11Y~\18Ƣ/\17\22o0yA0@LM\0+eVf\ -}.xX.U'8\"lUeح3%Ր\8\31jWF\\\19g'\1270&s/ۗ޿\23/E\7~@*P0j]hؗ5hƮ)Fz\5k;Jm\6\21X@(/C/hׄ\26Ģ \20mw\31X{]z\ -]í\20S9\3v+f\13\3Ea\127a@V\28\24ۀ8e2n5\ -\30\191\5Dys~0.͇a\14\2\3(Y/}=q+D\7^U̕A\11m\13huZ&\8\11OG\7\13&nZ&\"nh%:)qK\27n`Jj*ȴ\6k\25\27\4ZF<\02964I/|Hrg\\Mi\ -̞\7/tpt\45+\2\1}w\27G\6\31\7p\7nmlD!>h1Lѥx9\23\13;PNƒ$c8蛫`&Z\18,O\8Gjh%XG\1\29sZ\19\14_\\\17,,ng\28nZ(\25\12\38 i]L\29Y8q(]!_]:\11\30\17w0AL-bؚ9CK6zk׎9)\23us}\21!8Júd\11\27=SM\27h\0214H4f\19cCWϚ|v\30POw48-\ -^k飫!hxcĪ|\9'\25\29 ތ4Hy=F\1^EN\051O\27k3hI*\3Y}BVw.M2.bd\30a/+?y\26\8O{ZB\"'\26\12zv}\19\26y^yeiCkҝ[9Րą{2HsتCUBb\ -Sܰa_\24^8?QYv/vosSN\\\30k \"\8\6\7J3lx\3/ꃕ-k\127@Eo\31j߫{]\\\8i\31\15V{PmU\7]Xq\31#$^If1\29\7݁\\;ai\15\ -rV3z{)\15w\11\6O\19Уn@{~SfݛS\4یM'\11#g'T=v7CTB y34\"\14kv.\14n\23\4ύ\127fcK\23x>l!7y\145ҫ\14MgK5S\127T\27.7\11rv\23\\>tƤ\30\15 멞\20\28k-芍Ub\6*]fگM\25q90A_e4\0302gŹ\14@)瘰k\"2(҃\28ĺa\\eh?\6\21i@bm%`\28I}KߞQlK\25=~r\0\7g%㩙}@QZn73gY]1a#WUԉiM\ -JjW'j܌ \ -km`<_uREj%W%;|+P˜uşm\18~\0259LPf\5`&j-\0ұIm-Fi@\21\3\13F*QL\14yR0S\51>39Q\21\7bUa=\2\24+Q%P7\13\0072O\28\\%'t\3НԒ7C\17&#̀\18z\16\31'\3&\29K]\5i \"N\4L {D\12#\235\\\19\19uLfe$HT%\25JŨ\1Z81#j\4\24ng\\\0d(\16HɾJ5t\20\15\27T:u\1277:\19z]7(vdk+\127R\127\19P\1N\26:P\ -J ]\09!A$oUQ:k¿}\\18\2\1271\19W\22UE\29`Ks&{,gg\8zom^\21;IB\2\24-GC(^\19ꣁ-R\5,TN6\4w.#em\6Ng4ml\\\17:S\21˰`\16cQB}\23^B$r\17\\Z\3\13\5;7F\17w#&['(/1k^\2W\23喔Sv 9KgH%\18z\"\30>p:4:46Ѩ7oT.X\19\29_)zL%_eb󶥦ً\2E&\16\11\20WrDރXsRq$Mҳ\7d>c\1oRЅcB+mEТ:\4/KI\29Q\":Mu\ -~3ަXh)q\18([.\16T\16\0C\23铩\18\1\11.w\12̳0\2Qycʓ˯\4\0041\19w_Kir\2{{)\16spI\1e>D", - ["filename"]="tdict-science.txt", - ["length"]=5492, - }, - { - ["compression"]="zlib", - ["data"]="xmT\110\16JJT\ -Ҕ\4M(\2\"A\20Vm(g[R)[L*&\23;\17SŤ\24#\22\23hܠ4\20;{RG1wߣ\239 \ -R\20sv\16bfb\30b\23\14\ -Gub*|Os\1\17\31 'zqIo\27\20Q7l\29PH\12bv͢\25D[Ȳ\11\8^!v\69\8vΦ\21\14\3BwFLCHЭXv}\172xuы\4XB]0\18-R]Q\"1w\19Eoy\1Mu}\30\18lB,#\3慄Ë왆\15N;\11;\"fwIg̲\ -(\25\27~yi;jNn\15!\\\13z˾#\8\15´ȡ@sJ\23d\26ƒ,9\"9Kc,\0221\ -?Σ]c#\14>E`«P\19'h\\O.\12ϡkPN\7 WaF4\1J\0096ӸAZ3Z֜A}3\127.L\16\4pN$*Xh\21W=p tjpX-v=E߄1^mF̿\12BvT+_K&5hcEiGEC7wx궡);6jx9#B\23*HD/a؉n4v|ZT|\8\"\22\12\ -\30\127x8'\24b`\8\21P\00873G$v *px^8E݋?L7\26 /R-", - ["filename"]="tdict-spell.txt", - ["length"]=1787, - }, - { - ["compression"]="zlib", - ["data"]="xڍ}H\26Xh<ޝ\0134\22iKZ}Q^}=\13\127\11Ͽo\31??\127~W\29**@o\4N^\26\30T\12Ͽ\6–?\127\30pG\127_ׯ\127_gC'x\25%ÏV_?9߿e\24\4m_\25<1\8E\14o<\7\31s?\6\81z\ ->г+\98\15K t\3a30?&0p\15#hq\2c~N;|8\20C'Gi?{Ǐ*>\13Cd\27^?O \29h\127\6?\7r_o6:J8D|;J9ǧcԼ\26\3\11\3\26Q\4nL\12-٣\239?j?(ju))hG]lɎ|\31b)O&N5%Zڧ܏mSؗf?\34\1275սd\17\14D9_ΐ\31Mv?\17~NݿF\7h\13\"_HLMNqU\26>̴mV5\27V|6\296KE\23o\0\2\30-zj\3&\27VcL8\12\15=^\"Am? z\12Α\6\21\158I$aﯹf\24}}(P>*/<\18Ta0\12е\9*~\31e+\27?\3)m\19P̷;S\3rCEplf;ȫEO\21\3SʎNP\0\127\29]$ϗi2\ -f;|kyz\28cWzM(YO\12)\14p\22M0/\19s\28\11qR-DRg傡\9$H\6\127tx,Ȏ_\1[a\29<7hfg(\29؉0cUC\ -S\28-\26\3*\23\18[\22\27oV\25\127VFgLߍI\3Ua?@\31\8F8(i?)-+/I߁oa\28͌\17ӽ\0$:\15`ʋ\21\31o\14\15:~\17V>ȯ\16}o2f#P\9jx\"ak%S?y\22\16\19}ؐ~\7^\17D/|֫ͪTez\127CdP\3I<@\24a@\7ҙ4t(=A\5\15ht|\127t$\127x`{>A׋\31-?t0Ç\13\31:\17\127͛_2їZ2!1__$\6Z6yҸ\19cz%^mͯU\16Z/?\9w;ܒsԭJ\"\28|l\17/\27סt\18b]vPgo7oÔJ<\8xWۄ0B\9M\"ݱ\\p?pzjtkI\9\\]ݩ|\30\6H:\14:\7cӇ{}(a]G.rb:vw&@WG\30\6Dacw!J\26U\13SO\"пtAuh\24TH0\3\"{R\0125T\25\11iګ\24g2qZ\4+v',s&đ\25'\23Nة\ -_\7aP\26 d\29}Ӄtx4|ZÏ<˘\5\13wv?څZ}L\4U8ҕ!\17Z\21\\ʇ-.ؤkRؙ\ -WZF\23\"]1\14)\0hG\21;\255堪\0031BLP+O\0\7%퓗\31 8Aל\ -~\30+c\ -ݫ|~G\285_\16S\"ҞbB\17A.V+6^ѕiwyNUݰҿ{\16p\11اe&&k\ -\"崖\\\14Ͼ$f`*wbeʦ\"ux\12rM\31{\15D9\20\18\2\5OLj\7Jz.-*Y܊\4\22\21<91mo\27Sg|aϫCLU\7\ -q; Hg\12\29C[\18;\20\5\24\12F>IHeƩ\ -N\24£j\6wLb̩JьNq8JN:bLAARfءM\6;\29\21\1u\"XOsuIr\19b\30|\30\30J\25\3$3Ai3[]@6#4\29\\ne3\26\30p]AY/=2z\2\14:[\29?mg!dƆAq\11N\29xPNj9pTXz\29jU*PS\3;!5L\24=B\2twF4fڒh@\11<9\21v~} eF;'ڷtez9\30!\ -Fm$\35o@Nx\4{J\3n\21 TA`5%/1a\6\5f <ģvPm\27)yTu@\23|,\15,mQ#\4\8!bn\"(Bݨ2gZvn t\127\23HL\14\\\7=OH\31\7Oο\11('\15\8\13\31\23\28F\4mL'$CĪ{?\8f8\27Ё;P@\84Xe J?hC_z\6V\3v4n\31\27$3[l\1M\27m#.a\4҆>9\19\6p9\7(\23[O,GK\26\15eJ4\5`Pٟ]FP>b\4Bɛ[h)UM4V@\7]\27\29\9*I\308\17(\30:GtANۜ*N9a\26GAeq0X>W}\0272?:\2z>\29_\30JG`D4o\8k\22G\2}J&\0275\9^7CK\2&ô|{?\70fr\3\22#\23h\15](\8WHk\26!\\H\2x\27lhL\8:g/7wB\27T\12ŚP;7,H+\29/*\29/;I\8b<ӵ$eX餲\\ti9=\17:mN5\27)fi}\4\18\28Sq\0173\30\30p\4<\126';!\13\0197f*꽁I\4c&P\12cUN?U5b\\6S\14w\22Lf*̪J{1\7Ї\20R;@2N(vm\27C\23\20y&\23C=\6\14|\0001\25\160֯$Iz\30\17=``w\18Zg\6!u\28dV4q/5yl=(^\19iyy\15N<.\36L$5~e\26&D\16i!YѨTf\60%ℐ6#\4XfdG8\7\6Z\18Jr}'@\31o\30^6ox\7i=wB >H_ѯ.\26EP.aXjÔ30\0158c丗R\0\1S\25\0276Vͮ\ -\\Hf0~\ -\6K6Ą4jHDRG|;\127\12\25))0\20$T\7:@Z\9lΞH29s\18֛@ChEЊP)Fg]\\\11d\8\15}A4?N:Vy\15S:r\ -\25Ycpn\12E}\0196\21ft\5E~\23\272\12u\2\13N\4\0045#9j\0}\19?ô\27hS\9ly\534y7DpmWGU| b]\31\14Z&(r>\9-f)\8h6\11v%,h\5B~QЁ\270hWAJh\\An\280x\29c\4ٜѲNx_I;\22VgdV==2\\Vb\30\6z”I\20)/˛#?:@\0113fӏ\2UQϡ\225 lU\12^KI\24JRM-(L>agIsA\0129%A5o\9jeʟ\ -\12[\14\0087.\31\19\24.\27d\8\15\0À\5PhU\0166@͔9\13*\25ۑ\24B?\\G>-\29N\6]ȻJ&\31'GW:3fd1n\127o#>#YX6^CWZ,'o\26@Œ:,'_z0Î0knd\1;gQtl@nst[\24lQl\30!D[Ѻ൝^\9\2Z\4t!D\127\8@bt\30\11r\\A[T&\19\31!\0-9_P.@;sMB\12c\8y\28\27F\19Q)lb5@2\ -~D\28\4Θ\17G{3̆9\14\31qN)d$Q>ҡ\6&\19G--f\4A#fB\31Y\18h́.nSgf^G*o$\17\23\26t N\31\ -?Ej [)\25wQH\0266m\0177*\8R\27\9%\5y[rH%˭lkK\6lP ^bYK8fsVΑ\7\1\29*C'R;) .\16\ -+Z=\\jx,5|B\31\23\20Ts\3kA5?bC3\22 \8\3{\21]1-::\22?tJ\27}\9l_\"\127V-JJ.\31`~U=B3\"-p9\\ZP-3_\31P3-aT*\9~K\18J\22?i1Q!q:?/ouM=aB*tw7D\17T\11\ -\29\18{\0163mVQP8\14o70z7M\28?r\24e3Kƒ\4\1n\01720@\29Ƅ%oVޒtxY$\22yݹB-0/z\7w\28T \13\1^`ϴ\7#3\27(q=3\6‰qO::GOQ\7gʙ\9NDĿ\"\4+P\31\13W]-WMҀn\16\11h)R\5KX\11\"zZg\18\17Z\9>\22P\\]\129ϋ2~d\11A\16*\16\30٢lInY\11n\8\20.R\21ީ\7Q\7|+lb/\8Ӓ\22|\1-7\19az#s\26,R;\16`r\18~3\28\26`Mg\\v-UbD\77C\22\23Kx\211\26%<*>XV\16Sx ,nK]r%)x\24&@&\31TaIZ\29D\15 *rB\19%eE\23~$gD&R!2hg\7.oc7|EAR磡BţnO\15S\4Hnu\20>=uHK\22v\"28n\14&3)\16ʼE\26|;\0272ZtF\20\16/ua\22Ϥ!ٛ/\22-{-J\18g\1-\5-\16l_pQ\12lI\12#eo;\29ɉoG?b(PA'GA-\0075cSңQ\3:\9CyT\31\27V/\19cAh.G7J}\13ѹ\4\0žucU\11\14}r\30\15\31I\26]UM\21\19\"o\8*Q\21\1\21\27@}\19V|T7n\7~\4\11QY@_!:c5;T|}\25W%TGS\31cWpaAH\18W\15=ъп\7=\16\1:F\17`bK^uq\21L.R\31[ K\31#k\14>bu\1`9qKzV+NݳX+ORM׏ȧ\28\3oή\30#pL'H|\13F\12M\19b\04\"M\23BϏhPA\"\23HQ3񍣚$вW\1]=2\\tcn-=Z)zA[`W9\28M\28R)\11\0\18Ρ+\22V̊LFgH\5Q\2kx\1[1iEB\29-V\5\15\19\14d~\31d;@\19Zw\6vU\18;)d\\w&T\3\19ZܙnU\128\12 \5$\15\21\2\0A|$\31E'Z5<\11hz\\c\\\19߷B\5w*[51Foa\7\22ɮRrC\20Уn\\[F+`q\13\0212\0234b̕u\30\11u^MJE~h'EncC诳_8B\1\19l6$I\30\ -F\14[锑2\2OqZj.L\27ajDR0ga]֔\16)ө\28\17h\31Ɂ&Ŏ[)\12\1i|bʔ/X0c)ԟ#FU\22/y\13h\1'8@D{hwJ\28{|9٥\0z\16k\18l\25Z\3}6\23bb\8'NTQ@sDAy\20\2bw\2\13e\21|D_TB\31C/*{䦿3ٌ<\26\"xk\11\17OS\30\4QPrK\12Z\5:\11&J_n3&\32\7\19?O\5<\115 L^4֙|a\11q\193ȵ\0273P!mbDkc4d\23F+呾>wS\17F6e.F5\127Zi4\29'@y\11\127|p\7׿%ܓnel~\26'ǟ\9Y\18<ٱ1ĺLZ\8\11w,_\20J{ph\14'^?\14D\ -Y>yG'H%\28{\2WD2MD4ʳ\28,\21Kn\3ʮL\27xn[HKOI7%n\15Om\8Ox\8)ʢ|]gL\21č\16\200Su&ȔZC~U[,sp\16\1_nN\1\ -%hR?&\07B&\0?7\19\"x\31i%'\11\19\24Rv\28\9JNVh\0ߐ^9ᚿI\28o!F`}@2;\0136vCĊcC\29_c݊,ap9sn\0\13\257\02276YAq!K0`\30j:o5\14lgl#!i\27pD\2>X\27\1Q\14B\8aܛ\27[\116S\29U~]ɌV\5by\28U3{me\24s\3 \ -LpgԥP\14˳\6.N翘9ςU~;r2D\31q1\25\ -QT\2a\143\7\12\0116\5;?6>\7e}>TL\7V\19Ў-n@\28m\26`@U>܀nW\25\7QT(.\26\7I%0wȧ\28 [nm0\27rD#F\19ߐHsXh\ -\27>\0!CR芤\24@%'qvhQsX6\\:͊\19\20\16Fj\2OÑ\3<\4&m0?\12Q64M0G\127\ -cB&kF͵(1\26hp\16\12\13跖I@ im|?HtV$E.*Mп|\17hHf\4a:*S\13na!\25oY\3Bsާt~}*K|t\127rRYNSW4\1@2|jT*)c著&\27#vTcW]_yBa\306^0<0SRi\21>Pޣ3,D,T&\135lI2A\\L\0|;%E>Q_8UGsAK3[\13\18J2\17I\22ܖ\29\3\26c\6g\31ʴ3hNա\29\127j\17t-L8\12\8\31K\14\19\22{B\\9\22i\23.u?r\31˺\8\45,P\17:X@\21\ -hg`|\\HLVp.{\30q*?\25G5j\31ȗ0t/Ȩr$e]\18p\19\\k\25\ -zWsΣVM-dyn\26ڕ\23cJTԈ\24\6VB]\8N=\16z\14}s8qѺv>a\2\14=\27PAu\\Q&k\24ubWB^s\127@\11GE#YY&\8fA̴G\3\00234QA\127q\29v\25ʚlZ 8Ij{CD[wv[|B߭Vu\127\127~sQ.v}\11ZOF94\"\30hvBS8].j_k\15\21!\21z;In\24=s\21p\5\9Vp\30g#jTQSТC\ -\"oZ*T\31d=iSjb9n6>w\17\20-\"m\17Vh(hd\23\16\8\2*!\17^\2tf¯׽A;\26\31\0021\8Z^P0!\127%\9\127WC\22H5P*8d[_VmF\16w(L3h,7~W%\7*EjR\17l&;V/K.m'T\13Ol\22\0I>Z\113\0Xd \8뾝\9[u0xEa\6MSy\3\30\14?\5\15cA*G-'j\"\23bi3\11D\0M7ܳnh\24zF\19*깆H\\~{ ϋFGk.f֧1\14n)T~̈́V\28%/F\15|Z\21{eS(0\0153\9i\\(_Sc26\24~<\18m)l\15\19ƀ\6l\8_&\23AôFeINe¼S\24oR\3\30Դ)\15ZNsP,I䙦[Y\23=\20[f\2\30l*&d@\17\9Ö\"nBY\19[`m=\25v\8+etur~\4~O\4\13\21qgn\21n}mwݪ\18\3\1B&\0005\"ު{p\17YFm-\11Uy\27Lm\1r4W\29hK% V+_q]gR\5\31\27Aa.O\28\15D$h^!$x\4S-͆MdC3e\14zN<\20\4gkL\90}@9Ñi\\{l0\11\9ŗ\13\18\0089\1\1943V<@2\6\21C$RRQ|3ƃJ.\25ZNRxzi{%BwR\20^x\22~CP'٪\2h\20EtK/\15&\20#9Vig+\19wi\";ZE֮\127\0VyMoH;<\13\ -\19u\11$d<æ;׍+˂\7D=T\"43yb#\20\16-2i4\2\22n\0249&PU ڪ\18I\17-omE\0234>\29\307C\18%\256\31\2u\23t\26UAH\11eڢnڣgaWV9\4t\16[=lrR~2c\0\12t[AXNFS:q9|\22*<3\26(\11*\317\8\27\81[kV݃\4FN`nz3\29#SC\\U3\5ڲ0&;w=\19\\סyG~\307\0057*\1u-t\30x\6Oa\26!\21h#F\19|\26\127Jp\7BT;\5\\2\25\7=\19\\dMP@\22eTV\17:(@-B\17g\15\13\29~P<\21F,؏jC|siF^%ԧڿ\21Bl\2O\"!\4̈NXy\30\9=6\15fF4R.ql\75CĴ#MV\0309\30@\19cJ>)\12wv\26ɢL;խLn?Ay5:tn\13?K!2(R\2NqѾ5\9\9\4B;\13ET9+aC\12̐+RÎ9\12\27^p\7gN-2\3afĨny-\16\13\29\4o;Y񷥚\127&<Ő\26\\>Pkk\7/\24̞2\24r7^5\28} 8\29jhkc/\23Ωѹb!:@\13vy{0-g\13`\15;9CD'yǽ]b\25}Q9ʋ--`]E.jb8>ф\27\22Z1=^\"\17\18f:=+}En,9x\7\9mpjOo\0g\23F3Cu@]\11&G7GL.{tdj7SOAex\22;Jd\127\3\ -\127\16^7\4LG\29\23\18a},s\ -5[\26A-FDa\26\13\25\27w;\5j$V\24\26 *H7&BGJK\11\4*\18d@PcgRA\24~ 듅'\73\12\02532\9K\30\8\12(\27C;VU]>r?\173--\15]H\27|Xoj\6k\20\21 L ۍ\22΅Ix\30#Sr\5B/I#dZb\20j6{&إr&\27%︫9ٴˣd}&_[\12%x\12J\6T4\127gʨ\20\30W_4٤o.\0;\0034\19A\20\78F ;_޿H&,\24£J\31l\27]{R\6Z7\28\20Y4ZH\0094L-.=-\11指5SI~‹^p\23LLG8- =KJ)b?ۍ@&m|7EA)$\15֢B\23N\0|^57eM.\6\11=I:gSX!\18\\V\ -\253ˠ]\14:CD\25:\21s$A6;hKidE\\%D+}v+\28T\19otop)O|y\19^e\26y&ܴKO\7b\22h+\7UG\12\8)8\24 \1271'Ι \0mB[RvѽՅ{\25//*OvY\0IFА(YJSݛ>\5([NmɆÇJx|\8\11\30/yϺ\25pƇ\127f/-}?\16^XZB܏]\24¿\9\5yUGk\19!2뾨R$6<պ<1_ @av8x͉]\26یfvV[Z?/j\1[i6Q\9p@Z̚@)n1@\1\8{)EEu'ʵ'\2e\27`C֝iN\0\ -;@hT\12\0$Rr\28\\V\ -g\0qZ\30*Zc]˅CM\0\21%cDT\28\0097USh|UHxrݟ}Uɩ7\18H\4YtDײ:M΄)^Pԥ?S{f\16\1B\3\8V5:\0193dBx3Ac(@6\31NFkjQ4hY\8KUM\0\6TD3v'%LHɕD\12\12Z8P\13dȍ}\127m-5\22'4&5.U&;t7ɂT.#ʎ\0095ʅ7*4E-Wl!ާIlZ9}x\26h\31`ve~Q\11\31n\20`cj\16Ay\29nPWl\26{u\7\\$\19`@HQ}a)߸mUry`y&L(9\23K\1\16f\31%،{\16V$\6SBU\5W?>u\15\31(s\26vl7\23&^OߋLЛv=X5\18\7ckF[\24\7Ls./ѣ\31:\29\127*~\15rT`MPC8\29q\11\27\27\6tBኂZ;rE\23p\4uy\31\17\ -͏\6\21cBJTM\0137e3E2\6_:LK\136.\27vIF+%b\ -\30/Blb`H%\26Dj`\20\9E\1r\0gWR\21\31j˚eUO!&oS`6F6\4\14Ϲ\3\18\18Q\4\3ri7J\27Q0\15ma\21p7>% \28ڒ\ -ug.\183\9\20\4c\26L&:TⱤt0&\23%\\\5\20\12p\12R\19\11\00475JV\0162\66^\0\19G_zfj@C>\23dyvV(UrB\45ﹸ)%a\0090BPpBM&\12\27Eg\7gB\8K\17\16Q,\0\11O\5KD(5\9.>X\11/z\27PJ\2eRr\15,\2WC_P\12̏XVPT/\17_˔}\1m-<*Z\12C+\23g`Y0nǢ7Y>=E% k}ૉ]2{7!\28f\3: W\4!6R\\>z(N,g)\26fzYq\ -h`:a\ -Eu\11\19UZ\0114*\3\6FX\5\11ؕ&_FN\14\27-r\15ݰJ$TR\24Zz\29\0225,\28Z/)ð%xF\20*hӴsS%\27b\16zC/CE\17^\7󠲉xr\24ʮ̈\26l\"\15ߛq\4\"\26\1T,\9\7T|DXWA%@-V\17*4XQWnT$G2?\"\7?X\14g\21k^\25E[;E9*\\#F\27h+3\29&\6Pw`bSJ\25\25BT%|_gE Be=\30t\3s\7>uO\2Zp)xY%@\23.WP(\2\9p&\26Ǟn5V\11;^\127ia\2ď \26\\\30DǶPW7?Lt|[2_\ -\31S'\0226\28Z~\5r݃\28A*P>*\7\28\15~H'W~U\19W>FOh:b'uՠo\3S\23<0zn1Zʼf\22ڪ/\11'!c@3e\29\19K-f\0h䓿^sSihjH\2:3\15׌.\11}@p',9oG9VHv9!40Z,!\21d\13B%NJgݎXGz\23-[.\2NX-X܊o^\9KIj\31g'r\27\0235%Dr$\14^<.[˸7arG(ͧ\14\18P\30U7lͷT\12U\12\\E:p#\29S\21\ -\ -I\25dW亮yAZ$bO*R\1\23.L_\14`'gMss\15s;a)0\3qBל&\30z\20w\4M4\26jywI@iO\1JQ#\6ٻ\19+\29\9Rp>Ŵ\21?-}`Rq\4͞`rr\20AfYg}@Fjc,aZ{܄ Htd\22\21}S\14a)t\20i;ku\24xt@km4t7#U~\1\19\5b3\2\17k\19*\3\22r\8/`\24\8\29[zѪy\3q7tV5yVxe(ZDoÓ\2A\6I\12\0245)]Q\30\3\20\17-s]J(qY\29_R7k~U\13\225}sz|\24\26k}7\6\2*|y$/NX,,r蚿xA6^} \28A[#?+[zyG\9j\18\30ᷦM\7A.\2;\17A,8viEz\26i(`dUC)9\23k{Mִ3>V\19\12Uk8Y:\ -\25JI\5A\3{(\12T\25xʥ\\$>&{򿈀\8:L{Q_əwUM\14%v&hC&\27&D#}3T/\3\127hd\23\19\17-_I!|?\30h\26\3Ugt0_94%[F@+8\0164rK]՝|f\25ϒ\21G\\c\6~,1,:sQ$>g̐Gx-)U\24Xd7<*Ӑuz^o[\4\7\31\9z\12\18\14]E9$꼡ۚ\19\4aƓq\27\ -@f&\00165|e|>jԺ6\26h\5x[vn&$\15\30^#\21\2M6X\8=\3\ -\17>N\16\19O]SO\ -ak}\14Pep@uK0\19ΚM\6\6%AU\127a\9؀n7\15bZ\30a5Gwjp\14ﱽ\3:[\288ܨtC\17Ac\8F+\21ʤ\"›\0189T\"d%O@_U\\&sQ)Wu\31j5|\27ƽ-5??X>\5_/Xd>\0095[\0190m~9T\11CXp\13G\8z\19/y1\5ٞ+]\\\17ԡb/+\9ZL\29B칪\14{\17\18qL(!H'>\31!qJI\5\25eb\15$\\ǹM-3OGEhWSBWJ\17\8\1J,\30IoM$^o\23^w?Nw)\24wԉ\18Za\21]\18\30B }\30\18\16\9dG[p-8fMI\18h\25B\24@V\5OQwj\0135\4\127\"~K1\21#g\"+j50\13Bn#6*X$$\127%l\25\7ҰҦ,D \13\147SWHp)F\16\0012@#j\":8\27Lw\1H\27Eu\94~f\27\28ϛ69紖}\27K\24\7B\ -hlm9\23<\152|\13ɍ6&5]ivX\15BI}{T(\8Mɫ\28:g,y\\E\14\29\29\15Yp\127:#Gc\29\\$<1U\3uц\30oy>c;势*'k3\7\21\\v=]C|bޚ|f\26.%m&\118\127;\1278\0071y5<#P\15Y:{?u\13i\5Pq.#s\31\31uÓ\20-ߥBG\31 p.TJAr\31p*id+_b7ł\\-l\4|^0Ds\\j\14kE\18\18\0T6E5#\127~c\27:TZ\"d(UrM\\\21V!w0r7*\28\9f\3\2tn\01147w+sA\7ȱZk2>p՚\20\ -\127\24I\4rYe\26\22\22ZN6!\3G>`7dM\7/pLh<\11,e7A']\3_.\29m?4fJ:@\27m,\30y@\8[\18\29\0\30ԲaLLUF\9\13\2C5dB\28\26l`$.h\9\23\ -*d7\16.Oz~9k4ii\29\27Q}ԔY\14k\2PCf}\127p\145dYA\15'ΈQ\8,K(\2Y\4\30UyR\6\29_P?|sjQNv,\18\3Z ْ/0dGq\\MC3|\26\24\0084LBG@\14\20[jlm\22&\15Θ!̒G'¹!.$}i(,T\13]=a> O\\˽V\27R[@n\3\11bqq{,\19,\"ۼŔrK\27+xx\21U\"ر=ɰ=?\27\16|LWRk\24'N\"KU!WD\1v!w(ɉqv8o\19|\19\29\15'\12J\19[~=K\27=;餐\29Y5_\16\0233se\"M?=XV+DWk\14j1n\21\31!˄@_á\25 UV!\4)O\27\30m.i\21\24MP`܇+(lyM#A׮JMf٨MLvj꒴\211\12LG+\29\2\5.5?\23Ϛ+pIeq/_\1ZU*AԹ}CQ1\27\4t0\9s\13l֙lf$\25)f\2(IT\7*y\\&_C\8䞛6~dk8#\21\\\9\4*dE\21;\0T\30Sa\213\13I܎|e\ -Pz\"m_-.\12x\ -\1@y\27z31tlۻiz\20k^\1eq\6 S:\7g9\28[\8\4a9\25q)t8\\_G\14k!F\"4\17\11Z\4B\19\1їiAs\24\25_n\"\27\20K\19\1but\25\31[ЛU!W\28l\3lh\1ʼ\18>:\27$A?{қv\27NO\28>F\17\14@F_=$B$1\22n\16Dbh\6!|+/\12\13cv\8p\ -bA7_Ys8(݅#\6moXk\16(\6\18f\11\2\127\8P75oSDV%x2d\24\18kfno΅˷5_ iq\24\5ȯԄ>\6\123B3\\E@\15a,\5w_.\28Z\29J9<:s>Ɍa\26-Q\12[&⊖\11>\0027\17R;\22ZIu\5Q\4J_i`CAk箐\18\8e\23\2$\4@ŨȨTSf\28j\6\17K3RukR=f\"d\4w)2]ے^nSaiz\16BU]Z&_c&t\5݌[\2\30\25$ \ -\1V2\20\4Z\6\28\16=ҏoFR\18Nn\4Ǡ#w\21B\1|Z\ -i!>eEM߮e)}\28ܿ5)3\14\127a&$5u&\3k):\\ܸd׼o\24q:B7XL\4iGi^\292x3j!8\24\21S\27+Yrdp2mh3ce\22\27>ygλr41Gݪf 'P[ItoRfy\20\13\127Ҕ\16oY4u\4B}\27$\17*}U\31=\127R^#lP\0044\23iY5?V\25F1\24\29Ft\0ց`\14\1-/qd9ւjU\252\6C8hIBDAG2cj+A\24Ɇh\27\0232\8Ep\27h)z\30\14m9YK\127G~Yp\23ohen@ؗȉU0\26mcNCdF3:]5,K[2ѳU-B-qR8erPv@CM\5(1B\19~q${u_\20tl}SуӜ2\26~S\30\")b~OrNw\9yEQk$B\6'o?\14\17\5愊\27gLZ1y\9q>A'vz%\11?bzMy871tow\1gſ8}x=t$x\127\9­=]sD6M\0\26uABЍ}~;%1\3;4t\13X\17&X\22&F\\8+oy Cehd\5^\"Ў\24NG\4\20\2i\17]i\1\9^c<\\M\ -\2ͥ9\0144|-I\30ibv2Bkz1k \28\9n6\8/o\21\11IvÄTOh\23<'\\{fL]\21ei`\13qMxؑ\18-0\18\18R­Î.+\20!V!o\25\21;huۉ\17,(\3\19:Q懎RqydV&\8+:\23\11D2\11ISb\0\0210&^4\"r^΀\26t\19;V\19h&\8D_\9qV\25Oܩh^|^)R\14!\20\7Z}8\0304\8gv\0Ђd(\29lȑPzH\18Z!NF.\25u\25\13\27ЮV\ -\28l\15T\"X\0124uQv\26\5۫w\28\23ӓޙEUiv.\25v .Z[Y\ -Ht͚l`\16z\18e\11S{N9\1\1hؿ\55(.,\127\18RW\315K\28x;_ԱZ.bVr'P?U*RX\5^R7\ -̠\21BL\14=P\3\300&\16hũ\15\15ad`sL@pL2\19\\@K|\20;F\17 k\2)]\27L'GP\18ud6\3GcPac{\13\0ٍt\19\9\6tr~`G6Fn\19\2澢J-jG\127n-s~\20^\1h\12\30l\2ܣá0jv#;r^7\275bG&| \\HlGMbۑ\1!\0\18S&\27Ԏ33\29\22N9]fA\24Wq,r[x\25mVgꦁ\27\3g\2ӱFT\3@^@\4\21^YgE}[\19žb w\22_QѲaTa3\9!DE$'?V\14r9\127l\13\11\14\22ݩJ~G\6\5#\1\19K\19p)3~@al3\25:\4X) brOz\14\15:=VaZ-,bF\20v8o\17ٕ|9B\23΃)\7sY\3aN=\26X#\16鈧r?Js\14@\29\5\28\9I <\7)\12S!8\2K6\28!DXǩ\7Y.p\16t^6\22VE#_'l|H#dTѺ3O.%u;\14\9\20IN\8oS&\27\151NY!v\26~Q7\14!6b0va\25 Gb,\2\"_^?s\1Y\19PRH\11qGߖZ\285`3=Fc\27>\1eipdR;6o_7u*3K{s\18|z\2\27C/\15JIFOlS\17h\27\14%V\14E/\27''{'^\20\28bי.EL\0sI8\\Z\2N(~x\4Rt,Ȋ޿\2mk_:Hٝ\27k\18Y\25j\27Ɍ\20\8``Od\19A/')\271;[&'dM\9c\8|\1\" \0022\12\28A\18UQ\4'}NWz19\1\21\16V̹IxSŽ\27IdΕ*r|)v\0\7u2/R<\12҉\2\\\29=wj&Ex{1~r\0x\9kw]ãBUhe\23^\28٤3z\12=\14U\18$\21Qo#\23\28]\91F@\12\"\3\19R!D^hP=*ì7HQsѱt\30U-\14xX'F6?H?hڅ5}Av\14Ȗ\0097,9?U\7\9E3Yy\1\21܃*\20䔽_Uq\3,5\2ɕ|JY\0u\20\21K+αFZ܍t4\21JDd\48/vFP\186B@O:2j\29,i,;cxJȾ\25MO[䣉0\250(Sv\4\182aÓ\12ׂW\25T\9B%) \3#\26aч7\29@\18+\0[U\23JL8\15.\14\16\11\18*۶rK:\316zw1΁޲[r/ݫ$܄Dhգ\18֜gt\6ؑ+ûUtq?FSx#G\26\30R-\16dhcx&y\127$i6\14ʉF۰\21\\)sVS(\17GBǥD\0134zBft3桁.C_\20A\7..A8\7bF+~/@oys\24=6iI\23\19&\16wF]\1278R\0Gp\26}+:P\7@P\1u&\15>\27OԆbXkOh\31'w\24‹\29(t\19\30\26e\26\ -i\4g;9&\3?6x9hqgE\11S2\7/I#\263,qM\27^\13)ͭ\0315o5\127Fc\12[C⮾\4Y͖@\11ȳl#ч+eCgk{@z\0016\23wBn7Q\0074*Ы{1Bd-C8\12tcS842\28N%=$\1i\7$\26<0-n\23\30Ҹ\ -e\12W6r\15\19\3GK\13OKƺktطr\26F\29\0054r-\\GB^\21>83+Ao?6X\ -AN\26[j;r􀀓!Ӣ訡Oq\11\26!=\3\"{\2XC۰B/G\12\29(o@\24ysEB\"+~_ؓ\15\\\6\4\13Kaj3ixP;\15\21\18Ƭ%Tx1'tPh>S\"#lgE]cDN\26\\l@6w>q\30a.\31C]Z/\19Wh\19Rٻ>vPg\18P\11UĄcxk\4\17c\17GI Xۤx\30„qS\17&)^{^\\떻\30KZ\5gF^1rL\0\2\28\29Vs\7^\20\12\4:!-ȁ\18W\31y\3cb\19;\24\26LԾ\28\22;YzC)9.UR{O .&!Ykpao\0012-\20\2R\1r\7\20[m\21\"i-رz>9OA\"\116+n޲-\59\8zp\26\28';I\8F\19V\12; \17.2Ip'\16$b?y,\15ha+\22HM\16\9\5U\16E?L^\2\11V]\19M,FZ °j)>m\25\13|C|T\5ǜ!,bug9@Olt+jl\14]\28\0305\9/CtDž/\28\9\127&&J>\\\19q]F6B~=\02676pggJj#6*\0281rNH~YU\3\18zY{\025090\277rCF\19ye|v*-lSR#FL\28KHȃ\26\1]h6b\15&{@O :\127\16T\2hF\28\15@Q4F=\4*$fǐK\13_3]X\7\7Jwj\21}\28ź\ -]RAVA\2HYG1]DF\29\19\4J\127T:Tܪm\15Ӹ 㨌,B\3 :j~Lt\30gD\28sZVtG\9\0050\20G\4kgFi\21;\ -\19J\ -\19q.C:#EK\28\5\6(VÐ8M\28U\ -ޫ`P~'='+C->.\25\127r$yJ֙\4}֩-LXÌv\8~{\28{\165@\7}w\8@}U\6-\1܌h\127wLa>Z.K٬Z\17\26\127}ċ:\"\6GW`?`\127hF\22s8ŽA|=r\30]{]wG\21&\269H\29IG\13$\18\31\30b8FE\9q&!T\5#\\qB&\20,:f\27\20\23{Ǵ)D0K\7\8\8Sj$\26et}$#Ϲ޿m\30Խ9GC\0095:1\0yi\20\0046aF\26>E:z1\28݇[j\18Ђ#\30Ug[Ms#Oؓψ~@n'!xV\ -5\16\13LJ1\15W}\3-M|2މMH|1Gx\29\246\\eQ\20켉(o8Ls6ji1\7\127A3\4$&T)\\?3j\30!ث[Dg |PU\27f\7hR.^/J6;8\1465;J0iMN>V\22v糆\31\30Ng\25JPN\127FGΖ3YN#\24|MIϯ3%>,t!O\6\14\230\29\31:\26`\0048m\25t{Pӎ?\15K?\15\14eR\31\30|OS\3\8\0G~${O}n]\15bb{r\27?g\27>ƕS.ӼQoխ0Y|\16\23<\127bS\18wx\5y\20!\5=j\26?ؤ@У^@zT\0260VGM(wH@\27#g_\19r\312u\11\14J\17\8\12\3\24bCĚGAy_1\0179\26\9_j\21>\3\17i\17}(!l\22\12qB$t<)8\7Z~u\15X\11\30YE\4\29xT@IylDÜϠ\5n^T+\22\14ó\26\16C,\27\127\"T\0\5\17Pzũ\23G\28w;m\22\2)$g\127\31\24'\24Q#%:yeGo\127\0173x:@{Aý\3\27/f", - ["filename"]="tdict-std-compound.txt", - ["length"]=125327, - }, - { - ["compression"]="zlib", - ["data"]="xڔ}r8\14S^53{#-yoeJxVD\22\3P[\9&\8\2b~:\18z\127__@\11iKV\8\17H_\12\127G\6?\31I\1277\6~\14:36b;|i\0~\4\ -_\29?\0|(Pw\29b?b\30y\127Q\31Kq\14J\3\14-\5bPɑc\0?s\8y-c\21=j\22\2}\25ۯ@\127\127dB(l\25\127~\9B\2\22.\7J\13 Tr\17\26!\3KC|4\9\2f\0\30>z?rX\11P\25B\5B#\31\12/Oj}}\4\27\15Êc\0266Z\"z(]K\\Cs\158&\9\21:ql8$\127\30)8j\12Vn!E1y\31\31-ig״״W\17U.y\127PT]fצn/-{?\28i<}*!\127MO2/\96ADZ1c\\&㧺cކ?\7Z9F{\16$2i2\31k_6\3t*]V\23\"bOByVnd\15[\14_{Śf\1B$S\31\26N[\"!o\0153+逢,G,\29M>,udETPӼ\3ORYdc?\24\27\20&\0097rV\9\30Ev|elIxn0tؤ&]7C.RT_Y\24\0\0292\0054f\127\4tfl\17mFs$=vÕ'\31\3\15\0172S\25\94J1|0 4i\12'\30[ތ\22qp\0250~:g骓FD]OF]\12\127W\1270uvi۴*퐼g)_D\13>BP\"uI6]&/\29\14\15I\13\277z\15^aYY/G>iWiV|1\"vd}FWls˒éae$z \28\30\\(4ŮF㮆-S\25MM\22,u2Ri幛\16e!\28?XNɂ\2jti\28nnI5U\31r+_kZ5iq:3r@=ʓ\17}3w@0)\7M|t\2(d7\31y`1Rl!XwD?I2,\31fHCn<\251igוP{\30}t/\16{I\7xM^A$hS\26%\6\7\20fR$W|q3%M^U%]_FeT,B\0ϼ#4㏱EaGuVn3H5XWt(Ti7Uc7`\21}lR\28q\313#+s>\23Wѣ\13}z\24ۋ~4ŞD>\28CM\7%(c8@~cޏ9f\27\02693Qg\11C\27%X?~v[\11j7k7xG`O%\27H.Ku*\ -p\11:g:Ч\4\127q\116\11H֠\29suarY\18:&ɩ?\5QaiPU5e\27]M\0264Vڤ+aK\30v5lnD\18\6S2k&5E\5ź'yV/+\7\7\6NcǴ\15)nBG\31.Gz\0033&m=Izi\24V(_b\18}Z#h^rL\71ȟ\22:\27}9U)sP\7!%\27X4/9N/&?/,5\25\13\24\4\6T\17LɆq\26Vƭ\12Qjq\25?%{I4\14e,j6\26g\31\25\8lyA8$\17ۍ\22Ư\29-`Dz\26-H6iඪ\0045VGt=(Q\280ðY$)rs)hh5\4)HZe9\18\14Uճ@Ҕzii;*@\ -Zb/\25[^ΠH8)3)bb\20\31An11\17t;[s*8\12+<-E\"(_\12#9@S.籃$>2i9pQI9L4]lbSK\0253f὎o]S\11;T@ɀݼ'\26=1oS.xV-X2\7\34{W=\19\27\1]V^9r\24k;6-=ػÎ3cmb-8\22.;_u\25=Ω5t0e\13(m$&I@j\21t\"(\6aݧa\31=\ -*e\13-\25\1VA6p&w\6\27}s\26:ͭR4Ғ\6w6x\17\0223y\18EފL\31'QBWAQ\24\ -\12a3Ba{}hsp\127\14G\127c99\8?FtK=\21dl1*u`\1E=ߘrb5sN\0198jNaYh]W;)k6\0295je\15L\21\21r\13zjvok0d\24Ҹo+r][Es\6-\0052.&\31QJ\13\13\0187cK\24{C\28\27$shYR#K\13\25\34snMC\13o[;ai\7lX\25XW|RL=+\22:Ղ\\n0r\29N\1w\18Aq+dãɜv\27\12\24sjxh4i\26ңV=uK#ٹ22ƱFP]\3\27&$nh/\3\ -\\Êx\1Pzݝ#Q\"\3 Á\9\17T\26w\15K\11\1qnC_IE\8jƣlC\7\15ey\13$;-\8RG%Z\233e`\12'PE`\ -ٕ\27gr\0127gGy\20SjH$t\11έf\2\"4Kn9RcX*0˷!Y^kyX\6\127Q!4g9R/\18gǩ21aHKȚ]L[dbg j,A\00065\14T,D\20l\26\28F\9B\21gk4\22:\23gwa\29y6o1*g d\4EIFlI\1]2ܪ\21ia`\17(TO\9\7:k;\20(ƚZq.ݘ$BubSӣ.\20y\22\4{>;C#޴ݵ1g\0174M\22Q{\20+UÛ({Sm\23Q̀邭te% d\"*\28(Ep+GO-M-QvҭR[.RJQ¥V\\\3v^'44\8\15j&\27S$Gj\29\1X;'$1uɎn\11$.\4b`…\0132*x\5:\6\6\17(,>F8,6Dq*'cuxl\12\9=\11u\13(A\1E\\\20e\29\0015t'4\"=\11\6\30iQ_A\130|p\127jmh%r\190g\13Or%\29\14Ly.\14e.N\0138gu=-'#مcd\20֯\7\3$Uqy/1.ۀۚf<&\15c%=g\2b\15<\29\28&Q*\21/SJD Q'EY\29rVCQEq\12!\11r(Mq\294q1̝IK_\26jl\25k\\MH֐V\5!V׊]\25Gɹ\1\11'Ae\29?\9LQ*E\186~!{ۜM\3>\24%#hz2^5l{0Qs7wP\31y\0!\31|\29\29\28CP\21>:p\27/<\ -vP\13\31zq\9}20@\11C@~A\254\")]V_\3']rCp̨\30_-;)\29$\7j\2#aQn\21\7KKa\15\29\127[\141,~cE4]Z8R(&\ -'协\21\9q\11\18\0196\0134\30\24뚵jU\0204U[Ww\0x;пp1\11)8Tt^\13\19oh|k!\6\12+\ -o\8__\8/^y(S\2qY];Ε{qQ\84˯xT6}M_R\9qq'\\8l͍XppW\9gZRIc\"9G'5\29y\7WhY3C=A~HǭFzeWH\25ݠ\17H<-3\1S\13Y`]\127BAt\0057:ކidz'v80E}&0W\3\24\25cVp`aW\16\5#\30\307ٿ3\\8y1\29\24ۉh`Gf_\13G?9\30(9IC\6\15a\9\25sS@\8c|\7\11V\23\6\20=j\14ءc\19\7k7ե\22\12\12G.Wm\0yġU\17XJ]3TONm8܏Z@RM^\0<\30Jy͞\2956C\20\19o)(Pizy\23`%>\18҇;I\0\29A\31\ -=G\29W\"brI\127CNA.\7\8~_Lo]|iȕ!syG/:Ep\5w,F\"q\31\20t<#b!'×\4<2|%\23P_\3\28١=W\26#v\1u\11\27͂#<*'gԍQH\13j\0006\\}Pd\21v<\"\29x\17 ]ZkY\5jv7.œ;s\17z9k}\19cͨ\17v\8t\12\20`\17TɍE\15l\29wX\26l\24wbaKϗ2z3u(zOL>*?ޱއe\5`^\29\30\0\7!̘\\\24ig(T\12\17H\9WE|Gk#\14c>hgV2\22\12,\25X1!(SJqI\17f$f\20\20j\25u/Fˌ1?\2\"\21ki\0\11{\17(8N\9t~B\23kw1ab\1\6pƑ\11&o/0:\6_9򚙷TERH^e&cR86'nڵS8D*pfd+\11\22cE\30Z%(\"}GRTèwWw\31(-5+F26\24Pư,mo\\o\".Se\0oE)]nd\20\24\8exJQE\\\0262hYD\21n\25-{A\9(-/W-gY\"V1J 5(3\27\15OH)o\28\19.Gn@GYGFg(m1\18E\5t\13qY,nC\17j\15)j\6CC\7g\14.8|\2ab;l\\>\7AAų\24Fi\15\26#v_-RN\30N<Ŝ,ڱE-\1\17B\12\24X\19\16\212cp\31ԨI2\20\30\15\16hJP)\0S\22\28\16\1F\15qBsF\13'\0'y8`X]@J9Fa5ʥm8-\ -s7i4Azw\29V)Yh\25\12d\6s\6s&S:,F3\25\12P\25\15\25-WzI.,q4ĕD_+w\\\"_pCDw\13\26V\13I\16a-0g%\127FA\2}Od&!\18\ -\5\27O\\]\"A*έv4~1gla\3\4\"\ -//\847I7a{\13z\5\25לś$\30ޣ^{n=l\1,8=;CAt&xS\6\ -\2E܊{\30i{\30O{4W}\3(\9WK\1@,{;G>\23յ\0t]Gw13j\0h\7,(\7{\6\17\12\14fl8[\25\18\25{㙱\25ڌ_Ƙʌ]\31\17L^\21\1b5\12.'x\4\7S\\/\6tAj{`K\20wu\22\24o&|&n-؈'\1k\6?9(̔\1TMgiPK6.3-@h38F0W\12W3v\22sU}o\0\29On1Af\"\14/{{ԙ]\ -3t\"3\0253\116ޣ\ -*g\7\0073u1\6\7 \25!8|[@>#\24Дlo\11\17\0210(̝\31\1g\16^X@\26D.\18bt!FW\0262hg_s՜h5\23;t\0031\12?\28_\20x/r\0X`[v`X5\14\ -\30\21\30\3?Aʼn_\25{\11\0P\24li5\31X\2_}\0266n\14\\8\13t/0瘰\19S=\ -\1܀\1xŧM\31\\Jm-\23\19\ -)&D\21[c>̃υG߂\5ս:8A\"xD[:V\7\2\2X5nƚT!\28\22b!T\"t\16Q_\13\"\28D\4}X@\29@w\17\14]44[ql{M\16e\ -6\25'\\D<\ -'\25\3\15+(z\23\127\"\17^L9|E:ǁ\19\127\17`?\15\\y\"}P8 ɂ\9O~\9\15<\12#g?l6?ŴF\12t]k^Qj\\es>wq?wn\0179cp1L<\12FPH~X^W[䠊]4$5pɟ?&&͂Zrk^x\19p'4}\14i\14'k\27і\27\11,q\\ZVcŪyR/s/)bE{\21ڨ7\13a2hf\23\20]cM뇹?w^pHDpHJpHP`6k*$\14\0k/X(\16͹@쥎d\28Q}ٱ\26\28U͊:DGR\7\\\0253K&Tz\25$je}l\9\3G*5.1(Z\7\1\11\31d\15x\0+N@6b\191qKP9\3\7Y؝L\6+BޤO;tK\11`\27_ 6EY'{z[\28JCS\30џmKD\0\27P\1\14*\31-6.\"h\ -_IKyd]xpAs ~W3EzLFu1)\\\29\11\"\18\26\17\13OÝ\29He\221`/_+\11\127rayi\9`\1\2|/o7#<✢`d@\27\24>QN\25q\25B\21rA\17i\14q\20#G\23\26\95\25zeyTb\27\127\6\6\8[\27|\172w|JOP\7\8X0F{T۽\236$2\30ޣuֹ-H\1܉\19zބ4/\4E98I\24ʡx.\8bs\2w\11\24,px[x2Kk#`4E͂\15]ȢJߣ}\7\25܇a\20\11V\22`@\23-F`\8(f\0b\20\23wH=B,Rȅ@H9Nu\ -LQ\26\ -\11Ta\30\ -\16%K\20.J\0026$22\0110]\11VO\\0`O\1\11qZ>\127v!O\6E\9\24X\17\16m}J\9\11\13I\22E؝\22ak\11F\\*X4Ȑ|\24k\3@e\127i܄RF\0091s8\3hA\18a)o\"aw\22@fs~#@Qa\12\7Ԝ(\7_ \\00ɣ\2>:\29\11\14#X\\$\0260/\8EMu\9\21\30]B\29\4EK$8@r\9ϵKK蒴AdW\0i\26|Rؔ%\3#Bg\20\31\25\6A.^\25.\27W\1KL#;%\11\20\1\12T\12I\19\26~U\9Oh#7}{.\1v\18Uӳ\16㥨ſ쇴\27nq\20,\24\16@h0-T\25#rZK\\KpK%N{P\18M\23j+/vK\17\22ѣg\18\24%\30`廱\27$\16*\19m3\9k\3KV&sGYZ\17\27%?`xA\11:Dqm\29\3(څ=?.E\2rq\22lKᛴ\23.:JRMZ2QK.Xm,!*-\17sI\12/G>$\\X\6/RuԆ\2rq2uf\20۹\2>߭i&LjmYVqm*s%E]7Ǻۄh\26yD&S\0288o&\25{%c\27L\24F]ӈWnZ`L~\165%a-\157@L1A\127?g\1?\2-(*\28\19ta\6z&&X4?橻\17\20ِ\43w^6\22\25K~\1M͸\25{u5:G!~C\19(cs$'\ -\0253O!\28*v/g)\6*y\1\9My\5TpuFgL-I\1t%kXQs.r\0SX\28Zy\28٣\26\16\26BL~G\11U\0]jYlqQ\30;*rE\22(Rm'\29rZFccu\0037ߌZ),\14\22;$lld\ -whѲ\31\0\12M\"'\"f<\15\2o\23\29>,\0250SU\22=\2\ -5F\0r`2|cҞ]:^jQl5=\0;G*yj7\26ђ^s*\11x\5\21ŘxH\19k‡!\11\29v\19_I՞7\30\13w@twpK#5i4&c\25M@ى*\\΅\15/Y!w}\5ōV4\0276L4\11,)z7X$\"m\28KLND^G9OP^˹<#3cAD'/.\2c/\14n\1\23\ -OPm`qԖDh'ʠ(\17M_s\"į\30ەP')B4\22-\8\25BSp'\30X{\22mޣ7z^TIo)Fˡ6.5Gܲ\14\28GnT\1.޵\22\\Њ\11RqVԶ;\307\7\27\9mϯ@3MO;ט\25m\8\14/\1|\18\3\26\257,\27=ބR\0*\ -b\2H5K)\9wTEA\7bCq+\6-\"w^\30ڊnȒ\4sO\3+zu\17\16g)svrT\"\16*ؚ\29&r\13b\11\29oL^ל\24G~uc)^\26QpC\ -D/,\23U+%nQ[^\7iihr/\28$\26E\22,wiT\ -4E_l'~Eۦԝ\29es'K9DD@'i\25å>\\c\4\6eZo\8J\"\200%D/o\22A{27^ҽ$\25O\23KC;\31L5$\"\29)TV癒UEd%#!\31\3\1278\13\0_]W\25j\ -o\11\2m\19\26\5\18V\13jH\ -\23PZA\11}I\\B.\8(%D2͇&\\\31$?aˉ\23\12+2Ս\8ٯ3v\29)\5*70a\17\127\2\23b\17Ŋ=#XF\3RZ?\6V|j\71P\2\9\3RC9\0t=b+w\21:WY\9\7ոr[vŮ}Wr\42` cb@?\26mxV0\0#t\15!-l\20p0\12}(Zh\26wD\23+ײg\6-d\23T\25J\127Z{\5\"F\1=\30VrOx\5[\2u\28x\11\11\17\161%IdWu=TI\19˰\18D\18\6Tl\8\29:]oh8k{z%HѠ̇\26r\13s7C%M1z&rDђJͬVx4\2q2\8\21\7\\h4{j\0074\12\12(GJ[L`\\oʸ-\17u\22\5\21WO#+?NrZT7Q~a\31Zf\14Y7\4[dl\29!@Ms\5V\21s+~iyZY/\21C3h\23@ފQ\25B\5\3%\\WZfjP\7]V\\[|t-Ʈ0aq\11Glc\2/aB\26\9?G\11#\19:\0203\11?EA\11\2P\\Эa5\22NS\26B\113a\1p&\11j\",\6H-iM~\0133/Q ,tkyD>'r\30z0Ki3>0w}C{\4G\21帩>\0085֤9y挮\1MU\24\30D^knP\0069h'6\0F((\\C\25d-bm\0004[Qż5\17@H\13O\18M5k\26X杶,\5,8e8%B\21G\3]\15vLSX\31/\\ڔ`S\24j(Y\5*6^(R\28B\25HB|-&\23y\7\3 kHw=r\27\31i)g#(ӏX\127Z|d\12\0124.53n\ -\11E\22=Z·\2T\13;\7xKuZ]޹7d\20\12O40v4\00595]d\8s˯i\23\17:ԯ(b\25T=&t/\0\21LCPT9Q\0166\115F1\25.d\"x,mQ\"9'L\1\26\2>9p{q\7\29\16\14\9p\\\16^\24j/\26n*\0=&n\127'ú\0011j'{p=\ -\1\9\ -ƚ;1Y\0CGD-C\10N5:?sCۚ9|\7KLѠ(\"LjGG\1}\25\6\18Zq\11\6\14k_\25;R\ -vA!+:\21\25]F*|DTN0ppxw\0\9h+\18PZ.XE\11^v.ZfE,:**\25FEwnj\11'ɭ:A\127\6Ѝ8И\21TP4\13e\19\"\28\29ʆtxOZӁ$gc\4}-3O\"Etx\9ę(\29\17PЏ(\27n=@\3\7=k\246\13L_x\31\5?ƾ\23sseqob\12:“\26^uLVw@5f\13Bp\0:\30o|\9\127F\281od0\18|7V\29Q;ZCdv\26g\0062\2\0{sES'Ekwݯ0H0ש\4+\119:5g_;s\19r(\\\31\8E,\0]9Q\11d1W:Oe\24Q\8G\1^\9\24#*㘙G8אA5\2.\16HS\1\16=b\127`,LE5e\15r\8E0m-#\86au]Fܨ\2홎MXC8+\9\13+iT\11u\3@(~=fxaiˆ%^\27RmxC#φ?\27>opD߰\29E\0271*`3R[\16:\210b\367Y󏰥l`\17HT6\16Slpp\3N|\3؆\29l#,J\"\17|;4ܰyÑX\24k\27.)\30ye\27`<$4[@w#\18Y`d\0o\9>`Ef8-ײ\1Պa\08eoK\17L|mZCIp-+\19LShQS\12'\0127e\25N8\27\5\29x\1\20O\11\25\3\0056nt\ -F_.\1Dor\71pc\14OrŨ\26\29^sc\0P\23\3\2tR!I]Μ\9\127opN\22psAK;!=f(8Nõ2\18o\127K\20\14td\22.e|\23p\3XӾ!W]߸g`\0\30\4\0(Y7o\13T+/aQ[ܾ\ -V^\25;\9i\8e\8\21\12\12\30\ -z1J\19\14r99\12p\6\14bf\0255>\5f\28*\2qB\5\22g,\\L-\58{\23ip茄QwWBX\25\"siwx\2\\~(jPWnM\ -W\18~\2;M>\26Q&Vo3\127ItN\23h5\5c\8\29t9\31{~\9E\26\24͡ō^0.Z\24\0!P\1\6O7%K·5\5`r\4x{\14)^β\\u,\26#1o牼|V2ЊΖ\0>$+E08\17Q;'%\9R\6K\13vN\0073\ -\\\1t)`_&TMC1հN\11-}HN\"6o`wQ\301-\13(\127p\23&5E\19.V!\9T\0261j$VjW:ҸOj]te\19XA9\11\7g\14;ؤNQM\1[Q*\24\7\0050\22XtcL\13%P`.bxN\0F\13_.?fł)\24\\2pfuĎnh\21w=3㾞\19cLKzu:\30,\20>@v\5ԙ\7Mӹs\2\24MB04{t\16~-x\0͹\7G~DU=fo.훺\8aqjP#ج\3(V\20c)\30=K>\16<Σ>\26j\30X\205\0\4ibplx.$\\\18tyg^Yw>\5\7$*\14>*;\29\17^\23*BlԠ\27MkF4\19\12G\8\27LZm]1ŝ?csԎ*1\27\2rs>߆R\23g*BT\20/1쟆\19«?w̓r᪦*RXc@O|\23k;>.\\='ss\30$\25d9\30\"\2%G\23*ӺP\16\19{\6%9\27бY\2W\26#\21Oo\1E`rh>\4EVC@\4wcE\26\0069f\28j9vUW`Y)`fR%^\27KVok\6{bm`\21sM\23>ԩsݫ^\22sV I\9\0220)$w'9;3wQ\14kh\13'\\:;{ΡC\17#F\14s:\3HRPJ\149\\\21e&k\0\7\17$w(XD;.36WYc$gWhQkh0ُd(X89D*P:EY?\4(9tN\19zynH#h9\28\67q~L\12#`=2d\0254^J\15=簸>C{Y\\d\1?\5\23\16<\111^\17 .\28\4I\8\5!g|\6l\31^3GS^)ڰ1=\23gv\29Wބd\20\\3>3[H?\8\26_;#lZ3̥\2 \16_Cwvҽr\9̃\5@E/\938s=\3\135\24\17\24\30:q/`\3qvzƹ';F\17Fpϐ=\7Y8DzLf\6\17.\16:h\8\8o\11aF7\0^=CٽCL7SZ\7\28g愞<3L׬\293?z\ -|Y\46dxg\20'yvptv\2bB:*jZs&lj\7[\6U\"Ti\8D\25rw\ -`n`nl3\280\1&\1[\30EI\22mya-\17\23b~Bl%o-u3o.\ -Sm9\30\14[8yqL\3\11ހdXхV\137WښZ)\302<8@\5\21\0*@)8YeT`\"elKc]WvD<\11PO#(\20ce\29-!?\19/L\15\24\6my8u/\127|\11\9\0;-v\14\14\2\15c`_\ -\13%3B \2'Ҍew\"pqp\7ѿV)t8ni\25Z\28wq\21\"(7+3r9\18/ԐQPk!\\Z0|\17рMCbf0e\13nE\243\13l#v<\3m\18ב\19fe2\\o\17v\22^\\F+4:њ\30+\0250H\127\21\3w\14,b\11!6A2?\12@+\14Q\21?\14te\5tn\4\5@Pũ+\29\2{Es݂eʚaݲ\0o\0256E\118\0:1Z-4{-\31\21X1\6\13\12넸r2\14Ȟខ;Vc8h\29z\1;\26xW;QgV\1\246N_\16gN\29\11\9\22[V\14\28\31x\3F_٩e\20h;̂\29k;6VG\5ۊC\5P\26Y;>uXÍHk\0i)\0191\14]pK\1[:Ϟ\9G>/dc`\1&EaBa\9ou%\0201;oI\28FVFO.\24\5ׁ]|a@Yžc4?.\14\4VUa .8(ٲ\20O\4QB1\20\5RJ\13\5\6N\20S>\7\15s 8KH\30vA |U߲\22fV[{ٲ\22w\4[)يvȔ)o;g?*e\25\30\23nKS­+2ϹB\7aS\1\17\0205wݷb\22p08Xpf\26wrQmf+U&\14\11\14Qr\13ٕ\ -J*j|_A*\189-d~n{Eca\22hh^X\"@:%JP,[G^4\24z\28tV6Oxk\9\4>Ꝑq\ -\7Á4`ԁ$\7ڒO\22Җva\28`PY\9lA\15=\28K\11\0@r,(\18Sπw\6x`K*\17\ -#!\29u\16\127X`[6./-7>B\27VRԺV,(\15/-<\0'0pD\2u|<\0<\12T\12\4,\28!J|\21Q/\"r, ='_\"\0\23dusLbU?J_Hqӵ:մ-\21.J4Ҥ\5S;w\29\5\13-[OC# KEtGʠt&{!E99N$M~P\28\11O\16bwp5{\24:P\3\31i\\-s1=\11'.3\20'\13zn\ -<*Q:NsڜnM01CŘv\29%3\0\20:3MĂ[lo6,1\4\17\7M#7\17ޓ>JpN\11O=d\23\3--ơ:\6aA\22\19[<%v_h><5!/\"=\0X\27G-/\18\"BDŽ#^\16j5\4\22a\29\"g\30\27[\0Sja3\23M&\25\31\5NO\0zGiQ{\13~ychr\5\30B\21\14\19a\0Dy0o\30F1I\0\17\0) r\14\27x|\28+C/%\23\7/q1\18\19\13G1\127s\233T\8WYa}\25'\31u\4{Q\23\30\1278\17R.&tkH\28៸xA\26\19MaaLhr\2106>i=\ -aA\23~T\1b_/2tb+&\26v.kj]{ʗ\5+_\22:6\8\9?W\23T\ -) <%\16U3bu/i1\13Ю(A\13\14\18w%\127g΢\23)I\15>`g\18_@\13\18\127Mؤ\16e\12JAXrW_)\11$\15F\29r.\11qZp{!fO1\"\9o,c\22֊\17^6B\13\14\6|\0\12\19++`q\18Fv\ -&]\5|,V$ z;1$g\13BS\28;$t\3~eK?~QKW\31ule֟y8:\14#\22HZ3\2UAχ3ݹqPleiO\8}/kU1~fs\9\0317V\5\13\20\24b=q\31\28\24T\30\26EI\4$\2g_\6:.\\[l\11\3\1|jy\30]\127\21\11^2*~\21PpO\0\23\23L`YȮDJ1/\29D\14U\2X@`u9I.\13t\8ȕ>.L\22b9^G~IQ(\16mY\26uc\4&uG~M#6ιLa)ԥL\24Ɉ@3Z^r\0144ҿ:}r\22P/-[F\25\6w\17\21=\19;#_x/Dxauh^\\_Ô\5.u4ӎ*\19U\1r_)cQ)Q!\19a)nEO6;\173@\21`ܦ>\\Qk\8s\27\31R%7!$\3@WA\9jt88N5UJxH;\1oiZv'\12/\14[9wƏ\9\20WDɗiC{`Hm:nN\29J\6?[S\12_&˕X7\24@[HKT]͑kZbV/flsϼvu\13-|{\20=Uq}\30;9\14>P;[h\02800)GU1ΌH!QtA\1^yq:\16l\7)ٴ3!/\8>*\2T*\2[g\29a\8J\6(\14k$E\19cySօC\17)\13A(\127F;7\28ҭ\13#F(nA+\2hocqXf7\15hs:g}ۍ%-t/X`)YJ|e(\4\15,@e\19~Pd{\18%sY\2˨\3K\18\4\6\9Ek\21js0\0276}&\14Jy#)\13d)9X\23\26\23؅z4O\12\1(x-o!9*q\24\1:Dq]:&\ -Ƿ\ -\18R\15\17BFR4\5^\12\16Į@iZ\20:nNhWQ)\27i\29Ʃ5\81Q}\6J}\2\21uL\24r_&j[]:BP==k\30\13InT\7B9\19B{GPw2MTjV,\2\0vmA!\12\7kzHS\2FWUrvj\11:\6s簍\0275|\31\88m]\11\281RR\29Q9\0\21B\13O\19Υ;q\9\17\0ߐ8?t\15\127 mm̅z\22\2\22-\127cIώ܈?;\1׎NRmd[%z06j;y\3[\29 V\7&f9]M\20@r\9\28E'K\26-P:%l;\2\6=C!H5֋#\14l\8;\"\24c}&\30\24(\6c\24z\0GU\14xz{2=so\19g,\72x;ċW\0I%\20w\5o2l(x7AsZX4Vk\50_o\23>;Է\17\20;wk4^׫e|2e8Y \30&0\8m*\23Ì\11t6H5d«;^\21cCfnc}`\8,M1iG4MtU_\6q>å)h\14M(!t\21\2\27Y=-ڭ\24STP:Kf\24\19:KK[.:6:wL޳fmbGIV`x>\\nLgqnN]{cP\7\9[\15\24]Z{[ںsC-]O\14\3s~9-H[Z\16-\28\\8IQQޡn\2d2mQ3f<\25U:T-XLF}$R5\23zsr\24mm6NfMK\1\30>H#U\29QJx,9ۏvˑ\11^G[,E\14զ\5|VXǛvi\17ɜ>\28HQGPL'\27sjSV{{{Kl\14pI9!tGV\14>{8\23.`\11冻b\20wX~;\17pF\29ɮyű>\29\24[ \11X?K_FOu\1k\14g܎\9%i\11i\26_\24\1279qwzcU7Ov\13*\25\16\5\0293x\11\31jUN4bavP\8/){:j}uTD\5\127RHRLb6(:\\\21?\1L/X0F\24\25ppEE\20Nff19'\\\27_!k'\26+yz5=\9AR\5\29O\0086]Th\17\13U\58:TO\31v(/iҝ8\24xQE.\12£\22s\4s\20>:v8:ꏎ99>\127tcwZ;*Q;\27SZnE8N_u\29r\28tei\15]'Uh?#U\27\12Ǐ$\21G8K\3/H\7h'Pϸ`B\5MdR[vN6Mx֓Lv\14_\29Ickz\263ez\12~T偒\1\8L^R\9yWءn\14\20\2RҜêœ\12\27M/\24FV[MVo\5|\"L3\0\14f&{Y\26@5Mm5T-\21g<\31Ժ\26\0067\11kCx?`g}u\25}3@*\286iB1Ӆ\"tzD'wI;F\25K]j.9K}\27u\ -g7FT~\ -:7\0( T\9]C\"\25lwꜻuK\"Ȗюޞ3\5\29?\8Zi\0;Uj\0309\7{'\6\24F\24>XK=\0220.>\17ԏΪ3jBz;xJQJڮ\26q$\29v\8߹\0235v]8QaN]\26W}\25\15\11;r\0\19#l+N\22\20%67wOs\273g.~\24כ\19w\\ޠϰfinDiӾH1|Kyz]#,`67ƀ5\",0EIYr,z{z\20fqd`\30G0b\2864>#\242|b7\13u\0294s\21ޕ\\\1HTyc\19c|1y\20|RL@Bل^\17`d*KєГඑHJ:\15o<\ -)\\(s\16\18Ɔ\22m^]_@\\[LeIWL\19\31E\5V8& q@\31L!Wg\21>Q,\11މ\13\19/\\\15-Ga<\27‘шm\19/eP#N`p\18R1ے\16Ey(D-$:\20w!(\21>s\127\22\18\11C\3\4\199[5L\27\12\\Q9%А$\28pţ.Zv\8EZ0ʷ(3n܈={NnDJ\127F\19yzb!GσH=j栛F\27\29G;)\21W`{z\"~\25\17-^t\14PR\8^v\17K 5\8>tT:\127NC_渵)L-\3\24o^\23\7\31,LyCڒT\13*r+<&OI_\"P\0150OR@\4\2J:\25콪_\8ۥ'$V\21\28\12s\27hh\24l\"cT)\30N1>vYٹS\31yg&t_qm3O|@[\18ɶpOȠu)\13u\74g\15ARM>*“fd}\4qB-Ў\11Wor\2*I#+k\14M8\5jR)\30oa9$W<^ۉOnH\22Oo[6a<\26\28\13|\15lEo\ -qcu a\1ݨx^18V`3>szӗwY$\29qdL⇵{qEA7bJs\9nJx\29{\2C\0167u\0\19r*\14>߃7` c\12qG\4@_\31E(\4\6M)\9\30n{y\18Z*\16\9N\0157r\31]x=}IMDŽ3-\25;\25'p*?\9ާ1boıN)~ba/\24\11.[;M\22\30,\19\"NkFҔxABS\4s`ɮ@:\4]fxݒgi.G\14hh\5@\0055\3>\127\11gS@~LNd4Y.zxy&\16\22-AttL晢F\21Hr\9Ugè柵D\28݉R\19bI\11g56*n>Z9\7?PC\28\2\25VsϢ5c`\25@\21d\24k\3F\22\26֨\6\31@\"g\12mg<^q\25\21+\14ꙻ\13ƣs\31OB\11n5\19\3q.zơ\25Gg\11\2C\12rjB\21>#@k\29\14nB߿AS;<22yQs{}O@܀?xx庑G\36d}Z\12\29q\25FO\ -:xx.\\aO,V?Ī\22Xb~'\22X\24~ba'fן\127b\23?b'_\7\12sOܜ-OlL~\14}qÞs`LO\127:ϴD\15N3\127\12ms\18L$JT܄\0123.,\20\2ĕ\16í\1O$\155\6{6b>csL\13#dԙK\6\\h \13\5\12`\29\9}pw\ -\27m8n߆\28x\9$3\29b=\29!ʑ\26^(\16aB\14^dInpB4\1%\23\"d-X5\26qCіmi6r\22j|ZNJ\0138\2\30oMݤVPV۰\13\27%\3d\12(?\24(\4ai<%L/3SVA7,wް$u\2S\5Q{֚rK\24-HLu׈8q&^c˞Ϻ{|\1\5;\19ǙnA0'#]\15Q\31oR\12tDō3ݰآ]5lcFQ2\17_|Ʀ\22\15^bdÝ\59g#[\0285;mx\23ۋ+d!яLD\11x\"߈Dķ\23Gpu8%1%`o>s$\15qo\24\"qtz0P\16It\5Nb\12Yg\14?^$5\20$]m@jGIk\".y\19.;u\23N\1271\25U_\23\13/^=gӚކ\26Dާ.acRK;f\0097W=\30UJSҙ1u\29aL7 =snStק\5a x\21\31ADw\18c\ -1j'Az˸vP\19\127asJ7u>\\\6=@On\87\8\0279Icm\19] \17\27\8DԤSv˅b^6ME$En/'aĕqeJ\15F\3^ox\"]$l\21݆q\15@*\19T\4\15\9\11/*kyom\4ɭ-R\21-LȫwƟo$n-d<(VȞ\127繣e!]\11;xN\14\28S!\0068Y\ -\13Aϣi\31f\12729q;\27Wv [\0\13p\30;\14Iϟ>\0q\27!A\ -m3<>\22=fYR\25A\0c^\2\4\21v\31<16\27\12.NBa@\21/B4K\21?0,#g++ϊ\24Y<⨦Vt\0210B\\\28^\2e\8\1\25\0\25\0\31dq8\11M2?ݐʹK}]\0\31Q2FWl\\TTۑq(\29\293/|ڴQJ5n\22\14mqrsv)`v![c+ˠ;J\15+\19qRR/t˹\15丰b~p\12İ\25ujਯZh\26ck\19vrù~(\25\17y=ϲ\1?:]vߩrǸ˾2t%\17\0247;\14H\3;JzNA1D\23B\8a'h3tc\6)7\1(k$D\21\9ÉiNʾqZ#W=6\29qqDhշd]q.N\16lo\258mQ]h\3C8e\5Ս]?ʡ;H\21\\]E\16gvÐ.S~T\26\30qSB/!\7\19\21G[\9KeC% \6`\2c\3\11W\31ymƍ?,:(\31ؾ\\gZLRF\28k\4Q\0tq\11ަ\23\23ޙ\28L6hmA_q* \8#f熍7l3a=ܠ\127u\7$NPtPjịn\12o^\13\21Gǘݔa *X\17ik\12wW'\15H\4)0U\19>V$8VD'9+nǼ\17DkK\13\0237\0095رX$fQ6\4KK+\24\6C.q\29\6t#\0uXs\11w&tߤ\27kr\9k&\25dh\14\28\13j!\2\\\12F\31\21\\\19l|Ծ7c\11|\27krjnY\7\29KX`c\\\26UkTA-l*S\18׌F灜}\0174PC0s\9דD\27Q^w\19w\3%\13\27\25oUM$AXxDL\27\25g)\25\26\1(ʰ'hoHz좣\0263\24WB\16=\24|\15e\7e~\23
  • '\18\29GLH\31Iaf\6y\18o`\30O@\22\29']\13\1~7^&F73VP\3u{\24\5*JR\15T\2wޘ\24}dc\13[PhO!-\ -,\97oTH4\16R7V\0\26I}\1\07G^Fjp\27Z\\$\0011\11Vt+?+aY!KW򳢖|9P\27Ε](\3%\24yK\"\24\127U\19Tqo;6#I:O5b=~\11t^T4\26P)l\15\28_<@\21\50/Py&\11+徰^\11I/8\5\11\127!/_\\޷zmt?lF\19505\18/y\17Q\282Pg\20Jʅ&Y\0094\17ؼ\23\9\5׷/|;\23ٌ*!/80\11 _\5r\26Y4\26K@\2q\11Tn^b\7u\23]B\23\8>^D|\7*k\3o'\0303\1R\30Q\30\"\23$\23\27\28~O*q^1\21\26W%'\\J\23\11o_ ~q\24jaߪ\31^أW\4ÃK\15:/k\0236G{qΑ^y%zq/\9Ջ\21&<.%;ڜ\26?\14%ʅ\13TZh:IKDȝl\19fkt* Qj(25g\26\16V/\9\ -@\21W-n@\"`\\ &BY\19\12.A,\12-*ƻ-\17r}͖_J[\5#\\1g޺,#Ȱм;~ׯ ?B'<-}\11jINlaeItF\13T\14w_\9a0o\12\2V R\14k\14/]8\3\23]~S`g\\@\0k\5\"d/\3\24`Žn$\22:[\\\"lIǫeʗ 圹Ɗ\"Y\9P&\4i\9\20f\11IrJ5I\19\28\27\19ޒc#3\30`?[p\21,\25Z\6\25tKW4c\7I\28OZ7Z(SfV\11WX\11>f\26k2\24x'\\(\3\12:.+\23'\30!*\25\12z\191+0j禯F50z\27\19ð?\0/yd\25\19%֭oС:2\20s%Qn@\0{`\21\15SGAje\12778l\17At+M\25zJRkցa\5m\29\20f\27\9?\8Ӿ(o[8\0066\1\0%sJ[8\15\"\15>2PL{\14}a)Z(ؑoixOm\22\0pɭQ;\9U\0232>\11\4N;\ -\ -[@ܷ{\14$f[ZJ\12n=l\24<6f\253\8ʘS^\289s2\26qhS+pM\15w\127\6\30\17OD\11\2mX\"aL\184rѠ'\22b\9O\25d(CO\19\23u\245 dj\4o\3U5 t7\15\28sPx,ǨD#@|j~9k;\6堆\27=*&HVˌx\16|>\20LW\8\1cO:WZ3\18Lb*\5%wD^\4H\21>z\0.\11x7ʎȶ\1>\12 pb\8\19^ ]*Oy-FOa9T\0bJVb\7\17 \12W~\0185[]XB\9Ìíg´rbB\23\11'%-r*yPŜ$\0L]\7\21>PAj1r\18At3\13K_)'\21^\1\26\22Ŷc\28=\23J\15h;7:*\28\23\5f.E'\21\15_ԟ2\2\127qiWoP04W(xdO\1Sಜ\13\21൵J־9TsO9a\"f\30\"I\1r}E6GH\13c\44\26-\25\20\14T0)\\ļ2cr\0PwS\28B\\N\16\9uL&GR\20{=@\2\23;{Y)Mm\13lY\12q/Y綰ן6ں\25!adjmQoQ'S̨vV\298FTկ\3*\11\27KWxM\25\28.q|S'&'[B\2qs\2j%kWy`Z\28S\0e\ -RУ\183H\17\20\1nG\25oC1Z\26#uLآwآXGID\23l;\29\29NK-\5>|_Z \30&\17w-j\6ҫ\1<)hW\3ԝ\1\ -%Ar߹6.`63:ό[V\29\15\27I2))x\26\11ƙ?-*\74\20G1qlG`(J\4\5v\0\7YG\7\24\14\31\0275\17aGvB\"79i\19@\29Bb0YZ*D\18JN[pFE!7G.\24Z\25/\24\24\5\20$_u~Qyr$75/r:ѐxo\15E\17K޻.\0BLT*\7hFAP\13#\3X2e1ycm<\")w׍V#?!+)q,RmY\5q˸\24>\11\29o@ZR\18qϸb[*zgK\"\3\8qi\0130\5\1\13pݳ\0c\216ď;܆pFqաe:Lo8\11v\27:tݨ-*8\03100r$=NșX;Hwqя}\31\31Ebq\23r[Bd\127xlmj\13\26㑣^@m\291h\25ub\19k,&֍\25\13\13k\12\28zrJN\0156=\29\29?\11>F;\ -}p+UGEXz`?z@OQ\18\22}Lz1*26\26W|\3\19{w Q\7=\15\2~Q%\30ёqg귖>!\15w\0Qx9\3iɿ7Ǐu`Mb\127-'/(cVp\127`%wNR\24]N/v\212_tn\3%4O=?L\1FϫN=(v氮Yfi\5ҔF˯k[O\27I-\127\31QO\13;\6\23ϚM'%=\23\"VX\7pt^\13\14jV|(/^#\\zct.\16].1I\21O\3)3h,Bǔ\26%\"\21\\~߆\6Z~_\13s\21\9J\0dȩ-4\24g~bB+[\14\18ay%>=\12INb\25xؙDBAn\8DAřq\2.[rq\19NV\26r\255O\\\19!uf\2|\17'ٚ\20\11x!\19>*^!\26\12712\19\11\\W,4\15\22X\2}jZ:斕yϯo\5\29\23v\25\\}SLS09ξ6w\14ar\23\0142O+CnG.2\26Ow$>Yr\29GMds\24Bhc!\25^K&F\24`@;%\13c7\4\4FJ]LxMsk8;.}/`bS>\23&Ct-ÉH\14\0319l&ح';D&kÖ\25ġi\22\0:m]dؼCT/:4hF\18\27Q\13u\15T\23\27$ded7d\29BB o+ԆZ,+k-:[uɴ>ذ\28\18{ͭ\22\29J\6c9\14\29mG\28\21\31_eP9G1wp\30?n>A\29g#),GrEX5f)\16^/ޏ\23TZ!7I(*P\16֙y\23h \ -\7\0228P;)SOşx\1N*]@} 1A\13B.o\29֡o]\2Y\24C5w4\19\9\30?0h@YƾL\5Nd?\3# \ -d\5\20\ -v%S@K\15\21RUUJ\20\5G~,%M\17\\\20R\188Gk'\19>(\5\22<\30\18\11g\12_8\3\127\26g$Bq_?P]m`\9;PNr\9Ä>Oh\23#Do~rfֿD$\29a'qX\20#5'R,Xl\11ή_\2x\29nТFk\9d3\0h\77a&G!*S\6\0251\19\29*EK͘\30s\13\5ߣ(x!{4B`\0\22P\19\14\9\\\"\19?S6\2C\22 7m5,Yk\20>0B<1g5\23~Oͯ8\13)Pr\11~UR@V}\2\26%\13L)S \26g\18\0`kB\23\1658y\28uhPEL2u?3Po\25v\16s[\\\166\21$:a\127\3u`\5z(S@ZslD0]#Ik\0z\1\6rԎ\6iB邝&/.Qj/sk|Z \6\9\"O8d!I\23 \16\13@\11\ -=ŏ\17QͭPx]iF[\23\21p\2b/Hb\0002\3pLx4\27T\18\0170\21,m*!gk&,0rn\"[i\\Vvwő(ڀ`NU\24?&mE\0116IM\17)Bǵqe\14懶5F\4JETQe\5K4TiH(HwD\15m\29uA'\7\28^/]RVu(\2iOb$f\11'-p‰f5bF,kDN\18Ő\5\4\5\4\5$\5$\5.x*\144N\0\"\12.رb1Lx@HW@Y@xV!\0264K\24P\26-'ES\17\21N\\\20\ -`g\00444=\"\30.\9F\"ëHzm\5A`T[+5 A\13s|hLr\0072BH\14Ngn10ʅ\2qݏ\12\18r\15\3\13㊰蒕bl~\47%G\18.\16l}1\23\19vVFV%?ż\127?D6iطe0\1741\28Zl+M\11\20H6:q1VB4\0306%I\15#kT-NfL%%)\6@k< \7SO[\25\3BI7h&b\1K4q.`J9\21R(-\6\6-Q.O^Zfr\23&eBR,f\13|aD<\4\6&8\12i4T!4\2OU\11\11~!s\19ya!k@M@ŧ\29e\19\\ )T\2\127rٗ38jgA~\0ݱpcQ(r0\25\28\25+D&\4p,x29\27\25\23|,u՘2X0\25\15Zq1ո\28o[7f\16+2^;;\\7e\27O6'\5(sq\9\\5eͣ\3ŽÆ:>+~c\16}\0\127`h\5\27\6Ӄ&\\}lj:\\\"\7X\1\132^{$rt.B\0062\199A\22w+\11\ -yqF=6k-JF٩\288&9.yOZkǣ\20ݕ\14t\265\27R]J\26F-F)(\21o\27r1 I]׮jjWܩ}_ğT[\9bwU{|FM}3﹘{/\6LW6\30s]i&fٻ\21m(8s\\\18y\24#$?V\2~GAtwB\"\23K&;5n\20\16\27oANr\\TrZԒ\5m*#dΌ)\127`輣\31TfJ\9;\6̃;Ϟo {WlKg\ -\0009$&O|\63\30Qlz:kv}`6\\s}!\\p%sK)\4OjG\0h$i\22~,K׮͗j>A0'@o\\6qLM\267fF7I8\19\14\0271J)`27N㘱$TX-q 59E#v\0{\9\19\30CQ?}\13gך\15}q\25\13)\15!0\28Nx\ -\31]+1):>b\26#h\ -\12}K\25\17(\20i\7Rt06\9pGT.fv·%C[tV\22qûϦ(ykx\14\19S\6YNß\28\23 ݧjSM\20S1,\30G8HZU%[|mcHh*K\8\17\13#}MOv\26%֜I>shUUҎǜ]IŪ$\14iUd\18AKi~V{l6\37\20=\9D|\0l$on'o=X\"`=\18\0tiNFH^o|Ke,zޒ/\309蛕\6Me\20׈ux\23ҡflf=wb\15(y\198\11@oA~U+cP=\25puh&39U\85ۃNSW\4j-;TVQZEA\127BY%\11\18B%IЅ=%iJDB4\16\2z\23Q=Icrߌ\27\ -\23\ -O&Uu\27sS3\27X\15\"=[i`\18F\127z*1_8̫\8/\18\31~\16\11\18_\23NRZ\4QE~Q\0228N>\0:\20n\19񯡘[30O\8Uy8I=U;/\26nf~ʕ0\30̇)\1\1\11H\11&0qiߊFS\30sY1F%8\26O\27W+Vhc\21q\28yqXuO\27biy?\8\16/\7\20ڦ\22V* 7\22K*M]\26QtR\21J+JN\7l'v\31K´J>\ -ξPÆ7,-}\148+|&laX\5)F`\21^Ͱ\11z\0i\26L uoA\7\127(ľ\27(W:ϼ\25.A4'*嵊M\27\13O]\1_͛\0196T\24\ -\18̀p[\26B\27\20Kzc#ȫ\0ӟ\13޸\\_3w+\169y͉Oezfu\0135\19K2{\18=2L\9\20\27\2n8\27rçP>͊kz\9g\19l\23ZCI\19y\7p\27=2\4T\24\29[:k\0257\13W\12.>Hڑ3\13S\11ɹO\0U\276I\12r)r\22k=q\14ض뚳\5\16G\8\21t36gxp\21\"w\127#x\25's|?q?q?\15ԃ\31$BM\22y=^Ҕ\5?=7n%]z9\29\0\23_\16\5\21~A)/!Z& \22⑪kw\0021z\5u\30E+ܹT|Rɝˣ^nx\25rg\19+i\19WC?Wp\20.\5poScd\0058\253~\127i$^ԚZS\3\127m\3S5Lcq;-=WWt\0095b{zͩ\25\13H\2$I$؝\23\31.I~ݘw\19[wc}\23dIw)i.NM\3HK݄ˑwg:[1\15Bog3;\2r}VkJΞ-[Ҋ/*\\U]`_\\/\17J+8|tCAE\25d\29Ԝ\223J*\27N:(\30\2\2\25F؁^σb.\5;SIm+:o\26P2\24?Ip\17Z^ֲ\15\13\2u\7R@6x\24)4i@U<\4hPF/yQx/\2{+.;gw\25y1\ -O\25\22**>NT9a_\23|16o\0=繗f\8gf\4\11!zc]᪺Uu\5\17\21- \11p]n\28؍(eCp1\17\5\17\5xEJ+\1URs\9\14\01991NB=tAc,0@\1278is-L\6TED6\5J/^pK =b[\15\0289D.G,j9X_N) w]\7.\0054IGjO\8k,\ -\1I\5L:3aT\0\14\14>jr?;\12rQ@7&i\ -4'2.'wP.[+\0wZ<=j4Sjћ;NH\0to@}wn_q=\0T{0-\29dv,6Ќqw\12RG\30\127j\0n\5,ߋC9j{\22:~\1\2\11Wz{dK$ީ͚el\29:\14AV\17`ˠbPMv=KNnn \11\19%SQZ\15œ\22'(Y\1g2ԜQ\16Ph|\0135&MRUEf4䙃TA1H\28\18$\19\12ոP9\"5p/=tQ\25\6W\25vƣ\22v?q)fQLfగ\23\2FוKqY'əGf8$\31V\5oU0\11\7\7g\25˼O\25(yZuO1\ -x.]d\25;e\7f\1279~gƙsnˌڟ\19\31\\shԙDfBk'H\13\29\21p=\11ً)RA{0Lzm^;3\25E\29IHi3T\20;c;x1k}\8)'R;)IS=\13r\23=$2\25r\21R`\29\0075\26גQB\3\7THS)T\26ץ\0268jV\22T|3O\24U\0267—·o!\7\13\28$:Nا\9SE\1Z\3%e;:YD'ʜ\27[:\20NGRqӛELbi\5`}-s!\16<\14\12SJsFmH\11^\23c\25cD%gÆ8_\0260񘖘BL\0\4\" Βg3\13PskWEv\31D׬I2pm\16uᾧE)[v\13\30Qbly\0m{t~W\5=p!o\15DB]\8y9ab\16D6ۦ\27;]b&2G[\27\6&er:39\ -:R\23]\14t h\24V&\19\209wX#'0~aP^\24H\21'\14\13\30,\16\26\7\7S~rؔ^G\18pxK0'\0168|OU\24T\22 -\ -\8)\3AkB5M\13x\21\2w+{\24f#\19\21\3(\15;O_\9u,yT\\ZJ\20\11\0r\30wbz`ܫ$#\26,`drZ\31if\21\ -)Uc\20Vv8bi\21%I\24Rto\11nY#F\6E\11PYAӔ\15\127tU'(\29\25\2382Z\17=Q\6YB\ -[m&\129@Qr\3`\21_4v\22_'\29c\11}':\6DrC\17\4:Nvgk>\28\5켖YÌ5o\29\21TOz\20\0044nKى\2bN}0u$2IuJ\26YQ9\29f<ŸqGKf?\26^\17!^mx\0\14z4L\31S\29ereoa\21xq.\13\1lmJ2m͹[lT#\25K=\29WJ\\t\"\12^zls\25\9\29\25.Nh\1\0#\1\22%-RrX-v@b\1KNJҌ\28$ksSϳyEwLI>\13tVenM{9\6W\11+4\30lft3p/\20\15pqȉ|l>}ҝT\2666>G'b3߈\21f\11䕊Vg\22KxuDf\1Nv3z55a|EdY\\(>`ު[md5\9\23o\127[z,0+y1IejS#fF7u<\\|Ⱦ\5\23tokt^#c\29\24'W#X\0sڌ\11԰r*Hiv&8$H]Q^N#\13\24L:2o&\5v\8E&\1\19Ncc?\26\17Hd\28_9̐Xq'KN-z\19xcnh\7)w<\6\27\14\9O%fG\15.h\20\"S|n̊;\22\22WgVgk\19\2Q~\4s7Rxt\29\11\4Žo\13\13_|2+@V6Q\28#w7ıy!sTst'oth0Z4H\23tV 1\25F᤺\0;+\1\2m\127pW;\1\8=g.ԨڜT0}\18;HHܻ\4ԑ^Y܎\1@qyƳ3V\31\6Ne\15\30ۻ(wzd\\\25=8X\5_s\28\29V~̌9[\0307\3D\153.vhȝ>3Z1aҁ6\\*\27|~\7/FH\2\31\6r\18+\12^Kdbq\20L{;QD92PNwgƯ݂Ő\17I+\24pr\ -~!¡\21\4r$;\82-\23u݋Hv,ڱF\7\4\4;iʅu\25j>%vv\28\28\14 vd,\27\22X}*h\25tp\09l\28\0141?\24/K \20'W\\3:<\23Unpt8u8\15p\18U\26zf\20\26Ql*\27\ -U`w1ElFҹD/2P4\20*($ezr:ƍBI\25=OR.Ϊ|r/\0004h\6@ɾ\17\17w\37jа|Is\13k)~\19\22Z4\26r7|Vj\13; nx\23@eEFG&V35j6\0\12@\6\27\26j$D[ls|՟#=\0154H`\29*\13wN\30\13\14\12)V\31\3\19ndt[ɯ;\13\23/(\25j4rChZ8\30\6`w.\20N\13Mt{u\19\7\15\17pw 39'D0?yܑ:.U+L\5=!c7&է)\31\13\15;\9\4|&q\20\29cL;c-A-\263w\6=푛\21\68f\4eP$u\27\25(+J= 7!\15\12\18\07G<ܓ\8k\3:=#u X~b3G+\6\0124\30CD\28\127zWxʻa$@\27i\26\\ٍ\27j\6D}\25b1'{\22)ՓnN\29H#KS-#+y^屺6\1644,FoHSz(\23[)fE0'9\25\5\15Ԝc<6p+\0288\15(Y |܍{\27\6\4=x??Ry0>UoȊ7Y^:\9R/~eʙv\24\"Ӎxh\14\"\5\19\7\"\18\5Ŋ4H4\15Ҟz$\ -\24\0@\24aCԖo$AF\25+U{K.9\22G\5{K\0038o$Ą\28n\28]J!\23\18\01955?<湝f\7o_CA7Z}:~\14č9\30=\7XUx\14QzmǚW:5k\12äI\7az/A.8\20\127`n4tzg\15˔d陧'\\v:Ziakt#\2nƒPk#AΤ[^k\30\21\\k\30%\\7\"/A(l\\^\26r9||,<\ -k%3M\6\13{inK\264r\15hد\5X}z\21w=f\15\1ßSN$>I\0r.7o/#}EҐ?{\5jCeX\1AzyuLtF3.Id\25\"G%9\0288;@;\1U\28N\29\31&t;\29.*>\4y\16^tbk],cւ\14#-\24ǝ}H a\20\28\3;E\20+\6F/\"k 9 d0>xg~+\21\29^\17g,[mZK=\9BAuMV\28ߏ\31\13&^sլy_[y;?\4}\15)LyE\28\23QA)R]K)x =St*ώ0\21ٕ2{\240\13xak\13OfG9U|~\20ɱ\30[c9\23~|k\14ҝx_!g\14\25Q\7\27\9\13\30M\18VL\17\20c,:b\30+\14 ;=L\00723D<8#\29\7u̫v&\3Uԁ\127~.g7ά\31;3Zܱ\17\6K\9\ -WvDn@=9E\19|W:S\288K\25\23\12Sr0\84NݸMPܑv\4\1273\0131NSL{=&2w;:R}Á{Gi6-,{np\19zr28\8c\30\24۴oe(d̆YI\\ߊbww*UL7\29m\1278<[5\31n_[ P\24ߨ=\22\127%\26=Ȝ\21xjT\28\0j8\23\16x\127RW䤤Iُ#\8̮+0\ -(gP#V$$~È?\30U\6xkRGHjhq\"%D\\okF\27gD\7D\ -)/2>$x\17R&\12\19Bڦ\9aח\127&\21\25MztkwOr#;9;\5id}\16(\28\3%\1\194Jy\24\\Y\9!M|H%-a\4\30x&{\24\6C:\31F\4@~\127\0245\14G\26\12g['f\"*Kf\3%yrY9~$)‚?}sf'O\12\23;v‘NW![##:\0290\31DL\24vxN1e\28c6T\26\31\17MhVMFݒ뼳K{r}v;U=Qk2D;\0w\30۴Mۦ\6E\12;g\223TNW+B@aDl.{|.\13TR\19֖T[}ߙ,\"P;>Dsۈ2FI ڦ\127ػ\11\20nW\27*\14\17~\3ܺD=~y\3!]N\25\20HZ\18z~\24NBo.閕\28Ϩ887\17S4d9E$ְ)\23I$Z\1*̤6\27V.oe{x'*z\19Ұg\5Vl/s(q\14\16\21\770[\16`F-˻Zu9q|wCyBfx\17)cF*\2e\14-+gu\24\23^*h--]ry\30\29\0133WT.\2iR:\24)\1273?LDE,ܪV\0213&\21\3\11̑y+\26\2ɼ\26nܞ\27̒:R\1\11|jwf[l4h\20GG5{[Pu~+w\19j\ -1[sņrŀJ枭U\20\2ѣ\1\27\5\6+HfBF)\30ZTc-\20\28L9\0139/\8G!\26XϿ9\37Q2n]w\127\127*\5G+&\27hA*i(0\18G!EIә_\126\993\20%\23J<\24|\9?3+%Å\21\3zZt\\ͩd<2B\13idRTTT:ƼMC͵O?l磩cD5`&{[;l\17:\231\20`2.\5ۓ]8_1I\127\127W\30\24\299\25oY1Hm+\8\127;Q5X2\127J\0ϕ\18tkKIX:V\29E\1\12\7wiܱ#<;xnh\25\4ď~ѹ,y\31f+\14\8;Y”n\ -.ɣ\25\29\1ǶD\26ܠ;{\\`P^ܻ\30%\ -/\16yWzF2.F%+=tLI%\5W6T\13k<{\14Z\30#q2]P\6_u\0124KRP+TQ]/͝޻M:9mpTjTg4y\3\3f9\20Z9z\15IՂ?<\\G}$y1?hGjC(\18IsY\9syxl^<3`\22T7\15\6Ov\31\31|\20\7~?|<皀\16m\23Eަ\"^\17\3=,*\3X\21\7N|=/\1\\\02717^;S\18{1\24gP̥\20R\6pu閦RܚW&}LkDbN5͈\29V{0RL'7ۍ{\14\16\27\27W\29#{<⧎\20w:6\31\133ƈ\18Njc\8iu?\24UʸM[\4ҭ2y\14Ν\30f)k\22id\28&m6HQjOBH~j.ef)h\24\17tPYK^)NGjN쵝/씡3c1;;jmμVG`f\25;wV`>P\127\12Gt7L{g\26\12J0p=ÓnS/-]1`ww\\\\%g\28c\5#\19E8\6쑂\1215hh|/sAu0\15#EZ}5Tqr,gs΅\28\23\13\11D֍>Im\14dxGO\19r\28|\6p`f\12L뼄9\127pc]4\8Iڐcֈ\ -g\26\17X\27\4\17n\16YျkF@\2}2#6EC.Đ$Z+t\21da{as\8\1279slj\23_ٷUQ\0136?9s_\"p;``\"6!z7q_G}[\\A\23KsK6m\3\127L2\"V[)+:l\16e\13.]5URĩ\7R\19\5|hOiN}yᩙ0Q3c\27ƣ\27m-\3#!\"\4\7C\29/\\-wCJ\12;\"04E\6H\24\ -(\21V\26vk2$9\0'\15x,58Os\\r:UJI\31<-|p\6]Lb\30M\31\16O7O.\29iTħ>1y)\ -\19Z\ -+=5'^)Se,\19eC1\22\0122E1E\6`)[~aiQWX\22:ΰ\12:.;'Eu$\\y`ƚD\5\0\\\ -Iζ2Nj6\45(\15ߣ\20jd=\"^N!5ˠcXW\7NrP2O\29#\2Q:)\6b\1.͕\11\18{OP\13=+\1\12йP\2D9\7޴Jƽ0Ckdܪ뜪g-C!\127V0\6x'1\"NG\11t\29\1J\31\14\19\19\127A?\2E(Kw\\9Ԝ{f\14\5=\"\ -\8PW̹+nf˹k欨\ -1sf\22'߹T'.\9}.b,\ -5jHI!\16pj\300u` w;G5:fi\11&H\15\16U|3џs\14'͠o\29gmh2\12[30LoxH2\26B$*ET]:\30\5p\5jJ#.l@uB&ԩ\5nθHc|و\30\23s(DY0K<]ƹس\11s\190(/AV0woX1#`\8ނ҄'4hȯGZZVJX\ -\197\\RQ-d \3Ea4\258D}H\29\23OAvbs_lPG쑑W^Udh@\3ns\8\8\12P”m,y@I/ۗK.MF\31\4=2^\26@{9`$i\18J\1|\\4\\ǘ{S\6/J̲%Mc\127/Fk\0\9{~6/\9\28\20B\21VÜ\15a\11zp\152V\0?=|\5=l<׽\42X0w\28[LspQY)ʉy\18Yɱr{{z!C5x\8\24\19r:e1X3\25\20\12%+ktŋjųG\5}eCYA1\21x[Au/6)3\22\0122\6\1=!%iu@K3&\5\30\27 \3`r\1A8#N\191\29\22\1d!\30jW\4qbL%@.L7k;=ּ\11\1m\127@\3\12t9pЍ\13\24;\11ӎ=]\29\23[\27#\7A$n\25eV>)<\17x>][\26\3Lj*H\26#71u\13\5#zW5\11:Raomރc\7\11Q1CvV>{* ]*|\27c3hͱ.\16@ZI['7\22am2G:3^\0076,kѣ[X\\\4Z4[\30\29:1D3=\15v>U\13BLsvč m\7Yq\7-[q\2iO\7-lF2\17ѹ^\13d_3nPE3#\19?_0\3u\13,2ѩD\1}\6\127ϝ#\7Lc$\16HN򜖠-#\3O\23ͳ\19:b\19\27aBG&K{6\ -\1\31Hk˙/3A\29=A?1RwITj\31#\30kM=rԽ9#<:tbҚS \23.-/\30Htt\18}\31{or#O״\23[oeYl%D{vٳ^u&&jl\20BQ\6n\31\23A#\ -U&c\18k\14\12\0183\"\31Xa+˨CM?\ -fTP?FV%玓\6\313\8&Ɂ\27\26cO_\26@2/C=2UV\21Q\7\6\16*z\2Rp\20\21Nģ3Qu\31'n\3|\15Gʃ\15vaDR2n\7\27\"\12&s&|h#\24g\21\29\0ϡÍQ\31\5P\\[|&0<\14\5\27%8u\08}\310\12\ -\"z[&$r_\ -j)\16Dt\31űY\7l\26h҅ r\31dn\28D_Xp蕈`v\1ܓg\5\13\\E$P\13Kh=.$[%1?DDç\21JZ(\19-Z8y<[̞r\8f\\rPa!㣊tkJ#P-ԢA\3\0007\2\30\0169\26I\"\23m\31]D\9O\0017g\0004y\7r-rIrL\13ie\7iF\31\21jܪ\28D'IK-Xl\30\27\18)h\291|\8?s\1\29uGR:wUr\21p5\127Qg\18Ȍ<.{p\2\12;>\4ޑI{\27:8\17\12\5Lˆ5\14fpθb\0}8\21\2Hgf;\30\17{`?\30sAdGӎ\"ho\22@l\17u;%'Q\0N`n^|CzHS=\3\0042ȅ)b\27\19r\6UHh\\8\298Pɽb\30m\14T1!<8V_޹MlPv^G\18|!\24#j\"rad\310&-Lz\28!\14\5j\23$Pʽ\30mO穞\12=ӴnԣTC\15(տ\4K\15Ix?\28IKfSK݂ѧQ'\29p$\"3\14:\25z2Ê:L-Ž,\18͓MA4\5:\17oF`>Ic\20\16OW%6\16^GDRt\26s\15\ -ۂr\7vk+R.\18O\20j֐i&ATQޠT\9\15!b4R\29)v*\1t$1LG4T&e\30\127CSJ\26y[Hf \24\18jr+NqM\0彖\21|\27c\127\11]Ϋ\14:7ày\14\27;\4\9\29>\12oTDC9{Ka[:\90'HKuJ\\5Tm;Rھ&t}ڊ6I|ybb+\30\21xme=3x0ZR5W,G[\17{etFl\8h_GPVxZ&\ -:CG:Y\"AQK\12\21#@\6jO\24\14;l> N/\24;\11Q$-H#.aG٫C\14^\6&b6P4U\14Nz>\26!ځ\\l\16?b\30o3S\25\19f\2\28\11\13'Ps`J\24K\4\\\18\8\28\\m\240\3PGwHԎ\2\17ṫ\14/J\22JV5%8LZs(N)}\0kžds\3k\29%\12\8\27%\31Yfvt\8bv\129%~'\0OXeKwgS\22;\26\\\6\24\11[*H\\:lN\17\21.AQQg`-\29G\30tQF\21[=RG{W\29-sJ%\29)jY\172:b%ykv&\29ʉj]^\22[eo@^\31Lj~O\1\3\3o\25R\0035[vZb}\23L$i\12ܥ%h۬\15U>>\0209Iߋ\11<'\12.U>}\\8.Q׼vwuuAZ\5bgd\7\24s\4\6\1^y2\ -҉q\28R\31^80lI1\9\7\11_n8_%\2ۗ>jJ\31\20u'm2uI \30\21\26s,oD=A>'|\11]%\12J*|p\25\9m\1=|ӳL*9|\21e=\29tGc5Η^j2\27ihh8`2OaSՓt\14UUp,+̾N(\13jp7+z;Cp\29A7X\1\29H4&\1=\24j\23i!\22`ۗ_n#yC8IA\14F)鷑[M\5*:-G>0\14l8{&$\15rcS\28-\25\29얍:\14;$I\13j\0252]\02088Q0\6:\13k9}7W^\127\24ٽ\7j\21\15R}\"TY\45JY\\\127t}{\2\15\17'W|\2R)ۋG\0088]]p\ -/a\27ړ7\30[ugY\127\19oA6\0035\24G;ό3\284@6zK\8F.\11Cs y\ -™݈#|Ϟ\19ac\3\0236w ɨ'`\29];R\16;GpUym\26&Ԧ?TI\0Hg\4aj\31\2;RcD\29MHdd\22'Y6|A\25Fݪ\0165\ -i>\1\2=\0G4ǁ\28Qb;F귑j߈Ma\29\15hDsi#Sx/ɤO'i\"o0\30\ -OƊi.(\28‡\27-vw:u<ܙss7\24c<\30,?ܝm8-n\2}\8\7N/L\1R~h Ix\9A3yBӣ%}ܼZK\25a׉NбZ\248.`\4\26F\18ҙ\30П\12\21s|śٓ\20(OOּ\11xǽO\30\127~\6}\9\127Q4\307\9nÖTR\6<\23\27\19O \17\28v\3O\20to5H'\26-kK[WTٕqqpd\5䣟Z^\25x.\14^$Fhv\6so\4%QD\27K)\13Ȍd\5qQ4 (ceҲǔJ\21-W<\3F\202KLI2*c]3\ -AsL~pS$:Q\1At*f'Q\9y\"ۈ\14\0ˁHd)qEH\14/sgb8!ik\1upV?\30\14ې5\16\11o\233\8l\5M\13QEkJgkf?\26)\30\14\7eJ\12;\17ltȝˡ氆D\8:Eu0:\29-ZMȨ\284?a\"\15}CDPǔQ;Fe\27@\8\19%y&\29'\0170(l\ -\25-'#Wɣ\14Ԇگv`\24`+3@Q\16'V\17a\18vXӧ[J.\27pw˲,տ\13\26pWs\0283BR\26ብ\2Ql]1\28]Gg\31!4.sQC(0j\1ԝH\0087|[E\17$J]0CWpj\9o\28\0%ZQSVF-rh\"\8zů?\9\27}\0289/ޘ8n>3:̉(\12B\29R1{ \19GL\2i3Ɠe7G>\17PQi\31,E3\0298e)\\aæs7)\24\17oܳ3\22\0019'5snsNR{7:qu\9\22-ɕ\ -Do8E1{1(~_n\13ڹ๭\22\30`XNi\17\12Ga}A&`;0\3v!f%m`M/\21K7,Wb.rt(\3\327+78 Ū\22gM\\\127)*cz\15anDb\20\5S'\ -/Oܳ\13o\17zF*G27^6n۸\21?\"\0`0RC\"#k*a^>\18\\K\23H\25F7Ό6:KZ5ce\8(\"k7漟,bĚ,\8+uz\2~s4t(c}vWX5\28٤v\8megAEi4fŽ1\4,V\29'{2\17Q]\24\5;\26v.BёN\0219|K\12uF\14U3܋dQ=*$a@V\4Q@\29\25ۻf/\6\13/{\25LN3N\14r\0067uA\31qE[u&KB>ɪ|@\4a\18?\27^\20\26.\27\9>PL0BH0&4iU6\22{0\23wx`iV2O\29:~\23&I\5Pf`\"\25^\11w1;\4'1!\127.c\127*UTN.IX\28l\29H\2yB7$\2\14QoTzR{\2\12PZ\20V_x\13pwr.:'~\28;Xڜ9\29lqz~\12q]:\25Nb!m\1'\29w\4]̯7L44~d^\14\29Ø\1193bZ\20\19\8eMD]Z=n8S+G9:\2XQLL]5?i]X\28WWb+sUJ\\#2r͕\29\19=B\7%\"\11\28J\24ܤgx\21\0045Qߗorb{\127;Y5OFk:9J휩DGVM\240\1272UO'Ōr/|Vp9\26dJf5Ɓ{z2\16\\W.\0\\G;nPs\7ގ2oX}\8sv|\26f\7:6ίOk\\1KQS^&z+gI~\26oJYfr\20LXLsךZS\\\26-?L&*gB̭o^s\20\24&\17Wts!\17$>CP\0159j\15Թ\\\29'\25\19l#WkEzGn\7p\31F\31l<\21\26\15]\8\\$jڋ{sL\2A\16tY[\1\23vN4'\18K!o8V4d=kHk1\3\18{o\0260\19}ӑQ^Q\5lt\7\"ԸexKV\16U4yuc+{s\18+\127\7gگJlEx%\15(1wG|d\31UҖ\9Fz\"%-ᐡ;9)BHS{1]Սp{/Q\13{I(C@\25B\26Q;2S!zׅw\2}Ӏ;_(\183Y/6L}X|K$\26a6Z{awX\28=);a3z\28]\127&ӅiAFVDz\16\24;\29%\0032`JapZ\218f/\23UČkyQ\246\29{F\4dC%\04xȔL\ -\20kԨm'+Z_gU\"+w-3}\ -O\18A\25ꁢ\28K0ʷ,\\uYĠ:tGuh^T\127\127\15\30Ԇ\2\19\6Hת礆srdncѾ{\13a$hQ=C\26\13g[\ -nѵ\16\3Lr\6Vä-Hw3wZ\17FX25\0117x?\\?Zu\11Y>\17\6\31wVO6j\11i\0293\ -{$_1\30p(W\22\21E\16\1d\9\1y\127o\03_`Al\14#L6\16Z\27\14\13r\9Ur}Þ\0/\\M5f@\1LKA%LCR\12qf\1\13Vސ|Q6[\ -\15xe`aX1l0p$]\3\17x\11^ܫw;Af\3iO\\\11\"4mC^D\4d%A!\19mV.w\18,\20X\3^yzJOX-{=vB3B\18[C뮭K]ʻ[Z\12]|\11Σ{%L_2zd@\21`@W1L\15P\6Y9F\17\9\0238\29͠L\13-I\7@(@Qw\23\26ҡ4P-\2AB-}K b\127I\2_j(gE6\30$>\1\17=\21Q\168G>9J+g\23aM)+.AƦ\12\26\20j\6W$lOL\19\31\29/Y\12\4x\4\15Xat\6>䶈>0z>hP@ \1L\1j\0=F\16.\1\2\0p%s\1S\24n\18p\8\26E>\7\0071@Ж7Ei|s\5߷(v/Wt\14\28݊\5Òs\7ϟt\78ڂIw$cKå/:EI6gs\11|\12\7\13;\5\12\28x\25\25,Q\22=a(5TO\31\2l\9_\3w\15|7\6f\2Q\14b\19w\15-H\\t\14\9Ǵ\4lA3.$\9N=(\ -YE\19\29\26w7\3\21L\27", - ["filename"]="tdict-std.txt", - ["length"]=268756, - }, - }, - ["timestamp"]="2013-05-20 02:00:09", - ["version"]="1.00", -} \ No newline at end of file diff --git a/tex/generic/context/luatex/luatex-basics-gen.lua b/tex/generic/context/luatex/luatex-basics-gen.lua index 0561778b4..4a46fbb07 100644 --- a/tex/generic/context/luatex/luatex-basics-gen.lua +++ b/tex/generic/context/luatex/luatex-basics-gen.lua @@ -147,18 +147,18 @@ do -- standard context tree setup - local cachepaths = kpse.expand_path('$TEXMFCACHE') or "" + local cachepaths = kpse.expand_var('$TEXMFCACHE') or "" -- quite like tex live or so if cachepaths == "" then - cachepaths = kpse.expand_path('$TEXMFVAR') + cachepaths = kpse.expand_var('$TEXMFVAR') or "" end -- this also happened to be used if cachepaths == "" then - cachepaths = kpse.expand_path('$VARTEXMF') + cachepaths = kpse.expand_var('$VARTEXMF') or "" end -- and this is a last resort diff --git a/tex/generic/context/luatex/luatex-fonts-merged.lua b/tex/generic/context/luatex/luatex-fonts-merged.lua index 71f6e79a4..310febe96 100644 --- a/tex/generic/context/luatex/luatex-fonts-merged.lua +++ b/tex/generic/context/luatex/luatex-fonts-merged.lua @@ -1,6 +1,6 @@ -- merged file : luatex-fonts-merged.lua -- parent file : luatex-fonts.lua --- merge date : 05/20/13 02:00:30 +-- merge date : 05/21/13 16:14:48 do -- begin closure to overcome local limits and interference @@ -2017,11 +2017,21 @@ local pattern=(noslashes^0*slashes)^0*(noperiod^1*period)^1*C(noperiod^1)*-1 local function suffixonly(name) return name and lpegmatch(pattern,name) or "" end +local pattern=(noslashes^0*slashes)^0*noperiod^1*((period*C(noperiod^1))^1)*-1+Cc("") +local function suffixesonly(name) + if name then + return lpegmatch(pattern,name) + else + return "" + end +end file.pathpart=pathpart file.basename=basename file.nameonly=nameonly file.suffixonly=suffixonly file.suffix=suffixonly +file.suffixesonly=suffixesonly +file.suffixes=suffixesonly file.dirname=pathpart file.extname=suffixonly local drive=C(R("az","AZ"))*colon @@ -3007,12 +3017,12 @@ if not caches.namespace or caches.namespace=="" or caches.namespace=="context" t caches.namespace='generic' end do - local cachepaths=kpse.expand_path('$TEXMFCACHE') or "" + local cachepaths=kpse.expand_var('$TEXMFCACHE') or "" if cachepaths=="" then - cachepaths=kpse.expand_path('$TEXMFVAR') + cachepaths=kpse.expand_var('$TEXMFVAR') or "" end if cachepaths=="" then - cachepaths=kpse.expand_path('$VARTEXMF') + cachepaths=kpse.expand_var('$VARTEXMF') or "" end if cachepaths=="" then cachepaths="." -- cgit v1.2.3