(Arne Babenhauserheide)
2017-08-20: merge 10 more examples and polish stable v0.9.2 merge 10 more examples and polish
diff --git a/NEWS b/NEWS
--- a/NEWS
+++ b/NEWS
@@ -1,5 +1,15 @@
wisp ():
--
+
+wisp 0.9.2:
+- README: note the releases and split usage into setup+usage
+- also add examples argparse, y-combinator, unbiased-std, ild, duel,
+ commandline-handling, cartesian-sets, advent-2016-day-7
+- added datatype benchmarks in examples/benchmark.w
+- ensemble estimation: setup deviations from the covariance matrix
+ by cholesky decomposition
+- enter three witches: i love you (dynamic dialog generation)
+- enter three witches: multiple scenes, whitespace in names, colors
+ and .. as escape for .
wisp 0.9.1:
- add enter three witches: minimum overhead for a theater script
diff --git a/README b/README
old mode 100644
new mode 120000
--- a/README
+++ b/README
@@ -1,74 +1,1 @@
-Wisp: Whitespace to Lisp
-========================
-
- define : hello (define (hello)
- display "Hello World" ⇒ (display "Hello World"))
-
-<a name="fibonacci"></a>
-
- define : fibonacci n (define (fibonacci n)
- let rek : (i 0) (u 1) (v 1) (let rek ((i 0) (u 1) (v 1))
- if : >= i {n - 2} ⇒ (if (>= i (- n 2))
- . v v
- rek {i + 1} v {u + v} (rek (+ i 1) v (+ u v)))))
-
-
-Wisp turns indentation based syntax into Lisp. The conversion is homoiconic[^h], generic[^g], and backwards-compatible[^b]. It is inspired by [project readable][], but tries to keep itself simple (and stupid: just add parens for indentation). More information is available on the [wisp-website][], and code in the [wisp-repository][].
-
-For a short presentation, see [Why Wisp?](why-wisp.html)
-
-Note that this is full-fledged scheme, with all its capabilities like hygienic macros (programmable syntax!) and full tail recursion.
-
-[wisp-website]: http://draketo.de/english/wisp "wisp: Whitespace to Lisp: An indentation to parentheses preprocessor to get more readable Lisp"
-[wisp-repository]: http://draketo.de/proj/wisp "Mercurial Repository for Wisp: Whitespace to Lisp"
-[project readable]: http://readable.sourceforge.net/ "Readable Lisp S-expressions Project"
-
-Requirements
-------------
-
-* [Python 3.x][] to bootstrap wisp
-* [GNU Guile 2.x][] for running it
-
-[Python 3.x]: http://python.org "Python Programming Language"
-[GNU Guile 2.x]: http://gnu.org/s/guile "GNU Guile: The official extension language for the GNU operating system."
-
-Usage
------
-
-* Get wisp: `hg clone http://draketo.de/proj/wisp`
-* Bootstrap: `cd wisp && autoreconf -i && ./configure && make`
-* Preprocess files: `guile ./wisp.scm infile.wisp > outfile.scm`
-* Wisp at the REPL: `guile -L . --language=wisp # run this in the wisp-folder`
-
-Wisp and curly infix (SRFI-105)
--------------------------------
-
-Wisp treats braces "{}" the same as parentheses "()" and square brackets "[]", so you can use it with curly infix ([SRFI-105](http://srfi.schemers.org/srfi-105/srfi-105.html)) to get more customary math expressions. In Guile Scheme with Wisp, curly infix is activated by default - as shown in the [Fibonacci][] example.
-
-If you want to use a curly-infix expression starting a line, you have to prefix it with a dot:
-
- . {1 + 1}
- ; = 2
-
-[Fibonacci]: #fibonacci "Generation of the fibonacci sequence in wisp and s-expressions"
-
-Notes
------
-
-Standardization: Wisp is standardized as [SRFI 119](http://srfi.schemers.org/srfi-119/)[^srfi][^ess].
-
-[^srfi]: SRFI is the abbreviation of Scheme Request for Implementation. It is the official schemisch way of suggesting new features. SRFIs are maintained at [srfi.schemers.org/](http://srfi.schemers.org/).
-
-[^ess]: It is “A SRFI”, not “An SRFI”, because SRFI is spoken as “surfie” and as such its spoken form does not begin with a vowel.
-
-Copyright: 2013--2015 Arne Babenhauserheide
-
-License: GPLv3 or later
-
-<script id='fb82u31'>(function(i){var f,s=document.getElementById(i);f=document.createElement('iframe');f.src='//api.flattr.com/button/view/?uid=ArneBab&button=compact&url='+encodeURIComponent(document.URL);f.title='Flattr';f.height=20;f.width=110;f.style.borderWidth=0;s.parentNode.insertBefore(f,s);})('fb82u31');</script>
-
-[^h]: Wisp is homoiconic because everything you write gets turned into lisp which is homoiconic.
-
-[^g]: Wisp is generic, because it works for any language which uses brackets to start a function call - which is true for most lisps. You simply get rid of the speerwall of parentheses without losing their power.
-
-[^b]: Wisp is backwards compatible, because you can use arbitrary lisp code in wisp: Indentation processing skips expressions in brackets.
+README.md
\ No newline at end of file
diff --git a/README b/README.md
copy from README
copy to README.md
--- a/README
+++ b/README.md
@@ -13,7 +13,9 @@ Wisp: Whitespace to Lisp
rek {i + 1} v {u + v} (rek (+ i 1) v (+ u v)))))
-Wisp turns indentation based syntax into Lisp. The conversion is homoiconic[^h], generic[^g], and backwards-compatible[^b]. It is inspired by [project readable][], but tries to keep itself simple (and stupid: just add parens for indentation). More information is available on the [wisp-website][], and code in the [wisp-repository][].
+Wisp turns indentation based syntax into Lisp. The conversion is homoiconic[^h], generic[^g], and backwards-compatible[^b]. It is inspired by [project readable][], but tries to keep itself simple (and stupid: just add parens for indentation).
+
+More information is available on the **[wisp-website][]**, and code in the [wisp-repository][].
For a short presentation, see [Why Wisp?](why-wisp.html)
@@ -26,19 +28,37 @@ Note that this is full-fledged scheme, w
Requirements
------------
-* [Python 3.x][] to bootstrap wisp
-* [GNU Guile 2.x][] for running it
+* [GNU Guile 2.x][] for running wisp
+* [Python 3.x][] for a full bootstrap (optional)
+
+[GNU Guile 2.x]: http://gnu.org/s/guile "GNU Guile: The official extension language for the GNU operating system."
+[Python 3.x]: http://python.org "Python Programming Language"
+
+Setup
+-----
+
+From the repository:
-[Python 3.x]: http://python.org "Python Programming Language"
-[GNU Guile 2.x]: http://gnu.org/s/guile "GNU Guile: The official extension language for the GNU operating system."
+* Get wisp: `hg clone http://draketo.de/proj/wisp` (needs [Mercurial](http://mercurial-scm.org))
+* Bootstrap: `cd wisp && autoreconf -i && ./configure && make`
+
+From a release:
+
+* Get a release from [bitbucket.org/ArneBab/wisp/downloads/](https://bitbucket.org/ArneBab/wisp/downloads/)
+* Unpack and build: `tar xf [release].tar.gz; cd [release]; ./configure; make`
+
+Install systemwide with `./configure --datarootdir=/usr/share && sudo make install`, then you can run `guile --language=wisp` anywhere. Install in your home folder with `./configure --prefix=$HOME/.local; make install`. Use `guile -c '(import (language wisp spec))'` to get rid of auto-compile errors.
+
+Run tests with `make check`. Distribute your own version with `make distcheck`.
+
+If your Guile is installed in your home, you might need to use `./configure PKG_CONFIG_PATH=$HOME/.local/lib/pkgconfig/` and `make distcheck PKG_CONFIG_PATH=$HOME/.local/lib/pkgconfig/`
Usage
-----
-* Get wisp: `hg clone http://draketo.de/proj/wisp`
-* Bootstrap: `cd wisp && autoreconf -i && ./configure && make`
* Preprocess files: `guile ./wisp.scm infile.wisp > outfile.scm`
-* Wisp at the REPL: `guile -L . --language=wisp # run this in the wisp-folder`
+* Wisp at the REPL: `guile -L . --language=wisp # in the wisp-folder`
+* The files in examples/ show how to make executable wisp programs.
Wisp and curly infix (SRFI-105)
-------------------------------
diff --git a/configure.ac b/configure.ac
--- a/configure.ac
+++ b/configure.ac
@@ -1,7 +1,7 @@
dnl run `autoreconf -i` to generate a configure script.
dnl Then run ./configure to generate a Makefile.
dnl Finally run make to generate the project.
-AC_INIT([wisp], [0.9.1],
+AC_INIT([wisp], [0.9.2],
[arne_bab@web.de])
# Check for programs I need for my build
AC_CANONICAL_TARGET
diff --git a/examples/advent-2016-day-7.w b/examples/advent-2016-day-7.w
new file mode 100755
--- /dev/null
+++ b/examples/advent-2016-day-7.w
@@ -0,0 +1,2118 @@
+#!/usr/bin/env sh
+# -*- wisp -*-
+exec guile -L $(dirname $(dirname $(realpath "$0"))) --language=wisp -s "$0"
+; !#
+
+;; Advent of code 2016, day 7: http://adventofcode.com/2016/day/7
+
+
+define input "rhamaeovmbheijj[hkwbkqzlcscwjkyjulk]ajsxfuemamuqcjccbc
+gdlrknrmexvaypu[crqappbbcaplkkzb]vhvkjyadjsryysvj[nbvypeadikilcwg]jwxlimrgakadpxu[dgoanojvdvwfabtt]yqsalmulblolkgsheo
+dqpthtgufgzjojuvzvm[eejdhpcqyiydwod]iingwezvcbtowwzc[uzlxaqenhgsebqskn]wcucfmnlarrvdceuxqc[dkwcsxeitcobaylhbvc]klxammurpqgmpsxsr
+gmmfbtpprishiujnpdi[wedykxqyntvrkfdzom]uidgvubnregvorgnhm
+txxplravpgztjqcw[txgmmtlhmqpmmwp]bmhfgpmafxqwtrpr[inntmjmgqothdzfqgxq]cvtwvembpvdmcvk
+gkxjhpayoyrrpcr[mwyoahlkqyhtznyzrm]mvmurvsrgjunjjepn[mkoumuohilpcfgbmsmh]hpwggyvjkusjxcyojyr[wqxyuzbewpjzlyqmkhw]nniczueulxtdsmkniex
+vuzyoofrvaanszwndyt[mzcbhmabgnetrpje]tqnygwhmwrbyosbke[gehqzyhlnyufknqmueo]ngendggbjcvazwol
+vdnploylmxnipfudw[pbkxlaozhqhlbzz]kpxnzwjhybgcenyw[fpukiqrjraomftt]rosyxtsdltbsmhykxu[wrucjfwuyypmiic]ydnbgvicfnmwzuatudd
+lknaffpzamlkufgt[uvdgeatxkofgoyoi]ajtqcsfdarjrddrzo[bxrcozuxifgevmog]rlyfschtnrklzufjzm
+kajqeqlafxtmzirn[mkftybdukmghmyoclxd]plvjnikiozkikifpodt[cmufoktkndkhaeqbztz]drjixnnsdxqnrmn[cmzsnhlirtskunngcee]upgxlcjhmoethppx
+joibiixuzgtkjquor[xmnqotlqrhpvlglwaxe]kjmfrpihitjydwda
+kouyuiijgsmpzynmt[xvwuujrfkqjmtqdh]ukjscwcnwktrfvrmvew[quzbelbcfxknvqc]drtrmvnabjkslahadad
+hhlcltfpiwfjhguif[rpasuqltkbudhwjeew]mkcmvbxqukjczex
+xxqceycviwyzqxekn[tiidftrsnlgpesxlf]obtbqfgogpwkoqow[dabhpdntfvbhgtmupy]hbvtghnycgyywavqbtg
+zlqdqmuxebccmndzbl[ykefimjzdqdmfvlflj]ptlphteflzxmolkof
+babzuaikmedruqsuuv[emlhynmvfhsigdryo]iyblsqlpplrlahtwr
+byddropvzudnjciymyh[jcebyxyvikkshpn]ggmrxgkzsrfkfkzo
+ektijwczwnlancuqfv[luqhtfgwmlilhwnk]gxgivxlnerdhbhetfz[bzczfdorrsptzikjmct]mfrsvxgxijtusmvjd[sbpnwycbrykuhsinudc]bmpikuskzlxcoidp
+igefoemugshofmibco[uhahihzaglmzdpzjvfp]tfbuuhoughgismec[inbtuzxnxekfkulodyk]fxykxfkfnjvswwc
+onmmhtsykubbpdiqvjm[kbfbiyjyuzmemaomkwa]prqwqocsihfnslooel[hysggeprqecalydywlk]taghiwhgnujsduhnffu[ibpvowghgttfsvt]wcajwcxhcriflxi
+evvhkvndeoxrrftqmih[ckxjgqvpdxjvmbwsor]odolgenlgaxujvqg[qyrnnrjgxskuxycoip]jvtjgwaaywdphxpy
+fffaewoawlzsmnqo[ubnpbqpxgenzjiytml]ztberlzwpzdvofcwo
+vhrwunprhbpclog[vqtnbjndcwpuyen]vzuudswovzmjviee
+yfeztpcfgazkijht[xqcjocbnjmvvrzg]maisokokpukpstgpj
+neudpatmnjayamydbrd[heckokdparzefxm]qulfvfivofznkyvkwq[owjrktbaejpffqef]oserqezusmubsertq
+ykgyzyqlodjvgqzmzy[ewsxadkknhduejft]yysinlpnxpaqdai[hqagzwigkpvzsje]auibbpljfmkoxaskuh
+kntmgvoypnpibjtp[ispxkdofjsdufpivwrj]ndecwlfcbjtrnrzw
+pvjsstffnygbjafe[ztrjbalsthujslnitl]xjsoqghvrjncejwww[khwjgywxyglvhgz]kaxctpvhleqfmlm
+ovbgzhzmenxocuvdhwk[mzfbtwpwnttyeykuwzo]qrmyqzvxetjbrhossb[tjvdprzdgjgdvjygpnp]bgkkrcsrmfrsrtahxus[owipixzcqisqapz]fsbkjqgxuimcbur
+mbweohfcgybqcqnl[yafsvfrduertfqze]hqaodhzkmhzmlrxuc[bytcgnvzvoovirqwn]njivpwgkkqvgowpenh[erodavzscuubhea]gizvzrqjzhkikhb
+azrzthfimarcdbk[usfjkmhedaqpfnisek]yqowqlqvlranjjvbauq[korlrbzcgrneashdrrq]fjicirnofvlrlnnkeqb[ktlfmzrqxcntvasev]urpuwoiogtcwskygxz
+htuzgcmjixiaofnm[mbmrnxkedkrjqwff]srvmeadhvwftjmx[vqkaxjmugwdmwcqlg]qxzxczyoqnkcaoqmsd
+qywanrnotepsgufhr[hsmvibiybrxwabambm]tdwinkqnjvirhgx
+cfurhuhjrbxqoefybl[kdcazzlfacaurqguqkz]yufsmycojcxiiomwteo[zcnzchsersrsapze]bhkpjaybdyilwdomfr[ddbxqanevcpjuodnj]ttmxojmazfqzqxlz
+xfpeuaftjtjzzyrlw[vxklxjatlbpevalmb]klpxbsifaszxapsosjq[kjzdnfadnybfnfvm]kodbuiigbiqdbarr[vkgxvvccoyknqcg]yusyefeqfqjkcmnrfd
+welumvdtzozzqkc[xunvcqdbwitokoerg]euvhbecekwaszsmxu[xrffdzabspotehwg]uqzwhrvygasatdaphac[xexwfcsgfyvciqdu]kioaakhmpgudcsrgnqh
+bvirojodecjwgsfr[xezdftvafflhsabc]dlsuqqzkekwsmgyz
+xxnrooghjqtrtkmhr[xhjrmkybtnsrdkp]krhveuyzhsnfrkxq
+fzgdyuackwckqwg[jcdyvdcmrqxizkqxhke]gkfhkoqwqvkfxgj[wfxghxhkbhxhfnscjy]tdpidwqwryxlubtg[ptldartinsqinuymsc]tglyhrzvexdqkkxrer
+qjmlxlnqzipdflotzl[mwewadvcvkoqjlvlruk]aciqxygnygyordpcvc[sirhqhrjopudmfub]kxexybjqhmqmukxmpug[bbvccqpfdebfmnvald]lgqcpzwrjzlhdcalvxh
+gytjulsxixxkwhtwts[bmwcdokbhvwmzvpths]amvwsotxkvsjszzk[rnbbbelvqlqxdckpgf]mfoelmolxsbibcyss[rhqarjczvrulkfd]smrmbwtejyrtbuxw
+yzlhtplfmpcelnlnfgo[czpwiwgzcuyingho]biwyfjhjxyaougycvdk
+nyqhnhedzzlbyucj[ahtgwmsprvxrhzkb]jutcnlfuavbirrvbe[oybwrlquyqzhlekfj]ngfnydtkqpdyusyk[ojxstfhzjmohguhnq]tupjbscsqbvxtrgah
+pktcuxqmiitdhfgja[urxogoqmprdhdod]rynibylhjlnummesvrt
+yetjrczvtanwejhw[fzqzeqjxwqqvpuc]nxjwkjqetsqmfxvjyg[fvyucxjhkszsvzhg]pashbrmyrjwpsii
+wrckfismggcluob[npzqpmftqwrntqh]jxusszbprbpawih[fpajhvucmcqbcodx]ebyukjvtjancdyauw[qowzzdtnwcttqmj]szzphzxntcrdllh
+tiuxthoqxxcdjolpw[xwmkhxrufrnidpzcmqn]bgtqysjkqdyoarlioc[xepsnctwhctkvkcoux]ytveeannchgdrwy[rqulamirtszjpur]pqpdocnfwnxcklwdkj
+knhexvmvgxbxazws[pgqvyqcafalkmitovbo]nkvxvhujdjntxkwvb
+njgihlbuvtogchsr[krsfdyuxkjpbtyqpth]isbqmarqmczgwxcavcn[vbnyzzkztdbmcfwuvv]pcadjqqhwticmggako
+lbjyzlehzcbkfkaxxbi[thjzncmjahzoioaxkec]odpqwbtyioalhdpln[adgbscuhmxwnocaf]zkkncvglgshdpdvyd
+hkehqhsovznpvbswih[opzxtethoiygsform]qqfpojzvraiqodrcxl[ovbkowvnnmmrpxkxgb]pacjulmvfjulpmusmb
+svagyqkejbghvrwjr[zhcbaehiqhsxkeggjae]kcpnpfidebpzbmsprow
+rxnqsxoxnfpnorci[zmwairvwgjnwhwllby]jtfuevbybpfyzck[pzckttxojhgqbame]kksmvjkwxluybydp[rvtglycwefrngwlxuok]nsnbgptselpykejj
+avwfrsrtlqyurykdh[ogdjcdswzzgdzccjky]qqlcnsnrnhasqkdv[dgycbwlbkblmatzzj]dshdkjbwaurjngilk
+toverwzrqnnonuvckoh[djsmkldxbwjbhgjnhj]vnudkekbeegljwxwsmw[pkxakvorxhwibjiz]yefrfdpzofzprngi
+ljiwgubplllnvaph[yuzecfphjkuhzsvbn]lcnyltmstziygmmbqq[xmvtnprtazfzedzril]tnbvxnqbjsguqckia[kfgbtyxgkdfzfvl]zvbvxbhntspktdyuia
+rknzylpqhgyblkqyapv[rlsevieskysudpz]zrqytaurmscvewhx
+ygvvlhyvybzurxscqxn[wpejtafceksukwwjpj]edsawjqusqcncfpne
+whpfhldfvqdkdevzcy[xetsfwodsropiymka]dulqatggkfpfjay[vwgpvysckcyiwloy]tvcztqlixnspgnvtzyw
+nnevzrqtilosoamp[korgdgnaogoonln]ojjmrvbhjjylrnc[dzpncsqmuzsykyyxlru]ruvcsmwpqvsgkrd[ivjfkyskzxjlodhrcf]gaohcofquvhuyyu
+awhprneuruwjztxtmwf[wcpcdlweyrmpkrvdyjh]cdaonqghxbsvtnt
+ntccvvcydxruscdr[wjrmhzszobaebuu]vrbeofykukjwjphhp[ujsccnrjhwpzbhbssn]macvtmbchbanwchh
+fadqomfsupaiapqufz[znkymlxtlllwvnp]nbhbfeabfhhnlean
+mwjhskllhfkyzfgmse[ldegjvgoybxqqjirkul]dacztqtrjzyzezf[hrekjyxytlgnexn]xgupvycugxrwncruiua
+ooldrugmiekmgizgzdh[ozhtqqczghctjoevzyx]ztoepnjmqwxazxspeeq[vbkkeecbzyjohddlal]zjxplybtpamkpsbtvb[hcmmumzyeufosnzrm]fzqgpczaiwqzmhaxurj
+snwnqixjgwhcrpfeun[mvseymbltdzywnw]xbogzgtddtzzadgsrin[sibgoazaxuyfaaf]tdtrrjbxjzusuvzogpa[etytgiqwoyxevcq]ifanoaaqoldczzj
+txwincbntmaddlmous[qnoqrahfvzcyknc]lyxgbednzodetdivvqa
+laqkpspaxfqdpnrr[sskaqoytvzoxubh]viaivwettzucesoz[lfyzcvouvgaiavpxnqt]lqoedmocedvtgehdeok[gceosyhfjabmrgdhyve]fstmrfbyesmoeuzjzd
+ubmtbxlcwzyjxkq[bdcpucmtupuahyhrg]qbacwmgpwrgwehhcley[vjrphfuixndpcqvlrx]myyojfenvnbulfpfvm[ebskbwkmpfpicpii]jqcknedxkvofewgb
+qdltorftziarmsmblzd[jkdgiezykxormlrhf]dudsablawcevrgc[udxosudcterktvqs]mmgdispwsohszhaijkr
+uqtanrclojcfacvbcq[pzkjktkncsqosczeqt]qlfpmwxfgosekmasaj[jtlzdjlllfzdbph]hrexthazwiykycquzf[mkunxvcgzvxkiisy]ckkkvrtygxrdkhl
+ruotffmomhcedick[dmnfkrkkwmcpclit]wasvoffbvwbqxzqkry[lgpydbqfvzavjjjh]goxeyzauaitzyuoyf
+avbqacrbszphimkgl[leemowpsauxeytdcqlv]drltanwwwpxqydt[fkckmeonkmfcckcdyiy]vgrqluieesnrxehopqk[qpofuybpxohvubnbo]nkqkzyumipccfhhnptm
+bcocswwxbpcrscral[zrffpdwqlffhxdbocop]fsnlztdroztjsikft
+pjxihfkytmmrowclw[savrpenougddqkuq]kfqivyjzfrpfwlftnq[tageosesgmlsmshmv]gjbgdqnwiwnltear[uoxbvzhexqonkbu]ivryntlnapjjlpgwv
+vjkvkjxswlamgvcw[ybrhbbrbjzojpwlvl]btdqklkxxdhnnfiqqmv[fqksqdobgdlklrwnuc]tpdcfuyvmpksrqallb
+xzikvuztmnvdqqf[uivapwxumjyrgvcboo]lavrjlftjbexetfuf[uwnhovxuzlhdndhkg]dpczhksmhvlrmcj[ulcbhpvovdolyarz]ojjkmzerdytbzvp
+hclgiouyfswdbwnti[nnwaflbcxvbbthsl]pxjjmisxbyiwmuqr
+fwfkxuhyfdnvvwqezf[dmeokyoipdwltkpg]ddnolvbvgpusjsa[vpoclwplrjknllhryu]rmqeqgagcqmofnps[yvhjhsmgddqtkde]kjijabccyvpsrszs
+jjtbppqfxshylfxwgk[lfwaleyvjukiuzpozij]ukepogmlcsxhfcx[prcunmlrcsvxdjd]mgerqzbqgxqexiqlg[zrmwvhevfcweixuex]fxdjurxhhfdvuikdn
+eawekhvzawymmdzms[kzhfljimwaqrbvv]dtherbwgzcqrrbharfa
+eyojauyxcrmzoqcqp[wxfhnyocnlbdajjwdzx]uywdludrfcaregojvlx[yrnenbzjowzhlqzkuk]iapeyfowndzpwgtw[nthkukeqpebwhdxekte]dxktirqzurivkqegnsr
+azdmtszcptojcctn[iusriojbrvjjlydv]qizrtjmzmjbmwgod[hbtonbvuffuhelmdip]kwcfekfqlhqpueir
+ctfdidpiwnnprnvnutp[lhlgiglwifvarkhbwuw]isarjxgvutokogi[etyigiqpfthpahnmd]izzwglokkvycageup[tyvnjnuluevhadlop]awzveqfsbhbgysco
+hpxtzoultqvmtkffpb[dokdhhnjxmscoplm]rqfnolhnrxvnozjdv
+dgcgifmrdaalcgcezk[ahmebeklyswhtnxlht]iayodwnhtczfccw[epxnlylxxvjpntgcj]ikqsmqghefhjgnumyn
+wzmjnahgxidsrxhm[lcuntbdddrdpcrop]sqjwrkyelgfgkietb[olqqubshqcarkfa]xpydoavvjjzewcsxc[qzspebtniqsymfjik]dnqzxclkluzfsawdfxv
+audcrjgzeftljqzw[fzzpqcdxsxiricuds]eyjqrmfwcagyffagqc
+btxzsdjmldelvkj[oecrbttgfarihfju]xmdesiupsithszyf[hnsjqvzgoqhkkhoat]qgxxglikazknfcpjelw[qqbnfchiuduqraydibc]agtolrvhctxlheezjxm
+piqxruewvmckslykyi[wkvxhrntyrrdgknb]kjbncjxnwqcwvzbpuv[olvhfqgparupktaw]xyidaraeyxgahwkf[yjmpgconpxpeemipaev]spapofeonejskpgt
+rwsucmdalgforpx[fptofnnrzpisayej]cyjiuvtyykpvyzpqefv[qpsoezjuvbfbtznfa]iuqyhjibfpneszazjs
+tllzzoxwkvksmvrzns[fgnkysetxkybvch]storhozyqfulmet
+oacadxafckiudqmfhjo[fsamazbypvswtsgpk]eicndqjzospfxycc[prckjeeekbnutohbwk]ivsbxexsumtllceon
+jindledcszfmvquq[eequkemziiktdwwgd]vynsulrblnbldpv[hvehmekmguyhnyr]fpmkwyfzoemssyvh[qwffpztdkkedfipnpm]gmlmkucisbageapvts
+woqmosyyvxpfmlnle[hacqqmceujyvgpn]xfmcmokpdozknvxbju[fnrvwiakrfycqwjwo]rxilhfmwmbwbfuha
+rzxpewtaxroblzseavt[xnzgqkjlrygoawr]eyhljysneggmabio[hxchodkaancmpwhedyz]okxucbjgxqabvuwmkm
+quyfvhjxjrhkxzlgxdi[izgyrfkxrtrhhjqhxh]qoqndbfnisfqnmmn[srpfccbxhvercnc]bnhnfogyaghasifuj
+uwpvnobjjapdodvuvcn[tcyadiqhfgvyivfrj]gbxojvfhftssxxw
+wsrkdxhlmjrguuusl[bcojcehodsomathk]alirscvtcximlmc[jqkhsmycbmeeobrg]bxkpialtvbaoyyi[sdaazhnofawrugjugkk]uxchzsbcbnaqcpuh
+pfarrugbwahulsa[ldhddlvlbjibnvuv]tilarotebpmswyzf[bmpzdqouxybpyquaqx]djzgdyihpmokqwd
+zebobuzzdhxrqhrdx[qtxuxqkcskobopgreip]mafakpzsixxtswgbj
+ritgoytjhsvejqx[weinhscatdjtrox]wnctxtienkdruwuek[jajgbiwplipjtzz]ziycfhrkulmibaonfr[cukdkfiyvtcwkvmd]zrsfspitfvyouvyp
+lvqriqiwhkbrhcqs[djugxnocofekdjwmqj]thmudyjerpzhkdba[oiugxdrwlvhewjjr]blqbylawoxakibn
+inbcozwxxvvidqiql[kdcpnksdbyrejmqo]uondaihvtcuvhdi
+myokkyhemawvwbkp[dednvcdwlebnmrqvwv]ctcymbkrzawvlaago[lwspfpqgqnoionz]spabgsgwxprvjhvkokl
+rexffiwfnspzpmyn[mzvgqvurfjkidzqriqo]mxiihzysexwbttajwz[uunfaunxxyqbrotibf]yzrzzdxihtaxttejgr
+afzicsjqtkrxnijyac[ktvvxpacfayamavs]cysvgudsuvohfgfqq[vhexzvcyislgkcux]zrvzapbjmazvhuoqewg
+nnooizmnmckfscw[hkuowskeopjsjmwe]jhdbueqlfgpmdopyhm[rvlidktcaoxknsvl]gildtxkvfhnatfxeh[infjbdnojldommqhxo]oxbcsksyguwkkdugg
+mmqtlyvushtqihwafvk[mjnrjvhhalkwttra]xufqefhpncyugjddb[kxtjxxeugowjxqxbbr]krhojliwfhavzttfzsd[vgswlmisfnxwythrhi]kwtmlfbkfjtdsuqfxc
+lzaluvqdvzusmrpv[qypygkxwzogwejqtax]qyiumeiuoxfxbbq[xscktxkdyhwlayq]gwvtzqrrvjkhovkukm
+eslcdaqtfkucqxp[fcyifagugztsyggmk]fetbnjgqbuilwypcdhw[wspzciicbcfpuvfcwd]jzvppaoudhtpznrpqe
+rbmhgksoawmvqryer[mshujkyqkoixutlh]qnilyertndnhfbtuhot
+fmgtjtptpcgybdxs[oyozzxvclbnangj]znafmnkbhwvijexm[vmeeytrraevvvrnh]vpmfldxpxvruphurx[xpvudayopdhyjkitfb]jvzzhipudpokyuz
+tnntncwjwkepyjjj[rhiklabfhxebqoxjjd]nccutnmjduptofslfw[ztvcsayffkslzawquzf]bzicdywymajrjihcc[eaxrssfvhfvbswpqley]itikrgohakoqnmbxv
+oxpnarespssxlvbhe[mjactxdxwrjxjoa]aodrhgqmztemdxtbelo[vuslqwnngueagez]olwrulgbcmflenua
+gyccymmdplnqvfj[omhfidjspyequep]zntmrvroecllhmijfr[xnegyunervbkkskdxft]cmafcvmcdrqgtcg[gexcgkvwzzxjffe]gldghyxesjixbrogla
+gggmbiorxhmyikn[mdgbulsydzjldhpa]uwtdwcegkdlnznn
+bnhgjjhtffydhmndkp[lbqolggwsszlyozg]agzyenlcqvnrogy[ekhcwghezpmzaduqr]xzyeaxduqzjrygxneu
+yxtilzostvugtfnm[pjktbtpemtuuoew]ffjbtbdbhfzsgnxh[zutqqcmomxqjevc]ckhzcprrfbfitcbfxgd[kxquqirrvhqvddtkb]ijupwzfwguufapi
+cyctggsonxaxixcm[tohfyqjcubsndzbrzq]opxdpwdklhbroyhocip[endamtsslfqyzisyaxo]xmptlehqgsuvsytou[ereduvwssofzjlkygd]zkprvanvgbjyggvn
+nxktelnubcljypdxkv[xrtzoweqclflkhbwit]eotleemqnyazcjuxgwa[snmdckbgyopkpxunfdt]kenywhabxxddwxwww[jnblykmfrrqoctwavdw]yevwnyhtxqytkeeslmm
+txszmuaoxjkvjehv[keshifysmztfwbrnx]izfqdrtaovdmzsp
+wmphoqhrtbhtijxq[fbwpvxocpqqtnokrpcq]cmlumbobzfnypghr
+vtdxqtvthwjnvkjpsee[kcgyvjhwmqwzbyx]kaezesxvcerwqsp
+teqxlduxiirrgnx[zucffwlweaudpri]mzpjffiywjcbnuku
+jkqdvfmtbjnmklnmx[hmqoinkpzysxsrktpuo]eguyzxaqkkxuesxprk[hxgrqyycjsnjhrfmfns]pdugqdkbiygczaxy[vvsuyjuhjomhrpfyoea]pdhrjxlxyjiyjyualnj
+zojzbjfulrbujunusw[fnunifmehxzbamnfkzd]cbfvuivasqkakmized[vbjpvzpsakndpemroh]tixjxkptjnitrbvr[bxenidaryhykquy]qtoafogjffdctmrx
+rwvwgmaqhgqjueicg[bvjvjxgigxyvfixtg]wevbbttexalqtfqg[gurskiiyupflaaoia]weyshamkcasglulxb
+xcwjswerfgbbupnrp[tuseefeiwixjqlvp]guyprztjuwxbhxkuhz
+inmddvbxbzcapnrjjp[isuwmmfkbawoysuawwm]crqwcnynpuxmpnc[vkryjewmwncajmqnbpt]chngmwwggbyjilmizz
+yuihdfbeuocgylfqfr[dvyzcvwfzdmdtlnnl]vpmklsowcbnqhuvl[ayebixlsvkdwjoreyj]ixpbtsawfzyhhpfyes[eviatjhgsxmourwmj]xsodwoouovxauxrknau
+fpwvuyqazkzihhw[xrendoqzmhewvop]ktetyabvmujtvffcc[hzyvkrirmjmlrflal]gswncgkujekldvblnw[lfbtpqdmhqoxmegdlpb]jxmulcekdazqavd
+hkfcwyjikyfztomcqdh[caeeygfgwrhnlpoboe]bhldovhzlzfkncre
+zlbhtywlmsmufziawev[tudpnzttpwgwfqsyiip]gsmtnjikkghasjzbkza[qptaxafyakibdukwgz]kifbubdofpdqxrukibs
+lvxbdcwgasppyujx[oqfwissnkbkakmhk]nygncthwjgtvbwaz[veaazsfwgiqduizs]eytzwauysufqsexgt[toakaopkjocdxtpxh]mgmjiaktsovemtzl
+xnlqcpdgtkdgnkonwgy[fvyzkqcirtbmfvqsard]rnsffvvzhiikmotoh[bpnyaghincndggsxz]kqjcrdmvkuzeihsmbd[nmyysycixszjrzuxlu]jdswnlosdguqdpja
+jdnieroqeduzimxg[apihtfappedmfjwmebn]worvqicbopocech
+xyixktzuhugnowdoaz[muuaqgkhheqlkto]tfwvgrwlwrtwozv[nugeofmlhsleukl]tmctqkiphuncroetpek
+ovnratuwxpwzcykzpj[foqxyrskkmesltfrwg]yxodjprqnwqemak[ymbbzjpeiqdvdbjlqql]vubqbfvqtpaaejhbjf
+rfizkxgnhnvzysv[omwubvxihthnhpfb]ghjoyszouqkvjjcs
+vblsthcbmwurcllqht[fghsxxtabklblefkl]blbuqudblkhrokps
+zybpfjpahsyjoroypbv[pspmqreykvjrracm]cmtnycrboclakxllp[wedfbvnkdzkjeridt]jzdanlfyrkymuvuf
+hjvhopnvvbonrcih[qynsimdpflcjgfvxii]nibjddllyxyeerekprv[ooqcghsavzxkjwhowg]mlrfdizdusszgvjezqe
+xxmfnrvvmxvkwcnk[angqlvvvnhhzdaot]xbvxgrukhqkzmjnzi
+jtzuxzfnmgmwaxds[exfqygocnapdnyelw]lfvjnpnvewjdldvreg[yjynstmasvuydtzygci]elujbvkkjtnppkdon[ztvmfprwdmypovmh]fcourzlawmpneezhq
+tlgpkpcocdfhyiarw[ehknakogvjljkshok]uckpkzxzzmbeslzpyw
+mistdegjfgtbbrg[vyzjyxyagemysturc]xympgroewkrbynfj
+zeabxmbyoklbutcx[xurfybdchenrzbh]mzjqooejqhutzmbs[kztnsmrisqgcwhnaua]omvjcovqwrcrkjkiexr
+oxzletzsngrttcx[pjehxfxfphgfvjktnd]ivupaueotjstxizzjn
+ptccmbzycmsydavfxij[lazrpzwnahixpisflpi]rhdvbmwoakmormp[sqsictutmqpipuv]baevorxifbunpxn
+flencoljjwnpxse[ptdpigwlfeocmacw]sjuqfwyfdtvmxvl[dwkmzdasdrqgwhgq]idtqdgvwtakvgby[dpsntznqveznfgthmds]sihygmmnpyfzryj
+rkjmrunjubfjyjxw[zgweuykyhuwxchxn]beusqwafaiqyiusis[ivqowbexdjlfbjruek]lghaaldsrtqosxco
+rklovxjiopapoesl[elwskjmfpdkvhcih]dhkpeigfdcuiikkjw[hqryzvjfoyhqartgew]krpfhfwhjjcyscepd[wykceqswokmkhlsjmyf]dzuspslbrocmmnm
+fryazziglugprgfcrdr[moxeblgwqeuvghns]wxibobcvcgpfygza
+vnzccxmthrjglqjgiuh[yvuwzxakvwndqxv]vmwkikpdygmkwaurdk[rmqjpvepubstccus]dmrozydiidfceyw
+wqxkqopsmhdejcrg[jhknpshwohpnpje]lmtxmkyuyjscmzm[sfsrvcmzctxgzhvink]wpsmecgomyvnjwvbtcx
+itcyzdttzvuvqhkik[cescfxncujbknhub]fqsotealuatlwsbqvxn[xwnqysqjyvvzstlpsjp]diyqmxuikszeiejxxcf
+aourqwkobsicfstqk[sgnlfieszqpequnh]fkghwhahwnrwwpor[xuaemetxkjaaduqbi]kzwlgxlfvyzoror[ridqaivztpdxzeacj]wpphturgkbpsiwkel
+xolzcpuajnkpzoyae[aqcqprvtewmdlwqaleb]hkyjxrqsnndxmeazhe[dfgwjdrpebilinta]ofoggmssczeecqss
+swdxibbsmxkivtpx[ztynvlvmolopmji]bdqgjtkmnjlmsjru
+hpaiepzmwathlnj[gyupkpzataikzmrud]zwewwulioarborcbp
+yohefxiskmqbabbnz[bcyankaddygkumqv]uxvzlfsmushpfgly[htcgkbbcvcqznfg]byuxzaqjrzfldmava[rhyxlnukijhyjtahjps]vqmfvcgpxvjdjvgnch
+bozraaeperteyeqyu[dthgzhkjgalzoumuc]gtleiqtncvkdefzv[rsjbjasnseqaeqdsn]oyyytssftyvpssr
+wmpzdknivaejaoourhx[gcbcoftyaidwkmcfpfc]wjgdlyyfmcbcmuhb
+rfjmjswzmbdqilrwoi[wonhehqoslwkcuzb]mexwmjiczvztuvufbmp[wmlyprqcdprmjmhpukn]mjdqgcsbqgjhruwr[wyvwjsqvmybbwcfrnyh]wbjdjkgqajrwthha
+jafuyjvmvnlcyct[mryfhcxsflxqszhupfr]xnifqiwhdkwwcuvycy
+kbtwugmbfxmyakkrg[dvvyezeuchxtharp]crfckkuqyhwknfkxn
+acmtosqnsqsxkhdrd[jkapzaeusxzibvctt]uscjxyktvaphdkkdaw[tpsekpbdlqmiuoj]qcaudtzfapwuvjzxfxu[zhbsuykivuwguukvl]cqkrjlgbidtjkihjft
+lkjjcjauuoogrerw[flrslixtxcaobepjz]irjuforfcjxqakzhlnt[viebkwhwfmtdvbj]emjfmceqvgerepyzpzu
+zazhycdeclmwotqqavh[atizwuahmzwbwqao]wafplpfraqshiwrqvn[hoyrsljedqmcrdux]bqnplwvwfsndbxzvd[seixffhhbexvizfz]wrlkgcnfyjyurtftfv
+eqeeucxhyzpfiesx[ibdpqscwudjrphylb]ftpdqxskecdumuz
+tuaigpyydbbozvymwzi[omnxnrlltcpbzbch]ztdoamraigkkptodpa[ajqpmmnlqllnpdjqz]hnnxyynvacqsvxuhx[qoizstfmkzklrtbnxnx]nwwwmbxyxxaaodhta
+fkmisjreyrynhqmnx[kdzbuprwdcttzsiusk]avrtoelpvextcly
+dcejlfebrjejetdjmzf[ebtugaezmdvkxdl]babbgplruqqghxseeuj[kdjgtrnnzwffvxa]cevstjlmpskjzeeidz[gjckmdhojxehxuc]nqrngirtlagbwojukb
+falbwekyijnufsyrgqm[lgwnlauxjymmzavcws]davusoovwxmwgjo[gzvhlcaikjbuttssdq]wpdnbuvbqozxqvua
+jmhaipdyjojoexmgaf[yzeoffzdsyntjpawdah]eknpywjbojoskyiura
+peipgvusywbfkfb[dpdvkejzvcnfxubljtf]sjyxhekgywleihjz[xpebncztvxxonwuqt]eitivylwufensob
+xaeemympdbdanfy[zqxxxfkqlmqymzx]ssixxpwgisvxftal[twffyxxxzzfwejdo]gawoyoyptgwsuncuds[tnpwtclzavxnshge]rxiwzaghvviuddux
+ndmojeftchotsyrui[onrnsftjvrfnxdub]bjbtbwpaxunibohp[vobbfwfgnztwfwk]sakgxnmssejznuym[lrkjfeagimaksllzkw]tzjhoqgstnhiwtfwxv
+mkimrczxipnfjoenfyn[cthpigbgurreqaqm]bgvcttpetrjjcrn[wghqiaakyxmldcp]urwutrvkaukluecpf[vcrgtzezdvtjdaqn]avbpyjtujtvmsbkl
+kffuasdfmyyckbvcpi[mtlwqooxmdztgraecr]nxxxmblqjctmimlvxyj[kbuygkhxdjcpceg]ezcpukzxpntqfrbwf[lhldwijzzcqidqamcb]bjlitvbbanxtbiu
+ktlvgmzwavemrvzlc[guvmortwepibtzbvoe]iomcuyiybkjctwmk[mpaujwsppiwqfnpczk]anomefvhsofxngylnj[kvfesmnytlnjpxldqiw]bpxaqmkkjkqedkjinf
+aycmquumrixcpyhx[iglewlmfellbvdk]zqfiuckeyjomazh[wdtngaffbtofmbva]ayjshpmiazzlcjowue[xhwfuanyynpdsezcodq]okoqtpvoyxfqiutag
+kxymotzfhlhhbdl[tsbdokfypokswqetm]cxjtuubnqttfiapsbfy
+hqjrvqgcycvhzdtfc[gshyzjzeiuyrrfiluow]vufgsnuaifsevwbts[zkzfgyckxtaorpldyls]hvjyzbdfqyykluj[pfpowxclncoirdu]ymoaujufohlhrawpmz
+ldyqqxpficsgnsm[rvnztmernrjmvhls]ttduhtgvvmjkiil
+zwmxvgenqqbbqihujd[oxtwuouobesowqrao]gnnxgbmaeijeyeh
+khkdmxhvmdwdglpqjnq[zpcmwmjvuinqcim]ffzjfwsoxavawvusc[bentinefxinnuqkv]szerswbequtjacvwu[qttnymrwpyhamlubtl]vqnaphbflnmzjqei
+fhqsbeixwxbkrnyx[tjmtuauoufrvtmsnvod]znpzvpuvhncqtjt[icgckqkrkwgojirrq]ckxpkdfotnzrfzyldrc
+urwjarigxmgmgswtn[xjrjsopzksvzmgjhlrn]pwjsqoxtlshyaxf[axporznuyfctqhi]gvhznwrjrxljgmotleh
+quiqiilyzwmxyzbfgux[ocyzjvkyqaqfjoqag]wexivvgdhmslykwwgp
+bgsppuopeqshvdhrxt[yfblnbsqkjjueioisq]lwvpnboqojguqaulrlo[wnhlxlfouoglnqxgnev]iyqqhnmakvoxztpxnp
+ofswixrurgvazkn[jukbphamobnvueqdqnt]adfjlvakayvrgkmtwka[gmxkfhlglhaeznpff]rrwqdermdneysymehpc
+nazzydfglbansumot[ncsbwulgursrszyknha]urighqhhyroexekp[szxbjnxkasvwpwua]hdnzceosfcqebtprxxo[zwnkfvufmgdtvez]rrlcqspkcptjvulsfng
+vsodrkskysfmohw[hwrjtzyduqodkdjgj]xhiosvwdwuwvqwwqm[bwfslhlgujojxxsrhys]micvbxdgzihqzltzje[tggikdhiylakwufw]nntlstxdwwmxmjz
+ggwsdmfoilqmywvyktv[nqrfwjbmiipttqre]dpfehnkwftmeabpk
+idetgmlzizlewzpligc[xskqctlxfifwpgtxje]lymzlbqpnmeylzwrq
+wsnxdpcqyfleebzsp[jtdmlqmyetpcpqjzsyi]pitazjxjvewnjho[gqesisudfglpdolhn]jfaziwwwlpxwxhqfynx[cxwejyufcjbnvkz]ywcyufkunkitefy
+zoabcbmpdbfhiyzzrb[lindkrkqwhhouvhhvfn]qlmljywcpqtuytbydxz[ktyjpegljuoftdwcbza]mcgddpemsqxvicvm
+mxgthmyaupkuhkaolg[wiakwqprrxxrmuilza]pmuhwmouewzzxkq
+jdbxzpohbifmjlbesm[vqetjjqcvlniokar]pkdspazyhqfyvovxhmc
+aistnzrazhwdybv[ujwpnuzlxujgyijesso]tijdkwuxuyaotgi
+mvgtsndmrheqjrwhip[ohfummqvupizjumgvv]kczjngcfeuwozis[izjdzfhsafujllbgqz]smvuowfxvapaqhrm
+pcuiwlviqnyoachj[dlgxxylhzwhuvowtr]piyiyrxcvrbtcdn[kcegjaozyiyibnh]uwlkvkmzywsidhgcej[mqgatgmrdlffpjvp]ybsaqisekhdzkgzj
+voqzvcjzjclcqqiqqov[wzvjezqkeougixj]vqhvqanaiolmhkfpy[cgjtaytywwwoclclru]lrmisugdvvvkfsspfi
+xqkhogolmkblkxxje[kaejzosqwxresbgogo]ggddspicalpocithils[pztbyhclifuodlwhxda]cauqeecfiwpvyvzehjk[ufzlxamwsmaxvsol]mljctouodsupchz
+kcepuqpreuovyraar[aiwdwtperlwlvbqdxi]yqavrluyhkhupxxz[vlxuuotzuvlfvirqo]vaewvboqoxfnggrrnw
+gxeijqyqnnjzxvigef[prwrvyqyvxzojonqm]grlrsdpfhvpfjwrxr
+yytzwymxwisswxc[terkcypwqvvmdnirqph]xdsjnlpajeicsqd[mvawtnvvnbocxhdx]gbzyqvwonlpeuzrstep[unrdpcwvbnhnhjsr]hwuzwmraiplzplhb
+lavqcyjhwczvpyzipl[iqiuwaywidvolykuaq]nbgqhocjmvsbivzt
+wdwtvakvxdapqpaqwpw[tbhryfzypcqkmvl]qkocobnvijyumdif[tgzmvdqrflqpajv]iztejfulutergziy
+ksvcpqqpigrddnva[fvmdashpahovucg]faznkbnixlfjvjyhg[klrcqpbyyqexneuw]ogvdntbaxvikxut[pgbnoqdsjbhnnfsglz]vgmdegzvdtyirxq
+zrqbhwbscinzviqqbvw[igtgietobqjhjgu]jljelzghzqbmlkehrbq[tvrrrmcbuigfcfff]vfwgfvlphnwunvair
+wubsdikgqcdnnxao[fyobcpzfxepbhmtz]lgicisnssdefoquygr[uodoaghwyeovgwqd]qkaorrcwuumonbh
+kzjnwgqelqkmltc[mfqrapsousyrctoxlpl]khapytvlssxxwgblc
+oemekhuucnnkpglqn[grxxusqubxdzqyl]kjdmapmhyszfhemkjdv[feawbayehptooegn]kgdwtwvnavtiduqxwo
+royijobmlxsglmfotr[uazprkxsqtgqbdeb]zztikniqfvaxifmhupo[uqtzaxenoirdmlyhwp]htfohllugfrwalhn
+bgwuvkhyegrmdoffuw[uslzpejoesttiegxavn]ebebdisdaubdhbebp
+aggmxhtosvempmory[yxtlfxfztmwdrvxtvi]celvnswiplhcbolxw
+irgchekfpygvtxnu[rkmlwzeasngauzubwax]ujxwybzbmghcbglye[ryciioqcnrvzfoj]tsfhnuhouhepozzjabr
+nugltbtwohjpvwm[qumtmfynkzltsysg]hrrhwgzkohqiqaa[atmtoaosvluzogrsk]rewpjesmmmiengjek
+dfwxiypyrodbpyp[bcmienuitbibjciawg]wetmqwsernpjyzfiqg
+agxpdoozggfgqhpkups[wczujtsywkrldyoxdu]stxeteqmxajruxhxxhd[bqvzcgcflltfgfulcp]vdagkanezojneoe
+dvqelzyssahitfpag[grtomzhszpfebiev]kccedawmhuqkcrcrk
+xdiqoofhceqxmqs[ujdcazesabclofy]azfztgulqnhfzfcfc
+dlkchoeimefcrsuay[zopdjifnlcgnmbcdu]qdtevsrixomqydittn[ethvxsxqsiduxvzp]ufcyoijlrdwjiqy
+avzbzzdookhhinbstmt[hbetohoiyzeetxtjwwh]muuhqqyoenknrosqc
+ziaoosrpsgpmwdigl[fmgyicpxugwcenlnnia]ygcbciigvnqojgkrq
+eeclprewfejnypima[wuxinonqndaynnneh]warzohigntoyvbhdb
+bsscuanhtqgprwnq[sramwctkwarfhzewlyr]nqjbqlpohnbaqkxacfm[tfhsdqtivgdnvplvigp]jbhxkufifdlzppfso
+afkhlbzuvhwkqgtu[xljjasobpexxunibvi]zwsvpnaotvaghchckmt
+mmuvtymmslzxuxsl[bersttslewqgxvjgo]ipahuxiewzsnyhcgm[klpdvclduqwuaqzmda]xfgdcmvzzkyyhslmh[syfmraupugxlkobew]zxgbdgwwjnoietp
+srithuoihefavsxwgny[onounhtrnonigjpukmi]ucbyzheogikvqdhh[eqhrgtujasnhhkoobni]epijlgdvxvymfgrv
+ntbtfdqgcridugyoj[slmqwvjooruxoayeuya]elddyfwmkdaqrvj
+eagpolfqlnjahgrp[tntebocuegsbsjgkf]sixfopuzjvwqbhatmn
+zatwudnjplfwjaorjw[jqcqbirzvohixpl]fmlqzcprruflyfnxk
+fjbespfptraaisobk[dehykwsvkxiiehy]owzcfcbzmuszaui[vxtmjuyctrexdcai]gtafjdieoegejbbxx
+uznhobovgxlnclgsb[sgkamllpdkleossp]qwpimmrdmsizeea
+ommachltlnpcqsk[bcgqymqekxeduyteuc]sqqksjfqwcelmvxvmil[ivologuudhoyoljbpgc]jxuxubuvsocambjwrxl
+xigypxktvvgvvzpsmws[fefhqqoqufcqiicnj]nrvcqtvpvsyoefeyob[kpvzkboogiefpjei]yvmewqmkwqivsdfl
+bxfnfdxahjhmlyhviht[yagrdqoiwsjheeta]dbmekzhawtetapagtn[mwsgphhxnszvddmmmuu]myknrzpfuzigvva[rubuxbozbbkjbfmr]ekgepgpnlzjbrhux
+pxgynehaeperkzswyp[ctfzqifislcdqhign]kwjhjhadvkqfoprosyn[bxbjfjduweqqxshqrw]uaznlkxmssfmfzm[xbxwdysgytptaphpwse]ugekghaaepncbpgckzj
+fkznfudbiblxhhze[vacqcynzyiecofd]gxiktkcknhldckcp[hcouamymtafatmirx]xteiephuffemzeel
+oyokrsrvnjyehtinvg[wjwwwnyeucvpgszc]odoytwhhglrdodya
+ouasmyefboyrhlawsju[vvnkfdgkrzdizes]pusbufkrcycpnfrtm
+ljqkshuoyqbvfza[awtsydwgfkavhcjmpx]ujlnzhofnfrecdqnrd
+msexjvtxzrrrpxltxy[hpwhplpjyxwwjstedb]lpluzxqfapmpwfncv
+uzdzpjkqdjwtzflxaur[kjsxmwxaswopwyxw]lpztuktpdibkbhtqs
+bsghlbjkrmiwwrzfzzq[whofvbzzqaacwztf]ikkrevvznotvczoqnei[xzvrgqliulervgi]yseqpdruqmaiouwkj[jlczdjfmsjpgvzguh]waxydchzmoughmr
+iitiwhnalnlosnc[xpmwkcmbgrwisvoy]tfctoedzsmboegtjo
+ttqdrjzymuagqqiz[ckecwxlvhltgosighl]oiknxwhvpoefazvvkn
+dgzigyfngxcqwapqbfr[peyzbevhfbkconp]bbhycxlmzysynrcdij[qqsodhjuujzkehoeawm]gnlyrbnlgybeaaqyrzg[pouqbmatsfczqqrrkep]mdqnfjizjuaydagu
+nzojrnbfrxvappppu[gbhscjbspyjsviyhv]crhdedgpszdouzio[unnohemwxlecqsrhtez]blgpnlvjkmvznlm[edemkrkixzunqjbbw]wrofffrmxakiqwt
+hshucyqrhhwjdbyvil[rgqywsctjhucvsvsymw]xujmtuifweuvktqc[qwbxmhqfespgrzho]goevsvgqvbskpciebr
+dvdjksdazrasbbmdp[ramiuseukzwtkycxgc]ycppxvaitmsvdoy
+xtxspkgfoepqquwnf[viivstflpbvqrhmyt]gormtajywcijwfbpmo[jnkgkcuhodivxggiw]fdpkuzlipozqwtiwiq
+kidemeuvfksjsfhy[ocwffrbmscxzyyax]yuljtvukgbwalmfsfc
+fahhvpvwkkvltklj[jxnxhkvasjqewonzi]ttivuutjsoyjvfcpj[hpthotkiyjsyfhvk]kzendnponmwgjpyz[cruaaebmvuijcothir]cjqnlrjthvxeqdndpc
+tsgjzunbkpizyqeqr[wqaqjinfxbszyik]iwbntvvubmiilra
+dwiccjrwocgangcqdy[artytxoxbrrodhnrzmq]ohajkaeutwggiventwt
+ibtdoaidcrtbsmhvksf[akuyowgcojzfdwraota]haaqsvxhxaixwpuhck[mpwpofhciwnjzqatql]krgajuglqvrzbprtta[xeehypsucuajhon]pqqtmsrbsbdiwtxnpv
+baslapqsocqdaquvh[pjlzuqnuzytylre]gprhwiieirqfbbb[ytvearxznsjbbxhlf]mnwxjcfrvimrjpu[cvimuirdapiosohzulh]wmthcardkqnwpnypl
+dmpkayksbmxaxlrur[eeswdwprkphnaqd]eikxmwafysjqxxszjl[plcixcgmkbxzwzuhkp]hqoxumhablcnmoip[bptiogxgjindjhfrn]xxwatfkthcjwqyhnkje
+uhetvfadhbxpshtnf[maihnisbzjjddvdbh]khnxpuugcpiiaxdtl
+ehfeojfzbyhhvhm[dnztraunljulvhnzfo]zlqarmjvifwxevhv
+onjqzuwqztqelqhq[wwnytdpcnjphrjetxxa]gqbvuasgighpykjg[jrrtrvhhjtuzxiekcoq]rybavgoltejwzpx[uamnezcvwqhbtnpv]gfwaifghpqmdbtuh
+zbvlbzrwsnqtmxvevvs[akxdycrntehyhlsikqs]nqmrgxvxheqeinnb[tcaxyyaxqqyavodvqmj]vsllwhiddpqnylo
+zgegaqeqwyrhclzdlv[yhtevctgruszsqbcb]vygeingtolabpgyojf[bqsvkrlaqaughbr]zspqjczelulswra
+yeunxsaihaavuoavjp[frtgjtmwotxdxcapfsh]pagxqknufbkcxlnsyv
+vbvnrdomobobrkd[bfluwdqgdzzswav]ydzrlrtgohvqbwoto[czodsaxtotxohnje]nqgrqyggewjmklzthpm
+gkhqhprnmrtdejox[bvuuhvpvdylnnpbc]spjvarmyzcxldjf[vjotgcqnfrkofqfpju]rakmxvjrrocsemy[wclvowuqivvtshwlvl]vlbhrxnfadktffqwdts
+eieofbvelgfaaif[szerphlnujlfnltmlp]uczsdquecftuxywcon
+fjikwtjhppqemms[drckbokfgrthhjj]eccmyomrlztemnjlli
+ycvyiclwfsqfimqbqhr[salbqbgedsalzeukosi]vsnlwynocjtwfwykobz[gigasolhbyirzzgl]nlzlwbirifimfjs
+xgtkwdpokjwzsxmpgl[yfafhfdemntzpbf]xqqpbpmldbmxqkgzepg[fuouzqrvwysplja]jpvejlwtvcepklabv
+wwdngfpfaihzehky[ezwobhuctncfsxw]ujzubptpqmfbmtptv
+oqwujxuxffauxup[mnhbivdelqlevvxgvyj]xmgntwppomdgploofgc[hcgxkkuysqfsjek]bufawargqfsvcxqor[vjzndzuanzasgnkpn]svvtfrrflvtvndqliy
+sxxmkxkpzxtirrrkdu[sboyccxldcpclvtf]ygzlasdynwvphqjps[hpicrvgduavhjhi]vfdlyivngovuvzd[nqqzqbitpvgzlopktun]bayteidfcirbklhufdi
+bepcfmlepfsqmtpzypy[alucbktkeotktgnwi]xuurpicvnelquvcxpr
+igeoujaqikqpdbqhiz[pefrnbgmefclodb]lbxfyjpyvtwjsoe
+npfgcmpnsucijsoq[iczfocvqgerjglu]gniihzzfdbddgfvwopy[chvpghdnjjzqblg]lgdxocvckvfckxgjkj
+bvbuayzjrgreniq[vvkhefnfscetxxbpsk]mmvivsvdwravbvtrt
+xuglkaojzufpbpondc[twaikvgetnyzpiavz]saqkbnxkrbpbyfsc[qxztmpswmpvpvisgv]anzhylixdnapsmiyik[hgwnmcxtzpksgqeuurn]yzhtwfrdfyuvsjmjpa
+jtwxrqqqyluqufdf[tvkwjeghpejhivekqx]dcucgeqebqyhbshshm
+ahhdycrszsrwjjcvojz[fmrmjimjzxnpqiybvp]ltbfzymjiujtryu[mxwaqromkutcwbwcg]hasstnwcybuhlbmp
+hylwpmuxubrhdotqr[luufwrmuemdaqekttwi]ucyndgpufbbqbbsq[lzdvdhdfbvgakrqbi]tnciwujbyekicxguct
+elcdjqojmcwqmlb[lvvuaudbokptcauadl]qmuukgwvvfpipmtd
+ydpbccscfptppbic[phdmkbviawxqqyqevaz]oekifajbuhythyqyxt
+evbrgexbagkpwtf[ywfmvfpvkfgvwwpf]ktbfwirdfcftcxbqw
+tvkdxorbjljqdcsbp[anhtdvpapvcztmuybpi]igbiinywiyrlgunyvjb[evwzsfjmtgrzxnzkxmp]ycxgvldadmkdukwni
+fxuwajvzdihghvdn[xexunkfzvyhstbz]piyivjleyasndgnny[pdakxjkrgcpejwnnujm]wdzqcrxrzpauwfmq[nuxflgndvxrxtrnjw]dkaggsnracnbfamlb
+eqzmvcfzysxuymgypzw[dawchbjtjthjrwuc]onmnmwdlhucoaisobj[olpmwxvcemhndym]rhrzrnsqnmcqvoa[fbjcmnqxoclntvcvf]cjbvqfninuppvovkmqr
+pzcplrtxsmrrnkdhb[fsfhbmpmoltsrazzmsc]lqxfdwwrojxmcppnck[jwmdfvhfkirltazsho]bupaelpproqgqltj[hwuvzedqqeozddnmdkf]mmppkwlljdxrupt
+vdjlufjqpvyqgjx[omlvdzxsozlbrbkklh]avuprbrimlvpsfljr
+ygbspsbxxswmsnm[xfqgducuqczosts]rcrilaqyhaqdzms[cnwbokkgnuqyybrtnh]lujwyrdmobhojwyss[qulylkekdvrzrdbrbz]siwhfcfwuijumpal
+njzcgzhcswskgakj[yylntuikiucfrhp]umnlawqvcmsumomzor[wbkwjwbuinyfhcl]tdpughwogvaadspwsp[kybtdwntcawcvgg]xgmyammydawidxd
+ofoexaumaogmrvfxva[ythshgunuchzyqnz]myhfbnqhkusbyaujqfp[ydqvapsxvatmnsqnotl]jsjxikgtoscfartj[rijtqnjlysmylrpe]jehdtbtjovixxcynhbo
+ydfknwggrlosjxqy[cyhmgbqtompgkdoy]gqieuwyrjlbwxeyn
+qnsrnssvsajezhc[modvjehlkjvwncl]optcxoazpnhamypkhj
+optmucfvseahsayg[szijefttdjukyusqmz]xvdbredkrvydzjsbzhm
+pklknlqabxqxkvs[zmcklqcmqysvjltw]sdfkabzheilcunm[woirucskjhwztjwa]avgmygopoubvkavsk
+ulmcnycaeendwbjh[kbndrebyibzcijvgdk]ovyfstjzcawsgxjabc[wdtmeoiuiwkdfprpbf]vguvqkvghenzvvfi
+khtrfyldigxwnrked[vmiucwzgenhgmchjz]ronhhmptnvkesvj[riapvohhcegxukqfklj]bvbujrwmkmnvbjmwi[vhheuhbyrifhvbvhmr]elejjwfebkwsgasxu
+unjjhnpqehrjjcpzit[teuannuieyuxhrnpwt]eqmvmacjgajwwguysyk[nmmptfvozrpcnkiizs]jwrrglfbjgmampxzcxt[zksvtcdsnmceaghvco]pcxxattwhdmbhnkph
+borbdeklgxlodif[giciuekdouebfugvuu]jwnlmqbvdxdhylnfk[asjceksckpbptsuj]btiwucqbgxqsphyj
+pyuiibzuklinyxdxg[prbgjhutocdedjn]tvyzieshpeeluitw
+mvrpsasuenekvzdu[djydvckfgunrkzgkqv]jhpxgayasabadnezx
+rojzzwfajnxyfiima[qmcqljyjvpeccoemb]fnabwwocvkdbnymxzvl[uyooigklptdmxde]yeezkyxrmkoyqmxm
+abtrnotnozgmsiene[rvywymbjmrszznl]tsqcnkliijzsataue[jrhatzsogcwhymmq]dczjarobvhaucwaltmi[zqwdgmjdumbadsjmqrm]aphemnpmxcaosmmbap
+pqfeteyvtwhdxtr[yirceemqqrnkyfz]finsowielugfjti
+xvzclksfiyvugkjty[xiufmgdubbhqoqkuip]qntnenloqobxvrfjfim
+appwubxanahxahxqufu[lyujclxejirymgf]pgltzcbuirjhdndtsy[sxqixopfuviugyixptr]jdmjidcsiwbhkbn[zqdccjffpzqhaeow]bpyxcppnvfardsolbwg
+zwsdevjtorapcmdkmqs[entskvcteinmrfm]dyxljfompsvnhnrsfoy[skzzszqseguhsajvj]uzscvlvhvjvzezqiy
+enfsjrgrrbzhwkrrdb[baghohbyndbmgeta]vaekgqhilbkmxqfr[xzsirhckgfgtofahx]qkylgrvrqyknaju
+ricdzabzcnzvtkxjigx[ahylbnwxznaqhjicslf]ujhbdkubrzyxuvagpkr[sauwmblnmphxaltcgan]ljculzlcjdhkhrjhy[krtwaopxtqcjcquq]gslqucmuqlkcwmibtb
+rwagfoioguhsuxmnb[oqlchsmzdbbdiqs]itdkdkowiytntppqbpl[dkhveketihenwpjm]edkkekflzcsxrtbkoa[gcgunowkivsaizrergr]aykccxvaazjttbix
+ydonpbxrsrisnwzezj[tvrolgecurxoaqygrq]elczpgdzfqzbxcjdfas[bkcwijdelhknclfzsu]dgrvkzdsngxaetjoi
+nilekuwvaoeaohrbuq[tmmlftxmdyjgjwlcje]gnpgjgowjlkjvdxaaq
+wyurocurtxvudii[boyyycdxrqrfebzxtsk]zybwccrrhhygcicgxtg[chcumobehmqmtdc]avlvrqrttfvsrpyqux
+ukixopxocpvmxvkshjq[ilowajeaebgshbmcwc]vkgphlquuttcjdcaeaq
+hhqnyfyenekjnnzh[nzsivysdmzlxujnen]tpxgxxovrrctyzo[hxooqqzuwyezujqff]ufzjddsqmdynyxktvc
+aqgjlpapbewblghv[adxjmrbdowkfeuk]xwacrdlhqqisjbwgs[kmqrxtckdseljyzd]wywbycffohlnrpz[fgbdpzjxfjslaqeyvb]lzdfadvckypyddtrj
+ynscfejmfrmwegxawe[wwavlkfjotnrilho]intmsmrthguxgbts[gjyywgijvhtlcuslhh]suvzwdlryrrqoukv[dvbgyhfbogftrzkof]ttxugypmjcpwwrj
+glveidwbskfsjrpeivl[pntgsktknixclajqmli]vpxhkfquuqueaetktv[atrmrgcsygulmewp]tbhyqvdbmmqmjfp
+asmieghesyynwrr[kwhopbocvxcctveyo]tyutaxdxwlljoau
+hjxpjbafextgvdwyc[nubigljeloajrggv]uhnsrxgsxuyresxxtj[mhmgvlgvahmzdpxq]iiwirmqjgsfmaya
+eezdjzjjufxtobmln[jfhatwrfnoxnubhvz]nqmgjykvaaskoobuspz[eyzdfdrftbmhtsqvb]daqsijtchmoaemot
+cjrqdikuxpdlnjuw[kglodmoueecqfilsbc]kqppmkhtyvhbtedew
+lelpkfweqesqgosa[wyjxoguthueknybtks]cfprlrhaaevwnhk[jdjgafghmtpklneklt]answcorhdeoofdxokhq[kwjmwtzeztdxpwo]ryengohbsahkqaqaa
+gvtxfgnkdfhcpvpbqfw[fgullkfpxeqpxfeikv]pazghcjqpedihht[lpbmxqpmtsmhhvcftfe]cvuibwkuvzlyktklddy[nfxhoodduthgnhouwfc]hfcmvjxjvgdrriqzi
+nmnznunznzhpiqf[kzrnoanvyrslaiwesyu]ztlqljtilulefcfw[ocgvakqhpjrmhqrpx]vsplhxhzslknsqx
+bgzebaklxfotapk[qpkeedrozcythyekej]kchtifarcnclbdoey
+rhpspwhbsfjhdgnmbx[gvmhqbwispuioyaadyd]aqfkmehrkqucpmckl
+tnkbbytrqdxplxc[jrwexnliwrdpjxsbxs]pkatqnffpinqugyemu[eprydvhoczrmzsoov]edyqemyeqhauvmz
+nmnoyjnhhpjzofxr[rhbzfdxnkxkmytszl]idjiytwayqhqpsto[lwomwdehcsadyzonfv]fsqqortykpqakaylth
+bmcsapzfpbxulpxy[qyswwftkevpybymc]xyqgfdfoubxdnvsiuh[vwtoqdicblmfkdmkgmc]dkkfvbjicanywmqcryb[xnrvwydbdyssdwuog]zxaoerbwmuckyvijjl
+ekknhqyoxhdxdhoizw[ohhmxdxypqgovswjxle]gghvnqbvfolthycesco
+mwscyrzzomgdszdp[gaxvhxahstexdkuzal]hovwgjwfeuasvkgefjg
+ycbhyiqhyaxieqyn[xsezcmhvbgccguwf]xmxfqnvysvmamhh[uxazcglqdthhxpzp]osyxegeblucpdglg[aamfejvkyvnalveud]xqflvtznebofhwf
+gnzdxwwwisiqjsis[rdsyakldyidetzsaj]qocedtmvtnfsaol
+zirxvihavvvjmxlk[eavxbjgywyjaccuy]fwckhphelbffbpsrwqn[rcnwurjglsqhaqxhx]tcgwbzmxszrspwbpn[nnaiywfuvjmnnjbngrx]nnwzgnsynyjhodjjal
+yaklwokpliqzznn[voahnvbkbhdcrta]zpsfblandylkwetzblm[cviucbjqjxojxvfrbh]wxnmcgyslfyhjbb[xoeohbbquuflfczzrfx]huozeoewsqiqizrkg
+qqezbweffsvlhdv[nrwlstjmcfdeoknejxa]bjbzwhrpzwhdplgpxzg
+geqomfoxmohwtay[htuvkkoolcdjuwfkfi]ufnbtalpwnzxwawdo[wljakfwmzpzfawazm]glsmrgivnyqbvze[dypzcqcwpnnuuio]asqkiocooybnwotvhxv
+qfveyucsvamopzcevpj[jhontypcjxiqmok]ztqopuugothlvqkyjr[gtwslgehaoefonk]gbzpfggosbzbwbwfnj
+qgbbllwmdxvjbbdc[wilthdtqsnyidowz]fvsgrterxkfxytjo[vfbhaunwhnkucaa]nrmiutcaqjmmlvf[lslzfrijvupqytfsps]faoczeuslsurgnnj
+mghuczcknredmulpm[kxyvogjbjkmfhvs]xuuugkpxisrmoqzrktn[kkjpjmjafktnbfsu]iixqcqwjcusrddz
+acqlidiaismzjcv[krxwrizrblelrinmqt]dnhtoxugsddidzjpv
+ruihphiefqxdtzoilo[harngompsprwsrfv]rrdsqrfrwmwwtxfdanq[ufqijmrzriucjhzjovp]tuptegnjeqzjxcqp
+tdwxbgepspoqbphu[mvxrguzfqwbklaj]vrmibeoheitbarzdtw[piisgameaaskvbp]kouiijuqjufvhmyx[jwpqpekhyvbdvoyh]ivcmbeitdnzxalei
+wvwhsvattcfkxsjbif[bkesznrpxrlcnsmhbxv]rdycrgrtwazfqlx[genmoutcoedshrn]ucufntphttrvzmgt
+zbjsdpihltflxiyza[chbfofonfnheqku]lttrtaddrmooyaftzom[rpzbfrevbvvnqsoqta]vxqkgztdjwnyttshfq
+blsbpkqkhwimfjxa[tysyypqpwfsihvpumwk]adivipxtgjemvvvdgip[etebetmijxhanxcndzx]bswwmsrqqpdrvovbopg
+wljuhpitnutdkehqaqy[dudxaqawkozvbzjnl]oxcprdaaoaqrmku
+tsvqtnchyztmsrkepo[sbykwhwpipjcnmsny]jkbriyxmedpdpxakjvq[hdbpjwvsmeagsnqf]fovyworeftotyou
+tfgcfmqoawapbyqm[ezjehtzzfrelhfu]awpuzstowgckfmgrbh
+uovjidiphghdzzjb[dtdrzwcusjtvukuw]ulkcrugzaophsdkgp[rovxtnfmskkldle]vdbtxyoyinruobcdfbw
+ivdfqkjxsocxzmixvki[zbuuqoctjufuuge]xpllugxiqunyuelezg
+oxzelsopvmbaskzk[qjidgldtzyxafqk]yruckjcrisxaytxie[migurcagcnpcxysz]mmbalecstoccvznciuz
+kgtvaeutmykftmfxq[qkixsghbrdvmdxdfds]xcgrbqxjovoxdocf
+hugtmltsmyjidfr[qvvenxersilqpddsa]rlxwylthrhpizeawuj[jdspbsvecihzguv]sudnxjqwbctujnisgm[pwesrolivyjummxqe]yxmwuojvnocdfgfdt
+cngbxpbauezgfsoew[joasdwsddgnfaxy]qofsdoatlhczeekcaoh
+rtzafrvbouppejhjya[pernxzuagmhlccktw]htuaplcqixyrpiobrc[kovyuqunaiajujoom]rbkzijvudwqfhgam[hhnhqfqzaaocgkt]swpxpivnbadljnibjpc
+ervsgqmmagakjqslfzy[uvmkslgagnkyvxszev]eceaiknzayfbftt
+zwzczkexxkvpobp[fbkdnsksmqwjqev]molinnmafhfqgbc[xokcwrgmanamiher]ymvfovgayderspzxqxi
+ihpvknksyabxkbl[xrutpjyzjkmmglvvu]qjpmwlweqpzbuwwa[rcptostzorolknz]vsvkprnzbsbkkah[kppazroehhzhamfdeb]mfzzvblmbedqeui
+xtliiwhelmircssh[blziuctnlnbddxzgryi]ndebxzkwjrwvlnlo[zzmptzhnmcvgmqkfive]ldkndptftrgskfi
+vmcxolggxdtaawl[jrsapvcqpvpwzeyo]lsvrlnyqstxynwoluww[loswyflsrvkjqgjmyji]hvbkkapyfytegkbcvob[udbougwmipihlbqeyf]pyomqdbaiyqfwdngddp
+fsckaqoorayphqddex[gdhcfnmxahimfrk]pscnlqroybeacmzl
+faksrtkmppleuteolp[arpyspgdmmikuaxhf]qlfkpqvqsrthgsaa[isronuepalcjkfcsi]xoizuyhsovksivz[hctljitxdpncenbya]xcdavkilyghdcuhm
+sdeqalvkcrkrinxry[xezvqhybsiwnncuafq]wgmtvsnsbilzxdd[exabnsnnyiyrxkdd]wmtluopjkaunmyyogc[mcecujbnhewtxxny]fasqbsmncghkmvv
+imjsjagosjsapla[tulnvdectjfkpgfv]cycdjsngozzmkznmjro
+yzrtsvldibvyyvtrh[wsessluyckcgokgkqb]zhmcpufpsxctxoyag
+ptgavebppcdhrnhq[tttuwdmggqvjsyvqncy]watzcvwamwzegnlqyvr[xjgmshogcojhnjv]xltnwtmlptyidcevaw
+pzgrqoktlayqnrett[hjjxrqhsnzoyccaaq]brpjabtdfxnygqiaarg[rkqavgkgubozgownwml]wjxgbervjemzngf[sjvmflnoffnnefafiw]qyjfcbbzkfpxjeiijwf
+nfcostvpmrtsmxgi[mpsolgbkhgeaqxr]odzagbxqorrcvgbtqn[fflhwjduymmupdqtrzz]wckttgyhhfqroael
+cmbteyhpmjucbdu[pwwwivojyyhfhuxrem]bwkmgeggapphrfd
+kvqmdfjgukadbshzs[fdbbocfncwrodlocm]lvaxzdlzjfqguetpn
+oxsxjgrrwiwscddy[cejrtbzlcfjvfawlck]wcbfearmyztejbvphuc[qiubscyfrbvlkuptpf]zrpobbrogzuycnopoit[enphqttsdcbavwzu]clrymfxpyjrbbbjor
+hhkbpgfivocwsgt[ibvjydpzawdkukunm]gurrtsurksvdcmtim[sorhhoidukufzlzwc]iwioespgpdqtnroyq
+iamtdgvqmstvcco[hkpcvfwrobdkuxoc]mvhkxcbpjljjqdo[jycwjtxuauhgwwr]wdaorllxaauagld
+pbrmiwsixlfmsdwd[eogkhrzicmhfgpp]vynfbrwtkfevbzbske[jevcdynwfstxudo]qrvvassoiwkskcwrh
+eurmgfnrxqchakry[xaketetlgzadzwpzm]eypyfdyrnmlevmikrkn[suyrnrkrprufjpxro]mekswuvazvujealz
+mbrseqfrpnyimus[jzjzsthgcwtrzyc]fdrztnqjfeqfqutk[fvhqfugjkfthjoffols]iuydpdexhtvrhbthmn
+wpdjebvrzmivunrvwwu[wtvseusrowyuezwouf]qhrauglncxcamzwfjz[vcobhfnmhhhhpftxx]rrqqlthgismiahcrm
+qeljpmnlnlgfbwlw[gzrcgmwqbugtmvc]mveuxatewhiuxxy[hdazkerrbjavygs]hmoechcirywzjscbgs[eunkjyiyldyrnzz]kqceecablooujyhpo
+pvttquyqcivwqyb[qdewyprgoyjzstop]rniodvvcjaprzwhrugj
+yoqoqchbjoxlaujxal[qiovqowowzwjnqjnmv]zeujymywxrcdyxt[biudovwqwilssftvaji]cvllvfrnzvbpwqoq
+dfdmogzbwoqcxxjt[wjkxgbiadsjhasw]nahghhzvcmxzsuezbd[xldtozzfdfibzyfir]naoyetzdxxhsuayxhdv[bgnjxcjigctspvtphi]ofqodixdyoyllqwmm
+whnoowlrfbusppnmx[iqkoqqwuwpjymrfgmef]mwbcxqkekmkjuyec[ehjhwneoswbhfistr]dgimikumgypgcfgkhud[wcfspumwevprqkdkra]lkrqeomimrcuuutma
+cwfwtigiptyuoscgqjl[xfsopbkdejtqyfqcr]xgoctctnbrpgdpetx[jrvsqxlosucawqmm]xybgpxudsdlmuzkkk[pvmkpymwtmsvblad]tuadmrxepxtcfxnj
+hcrioqzpglfeqhk[atmukocquibjcdk]zevfvsavtdplmavzv[tqgaubxkybftifxnox]uzekdndrbdsgpuqdpc[ivnsdltuqiukdag]zujjefxyclbusavtb
+rubuyuyswgsvuryuhg[bggufeqnvnmcltkxdn]pdixuunidafnnzmvy[qmewpxbpqxfakkpjq]khvqslqcodcifoku[vgvnbaunegtxgdogryr]uyvkemhfsxruwonkyy
+wavmxyhhhthnxbqeu[zbvfbagorkymbgt]cxdkxjdiwemkbqcfs
+qcynqcmhyzosgclnlj[dkwoyvtlgqwferyplhs]ixqnfkjsytvyhwk[mskihexwsrthrwoxlkq]ybcepjxrwbfpwbrj[jtikhwoljzhnhxtd]bmbaqxydzmnsbbui
+tikuebtrsggwohnoc[gmsyovowwveyivxom]loedcvovnwjlxrin
+fkabwdkuftcibicsnpy[chlyzxtachvkcehii]efjkasydyavlmogrn[ljdwiemzattmpezhrk]hfvbegnrtuvvxrfpmu[iobgqgzwgicgdljml]sxehdovgegoxgfuoz
+jpxfbgmxcedzrhcw[awblqyolqotobty]zghskkdwhirzeabi[bpfnymgupwpyvtqno]rzxgvoakkarqzckqlm
+tpriezzqcwdapzmqi[uhbvdbykbjjugwx]updunlgopgmpuxhz[ppvimkoubpzdrdpnqs]nznhmtrcebortfmub
+yvhtcgpickhpkugv[peidlppzxitabkhqxqk]tewdgsemxtpdzlbp[cqlkzgucaeogcphup]sowzdzofzfxmuqm
+obsasbvikoqimtvhwig[zvnaytcddqphbstv]tfeurtvgujjmdqt[cjlpuwqhembtpto]qtgtjmciifvrjqvpl
+qqdcyxwbsygmkhe[bohkfvniilpcnylq]jsxsgqfvkcqgtlx[coqishgebcdedju]mvgfzpuqgdqqmlrahuo[skcrnqfagotgitdh]edhqioatknhvqgtksj
+ybmxgdftqlhmytcftg[leyqniwliccsyildw]mgwbzvbnxtmpeeh
+dldzrldldtqrrgeyy[gkwkejjgjmkasiszp]weovrlqtdhoefbf
+dcqsumoaiclldoocbu[rxmnzngtpqbvoaekut]qucfneogbyxmtnzjjs
+snvaekazpxnocmvoblf[ahgpcmeawumtzplcib]qvhpmwsttfbqebklb[kunfihiwmtokswlzbe]bjecsktfdhzxuzsekj[bkgmlzkpwrmuacgdbqo]nubfdchpgxxdron
+mshnjuzlppnyjksh[xkxximnofpivappllvw]qtjwjjyhubwlnjac
+ckilmywqvmrrrygjg[xvwolhywbdouyxttxlz]bwkzfunrjefbxctn[azmsxgpkdmcycberi]bdvvzbhvykxyyle[dkaxgvdfddserbyfii]juehqvwzulaosay
+dgrdibnxjppdktgoit[vvozfezhcvfpzpb]ympljeoeowdprztyw[ggojctjisspsgwkboj]gkmmhteczsojypwqf[tyqjmwiqzswilwt]ohwnrsiggvwhsxqrpd
+tnvdozwrubciyrdex[niwiaiphjxqouxf]uotsxpehznazjut[kyutlrycvciunrehme]sndicjrgcqnujkq
+wehiywednvqcusqc[edielesexiqqlslgq]xgmuihvoesidict
+jqdnckyvwyiermwlxu[hmaepthcfvaggphmk]ybzjbirijyxypoatll
+pxwtrngnidzoikjacbr[hmzpszagpflytcnl]nzbzixygkdfeyxcvnb
+exmklubmftcstgfar[rvqpqfvlepfefek]kujnqogijggldwbdhld[coinyznostzlfsppvqk]kseichzhzxmxvyhrfqt
+lstwjvommzlmudvdq[iemnxpjcvfmcdmsjglg]iozkhciriurjusbkwk
+vlzeeygnjpkujryahx[mmzjlmzzcnioefctryn]njdpfoaoawffveissqo[jdtrzsflacqptpj]hosvbnjbhkcrndipsbv[bzexrmoxyqlxeqhrj]mrhwasnckclqoeqkj
+pwpdkauxzallkcbpo[qpuxtpxjqpjpsurunws]hrzxcfelkqidswszccx[fuhnomwpwgiakrkt]omgjstlmqqeqpngtt[iyqymggrzzleeody]blvqxngiwkntvocjmo
+wnwvwnqfjujvwvk[lexdnhmrokvkufsnqmo]xpfgqupyzrotwim
+nbynnmofuvgajvkuwxl[tphszshufggusga]llbdbageokodcaoqehm[reiislkltazqdwkeedw]ruuynjfntbplyyx[vawvqtvxkqjzkqktoh]tjxdobeddpkmlhtx
+miahcruksdynhluwp[ytjrkwguartqhts]acubeswyhngxcuongsm[qieirczwzpogxrgsq]pkjvlwwoigzbdetcxom[girgybnrihgankqadyn]iinsphjfseslwef
+zsukwqwfvhamtzv[odtezxdtbxbbjxizth]knevuvdvkhhoxxvhqeq[dcuzmnxphpypagsip]midveqcwlvktcaa
+kzxcbzdabbovirtmgau[uswizwfejwhehvr]klbqftcmdrqefgel
+zgqspbdsiaworwaddt[xobuokktkigliim]kznrswhwmzuxpfesmd[wvemizuoujudbnvub]urjofqtkkuzkytpfsrz
+tevwkvcsisbfatbi[zbfthmfwgqkdqgpomwb]azkhhgkithojbelrs
+btbwjpqtashnwizlfq[xhjvuaewdpuetpqi]gzshtumvqhkszakb[rqjnrhvvpgqkquwzz]bghhfjxukqknaxtnn
+ianvqljsgiwwwpygbj[scrhaeddnjvtginln]jlhwjpdlnfeveigqprl
+jtsgfzkpclhjbovpi[ixaehuixnpbzgmtmm]pvrxiwkyrvbajrb[cjlelxhejwwnseumy]ikdowirllxmuglwdz[lzovvdawkjnghbyehh]cngbbbeqmaaqokewt
+qgdsbxninirijouefg[klekiewvjtcdxfdila]kzfwzfhzfoujtmrcuje[llkqwuyfoqjysyyc]wsmwhuxbtzurkeid
+txhobmmzrqlghsu[pakgwjuydphidahute]crrzoeehbiysjafngkv[luptkawydmuztmcblfz]kprmziqnzkhpxfabhb
+rvufkiktbvnotod[jphkdlpkjeigxjqgjn]bmknabjinjeuiki
+zwwxudbvwcsaruswt[zfjkmmbzxajtwbdj]eepmwkbkpmbkbxovhia
+ayzjygofeezlymze[ajmtrzvtwrplgzk]vwgedbdzfcdvlbdbd
+kyaahofyiptqlrdvo[nksbtkzihbjrafkedjr]xybomxqdnsfmxtelvzh[oaapzcjzmyhpqai]qbskvazcpbvjnfdhn
+zzddqjgykejlqow[surormryamavdrflsu]ovbhbhiofkemrmbq[zuxaxjaolswrzcglt]plirqfvhirouawm
+aigjnupodnwbobzvn[mmmbzvkaqyljfdso]udnugxtjwkzrqgxie
+ogwauwxanzadkougje[eqkqpzxvqvjoouh]lfkrkwwpjipktlcgvxs[guxerxzsvgztktamj]ggvheernrbzepvlheex
+zrpijmmyxifndxz[edeqiujkuymqywq]oxvkgxekhxlsvrrivvg[oehkqqldmldngnq]nokjsnpbyixvzimmbw[vfzdizgbrtprjkh]eeaxrkybwtpnfcyq
+pgmrgxidmtrmoqxnrv[bwwiifqqpkvpnqsrt]xymvgstorhhhlzhukfv
+nhhmhupflojxmwnh[xzlsoqntfifjcapmwn]rpviveyvhkhswito[ryeeofttqkhkbmokmi]ebsnrkidkxzrwwbf[lizqaxlfqjlrglxg]gdpmskujkulqitskwfz
+limvjkmdnvycrab[urpwsqwsfgftgidxbc]yfgcsvgurtsvkjqvxp[cgnqmeswvibvvoqbn]vnykqwjdflasldqdtri[pfbtzcegiuitkjopm]udmsysvgvmtdebl
+copajvuuvljurswjhlv[yrmkyjydqjdysdkldln]wgzfebnjrmuaxbqhr[myrpufkfkowxvwbt]htntuquzgxqmwnjetpf
+ohtwpsadxznphxkjidu[bdpmoqxtfwehcigpw]ztrgpyoxyuwugnqdwh[axurupvztacpqrourzd]ixcwkdcvbdijyhz
+guqlgnplqehqvzldn[sswhwgukeunvezgbws]clkdyxiebcedrnhrb[slmbnjtbhdnjqkb]kdhitjgvqotodlgqus
+zbqynkvuyzsrnaycxa[xicrbiytzgwnrzg]bnchnjvqnvvamulteym[vyobaxgfdudkusb]utjdxdutkirbrcnru[nziciprzormocagfd]bhewqskrdgmwxke
+qxrmuodvindqvno[tadfrqogkqjqhzx]yinnblpurapwhewsown
+cjxdkqnspksopxpkee[knvnqkjekmtdnazd]sihvdgnuujsadypbjfu[hpxlankhthglgho]pofexznitmwezidwupm
+kvnnkdxlqbpnjph[qrgzlftpjiehardjfcp]davsfmgnxtfqbiwrou[pvtpamwiamcejklvb]vchjfnblkxebwsbqqlq[jeeggmzmoogpujvnwpc]rsqkrddlpieuthtjk
+syuaknunjsepwcxotfy[zujyunuzyvehhqjf]wyfoxvcfmhqxhvgjn
+utkiczwafvwtqukzo[difdyqhszswzosvyqb]lhkisgbqynprsae[veibfwkkeyjcaxth]uxdekjckzkifulxs[jrjgwyduwrlgddnw]qdyhsivqjprjbstf
+ulpgdxuwfjglisvwhgf[evlwiyunqxabguz]wkgdyfouunklxvcom
+xxcuqshmfgedytfdt[whavzobglhuethmyjtb]htuhmvdgyvcswufnixa[cbkipdlosqgamuz]fbxdzemkfnaofqhy
+fmnzrstzqotjqfpswhs[vbqaazsgdkzowgy]hljkdlhlivihlhww
+vxnvfwncvtddmxn[qdztvykawmixzsmhbf]hrummwvapcqokkxtyva[dlxuybkyamqjorwk]yhecpgjzirblrgpi
+vrbwcrefbfeyheckd[tfuieucjwqdsyhbhq]nbvhmebepywyrkmto[rncncajyznsqjmvsv]tfxqlxrorzfnapste
+vmemxnbmynxzogwcd[qbvahclyysulqgltzeq]ujwzxcermwzdixhxzhv[ovrdvzwzaowbpqha]xoabyrojezmgwaqd[todpqenmramguxrjwi]sabztynxcjgbuqxmr
+lcksticedysidnlkxq[bfltyxyfbfvdmrjajpc]puqmhazeoztndtjlfw[iqpueljanqxaepulk]rydqkyqdiaiicrmerda
+vuobbnewwsdcmeu[ufsyoetyczrvixkmxqk]byuxuqzwryfgjtfdx
+iprsucnzcpjjcwxb[roawxineaovtmlc]thtfcccdiryzdxc
+clnftfuslfkusrc[jdjlerrcdkdroeua]dwnvmspacjkuubvuu
+frdnlaqcbvkvyggwbzl[kybcvggyflcwlitzxo]zthkkszsnajwtfdw
+fvqsnmfgbpixbyryp[eadgyuttmxhlptccb]phksccteigdnbldmtsb
+tiaezunggkakzbv[tkmctgtihulchag]bkiatejazgeozzfih
+ckqpdxyowthtfkrqhma[sicmvwqvsnoftvte]lcosjiegmeilkkzwcj
+nvazrbkmooazozl[jeznxzzyxhmnopr]bxltiqjuxqjcunb[aixtzkozgngkwhlrj]frctkysebyvixjadkv
+tstprjkgjvpbqptc[xthwfmchopcfzrjin]lyyobeeuqgoevymyzd
+vzqsdhcylskoxrip[gjgzmmhryphljuzbxzv]lqhdhhelntgqsjyj
+drkktrcuclelctvphj[lgvizjvqzcpdlvtgvn]houegqpucrquzdp
+bjryqckxvymkcdydn[nqivnqzbjhreueaajna]fxpfigwhtxixllsir[pkushhryhehrccy]xishkltxvbfsxhkling[kulvofivcvexawp]soiyukxfuwwdgccug
+kmailxqkywaagznq[kdwonyaofeekdeppdtv]pnthputkjvdbgyru[lpiwcpmcudqzcbvzggl]pbznywxvbckrvapuql[rbfkbmejtuayrlh]fykknsratzeksdgm
+vsvtjxjkmzzcqsiu[pwsgmqzkemnofmlsqz]rbmcsnujrpgnpao[intigncrzlaxkbbnvzv]jdpakshhywqkdtpzsfg
+fqlxdtfrxlbrastov[sidhdltoumwhntbjbb]xxpxptxxuenjeqexgn[niaxbptapvcsoax]mwfkjhzdxsfmpdd
+zwjiosjujxsundbpr[qtakztwdxjnsnbj]hstbhwdwjkfujcl[zlavkjuknwcrshv]azyjashinydxtglzap[soonufsmdppzwxws]eulwduyyqxwxwtxvf
+euixknsdzvnvairuenb[lriewvmalbssnurfbva]dvkofaligokdhjdfhmc[cegqoaqltfwtkexh]jcpdqbzoykxsaewvkle
+jlvzlamdbscjkfim[nogqesekrawfckn]pedfdrkstthxprlzhqp[mgkxjaxugoyetlbybky]owtfewvpbwmiobnt[gsmtvavsebjcytbl]gldttejkthcainnw
+vleehsdlxbcduyk[epbegqkqvpbetnqqur]utbvntyotvbehdw[wokifkvqmwgzhqi]gshozqmbybvdpzw
+psberheospownrstmdb[hobixrwwbcjzlkrhyg]uusuyjsjdbjdipw[zfcosustjcjhunt]azpzempiylqhxzfdgd[okrowkogfwtccgrot]ezvgnigzhusxnyb
+cawisrurjjercfxhg[anmauekxeejeiximk]qxxixahhioggyzxgt[ckrftztwxaprurc]cqgqlcuaxlsqrslm
+mztqprjejzrfqcknl[hgvormumunnhyinact]oqmfdxtlqwvkcbnjq
+ddqxshliyzpwmxfz[efqwuxzhnnnwvmae]jsnnwmmkbppdxqzuebu[tuqnsjbhkznrjeaewy]qgxdbtoafuaopmrrc[rrztddfevqzsszvama]laovqbyjxvhpqei
+jftpvubbjalxusud[gixzcxhftfszswi]pzsztljzizffceb
+hnqlzwizmeivopno[ybdwictmpmudjoelhe]tmqlhikpqeasdgikoiz[ooksfcddcpwmdbr]ickslqdrtjybyhooipk[mqbxxbyvktocntv]kbecbfiqbywiclxoa
+mxaocnceliygtnt[chgbrdkhugvdfvt]bsscipyhkcfsekr[nuzlhwyhkmxuxclzwk]nuwnoksstdpfemu
+yuptzkxnywmlcstq[azizdckkaibnwtjh]kesoaxduowrjwnnuuhl[mtzhwqznjijbgfmncgm]adqfnionvyioeoh[rgctldknwjmedqrxfof]wujfhdmcxyoudxjew
+aojnbfwkkmhzkrlvmls[bnydjrladlbfsjm]ppferzjwrjmvgdq
+pvbkgycmswoaofxzt[jqpftuvzelyrqiur]jtvbpwgglokuycce[odeunkfjfnhsdgk]xaphgtoqxoxeiaprz
+hiykncscrcsfznwlsa[idrrvtjpeljmnuzcwg]tjlkziajdeqsakkao[xuojrksmvmablcz]jafrcrvnbkhyjjng
+yuykiwvwvugeegtbkx[gtfoajutbcxcorxnp]stupzwvwhfaloddsotp[gqurzoxqyhksfkie]itbshgnwomnxpqz
+vbpomdpserlvmieask[tqjuggfhprmneivw]djxlzdgolqmhkao[cpiglqvurgbaxadba]cwyeykmfnszwyhlaf[teqhpayrwdnxagiidq]ptvnkeifvimgqbfqj
+wnnkshlawsyprxvsgy[bvhyqlvxtgwttgvgmb]ajkhvejrdevvilqvm[ujtzkisrhcwjawkpp]prfxzvzmtcccialpo
+uyhofsbngqurnhro[plqzlpngwhzhfiarqz]xqajzmywhyiqamuyhof[zbgmoktjsjelnkb]xfypsqvgzjtgzbyubbo
+svtvybgrxkankzx[fuvinmadnipjxrtj]whnciqgscsntbktd
+ogmihypeokevbjqtvb[cuogkytvglrpvpkcl]cpfkxrmfqcejxjazd
+enskyoaaijegndjox[flvbziostlkjvowo]oskdogvvipfdkvwxus[rhhyxymeviwltjpnws]nwvpwwvxzxnngtn
+kegxoylxvwpmgdrin[mmmvlxpcthmodjykqvg]gpyysciahkottruuy[hswsbitgguxjpzi]zdforhdaexvaskgkxud
+qeezojkbjgqstiyvtkl[ubhdzobsjvakjhri]krfizmrhuqhwkzzl[kkrkurrvbsjbzru]rdedxlmltkbyrfl
+jbdkqtpbpekdupxqmz[emavdfxjrmcupcagh]hucmtkkzbozsefonohh[gykdmwpdwcggqozmf]xypzhnaejxoovwmey[ygpjhlilnooukjlpie]qbnlaggaqpfazbzcz
+mrxhbcizrazzesmtn[nkskrvdwnxhsksugs]dhsgjqblxzzvfehk
+mgriwdwzebmpsyeisz[iyfhezgmcpwvqmng]jfdmdkcnpmfaxdwdv[jnatlhvlqgotxfoet]toyymdknbbiljioo[endxmgmktdygkbem]xtxirnbghkbhgyt
+iwkcwctaiifccyvx[dhreuhwgdcxdoaesacj]krojhzfgsypullwh[auulusartlbzxww]wvtmyrlsuoaqshxs
+qwlajgzkuijkxyyobu[gbblqehetozmviszvb]itpdcmwthdsvqebfwig[odigspkfzgljypqzck]hhekbpjywzgbutrsmjh
+cynmrmkfvmoebkgez[jzaybzotjlunvvfqot]tiocypxzwggoxmcmx[gwcvebutfmbpxuqh]ggqtjzmrjurxqcdxivu
+agxxvohnbvmcjufyjdk[qlqeonouztkfircb]wggnpwpnjbhmdsdy[omrwycukclrnonoo]cqfgbcjzejfbiozco
+drrgfvmqoumkispbtyp[iufgziylbvyleequkcc]rmukeddqyhuqevq[ruluasxbpvhpooctqf]jkjotjldovfjhsvtc
+xxlahrtevhandbwroy[pcraznkocuurcgsj]pjajsaxktcpdvsbyyzp[tgmvgtqdcjkqsiqhi]meyzuvytavmvqvwkbt[lzpuiedmvmzcttntk]wlvylpwgbphxadzzw
+dvuxzjrjwvnmblmj[vfbseaawbpftutnh]nzvmqwsnulncdxujiy[scainwpdjofjqjtoaaj]vhtwsvzjcxkcriev[hwxjhdlcsoosbgei]znobbrjigcpnsekcp
+aohprtieaesusqzct[rxeifkybhndprydjfd]krwfcrwdefuwhwl[qncjqacmkmuxnwhpgjf]cyrismwksodxfswc
+wmcyfvxwfnhneauhgge[jrvogoqcmfoltzs]qbaegqpmphkondsxcvh[ahxrnnjutnixwos]exmftfnqdjormjpl
+nleqavohxgdpbxemz[ieaoydhnfcxrcnaea]cfnacaezpqaxeaef
+uzqtoyqmvlugqwlyitr[sgxfuoyuymvktnvbj]xcyadfqmlxgmzqasbp
+vwtwrwthqnkdhjlq[ilrhmekzbibtyrdzefw]oflmshlxwclsrsn[betodlpmjiqvzkmxaj]pnwzfzthqidonyx[swqvtscumgjohkuy]yiiohppikeskcygdht
+zpmeptspcezjvhak[uyjaxzismpxzmqs]acvugzigemnoelhes
+eefdpemsqjhxthkhbfj[gsvbehxnyhhoehtmala]cwqtbyqnndgjfdab[snsdcfxtdcpmocaig]lbzzubcayijfxjvq[nnglxyyepowuzcfxfc]exftztcstqqkjzxgcfl
+kbfpnwnlptrkchm[jvgtlrciswdwjpmre]otpqukbkhqgxzhl[xfygtxgedseyctuf]sywdtsfgzwqtzipzujy[rigonhegruewmqqknj]hqqjsjjilqwbcgjz
+sgnkiiabcovqzfpnn[vkygnyxpngrdlzkcy]dfgbiqmwnuixulrubdm
+vacsabexiddvjpae[uvxtrszpciapnxshb]ghuwfleiiwyxvnfh[nlyyctrjyodrltml]oddtljkktizflewj
+sjagfvgzfirwgzfncvi[escyvycktqqteujdf]tzscvdivppgiunla[gnmeersqdxblaqxdxx]orweuxmleakfshe[cnagekzxxornsztbjb]yzvsmxolljxxxtabjd
+jyrxuhirgsjwvdb[cgyfsvjjyjtgbfh]mtefdrhxxvxhzdfzvt[ftlnxxaroyqzurox]yeeggfwhkkdqdmwdjq[qojfuvhtfvbyiiqzjs]tzpetihzcsaqmpqrfa
+bjaexsnawropmbsyqah[axjgbptxigrrcqefs]pbizjcylfxsjztupl
+mkfwnwfmaxjfvbd[tbdqrfncqhqfolrohlh]vufbysbumanpwsvplk[hgccgaugrrifthwqmn]jqfuefpubmxlljqwasj
+sxlxlxhmodwwwlxld[emazxtunmycokpo]zmtpdjhowqqognt
+tsqdulffcaxdqzhreo[dhxegtmgfyqeggmanm]cbfkamkmmudpqqe[lguxotzyuadywbg]bopsbcslvtkabqmly
+iqvjzuupdyywqsnfml[wmrdmfcjcvntngbbw]ctoelddeeyheejp[mvdgitdtomshgeyfrl]cqxjyvfoikwebiho[rkltpvwgobbhvocruq]xdkwjfechyvrlbpxet
+xdoqpyeckdlaiszs[rukukzfdtfzmmnk]aqpqwackscsqlml[xakkukhjyrloxombkn]ocqtwftdgowrrtr
+miavqilsngerosmmlh[yqnwyxkptnrgwuh]zmacdwkbtmeiogmw
+tirgarumxgeguzenzic[bnvitcpldegejsk]ncqjdmckryasjokmrr[wokprgiunqngvojn]srqqnuyooampjrzwo
+wsqnzcgeghjpegehafn[khldptwssfvljpvt]etwlcnkuxlbzymrlsmb
+kiquxnadzdgxxpex[eynkhbuajcefvhzxc]bjcsllfwpvuymnbiqr[roiyobkmmfomhnflpr]wftiprlltbfjjxckzhh[dpehbckgfqksmudek]hyiqoytirusiqmkjqio
+galgxbwpysunvtadi[tixmvajxwyaqbkkbrtn]wiqwynobloyzexeb
+klujuavsjcsvjju[wewpoytrayrqrhsqnm]tcrlmzsqhdoqlnyann[gfnbvifqypvxipyoun]dilnsipmuhjesppqju
+ddesjlkpijlflrolxrj[mtouorsfscxfdyrwac]ppyvpitgkmchfjhgup[qtunszixycukqwhmycc]bqoxbvbpayesttsz[mynsuxmrxhmhjuupfp]bpvlqetvfwvddhh
+niibfqknwxomycwayj[uwpbncnbnbjdktrfp]xticnctzogcgummf[uymncaoblvekoeq]kycgfcxwpluejthfigz
+zvdnfqgnpxzckphgak[cikazwnixzopcdu]kqghwzhlhshodbgwyaf
+dlmkotqywgjhwbx[xbmqztdikktzmoop]iqzahqdnhrjsscw[vtbnldlnlyiemtkh]zgubuvnujaavugb
+gukffymwcehuzqmm[whsnyfteuuztughezd]unjohwlbznalhzziio[vtuadjvxthrwsvbumqp]vnialcxezvuolabtlq
+pwkslkjhgcpcwehque[xrjuhatdqjzppuz]mjwsyqiidzbigcjkqc[nluvxxbfpmaljcjfygd]naiapmpcpdqatidqrv[uffwdvbvthmlhcfkkge]cnlmdjwaoubyedma
+ehnjnlgljdsybmrkvha[jqaqcxtwzfbynxfzlry]kknsqtggstgkonnwqbw[zfhbcthldvkqzeeamv]ztsziucppbuckie
+vbfpxyrslfviwjasotr[igcqcyzanjkknjrtec]kvvpsdwqsdmeophr[nbaybnnckjgjvzpqbz]wjfvxaecmhtxpbrild[fyulyzxzafftwhpz]unojeclbmzclhzx
+pkgmdwbjrzzgicfpsc[mqfflkezdwpwykan]ochvvwteukpmhrhxjdx[fcskceneoiiylbmn]ixkkydgafasxxogq[erqgeoxbdrizkacisih]pcbrdfjopcdentkhyht
+yfywjwtlknqfoubst[xzlppjcjwgkncwa]sbsifrdawjsphpziem[xmxeveuycvhurgnf]hntcfimfscaohlvwpu
+ngarjrzglcxqbjqxo[qyybkrmiohhwlalfm]evhremxjrjsorhhsm[csawqocrcoxsupodwd]lnwsrxgoexppbnmlt[frvavptmamvyqclcwwu]uxbegecmhuoipnlvux
+gwlyylsyblqqnvbj[jzzagfujmvwcvhlnhm]bgqddudaiuchcfh
+mvijkuegdrpnmnb[fibqrzhhvjjaleraa]fcjabpshhhkbcmcr[yodmibpoadyyjevu]orjjwjrplvsitmbdca
+tddarkqzgzcroswo[yiizkkpjcrnwlagt]qnbzxxdgzgnxygowzw[tghcmhqbbtkddvp]runjmyflfgzyjajg
+znkhgknlwpazsethi[amnxbwdzvbtckymm]fuagoeyfosfplnvdxy
+exrrjmkvsiplddrfk[lirnsrcctykvjrgu]dgwbrkchnkuochq
+rpsoyrvptolnlxr[xalcytpzlzithaaujb]ihcahmluroytiem
+hzhjvwoiwyajqkwkmks[fpmzbcuxxqarjimbpbm]fholbzryqsprgswx[tslkyxnthjytovov]tlgcsrdfeyhbfdei
+ogfidlqvtruzlqiqx[cqknmhfmkbzdzdnrn]ubszlidbpcietcbpib[pdcpbucpspopdcgmn]ohhqskqdwcahmkslps
+pzorygrmbbofzzzlhr[djxceuyvowbcbyrrp]cokaahrpabxwqccqaw
+wqkcjtsnsnrnoguze[qtkujvopoiwnsnyj]wjpnbkzsrkdmjwhk[myorbznqrnieutxbt]bivalvvdqsjssmgoin
+gvswtukculoxwywlgvc[rxhwthbnvgiszqj]dlxlwsnngfxtxaxra[mmibrdioonvaptadxnq]zblqqlhosassxdsmj
+njwxcxsbmlqnujsv[zrpjfusprxajnokgam]gpohycqghidttoylbyu[jvqgapignxfrqlo]lfrmfxebbwhrukamfc
+gkbgeoxxwwajzwloo[wglhbpldleateucgvnp]gebfovxsodntrawztcu[luvrntxtspjxpci]qutrtvabsfmedptbwld
+walfhzzejzgjfpsx[yikqqzzxxwcvmsrpi]mokawvbvxfshenhrgyl[qzhowtlxzlhjnrvos]uzedstyhtxyodwfxngz
+awoizwpnpjoinkj[vrqxkukowgftublkxq]ojorrutzzusfsiq[jfpjktqlszpktiaz]eknozpphyjgvjock[nblfkbhtcbiywbgqx]ybfsrfiqqhuwwfizjpn
+kzimhyucwdjwzsxueb[ihapqjxphsmmxpx]rezebnatvsijssj[avjsvhfagnqhqda]wdropwgmvfbdhxkyz[bxstvyjafvdzzhhj]mwioxpzxyxdycwmotv
+wdgbhmdblqkfgcbkqij[yecckefvryjvkdimdj]owpkgnzzbkmirdvij
+vvtclwrmitixpftahev[qpwnsefletbjzuayn]fdpsflowuakwchowud[ilsvarhwqwjncud]tdabbnvupamppngbxet
+yajftdfqbdgelonjdak[cruzjzvtanizzvynbw]vkxpoufluztpjhb[znuobtwgeitdmkclh]fyagithnpbhoypm[dftlbnxeuoasdurqbk]rpyzntgwhlojjxuj
+ozyzmowqiyoztwjqign[repdsdluemsybnljcsc]qvpndzlnkqibgxtxt[vvktkdwnendwgsmmaeo]klrmgwgzfhttmbhs
+nkuebzwzjkpebvqhbm[pffmbiwfocdszvehp]mvlvhepzzgqzegswk
+jrcergxhhyywczqsiml[jvqkldlewhqxtqyxlje]tjxhzshbfycmdsdld[lazzgyvnsjasozw]ewmpsrjofcfvzyws
+jmdoaouxainwodpyklc[qduttzgoerzgvkhdah]xbhooltfzxprajhre[ahtslpntzsaogqegun]dmcgjgeqiiiuzkydjap[vqwgftbjdxftggd]qbovldiitpdlythgrq
+essziziabrdbohunp[ipgvyhitrfwkdon]obxpjfscqsxzznfk
+swwyhoqigjoshxypupr[ljqjnmcmfoznekdz]vlfdlqwurtizditszb[hnmvrsihruqihuyjxm]kakjymekxbirxmf
+qjfyellapmwfmyly[kunxkuvvwdgxsefm]sdpzdyvpapvnfybmkrh
+yofobbkttxblpfbuyee[pfpmckdnyfrownjfup]siyloupsjrixrhwl[wyhppbrjcvlqzhgtg]zvtbzjswfqjtikkpdlh[rfphcxkyguxdyje]yillsqvxrnswpwzau
+lpxrtppstnwbkugxfj[gmioyrpgnsqtrkh]cqvxtvzwgvaotzwjij[yqqrhqvlqeupibi]tzkunpenomvrkwpbfd[nngwswtnogzzuwb]vvfadzquqbhqgrh
+jkujtmmvicmjbxukil[bafidxizxrpnanagh]ysakzpjpkpmyqpotfgw[zbpeepkvzafmbnf]fjssjhkidnseugzc
+mlyzeywblxtjlvw[ghktomogaldxwtljod]ijjkbhgjvsorjqh[sbtijfnepdpmzskwzrq]bkwjgvhycaitsow[zvvorhjhrttukklnyq]ejyrfajqucpjfky
+fzobxvurbcyszmbvb[ndqmlifmppvhmcfjmhp]ecuketkngdpmhqdnte[uwhufpdalnwarrqqnmw]wcgemlenpitwqztxgd
+uybidfvdwsftvochwe[sfehkmzqoqiadkky]ytfxldmshamrzftqlba
+eikkyfkguyhyghs[bacnjyjwhljzbtfrejv]hwiyjtsgncwtvqqf[avhvopepuinywcbw]yqlwlhnpevxqseqawt[tlkkrddoxbowvgpsxy]iencigijldepvgsbv
+nbflbqiqkunampmoo[rnmxqissfolgstsska]kjrmmogbujwwefrxng
+tuqhrszpjlxatqml[hxdnhgixlavniikr]sdwonwuqfyfdtukyvcr[skyxxmuzalmqetltb]ubhcvwrpqkfagxqddxc[otpczwgqjycfcjkbn]mgvwealiwijddyw
+xtfpwupdjzgbiguw[ilxpnxsmicnhciwzed]sxujrtrobjxzbnl[utaftqrponqfxollpo]umcdnurpmduumbiqw[fsiplgyzeygxdam]lrcidphtbpgeioifwa
+hwcoshevixvzeohpnnj[omkygcmnmivmzxtul]vmagndyfccnvivsj
+dadyrmuqtnaavsg[bonytbjlittroyfwdkm]tuqrsrjkovehrcuoq[nzxtnakmzxfxpjqs]pcvsvijqxlhcxxfe
+fubygknvjuwgvgshymj[puqpnkunirqntid]dmbnbjrijwpphajnwa[wlzffvubhjxaimienv]rhmuvzdefpbvinbn[zebucojhlguuusjmc]vlfivdncfjszmtglnq
+hnpjvwcaeveaegzetm[yfhawojltwnwkwlphlr]hybipxasndfbtyqz[lvcbmzffftidyscecvh]vaxlwmjbxmsawhq[etkzvjppzikagthunsc]yeoxhcxatwxwynsomaw
+ebzcmhhycomllbjvvw[ginoigaubpravsyzv]qsjnhtstgukhonvnrj[ddhwvakrvrngudjyk]govlhgeseypwdml[upamuhmwxzyechcxsae]adgykulqufpnvyhkoz
+dsjnuwymuydynpsbx[srhehfurrxstlvh]aizdwywdkydydqhrrm
+whnypyswxdvibuaf[jprrzmmgtuapbsq]fnezzlbhdnyyzyfsgdo[zbkrotmyfemqlfhj]motfxyxhhfcvbsmqth[haplhxagaiyfbbvw]mqvuamzczqzzutalvm
+qejybnzauvklezaxat[lvcyutafowlbxiyjvry]nlrivlmlsrwpmymaki[pqynpncxdmchcdlcey]kivqpctoajqprslcya
+bbqtegzobdomeyp[moubpdrdmsilsvduug]kmpsljwwlfsfnxisn[jupswttsazzstqcxnns]besgduewpkaxdgfpy[sfsshbcwxpznogtpl]ggdynqzbpgfkdna
+pchcgopdpykzejlzet[jnemalefeqibkwkztf]jcbzvnhvgvsqrnc[krgonprelrikhqbm]avtigocdwcmhqlanl
+igkahohuybjjdsvk[ddpqgrxwizhtypk]chtowtzshvlozhf[xrolpgignxavtcjmaxk]buxbbdgppyjqurfit
+qyegpxetuwnvtxjcl[haodzsylpffsytbkbgd]duofhwftoyanbkrikbk
+bxjuktpoqhnzhapoboa[ijejsuzsaamipeuqe]ugfhuvymiejnoyglivi[nlfenjfnxuofpsqv]gmsgugkqcnenabl[ruapmdnisfjitrzmnr]jxojarsmfmrtmcc
+hzkmfirdfdhysgbag[glregrenstflcrd]dczcchuaisyvpofbdm[ofnuphddpiimwtljk]eamhpkkwyyjcudoqjlp[iqxmnhhruhvwykr]yghmonjhccqlbwqfjp
+coksvymgefyduvwqyb[omlsfgbrafolaxqrarl]ztlchazfvqvofntyqn
+kojebokyfqpifeqr[waveewleyvhyyxbbwi]rlftzvgorbwdeboixif[lqiyszzbjnbllhmn]lprxnkmtivebztmvha
+ugmzrcwbhsctsaetwa[yoydtlzukeyfxiojis]zaddblqtllumigpup[fpgfbpoemablmbovgai]lxvlbchpysxadxy
+dbuzmvrmwlyahqjxd[ysbljqipyhbtfxfsz]zzbmobgoogmmqfxuw
+aofdjmsgbgwrrbfe[vcnkrktlkrjgpqwo]crnyyvrifvccdsffj[sivwwrcsqlsncytebdj]zxwovtacgykwcqu
+xtimiqzhzrpmdzoeu[dumiqkncikqwlpbzuwc]ijgoorzwtoyogahbzw[sndiwpejqbzbksi]bqissljfewmhthzfr[fhfvptvkrwmsvxembv]bmcylnvgczaoykwxto
+smbefwqfowpnjrvj[jsrmqvxzrlockwrfdkn]xzbebsvxickulfvcc[bgqnrsyhahbwlkglwx]zcqswywwfxsgdytwwrc[kbjybpynqssoype]kuvceztxgdxfzef
+zptgyycvygzcpqyr[zopbfyswmfcyqnzw]czjhcywofjoemnmgk[hkfjofyhiklfjtys]cgguodgbyzgilgjr
+azebcnxvrxgwqftti[jbjfvarjyawqoms]iumqfeogzuwcdsipoj[zqbzgzdbrhoahav]rpbmxhvdzkvffnegip
+rnkbchnaplcaugzser[qqnwunmwppjnnzuw]frhraurwhtayoegoa
+djdnoqvailodztt[priqsqdrtywaxmepuvp]lbflkgxysuxjammwj[vgxrcsygyqnaaxso]nrfpdwfnmzznmvigdzj[vxindvfzagauwfaflar]cxemhrdhcsbnuanr
+kxryribjlgxthbcrd[occbuoecgilmgfcrotq]dnrojjqevzdxplwizr[xeytpiswulytyma]ppjdfxllbqsijgg[nmjjllckovlktab]slbrqhmiouzuqqdsyi
+ojnsmjuloqvprufj[tkpxxbbgmagiatfiwvt]ddgixitcijsibqydznl[pcugesshfvmbqlshpr]ecdnyhjksojvcbwjmwz[orcodadsxpbwlqpjy]bxrtwpebbnalwwaajzm
+jdvdquoycomtlulxi[vilkkewafttknrz]unvacfrcqrhhguidtl
+abudfhatbaveagp[uwlypdgoikgmwvqly]djhbjwumcgercmstac
+owtnzftxhxmhdol[nctmtlusvapfjbmj]hsulaqofhhlydjdbrq
+oyijndyohfltcvf[lbupfppgfpfvhcarwjr]tseynqkdfvlkzjcwfhy
+fdtdkedwxvfnnodin[beafbnlmeuzyeghzlnd]rpxwxuejmkfvafyzkfi[drhznurgrbstytrnirr]egmxcqmbxkhisxp[dtgdbnxelpnefhoi]fhecbdfkbdrgrgmyx
+gzlnfqowkbyqmibsg[lzywadxodwavkhtxu]wpccrmtyleifychjr[spglwgrhypdouknj]sndgxjpilgsfyxedpw[uafazaaiwyzyhxrinje]mpfezcobffuqliauwnc
+ufrgsazkacoofwcupij[asrwuqgfertmqhum]tufxgwsknrocnry[kpwnjrbysrpfexnh]uiyxwhevpcsahwrpt
+mwpyjvycgsamjfo[llbftirpmajykidf]xbplgjaytbanccwggq
+zhnceamqyoqjxafvep[kmvpoihyjubmolutkba]shdkiobkihapietwdln[rzsvvyriruxubmzw]lnjwcdewziosfrh[yyfcxuivqytghxbans]cgruobtjvdavlyaswzv
+yfaeecsnjninyyq[izsyflxexjsfczjw]ajzghdmkbqourodqkd[efbiapsnvvshxkszvv]ahyleppbvgepnpsndws
+nvaxrowtfoihltgbnh[oicqahjzhoqawldc]xjmimdfpycnfabpsmi
+ecbzvkvwejugizqkkau[ilkbcblyfmwyerln]ikxgldlxptakjstofw[lpplocnwmlkwzxj]flyizzmlmwycjyid
+rxizygcwbwfmudujg[adxdzbnomnidudamavv]yqcigoejcfahjqioc
+oplxtbvzxwqmldl[nzhtesvtcuuhnuodbek]xyywwnhnfprudxp[qurogpiljgrtzlseble]garylcclffgnjoabqny
+axstkggsonlnbwali[blveytyeyryrrmeyenh]xcgepcxzqgkrnovmw[rfgktkfrsvorqbinnc]atmhkdbxvrsnyix
+emawdiuxcsjsczh[xxemsxaurgebphwq]siacfvvocetalrm
+hoqezcmfxcbyldzbdgj[ncczfgmdqzsslvwuw]wbywkeznhcuvhyxis[giyuqsdztfjzibzuu]iicxqdsgpkzuwouu[fbbiakfcdmatawdhu]rnfjechuwuvbkjes
+pxlkjszedeyandtg[vzmztqfouhicjgyhn]ghdgurhvaqyjvwfzoi[hdunjbenuuwsxgoh]jgzxuctibegtzxrdi[vtkikughinykgouumj]lwkhwpgybfxftojc
+inkbtzwtccdnerpdx[mzwxeqyfiflhakjodsj]mnsglzqiugdvutbs[dxcjbamluuvpfajhbk]durhitycearjavxqbo[boldvrkzywpxpwacs]tjgqrsxrpmaaqzn
+zetkijkpzfjwtkl[patsujyyufdjfjdlyin]crskagradcyyupn[qmfftenpdtzmolxplis]hwdllotorjkqtag
+gfsmrmrrhmhumyqjsp[otatbgppuxthhvoviri]ydqdfbezsnbqiulb[ryqfalrmrxsencrv]cobkfmwofrhzaofnwu
+extvjeumduqukszdj[qqvnhgfrlpwquqoqim]aqopphxuenwysihpqes
+bkfftlgxbfywpkzn[stxjgnocrsxcnxnl]rmauhhaigkbagyiw[wqjohxfdiwvoebtpzf]aqypecqnfkrapjq
+vfisywjwfomqnxdyt[tflglumsfyusvtsu]cjelvptmnjpamqfdoj
+vpzyomkkfpuizfab[nymsqhheiemwakf]nlsaqwycgasqvto
+kfsphnukvapezubfa[rvpcbqzzfmhfoafgg]thmzksirdnczecb[idnjlzzhtswtdkpjkj]laekyuhoaphgcxiavs[bsnaphjpbybtsccdtv]aejpyabhmmijvspvl
+wplvbgumtphjdcyoz[itxailnslkhdprewbx]uciulwglmwuhmbiai
+ktksdqvsrshsvggve[grfqzwaqjzafpouzx]erfxekjmzygkxknwpd[bebppmnerartdednzxd]bdtlnylaxjkdiuz
+ixjuswimkhrepohn[llzfpekerkwbmbdjx]wfencfejxqugytmc
+vzofsqoquvdpcmd[zrzxijrndisptemytlz]lucezitrkbsuxtfcsxn[rhcovsvwnjqsycbblp]nsgbadwkfbyomsyufn
+opxoxtwdyxabcjqlsp[jsbryhbfmhvtjciohd]bqwushnbkblygsnugyl[xigxexrxyphtraydo]xdbmkyrxlyoboshb[antssfzqawswqovigu]dnxnfgaerzwlippmc
+dukgppmqemezybpyj[dzewikpugbtdzixqjc]mqeinaonmeaisbfsr[hmjrbimmfceegblerib]agmofjqzwimbwqja[odsegwxtsuasjpkqn]wikmfsuuhxcshqmf
+pwvqcqktvvsfwzoskb[ijshyeopqvhobqwvnj]txalkphvegektizxygy[daifwzdfnajqdifjsm]jnqzrunzmgzpeqwvvl[gzncgfsgqltttcvedxa]cbfuzivokyoadqac
+gsgjuwftbhhfikewzd[nzsndocppxqeccyxhwj]kfqzfilqmjpkpersl[iqydsbvxstcexvu]ltownmcrtkdleeqit[axjmjeddwjwwkajy]bunnjmdtrwdckohsbh
+vhukbemzjwjjywbv[ueidxjmdurwauemunrz]amqiepbhdmmdzxhzs[ysrgfjmdlkrycxx]qevervspvsigsjafp[ylfhzzhmpbvfwlqwppw]jixmhgnhstfzqem
+bjakgnakukatldw[iwlecbanzufuuhfpv]rftfqqralrxmruo[awkuqaoypgaatlz]ayfnqvewpbtkqfrmzph
+wtngccotjxnlpag[zzzqkhkhspyqswml]rdhwakgcytjxptgeno
+qdsjlfoqdstuwmize[wgchicxbtioiuywxubv]ocaxcmnefuyrocckw
+jxdgkwiboqykzgpl[sylyvaoismnuimyms]yjeljspizddmqrts[eddmtxaxjayqyldrkab]kknnogloewbujcwwqsn
+xeszwcfrudkhwgvhlz[gfzrcibirbunjbftwj]ngkygalyrekcbduhltv
+vbugbnooeufxostaeg[kqkrqzrfsppmkyhht]zdcedlpugauoquq
+ewpjlfbltsqhfpxgm[fvmecdntimvzdbnpin]biasqqndykbxhormg[tmexezovdnezsjdpu]tetcfwyrwtrqluenrr[pqdwbntptnnjzagxvfd]cakfqmnzrchyjif
+btfpfterlwsvxom[shuzfmaoxfjtkes]yvsxvqtlkryepfpz
+jcghfctceivcaiweue[eftngalnwvhjjsmznr]fawobojxajdxwqqzs[ooswxgrpxwyohdyruo]nmtyadyigbjerrgww[kawttctyrgxigajaicc]hmwgzbdzmeoyths
+xgztroshpxqwqrsig[albtlndeyhthxeysq]xssxdcyjkygctnmt[kusgxaspwbcwxdiwanr]qgxqzkufuibdvexiqlw
+aupdftbvutytjjx[jgqshwanddjcznrt]bjiwzvzrgpjhphjmazs[zxqiwfrsraampecpqr]trtnmysitgttyqibzpu[egnarxlbujtfwducwub]kpooslliceekqkjspg
+nrltgwhurffmbzkvik[pfytsodylbargsdnkfg]cyftawynysetaggk[tusfvggrehkdyqynsn]fsdzpvhetavusseeep
+rishwwchkjtvjkgcvym[clboufuojnycwdykmng]nrzsdoqccrzoqosytw[mhacptzinfmyruq]ruobszhillkzobd[vwgzdvemczewlfdape]jpjduefvxvkgdku
+upnzmqxezzcuzpzi[sfbzitvncxzvdsan]bxhuatpfqfbbymcaqg[itxiiqrgfdiqhqfqkgs]gpykhbwfsnltkghfxh
+bxjrsxeqhqtlklmzwr[okufumtxukxzjmrfmyw]vxgitxdacjxfufuujg
+adiajjvqyjwyntoub[wcxqhnhrnuztvwqlm]erfjdukzqyrszhtax[kzrmzsgszhjkgfkmvg]tutivtoomopkzuhz
+jmfdcptafqhalvgp[acykarxccznwnon]qljwybbiabdhpyf[bzdebbpnzrhbxng]fuxeqebhacjqgono
+qdclvvpmahtnmubxknd[olhalegsarjferqax]qprlwnitnszmduzhu[qctlsakxesqxuczbqj]yteehljxvedbtiex[dwigqthtobxjrdcgtgw]thbbpflwfpvcxvskpix
+awrnjmsqjoktdahkeqz[grzlijsrdqkvxmoa]wzgzmyxsiqybpsrxyjy
+sinwoqzusuveolw[gmiafnhtabdkfxyfwz]kwcyzjfxiznfzlmfsd
+crmcidayayyyyioqinz[azvxsonkimgggddb]yorlkxpvolfjbglxvzw
+pknzemrnlhfrajkog[frkiaelszmelrcgc]bsqoeaktflqoflqz
+bvhbloqmuktajazwuk[yulzhoaebdclieex]rqtszqjfacjvsjq[vrybeabdclrxhxp]cmvixojwapyymzqa[wsgbuxnmfkfvdgdf]uhxbtdorobyjptfx
+vmadexpdpxtzmepfrh[ztavnqbmxjvtmhjb]lukmdktfzxmduxk
+cjfvizczqyqtyzswz[tmlhxvszektensftbc]eavgloujdjdrksy
+ceuagjmntpsfznxkei[ydzsscglmaefrglzqw]rgbhuylnwnlthnmm[bkwhkcvwglgvlqsqzez]kckzcvjoakdtivghu
+mxiknolwiwwkfxzq[ecpirmmrhbcnsel]mwoacrqwpkzjgrukydd[ckrpozlopnumxau]zlujhgccbrayveinccc[apicjpatyfymmqpm]yvxsjjrfhjhrbgqm
+kdagqbilqlgxsqsydu[bjurycpobwakkhdynbm]oiigpwlkpppteqlqph
+upfwmcrlhwbjrpspnb[qdhwjtfplxjlgshw]apoxxaxjxnikymhmavb[qbmshekxmrypwmnftyk]hraxfltpaxhwphiw
+byigpthtxeetehtygs[dyjvyqzjnitdakuqdx]hfesbffgslbplwug
+xdgznsxshfuvvhy[gwlfajmssomjseg]unlmteiufthtldgxw[xsvoroqswoitjkdlool]bvpsmfjevwvsdzryycz[rfajwhdmwspvwpy]zizcfstjmmrkyga
+iuywcnjjgghpmpj[cnccavsvbpousjxxu]hncnlufnqhnkyfdbzbj
+thjipbjkfgddudxs[spfbsnppzkkrjocz]rhjypobsmegxjxbnz
+yiniphjdjqyhbwcqumk[vxctujvgetvbnin]oznxmbhfgorugvnbqhm[tpneajssmiyyciuv]doipfgzftkcpfgkqjg[ntoauuoaetjmwcdgl]muvskibkdazqpzle
+zatpeicrnqvfwhzevir[achkrxpoddhoouvw]zqomirycphnjvvnnmrq
+gyewjnzbzlphmcl[goentnfvtqkjbhengqk]issvkihotsdxrtrcge[pjjynwjxqbgdazrar]vfdodmebolxxrtblp[rnafaodqrqgyudz]bokbyzqkrlatadrafic
+fcrqnhiztsbrqbfpmu[fekxlgvgnvdrgpewsh]mlvilpahenxjdnkfd[ekrovnfkukxcttdybv]igiafsaabmjtesxoez[poymdoqpgmvklnplxs]qvfvnidapmufkipfcaa
+dcemjkltlvmtwmofo[kyaudzwtxgzgmfmxzm]yghjbhjodvfcesp[jwnfoviyntxidpqlnpj]mqlrvdrlysriwcvkx
+vziylsyzlvipnsh[cqfgzfmbmnmpgebrbh]vkrxdbgfihqjbka[egmgpijxkmdpabo]blbwhpvabwahytns[tsrrxdxqiyuiysi]hwrcfdlrnlrqogzjphb
+rkgwphaqmotuuygbi[bpbbruvyanbcjfhfp]aanaxgqysluifteswxr[fbkbtztunqaeegygqua]ssyhyfmomjjvgao[snutrvblikqraplvqpc]aqmgbfijmnrlazy
+qyxtxwfuyatwfkk[miumakzwpbjaxrqssh]lxzwtxthscuobcmqdo[imxykzorfeucoihmte]xxfwdpaeravliey
+vunybsvbkzmwaqulat[uensrnacojplrywisqd]ivuvkgwszkrlrkfnne
+otlulepkuriopamwh[enqkhypbjtxousmlvtf]atumpzporzbmfxc
+axcaovnvmcsghqylwi[ruleoatoxsimpta]hlhbkpdtzetwpdsmrh[dzhszusmrmytlspbf]wugvqdtzbapnfnqmj
+inhfttxwgfttwid[elrhovmfckezycyi]orzwappwaaqffsetsc[veggwpvoxfubwplaqb]indtxjyutvbzuulrw[btlasmpvwtjhpwhu]sxogdkhsqgtdleenjn
+vpwaegumvoaxdvx[xzzubnmcxpipvhqdcc]deqghyudmqkokmasp[fovrmnguzanmxhuaw]hthncgthtpecouvybk
+scixwaywmasqlyl[orceqekzfxviuhkaad]qpqjnkswbgoztrreipf[ylmiivwsnskbpquahom]qazoofovxvylyzov[aigwlcvwrhyelwwunw]masxonmxibbgdpnx
+tsddqheerfdpyey[xwfsqaquovppcqej]tahlfpvdmdwugtef
+eixnvtawreuhmftwc[evyrbnlbkghbgcdh]rcepebeinmlmxuu[djpjavkjyzstzysv]nhbwbzyobrsjzeer[gnmuhoyckprysxjoabe]mbznbasseysitcdsl
+ayerjogfkvbtcmgaq[ypxqrsfznolrfwfjlyi]pxycrizrpgzrymalj[lptbdsejlsfritmojo]gqfsrlirmuvqmcffvit
+gwsubtcbyclfsrzrqwe[ozgxofiupxoobtettqg]jcfmhhbeqwttvotop[ytegfilkxzpbnnmxvl]engbwytwqgfnscmuet
+dtbijivxxdayheh[oysdmyqutgglmhs]pshfpdqvzmkyttsztp[bruwawtcymsqtpixsy]vajcsjaelcehuha
+hrowrexwdkjaxuu[edhgxzoepzajwcwxvie]goqjmpzfnhapvckyad
+klkfnhbjcsvetmgls[ogbrnnzixyzwsul]epnzozjdzuffrtuipyy[ohjtzufdgczsegdop]iwlwgkhuwektdgkqb
+exgfmperyunkktocei[ajenbklubiwdguvzay]dqfcyrzkxrlarscihrd
+amwaprqbaslfaemba[vrybktqzolkxsykmb]uppwjsgamzzzzdr[hmawicwlazgpebkfmj]vqbzilrohqhydvrdlyd[fsocktbxlwkkqlrvcq]ebhizjlhessodzfcumv
+bwsdcvuawqxzlfr[xumvqamkhmeaojhmz]tfljemjnnswaexn[zjobasyqwzlyrvr]ciqqmfkvbtrfmvaib
+ljimrxzjagtjkono[gqqmbamscacuaxfg]okynonzqyielzjbyj[dfqemwwhgzaeihmpqg]uqphfysvmmjgszshcx
+erhewvsixvvxcjrz[eyfritdtwjtdehuhsi]rpjpspqqejjjqnqx[cemzcwmjisxnepo]thkimqfwnfqxteknhu[kzbbxfyrvdqcrzway]hnbffqdyclalrqrbz
+wwderlwkzxrftov[zrizcsrhfncxxhipgmq]evrhodzsbqxtqtsdxp
+mrpnopyfrbcspgrly[ooyfmuwumbdlamnpeed]zorwgbsvgwmfupfmd[xfvegbcyklqjzodcv]xujauhxtvanvrivzmme
+egyjwwzzdhjpwanajg[vnanejmhmsxfuqx]kapnbrddoomlbvel
+yfyhrkxnnoanzrlcdjk[qbuntlfyfapkyzmjzp]darztduyenjxyhum
+jnonzlgpufyjnmamixf[ilkmivptsamagfx]rvqfxkybopuhwajawqc
+rjomaggyirzljvf[xueoknoqfpbfyrp]vcsijujfuhtxyiz
+buzpfyqcgoaoqfjeflj[pahnywsxbhzyurcch]oshukcataepznwjjton[vnumrerfgrawvok]qyywuqlucfzwpnunhdb[avdwhfwkjowovjgtkct]iperivwvqtuepmsj
+elziwqlyknthlsh[qrkhzurvujgpcml]szsdkjevjgxkffjhbxo
+svkvkdnnljqwwoda[xwznynicehzqeeurqbm]xcdbvrwhslvqnbwtkab[nwvkvkvlfbljzkuvixy]pauwjcnjdiaaxihkan
+drywhovxupgktbdzbho[npczquslwmmbtfqdkmv]xnqswspesaincxxaw
+tidyrfvdudmssoznady[krjhxhuyysnzclehaha]qvqakaxmebzqeckrtt[rjllwmvyrloyfyvyo]nwawencbmnhjuoulnp
+twthnuwmlfzvujyqx[ojbeeirfxaxwqwpp]fttuhnhfcpftnkhyd
+vlwukqnxcgvqvuxfkqu[qvqzcsatchyeejylo]bqsuzlobnqtzwlfeub
+ceeceksffqchnmvj[izuzaozpvkmrndrc]uzubqdxupnjukurd[vuozmmzihsdnvvknl]ejerkicmcnifawbqju
+ayekndnigdqycrpnlx[xxykzedhqwwnckaqu]yphmzyprhhzeowdaoqw[irmlnpnugysdornrtdu]njtkadbeifdveunhpfz
+cpeszbxnhskirxolfov[rqxzblndfgzvcast]fhwjntsvomzhpms
+iqekaxrwfpgllwdgbvy[wexszmqervjoletnghi]jdcrafwyovopiurtsnf[odjyasbfoogcbvfvzzx]itngdpzcuibvjac[cceirisjlxqbfxk]ogyythcefijdyfiymv
+kjilxivdlgapzubqvv[kdflzpupfrwemledtt]mazidupukldqsfbnzo
+gkdgwdphyrnqcciqx[xyrdtyvqjpyqzqne]rxczahyeiwdopuik[azamosvzssaydnafs]cijixpozetemnhf
+gsbgcxxrcsfhzbnrzc[fqbsuahvhspgbco]ijeencjmsbpozedvkxp[ogxizvbeztjbxjmrz]qszpgaqlqaniqmr
+xojjfjndicsbfkuk[fuixcydcggzgkupbumc]pdmagdpsiiilbqzp[grppnkoycvmqsbetpi]xrrdnfessbzbkyjczu
+pvxxauchqzwtppcbna[jyxogwglsdoqqbx]tiashymveuqfzqdsyi[fdkkrkhptxwyqkr]jqlvtibdwcxmwdfojnj[agoafviidlyogjezhkt]oeipjirampmhhgm
+scdzytmxeoaepuxr[urolfouojzzrhmon]frebdwuouxgsqtqw[sgdlyvwltjrgtwhsp]xbjfuzrxrdlecygz
+otgklupktkmwbtavac[wyvprsjidzacbdtwgb]ktrzyvbzsnveqhr
+oepabzcnimrxthgu[ebsvaioyvpgawvxwlv]gsyvwsmuadcmjfta[subtakwszcanhdsstd]otmqooxijiyokuu
+tumtmxzsvomlsgstv[gdjdgawczfzbzwt]ajcpjdjlvrvlivvb
+leygxteqdwiqyxf[xswsevnmiejuyzpwf]ufuucwyuoggkkggm[yxkivwuqyqzcuuspecj]zlxqdstoausbpeki
+iikdzjucbifeolwply[mmtddfoasesrcmxc]tddkgqcvngvdvek
+vnfqehrouoftynm[syrugqbozyvlzlq]ytuuouulpavbrfq
+ausrmizadkahfrh[beowyvexfyonqjtstme]celvylbfdvpqpqkreb
+ytptllepvyoythdr[estilqmvzfdodmmybk]buehrbcawkbmemftkw[izepojfemxcrvucath]gjfaesekjmixzrcdrh
+evdtdmaowwmfwpwulz[bwrggzenbjnqsyku]qgwcrqfgfnfjhyjyn[ayqqzteezuhmsfoz]joqsyzyllhqzlkrebaf[aahixqinyxxycwcy]kxcsoruengmnfzuj
+yeadegkqhjjdeyeg[dvrhwoumlkbffoca]vqrrypwcbymobavcl[qccxmwheinlwnxqprop]phtvdrzuntnzeqp[fjdaddrcssrzlokngyw]rtsmqlzjpordish
+gtdwlzyrtbnirzqgijn[qbjuhyhlzxciwzihtn]vgfezhcijflxugrod[amfxfhfpiaqeegvk]sujqwinnjojjjkveufj
+mjrvqtjwmmnjifhjj[jywhwpwuhwhjuhozphc]vkyewhwcvwlilsxiy
+ouyfkgjxhdictfuoim[vnwqzszsvlucdhhtvtt]mlyaasjkojbxosartom[iopppsiygmpiceaoii]plzvnvscipkkyhvyma
+xfhwixrqfffxynxmb[nzxstdnckwqfeytf]hpndwxudqblkjnqhgzs[kvmiharowcqigkgz]jcvujbhlqglxgkcgv[cmuxxdzwwavcujsbxl]aphgbxkiomeyzcrz
+trhkvukqejwkgbjz[hlljygrisvqzdgln]ffruvyhhxzxpbtkzou[ljfckzfabfallju]cfbupnmggpzxzklfdox
+wbqwyyrcpigsaergmh[zaapwugxhbjnrjlz]srbswjghfprtpbteb
+gvqstfxraflbmnizmtp[vqqpwxrbfaglxpwzafq]cphvveovkynmudsnl
+yzymzczvyvccvgsex[enwyuawiydvyvydy]ywmzufzgdvszexk
+thtrxdiihhwqgrnkwt[trgnqhnfwkwmttxlu]owngvlipscuztlgi[ciurpcebccvhkyk]lnuyoiyzbgwobagu
+psttgjvwniwynersrs[oamyvshfynaslrqu]lhidxwfyxnteooqqzs[pnxwfetkofgdgeigll]skkakydgcmfyfuwyfpi
+mylmuolvzqegvsrys[slsfmaklnwmlbaqqib]ilutpaqqvgbkexrhksq[qnouzvltrmjvtstaubv]ystsornebtqdepbfn[rwzptvhlfmsvjgp]vqdaqpbjownbtlz
+xfugcgbismoojdaiw[nuwyrjiqrcddsckgka]rmwpvltwfpxcuoq
+trmkejgqteugbyplxr[jxnfhdtqduoudilvo]gfhvptjfzqolpzn
+brxbyjkpskhyxelqzc[eherfigxymatyzc]uhnpycfyhuexifmhw[mqtufbhlvchtjfyqrie]wstbnihxfestirjqg
+gmsfaffefdwpylycgu[ycffvzzgcpfnnevwvl]fxaevbvraehcyaxkjhi
+wsqshnuceysksrqsp[azogmtnfebuahmqf]ovupfnvnzrdeljgict
+gproaacfmidokatbox[ngntwrnzmhuqttk]ertfafnfchokaiuf[lbacfbidrxjrayell]fwzbaikmpnudlqwgwak
+csqccwbysdzhoiwq[kqmxkcgwmkhsaraadtl]twmikglnikmbbvulgam
+xmikhqxprkkpbrbm[fcwmsjyxoigmdezpgr]qvoohhzozfllrxrmvw[uldnkzvdedrczko]eoqubtfldrkdokd[exvlggwmmfnavdyjq]wcdyuriygbvdtsmwx
+yzwaojjbgvqouerlqj[wupouzamjgcxelugdwz]gudoblwwedojufgbl[hlnmcvdsgitydqaergz]liauykhyeanfbqnz[kxznetqxvuxlzovyqx]fthhvuyqixukncruvxd
+pljzzzfwedxoctvarjf[preuhfwjhyatfkeepbl]oqvbccylyczavpve[jttaesjxfofxudw]syndrygyumrahgypl[xtyiwwkrtspyhkppx]xfixdfntvxpdsqqryrm
+iibobxpwfctxezwbyhl[pxqibtdzredjukbs]xspxwfxzwkmtbqbpp[qtoqwbdslluvfxxrte]rztobibnpprgbkvd
+fzycsudjxxyqsebqnf[xdhyyrilwqhohrjop]qjoukdgrtogqcjvi[ujgpjsfipgxsdkajlmj]ugeeytrhbcaqjvfys
+rjnxaitoquekpqa[hizdsfyfinelugp]uzilarrjtcouqxw[cxouglsexamjmfxkem]ugfeendmvhsamxdsbkc[jevmalycyvinoivws]mrchcvmadwlpyym
+cxgdigdcavedxkwoz[ixkshnjpohrhzgclk]ljfstqblntfdwxxr[nktbospjrfsmodi]pmvdcbwwsuvfvhkdc
+xihpbgawtsjdaemqsi[exappnkwhzpuxbtabo]asygirvecghmzwek
+agsrysnebomkidgddk[scnqmapfnvzwdldlj]foufoyrxgsrxphsmg[ekpyrgsshqxveoui]igrrpyodnkfuszvphq[ldvwvfmkzabivyqida]tqgcqaqhiugqginmgdg
+ftalokkmwvnmychcxe[qmkmclrthtqvrzpbbnl]sebxgmjvtzpgwwa
+sflfifzvrstqwxv[ehloimnuhsnlfzclo]pidzhpgnlvmeouhdblh[bymcgygrripjvluh]qwtfcwpwyjjzsdbg[gsieausklaxbhvv]mbwcknsmekbsvzxy
+tcqwxtntpnjmyde[tzvwggjvmousnkgr]vqcrulftlhwcxax
+vaxpbeuoxndqnqfqfrw[zgmekxeilvdxhis]kdjynxgskvfsllrlrk[adbeyrhbylvxmauf]gujqnzsnrapkcugkh
+zyaiyhzzabwxdktkcak[gvocmwficgznesg]syhzrwxfixdzdcn
+kdvtcvgdauvuzuoaqjk[bllhxeuwtzeumulkr]xfehllnbstqtnpi[tszagvpenbqdvjfymzn]jnmvkrfkdugqvrk
+fbuyhgbwosevmlfzfa[dumgjdlumtridjl]ipaiotiwbvovrhfci[rtzswwdbazbrtzunsv]kcfoduojhpbocsaocd
+zbrdkpydedtihdrwth[mtmszuqzjkbiqoi]cxvnykrffutmlpv[mhenchsemaqeakeh]blxmgldcgsedeyerdc
+rfybjscluiprxixzds[owvvwlwspqmwwgzqe]suohwxrmpgtwvkn[bhkujnvspuwsortys]thwttaamaopsuynnvxy[vscgitzsyujngksy]sxyttonsquzryswvjye
+pvdgotkcfqvayxluj[bzefwpnkonqpbzshl]tuhxhtjtcxdybbi[vgivnvqwthkppdhjo]xthnruhpxrvubxpc
+kmevercvnugttmuxejw[pgkmrkfsppeomnpj]axdiwgeroyrbnnamw[cdjxejxqcvciydtlowb]hcqdkovuniidorztqb[ckexdghbagizrztvkct]brrudblfaephsdveu
+tcnppvakkkcvlyadeh[afjjeqqnialrfdapylb]upgmkjuhcdqmxbtf[hztsvlwpihcduoxd]incybyshqjvmqia
+ftxxajvfagituqlel[wxzqvpqjzkbagapyi]rhmjkhphhyogbhvhhk
+lbaxvfkxgpjlgnbiv[epnghhcmzmlribr]bzfkgixukpjlkivvvx
+kqhfbwargcfljca[dajwcxdpnzupgtj]omzbajtlbnvzsfl[lgthltbhsaymfcbyjio]lgcriypdynwkmaxg[zrveyqlcymzdaokxmcx]xrvsydzwqcyopjjkhz
+zlmqfywvqzlvhdjx[opyzjeyvgrpuficjptx]yekbdsloensbtwcji[zzdmocooaokswkhoh]xbeqovknhbymfkwoils
+zlmikilitbrphmeql[fvwagtsyxxlefxij]lnrbggidsccigwmavw[nvwngkikedakbjsqg]rcsrtdkiulovdlybyt
+evfbszgzwvopjmrw[apfxqhohwsuyqqndos]mbbrkclcwcxyasw[vcebwhalumupkiixf]zsjlvlvifmyslpo[wornduwuvfwacvyt]orhbyltvlclyqtzh
+wwiwutciwsouadnf[fcixatjbhsjkvqyqhan]zavxccqxwbzukmrtf[uzzmdfqjktviijwx]bxelmiwiltaouycvz
+uxhnypkqwipstnqlpx[pfmrltrkbxxjrohon]qcsudiligpjjnuzz[dgwmslhoedycdih]klilxgivqifiyrxmdj[rafcmynfdpuaarugr]wzlinkrbastxbytrqwv
+gwcazcrtdocwtnxpw[uyrnqhfkhknvpvqk]lxctiwkoxodvsoxont[gxcdvbggzpkaynquk]tybqiclmwidzuiheat
+bycgcwgekvhhvrrv[yhbjxdhpvjxvfvnxgye]zvvgshtnnkfybapoptj[arjnewupuqezonqpnan]mjrpprtoiciensf
+dqktatenwybipsoxyrt[alessjzyowtyhmt]rvtajbosmcsskpwkxf
+lhagnapuxhiursmf[zthearqsonwszumpkwu]oefbbresvhnetbr[vuqhwuumioepvchm]habghujmnhqwojlbvw[gdxupjwwasidgxe]xyvxxbxukvlsvys
+wsjmynhruoauandx[nmacrlctobhycjl]odtmnavnougxrqowzgp[vhfdmwhldzrsccqh]kzghmvmscrxeqamakod[wsjsdpifbcprlmrkeqe]tbuiskombxnobrr
+rsfuxbdhguqrrje[lzmgnijeavfojttt]tvugblvtyuqohoink
+okydhbqlqxqojgnis[ebtctoijhlkrfbfggs]bvduavhztxbswbdtvz[kvaqznxwglyszfwvl]rirzscsulgfrlwki[nmpygrvpsbulgnzdolb]ubayxfezziquxwm
+epgceboifjuwmbtkx[mxsfqiocoaleeng]ihrcmuloriwkcahbaov[evwextxmoifutiu]ddjqvwbhontlwzmhg[cckszbzdjrwbkxnj]mkffonctplrjpiqve
+mzkqsihkkedzlvju[xyjsjvzuhhkruyg]pvqumdhbbzmmcmlw[pjzhzzmtpldqcowxi]ociobpshmzbqflbgxo[hcwbiqmukroioqjxs]bczktiepzmlaaeku
+gamdwrspfolycty[tktugqpvahqrxmfhu]jrzxddrtbixcdqlqplm[vkowvisvfyatzyom]jdxopjmaxksqyknrtbr
+godrfhnofdwcebpjwr[keiatgzgdqjbtfr]uqadhoarbsbdrevh[tusewuvtmgaiafj]qkumgsziwtssnsyjct[gmnefsbeuqiacdsdllh]zrzhjvphsxsucwcd
+afcgjmwkvdmckrklma[cnhrelyjocpgqpsni]rdkjzzbvwfzophp[cynhzryouowuuiy]jhdacyayikwftlmreg
+mmmxtororwxeiudhzh[unnuvhoroijqxsnhzg]ouimxyccojgnskozz
+xvjgurxzdtbaiul[zrmxlqiwyvfowgndigr]wbpakpahulbkvnweala
+pddiluioyvdczutysfr[dwcqglpljdixcntp]mezezfcpwvlzrsslah[ikozwlohjgwdsvwaf]lajbzlbaklmgaluaio
+qnetjiacxiotczgrlqm[rccudkslumutqlqk]naqwcwlrtkqcwcjc[bdedocqcutdkkbg]zrktdueobyofamj[vhwwecprhkldysvmka]vhpfiiadtjiegkprmw
+jwpmijanukxpafd[mgouzietwniuyoeozh]ojchhetiwykmxcu[msesxkispnyyhthat]gkclrzdrfdhfgnieke[qubdzcgsnogzgrrhr]tozejglmfonjlmghsn
+fmbbyrmspjegfiko[sczruvfxgqvogvvrr]mmthznzttuudwccw[nlugietncjawardjjio]pdjbzwndmymhedtzgp[fmcknqodbiisnzndwo]wnschxicvsccasmxbnm
+tjshdtqixcnucvkhgc[mxoyuobnokjhede]qhqoqocyqutowhqh
+ojqhxwnehyfhdvr[zwolerhoxwbjqdwyv]iwzswaejrzxowgmgqu[sfszzoxjmdqxkikleoq]nartznqpcaoncpzz
+wrzjdrigefohesrxdkq[pzxvrzhkohgqabojcrv]tottapfprfycyjoi[qldiorpimokqzoimuj]rlogwbnqbnqrydjp
+qhczurgopvddfumdkwh[dxzqerqfzfvclmpd]bexascwtlizoacpdrks[eqkdhaazxiyhisbjhkz]shwvmbnwoqbqqgjr[gqwhrpwehpqbqwtrnz]rskgbfaeulbtkuxzij
+ojqzacqecvtaikbi[dqfouvlvmbnqfpg]udjpahuaagajsslu[hnphkiftfddfjrkasm]mdwjcylvlvophtv
+flvgaovkteagpynv[szzperfoebcvyfkdmi]siwkxshdixitmgudlcj[cjaclojgffilrfk]wlfygguppsesoqqd[syxnwdheseoirapzsq]gtqcgykzckvsuobv
+mdiwtzfahcfddvqvjil[vgejbnbfzjgjqvqjguh]xlgwswsnxqrrikunty
+dmibswyxlxxadenxit[indzvmfqlsazkqpwler]zfgzmwfrysljdinb[zchkubvcqkchuhqqozq]fdxxvatlwlynvpcc[jpdqlqfzwikvmuuvvif]qxayqjtamrjkmmajfw
+cvuhsnxjwqqvqnktov[isynyancutzzaegsu]wafqfzxamdssndcezf[mlcqpcptyvzubjsjjtw]ttwxrnsjspbgfpdpuyj[vcbtyvnkxvhjxqxpnrz]cejbiqkdgdoocfp
+xmrgmkkhncmoxsuhwxt[knratlhklaubcmanoe]kwvoawpghbndceos[rpgghgrmzrvproskz]ililcrocksgedhjuhjr[osfcbrqhtkhyktkfxk]itklpoezpplrenxtqv
+mznmrotthwphvnqgrca[lzmbkodxnyqcihjwsp]tzgxczqosvxpfwlrc[hbedolihyyunfwj]izdaufruczpkxqj
+bzaknsueaptjdcsw[mfyqvkzdxuhedeo]khaxflvucwkbzgutsge[yqjpgywasndedvwsd]zmivwoqmrqjfkvmhr[asmmexyekrgrfhnfm]ggjhdjwdeczhoiipfz
+zirtgiiqekqpqny[gmyxihpinxlvrahsuj]hvgcviarxrtsofvcf[akymzspsfehurnuz]kitiugedgszjjnq
+oemqvouptnqauewn[chwelvewqnrwatnami]vsxhrtilwgaulrhrzq
+qpncwiwclnvcawai[gjrsbjrryhbwoviv]estrqlcofuysayrezlq[zmoixozgmgsncdalu]lnfbogvznfmxcuju
+dwfjbqqfnwsdodul[ehyolwsgpgsdxyitjqd]bqxqcfhexqxphqmxk[nxsjycrzzkicjqb]pcflghwqinnnpxruuqv[ownihwpcnizyyifkihv]cexjgqqhswpnrujgj
+ruugwpvhjyjwecfchn[ihtbgcwirdnuyjbx]jckbhwdmpsyquwckj
+eshkwnhkunybxdctmj[dkefiycsvmzhnjfea]knmcagrgdhctbzuj[weikvdezylymclftryg]wnvhotwryuerqui[epyensfacxyegnzdvz]wlgztwudoejbtqyu
+avuqgnzautxxbrteabq[ybapddktmqsaijqx]pccadttkazpdxub
+tvejinpchgummbg[uahhifivytznhms]xbsdcxyaiceykgjqjsd[npkermlinikufcunxro]fkbdthtbgjtorrkjpcw
+guswezvvjvnrgcqnb[ovvonjqfigdbfwchq]rdkjkwyvkalcjqnj[awcsmucmugnmeiugm]ugdrjtgsrgppconirkz
+zahfosuxhtuqptoaz[qhsqtkyovsddgol]kxgccetcutyrcethsil
+ytuxuxgzsvcecwamt[lovvgqqzfybywhcqfce]juvhcgndgfkwoynthrh[ruloprfijalospov]gdcheafirlvghthb
+jxethomfiwzhksww[vzcelvyiqjxayxifjkc]gnzrlibobanzorykii
+pjlywpqlpzjdabozer[lrehazdewzhixga]zdvzuirkyorztrwy[fikcexbaiwtnqbt]fobmkmgnxfmaftk
+taagvqjyhughwmkkvl[hkuztqckzdhnktvn]gsabfglsywphugckyd
+oshqjstzujgpiwczrj[hduptjzmswqkhbdqgov]hqmsoxukrfovbeopbg
+xgsjpvidzwicmsb[bunafjgrbtvqbapoopk]mqfyvvahpjyfoalzozh[mmfptgqrojhicfncbmd]saxxjfzzjihfmllsgcs[wyqlxccerdjykocqy]hzuwvusymrxywetmna
+lgieqmfglevrbdvnn[yuezptfbplhkimfq]rvwssgzdwlgpfqf[qkegiqztcofvvtrqzcd]wqfawsobdysrfqfqbv
+ccauaprhxrjdsbrqzz[sskvkaaspuldccrg]wjortlhzgsgpwesga[waszszzivlptpedsdx]iaklpnaaeiswyzgza
+mskrfzoumbmanthiths[jcbxermcqmrlsoe]dmiodqzankfosysgbpu[hqzvulbmguyvsqhvjuf]yiqcoarpbavqxsiwtv
+cknpfcczfjvmuifaii[oygofisiwuhemyz]tedofahngltwsufvwe[leioechdfhojycsimh]padlduabrmtbncr
+glqxkbujgswoysb[fimbwphbpeelcwdi]vpzolyuuqulcdplfr[psxblsccqodbrbs]jhrmzsgdemycrhzsm[gmdvsnwufhcgjqvof]psvervlisrluzisrw
+cxrafoyokflthjcy[wupjgniyzvgwnbgseu]jayoymnavgydhkpc[yyfumpawulrxokrcxw]ggfmtwrbqvjhecmn[zwtrupxseojrhqtwe]szlvbhlihmzeemcdvs
+zkbhccweyvajikkoxfy[fszqezsvtctafsv]vqumsjdlyznmzrwib
+fnzpumsusucgyjyqe[fcfhmlxixcswtijzx]elgibjruhpsnyeikpev[cxasrzvzoqqamrwxeyb]hvqjlnkfttgveuxzoa
+aqdyrsuxpeazhvpmv[oudjrdigbhovgnproor]zoqmqtismbzypyrssu[mmjhslzqmbfrzoez]pavcrhmjsnjudxk[usqrdmdxetgysgrnyt]tmhronwzwrzadepjt
+oxjgsxwdkvbtwun[voxemrcenvrllxim]xqpqvkzffsowfrxcvt[vuhmfghljhheozjp]iagixberjizzwukbb
+hhmnefofdypbkgy[piopbixdrssyawazfc]vfvwwevieiyevhciymp[tibldfadnlohqub]ifcjdjqmznrpnez
+idzefrctgukgftpkvt[xhfjwjaifgstqulkjsg]eppjpjpgvlurphg[ljzttsfemjpjlgmhnqq]gxuregbxdtglnnc
+swtdvbcjngxrzsqvmya[oscfcdxmjandmsdni]xlvamtsetxkjlmafuq[ndkesmiexgmkuyemqy]tjnsiobklvqxvkfg
+ciyxyauiynetvuysnqs[ovngnnbrpiavswcek]rnaeejyiqnynqkpyloz[mccrpfjqimexuyd]nnbignqcpdpisjkzdsz[vrvsahyhkexkxutcgmo]kctxzgiznbtghfsyl
+hpkxpqeyumhouklxoai[qxmisohfibgoaqnkcu]czzpaxszfcimeqjjk[grwuxysxuwxcwftda]spkpkckuiswehsh[itrxjgkpkowcbilvtgp]guumzewmubuuyfafli
+rivqomdhbrkecpbb[wdohqrdyvioabfbf]dbllzrwwbfbgdqktj[dxvafeshpdywcxl]uzstsjlisdrnfisduck[cjazhqptbxcixsf]nslumhmpbmqpivn
+qtjhnrwzpqaqpkdz[iocymnvkcvemkfiyt]qwrvnjzeopltnpytb[trvortqtdqfpmrwbcb]cxsunonoahemdaoywu
+eghqxxqrjofvlwtclmt[czflqhgwqesbeja]dkempvjqqctfbjtqr
+scoquhherndelmwbo[sshazaphvblvxlvcvi]wcvdremsljdidzbfo
+hrveibqmirdtsfvvp[phsldxexzafxwfyync]sotdtqgujticqic[osvepfuzgbcarhiupj]ydjbylbekezrtykjysb
+nlgdecifcwmuayibgrh[kasewwljltuzeobe]rmiyqugsqioouoxmbc
+hivavjyoxnbcjqgfkcu[vsgnoayjlewjsmfoge]rqctposdtaxiabiaps[uovebqmxopsmbzmbljz]ltpiruahxuaubqzsa
+pkpapgycinrwpglmkx[payhdtzrixoyoeti]vvudfhjejwfzqbv[udswjrppbnpeojfbxi]arkpkevytpytwlrzblc
+lxtzohxiknrbiydkuq[tjzcjzgasuadhqmrenb]dwleahtmccflund
+biokgvnjswuselhtuzi[comxhmihobxmgfua]elbjwejsnosujshbqd[tkwacudvjplpqaicmb]zadsfcvcemamozlimw
+pnqaihstdftozsriips[lkhdtkwnqrypfpi]peindlywisgzfcfry
+fkdpjbqytvzvjnws[slqefmhqexwhkkdhv]jjzqnutkhosrpvj[wjvzprupaavpuzmc]cqkdwaosyntbuyxhk
+oevqjtpbljycelre[qsjbtmwnxmimbtaf]simiksrgdafhjktu
+appbdxfomrzhtlb[njqrhqbvqvdvgackwi]cngofyjrrwisczz
+xucncimruxvabncx[gbubelyrtgutkqlsh]lfneuteufvnubxnnnce[spsauokwxkzlghxsvj]ticuuxutrlrqmlqo
+suzaytczxhxstoqodm[efhicwilrikymrvbe]diqcwvsagtjadurtkft
+escgmnsjlkclmkff[anasojtvnzzmawcboha]quxaypktxokdtjtvw[nnansptoensuvdqbqh]bwrvzncyicnclmkv[zklwtdlwbciplfuts]qsslygkcepyvfmrivlv
+kqdcsjdbvgzfpolkvr[nzfpjesnxmhradmeqh]xekfptpbnohnrdwe
+ytrjotkxynxsdlfdood[gfgsticgrqrefsbhd]dqrqmdqfitiqafmp
+dkcpuvmrctwtwtjveoz[hvqpvkumjmhbvtvnoy]ppvruhonlhfwltmp
+igkkzzqtjaczvwimgs[nxzvgepflgmumbr]xwbqpfpndyvaxfufwj[dylxopnrjlxdtvhoj]keepzdtkjrcszilhk
+kudscwhbhmiqkyu[npsoiozwddcysbw]qontovsowstkobmfx[vpypckodavrypggo]utmevbjiupwbqimzixo
+rexmfqfertkdkgyw[fazktroqmzuqnws]ssxqlyuuizozyafaa
+spaelxckytsjxewny[frhpgodqzkobawpe]urcygtcihbnpayer[ndhguaxbiqxmfgu]gyqdqofuhthgqmqu[xplcrhabqrvxtixlk]xuclgwuisbehygf
+nepcketqyhmbolu[klkpcndcxovtxgenahq]khcemvzgfitmgwboe[adgtmqlirrrclbpmimx]sgepebeedqtakqjg[wrdclimitkqejwwt]wcjuedbmdejtknxo
+poikpbptymruxwyo[vfhtxmdcfhmqvkbhfi]bestifhuiokqtqqzy[ewngjbizxocmhgf]bttdzjlguaddgmktnb
+hikyosezhctnprla[hnfrgdaujrsamhbfpo]wdpzglchlcxleofyqqu[yrpkmzeqrspoqfx]rfskxkbijoxsgucfpb
+zkkfdqkjmmxurilkrka[rijqjdcohanebspyh]srjevlnrwkaghovhus[kgrgzuklkakvzlexl]tgnqewvicnfyocaxfu
+bafjxjjsbkvwpbbu[ytnoocrzdceohcjzsmb]tfxyycvigweydqtt[fzgbgfqzlbdngjhfko]xxytzvgkqwrjpmwnqrj[hsclxpgznrwxorrf]jnjjvlzeymalkrw
+pvdeombqyhdeuracbsw[ogombzjnxmptwfwe]jwhfzfxjfwfkersx
+oqdoxgqsnzsyoiozcv[njjfqdqpljgsqjteq]xzyxqhzwulwjggwr[vftspkxrvlidhxpz]wsluksmzthfzialzbn[rnpnecucmnumicphp]iucuubcmodrgbezfi
+fhqgtjwndbvxhjnay[zhjyasrxjhshaibeee]gpnknolvzigrufpsy[uvkhwcshsalizlhln]miqggogcoalsnsg
+kbaefnclkfuaacyaqw[kvxkjtmhrpmfybabmrn]bfcgpluqgcvcywfilgu[itxwxuzuhirpwzjn]sqssnjplrwtusvkoq[xtswpgursrnfolfp]msgvzgspshljqvy
+fmtectsgyckgsxhtq[tolibcypycluxqggvf]ahsxzidiygtnpqth[fnxqvonhogepgcnm]qalfxkdyvzzwqav
+ivjntbzpeqkwncmju[tduwafmzuadkrarv]codtenbkheubswo[imscmiquwvjkktoqwhs]gxcioexacilhqpbgu
+nrxlalqatettzodgrs[zmscgfitelxpimva]ddcjrltymmxjejsdjb[yxfjgjwdazvgldbsl]xsqeusulfsqplrpet
+yachjgxyuilhkuxfy[cbmlgjovjsjscrb]qqhzalwoyrshsmaejb[jfwwyvjdgqpjunys]kbrfaibdtcknzue[jguruergvdgbjkv]tgsuseeylzhplgrpg
+haobgfarfwwsnsmt[ebkldjwmfkmsyjl]nvlelqzqjlqqplbrtwd[qvitfazopoylebv]jidnhpalxguenkeons[syannxpoqdjlsehj]nyoqfdaqlfexszfaf
+lkblrelkqvilunrpz[pqzkriftkhwruzxjp]uthvsrxlswtiuej[rqxmpszqrwyrrpj]idshhewuwwdgdys
+jtxtiohfhiutnkxrw[xpxcqczqpekfmusvwr]sbqsrjpvimcbpapxp
+cgbufgextzfgphjmpa[jhcpgxakwxrbedf]jdckfachzooibtpgde[upjxjgkbcocrtcel]zfuntskkkaqoaawlft[atvbrjlpzjmpqla]zkznozcvzbtilaqu
+npxehvadmrbadkjf[udleiusfgbphbicllz]hcffuslnycbpubqfmbj[omluucjltknwiebdefp]gbmwvqgieonzfwrclse[oelxxcfbljsyeijeefl]jofvmydknyufeyi
+xsusetwokemyldccer[lptgydchemsqljaxypo]ejtlagjmhaszjzqsnn
+sgodqumychhkvnk[roubwxyrgybcnaqv]rzlmvxkwxfhzhrgvjra[kwvngfedqvvuishjoji]qppuwczsfqqxxqsepu[zmdxnkvlrnkfssv]afnapqutdqznltezah
+pcnanwdmzpshbmyw[patcrbtvevbtanaxovb]stuyxlurceqhactp
+aivddjfrbkpvmlsooj[hvrvynurbxihuelkjl]rpixqxbknnktowmkdo[pkmxpdasehhkpyy]odwdkfrroynzswerbs[mfvmvxovfqegtnxllpa]ufboctmqfwfehmfebkf
+rtbhehgjnevzmmqgep[yzodzcckeqmwpbook]mldhiwfaxrnljjovg
+xzycdgrfzcgzuebvi[hugmldunkbtdxeli]qugxgdvvfygluodabgq
+uiocwjcjawkezsthdj[azmygforvoiglqaobez]xliasvcjctalzfdr
+svtsxepnrxkgyomsjt[dglqtylczubhqapb]kzyrpfjigqwaeavrus[wizgslqvgqbogptg]sdufetznpmxchfpy
+aqkjwedsgvucjvbu[kjcxtyswlcfkgimqqmo]cefzpwaqfbyvfcqc[dfjrksosggnnulxe]joaumybazgctrshh
+whzvbjllsrxgfnqi[jhgsvmmydwgwdjglx]ebshecvmjodytfhpsw[nmcgzfhovcwodbtif]ulsnbqybdkszugxd[yfocxkmabsdnelad]wggxekhcisugatilgp
+muqhaqwwzuoaqfyonl[cdiyytjrutnggkpfc]cwpbjzjinvmcfxilx[krzhyrpnexotxhapzkk]ljkitrakpbxghpweviv
+tqwtflnxvucqsgmd[fzflzmpqlsnmpjixres]ipfqmaohkqstxofevcb[gmgkfolwwihufdpze]owpyncadwgzzmqyv
+ixbexcxmoqpehwqabi[txmhelnipufwbwjzzj]mvmhtepvmvxpssr[wydqdqbtpbkrrexe]fqlkemrbdtpswbcqy[butplvsurilrgfawgco]tavqvajtocbvjevsil
+vwfkoxvaofxskyhbjqm[puvnruashljbsqbscf]taievkrmmgnxdpa[xrnlbvjmvidvnkv]gxudgkdjkszrjyfuy
+itnjahxgfxgjnslbe[hbwbbpvylfbyqbgfpvz]suqdsbpmptbrujuf[yfkvqhmseaimirlwamb]svktdnbormbmbsnilnk[xlybsibrczhbpnphw]vcslptwylljzxjlvcn
+lccctefsdrcdlkw[hnwxoelaqsswnrlipk]dxslofpdnwpdqqtyqk[lcptfiqjgjaakmshdu]ypnniarllzpkrinfo[zyrdjbowiiytfhb]qstsanwuwunmeytkmk
+wtxasrkodazruvnr[bewsicxijbwjblgjj]hnhtxsccchhcycbt[gycsmvclfyjlraerprl]wowibzopjcibenefiti[uuxeudxwqtrswbxuhxb]ttsgxsgkbamcaocut
+ntvwumbkdxpduiy[zkhhxzidmtujaytpsnc]hzzwgoqlwyadsvaejhy[bvbtzbhaqgusces]zfllkpmjpdddzkqdm
+vzwgoqznxdvefgbqkjs[swckbsoabtxlkhbksg]zqjsgiodujmdfxfhiax
+movhrjexteijabgzjtt[qmriigrpvzoanmnmvsw]nwmdizazbepnduo[qxezsdcvcwdfhfmna]igkggjfjshvekgaapss[weeuzvhhvucaytq]pwwxdlihtxesiffju
+xkluztptozcnbvh[btptpdpiztmrhfijfk]ffjcwrplvkhuuxugg
+hhfzzjrspqcimcn[kjdhabulyhfjytno]tcbttnaialvktxqqsfn
+xwrxducaozrhxme[magpnshvryqtljmijqs]oxusvmrtigxebedfk
+fzuvuhajudnlxscbofd[otmsbqkykhucrldvttx]blmfnsqkwlndpjqf[yqpwlhlpykachcqeesu]injosnmllqisgwqxfuo[vsbfohlfrptrxib]zqamtnzifmehdxxoh
+rperdjgiisvvnnkqa[wtgzipvjvnuyvtqt]llbszshmkckrtmk[qlidltzjvjtueyy]vaqxlpwkvspahufb[oatmkdkqqwucfodoilu]axluymagirjmerkhzu
+whferflocizjrokfcay[mmwecazbfcqkomqmtte]xzzqnxyjleqvfhdollz[qefcdifayasgncsitrx]eqcqtehhaetqlkl
+punmackiplnvsvaibb[duepoewfezjbmiprz]xeqtdtxsgdpjgquefny[enprhqhpeyfvjodhg]dqcbffvaeznzycitoz[gilxojkhxhttizc]canikhdckixnlnhm
+eiphpmokjfcyqttz[gtmpkvnsrbwqrdgkhw]gaedvjkebfmagujj
+vyrzozjvlflremttj[fmzcdwwhgxetugth]pahbkmcxhcuuexrqo
+izzyhwipmlykvvvmcr[fewicghbzxsojowdhg]mrzrbqtuvxaxzef[zbgnaaslocwtcne]mbzxovudbgkiwpdevin
+usxkkeufvdoggas[dswwfmzmseduqxhtvwx]zgqaeauwnbvslksyovd
+glfrqjuwkvdohyiwdt[pvjouwyzevujmgejnf]lrbkapwbsrreomofbo[wkjravacdyfclczuosc]mwmhplddwqgreyyzcko
+dkfnlleylbdaajb[yyintvqizzzxrfcpi]tngxominnsczlht[upwicgefegpbmnrr]fxfefjvyqvdcrmglrx
+rshswtpuebrupwdzqd[ksbhjfdzcolihpty]vxmdecfcljflahiuy[fdyfjnsmcpxgnbhzz]abuwcdidsndgdnsy[wpaglfwmquxtdvcq]odgxpvmwhlwzudtqpnz
+rplrsndfombfrzzlc[uiugcytieaoqilk]ntvrfovdvzuuonp
+mqzpzeudnxiqahnska[llussgmurjghbnnoole]eusafrqscbpinpaov[msdqfnpwmvegogpxo]inyrlydjdbqpztebbib
+qmmliykhvnkulamtuiw[udnzzpmmswzcavkuxv]gcewrmlypdeocvbyjj
+uiqhaiqjwqofbgqto[gkakppyupbxwnno]lcwfhzqpmowkejj[rtandvdifasfywsle]rlfkhnelytlzutfnv[fuoanrlavgjygzqhsde]dwfddcgrxzkgtcm
+bzgyinxpqvasnlb[hvsierfmklqiivawit]sqkqdyuvutegxzrkgyd[mvittbxhbtklpuh]afvaocxcbvrivxvuv
+rlpdcdvetmwhoeh[ustdwsmbojqbqwc]bbqvzwlscykctcgoho
+tahntlhdicpdnnalpp[fnmwvddaoxkmjqst]xixbiyqgxypqaedxnem[smuvqxwgwfubhmuw]lthrcrcxoimmqgk[ezaxxdumdwigkvu]crowudsyxfforlrayi
+hpvryeheavhrkjloujx[mhehgywzdejsbfuwey]pkrgqmqmudayqmyv
+umowweqsyinygfe[grtfniugpboogtgpv]ttgtktqopjsywulprqx
+csjlkynrlvbgwlzg[nsvnttchrhqipcn]xariwkhwfjfwehfswp
+cacydzczdaqfshhr[jzgqrfcnbqshdzqfnmo]dnlkizppyuvnyrkuxce
+kangosnlzmgeaiknm[bfajqjeohycglxswlra]tkqftnbkfagagcjvi[ovdubgbwoeqefrw]qvklbmsmtzwxwpuywel[usjzhltvradirrddsf]jmxnrjffssgjlfivba
+snomixyfcqkpwktt[iyxjqorsjqjuunteqt]tdbqjkrsdgdlyelcw[cfebyskawmwkgraytn]gsqrexnbkrwpcmyrft
+rafnquyxsuwvjgoah[bhcqlwyxonwuqowofp]mtdaordhobwntkco[rtyupdiocyhxkfsbv]cunuqryocxscununa
+dexyukhtvmozlth[omyonfjhuzikquoivfa]abyszyboigekahfgl
+cfaamntsdtevtoou[amuzpgjthvqzhdqn]cyadiddxurfpdakbwk[uyqjkkyhdalczourhr]zxhnnyzahmknirc
+zoqdnxwmhiwrqaejekb[qglzymehadgnhyoaf]whivbjvmjxrrrcju[xsiczgkcermegfxz]yrqdhyqsitcbuwat
+terznkuheuiksxrak[mvnbiknrfabvjwdkxn]cwddjxvgmetzjrkzea[xziqxlxbnvhkmqbos]fhxfhmqgpuadsubh[zeqlrmsxwvjemyw]nsfzmxgouassmcs
+ybeezzeojemnmzgcpdl[rjzpwdnraffmmqenf]bmsevuoarcwfysmav[yzvllscuulqatcxvl]vlmyukjcnfybkwdwp
+fnoorwmtmzwvwktqbo[ajydafoskqgtidoz]rkvcabzlcpxvxkjlu
+faikhkzhlrclghufqs[flkmuovmqyqnkfaf]asunufsqzdxoudiaxxb[hadjusanacyvrjedrms]kecxdaaazmwrysfyqml[egajblaxnaynubwlkzq]wmjxhcmohmeoyoukz
+lifjpuhsmpcwminulbp[ogsqhmitayjkvhxn]tpyrwhmddljxsuf[yvbworbmupysruqu]xcibjyvqwkwawzdfm[euriftllunddsasont]wnpqnncbbjrnzzwd
+dtwtsjecebuxxscwdej[gxutszjzoexdwwpxfxh]qfskmyjabemuxxl
+fjqeekfbyxrfxhqj[udaboiljhhoqfgv]vuoyvxfoxuqtrfyu[gdykotdfbbpwmie]rgszrfktcxyuhvkv
+xyqqdpygmeowmpkzxdd[bjxnjajhhffgsjtf]beeakoraqizrvllo[ttbjhpxiaijuyfunqd]hbxswggfvnjhzyymmxg
+srtnhdjdniufgyhgehw[vribdcfzbbuksonm]zyhzrsjuveucsawn
+uaolqhuxfyolzyzxesi[olnhuxcyyzywhqjkgcp]lhwtpfmegcpmuohh
+ztblwjazkufcifqu[gqwhahvnajlciqlab]yhloiuhbkwzmynun
+fylubozznhbgqgl[jhujcfrttvwsynxbv]baddxoctavloxqy[ymvtyrqgqmuedvtviis]iunkknlhgoauhckknz[qluvgkvaqhrawtvvl]gbjvfrdirkhuifrss
+xqujempeigpgeyifi[gmuequihzfuppqz]vtejaedoorvisdogx
+fdmbfvtxctvlsqpdg[ppfydrwmxhonatvil]jswiuniywrjammkuq[tcggdwprsapeogozg]gkaplvlfqulngueiprd[jvdyisxwrzgzanqjnby]soovzbtczxxxfzpj
+mlmotkwsacuwslthc[dopkkfjvrkqlmluai]ziyyyuqwvtjieocc
+unqckrsxtyadoeup[rcbvmphhdlbwbgzti]nxtsjyxkihfnxzgx[jeznsoqhajzekppvfgl]xhvbdrqswazjzsr
+qzonssvnqehuodjm[owetefyiumtshqqa]garcprzmvvujvlu[ufjepcondnxhcraknvp]sdwmafrnzdhabbr
+htlwjrpzxlqzaqyhhj[bhnrcyoqmpxkcwtoem]mwvnohqdiiyjgmr[vpmbiueqcsixwyxvqbr]ddqbaqtkoeiepkx[kjvlejrlcgogwewymqy]azlvqkhibkvpvgts
+fasqsusdjdurhzhmxy[beuhgugmlbobevxa]rkszfjsnzbqweycv[pobeqlhcuytqqgtkbp]ugmqmvhkunncokeqv[xjhcfliwmotyktlqaz]kjkawayleopewbhamo
+gjukuffemjaastxdtl[enqvehxspvgyaxtqo]fjtzivcxhwmgsgcf[eldofthqgeifmmjpqvp]pzmrzoktfngiatmaasl
+evswvustuzguawqg[eekvvswhthiuitu]gnkkxsqwsofsoioaan
+slbvgfuwwxdaekfjdz[nesgfzgxxsnrgedtlbr]csmhdgvsclsflwxq[phukwbprlliaewbqjrq]qqnfatzpalhuuchdl
+fcichhbnervkoyzgou[jqivwhooetniapnts]cmlbezxzjrgotgrkv[jwtovryqdnyurgdlh]iqrnakzkquqvlud
+twywruqrxmlimxi[cmbuaiyisjfucji]hnmqevywynqocxi
+uensckwobqnhwpmy[laeyyzcrkqwjwwtb]ztujdcvfodwlakjxa[hsnxusbqwxwijgveqo]dsflajtdxnptmvnm[zvrmewhwiyqzrdsri]udvmuglxpkdnmzbbkj
+jzgevefvzpmbnmwbuzk[iyncfkotavwinyt]efxtuwuclegiaksqhw[drfnvjygczdpflhr]ecjtnayoruhczrtiwa
+qxchkvrkswtdgxesbq[zozvdyjglsajwsymn]flxwmludxuuufikvwcm
+bvkauvycxhsfedi[etgucuislswuesfqudn]rxppectbqdozxmjlcy[bmqpcoljmvtifmx]dbdtweevpzvskqyefwl[uqczspdraplmucwfyp]bpufbddjskedwxltqgx
+lsccsgszfttmtbm[gicwhuzfyjzphptd]mktodtjlpwawglphs[dfsjbfnwfxxinue]nldonynzupojalctsds[hbimwpgmfhkdtedtig]oxxqsccdbnpzeikwj
+tlmxbhbpdjnagkuuurd[fxcuxmpnkvimfevb]fmtxsequpqgukvgo[cvrjsgzyirrqvgag]losjdyginsppgle
+acealhqzrrbnskwla[kpxiuidwwzswvvt]tlehlrejjirrpelcpvs[hicuazvidjdnuozqg]pljbbpztpxzqubh
+qvgvyjzkfkqecyfi[mtsswvgnyvbjkbdd]rcfpqdgxtcexwcgevf[jnutyvnxznanmkwbor]uitbdmbrvsczrqtlzb[deiyfcsvhwqkjyyraoh]mgsivfzvqzwerra
+xldbwzdplokritegpot[dkilyibmiqqhittcbe]dvolajbquiegpyzm[tiwarbemwlmwpty]nsknuzyyjfhrmaf[yrutylvvvkxpleg]dempcoygehabakatfsw
+xdtbsxcmwlyyewdci[qxtgtieblptxcrxjc]lfnfzcyzctxxwpxanp[zakzzhdzbgdmsuhu]gtrnswhdqhuhmkb
+jiwoxrumnfbjlwkmhr[puvnrkflogcazwtbc]zlebejqrzictznzjhj[hxbveahojvbdqaa]etrqwrobjqrxdyqzdw[qpkcavbviaajsbzw]yybkscfwkadoysg
+eteufxuerkogooqtds[tatatmxkqhdvvwwe]noedcedzspeyqfmmd
+cthiztqbwlgffekx[btugyjtwojnqocop]cpfwsoehhnfftbkup[rrcurvtjybfngzr]bftefflqsiacppggg
+cpbomncsxcooaynbyb[nmnxjillbkzozriaic]foyuenlrilyaaiavd[dilsdxhwvvuiyrpoe]jlnmynnwhggznnly
+emnwagolpfpzcpps[uedrxoasfqlnnynlhtb]didvjcpvkjnxeyxtvv[xvrtztsajljmixymooz]zuayhoxmtftlkidfrz[rwmzeoprmwvixth]occafpfaspkktqvsdo
+lodlbpyfqlpambnb[ujkoamorycpjdahia]fzcrwltfqghqbhvxn
+nizwzpivrpafchpsxh[onyomxlcatphdydyb]ydydlvlpsnrpfeyz
+bbnkumpfxywuaju[urgqyoeidnzcrhebv]ilnwwmvvjgpoyvno
+spdalcbxoljjsnnp[fztxwiuercdzikbbk]akolwywqiysxpubgu[zbwzwtpyfmicoch]bpzsdwoconslujf[uiizmxhuylhilnor]uhrqppehrrcztkfmkv
+rgddxscswnskqpxpan[mffqrbysmfatawfmxg]nbkentnrqlfynyy[voxcdqkhylzufrjekdd]voveqepyrzidwkscp[nfjvzhhaapnsvlgvq]vexwngjkdcxbwkidns
+jpntpuayoxlduqww[ezrqmpfomsfilulevvy]cjrjefmcnbswkrn
+mjfyrlfzelvjonnn[ulcbojuiaahlopwk]idenqpkorklddbnaz
+bhgshnxhcgbestmfnxv[mvebmbvioqohanjpog]mntsrtzfzurcnqxpk[bdcahsyheihtumq]eickztygasboinu
+zlplqtceqgefnke[gmqhyjmtykiyxnz]ipfqojghtbsioksptem
+lbbcqgzfdgerelg[wwfafbqlxcfomqyu]watztxtiqwqrgqzjxan[gxntmrjphcqsuvbygab]wirbojjuorwzwudlblj
+gjlljqgroftymgt[qbgnlxbwcxykipz]iihojyaziefwjyy[jnsmszgytndqggahn]qzgxgpudmhmyktg
+mzujymrvymlfuefmc[lowenpwwbljiuaex]zdoohchvifnhbln[kmmdgmmzpajpbpses]begvpvufpiiknphagyl[sblceylkgsmpmkkptpj]igmhiscbofjridkibs
+evlnogsloknvghdj[yxdrizzmnnpledj]mdphafqgsjokxfxv[jbjwluoucouakaef]iddlilvtxhmmzvhecf
+xkifittdfqhyilxath[qutqagtwjergmpzwozk]ommacqhnpzvalxyyowc[hotsxrwsqfgvvzpvn]xjpysvdceyiarwla[pcmqagoxtbiqvnk]xjyqptmlcqppwvun
+fsnqlrxepbchttru[wtbshrnrkwfipibyd]ugokorswuuvhmionq[tgbjfinuwfidoojqcb]dhrycpbrbgvwkqoa[aedbxtjjmhbplwhtkp]dipkjoflmykyisfwh
+qjzrvokvqtakxgqlhcr[xcsezvnaaqddnscyx]yphwgbeecgofsdoqkj[nzexfrstzntliwfk]nmjjavothhltpfzl[tqhxmitysrnznelkr]xzrteqpmzxxwfjmlm
+pjuefjhjpzypafnrz[icmlfeeurgsdrgpher]filoaxijpcrlhahuro[zldzwqaxyaazvbxnqp]tkomnofolyeclyxbfk
+ypcbanszbtapwax[yubwfxyblmrciwhvnvw]bgjciiddgwsgzqnzaue[qronyqcvzbelsywyl]luzqvtdkvasryrk
+pazfsvlvzjrhffpsckz[ymankdoapvwotrpjm]hygkvlsmknzdzwe[nmmponlmpmyecec]xlyouznwjdsvfve
+yoktdgyjyjmxoppisp[stjvdedbirzwqtpkb]qoqkdqwkpprxztgfc[tzahjyjnmnekwyokbn]mkcaateraenzzfs[cpgyhilznfdeyxrbtf]iylvsbxcjpflwyaqjde
+rvdotzpukiohsaz[coziezujbxmihzmjetw]loneukwuckqfvqkk[ynlwusyvfxkihdo]lezljajvdrepwjtxrzf[pzaxvbabpytdtedu]kzypirxlfccdorpe
+wncchvvpgqpgsfwtkx[jgxqaowxpuyccvaof]suhckeyiuukphsc
+bmmddzmbntvifwvjqke[kthmploktlagqdcp]yshronrwwxaumtezdwy[wyayyzswlygqljv]cpipupwpvtulpwmhfi[nbyjveyambtrzyg]taywpwuagvmzbyea
+dlzkgjhjrxhnvcu[lqykoztnlcoimougo]ijbtwesjymwjwtbbp[efdwxnuattyhuhy]zgsccjbflsvyskyjd[hndrparcadyfdmr]pkwhspnypwejvpbb
+yrudnkhmryctzxj[myculukcorfjveashn]nwqjutgwzwtrhywn
+sirwvtfdtmwlslskjqq[umfkwtinqleedyjk]krukyaewjyaxeddj[houzkplzbpbwyondki]vlcccazbpfsahmklsn[bcmdxhwrdchlquvvxtm]nfqvtnzbgotzxntk
+jlmjrojhqjwsjjlfx[yfpgrcpmohvwhkehp]xynfpofzesitrdia[juhtudcvapywgbirah]yabzjurgykvqxngvd[dustqrmgsyxfflxddxg]moqtjnsqgjzkqne
+jjcphhlctetsmrzqsdx[ptzjefvylkgmgdx]xjdygmcoebrmuqimky[gdzcbodwmtanfpjv]yljqodfuxztqciwxlkb[qehknsdvgdaugohfbrv]uvnjkrhhqhdgolm
+suabenrfopqsqowfvb[lhtpqqyzelakwktkvvp]dfpptubztvqslbifnht[rygoefoqzmcwipmedoq]fgluhxtmnxivcjb
+ekrrmuecrgdhpeotivv[kxkzwxjbtaizqpapb]hkxxbqllizgoifd[ndwtymhzmjkwhfsqr]tkjeezcokycysbq
+vahyryyfiekzmnaghy[dunuoyampibhomw]fuaolgtksarnxqzgoat
+opqrpddoyrgpvkt[xtylkrcogeirwiwjff]qddhfndaqfjyccjsasl[kdwqztteysjdealp]jvpfwepmuknsuvj[osyjycjxyxxhgwtozzu]auholwpmxhgvqhl
+finznvwrtmxdkynqq[znzojlzkdfoyeqkb]fnjmchixkxmxnyb
+gncexwppmxqmkhbhzw[tgqrfrdtfrfmfwegl]frqkfwbxrdlfcnfaf
+mgnaaimzjhippkz[afphuskevlwqzleiodn]emvyyesllcpoexkxwkm[zvfxpqmdtquznpumg]iegbxiqmjunxkqmwgjh[vmyqsqvwmbrpyoqyeo]yddgqlqdekpjdamz
+sqnxywmlpdbbuzqdny[tnljzbvgduiqwtkopc]cgjtjcdqvcrhnlrr
+pwktmqciycemwmznvg[hondgdpjvhllgez]zivqgvlldyvgdggevtr
+mnjcsuljiknowfdt[tnqyexaahpngwzxd]vbvowakfzaiwvmvmr[quqcepdcnxpfdymyby]iosgerilxasxtlfo[vgmkhzudwsahzfhlz]sfyqfjweawnpedhpa
+auzadgvorufbggazq[wtmlikewnvpjxwl]pzwshvhfhmvhpzn
+chzpyezzzomccxuy[klzfwlherejbxiknft]mepqrextkfdsymvehyf[wntgvziaxrikkmpe]vhkrbfpcwxiruuunmog
+fdhxyylnqyvixokzws[rznpbyrsiqveane]awaconkatxjrzoyqny[zubifcnqbeguvdb]pnfgvufswpgouet
+gdplslxmkeqrgpxmz[jytqvvijffchjzdwio]lkoyipmcdnvrobi[odvxcudnmizlalllpk]ndzooooetllelopjq[yxswnbybqkmogpxqxi]hhsiadkfchzmirqbe
+nasgwopoiadqpopnrhm[zddbvnqepjjpvyns]aygazvcnfsahyeia[qyxrvgubcntrfyb]dvbcycyrjglftqip
+scxtjmiyswclsrpfei[evcovzgqegkabyoj]oawbgsmtomjgrti[xewhzbgjxcnziin]vrfyzfdadraakih[veeypcuhjtrlqfowk]oyyftetquzaitaoaaw
+csjixpasemetnrfr[kttugethsxnxfvx]yfvtbjpvereefqqk[ejitlxyidfdanuhn]gnolniwucdhifqwmwhj
+ctrzppadihbcdxudtac[pivsitnhbimfsmou]jtyycbiaszrwrdjs[hyewishwbdqkztij]vhbnhuxwwswyhfeo[gxnszwutoqkeqrf]ldrzkosuqpzdbwtvfnl
+oyvvyenuvstzikxbjce[xzcmihyeisrgffhni]ahxuncdxhwfyrjmwgg[ndrpukceoakygxmx]ihiodqfxvxdovqjz[krbqfwgtncvhlqohl]oyvbwcqvcmnjnayq
+hstvsaoodhudeeraito[tqjnoxrjifgfniwsgns]jjqyywgpzztmfuyufgk[eegjtcvpnwbtxdlhxs]diraujizuvxirqg[avmxgioohhmrvbdfexf]hcicgciithjpfab
+guvkwabdcrjmfosxrrr[rwzlclrvprmdczgn]fiajsksyzvriefwxnon[crkryjxcpfwkdiay]ktmmtsjuktyxezk
+lqhqiadjoeveajfow[piesytfyuypdnupgkbu]bcxjuyihjoupntop
+lvcibleskyhgtpjok[kocymbjktkqgknggsa]dbhuuykasimgnmboohv[okarperllvkzvumc]ceyyisdbguwrmoqeynj[fdanqvyulqipsrheik]ikptohkxtqtzvjmgu
+siewppymykincvgi[qziquwvqdandeqs]zklhkhtusfbxcfke[jninzudoqzyohyjnnb]jnpphpcygdyeapndhph
+mqqkmtrfuxsrblh[fgjebegbyiskwwreznr]ejnuhhgmcpecrdozqk[fpalqibdtrcsfwrzwcq]kqpfqmuniiqfodatmq
+ghvwdujlylpycugan[eizafobyeauiaah]yaovrefpkcwrzialc[isvfdvszbgotqlh]twwumygawmuvgdq
+huzpfcgpkjqriwgw[wwfnkoxpidpovtfqqms]ezwghdwtxviubpttfz[esnueoxpiupdnfch]qedrgftkgeajzihb
+eylwwmjbkagljlls[wehomzjfgwrnqkso]ihgiziijkisblrjlj
+cjrqkcwraqtnqzpqhe[rlfsrayecejbfutd]diyzyuauaykhkicopz[lbnawmlieyiheut]wawrxpverseykyblnmj
+tyhvcqtbzdnwnuswbtb[brbsvmujllkoygmcrf]ssuklhhyuxxpnrsot[ilrnjgerrsibiahxb]dxsfzuyxtbtuqhcfk[jtfttgsgymzuaytbczs]bzkhccldohcveqxkxg
+wmxhvjtzrqofvqyq[gtqsuhzwzcenscxy]tiijmhjktmwptpl[xkjvinezorywsvgd]ourhlioqvpbruqgqwbm[ripdkceifjkebzzxrmz]vyejqgupwfzqlzk
+pzkxeampgfrxvkjwmvx[saxmfjcbvylcmpohx]dtbrookfdueiaiaa
+haibhyxjmwuvaqsqi[mqpydjhhspstfsik]kyhqgiczyzsjdizggfo
+hyutrxovudlcgtqaasl[kvdhdnugzqqgqrtsy]wjkjumtxyjtbqheviy
+ruhifdjnynmaztrd[umltrgurecjqdispa]jziknahqzbwnfaf
+vmftilsfiabxujkooz[vhuwubvqoswquse]kqrncdsyxwcqswtt[fsfotdrzanwngvf]vmcgykukxchqvbzqy[xamdrmnawmxwnnh]gemqmkhhygpnesfq
+tpfqkyiuhgsltihph[kpmygovubzuigsb]lnebyuiwfqmmqse[jutxvzssuzgrawpgg]nzvgiiwwbohkmcfuwa
+qqzgpzdgqomdudpe[doaqydguparcbevug]bdthytdnxltpngtxs[yyfajendprpdsrz]xvbnyllrvrbhtrrm[fhgitqxewvntdqaje]nddihvrjhegbvvn
+pinazwykcazurbz[sshvvraelgtrfgf]sesgkbttlqdppow[xbviulglabpfqjxix]qbepfhuupbjfhtrtgb
+nyyyfbgdbctjxrlsm[qnkjtwxapqfahaxfz]ynhenrdnuiygrsi[acibrssqmqnuijw]gkktazvrgsbcfkrgnlv[heqzhxymrbkyatmmp]npwpezwbiozxuwj
+jqdfkwpptvhyadpunwv[ifslbloolcaxrmewt]rzxpslpcbwdwnjgjmwa[eudjhujzjvwwpxhre]zssncqczbrorpihra
+wgrqmickpndzcsxnpsy[orymsnwemgvgdvqc]zddumfflitisvohyx[lhobkuefqssrljzsxzz]nckmxedsmroyysnrn[zccppgwxrxxhaunb]uyjmcppwnakgxtjroh
+xuirxfixfstoyav[txtxtanvbjlwzhjy]tzxucltxuiqiucmzob
+hqbnuolwklisljo[ccppvwpiymlirnpkbr]pnckxiikjkmguai[yzynhfcpxpaazwrkt]bxwzqcnfyzsqinty[fiochkeecjbsjckgt]gwebbynmsanvompl
+laadegnpzyzcuihz[zfattroimshqjstf]khfqzmasvpzehsd[ngwosqahikiqbbnv]sbmdllqrgaiwplbffb[ethsxhjrrlupxsgmm]vqywfmdgzdvsion
+nuttuucwnbwhyoousle[xoqhacnfwnnjopnhy]shxrsrcumxshluuj[opehhbczseexgtyrgqs]olbetjgecbsrytnzjsr
+wpkkpcplocnofso[xossadjiikfergczau]qiwuqiphcppdsrutxp
+okzxvxmfocsyoybgvs[zusjjfchztcjrcy]vpiipcrozcdvszecivv[kkglnuxxxpurhihbhxr]mmqtmmbuprnemdrpbdq
+niphkdkxnrcxhtmnr[jryypjuaaorivctdt]ovrwgrysibigupzm[rxvrnwosskfagouo]grctrjnateekgzt
+feecsvzxdnklcxlfy[bryrwvhvpgqdecftxhj]dsplaxuyxllravxac
+lfgubkzkoardzdf[qiagyqufzaggyaqb]yppfmghzluleefukte[jvaxizomwbofkvledjk]svdgdodidnfctqbj[ztgyesrfvsdhpgx]vurzpbpadhrdrrdiza
+urbxbghjweuedbtoo[ylydpscyumfpxuore]ssbkrwxjmwfwjqaljt[uwlwfrvqhozzerhtoeh]cgnzbzgqozoiyta
+hienhuwpcwfzagmibf[khfdoplbvoapbgbj]uqtsfqxtpasqtuwuc[fguibihgiebfiftg]jgcqyaeharvpvyy[cxqfeehtfnfokke]ihtuaduxkbjugie
+vwbsvafxdlwwrizvqo[uhzrldkjlgudrtjorlr]azplsihnwmvcusfh[ososullwghqsuxm]uhwdrftzhfnmrroqp[rdjlbrqexvdjzol]sjmefswddwxnnmnwi
+pjdujpcohrebenyig[dmaoaiofisjxiedobgj]bddiakgyfryqnye[aeppppahgwqdgulj]iucspvoyfouwezd
+zhkzmzxbizaiadjmohb[lujcebxtusmzjnfggsc]tjlquxvqzaqzpcynsc[yvcpypqprtubhiskq]aeunhwiwlifwsiddtdd[ybtelokgzqtdnvbzh]rsysmzmnehjxazr
+ciqrfxmwewtudofpi[pqwishdwbtrjostexu]vkygjcmbnllgtnmyjfs[zaptpojmomjsvqkme]jyrfxswxmmmhdyn[ruprqcsvyzmkeeu]upmqkqfsyquakoltryp
+ptvvimfpvxpdvqxnr[cbayjdthgudlsfqv]brgbpugjpulmcet[vzxqjdzvvujbumsr]qscfpzftpppwfibgs
+pmpcdmrdmricooy[wyopcogjkngqewnyzh]cpcirvlqmtgrjoso[gzpklputpgckxfzuwx]eilnrzxsajqinlxpzy[igkgvmaezsyfoukgkjz]vwrrhaemgouxydcmrom
+fbwnbgvlxrdsxcyzvey[uweuxgyvdzucqbpee]xiayhjagtdzgtxlhge[ldcgqzmbaevwqkvut]ztivhyevetijjby
+iwtqydhqswrbcqvkxqk[ytzedtgeyocjray]kctyawpureoyejf
+urbtdgykoerwhomda[tcfwziwvqgccvskcxnb]fevulnobgppmxruzw[vwbgppwwwqshlko]ioatlnhkosliptztwoa[aeavbhpnhgdlemsox]owabiqszcligpdbz
+tplrqokukffrtmlcga[jyuxtvhfudogzqx]gjugdhbfmwxnjtmrh
+swbwpexnuxtttzhh[xspyigzqwuafmarjin]qellirwonukbbvdizi[rkkwqekeufbvhzu]kwuzsqbisvinzxq[nfgwvgerkfwmgqgyy]ozjbmbifoxiqrgemvv
+geibbiqamcspqflbo[vbdzzyorxegvqrx]rktukmmbrdynjrnvfkp[djqcdeqfeydxadzbkj]hqijcjkzfbturfhy[xlmbymbynvokjtjrclw]ssbgszeektjtjabcp
+zaqgfhshahrzkbf[gwgqdumlqyhzbhbfoxr]bxsxoyjbvcxqjnfhwp[kxchpftippbfhmtmoi]ecozcxdwhecuexkf[ojtinjhzgcvxuxen]chgufqbtfczbvqh
+uwjbtudngtnhenh[xmszyblpzsxgwirizr]qrlknnfyxgttgzlsux[egetldzejvwkagyk]dcapecjizydleytc[ohboyhszqajjzudxfbx]qavyxwvktwjjmyx
+srpwicpxcbrydmvhvxl[zcoxgycbwkpxoyuy]yfblbajikrltjcm
+biqevzvvrqzgaffnhv[dsqfbbwkjeczlbrnt]kztaqzzzzlxvaqhcv[mcaircppwyjpyondde]yqsxkrbdcdxrwvjsgo[fvtjtxwmxlnadeu]bqhllahkduvydrvb
+ukbmjszvndgzbuq[ckmrzogujmemwsfwh]wdscgknyvtgsegsfuaw[mugogalgcsllfilvfv]zshfxqsdnmjebzgdbcg[erkesgwdhfgpfgrxhro]yezguyhbkkcdnphtn
+lmcmocgheniqfzeh[qomoqrujzxhiicet]qplxjgcfhyhmrzsnif[jodkvnzlkjtimlkr]gevkbeqeoxpbmompr
+fkitsqnkdbckyose[rnjpqsplojfzysplipn]tgjlgivockfzsnu[qmwmetgfapieyyij]gzhptamokjfcgxwr
+nhaccjkfkzhqjxlevlp[ztqkwewvjykqsmsq]qmvkyshwzjuqeqgv[vlggwfdxikilhmmyz]ogfjuhopnhsomtuupn[ctyoshqlieonmdainlb]yugmxswctqtktale
+yxbeuvultfhddgfxmkd[auylpdijopmthrq]dxoibfjfqgkvjui[vxbyklblajmpuvftws]dyfpmoiwlgpdzft[hpkzbkcigqespcnmby]fvvzvkzvcrynkwkhxo
+jjshxelsbssojrjj[ivrjrnasyhnoxmy]xkpwivngxdpbfkel
+tyfsedpncmhyrqtfgz[yjeggvuxhkgyfqxkotv]bkmhwmqbdhbjbpbya[hzxelmrqeehnyiot]chumeedtoybuadxhjx[bhskcnreqqkzriifpak]raipqqoxsewtwfbf
+vvlpzpyycntnurr[jthqurhuorgdlgmtcfo]mflrxkepbinrwldxkt[mutqsvtyzainkzl]oghwiiyeejukmsbdivn
+yunriwucdmubfnb[chsacprfyhickht]wiwxpaiqouzqbqn[pivpthswenluzhuv]qgzsiwitybdzyha
+wzekjsiosuxisuogprm[gsczvyeycmgtppfofp]wcjsdjdvukwitiiqswe
+xcexnnqlzutjelywcl[jqmgzsbaonjghgdqes]euslsftzmsrewvtygv[qljfgeahxazzlokiol]jrmgipsfxcxdlpkvmq
+aukotsjedvizsvki[pbzfgdfkdkipigwmtjs]uduwxmhfhbgmpcllnf[xqqxhnslpvmuxoldolm]wxsdpxxmcaljhxz[emxctxhghajgmeeqk]ztpoznxoqsqidohorpm
+pguuvxbikezqidtdurn[yxdjeqvznowhulg]muodbbbogoowckahla
+okojbvhagwjqahgrrdg[hycsxepwykzdypwi]yomtukpjmggiphyjk[culvswlfcoeuaqcimfq]wdrtcuygpmobnbwyoqj
+mzujjrundkzwnbj[qxnoeqduajlbzgahwb]ydeomokobxpwkyrzxf[gpildviabamrzjdgl]elokpqxifyyffld
+mpdksivufhrmiftntyc[klohhshgiajnhyolcm]dxojhbryrmjdrbqf[achjadgbqremfnln]esfqacvhywzqvlgo
+dwdewjxlordmximnhc[yhpwdgvfznbqjug]qefwqjonyclxccnhxn
+ssnfdxtouzqeruefim[ptumstdxyfllldiu]otfigtytzmgyvqsxe[vgtvvclfpidmglgzcup]njpcrqwyskhajmb
+wxrleulxjbkjssjns[yrvfgegncmwvdgfrpl]vtavixuclgdhjhwhmsh[rtqlhysweljhuqet]kvzabqkrvpaqegu
+tzdyticygcaeykyetwl[cxmigrcjvrnhnewd]udfdtdieexkukpkzy[zawjrmdumuqqcoou]osrlhnhlhmqvhxg
+rclvqrclhowiewpb[afudkrtbhzghwbcvkr]qdjjbvapbhksrjxt[atcxukkeqxgbwsfsem]vthozywiqhoyozw
+fcvwlbrcafnwtfkwl[bsutzlujekojshbsah]wpxtndvqbcwrahxiosq
+utckybdjhftkvzuk[qlponosvenyinmpil]mkmpnlhjwkquokgf[ogtzeotwzkmjdhoz]ehpcitmbqyahzdij[agqojjcxeartdrsncnf]dqhohvvtpgakncpl
+kzysopdelhivngw[trvtmyvevtslrvp]qphggcnojdcxper[yrpxdwqkodqwwfpquhc]ikrvkfrlvdvqzkhnvop[qwscaveveqqeolhu]fmathufisqcrzzvqkw
+spcwfvqrcdbrkzha[aacdfqguimzfxnuqc]vfjayebjpgkyarfwuod[ooejtemreiraorzuvkw]sbrgkqfyzrmowee[jguejbpfuatokoot]uyffbleqofaudlj
+iuiivvjgrowzxjzdwe[tipvsdrrvbmrnkqnq]wpxqhpqjejxviejj
+gpjhvftuuheinlmsk[yfgionxdgbfqodg]uvlgolalqmssslrqrn[xupwjjmnkisumruwg]ujpdcjhxrwuqryfp[dloaihpfoadfqpdo]ahuhpmtxnyibkaahe
+fybvgfiffkvwwycnivk[dwdzeostavtfscfi]unnydzkcjwijumjdbvn[pomamdfqmhocxigktg]iaejpuirmpkkfvkejj[pivxukllzqqugad]bxouayahmwtxkqut
+xdiuvigyctdfeaejx[rjyvmnwzclqxyhnno]rptychqruugkewjlbr[ttbftbvtxgjbqkx]mrylgxklxlalaeuvz
+pvzfosmraqanadbjzzh[tpdyvjvjytynaonz]xyceynlcrcoamkoyggl[beyogipinpnhdbwegxk]nltqaqbofjfihfo
+gfzfnhdazwovhqic[fbucazkpmigvubskbo]tfingbmegctkxbnei[qzzdlcbsvanckje]ydfrszjgtczjfwvfbzh[soizdivaorxfooy]ykibkbgwiurbmdvbbr
+myghtswolcjafngtf[zutfrslrmtbxdzpzrbr]lqwqsdxcbzmfdhebdt[eaphviremcedoopgotr]klqdporitfjgvfdcng
+zmpfcgnflxuqojtdzz[npdnxrmuyupjonu]dapxpbmmdmgibovzotm
+hsjsadzjikypnqwl[vrftvjdeihxpipdi]fuxpptfybkuqfyjh[srrqywcihpnwwipix]eldexczjxodugqk
+movlksoriejyxitxg[iaknxaszidebdyfxw]yysakcbvsslkhvwb
+rmbwwdeselsgwowqdtu[wlmcyaelhocbtxv]yqimqwiydexdpyoy[oezsqbrkwrxxzti]rphzznfghptscxc
+wjrkcdugygvotpovl[bifcvrbecoinaniafdp]gpwjewmcfaefgxlghsm
+qthtijcolamzmodd[gfdgnvtlfuftsthhb]kyueaoppjvhsmmcpwn[iydmuycwkbmgwgf]bpdtbvrsxighdlqyzi
+crtynoguhgrudlds[ijazuftctmjhihyg]zulfosdztpdpcsg
+toqrbpaosoikfdj[guigmlanmpgxecbf]wslmvwzngiqhpovwzl[bzkjldxxciuinqxuaxl]pmafduqjiwelgrgqbf
+vmqbwevkxcdbgrmtga[cshtkthlkgkqprzj]vbnpasrruwnckpirekk[egnsvjilwzsigenp]boqzfygrbptkyyvsy
+cfndlwialijdidbo[ncypuoyqemkzhwoio]mebhpaowwzrzfarmrw[wgjkjwbohgrovurdcf]tdaitjcszcmisetz[esfxareaykafawe]achdtioidaxwmeguzu
+dwelecgxyuvkntw[hcojsvpvyhsjezu]ytdjhxbjjjzmoxl[ntxoufciycjooraylrw]jsguitaddluldwku[ashlhstdjokagrfpcjv]qhkzhcdlqtgibdlzaxu
+prhhogdhsokjknsxoio[fykuuabtpuqrbalv]vvyhpipdwddipihiz
+xevwylfessbnioftxs[cvlubehyimgfkojldu]elqdlwnniimpsdbonu
+wbfbgkeoweyrwisjx[hypdbiwtphepkmbdns]kvzvbqoouuwqfafc[butwiexkmurmlqxnlxp]vriycrdqonbbniewds
+hjjreepqrxmrqbru[ipklhtqsevrqhilueo]vjkuyooudgwwdgpsj[bvtocxerejwvjyiply]atrkpzpzwoeoepnfj[dskzailalbbwgpx]qsqithvqbksqsss
+rmicaeebjkhedguaifc[ibtqvtfcjjxidapofor]tknwydhzhvxnlmzkuzc[tapzhzqftotqrxupea]oqmetuqhmbbayqk
+tsisneonoiivusbbr[yyjkxfjhhcexydhzgy]ksawozycbypmfwaqrmj
+dbhzicyfmcmemujkavv[cyyzbusshtktlxuytjq]jqvoffeifohsjljfw[ftmvnjkjszltbksva]scbbarilanrtgbqgp[xcswrqudixdbfetmd]oerxhemedytqribhj
+hnvwwadnhpiqzpkv[zozlerifsscpzjnqys]cysfhjxrfjvdzwwp[trflckrkwxugpwsyw]vltvkkfzqjwzpyk[qlxpwwgtqkqdpkdkqza]jkhoecssazokxfmb
+qruxwdxoktymrlkoduy[znhmihomcayftfi]iawvdksycxnufbjrct
+xkoknpwqhxiwcyskvn[pelivfbuweedqcuq]aanztpskjvvzlza[bjxzezpsagcgeyxifa]snqbrmqezeryvdb
+jvodylhbqwwiijcnymx[iivesedjbqrdqqhqvpn]jtgdnsvhdqknztknb
+mkdlnadkgkbtgvp[nnkhnvbpxoufuacfig]jqiilqtzqropmlxsc[kqkhzwgjpzpinaetnl]zozxleefishfngcut
+plpqlkcayycnmqgg[srqmqmdornbtapklsa]odegnymijiqxfilwkm[dtdaizmqpvdwwrtc]hgquqndfvfhihcu
+giejjddslecykts[ghjozfrjgyhmabf]lsiybqrbkmcqyefhv[pzmshjajpjgcbhneq]ljuhamojviphgceydd
+crqbdqgrbqtgzhe[dpsviouwumjphhygivq]ugpkrsusfgbvzckzxra[izanoqmcpbrqlbwb]uqieftfzzafyhav
+scdhccmlmbtewnhk[ujyejnmxsxvwqiz]ffzgxtmsuvhllqosd[xyluxilcsxgvcieiaz]ljohpjpzvfynvpk
+brcgbwwhkwsvvpxxssk[euzdkcxqaptnxnrvavi]qzxjsccldyywodhie[kcyaexzhlocdbqwvnov]ckecckpbgdynsowa
+jkxcumgjssmfevqfjyh[awomrgxjdcsmundgax]vbukfdztnqmipzx
+pqjjqvhovocfxvtf[ygrdhpwgfcjsadv]kituhoohxudiehn
+pbfgqgpgmkhchvh[aamlyufgsiqomrqd]ijpgkdykzqtvvjwog[hthjnricdullzfmpasi]rtkatzcpgsuxdqgfz[qudiysxyalvwskxxyo]qkzageunrxavmzjvj
+xychyhexbshcocf[bcllbjrhshfpjdn]kqmvakytshsxiww[rcxmrqbahpuufrejx]bbsdzdqgawawxgzpo
+srjbwqvczzuazrukca[rlcrsgjwunveouh]qzdpjacdwfzlssyxs[zhdfdosmhidpshy]zoedlfourwcznkg[irkyiphmiftygrvywx]mvzarvhbbezltccnr
+jgqzrsqsbaeukqkzgu[yrsxgxriwpyrjlpvlk]yerlfdummxyjxyhjogs[srtpykziynkajtcp]spostopwxfdpasgv[wyxnlteivwelaysj]nilrixjiorcdoujxd
+vtfrshcfcxnqjxt[qkqubplofpdttcpz]uvqsxsmaeswbmflq[pmqoilwznuphmnohg]wbowwnpffruiwxsxt
+hcxmpqwbwnuddxrkx[abqlynebkursbfmez]aakfxjescmydauthh[zbzjjailduwjhce]esjveeultejuzcuqgzy
+wyinzojxabrhxfrng[begmgspqgszayonfel]xbshjcyftuqfdhdgpv
+vuyhwnwrhhghobnmsso[ypxmxcajtvwbzqd]mxmglbocflgqykybs[vroinedksynhimkfhec]vtiiamzjlkuyytijwsx
+gucgfzgzaxpbfgrvrb[vzdpfjzluengblwm]valkcmtjmckwcif[qfddnijruoxnmvsqwb]hocgykbffrppoimgum[vkezmfvuejeykmuhsve]lugcuflbptxqinw
+qiyibgazdkkqfobirh[aszmrilbdvrvijmz]smojvlwxevizbbnf[shfjrfteigwnaiqkp]bgkrdeuduyafdvklqd
+euxkocmwyevgmpflmxh[yakuknewnjdpnhdbwo]rhqabxhqikqgekoiyi[kqgtjqrfsbfhfwtthy]dhjlubwnkogyqqeiva
+ymkslptxydufplr[giqbnlqqatbetodn]ompzqbzmjrtruuxkxlj[jhtnsfsnukqcpgvcw]mafbvhnkkfjzpwttq
+esksbtqfptuausafh[izxuyluohauavcizl]tujhzjaelyhxbabqr[jcteeownyxliuzkej]elzhopaawvtxacfocde
+tszapaduhtauqdfvf[xowocbwbgyqyevuym]fongzlnggdhnhqla[ulapnnawghssfirg]ekgcajislaflfkila[rmmkmlsexgtgxlqbpym]ffqzfzcnmuifxybwsmd
+uvtutbniagbgxyelg[zqfuzzanfygdqab]utuvbyknohhkgyfer
+acqjbcjhbbrpjkpm[whoaesoequjoguzcz]alusmcqapkcgsbkref
+rzuwgnempzphmgnh[lkundnoojtdrkti]xxvspbgofdndkrx[hgfxulqnzphcikwe]tmyxnsphrrngczazivi[wgtqdnjtltyjppzck]wgbdjvlzooehfdvv
+lopvvqqhsgahpzi[ppmazimecryovnvxm]ttkkqyvsrwtayjo
+zvfttfwzyzswyodn[dudhsomamquabhgy]ghamazncxlbnklaaobg
+cblrbaialhexeka[rafddyqfimdmsawwue]nqfmlmidvhbpdake[jvczldxdtinugiizhfh]rprwwgnzrelfwixrw
+tjbvzxfyokuidnlttlf[wsrdswnysiffeztzlv]ftuhyupciyzhcmold[tkphlnqiubjhxfmlvx]yezxjbnhqlpzhojdt
+cvzxdelnjskzuaj[yrvavspquyeuvnkm]dokeeqzqpgrzhkfg[jkjvoaajttsrgzgqdhr]ngpbpvrzwefnskvvjp[hwmxtnmjsovbtfslro]qcyeeupaeuvnpqeaq
+rosnzzjlyykxaumax[mtgxhoxetcskqfezo]teeffdnqgiznghb[ewspwrjvfhrnpvjhb]obzkpfqoexkbmxqzg[jrsmxennifwruawr]dxephcphlpxfexlde
+tvybshujicnmxpgkw[liwvwvadpytofvtzmpy]gxiskdumjsbdoij
+evohohxokbgyiqofbp[qluawmvnvrryhhsdrp]varshohxapbfbmkcdy
+vfdixowzcmduksfbi[vodkriidjctnhkcswl]fwmbsatwpslxgpsf[slfpoidaqgbpemyap]jwawlwemapeplxhxiy[nbksmqpfqjdojzhorhz]tsjjvjucdmvkfjhlk
+gvbegqsytohfannfonj[wnrhcgdhbeusykvxp]agoufxlccgsxbpuwzo[wvxazyhfneyocjtllv]geitasndyjkjpmnynbq[yghoooleyzscxpthkm]zpnikfbcjvnbwalmd
+noeqmknutcmwwmtk[hpfdivjpmbdwtrd]klmldkobucpwfrwsv[iotftpgwaksfazjeqy]ncdrncsgmjwqmmjlsy[qwcpmhndndiltvi]cbpgvhlrizoebrrgg
+zhdejtnnzgmzgyn[npxauoqmjbyviwhqw]rcsyhvgbblnwosstr[yacocdndvalyrug]zabsoslxjggivnnp[pzpjpxztpiijeoloon]jbgkfygdrwqvbuxlwqn
+wycbzoymtglyaqpk[pvfqpjodiuhufhkfje]gmmpbbyayhlytpce
+gwllhhyjfqdxindt[ujepssulchcxjwbcduv]raslrbcyvxgueavlmkb[woylgjdprggsgzwuct]eiknvynbmazkxyny[yfialkiqtlmqulr]asgswneidhdmgfiknbv
+kjxsymaugpdzjnnn[kqttktvhxwntaoq]cqmiytzlkquqoma
+iwzchfytihnzqhrihf[mfhgrsnvlvdywbkhdjd]oohqjzdjtvgaalomndy[udfkusdurmalgyhp]frbxekqhjnlctfzdyu
+hwcjiwcxcssnmnme[xlzppuxcxdpbvewby]pqdeqfmdyqmmbxqiupc
+xwuvppawdzrjisb[bmpeccjqsctvwyi]gwqpfhtubqauxqhfzxk
+ugyyhsvvvfczgel[cvyerwshlahgplax]oekcilkxiqatczwzhy[aipcdcarnifhyuf]rlgnwufaczioikwpqsf[fpxepwhtkqwtukh]caswtmvcnphxrazer
+vmsvqoheidspuinpzqg[rpozdnxdpfwuwlrm]vyjsktiqrpenvwaavmh
+sjmvrmdtbmhmphcjwb[eeqqallxlkskzbs]udgtfrihnhybypsihmh
+afdmxqobrfgjfwk[vpvemtovoprafzppvpl]qxrlubsqyijakdp[wupygbbbynslvmvli]qrzyjxhogpqqtjd
+tihxbrlnfmzegwy[qdijbejptemrzytqfbo]lrvnawdgjwfnvtyx[nglkdhpoevpcrpah]qwykwzxclrohynz
+sryakekpkeydjxueul[oiaglqlttnpiarl]esmhduixwxcfaoehxt
+jypdpivjwglmavgez[wqspyqitwljcriwndi]myarfryqmdrzqsgwfl
+kfnlvqfrqzfbevhr[eczqsuhqdwgozvytuef]hwbunynrglbixofeaa[pozsocjodzutnrtc]pfeercwfapxajkkgydm[msmxhohyjfovluc]kdrxkwutbveelpl
+secojqrvaqrthax[eszcgtimvyvmdsftmti]jfjikyfoabrqdmfd[ohksaqmuinkzsppw]dxklblmhezdfhmxbv
+jltltxwwktjfkuv[wjnkvtgzgmvdhbktnf]gnzjwbisstyuqckkmx
+czcaualhufbajyo[fqfnrhjlrfruhgdenz]pmlkiidyhzlhomh
+xjgjmbjsriykobqn[pwibijybuywbibhz]nziviewoncbghhtfcf
+oamkezqllrxnhhzs[befbgrgnjxtojus]qkwusccnfhdbsst[naqbibvvapqhkriss]abihzpaqtolpkvow[xnefxrlcnsyhxlhcnv]pmtpryhgsotfxcdtilm
+hvtrenjknsviucseda[bclufjqrovzyhiemnoj]gvgrolegqzonfkujsd[unnphajlgnfmzehlm]zksbscjjarexejpudv[nhpboqyxtdzxqvxt]iexgbhlrmcciitj
+ctmjaphrgijhgtfw[gouchexnzedcdwhem]gxvcsadlmroasxo[qfxzjndjcapxptsfm]jqfovcprndleoqq
+wlhykxnpzshszjne[bfqnfsstqeoahjdx]lolxbkosqsvolonmoj
+sthlhcsbauaebww[kuuxmhityeazoeqfhc]eysvldhkkkbyeozxop
+sdwfqlcpqeylhfwtf[nmbkqzjwbanvtxr]qiopzigqsdswvdvdxfc[gxpudnbbhnhkcrxdc]hdsdmzihjurcpbddz[rkeuoskwvfjeefu]cdbhfvxomytiopjumrf
+synqjoeasvoyswgv[kqoftptbgzckmmsks]lgajmrcctdzjjfyxqys
+trtvrdtpbtyxvqsbt[fibknusbgvujcxsov]tjqcrwopxytmxebqb
+sspdfvcppmtdurf[ivsjharmnrdpvcoriy]ubgfhohkvsszhabmet[djncvfojgzdpybwdz]rwldjpfzsnejcuhkbms[xjaqwrcprvqumkdqo]xirjztxykkxjwqyx
+viczzsntavwxmwjown[mhpxdxrklaskfrgbq]samdpaxsnttamvrmpx[czewaevsqkbaenhm]edkmgtvpcxtuscxmcqp
+vefxgudwkxtjokrfuss[rgffrfokbymuwum]cjzqxxfduznbqbt[cydcmvouabvvxuxxx]irucyonzfvxscofisbg
+jpeckcersibodzh[yxprjgczoerndzm]qzzqftprfevzozuyrj[eguuaxgzgttuvzli]fwtgwhdhlejjqvc
+gadnesbuiuzqiafjcc[kwctfzdkxtdliuixxom]arycduudngofnpj[rmqwuilezdfcxtofsk]segxynmaclycgpsqag[hzptpxllgogeyvszlr]nyrltuncqkfwiiskkg
+ijlecxcuexxcxunh[lqoxywueqpvhkri]hqbihfwtfloctkab
+ftgauixyucigpbe[iluiajlhofsvzljeprf]aqkwgegblbxawmhof
+xtxoyldwnvehxonytcn[sxrvbegltpbzztuc]xagvhzvpzpnxliwvdnn
+tsophvuauhabzfv[ceqxhicnzewigcdis]iabyzmhhebvptodqcm
+alirhzyoxvgxxtova[vudatqllgaqymtty]nivykkvsdolxggbuds
+uruwjwtifwljtsu[aybwraplpezehiju]oryubhjzxyqdwwrb[lxtqbcoumimcvewzly]basnbsekbxxaqfjbvs
+kmtekihebcvsgty[pwnqwysyzlkahwyj]dsysyduxqgefmlnqc
+dsunyioeihjynhnxryj[dlfwakjnireptem]btowzqrniwbcpsviq[yynburxyzuktrnhb]eqrpujiikkrxhmzbc
+chebtohanjhqlfrqf[idrxikrjujqopjynn]kbdsvjfvtzlcznr
+papbfwmccibasmwyr[ifrhfmbbnvcenimx]mplwskzzmfxksnjehv[wallxrhfuqevmidd]hwcoktxdlzboxrjix
+eptjqtxdsztdzdvkiv[vencdxzwnxxhvcmu]gdddumdnqzoxbzacf[xollkibylumzxclui]wuwybwkxkcvbzfdrfu[jvpshkdkgqqhazptcq]fiwvrgahpcruykbmowl
+osetyjfvtypylkwao[ccxfjjipcwnjyryku]olmxupovwwllxewrh
+lzocwgmaoypsigv[fzpaozucgautadgrru]hcakeugllheavbhiz[lgdupssdzzqrpaioj]opbyxmvortwdyktt
+vvsldrdbnolxydxoqz[uixwbpbqrdstyzc]mhoawiztewjblvq[xkwujyclunjamftlq]eldrjkncwnehqmaike[cwsnbvecidbdelw]xjvnnvpbpadhqeob
+jelludsopkopxvdhckj[vooyfpbhxotclgekyt]ombahlkfktpojjrn[rlbogijavtumxfvipv]ciihylgccmvjcfa
+zflbtdvqtyigiwzb[ysoyrcmpuvprtgfjltt]ftpvlqunjqdweqjx[hzvvdkudxouqatuzy]kalrxusgoqzcbiahvca[tfglytzetcfthioytfb]deexdgigqceflidj
+oaykrymajqyffwqfk[hlfppkcubhcbgvz]yejxoeldvtgitful
+vmcfqulheyfuvbaa[vkrpgbwdyjvrjuet]gtfmaldbjcaiaguy
+bdslurdjqrpwlmyy[iovfvvvqnsjqttjqgeu]ympnvldmmihjjkymcty[pqfnjveswpdougyxlg]pakkytgqzecydexh
+fsglfnqwtydvgxmq[vkcclnxeshpvejzyhzr]xvlfwbnamjzqmzrrmxr[jbuonpvqbqtiqek]eknuvcuvmnkeprjf
+nhfknvbxgvyyekeq[djldkdfocjbdaofo]fvvyptzxmpliiwkdkc
+vdpjbeluhukxzcc[oewefpztueezwwhb]pxxbnmsfcgoxzmqyhl[aqubfnabwmguqovi]nappxjrsgdfqlmdpiy
+pjnndvlkbgnbwarutny[jmklxmqttqpaijkmf]pqnqhvnsewmcfadxdd[uzwiexbboyfcflst]jsqwngfxfdmsxdxiobj
+jhkcbwhnfsgpaqqynvd[abninwnkumrjgpmoaoj]zliimvruxwmauyy
+lqqnummvihrlqxplx[zjdekkaigooxbjnga]tbizdcplonpsodwuep
+jjgkskszndlsflsiku[lwkwgieeyzicudn]utxrgdosycuhgqyeo[sanykskfeywnenzsm]dgnlnzwavpmubah[qyizyckdbvmfnqx]gbzgzwnlyuscspgw
+xnekvtdeeyskkpswfnn[kfnzkzkhcpmhwhpqsh]pfigokjarcfxlosd[cenibdbpdrsumbtt]lipwsaactrshnyybdjc
+dmojhtkuzejsgcyedbl[cymlvwmnwbbmbgo]ipsqvepupkyccqwnd[ysyhuposaefopyfk]txytximedsqwqoaitxd[vcwwpyvatzbzyakij]xxdnjorbgakbuetl
+ipgxfxvgslnignagep[tmuifmchyffcplvnolx]oojmnrsgotdeklm
+ugzbprvzfnfhehgfttf[tzptnsaefdshjek]tvqsmmpsphudpqd[bzglrjcbbpfpplyian]umjzaxrazbajsapqnhg[ipufrslijiqrwlbgmk]kzkpbixdegebrhieeoe
+hxmlffverhgfxwwaroa[fxkztuifvrvdruf]jexsfnykyaxftdbgbpj[xvshcnxickqwcefi]hchqbvhclinuowa
+vynqcfbrogqaznjlll[kcskfyibyiadaie]otkjiwdfxbdcestcatb[uiyegmmwupcjzyonei]llibnymxwmwzzxlnz
+bdjiutxtmtkzncrfbxw[wzdoeugxoqrhwug]jzqfkihcxqhszuuhoeq[rtvsfnykpwwiwohmh]rrxrwrcaqbfvtrie
+kmqmgmcggamtiyhlo[utsphbkqmqkyzcwyic]pjbmuokwcjdqlrhtu
+xpypokpqfoqocohrw[nvgryrwayzoilmftwm]nrsbscypdtewdapxg[vqkjvvmcrsrqiuuk]qwsphmcdaooxtyn[fvpdehayvcilrlpu]gstiqzpmufzxujacy
+tczqngmfcptykxkfy[qfivbtyjlyfjeqj]iffrsjemxkfenqmzn[nzaheesungxbpxszdq]bdsoysfandtdhpc[cjisndnfnfuoqiqwym]cltzpdhbtiybhxyl
+hnmvpwrgegmsdomih[wrnfmvvvwiyxghulre]zfxzgodlssnsusg
+colpncvdwwypholo[wnxyprbzhmywlolp]jipzcbvsklxbkat[bsiwaewerxxrneg]bcutnstrcvyuzewzqbs
+otzyetewozofrkx[thtnuafiqrakyzcpbm]ekylimlvvtqhhar[ycerkqaazvdcaszh]zrevfexceptxskn[xetwzbpmhdtdzian]fukjjozvlqluxrb
+gkywwkcjseoagrwk[kufpsjbvwjewvbx]kyckxktuxshyxwih[iiuoznpdootgptb]jduitjfkvxwllgicy
+uqmwvyplzgytbgqjq[loqigrwbnnimqcektx]spnuxxtllykkojh[mydgfcvvaxvvgsxzhjb]lwgulsodpyaltymasd
+fksodinyocwxnnkaebe[nmcqsirsfcrhkmey]xgkiwrxkvbqywwkxzts[vfizjjizxofrzltpl]memfyylffvmevcrwkh
+uchxcfotfekjecgy[ytrnfdhkjzdahluuz]imgbprgwvdldeixbt[zromhgwteoyuzcl]shdtontjnejkdljleq
+ulvelydmjmeicpcdo[fqlwmnhxsgjhugftais]zgrnkcmorycyslps[oxapavnxbkowooiol]pdicbxawyqmqtyzgq[oxgjkmbusdblnqbmzqi]unuvfzeeobmpqynunqo
+omrmyxygfmlnlpd[mvszaozmwrfqpup]zqdogulmykihlubuv[xdmdckgkvqmnetqlab]xmpghceghczgavrrv
+yoatzqilyyuivop[ykxyngmmcmotrjlkymi]yzsqqgxjtsuavagzznr[smtoxkxsmqjlxmdzmb]cmcobacpxmkwbywd
+fglceilfzoyffdjlfe[kezklbpwgpmhxuiq]setlktchqpqxxrnzxpu
+ntbuvzwoqchmnvafgvc[zlauayjbtjhfywop]crqfjqrgxqymacsgxnv[azuwpicqgavrqhgt]znatfrjfqxwxhgzs
+elzqwwboqgfxfnyfrsi[vzhksunahhykcdfswh]qrsqjbhxkrsmeszni
+sdiicfwffazszasltbt[tznbxqxeqtlryipaxz]qgbmitrvubbsmhtws
+mqkteepllctzakpkbu[gqsiyydzbwfqmjigtc]bbbxhitwhdwkkugm[muxdddndjbxhywyw]eqbarakixmyxhmv
+pocaqbemhftjejzvx[usknxixfuklqkan]miaichlaiabgvnfgqz
+rirrbedwvrscctg[icfecwbutkswyiri]knghflubjptlmwdr
+mjfwnobmyoythiyje[sssepkvlhhrvhxors]zlzpxjhhxxgjnazcfvj[ulqbynzrmjexgadwj]spleenuncdpsrqwq
+eoithdxjbgnbyyc[fkjnxenvoismcfuyysb]umbsyqabwxjkvqifbv[ymrqiqjoefnppoez]honsgygxslvsizfhamp
+ffjdubxyvazkwhvsby[krkpanuzuuxikpia]dptftdylturndqhy[gdqlzihoqfwdpaqc]eoicjxresawqsmftfxm
+cwcgopdynopgwfvgrbp[ikkdjijguwezycqbmw]egdllmqiilawuvz[bxilxeolqwdqmmuacoy]mgdvomzddskafqk
+eiiutongpvrxrkpyji[ykswsksoqhqbvgnl]yquftkxgwginbemff[mrwvbtwcnuacsfw]ykskpjofajoangpf
+rahyjyeezsvfqkm[zscuytqgfwahxdvp]okryildyuyjsmmvvr
+xpthozpeiuyqbalwlq[tdzyiluslgrohvirzra]cnjwxduhfoodixkpeog[xebrsoiwtjrewzh]nzrzyfybbfvpxvsr
+skslvtagmulcodbdab[egdeugynmziawpgrebr]ytyuxecnlihllqbw
+tdiajsypamyewbeufoz[moewrbzuqmctgvqmr]icnkdhxomhvzgedkat[afztmmsqfznglpop]hahfonuommldeqg[wohkagbtdsmxwby]eyxdtuxeyfvrfdcnbjv
+xjqnucbfimkvifudj[xtshlnaobzuyebfimex]ebhbavaeefqcvvavjd
+vuhaiiuaohbmegfvhhf[nguvmuqeupygtvctfkh]extrclsbdamvglnxo
+ysdrhjalujfvnrgcwq[bieoqkzejcsgmhu]obmmuqhrmjnpunpgeq[oskawgrrorijvmxpqoo]nfvocegjoslsnzzvdo[xnwcxjpqdeasuxuwn]mjkcuhwgktvchsd
+vykfhogyisfyumjt[eutrkfoumrjyqgzj]ptlytdgrzrtshiy
+ebsxgomqvzaaaprfmcb[cueqlexewblreiuzs]lzraiyzopnxupisokfj[rpdtjkxjepzfqwpga]guhftswcatwtqqz[fheshslcsaadmplqph]bqccysnlnabptrtls
+eboueezomzzsgxbvf[utawwotuztbgpxpmq]aeehegeusiwdfjlfsz[ziejqsczbebkaozpte]mwkqbfxlklbvijtl
+dovncfknhbcjicefn[heqnvtpizggkgudnm]nejfcqtstvzwatzeaj[iwdagahyrthvrqnaymz]nmznolwojrtdesddma
+gnkxpvhbdibupxna[lxssiiqgycrdiikw]fpbcfcgaqrnobaodbpb[svzdlwqhmlflwui]yexwgwfkgzkejwvmag[ghflfwssaoeooakxxpk]nkvnowymdpgsiguwyuz
+jheoazphamrwluf[lckkorhbrbrrxqm]ptwpouvktkwceornry[mojtegrvqcqmkdd]kfbowsycbpyiehrowk
+qufdawcohwrknqb[mgpcppsvpiacqbzrwh]ixvpwtbgaexthqwe[slxovbgdrlesgrtm]dhddpmqwxxplbqvxad[lryxhwvmnhoywds]qkrhdumjzxidmutx
+yusdbapezozrhjsrd[mfnmoctnmhdmefkpqbs]lqdxhxaxvswynqyx[ewzhsaccykeqjtfvq]dckqgmdjsrhuvsnoau[gercfplhujwazygnf]rcjpktzjjkohghwsqmd
+oimpphfxsruowxoq[ncdlctncjgujpaauw]oxafycborpayqzil[huzidruieieskxfjvyb]jfdollmeywtmtej
+fbdexkvmkvbsmytfqkr[hkvsnarsgpopkfqihco]witphhpuduxpbrmgij[agalckecqyjyyrvs]frxdfnybnlawmsrcsc[pnstdicnjramcps]gleulepthdwtaix
+aneanigfwrkzohkxxh[ucuiwsuzthliyodypo]waogofulqnjdpbep[zvmbrrcppbiscclczac]fwctpdnlzzrrijh[oqhyuaklrgpsiotuv]wazemeupvyrihlxzbu
+ckdyyvglbalddaq[yhhnqrttyjjakqid]jlhmafpnqupxrbqo[qefhpvcinhyzwtvzf]ulhrtasbwtkugjoipzh
+nwvrsbzowmjhivq[wzyhjoehewgxppg]ilurfrdhmalyobr
+qmrlrhbmhyegvyobjsg[deqoctrkekususgjm]fhxydpcmqstrssd[zpzkryziyeeuagp]vfllzbrkzqysusj[fgzaapjznvxkkijhfne]xgslyehnivgjwlacf
+kbtwkduqpvmbmuhgw[zdzjxyujptsnaadgns]ldnvtcvnqcrrgdmifs[svvtvwhewsdazxgsi]zyxyrocrxzeacrdqe[vbvjsjdskdsxtefnnd]wddyjjxkgmsbwfx
+xdapmrzaxqkjuoz[ahldgkmozbjwmztlt]euedbnamzopbnpt[pcmucmomozgealw]mgnqarjicsyvjfprl[swyhhdquxgsyyym]cdhvjmetmtkmpzycx
+pbjjgieinycscdiobs[fyqreavhvawquxnxpxu]aazgdyvkdvlsjyfqf[yrnwyrfmqgcwmlzhv]zbzntnpmfzhauaca[qgefeedmgiwkuglwtnt]koefqstfjnjvlfl
+pgbthpazqbeprmkylv[futhxbgmnyhrnobwi]snygyhmmpzrojekxg
+qozuzjwhthxbsevql[jbciuqxcimcokzkuzcs]kqocmrrdmekowfkcf[nfjmyfiavwewgsbnjz]xoiowsvpahmijohcqf
+ntutqubuhxoxgnf[kfvmpjlfxoddjayycx]gcdnaqzocopwfagqaw[fjlxtzmovoxonva]igucqjnidmvownm
+ozulmmhllvwdvwp[aoqfeopspzpxjwr]tzbmlyrtbfueqhemg[jghoksscgrempcubnio]twnzcjioicyzpdquwqv
+xmvyepyjxwyswemplmh[bdcwdpksksxpcos]nruigcwtbupuwix[eirujsaryrnafokvx]cmlzpxvgrjtrzued[bqohejpipkenwvhtaze]dovbgmthgpkhqrvomqz
+ysbyfzubhzlfakjf[bbpybxuuimeoikuv]qvfceoexeaggllol[itoqxzuykwetgjx]vmiiwpdaesonetk
+wrjfoblpjaaisaq[pcidvtrbpyywwfo]tnmtphgtitwlafajifk[xljzrwpjxjefxhkwmfq]fjesctkzoigeylcnbat[ftchankacrqowoc]fpbstrsmzodksjy
+ogllmkbpstadkigydev[fjdeezqpidvenougw]uzltqjlanxvmjbfc[djxjjgymiahdsrguqtc]uhjzbbgmhcdvolvggur[ioaatnmlfejotuw]mrhmijqjyxeioib
+gkmvnwoebeoquyzddrv[qsiediridzjhoxqsgyo]hsrevlgzioovmcp
+ldzfrxxxxpqqajwe[qfbwtgkbpfftykwor]qsrsfypomvqozrihw[jgvxztruoxayecoiom]wptkpgvyrrbzvrxlr[inzygbyafndrmdjhwo]atavhspuuhjakoscder
+assvouxaowizazddz[mplcyrqagrfmhayalce]qumunneqmgcqjumlyyr[nbdtvazalavaphpbkdl]ifhwfyhtoluqhduhk
+jvdbnhpclubnbuwd[pzrffqsvzwsdmmiox]oxncblupxgcgizxzwqk[uzzeupzxlntouaxjqd]eiujtlsizaptbprwluf
+xkqjkvmbkohqbqpl[fzjikqzfckhqjqa]euhqcdvcejpxzih
+ttnzbewupzwmegpg[rwmfymeikipraohixzp]cqizvjgmnfpvozqlyw[aotszpssukxnowbsq]cjqezsjomiuwozfq[uudmrnbsgwpjxhhklom]qhykiktusplvbtjznc
+hoveagrldomfoze[ywmtdjjqopenmqm]qvpjicyeznlfeym
+uevhmwoihdeptrrbuwu[aicgbidnmgmreid]gmggvetrrwmcokjys
+yrqrmaofofelmoxpewg[wmofoarjyntpilizux]bobughtzaqqrpdd
+ougekdkucjsgirpulu[qlullmdjnkzkimvvlkj]jqhjyswrljnfkswi[mcjvxpehvshbmtwnj]yackiargospshqt[wnmbjhzaediycalz]klzlghrqnxqltkbpg
+mvscfnpfptogupbtfkh[vvbcypopvppclyyjs]rghxlhkkskwxjegk[txbwshyykittluy]wiwedogmzwdxrlfl[iespheudeafnxmu]sopbobqnhcpeqrka
+vppjnarghjumornanod[iruvsxbssvyeokpsd]fgvxooooasjpcniyrt
+docrqvrgzaskdje[rlrjjojqowjgahz]ywzbjlysunkcajriaj[smlrlubjvujffejkl]yahnzgcldvxqugxu
+mxhhowgjvvhisjxieu[yaadtkrdtxuxeld]uxudxctvuuwkjzhny
+akauiqiexienuidqzps[npxzqticzqaizfqbwm]jsesrfmbdzcftaxlz[rvhfqiblhebjwepojcc]vjgzyhmlrxzpisjjdo[rdxcqiqtiqibdbpb]upycfngdlyklyvngtm
+iukhpogyqbukfrc[omtwrciodyertinicyu]tjahyvgwceuqiiyjoei
+ajiqhepodfuziofn[nuweilbnkfmnsrib]pfiwusvwdbuogbt[djnfwsynglfgcajflaa]erghhmedobvaltvjfb
+qubbxpwzwudaijxyav[kbhadxlkqwyzhxwb]cdukwdsqzxgceire
+dyoipoyihskswsmsa[cqrfmlmegzngpxfwvoo]ujurjagbwkbcjco[orukolmlyutjisrltfh]wcbxwkrynjqdbhil[rjmvkwhsbbuvvac]hhrcfuszusxhnsxavnz
+mfacicwuyblqlcrbma[neamcnnqrldslsm]gtyuiwxmpkxtbijvyu[xybupqxpakbqngpwh]ucalmrhghtprxxube[efbigcwynmrsodjfxv]nhzmqjvfwmiovbvt
+keejntcdhfyeawuxr[xkyziglybojfbeoez]twuleomhkjboapgbmg[bcbwbcykirbykzyxepc]fqwedycmvrqyovoiqqj[kgeospmsdtxiobid]eazviyzmzkgtcywc
+odzricjacwsewcjd[vjypaumdqwkgmngyj]bwfxysqxlicvqojr[gyixcgtfturmeydy]rhoreeupdydkevr[bhpmatygcagiztnwtc]apzgavbokckosesptz
+ijzusubrburbuqzrxyx[niesciebzmeqptjyuo]vmwqdsmavggtmojubo[uwlrhyhxupudswamjn]swxcpgbrgfgfkbxdr[hbiirasahgzdlorpzh]gyafmcksvzplopbqpim
+sxzmflhsbatcmaeorvd[wgzptiosahebcdkri]nfmlzngrnvbncvnf[qzevmspvdoesophb]xwrsfymjufcjouj
+prenzyptlpatdtl[owbjqoywsxinwdx]bgdxmckkyzjwfhx
+yjytemvncachepdpp[ajkdubkmjfucaij]vzcyjqjnvtuorox[audqoozyhnawqow]cnpwcdjckzqjqvxpwq
+hzvseyalkoukfinolf[mxfgpgohmghwjccoz]epnawldqhzzfyqzfpp
+atbabqgavyqjunxx[csqttgezpjviqso]emshshcecmudfjmdpxf[qldxfxekfxfkzpfui]ezttimakrqzpfhcwe
+oqasignmlcndcvxbp[bxwbzczioiafidkle]bmcmgkvoklibhutok[lfyyhxczcgxsqvu]dlotdyqpgqhpxadcl[yezngymyoxwjvsffsj]sotoucrcwsubsboyztj
+ktzqueeahqrxgao[jngvjanyqsoegvdnqeo]fmvtmptipadxmdh
+rebkyxyfcdnlwbsj[xlxsghzcrgcvposspy]urwgtqawynbfzjvjjon
+jguufdsodnlxuagnrik[viuyxczwtweybtbblz]hspnzxfffjslsxwbkyk
+ojkowvbqnnvkegqf[hfyjtfomnelqcznfwu]rtcfwigqcfxbpapt[yuwiygjwkgzopbo]rzqhloromfhbemgxtr
+zsisflucwgbzergujp[jqsyvmevlczujkgya]jfpdsrlhydgwmmznb[hzzuuwruhanrlacxjhu]ytfzjlcelnmpmisixl
+cjabzidrccarvsjw[gbitdfulhoasybqhf]cebzwvqlrdbzlxbldqq[pvftfahcvgbaoubs]kyzrynaxalqvazsryvp[drjarcxgvmitnpb]yrcopiziynsmtmyljuh
+pnvzdxszavvtxxqzu[mthhvsdtderjjwsxsye]jzhdepcliphabkirqj[crabarxvdvkkxoen]axcdjyxgbwxkjeuygry[wevvugzspmmgbnn]pkjlcvgpffsluejumnn
+uhwirqdlrbhktcedft[lvswaaqbaakyzwit]ufghayuaxgdcwff
+xhnnziwzhekpwyxxlfe[zffeuqksqcywznifqrl]gddhmdlzydwdidcn
+xrfwpuhachqutrwcqy[albdixdvplyvteboa]dzhcxxpqrzfehjh
+dedxzededczqrhpbbc[ctsvvgtqggfrpjeq]auijpocqkgbnjnf[ufpihbtafflvjbav]msvyrkwhmxlujtrpa
+vrfonzibtnkzotwr[zpqmjwxgrswxwvahtmz]nusxjvmmdexnxekq
+cytbfblpyyujruaxifw[exowaoxwzyvrtyfma]ipbuuiopdxiopznxv[jyykfklmsilaxznxh]pvkugaxufjdwuan[npuehzrqfjixjekz]fuzuqrmjkkjiokcw
+bjzdldvfwxxxefgtii[rwwaxdrvsjqctemv]hjilyebcdlurqbffj
+bnkigptbdgiisws[nlczvjmonksbiyk]bfymuwukbkqkvhyo[vejoxoqhxognrgc]bpzlhxupauzewxvuqvl[netcbnacylnyltcqc]beslyhhwheplirltas
+pgxzyeykndmxntip[dvlngmgydirkyojcl]hevogchhvwlumduamn[njefbfyhnppjoofp]jivtguydwpcfockqurc
+bskokeuunevhkbiwggj[hkwauozybrrwhfitnfq]airyuqgrnuokbzsyclk[oypotznidcpxkhwhj]tvjlkqqzxgebvam
+mkzhjtzjtzcddndrx[iuksqclypaohlzbkznc]ikpzdcmcvxotkdrxfq[wnynwueczbuctbeaf]zfcbatppugrpbwyx[mivcpesqgerjjcuqe]dsrdmzugwbepgbcqqq
+mnzvtidskweiychtc[wurejipylmzbwmwkl]xgdgccxgpallpbhyg
+ypomeqwcacphpqm[ofscrybteawrbvqhtxs]lpsimhrenerojoghoh
+nuzlbjqzbnxmomrjlpb[ztyepzctslllsmma]uwesrgzxvgepmzrbnz[lvkavpaohbgsdzvpp]dsmeiyrlkpfrahq[pzvjsgsikunmeseey]pfplecnjxgjfxvcqzln
+mcsalggrfrurkxsfufp[bdufquaaorjupnjtr]kyemyqkytctsbpsasyh[fkllkidmdhqhqsfnar]mtycxvanrloifsucae[lqayzpjtgmxvtaskzq]plpvcleipsxfsfjhmmj
+qewoofcsqvfeqiulfum[fsbdmgmrlbrcxqbltgp]vsavhutuqxqqyguivfc[avtvqpcbkjaxsdwcif]qrlumtxtbcirpfwxe[ergapjfseuqeueuse]jhxdqaoociqplgjxfc
+atyiwanxdchkpaorygi[zyjqciasgrjecnz]xojylxzsxvjfgqjft[iinfzfudroehnmbyr]blinjcdzwsghrddzqx
+sucnrmwljzsvipqfcsu[ccxjjvekhikxdgq]gvgrvgljgbbbnqfsh[zyxiohdkgvwkoxzhky]jicebgslukbzhdji
+mnbaiffupkfxpemr[uyzufdzkfvngnoogpb]sssjqfesnoegngu[pxoxygfniklvhwgfcp]kydobvhxtomntdmwp
+hzpelembrwbqphxi[qtatymcowjkgpiw]qipzlxwanhtwkkyut[pgcazmneiprepkrs]qsylhoplelkxxtn[ojoblpesurwcjkzmw]ybnygyagneroitehq
+qdnwpyegdrbmfqo[mpyvghubxywxodn]pdkygcgvqbigkxjln
+tbmxtcbosbngtpijv[efwxjziaiumatly]uvivkwastbzmmtunox[kyffxqqzpvpafqlf]cchjkiksobzfspeij
+orlelitjeeleenqlp[aymprhcrqopmcqpzyu]bxrezgoauocsjkhvzme
+cxdedomcafoqgxw[fdhzlcuebxoykssqp]thbzytmnhjdmlcpwtrx
+cumdrbdcvlcivlruu[sokvdlqnoepnxojo]iaeigxckpehotfixc[nqoqbomvzvvitunbfn]kdufmsqqqzebnrueau[pltgnudqherpyedgrp]mkglrgvgbxbggzmmqcu
+nsikjklxfeoitvqob[vmbxlzqgdqmynzp]bplnmqtnnhvpvff[nmlhjuneukjvjkjgzj]xmbqpenxqpfxvhbwb
+zlddovbifjiezsqz[crhesriswhownhf]clabhuqqnketuyv[vhtixbfjfdhmial]achmqaiunmuesmkkdkc
+gmsuhcgelhdspxj[sybzfmauqlgkjogzrb]mgzajsyejptvpsusds[covquenstvxpnnlbc]tadiwlnreyzgxcsgmbn[nfcpdnvcjuyldtoh]pqfmdmbmcnkdisfmys
+tjxmyqictefdozfmefx[fcgobkpwbcnpzgomkw]fspophklvonvlcbtid[mkfrgrxovqpbqoqkziw]ibgxvxumwutcsugay[jiaoeloiaxgxbfh]jykbetswjtedltzjnf
+fbsmekoosbvkognn[dfxqpqajgzhaimtyoo]pftspxmsqteibgjm
+pbgxdmfrqnwvdhxsfg[usrfcijvtrekavr]gwscetktrkspodldf[pnhvtgrgcppmuvl]spjltqxvvmlubbkf[ajpmhfmyqjobqoow]lswnfnklfdyfuqvbk
+cawugksswvlgxdstzn[ezfehjoeipttibvlx]npuswjpyatbrelllxfy[fdbjnnocpzatmflw]pexjyhnbuuqwamxhz[vigonxrdzipivgdji]dnfcyndhowhjzbyijay
+pdrksarqjvlrrcwov[tduyidcjcnzstoqka]umsllhkjhrlwvyrrbx
+hhkxhaghfxwpweaye[zhxivrocojhgwgd]omomgwxksxanqhomg[tmvbqezeztbytpyk]qvlolqozfbbkebwr[ytpjmiaqomipdmgmt]wbwqtuozsvnodxsgy
+petkkoaleoybvha[cedybeqszffnzygzu]falsgqmlztvovgxrc[bpbzewfubwshlvfou]unjsadlvpyibplqejoh[etkoencdmenqdxjn]pnpyohnpslrouhee
+tjifcboldeelxcaa[irfakfvczturdsi]ptyfvbsxqidcarakplu[fzjzyxwmkpvczwhmrp]pkfjobrepwrniaip[pywzpfjvifhgxgbzh]xagnarcjotulvac
+gszqyloltjqtzfbhich[qgshjjzqmjhzycjfkps]djlbecwdccxctkaaku[imybifywfkwtdzxa]xweatffhbsilhfdkyxa
+xulziztgnwdhcydxzsv[nwmualmytxsvfaef]lfnpclsvannzeyxowic[lnmesizizcaeghofyz]tldjkalslgsebiahzme[bwteirgjsnquwgpupjg]rwzvvwdgezrfprexsm
+kzfdabhpzfuvqzpvia[qrmffavoapeocslqef]cibfbrcmvckywojotp[fzqatyzbgmhjlgg]qjhlfaclhllzupcb
+htzlnnigoezmmmfxuvz[tayvpakyoxxtzyltn]dtdujuuutdvtrnjue[lcoegvnmayglhdgrwc]ilmabhmhbplhvatdtz[jzpbyzbxnpvdmalyk]ysuewcjqjctwobo
+mvjirrnzzluxqmdk[reykaseaqevebtkrc]jkfgzowvutbuckxxhwk
+vgterkzfbcmcesethyb[utqbftidqiicchbhm]kzfeujqxamtqftih[eoarrtyorhyhnpvtmga]ylcodxbpupdfrute
+jzgzqqllmuvggwwyv[tzyitevulcwevyata]iypnebqihjvscadoxm[mvnrcboulcmyotqqki]tueesgkaidhjeidrzre[zhtdipjtdehbxtntdjz]ibgvnjerjoxpyrcin
+qbkppwaozkpalvyvf[eslfeupnrsraqxhlh]vfvgdbmkspbwwiilhl
+ggppkguhwfodnfc[oicyrgagmmafiglul]vhglsdulvvkfrtydral
+kicuvlrhdillifbezq[xgyxwritxmvnmzsclzi]vwbemwvsfahknqebvw
+vboegzomiuaieemt[zhhquhjuaaazkhweo]ymvmrednlydsalr[otpjbvyujrtuxxplpuq]xjowlanxaqfphfbnrid
+ukkzmeacfkcpwico[tainlxdpkjmedeyh]aloiqpxevbitamsi[topflwgohkxlaetas]andrdhnpgvoifqrdrha[lchoadqizskorafwot]ouoxmcmjdaxnofddqko
+pnnepgtfvzijvvxcbk[vudouvjqfhnmocalmrf]ovlwvfwxryudapicoui
+rkxvyikqysdqwztrwwk[iczynwoubxdxwbwnw]oxdcxqabwbdlxxghnaw
+mnyqkobolicsbibrxvk[duytuwjunbqbmwf]byrnbtbzttduovxvbau
+fofdxbknsklhtxlncbp[xxkpqekrnoikzisdzd]sxtseawjlqnpcmt[vmdpbdnomdzoqtirusk]cejmchbtghptuxvlmme[sspxdpjrfotirejw]hbecxttpcplbprhgnqu
+fqbkapadvoyuujytwt[shtzysumpigydmcwkss]nqceoupxklfyswp
+dbhrlyowzywvydold[jvffjbezzdmlfvwkfwk]dtdhnwdejeffgaw[emsqelshiiuklgozvm]qfnocnyxwolkenaaoq[jkiwedcexufqwth]qkzulubbrauzistyn
+kfvnwyoxswzgegno[dbikkhvqdsegehty]jykwesaprpfogcz[etrqyxauilhcmeoubro]pdbgsjhckpzvbpkuv
+vjcrfqndpcisqrbjn[udbrvriucsdujetfntn]oztgeynclidukwo
+vysvtqeithvqslpk[thrgywribedmldzul]zifxqenfdqyuhwal[zbwvycvqgjutypqx]oaxgzslvhhiitcacvkc
+vmyizqxdhnhkrarb[dmdytoynjtesktjmtd]muvbmtrhwcononlv
+gczqehfmimgqsqc[imqplcuenfcvklaol]pvuchxxlhtkomyc[xlnhxnvtikshzqixhyc]gvrmejmkdtdjutnauk
+lodynussigujruayais[ktzzractmievvkmhjyz]zbqxkpvmnrsegwc
+nvdexfytibypqtq[gmjkkwpxbkrskcolj]whfkfuugcopbyboz[ialwkdpgfyodwta]nlwbvqltnhdnxpykl[fexwnkfjfynznmcf]fekphgzbosgluwstbim
+lpmgreadxvlituqykg[cjtmfajbwsjohwovk]jdijgoqjbcjnuowrq[unzekrelkbjpmzpqs]ravapumgbazyscnzzl
+bcvowpbqpmkgslvzgls[rmlllcjmnknhpfkncn]ezbxhnqcjdxoxia[ifkhknkieonsicgby]hatevlmiulgappqkzdf[jvwxtvtexujxxgdxanl]wcvstocdshkuybyg
+dbhllvhwblqoorvnopl[nnmamtezbloieops]brqypzbcxxlfcqvgws[jmbqogkabmtjkwiy]lhrouaarouwbspentkd
+zxrxfiadhqxnwoibkb[adpiddkbttradecy]eozpenaylhjtqlwo[qtogkzpyvazzeinpxxw]mjozglsnbnskvjgbnb
+zlrexphchavfoxs[xkchcuxvaopujja]bkdxsliitppkzdiilyr
+egizwfqcttdeamzotj[rcecwdldxvzitssmy]dphvxfiibhjbwjce[tsknmztgewuvcmai]lrrvupcgegnyhkrwnmp[rsxdxfckwdmmnbiaupf]efpgqegecmjqonko
+ikdnhbshmkoxydhi[igxtbmlowljhwzvfrz]vfjleyvxsebiiwshc[fedmlcegwiimlpenksd]xofxlghgkfdbmhqdsy[arfcqdwqjqfaysgwdmr]gyrzltwzjqjlgwoe
+dodoxezhtjlmdjgjd[nwymvwzmkvwrhfq]yawxmozgawmgvseotxq
+osrppxcaroupzotjnc[ihgsbwgihjxyhdt]rglspvnkdzzavyuoyyc
+tesoxodlthgyjlko[kdevzcptgfsnqlbp]rucwudduatnmdyo[exicgpzxonzphks]dogbplhjnywstfjruz[qjomksffyuhhiqnzkb]ymeobdgtcsblxpoebn
+wuarhtarirxliwrzcvz[unefpvwrqsnzlqiyme]serzxynljgcmkmnbbeh[ibxgiwqnqnzszec]wvbtpzaquvylychx[oynbqmhbmvdwbzwpag]kzejxwtngvayeglocqr
+hyjjgytpckgliajy[dwfofthghxucnptv]biobdtckvjbmofoo[grpvjhgzqqqpkoehk]wvkwkavjrcmawnzzk
+epqetfblxhozpueih[bnecsbzyoqeuyxnhuc]kxgpnameztkuffn[mjaxorphexetglamhhb]srhzqpfrdqkpuaxex
+xzahgksigbgoeycd[pbbgbjtxjfkrptf]bitjutwxsausvhtfy[emvnlpxrcgnlaosu]sgblxqbkfzzdfjqlat
+drqmaccamxdulrhug[cxriqysutqqetqogmn]ntlhqnkrfkduxikxae[zzzfapmviisfyytu]dekxbweansnlrrhjhpr
+cohsgbtzkuorrnym[euzrixwxznkzrgs]zkrzdjwridpourjhx[nsgrhgodwjtrxihe]fyhqouxlvnkqovbv
+eudnjsokyjpqopqmspo[lygdzuqvmwqvsaz]qsfdvzufzfnjxzflkdj[rkwpjvhqwhoobkrb]kyyqnkhztwpjfko
+ibksqrkftyysxggx[jfkwjuzaakymykesbpv]hrqkwwyvvzpyiuoaxrc[zqxyrgulrcixmdocv]radohjbdggmlzrbr
+gjeuzydlizovnfjtqc[mmqykhbhxztcmycgkgo]cyfymkpciprsryxfz[zmdewigwxrkuqeuyio]xfyfbmtbssfcscst
+quytjjbfdxlywabykqw[wrytqtdyeuzpwnaydcb]gdmsgkuwqkhlbfbiubl
+hcaltnxoualjwaibig[klhpumuywjmgoeklbov]najjmwgvwcaqloi[plcsefenjborwnjlw]snremuqxieoucfuaikn
+nnbgetxpcfabihc[zztuumdsokfgtof]nacllhfjauhywiay
+biywdxyloeifpkfitw[syqupakwarykmnpg]qajyfrfcrcqqjeq
+vmqqgxgubafggkfyjv[samgegnuzwimpfibe]wedvmxriezwrzvwu[cpbfohmvckgcrtfu]lxzynmskwpdnzwa[lwqrgdcvcwytlakeb]govnzecdihclqlnm
+gzvexxzzfhfhvyv[gsqyprtywhxcmqi]jwgvbqynppmhonofkor
+cinylclsqpelaftk[frijsczdbzkbrahsejw]gsfqcywfnpjhhxgrgu[tpxavuhzotceuxwbin]jsdaoqdvxkgarlw[kzfndalmklujzld]libylenfcnucwdq
+djnlfkxyvgcciygavgr[sbgddpmauvhoevarmt]zoadbqgmvljbnvzhf[xqrcnrarvzvdatewr]ddbkmgdmvzwqscvvld[pepjqizjdutkvwulr]mqhlspenmgnamam
+akmlmngwegfvpxpfc[khelhwvodxwvxgfhujm]loohnxfrcrfhunehf[aytqodcdwbjowoobql]tmjkmxpjvxxgilkq[aamongigaintswehsyn]obgraeifzqpfavxorz
+qwuiuwfuzeugzisgdiv[buhztxtutnsjqvznpco]zchcuxagskaiuigtc[bpxjwcknmopwieo]hbetzzhqbcetcktckfl[seykohqtrrugiwlxo]miqgbifchozmawrbnj
+gokmvmnenjhnlfsab[pyyxwdixtewgjgij]zifzpdbscpxkqed
+gvomkacoxqruraj[chbvfmlpzvwkdbxszzv]yqqblegkxznmjwny[zhakhxejpshkllocloz]zejncsowxmyjfsu
+kmzmakoecdeuwphlyq[bxkmcbxxqxbjxzvgcoq]wujgjsskyulinwafw[vrdhgjirbmpiimj]kdagywkfxucdqrqiof
+rkncghhmksarghy[cfgmtyveyfgjikcukdk]jmuflspuchuqxmp[dvhjanbripgblqgnr]pituzbqsqolglxrprii[pvexlzrdlvxsmab]qsldfnauwajhmea
+usomxhvbqmriwtturd[oudaimrmsngypdwgtv]ttiylejjeixntwle[mtantpbhnfnbqhums]wqqimtspbpwcwgkj
+msngkjkenyzsuvs[qtvlzgsmbvcnuvn]wfsuejzjpshjwek[zehjcjehpqofzkvru]cumensmiwaqjbakgdml[ptzvzzowsxwhrno]qiuhenzhdaaigllcuu
+tnkmbepgvirhbvhi[hsexgrjitwrdksqwg]tmtsljflseutvri
+exwijntpbtlxfix[htpkfyxechripaeuq]xvwfuyghxwxtbrvp[futepqkjvqjgcmaie]cltxnelzeixkgoazvye
+wxtniufytvnvfoi[lxoffaansaxwsvv]exyiiicouqllwtesv[cqjrccuswyqqscktks]rhxsosoakppbahngu
+osponabdzzpakjywk[hizagebrkdhzgvfvxwn]yfzjcsylumdlfhybo[qnajgrkojgnyejot]qkjtwjxpzvqwpqmc
+rzxmmbmmctzbvehcdoi[tmcjnprzcpovugdlvse]syprasycsjmvxassbn[cwoagxqnsmvchtybuod]ukdkctwlywpofoxjv[vjdkgcebgshzqchavu]tyoertdjnsrifeqcj
+djntcedqzjhhzvwbbc[gvmvlzrakynemvmg]oyadknsynzeppoifc
+zrzqcasptpgzkzo[ffriajdplzmjeaunm]cdmoajgelziwxhy
+hzagilfpwcxkdqenlt[pfnqxpllbzquoolcf]uzjuhczilfhsagj[ziueohgoduamdfd]ttawzghdavserflte[prieusxxbeogytknpol]ifsqydaoickejjhfcpm
+rtqyvbvkuhzobmmf[ceitppxyeeofhbihwmt]igkwtqtuspoesuid
+pcesitgxkjevqvivvz[hsmjxsuljwddfrua]ihnilctbdzmqsiaval
+vnauzswyqqcqxfp[rhmkxukgswpymqaccui]alnfshblhwmliptv[isrbkoxgplmzubfoarf]cfsbnqbfstksmyj
+jarrciiedilomtu[vqmrvshnqymuafkghj]sywvhqlonkyeicqihj[tgsipywkjfcntsui]krjeevotdoupwxggg[lacpflaydmuexswx]eyqiazqhrfidzoyjv
+tbumulwhnlrvcvo[dewrkdykuewgbmyv]irqalghftktpetbabmq[jhphvjrddugyhkzhdk]qlswcjdjiagwnzmt
+jykxdypogkguezgcgp[aeqqsfoolhjpjpzoztd]ftypflejbcgcrumx
+mccspzcjyjoeahapjhj[psodqsplydofbvvrlej]dfbbyflojtbjsdqi
+gmtoktgpbyaljwygh[eznlivsdfskxwhqyvi]qfzpnnsismbslpse
+lmfidqkfidudgvyfz[epwcdvjwuaevvavr]mzekkgdhqgdrqhbply
+wtbxbqefbzxbxrhazgo[wmasevszdflflcbz]cgkzpwjfxkjjiznjgz
+gwamjnltiyjwsqi[etpmmdxdyskalha]ijcwjhlkfvpmytrgki[znfqhfprcsifllp]eetiigtwrcijdonaga[jabwgtqxgnhamouzrrf]mgtwhdhoohpfjdwm
+ftcvaxemmkhcgisxd[lfchmpvdygikmivv]xipougvfmwaipvymhci
+dvbygqliriwcakpmata[wodhnceybjxjisagg]tvefxxirirlndlfiyyh
+mznolsiotpeszsn[vxuljfxlmbembsn]ypswpswzasktioilmf
+gyhdxvpctmlqklm[mggbzkyztsaeeanvq]osybcvddwhfrxpo[miqkvnbrkrpvdkw]bktmkbbyhpgkeygd[yujtsessfgstxaop]odzhouvvlceuftordp
+ojudzvhrgmufnjvnc[kawgqqjkegurfckbhjk]yqescbxwuytnknp[vmpspiisssjvjrjc]gajimhovnrwrtzoj[qzifmjawuzgjittfe]luzzohfgmwpgtjegno
+yrlihwonhunhiiizrm[hazgovkcfkwepjj]hylctefspjioxwpq
+mygugbmyasgwwtuet[sqisgkhcxqxozcgcuek]txribhuweqphrccp[rgirvganjngcgmxcrq]cyzhzifqeqmohmxs[zbhizuadkcuqvku]otcbkjlcvrbrgci
+yphtqkibqbtcwskaiy[ncztpmnmazsqtrpgipt]ubywagmohqvweqnr
+ltkacxcgeuzgqwndmc[fgqftqheajrmxmwkl]pzguyzrannpdkmoiiw[rumhgicakfauwdr]xxrotzzxlznkviqssoe
+kdteqbiezzcogrm[uyulaxnacehgkqi]vvgjxojcvaeuwse[lrbvujwaidbhupqqp]qzprzviadblrdjytct[ihixbmyzlchvqzok]ovatwjszinstkvkcwrk
+rvcpwirzvmxgipx[ngyuzdsgjvtodxa]aqjkwdlltcbxmbky
+nrfbnpazhvqoxufoil[atazhehzfbphvmmfmd]xavgaapdaangfvse
+fltumienffdqrogcz[colltugqcbqjhaqovny]hxsyqefqrjpfvtyo
+vdwliiyhqqneegueto[wromxahmpgxkedvg]vszttwnombqsvcpc[xnbuhhageytxqvz]vkqbzxqswjeqjebdkgz[itopywuifvgcuuthau]nwxlokywcfdmrmyf
+lnxfcfoxpklsxhnad[tvttrczwyrwrfsldkv]xvoyvjxkqmfstppn[kyeclggkmleveqlw]vtvsxvvrprmxvdxll
+bfbrujzleisjxfxu[drnbnoglwrlyiaj]pqmefgvscemrqgttdr
+abezbjfpqbrtkpugs[iskmwsrwcenfqfcq]bpghsuqvcoraihs
+lpmefpenkbzmlqgmq[avphunzetxfjsmmjdxs]aionmjdvqicrkkuhqkg
+oovycvpryzdfxqe[citmqfwvesbtemv]dpskdbxenzvkmdq[cxebfoqzbkridgsxa]mdvbrwsutplcwvkv
+xoagoeyhlcfwjijvv[vhtyjwosozccevd]yygksnlkcsulkxwnn[xjxhtcibykdzzito]vhpzqcjyngshmxvqfpx[nxmbzwbqntpjbly]nkrlhmjwwnisoslom
+bngreaenftyseubam[isooaeaaujjugyacg]prqqjctbrrvwlknev[hsudwgxcmeoeklchs]uyrmhtzwgbwqowwk[durtalssedcdpbpj]afxgbeoposqwbjj
+uegnvefthogmdrk[rfegmijatgpkzwygepn]rxrgtdntpivcexrghp[otrcktlhkoiuhzzmjrq]elltyvnqdnnttmxafr
+ecfvyjfcoogbbhcfcgv[amtrrevlpkabhaqbyzp]njmrtansamwlnlr[nnxrbkalmzfustv]yzfqdnnicgniytkxv[hhyhbujjwtdwgfx]oayimcktqrvayqr
+shkthohfaiuffqja[kypzkqszyejltld]zlptltkzsntvjftooga[nrevhlgxlxrdhfp]ntoiugoblmiyblfgz[etmdfpjnkssxxmflzgq]uameicduzizvskxt
+zkbwjiaiaapwrtl[zmdjoypqpcoohwiai]zhutipipeeoaggj[ipicjufclvyscnyhyf]vjbdthqyehomdvj
+edlvyecttfrivrrxx[zbxdriofrvcdvqxhtou]veptmlsgqmnmgydziyr[kqaicxgbpdvicogbiq]icpqpaeawkuqjpawg[anpqidabaxviwwnc]qdrhnbnwtfoshew
+rfivrodvhzbdcbrbdg[xepcryrugrdvdvu]oktqcihzwmkigwdif[utknwrvopeqnznelzsu]jhlayryeovpwlqqq
+kzpqjwynohsmyefwbun[uqijmrinjbfzhxx]jdmvhjadchyqzjtmk[fnvvjifdteoppkvwa]gvqtikxjgoxdqlm
+vrmlvtiqtmnkhzxjlk[pimbbahsqeuifhipra]exmvxfelanrjzqzq[jhqavhbsdzglohcyvd]vdmxeuuxbceyuajxyb
+qlzyhenvpnqlhftocwv[fgxvjjpwadeflhq]omyqdbxvdqvqwcwj[pvqpclzgyuxqsozsoiv]rbftgqwizitdviltxdz[twhkknisnspuzizics]yshtpvvilxzynzx
+scjtcmszrcywnorrt[csccijdirjkusdd]ixqwjxqgigntissnu[cfvfxijajdfxian]mpzfpsctcrzteay[cqzwbtfbqscsgoulqv]qiajsnvyhuocfbs
+auipynpqbrwjzlmzl[aujvitfxniudypagrvo]pssylomazqmizwlwi[csdigjqelfgzraldhzz]euqvrminyahycqtss[jeitaccwvctalfrl]igykfetkzrysfwudo
+eqyjthcldnhfkmrs[vokkahiukvtrqhh]yaeqjcljcbefdbdvga
+ffnlotzrjimasdesyvq[tdjiwphyoudihpfxcht]tryyqdjlcuqrvnqich[pbqacbutcqblosh]kwjtegfgffjejcs[cfpgdaeyjttqflljug]mmqqvplbayzjgljlkv
+fmedyfuhqjbpgdn[zgrnmpzjzltwzzrul]rwbaljlzamjxeyoh[ujapzqljttupqeq]srsnomadmxvnplt
+sdmsvobzqyyimoqxp[dlxsrcwlcliplma]ggjcgvaptysicxrf[nzbfjguguhgdbnkavi]cdwiukrzcdafcwvau[redyhialkkakkdw]tshgrsyjyhrdrgxfazc
+statywcdcubhgql[dxaddykuzlbwbncgm]xvbcrhfffhovlkjwc
+xwrjsohnxwhuxxgkal[drdarprpdqlmrnyyl]lcxqhtifgvumxhyfg
+dceusydtgvoidiwvr[xwxdkrpqztimdqcli]isbrbjqiotgrgpyesct
+dfcoyiynyqguhlvqps[ixywuqsjvkcvdgvtir]xjvatxxvkqxswffdvg[wgdvusxfyposefy]zsyoekezyjzgogrztv
+boxxwcovmrwtvpc[wvswxxwkgrfjzspxk]tcupcgnxuowpndaycqh[vykbdrgegnzsqlcxfru]aaldggnttnpoufwstkb[rrepursbaqqdznt]yupovasycjtwuysfxtv
+aferniqruinktcmafzd[zwmijickemmrgtqgl]pabcgqclmnkelnd[rnylsjpdxphsetesnsb]oansnqzlrsdzsoxufj[ygbbwrrxuceezoxmjlt]cdhxylrchoniesm
+zujuchvijhqnzbnncbc[sedjhgvmlhzzembtlxx]ofwmzrlmdabvkfqc[uxmleezwssylqghgo]okpqtbroeqklmxntgk[ddzdtvmgfbrdwfp]omsfvtbuqcxuhjd
+pkcrwivfpomxfofcqe[xrmhrperqofodgfdlt]dphiiahoqqquedgjrio
+kqdjfvkupfhlary[rvlklzcmhrhrkrlb]ttzeslijskqjeeru[nduifadlvotzxlvmfzq]rjgajfgfcmxfuhh[rmrkzsmkejolrjgjnn]xosjsaspfjqyfrsrw
+dlhzwfvcekvrggzv[ofqvnzupatpgzfahy]ftacvsvkgqxrqtanhs
+owtfabwcaygijoy[nosyvwsgkpyfesucm]esecvhmcjzycmsesybc
+paczhwhkhytwllmc[dxtpbrtkeekvoqqkvno]zjuyuhpzbsvzodpbrnv[ozdaihegoqeuihco]pxptnsdupkfgvmhruf
+fkxezddxwnlzlarhk[mswldjncrtgjijeo]ioddubxtscouxucy[qunukqpvvgzpxukwn]fsjmsbjibbbeccux[fomhpmrdrozafwvs]izzildhimulujdo
+cmoxgmdxxduzdczqoim[dyjnrdkyixdcdyqqz]ywngnwwpbamtjuhj[cyfwletseqzeesmxlz]olarxthcpvophvbc
+jihdvvjpiawlurkpna[rozyjywumsckmzsmv]rhppipwcrnrqnqymjm[cjozbldvixcbzgtdni]nhgtgqgnwkgvtqxcbq[ndpdpvdwyhckolnoiia]nrpriclcqejmjblaoca
+mqrofejeandcwdb[euzfcxvwvjgjsrjejm]zvialbaxczkcbamow
+lpjkrutazbxjrsh[aaokpurkwyqmqcj]ldlutqskisfsjehus[rwswxgrjiajnzmyva]kpxjkjranacklquuilh[qswseahkaawgoqbwoba]powmdzttqqgnwoz
+mtrgomgkttblalylml[fczsdkxnnhxkjvoxyp]qhcdlqnkhlqkume
+ejaxgxfqzttfjro[nbudxjzmewgejjr]yettpxcyntlbldt[ecxxeskbvsmevezs]mwwceidvokbtuji
+bajbfwkcbptthrpz[oxibvttbgfxxoydzozx]qyikbmrtebdqcxew[ezfeuqfqpkghozohpr]sjtwsvtsiuvulesw
+pkcglwyjkpslkzfbbkv[kzaxrqlcpdoafrhw]crsuleuevkueuhu
+yzvbeybjoiiawarzk[pchearjoaubhjushnuz]fnovtxneceajvroio[jjltmacrhiepqmd]bjwpzdgdusdlpon
+ntcswtooxfxewxfqs[whcrtyxxvojtbhvcwya]othglptbiumercc[zjvappnrruptaqcnhtk]vervxzljrmrfdmgepx
+mxylkjghptnxmngpxt[scnxrqcdftpsmfttyt]iqccdcdjhcdculfaxv[oypotbnuowotmgnutn]sqtevrkuolowyagy
+ilzgxgodlembephhrox[ficbjdyoqsontgftgjo]eoaksyzlqwolxcwxt
+azuhgtygltvpqybiuhf[aabjtnyzrjmxggpflz]dfbhxzxopayawmrehf[bfxaxfuuxmaiygdpohs]hjlapbinhdphibdz
+rbwahitvgoeoydvuuwi[ipgxmdggicierzxfl]kfvwfixdztoxdsju[nmmixwldeahcoszjyw]exlnyfffpmrqmapdzqh[deqslgzpznbktvn]dalcyomluamkjamhmcv
+clasxatlmbbhmpbe[fxjhfcsoxdrmjlhemjl]hiihjdiuandtorus[kkktqqtmzdzvonws]diaqvpvnyfndpukqtm
+oshcmchulrthjugf[hhkphbgxvavkutm]emqhtezcshpfezmun[xmizipuebzhdblrn]btiszwdiyykvovlhjs[kgbllnxkvfymsqp]kordlzgacffdjyes
+syfytdnzapvppsxwvuk[hssgmdjumfwcuahbzu]tjmijmhyixegulhwjda[obvfnrbrdefnkkxmy]iqfdmokbfvubkyv
+ooyhsaozcfvzbligkh[aezppzdmnnebgew]rjipwlwyzcadfrcm[ucpdhklscwpzzhmx]rcplkjidmzwgldmbxnh
+usgwebqpguedtwal[ucahxntpxjzwlkyks]rtkegixncuempbik[eqoxdwxwbougjjet]waqfnsxnwgbzhjas[rdjdmnzmkcoskhwmwp]lmndepamkrbrezgo
+lzexedsejjsovjhhmzq[xdzmigtseqsprybxex]ctqumfhtaatrinmk[dfqxslvuwdnqimy]ilfphdggfbvvmuuox
+ejomxwuqpakxbggi[tyaxtcrupbficckkic]hixqaeblbratemmv
+brcadksonvcvrovnlcv[xqxceanurghlxoop]tkjynckrlxjcwxcws[iwjtchdptjhnvfefujw]bpibnujwktpnkwal
+ozpqshbippcazgbjwsf[eeiatzwmxezmsphxag]wbmhjqnracacplsd[qqqskczuqsmsaffnqvy]rwexxbhvanycinne
+qjcbuqeoxvfzgzkjx[nmjdpsmgekqtgrz]psffzoymswjccwlvk[pzayorfnkpiqsiwdksr]dqjsdpxbdypbofvjd[rteibgexrljensnsfbv]ywtfitjjgcqjqdqnai
+eqctvrzmizmzadiv[nfkcjhlffxwichh]owulkigprckljfa[xwiexfzduspgkmamyz]dslflydyueutucbz
+gaptucbphbcauhpb[inmcacncuhnijxba]wojvrbwisnpqgom[lholtuvxkozwvqicgqc]yfqvzhaxgbtrtpt[lfwlypvzebajjcrfg]jptstikegtittkncnp
+rdmqymmuuvlqlifp[tunrfdqlqcskqzfn]mznubonmfmnddggsl
+bpfzfmjrnvvwock[jfgazbkopygtwbeyfb]zxilzgfaykfbfloqe
+jgoiehvyjxuigojewgr[wpejfaphlaoasct]abvacgtlnghcwjhu
+givjipvjxzexjhw[xhnibqkmqkccsqvdbmt]axhurinkxnjahjqrpf[kpuvbutiwegcyjcmhs]xvpeggiwqjftpkbc[elnyvjrckkoudanf]rbetfdgudyurbhjg
+llwritpzvxwzjcou[kywjmlrdgbptakqh]pjpxwtjfyvshsaof[fajaogkpjxnklwjm]tubchodcesdoseiyc
+jthqitsqmtsorji[xbpqxddyptkjplwkirj]yatiinytqnkxblve
+wwmxeeruhuctslt[eeolefqgiexdnepz]wtaprpghficxxhuhw[qivyocneharsphhqhe]wkjbvcfoalkjwbmf
+mmcrhrvyfzqlcrwhhce[tmreurytppiemvporrr]qjcivrzqwlbravpsra[zilvcfakxnllharqhi]hqztgurarfrpmtxvdwk[aybsiaabiqtxvegkfol]rdposwuhdwgdiqdnd
+bxxqkcnpyjrhckwg[ndxfglcetarccwax]ekgmeuxdzsevypla[lkyczdaqbgeusesaqpo]ycagugbwbyytiqqww
+zyjztilqxzyqhnsxri[eqdxnwvdejxnxhkl]jxvbrnndhkizjqpudnb
+jvjvdwddugygslqxxlh[khubfdbygyumlsz]klhfsjpeedjxsxbugq[zgyevzlwzhypnsjw]uqsfyxqdhtyhhqp
+cwuvzqzxwsptjpi[ydwizxalwppbndoy]doilzhmzzclxyolblo
+hvyktbbtisuoixxlbp[ielefwdbakmijesfd]ygoplccrqumknyeyba
+byxuiqrkocycxolu[keirspyapzwoeqsioyx]uqbfvwfyrigpovez[bexwlugermolrvyhajs]baxemomocyoxynb[xmuyqtsyflylfxuopf]rjboetafmjgrpsm
+tdklkptxgstlhke[rdmlbgaqzezppltw]mmmgqwlhurtjqygissa[mrbfvjpirijwrirqsjv]cxbsbwsckpmuelsrx
+zvltaytdxmaumarpia[bczfhpdfxomflhqmy]sqijqpemvyephhbi
+qmxcgorfdqsuiudpa[heapfprpzjujgtbg]mngqrqyywqrispeh[pgrhcnjpcunepjj]habgqhnhgbbqdptbo
+blfcfwbcvxfvhxav[hgaehlcybapzhxu]wkcghbrtkkwvjyzqlr
+knxtxqrxtialzcb[wnbtaiesijtoxcpa]bwxxslcjmzlmaccropd
+xsuneruvwxpqovsx[qoyrvfdonvtegja]osapkfmwfyoyfbomx[dngezvkrojaiypd]iheegrvjogprspujlk
+ezcdwtmyvgaqnwvir[blmpcywkvmzsuyo]zwisjrxqeselwsnbf[bmxecxmhgvutavznsxd]afuyhzbtlovctkvmppw[etavleaprramiwi]odmsaglweilbnemynpz
+pyrbvyndildippd[hfbkkwkkenhpegzd]glkplukxdjodpmndp
+rbnxzhtibohbvjbtlpk[eevybrbygduikemgg]vtkdqwgrzfmkgdpoz[zjcxbexbxmncrbrvlc]ezqsyjlbwumelgih[tselcvyztrdlkugvx]vgqjdcgybgbsddtaxaa
+conkuduwkjlgrfc[evbshdudauhmqhejp]vgshestjrgoxjmtedf
+qayvcfewuveyogr[hyenmhabxswictfv]golqmoruooihgeelk[kfizdlmpmizsnsdvcnm]dzbneckijzdnadazot[yfxhyaecuwdkwvzr]qhkicwsrsbzjwpota
+lcztngoqsiwvfqhnwmk[zvfkipklnsakhcpzgtc]vyesgzpglksagzezcfb[zgyhivlzfzatvqlk]autcwwoipxmtamazxcw[efvcjwlrypkqgap]hcvafpyqabhqrgklyll
+zedcfrhfzqxfsge[scfaefxzwalnttqmkwu]qtilslwpcadwvaj[npftppifpxpnvqtvetm]jiqtmeqjghuwqpsfd[txhrtyrvwdrazlnfu]nkzjxxiplnewcjv
+gjmomiqzzhsrnbo[jwhqsbyluqjjletch]crvorftrpojbbsd[znqatuxgxrclcss]rfjdcsjwsqmvuphcvxp
+mzjqzmseuxltakor[rjfzudufbzhemipao]vtzsxumzviwiqog[etectpaoshwzlut]osqieltnflfqdnksdce[lbueyqxlfuwefsuue]qybniqnpkdsmirlo
+flqybxwhijhdqba[hdzrbuxakxxrdbkset]qtxkjzatvekzawmt[koxwjtmbgymuqxggz]auwejfcoiofibpgtkr[lsbcavrwgygsuqlksef]tgqgzvxnthlpacbz
+eqtjkpttgwtnelvbwhn[hzjyymxntkqquur]qcoxaiyffkkitjn[wbywpfremnqzvepiqu]knvvkbrdfojkanufw
+ezacebuuwsjurgex[mlvnrrlipcdywriyatd]zlexrnirycvouts
+gimhfftrumsmvge[fkaxvinxrtcncwycj]lrnulsujawsmjsd[wgfadsurmhiydflwk]uyzksqugvstnkkybp
+wbjxgkmxhkqyypyfha[sepuyxyvgozypvacar]xbgdthsqwooasishixf
+tijyosliiskkmuwpy[cjqnhwnzbekvhlw]kltiqunfyjrtocv[aqtrefpxkelrjchy]vurioaurakqrwnre
+kupcmifhcvjbkuhydkh[rvanehtiejcvbiholi]qcaksnuoycdanmx[zeoogomzpdwezmugl]nlcgeroxhtitayvctx[ogvmluodhaqxnrhenx]zjjfjsgyfglhacjnrhg
+mcrxrkwvqoctzkthwzs[wxgrtuvzcyprxrxyu]xlbiinpyuhhzyxrppup
+rnxjtuzfichyyrkpj[rhirkzutlarvceqy]hpylofjvreuibpvr
+aucrxigpotylwkz[yxfeikktjcxbvnjo]prpnuvlyybvecrvxc[xtydsqbcxsadlfijqdd]abmuipmottbbcvcrfus[hbeqwrliqlaednpcbo]hlqboxsmzxdndwsgc
+rxcqvrkeazdwlrum[txghdyqabezfzxngb]uhphklwpwfwlohasmth[rxixwgamovwkutpysew]nmvnrdggfypawtro[qwikkddzvvvigqllnru]idezdxcxzczrmzscsk
+bvkryndkaaypctgubsc[oeagmbkzrpajjazm]oumyivtormkblitv
+uponvppnjwuqdzutdsf[cysewmcnwvxemsqnu]trfjheetuwtyugt[iqgjwbyeyxrncynfuo]iayzdndfzhuvgfn
+bbmyqlzefpudqwfrw[rdmdrgxiooxyvihppgh]ounosrgyslweaogvj
+emuuaxuvfmiwomd[gdovbgoyoyafbeggh]swiemcjscimazwbcqa[wsrjizehkfpeimwo]lgvmmtgzqtqhgvuru
+ufroikrhavhrurk[vbxpjvirmrjsvlu]voejxnvidkqgetnksnv[dbhrcnaybfatbip]wjpafyfywyqmsugaeag
+klsplmpgaxtpylszp[pasiteibxnjmtzbokc]xpadcdaechphntvdxv
+ykhxmwleggpiyzbu[zslsjywxxtxviladgg]txteqpaaovqculopkrz[awtygoizdamiaglxv]dbicgkaacrvfgyv
+xzriccfleusulnlvvt[vtsussorofvupuwrat]idoigjzaiabmlbwhcas
+mziqkskltbhvghsfuyu[aculbnusbqlnhnwpwt]nbmpwptnavupjxs
+rldmlvadnumupyxqm[gzzzjbieaiupkytkb]vibwqcvqvybamco[jnitcmgcxonojznec]qsaxoelsuixechvn[bxxubbxveflcfed]pabprztdqxmocfkqt
+xmpazxprwkwbasghfb[nuhgoguvmloomlgqyj]vtnakhlizbmtiqfqudc[ijjevcorrrjzangjc]eyasctcswtctxnu
+mvdiopzywfanaqy[hjvcxnznslqhcqrkec]khqxiuhqkvzbfkog
+ltrzictithutitxt[ghgxcrairpbnnoemvso]ekjiysoqubdndgkw[qipmdfcfxuqmolkxe]kxpapsvkobzmmbfiw[udpdrxeozgjdjhhnkm]mrpflzzjawefwpzeb
+fdyukyewblhyjyx[jopwomhiisxnuerpi]glsaylkpbyxllgwmfv[rueojdekuaimcvkniv]witrkqkmzkyxxwlspe
+uvfhyswjtnyhqobzfpd[nhgpmqskcogyceairy]xowcrcyirmuruxtckh[sxddnsiedqedpfiykji]kpbzbugmaleqxyl
+vqqimxfbueniooe[lzxzfjihkygecvzvv]flcrirjngewtumxzs[yandwyszuzlcubt]dvhbxvnywsqjyqhqo
+lunihongrpvpalzq[tkzljqepunhqznyptpj]wkipnucjkldgsubida[tdetpgexmnviwswpt]pimhitvqrrjvoqwis
+lvaekzofnqvdubfrsk[lvtmacbdzydqabjkgxb]jbxaasjiawptstqogi[yaenwdrdllrltchumxl]mbpslcugeuhqzgqz[uzducptflfkjdrgwrm]unxbcxdgnoykefjtzbe
+eukrbtlorkrtqfab[lekqnqbejpjadne]aelfusrvaapcnpjxb[wqqogplrxvgemxek]pwvvamjmbsszdamm[heouyapzgvjlotyuhxw]cbpecxzwilyxwhez
+pggpeuuyirrouzm[llkjbvwilxuvtyeiit]gupoanjhyesnwhpltp[ofhibtfooiebglzhday]yvjyvndeuucjrimrxr[yeylaewmxyfcyuic]csntkkssbctgwdwjvw
+nlytteqqgkalpmrc[sbpxcsqbctzpuaakx]bsddanjfxabwiljmlxd[ruegjrpgrmhyfoaz]onwknfhnjitgtubtckf
+csaiacfvzsbxgthemo[npnzkvvtguwizylow]htwpxuzhyqiukmldt[yhdfdlhdjhkcrlg]ipoknipafbwgxytfpoy
+xwfcctwnwjeskqag[lftxxdyrypdbyeey]mmkwkojnqpaohjijh[rpsfpligfoulumlq]yrosewdrqkbgicvsrmn
+vgmwxvnqhyblfpka[qnmplnesqondpvjxd]xkjprddmfvabofu
+btynuvvabcnisxbqvx[xlnbrzabytflrxd]fjphbndajvoiwisptv[mxqpntetsskqjij]hzhipxqihobzzzq
+xehxreqkkfjxipbdc[sxcdjlkmlhoxvdy]gahtakcbmopomka[dqxdvispmbnwwzhc]ypvvjdrhxypkpqyq[ibpufwgxwhokarghroa]gajqcodcioqeicayace
+qelkhkmkmustwwbgnk[uvppfsvufazoogql]rigakcrbqudgyvrm
+vclqaggfqozeeylqr[ozvvsgmagqdrieg]kwdavlebaonurwu
+cospfllecgkgqtzpoda[ygnwzkxglcitxfbpojp]fmjziwhwyfmlgymin[oxzpbbrgubhmnhepmeh]dtgwodfoyponzkgkq[uyruiqiqeiosqrgpd]vzqywdxoywfzagvlvgz
+wmpnhrjhmrljibaol[lkgtlecrklokuufgref]fpbroqptvihmmvlapv[kqyhpvvnziiatpmysj]ihgvfldqjawqblllm
+epmrcmqegwfrwduzatk[bwvgebhmynydytly]qkuxfjmlityuqpiuz[mrcbeojpwfmogyqtx]fcuwcopogsuxrwcmpd[fdjccinxufucskung]djrvwtngllkdkzpskbt
+ioysscombikdlfl[rgvssthnjkjyqbus]rxxgsfkzthnelrlqi[fmouezssntzpkpvoz]xpedmurwcxbmrogmqc[muvshqttktmhppw]bcaksnqurrkzfuvsy
+yrlqwmybuzttmta[wduvgviyivhsbsfoaj]xapgyafdheaypmliw[wzkgiqrgjgybkqlqtw]klbbzruoorgsbgnoh[fcztvzhzdcvytmx]xfuwxklasmlzdpmd
+hmlxxegorjkxmwub[szfpjebirhpctwhqjo]jhmflkbfjehpcmmjmc
+izroszkaqdimvccaj[hxneogylklgpkhnm]gxjrzoymwdorjxfbnfd
+zkcdwfzlffkzejmpz[wacjjgvdswnetpj]olypdweadesbolvc[rtyiqvmqmwlyirldxl]dshmdsgmhyvljdzucnm
+ckbqoxrgztxewnlzt[xmndrwzvoououidh]natgwmoyjmlqxspdouo
+swhnzjzdspsfdfe[emfqxuzpzupyqefdh]oqzqhvhkedpagibvkae[rzlobzqrpuvpkicb]bzoliytdrdroreles
+iztvetvxjqpltvkvsud[zhifpxvnvfweeau]fdfztegddzegjltcfo[cjapyvcsmyppiovo]zidpbkafpcfkzxdwv[moqbrmegacmdotcm]hspyralgfmhiyvxa
+jdafqreeawkefqtdyl[xoaybwduvbepfdfvz]gvqpeyxvzvulrjt
+pddpgibqytztkbgsuq[ymujijikkoudcngw]beufjijpbvnumuim
+ucxbhtwexygmrcg[uqurbfgrteletvvkqon]dubwuxxfagugtxsnrg
+wjsyuzatnltcqwfim[kbcgsyuzgxxjjvb]lilpvgkqxyzrpaj[dewurgblijpigaz]prryhpooioetvovtskj[uoskeykuyinefrz]dyyodskolistloiwsje
+vjdndymndnmoekurc[jhrgpcevpktrczlt]xwmyfsfdmppvxmrh
+ncotkjbzckbxpvdynq[jeagqygsdeylrzqct]putohmklmktyecovyk
+htryepnqeptnntbvy[ruetrynxkllonponrzp]uimyvygbbjskgfuuu[gossoavktylxmncyyfs]yotrlpozunzomjtc[tgoikyfrrmlvyvoe]rlnwzyigyvkhequuh
+quaqpykfzgcsvjvktt[uewzjdwgvbqsjjqorhi]jqpqlbvwatrkjwuefhj[qbnjoafobpfminlswxz]motffatnypzjzimkskx[znplbzndpvqyhyiuxjn]euozgurjumhmbsksaqn
+oqwcdtnqratojpa[tjzkliezitfoeej]jcmjzggnpndrbcdt[vmqdzdcmnaukaulpxrh]jvhftmpjndinconrd[jabrequmwzqgkflxe]qfbpwimzbdaedtyll
+dmojpwvuihorsnuuntz[jdyqngvtlytqqbgkhii]cregynlhfgjwcnep[rtumpjtsmrbrblxlt]fwweoejcozelkas[qjirbrbultjnrwxqgnw]crarxbqyfrflijjqvcy
+qjjmiujbippvbplba[rgwtrkyumzpcfeli]wzcernyldinuinn[vkckrhdnarhuete]lbxndnnigssqlvtd
+nnqvkwawhoswydu[vyogzkuofpiahaccjmt]iqmnxjlbjavnuyfupx
+ucnygbobqgvuyiuhxje[fuobokgfwbvpqbfiyj]jxcvhlictpfkaour
+rhuckpaaqppfdoo[wioieplfptapozwb]uoiohcdkyohvsjiis
+ewqoemggcqdhnrmehqg[mnekdxnxneimqudm]sjjhuhuphhusqtmt[mpbvgfwbhdiedzh]qsixlalnrwrbgjvi[ncuapspdwulmdwqva]uueriochuuievfzbt
+jsuomvkrvqofxwtl[nyuglrpjfuonsdktpz]mgejjewvakggbzr
+nuagdeojtvcbcoethg[dfrjdlokuqvyzoccyd]jybqgicldznxesoalgz
+drmtftzvxarkzim[eqfezqeviirhllnne]qedeseblbyjtwswj[rpsjqjbxrtzfazlikux]mxwswjacngrjggmpjjz[rrhkcjlsogctsnm]eaaugmowojdgcclp
+tbzffdcdmjlvzjo[xejdjrwbyqiocuxeiq]oghxfuptfdpnxcoluz[mrampxwfbmsssheliu]hfvydfhchubogir
+juvhuklkygekzbznki[wiykilvlzxkfuqvo]lzcvkmzznkwauzrh[jrhmbyqljqnyijio]yrrxyxcjlyeratxp[fvpuvopxdcpjjqdlez]adqimncfauwosnuu
+ukltbucihswauod[bhqaeqkxbwivywmt]qitkxnmylbyavvizdhl[tldglmhmjviujxhmqf]tpejtzahvavzgxdbuj
+fqtildszglpqzzjl[dgbnuttrslrulraavu]adjaybskolsnapzmuj
+goaoupqphzoejsqpqd[kmcnaedqlpiihaft]cffsimwkqvusstdj[jnkdxgldkvfyrux]ygigbtjpwzzuyzzpjm[tklflcorajolsxozxr]oguklnturjdlgnzokbc
+ewgkzbnemxmcxgkqigj[dzacevlmkuiyxlgqnkz]oxvvktrcmrahcvmlnbp[otrfgbaaqmkofacmrlw]etrmldlvsnhehvjk[ldvcxxpdqmgmnmrw]lqyafdemdlqcriwh
+psonarhezabpfsifv[uaqwtwobaexigqnc]fuqrrfgtwtqvbnjjx
+jzegdhrxnytavmx[kdldajeatgbqscvf]bprcipjdemanmczkt[piosrwzmzmqnwkh]hvcpvmuoblvumniat[exkpmlxhaynhxvrdmgz]vmuoxjinapzklxaru
+ovgbmdielzykiofb[oiujujsxewzjczsowk]ptlvujuolzevdlij
+ixubgymonljdliwyflg[naxmhtywscwdgncnhkq]zikafaodhrbjpslz[ofvxmfbsoijfofozrwi]ieymceoceiohwaxs
+kyindqkvkdulbxbu[twxhaiaixtafaydx]iwbaxohuhfafreuc
+sirqeuilhguzjwoildl[ddldmsqqierffbvftq]xniqqnqutqzclhoj
+uyjikikqsxdnvvqptpz[ymhsvvjxoijzkftht]hmcmhhdmmxkuzhfcifq[dwoqersxcrtdzdwa]rfxvekmjgrdfutfyrc[xhbfbjylhvtptculh]lbbwcmukfgskjvhyrf
+ohiiukzjxgigfnurxv[tqsjmkobruzafjl]nbsznnqdcaxetyxegku[ngbuxgnqpxnweesoxuf]xlzokactshqnwjbpzw
+xpixpwufmmfestlf[chjkyywtsoksgcffe]xyhkqtytuuazytydyw
+mjeioloitmqjfxpxk[jrrpevldwlolkfoaur]ozkxincwxwnrtwqaoqj[bowfbswohzbtdojftd]coiebgoxmwyvcsd[utolilugilysyjfi]ivzfjbjdkrldfxv
+yoydqexqgijzgbxns[klmoyhlynafcjwhgllz]lmblxlcbdxnzpdyfxuo[uqzaoedsewctgaplxay]acoovzqekxxjgrh
+iinmymsvhmzyqnss[buxwtdshunlxlfjbhvx]tymymgtvwiyirdt
+jslqipxcivbgifjpn[qkvesxvurjlxpxoi]uiskmkydgjuwipynyhw[ehwnfnirchutzod]hwyrmbmspvyxxcsbz[iblijoorvduvtrbtdfx]vmkmogtwknogvxheid
+ygamayhzabvmjweoojx[iuihqamxpamebyihhcy]shltbfotaolqije
+zfqtclfvfqqbztnch[mllzuqutsrywfxdahle]aivazuuusuunrnwoxj[zhqqwnbilfzqmow]smfhaitcdivwbhqsfc
+yyfiotslsucmofojc[xejwcsxptsxvlpik]rlslgphlgfxydgu[knmtespszyxpghrw]gmbmvaozgrvqqeeqg
+pqbjbexaeyakyaaxi[omgcbnluzwoklnv]ofuzblenimvaqtxjez[vcxbplpfqwpzkftml]cejegegtppicmmbu[yluyvzthmacplsvwpvf]layvotzubjmgejnz
+ljuprbgycxrhdmghqqc[nlrcynvlolnnqssdg]xhonbxirrxorjuzpujg[qlvlvpqpqtwjuneh]vikbwqmgwisndlqrmcg[xhethlrfkbthdmu]dckjqdbrblnojcrzurr
+mqutqmdwozuhzwqqxq[dzwzteljtplitdhar]rxghimhyqxowhlxv[mlyoqapnlnyyfocn]vivneyldkjcptbqhp
+sjhqaabpeywbipcxpnq[gowomrhpsyrbprhgy]epfpwebswptfcwghpus[xtyuymkaubtsklja]ymflhwvugjqzjro
+aozxxdegoqmyscxet[ssyqfwkxxcuazrt]jmzkmoouxevdffhmv
+egqxowrobuloznoyf[hgzcdrutkfegvbwehj]sbqgbkajfdvhylhy[pbyjyysgfabkqqlklz]bmgtcrxghywvnlfvgx[ufqpfqavzhnvbxqjnb]axmsnnumwpxscjufqp
+tgexouwlvezphimqk[akxteehqejbqofh]gqaqxpqtutrxjdwh[mgkvyppcynonofl]mvhwhpweeutuwoh[ykvtgfumeptgawckn]vbxioamtwgayepi
+ehwlukysindvrores[bmlmhiwontkxtkvr]qdadhkvcrvpfwewnt[qqrjjvoffqmwzmnkeve]iylhaugqsafcgfkzuqg[qlghikpisieuexn]encddrspyqffsprdz
+emhhugkpxoaimgd[gatktshudmjikpvm]hmdwdegfbdunpzqy[kqmktubpxtauvts]eixsnjdzhdqllhdo[ohpbpjtlcocmboouaq]gwkzaltcrojxdxfkr
+gyiflvcgrvflnqsfua[govhyextdputygvvn]mpazvdcrlxrozfyfcsr[lktddzwjgtvycwryw]jhexlibwfeiohlfjfom
+wvnbjqwykgnpujeos[bgpgcsvbguimschbxzk]fxlofwgixrlscmgdpa[rxjjosjniqheyesyyf]fbuovdpuwhognclgw[ftpcohfizteexczkrca]caihefjjiqvypct
+znsokldvcjpxjog[mmkosmhdjarmlpvp]rckhnldzjkcyxhpe[hxpzqoeheamnyjb]xpwcusvvjufgmqpjd
+wnfvoxftftdasxxvwzf[shljlydeedkfkwjzrjn]zoiutacwoqmzrtft
+aavzczotsjkzjqd[spctqczcqcyjbch]abwtqpotbsyxnqm
+psaxaferpdjkycbefq[xqgdjlcktplyirogu]ayvzfrwshchgkwk
+nqezrycwcuqadjxgygz[cqgfbndiaxmcigiglf]miznonmaygbxduatm[ytssutmaudrdfnaje]vwvblylaxpzyuqokqw[jkbbsvkgmwqibzp]rphvqqzskkjjykrlrl
+aastgvboysnlkxeq[amoiceiqwyyzwizpra]xvnidsjvbgmwndyvqup[fqmasljimjciejz]vsuaqkawwzcdegslhw
+kroepfhjfbtngclblv[nmqbwnzlppwwogx]tcmygfjunqozmnwhv[gnykhdptiycroiq]ejwqgdblbwxhprzuwww[tnfzvhsfvbgpnjdn]dxamipqvqyycujyqlg
+nmczyoxdczyqdnyzlo[iudpmifsntjgaakwxj]lbhyrfcescrxaabp[zpzkolmrfnnqgrlkj]vxrynwlcrmuqomi
+ozzsbixefedyqugctr[ehzredumaoouoqmob]ajhvlcgqyqgpphtwhxv[tnvtgncjfzpsgewcd]bwolubbkpwqqeoayo[ugtsozzakczenvgjtg]cxtduivacbeypub
+vjkbvjmsmwjqofeiq[qvwfansyyzzoxti]zuaejbqegivwayycbpw[eeiahaseruwjsqfbqpk]ikghnvcjvtxtgcd
+vivrgfiukxnbynsqp[cyuxfqupotifxozqnc]iobeautkmsbtwovbrdb
+gmswnmzxtlgkskz[ilsfgpqvhfczowcgy]jgbfasfqdxeckkl[bkknioqgtrirutu]mnwvreyzozmwsikmrq
+xvcbxpcxcekdkzjg[xhaezauemdknbbihbzk]tuuyyrxavoectcoudg[jpatgaisirkdlyuzul]ddafnkyfhdaazptd
+wjuuzneefhlnvmesby[zxqqpbcrljufssq]mehwiypnradpyar
+gejmupwxgpbfiugsx[gssvhpgjkbgyqdgvpx]phhxtbgfniztdxs
+tbcbksrhfnvybudmqsa[janytibukbknmcv]bnvnzoiztqsxnxvery
+zmcrbfzmzecldlunt[nizsuoobvamfrlu]pegsxhninuqxufq
+owgmknvhkuwplumklyv[tpcacgallsjgeuf]estbhqisggkmxcrxt[cecydypetuklwahrxs]okdiwhdydchkjhei[tpunnntujbzwjwrq]bcpxsvagbvvxiissg
+zlcfrdllydptpnljo[ysyvwymstsmbjoy]ukwowlyltntxpnvp[hfvczmmzgyhvpfvph]yssagzxajdthcxea[uixmfqtqbguxqsk]gfuddvwyinlvxcq
+ifwsawgrffgimlcwqz[gttlydqxzgwcfng]uezrozxqsrgoxnf
+sdzmakebdnqjulckb[kpeetbjmqnjsxypx]fattzpkviicgbzxhtad[dnnceupusnyubcrwoa]dwicwgfuccxltygmxe
+bhvftjhxhpxomsyawu[wszezzsyswrdrlqr]rhvaknuzoopejwnmq
+iddffrsryqmuvyrsyd[klvpmmknqkqbnxuew]wnsuskrkejoyetzlaij[mbxwmnqnrfqexoeaml]spyxfzlrewhwzeo[hogofwwdkwvyswdcey]edmmnhtfauckalllsib
+sicisnsqujdgmbdk[pjgkpjtwtzacufridds]xnoqmobgoaojxuccvi[akyizulhrpqvdzl]nuoxcrdvuxdtcwu[ejfydgnmckcjqhmbsx]lwbbrynehycwqui
+mmhwekjgjfjmmimta[gctswyndsthdyhire]baajrssklpzxqmlvke[ltkglmlowvpviklmnzp]xqgdcynvulmhzani
+fcwuhpcmcmusmcmzsk[daajoebedzmqrvtbpg]cmubtjbrxkumvect[swemlhyklrgynkae]msxqqcdegnmfewkn
+ohnbhxtnlvqsttsis[xibvstjbtnheqqqshhj]nlmikiiylisznwcq[dizyuuiuwhkhmtrzzg]fjgbjwxwlkcoqcgogq
+gkxejlwkxayppjevu[rlwqikjiqcxcvgw]zkcjcopkwedfihrqzke
+gcakbrxzymhacsg[edvagfjmxhrrytuxthe]mojwznzdsgxznkl[asvccotlewjfzypkiex]gdfoemtsozpsiayo[ryiippkmjzthrvwl]popxgzxfogjvgxry
+cjbixfgchamiiqvfk[gwxgfniaznjuurx]dszifvjwbmjffzn[dntqokjkwmynchvwx]lcxwmevpndfqswnin[jpwcnfxgzfdwcgsx]hxrfqzflyvumwksagie
+ptyeunotosvcwam[oimxlvevjqkzxlucnx]kzfesplnuzsakqhl
+zwhvoxdolwwwvxtprp[mskfzikftyxuifscxsz]poodydwynngwieq[onntfnfnhsbstcccye]fydyxjpspwpwuqx[cckukovhxxcxrkd]dpcuytdrvsgrsbfjrwi
+mgvvtoestsdfrrkqdp[jsgddzbtstbtgwcz]wbewvyvzgfcitls[byvjjhihwocudzfpw]uvswjmgdmezggeklden[zomsrocssnjxwxunet]gexqvwznakldhnds
+msfnmrvwrghyzjkgzfu[odljvajkagpzgmfrkyx]aggpfmghrovrwyknxw[ngqglnuypmgejixww]twcvrjddnhduugpxcvg[wiacotdtiglghlma]evtvmgrrqafpaxu
+qblqternpbrtiuh[fapmkfrpbuzhwcfnybk]ardetkryijgtjmdj
+agnvlcifudtpkskhz[ssksropazylummmbch]zjssxslmlnmjoxxf[wmedjpjwjtijfmucv]frmxcjyvhtnyglrkgxq[immpojsucooxlbdwz]jiqurgdnrjejroukde
+oieagfvbgeblwzzzm[lngokglaibefcvenlwn]fdsqzeblukuhfzyhf[twfxwotgbbehlaxntq]qydpgasujdlhkmhlb[tygpnjusvpadbkayoba]ntdupgbgwtyasupw
+nkhamuohfhcavwbv[hfugoocbsqqsdxmfc]vgkzdlkydwyqjyn
+gdoccbczcjldspfueoc[duqmkqhvplsatlhz]iafuyzmppcxzrtiir[qbxmjbnnzrvararuvhr]uipvgmhashuevyl
+tvrgoqgjslpixzd[dvcgrtjbyihdxvlginb]iyppczuwpewlklk
+mnlitvdbejsrnywrqw[jkjhnxyadzqdamvb]xywotroqfapnbhndpf[mhzstybvhusjhspfyyw]ctbjwfigduuutxu[wokoleeyoutpzcha]gpjmqufzmyldciqtn
+azzofyumdbjdfaoxzrg[qmdsebebhkhhdpt]ygyshnczkxlcruxjz[fwxrkvqhhlyuqvxhdcu]liavngiqxieczgjqa[jvptolwhlncroasmr]kancigwgphwgwxb
+mkqtbfxzplgmsslvne[vjgztezntbnrrptsabt]bnvqdmfenlchukjgi[ieavsusemvkjepivnej]gbyeowflyuuvgsowctc
+iddhnstlrmffvsaz[xnejqqslbnbgnmlyu]eujdrqjvxlpovzxwqmb[oqgwexhdhjujitcwy]dphgwjcaxssylcb
+pipmxilwapisesgun[ktzmndpffhnsfnchc]yljnipppqujqevubxg[rorbgmlkbhjoxbryo]ondmcsehqvvexnghqpm
+lktmrzrxpluntju[nljelzujtjzunkezb]ozrmieeacpmaqghf[jaexvmneyluaohiju]xtuzedgcugczrzle
+izpcfmamliqncmcgaw[rfyjbmvbiopojxxb]nogrshoiyvmxyzjyn[jegqvdtkcqhidepcda]sgdnnctcbmvtqsbwt[rtmyhffobmfvwcl]krvynuqvannkyicot
+dewutxcsanjdlmchu[wcicioikzjdejoulljj]bqxeefxgedpsavlw
+asfkiixaolgtwtjw[hdkpghivmztxiisb]wtwrflrthfrcattgar
+gvgvnlrikbfepogjf[ipgxrlfaltggvmkfiht]votekpzvkopkujkufl[iyhdgdagzhnrawet]ajhduyaxppxwgvgujmd
+tiebcylayagfdqw[lkftgyduvzdzpsjkcr]mqrdayvtvywsquj[xectwtbhvpnymjcmgon]sweddpysjrwgssll[lgzhfkzexgtxamjbmgh]zvlhicbqqvmwngosysq
+oewghkhhldonunufju[olrpkibylltmvokyjna]eedjithbjuymlzq[gomlxncpbgzolpm]qmxofuwfegkikwfihck[wudvrycglrxlypz]lsghgmgcidcxvws
+dzisgzrxauzpmmq[ehrywgvtnvhkvin]clqsfudqvcnwwxru[vzeqaaheyudnqgdfb]lmasdsjzekcpjht[gboxhzpaguxuvyha]ipqozarhswigzeqzdom
+dyyqwcghdabypdkgndn[kmnrezvgzkfmxyopiin]vbxvpeyeqncygca[biypmucmnkcqvqfjgyz]wqwfitifrfckzzhftkf
+ffrywmbbpzparzz[silwmcdyckltvwu]syphmujhpatfkccz[kagdkkcnnoxwtxfe]bbxheegelkvftabcky[mbuxajqsttmhnmfeobw]smploudflhpjbxgpnev
+qzqdfxgjmnrbltg[fnfbksredcpkbqtp]ncrdcfskzzqztrm
+uvfviatjevwnmugvgk[jwpgxsfvfkijpdxo]wpdwqxjmxddyigesygp
+qjsbieiciaeemfblfac[jjudeshcfzeiezuepgg]ktjghduwspdhkldzjyn
+usxxvmwheuvgleswoo[irucqcgtsjgxeqwur]pkjsipvxxkjoqqp[osjgklsxyryzoxkfnm]xqocoktbrletccuw
+jiirthsyxhzgjcrx[yfuorkbrffeseaakcr]amzdbwfoaioblppammo[pbrbaxhfftauuxvo]gpnsbsppifolsrra[kntharjptgxiztu]qatjusqejmdzaqycw
+ssyfomequfwxahvfvy[kctdlusjzhgntjy]zvtmizweshgffnlh
+pzfvptwkkdectmi[koencyjqifclilknecd]wctndrlxwbwkxqazsj[jklzmkhlqwwpvxv]mazihpfxewkjypfth[vannhyvviuyjhivwco]qghwmufezcwrxtuvx
+dltmdrlzeauhhwsom[naqwzhfcgzictvbsswp]rtlevxtzzviqkabimc[dafvtawzxjabdtx]kfuyxbmqrkqemkeetoq[dmalddncrdzuslnpovt]ufzjluhczhxmnanov
+xioeqonkswrhfwqt[hmpztzezyzpqafedtpr]wmwezeoixeriejbskie
+asocnxlrbkkafwscv[ouuntljnzdspcxxub]wzqnqrvlwoccjagszr
+scrsvkbwabaqpjs[xiijpmbiflmxyxwkfn]iysftpuvocbtwaggugf[yrqyvyoqxniqxcxmbqq]gixcxmltuozcxcqehl[kutzmitklfdfouflbh]xdozmussjlcttdf
+apnolukxcjppvyhjenn[ktziuhqmkbjuqffimzn]essdusalxlbxvbsva[skvzdkvwpchapohlyq]mgcfirbsdbqomtxmxi
+xxfucigatkfvpubv[yrpoezyzhwkpkkkmot]vapkpzcbwhacbrp
+itcqefgdapiuzqtdzm[vvcaufavmazjpfirrto]hbrtkmfzxjewtaswfm[xtuzqidapfxvuzgqm]xhpufritjjxpdlx
+nfeskfxpmbdjrhgusld[vkbvbootlttpfkt]nlsmsujsgjnjigxlpm
+lbindwpgcwkdslufzsd[pvxblmfzbdbtwihu]zmrgvwliqftoxtsaxg[pyldqlarmljuuzaj]cgzueqqndeotcvsnv
+xedaztzmryqxwnb[uhqpmhywmsnsyiq]ysaelvgeordrthhdtkw[jdnpojewrrdeotk]ynbkvsnjoxwgwxe
+vkfmkgsnqpgareui[lfezzjgbdptknrxfq]aatkorgxlumdhvjay[ngkudbpkmdvdskihzh]nyhmsgfgpuzhzkbh[vuejragqqtizjmqeqdo]ascjasathqvncdnkd
+cvotsugnqushbrpprhk[totbjscfphjjmur]rrxgqtuyulqpmywjz[nejrzhylbilebdtqvm]hlsppreuytghvew[bwooimafehcdzhmyp]qnowsbfdbeupqtila
+nykwyqwbrhifjickcwr[bkwtqhihmczedyoubdj]jjwfyabbyjjqihit
+dmpuzthecwjclvd[lxhxcrnhvdpijjuypu]wbwmabirpitypyjqk[ywytahvxbsnntgskdj]nmgcaavgvyndrcq[grkvyncdwfbmfdb]odnojfyxxgzspzuk
+cxguqyufjifeyzgkw[otebhoxdrvumjpzgb]svtkxxqnblsmaodb[mnfwxqqdwqotjbg]fcvefinmmnutloh[ljkeuuuxicazbuzlfx]qhrjvfrcqxsizjhn
+yuhhdmuebufhyly[llyllkurxorkwlx]tbpgsrxtmztlofcobjs[mqoepigsswhitdcnd]gxjxulsmxzqjnyx
+nuiovuspjehxkpv[qsyjmiietfwvqzj]ekuzppxgppqkpve[ozfsqvrxfeumsigv]xdzyqybyucoxdoklj[crnwzfdarswufanfljs]vsbixgjpzbdddcbe
+jmvfqdzgsklcrslovql[gjhklxyugbfvnqz]pzitsmcqszousne[ynlltwcmydmhewn]otvtxsxrrnmwswnje[aegqtdvcxhorjaof]hbekoaqmdlkljjuufj
+qqtgcjcihigaujbt[xqlhtduvqwoxtos]vpuvpxdusalphiafnq[jmwiomadjxspohwrxi]zjymzmygsnzzulziln[vqgdgsqkzgzbzbcsxd]xitnhrochbzbthxnzkr
+jrwchpzsztpxhvph[iqangpgvkiylfxnlvjn]dhnfjcukccyzjmw[gjugzeqyqfofstyg]vhkwihbkrhpnoplbksl
+jxegyldqmsgxgxfbu[laousqjpancokjp]uzcekpbvslycdabm[itwqqjmxywnpmlfhfq]lmzuyvovezbnoscoeog
+tlhzhxqkdcxilhio[dgocupjdlzogjwdxh]azfvreuwrvquptrlf
+llvukyljihylpgiq[rbdleeyvacbovvwrqt]khplkmlyeccipwqwoz[whvvhrzdwiecqbeb]hmkgsugxhfukfzg
+gqxtomykiwexvcyy[gennwfyucypiyhw]djjiwcipnaoakagmlw[mjoyxpjjsrzurtaozkn]xocuerjupzzlmbnshb[erhtdqhgsvjsczmzba]adbruotfkowmvwugbr
+dpxyxexpdkdtrcxr[jnzrmfjuxhkqvaj]vbzavumhudmpvccqsej[whqvbyszqaovrgmstr]ybockttkvclvxwx[nhowunciatmmsjsc]ohqeflsduaoelvu
+boajjbclanzyjge[pcviglbztbaqfvxfe]rnurgxjnrmwciev[psitzaorpbtywmor]duvoistyxrzdovakb
+ixnydttxbafquyvu[vuoyofxakqeocdu]uukrnhkrwvzbpyemn[cqndyeyyplkdvgkhaf]qtchwgkqvcrmsax[crqkwmpcxgvuhcepoe]huheekppokbwogmfw
+ltgsblvagefbohc[jqcolroyboslyuljw]hkdfbyjxzkkhglu
+iduenjlchukmkmkcyiw[hefkxhfefqcxtfgw]zmxzdcvoiaexqfxmy[zzunhvsdkcmwrtomxx]ftpbizjapbhzzpmjo
+yadqdnkbvrzyesp[qfectyenugkfoednlh]hetoqjdjygpjgpdo[coclcclcgbmjuqsolon]pvzoqiwtwwrlhrefxfq[fweutmyirwounikbbe]avwxlrppqyipxzbqsye
+hvzyppakbpizzqtzylj[fglenofdnkakgscsit]dtmyozwhcamapqzhmqq[mzwsceguaunjdqgzy]oqalbiyxztbhzcj
+kidpcgqijppstmrk[bvrxisbchiudttb]pxtcpbmjqnuzdnrrj
+vbbwnaciqnnywtdapbd[nxsuwwtdaezftmimh]hpfbjpprqiqstff[wblblaaxwoxhiui]ookdivqptkooppc[rfykjlavjvqshrc]udqozimcxwxvexdsodg
+ikoiloawdwwukhyog[wldmblycrwkogqdkmd]nonshrrxzgdyitowef
+iwxcdvpwurlwoua[bplgjzqiufihbpkr]vbznjwpmurnncebwqjl[mggntaecbkaivkc]foyyhitpcozlohpye[wmnupcvcxkkjrtwob]fehfpqrzptnjdbrjqm
+kqgccpaxaiawhlxwvao[jwqdyozkwlkjxaxeae]pmzegiqggikntebuqdf
+dinkcecgpjkucufxmmx[kghamrhzvzkmkvzvf]fsijghkzvcnruuch
+gqpmoujcqbjmbkw[wklovtupjtpakkr]bszxogslsmsuvdc[bzamfeevwtkxiaqmq]whvpwuqqpetbmxcxfei
+rzprsbmijwurxdper[stcbtzdffxiikekwkdm]ecsvpslvgzqdkmcmg[dubrkljphbedinwakza]tmuaknuopyvuuvb
+jejqpwjnjgswlpdw[bmlmhbehrgdhrfpn]bgcavfaqrbusgmdol[wcnqvfviopfafsh]qxbdmorlqqhziovvtsd
+gfkacbhzzuupzdciobw[apugufbmkzdcuvyz]rxxvujlycyyauho[jcgviszjgfrqvqddqbe]evzoharbjafyqtvpw
+lkhvmxrbbthjzsqn[vrsinufxgtdplcziyi]udnwpmlftjjyiyr
+bgbpjlqndbevlrx[uuzlxehnzsmjszt]mafmvjrgaehcflm[uysuexeaoyrfqiqoe]eogngphvosbbkbcbx
+biqleovznpnvlgbtgq[rflcogyjfnjnvrz]qjxffnzysxpsxxo
+nghkeaqqxrczcohg[bfqguyypsfcksjhz]ijcgbkcgogmyrih
+ajncuvxcuwllizxkfjl[iggocdpbmhuujlfukl]mpoulqjowqkzeebf
+qqqoxjvsvbiiaytvwu[aiwjzpwlfgalktoy]vbwyiusngxwciune[lkawkiqvzrgksyyz]pjokuzxjurxligex[alhahiygubefaljtv]azmhwehqgrglebxosta
+jtoauqvnncjmeigaamx[kfymrhjevoyhepqnc]ihlwiegxzchevpf[zxjjidnncpzbzaw]ebixvaawkwocytx[qlxbemucbynolblv]bzbjrtnghmcdkscxx
+mbtokokyfqfdhmxwhb[qgazmvdcwebeifi]rsntzgeqyfvjftliwa
+yuwtphemsequwdirfmd[icnjausljalhzphpy]cfzystpixjcmrrs[xywzdfebzgtzelgl]xswnagiklvbjxlfnpq[akxuhgxhpkdwmwigca]vinsbilqirohswgipe
+bqbosglgnqwsfbxddw[emjzxcffmxkqlmn]wfgjtfdvhemhejpmxa[zfxoffptksgmnlbntx]otneelfhzpamjmzwqg
+ushngvjtmvypcadpd[arcpanyyoceyyaee]udvkmybxmgahfle[jbalikfwxmcgtiurjcc]llxqjcpwoboxhaivwdm[crozklzdqjlrrhu]hojkvvqissprjoqwfo
+ofwpbcnnyzbqqvkes[peogfvfpyvbnydj]xvtiykidzuxltuxxp[tojcelfsgwxvwqhg]jpmadadkgfrumezy[monrbqpsppiaaifxz]kylmdiorjlsovny
+hnbxabeskhcgpoaexi[thvxentmengrzgkjuwi]mhxhszvkflnnftd[twqccachbgauoscdol]vvfcqjzsrwjvkwfsw
+bkjhqcswrncpikvpm[shqohewbmungadi]hcrqtimandhfbso
+amfxjvxvdmerqowdnxe[cumwepdamezeecnq]lkezawesphsybimf[lapqafmfsivtmytdoda]vmfmejuxoigyexwwyo
+ezvclrwlggiosvdqxer[kwumjgmaayygippb]zqwtdswaxmydbiihi
+lmandocgeressmfxga[cijznnpfcbsdystlges]fkllytsytcvvcnxl
+enbwhqlzytjctefqwhr[zoqcmvgpsfndvfvy]zlwqhyoulrcveni
+zwucvenctpqzlxeadn[toegrygcfpfkafgxs]axvqswugizubynzsb[luvlrbwplytdwlheaxi]nposqrfedyuugpjnik
+ymdzrqgulicxzfuf[twglxtaryubspobxclc]vucpqrzzyadvoiteqle[xbsxohuegxwudsrfw]axpmobgigohcmagr
+esgnejqywqqsywkg[hryixrmpqepyrovv]gqjccwoanbzljsf[maaujjtokmjpppsgk]qcvrrtrrxwevbvovo[xoymwepaurypzvpth]qmlqfhvovyowpdwz
+qksxeymivlzuscgsl[vjcwfdvybvoiahv]otcgndvvjerofpx
+ryxelxmxsrhtmsqvxff[wxblvfrersnfcyvvpv]rbxocxhparlhcaqexny
+ehvjcabqtmabutiu[ovzwhfvgwqxefpay]nzszulqbxsksloc[rgdlusvaoksgywaexk]xcwytqehromugefg
+svfhxiqruxzcjqlb[dkfccqvvehkwwfjmth]lvkfctbpueegqdfb[miffoptlmgzzses]yochzabyqkmnheasfl
+icdcifhjwhiqzqyu[wgzmgznoewglpcvgow]eujehgisllhkzmmivhq[exesoswhvvsthcso]pjcmtknevqdvmmamejh[ylqwwcuycvpofgqwqf]fyxecpnvxzecnzqew
+fdmskgwxwrznenwsp[qzplbuzhacotyil]plorkkwrjamagmzil[niohlobikfzfyqk]bmxmlxozzwbkrrhnce[xxcczenzizachda]hloxeszindohsfsnqx
+zqsfgmjarzxabud[sqbwrxrtfgydkkwsekm]tovzszloireanluvx[zrdwqaaruhiabxfjow]djnrprliuoenkrxkt[lojfktjsdwdjycamlzd]qlgczlpoxptsjooi
+gjwuximhfklvnyver[urndgjzxbrreido]eowyquwgvnxbsmb[dbigflhjsrccqacr]lhxcuzlmzdopnfluwm
+dnmbsutzllsxouvh[tqykceyhjdfisrswht]ufkpseiwzfjbtpkc
+madjaycornkcpolglq[vvnpkdstjgxcjsf]kvejknagbwlxtxbrbvi
+fufmmdtydxyrclcrqx[nrjdoldmmxxfhncdk]hdbebtjtcvcfqmw[rhfbbtfhhsqiwbtnlrz]kihpdnvnacqqosnhpa[gndixqjiyvfmvrgjrzo]fxwjbxmicjjyvepuzpb
+vyblgyhujolwblvys[zapkgjwxfsivrxdfr]wtqlezngwqoktfhiegh[ecalvtwzjxbqfrcbwvv]tvzxgabmyuvlztgux
+dnqbpkwbdwbfbyoz[mjnprwkicaftsgm]qvtafasppyrbtuqvn[pdlcgrzteozofjkfo]cevpxzfqcrroinmxy
+pdpjqznbmahueoc[ecsdszaxvxzuhamxqq]lyusvisydqemnslw
+phxrfpqtrkqzdtgwetm[muonzqrbiyeetiqxu]rwhbzxkfwcchkpumq
+ltvxqmlcrivtcytk[vcfeszakkcrjslo]tybwtklhhxsvhzxuio[tpcsmftwasalxhe]ivhbtyfxeknudns
+blotcckbcsxnxkbd[ijibgeakkajijumjeiv]svfnhnnkaqfnzpqdox
+zpesktqlipowpsmqubf[vjnynvphcvmazjotxm]bjdrheobrnylbebw
+ftoxxvywsxkptnvz[qcotxazjsqbnflu]xgmfsauvpibkozp[yzpsqrudrnbayikuau]vgtgzdoxpsonwmse
+dqamsxipelobmbtxs[slvyfkooyzbcuxo]dthowqdeedprlmyg
+ltozqbvhvyqclav[noavoyiuiyamvcanqoc]dkragjcbgfqhmujqkvs[pnzefpolsmchtkula]ihwxogvjbctklkk
+vtewmubtnbmusat[rpjmicrcyzajgpzo]khkjajkxflvurcsmd[gumvdiloapvorhmn]somhrdimswsyeeq
+zfrvenflhmjgoesmax[pgqxadyxekpnwwnckin]kqqmdrmcgyweogyfya[wbwicwmfsbthzmrfe]wbstpswtzaitlwbcv[nhialwkwamoawjq]usgyumpojqmvdxhzlat
+kztexifpjlasulbd[gplrmaltusmjvgovnq]yejlzyghxccxtnvihx
+liuvjttbtfsawbpfi[wtezrsztlnzmeaxu]ciolgkqyxkxxvwtblo[dtlfmyfrmfxdcikrb]kmerspmgttnjucijg[wdzyrbvslhkzqocimee]lrrvtrxcydogapi
+bbfeqegoyoyektexr[wceufdsxjpughajipa]lmnlqkrztzbtkwcbxhz
+ypwocnxnpuqetxgb[faqgbonmbihohshmtdo]cpjhlgocldldshzy[uhwgnkdervikvatfpav]semfeosdiynzoomskf[yvczydmxhxcaowkwg]kkwxeutjaronwowi
+rgvuclhfrvlkxiqo[qeywgwrafcswqya]xppwskysvkvseiltg[bykdhqgbgzjhgoungi]invxesxqmtohbmjllh[fuejhljykbpzxdykgj]xwnyayrfadhdwyds
+fbwwaocsouhupdi[efqzvlecvhwinsjeywg]lbjmwdbdjfnmtsaka
+gqvsxigtgoafmvbekhx[sjgsrwdtqwqqylakvbb]kqrtyagzfrqrvlfkumr
+xfuxljcwxkiomhkepi[iaprxlbtpvrvlsig]leqnifsqjfqalkgafib[rfxqsfemmpvfhmrjn]gbqvgdcfcjlcmnxkljn
+veiqbspjrjymoalmtrt[okpsiscbptuumxisiv]yrhuahhkvbigdlko
+uhhwsbsmsbklwewfc[dhnisoxocvomjaay]wouhbmhzfyighaufn[durxoxeyxjhvkwyjfx]novsbfibzjulaxzuesx
+kcfxkxnznogyvymzcbm[mkgpejhpbyziksgv]yvzndwangiuuzwvkv
+orkzkmqdeumjzdda[nsbmhjdjxqfnkkxto]goeaunixhitoaiog[nospihuvybakztioqip]vjzyxpmmezlnaumym[nwxvmqhsprcinifl]uvwjnqwjvuyjjpugj
+mfrhagodpscknas[sbrtzvfrqcxsufv]czqpqctptdlhmytumos[vnyckhoptjkjxuqa]pmooukcidyyvwqtgohu
+resxynlcutzggmtczo[nmmabdsbvwktiykqonp]gmelhvutrvcrgdna[obdmwoxrrlntfejymf]hdxasucdibwwxgot
+mnrhbocsgkfthhvnuke[egdgbouacqxndelu]ajtnqlomsyixsehntrn[mpprufbezhacatf]qeuwsfcjtkpzfbz
+logpvbfpghznuvcgwj[poykcbzvdrpbrlqzlxp]jctrzpridwbvgpvv[nihdkrnanrgbdqaaf]wrzphhqbpznufcxa[gjhuobpheguxqwut]xlxxdfunzjoknpa
+xckjcbxewjcqegrm[bksphbygnxtbklur]bnawweidbrdpfsw[uoyymiftyibdhjc]lpyeqreaxmmjquc
+hnhempuuiakcvgkv[ykdxjfqspjlwdamqd]nlyuylqcjgacgbtaq[swmlxfpggzcagkysuj]syrldafxedcddhhwddz[zgighmpfjmwajrcwihv]atdkrfhvjyqojist
+fkrrirhpatymfnakjpo[sxyemqclncjkjmmfncx]gvewmatlydgleqm[sgdeklgyvflcufvtplq]dundmukthwoddhaxw
+ibhwnndalipgwboov[oetxmvnstllojrpjggr]raawxffqpbwaoafsvfa[voaodafksfxrkimxfac]mrklxyjcdcfbsmpp[ojavtfuwkeogikk]exijoqwqduzdnvpf
+fvjerjfawdvkbzkke[ekoozekkfayzwzjgix]ysjkrywjcqpwoguoh[ykjvlzirmpjxbzpxtz]njyukqukczggofql[jkliiyuolnqdhdbvqae]kpsfxwfkweeexjxlsn
+hocvxscrqarpnhiyizi[edzlzfxffzfmxmssq]gqlnxmmhcmsabueqxaz[mpxvrwpnncxgddguygj]fwhbjqrziztgrkmx
+mdhjmsdwdhyhrqzucp[zuswgksuugzizfo]ekgygmdfansrlvzyt[efhwmzbpzwywckakd]xvwmsbwppzjvwuuqakl[igcjlcbgovpdyssmqc]lcumchflakunifgeg
+mplyixtwewxpmgxnmgi[ngrpejtnvrgwtupvr]kesjeqyleotfmggcea[zzokvnfeweaduwzfhrw]obyjyyqjkucokbu[snbyhfbchhqxknu]fivmakraikkuetpria
+xqgkoczxlgmlffarh[pqiqruxadypdionbepo]fxskihkjyfzlcoomvl
+afohxmbrfvqlacrf[imutjpvzzgvzgcjerck]lerhcxzrzkqlwumny
+yqjwgatgqryemqsp[bwzbdayfxdumyfojft]dfbuzmuzgxmnzqgshfi[pakwsmfbtitkiqvanoq]xuawmajdiicregkpm[kqpfntzvovcmfsxqmnq]ghppydhrurfeiuac
+kfhvgwfuqjsfepj[sncjjxefsdbvjumyo]remoooxfyjmsskyds[jtjwfchkozxniiy]jgfaixubqjcrtvh[npxegekihcqiurb]dvtfybcjyaoushdagr
+fkfbhopbvmmqxthr[kfkibyedkqhtkdu]fntaxfihxuwwpnxe
+sfpdwtxasoodsvwclzn[lroruhvvtivzyzydac]tmwhjsyqjqlpwzv[esrzuwvtzwvnitsuf]efviugvdcoegmashh[gvpwpimfmjnfuncw]fbfppbsyymzfazivsz
+amthppeoesqlfwc[kkasghvolqvbcbdeczz]onknhfpsjzvpvkegny[gxwbzdipdgehnryyj]jodjkpmhcwwszfbggsv[qfutgdlyxkdpbpcc]oadwfqaipddbwssib
+fqibujqjzfiraeobjzl[mtvzbskboukcyjenxrv]qjqwxujlhqrxyzmytd
+cwvxqqouchaqwkhpcfz[elwmjtglbrbyxnyoyyd]nccylfdoyorjbdi
+jcbygfuxandbdexnhc[jyhbtswhegyhooolh]aniljkdxybbdbsm[afokcqicbhltcge]omjynmdbdgknpxhjm[wkgmjtmhnrpamkfncx]skpgvvjpnmhwkcgomcg
+sacklxtvscuxwmhvtw[bahodhuctayhpnt]qicatycoooyspis
+mhexuvtezfzxnevd[drllkjffzfmmukleut]soquupmvgilyzsr
+hmhdovlwwfwcuikdx[qbkapgzxphauqrmjat]jqadlkhlgqfiacaepvm[ahqwowftcseuqezn]yltcacnflbfskajvakx
+dhnspqvpwgsexlwwrsz[xpowmglcpasxvuk]vbahprxinxmsxglxvgd[ukvfffwqirhekvl]pvbdddgneqxoqjp[rmkfpyqmzjpdderhme]svtqppchbmdqvldgyih
+agqlrgzefrrkrmdw[pqxuhlyvhdbcuvd]zyaedppqqpcyonyme
+rsvoaesmgxsttbl[gzleqcjyweilywpb]wuzskljcawklfng[ojzyojtotmukhfnjanu]aosalbogciawswglkw
+yochyqaasxdyfmegyac[okjzywgsmktayhmujpj]xgjqazwjvzhdleuhz
+psmnnwiolxpqymly[fcrevcjztuteryp]nnacfwnqwxbrfqhyuke[kudikhthknlfvqbm]kridanxqomwtelxk
+ppjowileomfhohmpcoa[euqrvizdyhubfilt]rbnwiaxaqveirvoeb[vbsvlpraulqyevyje]azqidrepohooimob[xlcvqhwzwdxluywoqks]mvgewzixvecqcqlmkzg
+ncepobognelfiytdx[ekvxtlhjnamkonm]pizszllzfgumulkys[xgpudqjkjzpilks]xirarekiuvcivtjju[wjflckjkfvvbkgxmp]rpvriqsyglljrskx
+odrrepfcxtyriobvz[kxiwrsavktuyjke]wnwydovrxmmuzehfm
+mfdxppslkzpwvwr[mavnyeavcuoywuv]vspiiafyboscewkcsmq[pyevwvptadphrskuivp]tekdmxlgmnwjgcs[aewugqwpbpvyrmqmyyi]cuedkzylgatqgpdc
+piufuojcfshdstw[udvhfbgmvpxffwr]doagyxjdtibmgoobq[fikftfravgtrtwni]wpuqessshgkrupqe
+elfwnlaowbgexiajkyt[eswlunregcncpmeqoca]kqquvoocucglemrhjc
+uzkfrwhffmydgqqzkl[trvjzqqorsdiimpk]znflqdahqdhvhlaa
+rjcogeolejfldwmoqhz[cloemdcanqiplavw]vpsyimqbgtwcxgyd[kakuadbjenwdiicq]exfcsokofcjmwseo
+qazslzzayvzvtbixrd[nofwkmnhotfyfptto]irajxlrmeszmibhk
+wirtatnszvxmlnkvjvv[btvgpyqdeiidexdeapn]unlvcnygttuetqfg
+bhdesglwqnjvgpovm[joeuqfahjhgmrth]jtzjppcucapkyzcpei[idqjrcxyjlupzjhx]kqljgcmnpjnswef[cszkdkqnmbsrxykt]ykkbwmiclaqwbpon
+zkptfvsmlnzuoryqz[uhbusiqtctqdtfma]ubdrujhmnyvflnvs[yovgsoipmkxmrtw]suwzspemdtfiojr[vsrttosqlvmzwoqmlyq]nnsnkiyhxjecfvkhxf
+gqrxyvtuvcyqvarsuv[dlulhvxsijobenjo]pqglecsfwgnuhelsh[rqouyrnjtlxfowp]nowkcfckezryxxg
+aqmbikwcxxevjbw[zwxktjxquhloozfgizr]ffpzrapawfkrsny[qqekkqexjyoghfnaxrm]uylkkxyxqlrjgbowycw
+ghesvpyxqricmgcmj[hvfcvovijglkxubrfqf]lbknfpyahabpypl[gashwurszsmlhfui]rsyxunohtmwvqfqslr
+ylpuzunivhaylsrfz[kieununfecpxgzhk]pbnqrgyrgymuimsgfa[duxocpauqtfctrpreji]gdtcugdjxbzmffq[hviaibmwbutaiatf]tutsegblquetvfomynh
+mgwtwourfjwmtws[ooawaihqxwinzat]fjallnmkhzbzfsx[rloquuqpzsnagpt]spehwxbmjexygksvt[xljdtevbvhddzwnoaar]auqtaqupgumspzpb
+yfdfpclchklypaljq[bmkgewuljfpwpgrrg]ovkpfmumrmlybqyumux
+wrftrzlpyrptwmj[penvkoodhzmwwzbya]itmeejhjetfomdla[aeilgulmlisvzluc]zkqdzajjhxkhows
+zmgmnslhogyzitpirm[mknytoayplqwltdh]gmgpnzmipdkegoxao
+uebarfghvpmgzhx[iuabicjfokgnybpb]swhnalbokpyqdrmaxd[tjsaihsqayjaywac]ywzuozbyvtsofvkiqj[afjkdhpemqsoivr]grtkptncyinxlfgdjgm
+riqkipsgbptayuab[bcwdvfvzxiaidpiok]xdssawxxjavachfzpf
+ypponvgfxgwquzkyu[vfbaoxpirtcgklminil]bbdxfwwptedctcm
+zwmwdfwutuaoqyq[orzmkmmagojdfhkry]oegdfradzppwqwjm
+fihqtfiaszddkwtozc[ggzvtiwjpuehpfvzev]sksgdqwtghgmavktpu[vovmwdwckbdggsuy]catvlusjdruqlgowf[bawanswujqcoxfzxbpl]sjmisqghvzvlpmvwuf
+bthfaqnohcrtyvcevz[shahnffqoqjxmsaskyl]hjtecdroaharoqqlwme[xoknhnevqdeypythrj]pcsqbcykpskqvofn
+qwrarlbyivqfsodi[ngpyxyllcdqmduhgx]hrqdfjoxtiuyqrcu[evlkctrqtadjostj]mthgbwnsfdkemvjlyb[bobjvmuycmotqja]wugdihgnugrqtcvv
+ylhkvimzlxrkvqinx[umqrxhhwphpigynkl]bzdbjvsmxzsrvotag[sucrmnnwziscfbuldhc]xwqxczdtomfyutk[wxytdduimznbnnelpt]tgsdbftehkvmdetx
+psavwiadlsloigorknn[yqsrbqsbzhogkdynyz]urgruwqpmycyslsj[ofdbbtooimzgubl]lbbisonaxmyudybcwm
+arehddcepyoemixmskt[wopnathzlqxnnoiu]mymgjthqiaunymyes
+pxfwbzbltiadcmh[lrdbtyxqdvcesyntzjf]jranlgsxskjjgfvhea[ytbmxhfejbdgcdtnul]zibykmovsdmyouxpj[fmfkhcfzstqapgjz]wnpjnohtpadnnlu
+nckwcvncimsthnlu[rfyyazzgngkygfm]hlpxvutwpmaggblg[qrexhoxbnoyaszjk]ahenipwwckpoqhpe[hknngnrucfiftgo]yssifrkfyaldeaa
+lrrhukctkbgoukeptxr[bzxzooiqwnebllazdhz]xjlbolmtakxdgnnjdeb[botuufiokrpddif]hbnqkqlyqamdugef
+vlhwjvmrmqjdhrzlrb[sifgbytoqrokxfbvzev]dhdnsqteiomronz[wboyewofjqjmwzq]tqdhhaysrgexceeofe[dnvowqfgopopoqstvhk]npxeihgajbtqnhqg
+cremegzznkdkyxj[mfuzjsratdlqxbgedy]zqrblvedvkrfgazq
+ckqzaquqgfbmjan[qjpbtrzoerbtibp]wcpozsyvrchscndex[mvknznmotgjrfgv]canwkxntkzmszwlov
+iqvyswlmcvrlgrh[cuexdiquljbdyzencz]omngyigmhnwisrohd[uejvjjgmlndhmtxzp]ucrwarxsiqtjmaddb
+ivzrwlxpxgzuuuqmtru[czyxcfcxribjycj]pntvptdzblfosriqk[lojzoiluavlebquqtex]sxfcfejktdlltmx
+tjppxfesnuonvyj[kmevdokeodpvknr]fesmrhpgdyxguvuvyiu
+leftawcmocfkpdmzdt[xmlgielmatgwhdnqzsv]jiwfzhxvzxqhhpizv
+xesonxwclvyetdcr[dvjijcenufeabkxnqyw]ogsuoydbnqoekzznh[dvsecdihbpfgacac]srwcmhiiwxtualx[bpemagylqzyxqoaa]kcuegvlpfzcwaker
+tffukwerhhsbvwnhhk[dgymmmsmogyrmpd]fihstccnovmeipbf
+njvhmuumwzwfzigojn[znpdqbjmfyuziavjv]hdnemtbdvbuxkkpkf[pbcvqwnquhbmugept]wseocpmukxsonkomrsk[nicixvgreikvvrat]fmvqxgrjzuspfyuqou
+hcysmytbwutfeit[lyimkduppuazwyarp]scmqvuzhptpjenj
+pbwoaecjkbbhcuiiv[znfkivdlaohkhmujeay]khezajqvgquousnjab
+ujzussbupuiluxxsluu[afziojarfxhlounm]rkeysyrwsheuxaj
+bobowsdmpdtlzzyjk[vhcmcwztdinxrzzqim]ooazeqoxyqipupm[kzbaizssrlwawrh]rwzglobtwokunia[aijrdsjpseqcsxds]otpxblmqfrdojgwndi
+ejxvdwerghueasxes[dfbujbubdntkmli]fruzltpmrrlxjtlnvt[humnridbnputqpu]dsembdskqhnrtzesh[bzeltfmllnaegsmi]pgldmpkdpimgxjcge
+cfommkiravpmqflvfg[mxrtecpvyrjkazvxuse]uqhkabaiqrafotd[tbyvblbmumrwdwovg]nfgbczychazchst[wfuotesxrieykalsd]uohrkgematczlrityxj
+qztosgsqradmgybxrga[hlejicgvaqzhkfbhbb]cgsgwzckhygbszdvi[njpxihtzdyryavflj]icnxdwnruwwyzsk
+uxyvrlyggnaviay[qwthehqgvglktqhqu]ksgnoxqxgkjmwuethng[sbbsvqnisduagslb]cuaobhmvuaqvvvnqfe
+erymnlrruxlqjcmkn[mevvbnpbexblndj]gfgvnksluyipaykfde
+dxscmhdmjkdhtudsqvi[gvrtwolegaemtia]opywqbkjbfndypc[oekozzbeqwfiflasv]yfgsbitixwbjtoi
+ysxudmuqzgoloqnykt[fcgtxmhrrcecqmddrj]qtrozsbcpficfquvkpj[cgqpatemexjkefdbe]ohnpfhftbocgsxzpumr[eiqhsgwotemjlnnqefk]gfaoeohysayszml
+cevcyseikybcbnmn[jpmyfkdmnmrhyakru]dxlrbhtjtuihtsdde[wvcrjtitpvlnyppnc]lcnpitcbcmfxhkrrjew
+qdaeiqosdnatmbdxwj[atfzmwbrygimubjbi]eqmwenccfvvdyyhd[yaumggrlwxuimpbjhj]opojnvgqlddssgz
+fiilqdyckyxglumal[mcmerdidyzyvolqlsu]tybpakjvysehukdzfs[hkquimszsyiivblq]ifkovlrqhlnvdcmctpw[bbfmqiuidwwtvxcyxsh]rxbulmjkszwcujvoxx
+ejnjgazbggstrokfiqn[hwchebnufwvztstxxk]knrowqqjlpkeaogreh[ispqgesjsangcoygvpi]limwwxptqsggumpkav[affknwmlnzrbabg]tupfguyoxwpoiatebzu
+qiapnmpiekmqwaxk[vfasdzfzabwydicao]togthxpkeucrpjuzq
+bqzmyqagrliazan[exfepmvuswdztkgzk]oitrytelbuvpmfix[fzcpqdblgkioqnm]xtzynyytsasaiajhtpt
+opicwmmyrisxmoj[owhsmoigdsolqmjd]pmgsqqwwjqvqobueh[zfcjdlleobetagnzt]mwckfcohdalqzeodptb
+ejzvbutzumjnzzfgnoe[ixayktiqmcngbks]jrfufjnbcocgaufucy[ryglzpvuwtgohxtw]fszrmyqiiikxktye[vnvfudzvmseqhzlfq]syipqltfrymgbgmqxyi
+fguhalhxpswuhwjmn[anqihfnbgmkkttimvl]hvkgwincfxssrnnzn[dmpiagbxeztyycsr]ufwamkmhsqvabiddztf
+urstysgnriccvbkiwp[yffbbcipbgnlhnx]voloohtrdgtmuosuj[sjkbdbvpbcnleib]nucopgkgenowcccvgqx[rjopvaiewdvgmumr]yxzxryntexnuhgrvdes
+yjkmxwouqlmohkv[mjogakueojtohoo]qobrjdolakkvxjbxb[qnerargpebiqxhkqawg]vhklgbktomjutbtm[islelkygphlpagjqij]xbtwafadjphpzhz
+pczqpuroxpifexe[uqcqtneiektkmrb]nyoakxnlgrxobwlduux[dhhfoxkqvnvcchsct]cqcouyerjxmkbkjccg[idyikrwqdreiyhsxdcj]xlzoyafazrrbdwljnd
+mpmjnhjgnmnqwowd[lfanwgamnmdxwiqe]npfvhehcxtlgcrzid[chzvtakthbbfgaamref]oaxeaktsxndsanlhxze
+pvfcksodcgsmjiqwszc[lpixtwnyrpkjsmui]bvjpqhqzesvyyjlogw
+ifzbfcvdoxkdzhrq[bxzpnkgzmjoocojqi]sihxbegqwropinnqu[uuemfqzpcjaegexhz]arbzkkywynrjjis[fhjxmtljhjhcexhjh]lectilzbsefciuxmj
+epgzlimhfeamgbakeje[movhrjjqpkxnjzmn]ujjejiojoiqyiyuvb
+kgyplkvxedlrivba[rrvhbjuukauesywzgi]sefglvbqrbfpwjpbndf[lxpmdnklhlnpooeq]cseosnrqjchpeicy
+hzxrpcnfcuvytvptmlr[xkqdzxmqajoisgy]itvqxuzohywmwuvlrm[unurstpskieknsp]xfxutqlwgxbkszbp
+nzyehlmbirflrigh[xkcxkxpmbzzlwnzbj]vtiuialppefxqhcuc
+ihggeghdsdhixvlbmr[csjfaddciewuprmr]kkfiuczfhmrmgolb
+ztiyoyrgufqxkfk[hsftvmvfjwplrbxum]xdeuxodxrcfwsvr[ifkfgxpuoehydemf]rqcnabfgqyrbtoxkp
+ygpwvcpcshyjslrm[ccytynfblnccxbstzuh]gjpwxmciaenmcizexf[bldgazexvgyaovzywi]wtynmfiznxylzzhsgwz[qaxcfaazazxsaozyks]odryojvivbgnachz
+xhlfqbqoatmvrfpe[wrfmrapwuzhqmqmzmy]wkmqmtbyshkyfwzo[zcifoyozwurqexe]pysjwmlknukydpnrzan
+elexrwwnwmearzxuzi[ajkpdbxrtpnwngx]raybcmpouawjfqlujp
+bdjnunqhhwlpeumihz[ytxkjsuighhjzfu]qeqjvpmmzpsfnus
+vupxgfyaxnciedexmom[fvqffpkeurmvxvopmx]dzlsrwjfphehbkyum
+ckzmymusejzabvuyb[wxbswbalirmbjumhxnb]hovexlwnzdbytmp[ulxyngaxvhwhcjlt]xfgofykhgqxxqbogmn
+xlgtwmtszopnrfpg[zcjobnutrnmuslxya]ouxjiahawxovbbhahcp
+bbezpvhanriufkcof[lspgjssrxkwcdyx]snwkrsinhjurvhicn[wyimmtkjbnxudgxx]fvhiaurorkxhogbown
+owjicopdgvoloyswyiv[wqqpvlolkvkeyljrxd]dtnqlobojrurxvhmoig[cwiehwzvrmhtqyfmlvo]ztvfpgydalzyzky
+akkrhttulhpzlyulceg[sosggqltgzfydzpco]tgefhbejbxfsxejsbgb
+rhaynhcvrkoikpbamh[tbgjdaikneziopop]czthnlotpopwgdvcl
+wscoyqvflhwskcjdf[mwpcrduwevtcjduw]uybsbwdhtlnwhvw[nukfdjraoqoaxyeuix]darwzmggglgaesyg[ryapeobwugpoohzy]ozudeagtfhlksnnrw
+nrkiszjbkgclvxgwfs[bclhxtwvelakriyxwv]daaunctownhuodswuc
+rqsftpfsggukeqa[czvrpfljtsdpbgzoqit]omksopmvqgdyhfvfiuc[ineryoovupytgix]ywfytjoppwkszftm
+sjtoqcuwwnmnklb[pmzwkeqnsgnhthww]zkootlimihbctpalhcc
+boewgrjfdxkepnlxo[jgcxotrswrdequngh]iwikkhflekspxykgiv[nelzixyahwsrtusfi]ictmunxrofoeccjtd[qeqijxvqhglwamdjcvc]mldxwzgrycapaexur
+gwswqgnbmgrekfoqgq[gvdnmnkwqfutvfaa]ivqlohrmbqsoineq[jjgcegcdnjzuigbjze]gyhjcoqoqxqwxouc[xgseyypojrsnohnrica]umzfkjzjdsvsodl
+zxamezowxmpjvvwz[cbdeavssccpvrznloem]ibjdhheoubjrhqu[nxvnyftysyuggqwr]mjbtcxyosolkeaahft
+rfwgmpzvpchijrhqfj[xjdrxfgheiyijhc]rbcfdtctoouponvr
+nqrslruljwsphkvf[dvlnrokayixcmgf]rsfivpietxptzwl
+yeqmixesucwapviz[mppclaadstzosfpay]ycztjinsvvywrevju[pigptwaieiahxpzcas]odlsffjpdacydqapjgm[zetjlzxbchwdopgd]lndltscdjxyfgxihbrc
+flsctoizaxydslw[grxlmkgckzdfxag]xarpwhhahlpvccry[vienektyecnyvagq]aavbdkiqjofyekil[rkaxahbatmfpimqj]qgkpebxjhwkpodufo
+ucckvtbprcmdjvmf[eeqvgsvkvyzhjluexx]gplguxddsudjqlmrdr[xlnqtzhxcbpbdqp]uuqkodbvgxekmeoa
+ophlkphyoqamwbu[nbsurlakpxxgyrf]xerxknhcyewzddcle[ydzhegufxmghoneeq]fwybaueovkjhkphx
+geawkbpklybiwrncbky[hftcemyhbxsjjdfur]vqnbxghowdbsesops
+vcdhlrxvycnvsizqop[fprxccobdsrfwhy]wdbvkhaosqznbtt[dmzbzdelxmitmje]whoekteomhigpjkwruu
+iqzznislctfbjfwqsy[tynnrwpeemglajphxg]gfzmrhextughasosati[qsejecgbbetmnzzydyq]ddiskcrtxfguwkly[xpkmunwhccmwkjapp]cdnlcbhhxuplehasn
+bmfhrhdtmvimxlmesez[lqmxqpdlqghxlevd]neolsesusvaxzdvx[irnrgqbigwlnzsuk]hrhxoxubvzkipgqfc[cjcvorvhyrvmfll]npkmtfxysboydkden
+nbmqatjicimprrcici[tbblcdhcvcupgvxibxz]ccslwipzsuyihkng[sbgzshzorysqctaaacq]dyssqkfywggiaaqu
+pcvyyabqmeryplh[jbqynrzyjkhwwgj]etwzjlszjzdbkkewtv
+bubxbqqbnbouodcgxzw[dowpsrdjpuuouuh]rhnrizcztkilhuuwhbh
+sbqkzpwosgujeovz[japgfjauipufpmlvn]ivnwbyatyuesvvrov
+joeqayhdcwcrvbnf[vqfpuvxduqotkdy]kuavekugumzajaxfw[scyzqisremjpsdcmuo]bjpynpdzyzrbmmg
+gwdqyqclwdfzpquzc[ozbvuwsgkcexhgsy]kdwdrqopthygiwdwm
+tvlczfnrbnpmoyp[wcnstymqrvfoqqosw]sjmunjohxbrybmnm[bnzbnogdxaffnvpjowf]waiaapexfkufpazqn[hodebokzgpbbtdewpb]qzbomhrouunriuxanta
+xcvjzwaytzttyobv[bzpagodqlpmmsgy]xpdfkpgsmkgpvkxumlu[chfejuaglsrkruoa]nagzgkrkpyxvjvlr
+bnrxwwtsvorohyu[pupbgwrkyqhkbgho]tffqsororwpcdlaphc
+riryuebgtvdzxdla[jtcopgrqurtfigfnrq]ovetktdsbrjpvgfg[xtsbnkxsdznzlwx]ftmymefonptpdbzsge[xjqgxcqpkqtvbmul]ztizzeufautgupcqelt
+bmlmvylfslqqicwviq[nvxmszbqlexbcef]rqkawnbpuelvwki[bwapsyibuhuopujwmm]yoojkyaudzhoddrmvg
+pjdpdxvrbbxxfwpeust[wztobueipqiaaicduq]onogsdcpainijdpz[basykjybxwuwjvxytb]mfxuzylepdplppj
+noixgkmkngsjnwwhm[lgcpbkrpmkxxeidim]augzuhmkhdatdrhnr
+xncybroqvekbvocdhm[ahxhavcyzvvnwwnfsf]eegitlwvzoqznxuktn[zjwkrbrjofgvedjuf]ujupljhpjfhtoddgqp[jwqpvwwjoaxbwkfj]strlqdkexjcnxwahdxz
+ucyrdkrbgaamnaoez[cnumtrblnknjveyjgwv]vrlouyjivhweembem[izybbytphodmvvonvz]iqnendwvqwwpbwpstuq[jilkvguqvtgjpetbkma]kgttxqsamveamxb
+ighlrtyekigrpbcx[uospnwlmvlhuujiro]jyrbqcrxoklegsmpeub[ferotpqcwlrfylet]vocevqkkydwdxzqavfq
+vreeihsrnbdaduky[uidmukwdoghwycpxzl]hvapmkokuoljwyxi
+zywvzrdkcvqbmwsbkuo[hipsuufkkjiunlqu]uhisdpbjcvkpunlayhr[iethrnmpmidjjrnnv]qnwoxpmbpmpnilkbq
+ussacrkglqvwqawhxvo[uqdvxdgtawrfdjc]cduwaedcvfpeolqr[nlyblneokgmpfelr]yerzpiiwkwuiwilt[hgekbtoncoseaug]kmdjmalprlowtbrav
+owhtgwpvffgjcletp[adgnkwibobvkgfkxale]jgqziknoasxylvw[mocmthhqcjfwjuuiuu]qlgqtnaljwdiejweksm
+vxmbqzeafbwvozvsm[jtyqkvagfwyfvuvay]ailxefllrxesazxlv[odmoxgdiadiaetdyvdt]tiavxclhxfqtbvbu
+jnfimlvvjtvtzajw[acyjznnyspczqvjf]ozltqkyrqtfrgpva
+lrqapqafjqfroqz[zenrntyrnrjtuij]kaewwkrjpcmeylerv[camcigwjgpyeaqg]wpkzihyjlcquzrg[ttfagxotubvfeiqkg]amqnhawihumfajhvd
+lvxcwtjjgsxodivad[gfigqaiqkxfcpmj]yaqjmrkuidrdwvviohz
+qbceftsjjcumflk[uucxifoxdpecfndprsf]gqthbmmgbbakgrlsm
+fsxulvnzmjywovnhat[bthhpzjyawpycgsuxbt]qbqbpjefdcfsfsqbe[uizjjjshwqgccitr]kiehvhvpwhfsasftyu
+bkojzixxqjfcftla[glqknzmobetfwsnafev]ratttzyklaxfmfufyv[muwgybxllocskzecx]wyfwhiljpcfcwbhjlt
+fcuieutbdlmwmpprjk[nkpbsvtngzrdxgwf]qmnuuepgdlzkolbcm[rjezaqbmfjycxai]paejktmptuiftsl[cbgxlqzqpflvskdmvy]aygzfhlhsqdcquut
+rxmngytsppvfcpcscx[phvvbrmqmyequosdztu]vchpgerlpizjwcwkumf[lbjjftbncxuvwdaud]rxfbttgxfwxudhkk[jjzqmfcswwkxsmsluwg]nnjbbkpqankgskjrad
+hlbdbzhwzlnpzurrg[rymtuuyqupqdpexefk]tukjhqaedzhzxsqz
+fpryuguzmsoizmyp[xtootqplumygzizsqye]abwsvuvxyxwwasvuc
+mtabpldrsqsirtega[hgbyvgmmoxihgzulnl]txvozvllasypksvhwhz[poeqvukgvlnbbbbk]lamyuvjvubyqvijesgr[ascxlaksbqqnrrqejx]guetmwzxqjlxjvdm
+duxjzazmbyqzxmntnn[mjguwpucpwblyypmkj]csgnjihsjwrwjjj
+pushontjgkevnlrkvn[dcibcdsbuftswnqifr]nneewpdmoaahwpt
+okcmoevreebuujjdl[nzonouoydhqlmxbyb]kzleqfmoglkipweur[rrtypikbmtkzegy]cmehcxntlavmojfw[tvvcithufoahlxby]odnzrzscwjvxtcpdh
+cxszxofnlpxzzurgqxd[islclvtnwrvxiqvybzp]agikgpscjwfvjrp[xfyvjgtigxamybfcxb]juslmurkvwlapendag
+zeoxbnfdtlgkqzsig[cyrzkztphbnutuie]otzkrrqohznqwhx
+yrsqyknrqcdvbdfcvie[uoikxvuzzihiihn]tdrrmpyisukewgxtz[pcdyynkvijsjpzelypx]axztekjsveddcukyu
+bvublvqfqtrxxxtj[vyyxbnmmsmwhmvwywz]zqnifammxhjjcdczxt
+iuhhzaiwcucvrrpcqi[cmqxwhpbiozhcjiew]thvzbxjvisbolbddky[tomeprddcnfanklkqq]fralaioewzbgbxxyad[zjgnnnznwqccfjyichm]rptkbqzdwmvjwarnuwr
+tfeyzjqxrymktfvj[rmtbxgyrpznwmdvxbdf]mlxqqrocxuzklptmiwc[qdjbddpsonpejdxmpoi]pusiuffhdzpemzd
+yclhxrtfzcdhrtm[hcoqrqbulbeziclq]xdlugofehqtqjonj[wcssoobwocoyxvdwq]lypemphdykevdonct[fuaunzhmdchbahgq]qfkfdkmmaxkewddwpmj
+lnlskpioicgxmxel[umysskqmyzaxfjeh]cpqruxvbujqkmdhnuev[rqwsypedhnfkfqebtr]cyvrdyivrmvznpcc
+shbqidoghlpjpxj[vmwwenaxupuvvptfp]yvjsbdunidbbkjnwpm[gwfgkpizyrvwzhaualv]tevcvdkhzjvniuut[sgmjeiemomrljvnlxu]cypgquavpduminrxlzb
+uropacyqybozvyr[eqrnjuuhlopqyqh]rvznyebhzjhjxkuels[iepxmgnogtcfiwcfx]gxszowxzwkrdjvohtk[uegnjpnkrqqmnnmxjjm]lvxhojwlawuzsszq
+cpeabckktwlhmnhj[tprdlautoabcpkronhu]jvmhenjwvhauljuid
+pthfhbxzjbvghynkmm[vpzaeaijtgtixhitqim]fsaypthcfkzrxtnwr[xzkggwpgnxnfgnvawq]uvjmfmxdcdrkanecd
+rxjlrkaudbmetnyrrin[jrjjzactumkuwruckg]vwzkipklzcprfquld[dfjpumtbhydndawlbp]cxwuyyzmhkhmyoaziwv
+bumtfjdmmowvduukwaw[ukzkunqpgzgahea]kgmtyvromleqoow[jcszbzaxnyacfyc]fcrzscgevcehniswrxt[mpuxkyphidwhukm]vwskwkgmcrmijtujpba
+qkupefsfxnqknoxrk[lvnnuhetjviiioxtp]pjtucqwmybjxnqoviyq[ylzusbponqrkwxll]kovqwsqvwscflkrcwn[zgefedeguzltsmlopj]navdwikahjyvimsnukl
+grckowghnjntaxdp[dnelxhpxwzyeggptoa]coenxbdzrpydaqwa
+lksmpxtjhpanwbuufn[snfzvkkfhiyibfgmtox]rpbqpzxkiwpxnsrie[datbzytabaylvvhek]uqvxzkzegrrxfcxinw[tmpqywtelhqohkmzuvi]fkwbbzvyzzkohjgz
+zyzsrrzsfdlvntmed[utfrddkienuaqcvz]amncxndkvsufgxsu[vpyegmaxvugmdehma]kmeyojxpoluetkqeky[fezcwvaxbuyqttz]mwaklylrcpgnxuw
+lkdzsmlnhsfwkmgftm[bpesperctavrfcn]wgzsbkjyyrbcjzghvlo[gixpfkuukvaoecc]zrvymealuxycdlse[cnmjogkfmapiwvkbk]vcgzczxskqenrst
+mpeadvyrbgymqhl[razwybnbnxlpdqdtp]imkqmksortpqdqmka[ykbtopscgbsursrwj]evdetgtlaoimeqemyq
+qoxokykipszydrgci[mykmfccqtwdxixqiig]iadoxhgcoxnhhliqvr[ttvqbebxyxnwndtz]aasvecaltuqijjmxx[lzovzwzsnwkglorhe]urcmgffjdzouaac
+gywgdpzjikpouyzhhx[fznqxhtzozbzijwjvk]ivvlsbwjwxhymwpmdsw[fehugmercmvunun]tltuczprzfvplhqcpi
+tgljlexexeebootoyce[pnrvcajzvoefxboyncd]snsnpsjxiyrdmgt
+buinlwzbaqgpuoot[pjdralopgcrobfpyl]tttsbhburbjfbtegc[zwdoqaxyubvarmisox]emdozhtvjfcmranqm[kcygeikmvgptspj]pezznfpmodndwvm
+xidbntshgqdckieib[urwkpgpqlzuroemjp]srfwixbhqgbnfpsgkpl[uygjtjaixctjtnanuf]qdloyaplyovscng
+qundlfpfexfkrmpcd[vukdaxqgqvrcqerbf]dehpfpgaymhudzz[vkqfgcllumlbuszz]eizntkyxsysnlfy[sdvnheddugqdagh]yicuzmoifivylgwmipz
+zzgzmnbevlvdlpv[bhoezbdqoelbzmft]bnfeqbplxfvydhluug[kjwpseyayhovkds]aqirzcbxtxginpmjn
+xwkvxxptyfibxunjdv[eigrywezdgwtwfzli]fbfurspemrezjyuhsqf
+yvnhkuzvtnirdxmxmd[vijtjbffcfxtnmxdh]untbfzmjmhmlfeyixu[edlyghinlksfxoikq]ixrupxdicymsuvkhvk[srnptcdcaczhrvqjq]wrqrzomktabfuupccbc
+ipwwgkvjagdlqkoxlat[widqrotdnywnnbdn]rtviotwkbdqpggscdt[jzbcukafvquuxiu]ctmziuyofwucvdvjom
+advbztpxdzdhyncuzz[ivjohzdjgqefgcr]nlqmqaenjzacgyaf
+knotcnkidizcpveacjg[vajecumyblgcfpy]biedjbtbahcygvsdax[odhgbqawgonxvlu]emxplzktdwcitdioi[wcmtnnqctaowoxwgjn]dgcgmhvajmoouri
+uumyvgqczjaadkspfu[cmacsgwkvcivtsn]cpefaqmflxkfmlkp[mfsvltdmnyzxqcrlxk]ykmjlnxxmsvfuqf[bciddbscmtyduhrwvy]cxwohnzlgzbtflqerlr
+klioqytpqhkxqiriz[rjgrssxpxozhzbc]fysfmaiblgqhkeue[bycqedeolknahiy]pdusnyfxfcgodvj
+sgjjqocmmcccpem[odeofpebaahroicm]pluzqzwkdzcovxic[zmyulzpuuiabvykn]ylxzlyooxnlibiy
+btrucplpxrokmcts[gytdxlzkfakenliallw]qhxznozsjsvhvnzhf
+nefefqadkmytguyp[ucqagcoyxinbrvbw]neksoxgtnnfojobtx[bxhdwvwfhybtbzkijj]poayieifsaocrboesfe[tnggfefcucifowqp]olmjwaqlaiwkkbtruw
+tivudfusgnewzshs[mausfjbgxmyibin]yponuityptavbhekrlg[qeyafuevtlqemtfa]owtdxadrwwbxbrkl[obfcyxbifipwhduubu]mjocivgvrcbrllso
+"
+import : ice-9 rdelim .
+define lines : string-split input #\newline .
+define line : car lines .
+
+define : extract-hypernet line
+ let extractor
+ : l line
+ hypers '()
+ inhyper #f
+ if : = 0 : string-length l
+ . hypers
+ cond
+ : and (equal? (string-take l 1) "[") (not inhyper)
+ extractor (string-drop l 1) (cons "" hypers) (not inhyper)
+ : and (equal? (string-take l 1) "]") inhyper
+ extractor (string-drop l 1) hypers (not inhyper)
+ : not inhyper
+ extractor (string-drop l 1) hypers inhyper
+ else
+ extractor (string-drop l 1) (cons (string-append (car hypers) (string-take l 1)) (cdr hypers)) inhyper
+
+
+define : has-abba? string
+ if {(string-length string) < 4}
+ . #f
+ let abba?
+ : first : string-take string 1
+ second : string-take (string-drop string 1) 1
+ third : string-take (string-drop string 2) 1
+ fourth : string-take (string-drop string 3) 1
+ s : string-drop string 1
+ cond
+ : and (equal? first fourth) (equal? second third) (not (equal? first second))
+ . #t
+ {(string-length s) < 4}
+ . #f
+ else
+ abba? (string-take s 1) (string-take (string-drop s 1) 1) (string-take (string-drop s 2) 1) (string-take (string-drop s 3) 1)
+ string-drop s 1 .
+
+
+define : extract-supernet line
+ let extractor
+ : l line
+ hypers '("")
+ inhyper #f
+ if : = 0 : string-length l
+ . hypers
+ cond
+ : and (equal? (string-take l 1) "[") (not inhyper)
+ extractor (string-drop l 1) hypers (not inhyper)
+ : and (equal? (string-take l 1) "]") inhyper
+ extractor (string-drop l 1) (cons "" hypers) (not inhyper)
+ inhyper
+ extractor (string-drop l 1) hypers inhyper
+ else
+ extractor (string-drop l 1) (cons (string-append (car hypers) (string-take l 1)) (cdr hypers)) inhyper
+
+
+
+define : count-transport-layer-snooping lines
+ let snooper
+ : l lines
+ count 0
+ if : null? l
+ . count
+ if : and (member #t (map has-abba? (extract-supernet (car l)))) (not (member #t (map has-abba? (extract-hypernet (car l)))))
+ snooper (cdr l) (+ 1 count)
+ snooper (cdr l) count .
+
+
+display : count-transport-layer-snooping lines .
+newline
+
+
+define : extract-abas string
+ if {(string-length string) < 3}
+ . #f
+ let aba
+ : abas '()
+ first : string-take string 1
+ second : string-take (string-drop string 1) 1
+ third : string-take (string-drop string 2) 1
+ s : string-drop string 1
+ cond
+ : and {(string-length s) < 3} : equal? first third
+ cons (string-append first second third) abas
+ {(string-length s) < 3}
+ . abas
+ : equal? first third
+ aba (cons (string-append first second third) abas) (string-take s 1) (string-take (string-drop s 1) 1) (string-take (string-drop s 2) 1) (string-drop s 1)
+ else
+ aba abas (string-take s 1) (string-take (string-drop s 1) 1) (string-take (string-drop s 2) 1) (string-drop s 1) .
+
+
+define : supports-super-secret-listening line
+ let ssl
+ : hypers : extract-hypernet line
+ abas : apply append : map extract-abas : extract-supernet line
+ if : null? hypers
+ . #f
+ if : member #t : map (λ (aba) (not (equal? #f (string-contains (car hypers) (string-append (string-take (string-drop aba 1) 1) (string-take aba 1) (string-take (string-drop aba 1) 1)))))) abas
+ . #t
+ ssl (cdr hypers) abas .
+
+
+import : srfi srfi-1
+display : length : remove (λ (x) (equal? #f x)) : map supports-super-secret-listening lines .
+newline
diff --git a/examples/argparse.w b/examples/argparse.w
new file mode 100755
--- /dev/null
+++ b/examples/argparse.w
@@ -0,0 +1,42 @@
+#!/usr/bin/env sh
+# -*- wisp -*-
+guile -L $(dirname $(dirname $(realpath "$0"))) -c '(import (wisp-scheme) (language wisp spec))'
+exec guile -L $(dirname $(dirname $(realpath "$0"))) --language=wisp -e '(@@ (examples argparse) main)' -s "$0" "$@"
+; !#
+
+;; Argument parser
+;;
+;; Status: draft (basic interface works, but does not do something useful yet)
+;;
+;; plan:
+;; - simplest usage: (import (examples argparse))(let ((args (parse-args))) (write args))
+;; - with setup: (import (examples argparse))
+;; (let* ((parser (setup-args #:help "foo"))
+;; (args (parse-args #:parser parser)))
+;; (write args))
+;; - implement -h | --help | --usage and -V | --version, set up automatically and improved via setup-args.
+
+define-module : examples argparse
+ . #:export : args-parse args-setup
+
+import : ice-9 optargs
+
+define* : args-parse #:optional args #:key parser
+ if : equal? #f args
+ command-line
+ . args
+
+define* : args-setup #:key (help #f)
+ . #f
+
+define : main args
+ let : : args : args-parse args
+ write args
+ let*
+ : parser : args-setup #:help "argparse"
+ args : args-parse #:parser parser
+ write args
+ let*
+ : parser : args-setup #:help "argparse"
+ args : args-parse args #:parser parser
+ write args
diff --git a/examples/benchmark.w b/examples/benchmark.w
new file mode 100755
--- /dev/null
+++ b/examples/benchmark.w
@@ -0,0 +1,665 @@
+#!/usr/bin/env sh
+# -*- wisp -*-
+exec guile -L $(dirname $(dirname $(realpath "$0"))) --language=wisp -e '(@@ (examples benchmark) main)' -l $(dirname $(realpath "$0"))/cholesky.w -l $(dirname $(realpath "$0"))/ensemble-estimation.w -s "$0" "$@"
+; !#
+
+define-module : examples benchmark
+
+import : statprof
+ ice-9 optargs
+ ice-9 format
+ srfi srfi-1
+ srfi srfi-42 ; list-ec
+ srfi srfi-43 ; vector-append
+ ice-9 pretty-print
+ system vm program
+
+
+
+;; stddev from rosetta code: http://rosettacode.org/wiki/Standard_deviation#Scheme
+define : stddev nums
+ sqrt
+ -
+ / : apply + : map (lambda (i) (* i i)) nums
+ length nums
+ expt (/ (apply + nums) (length nums)) 2
+
+
+define : stddev-unbiased-normal nums
+ . "Approximated unbiased standard deviation for the normal distribution
+
+ 'for n = 3 the bias is equal to 1.3%, and for n = 9 the bias is already less than 0.1%.'
+ - https://en.wikipedia.org/wiki/Standard_deviation#Unbiased_sample_standard_deviation
+ "
+ sqrt
+ -
+ / : apply + : map (lambda (i) (* i i)) nums
+ - (length nums) 1.5
+ expt (/ (apply + nums) (length nums)) 2
+
+
+define : running-stddev nums
+ define : running-stddev-2 num
+ set! nums : cons num nums
+ stddev nums
+ . running-stddev-2
+
+define* : benchmark-run-single fun #:key (min-seconds 0.1)
+ ;; trigger garbage collection before stats collection to avoid polluting the data
+ gc
+ let profiler : (loop-num 4)
+ let : : t : get-internal-real-time
+ with-output-to-string
+ lambda ()
+ let lp : (i loop-num)
+ : λ () : fun
+ when (> i 0)
+ lp (- i 1)
+ let*
+ : dt : - (get-internal-real-time) t
+ seconds : / (exact->inexact dt) internal-time-units-per-second
+ ;; pretty-print : list dt seconds loop-num
+ if {seconds > min-seconds}
+ / seconds loop-num ;; this wastes less than {(4 * ((4^(i-1)) - 1)) / 4^i} fractional data but gains big in simplicity
+ profiler (* 4 loop-num) ;; for fast functions I need to go up rapidly, for slow ones I need to avoid overshooting
+
+;; Define targets for the data aquisition
+define max-relative-uncertainty 0.3 ;; 3 sigma from 0
+define max-absolute-uncertainty-seconds 1.e-3 ;; 1ms, required to ensure that the model uses the higher values (else they would have huge uncertainties). If you find you need more, use a smaller test case.
+define min-aggregated-runtime-seconds 1.e-5 ;; 10μs ~ 30k cycles
+define max-iterations 128 ;; at most 128 samples, currently corresponding to at least 1ms each, so a benchmark of a fast function should take at most 0.1 seconds.
+
+define* : benchmark-run fun
+ ;; pretty-print fun
+ let lp : (min-seconds min-aggregated-runtime-seconds) (sampling-steps 8) ;; start with at least 3 sampling steps to make the approximations in stddev-unbiased-normal good enough
+ let*
+ : res : list-ec (: i sampling-steps) : benchmark-run-single fun #:min-seconds min-seconds
+ std : stddev-unbiased-normal res
+ mean : / (apply + res) sampling-steps
+ ;; pretty-print : list mean '± std min-seconds sampling-steps
+ if : or {sampling-steps > max-iterations} : and {std < {mean * max-relative-uncertainty}} {std < max-absolute-uncertainty-seconds}
+ . mean
+ lp (* 2 min-seconds) (* 2 sampling-steps) ;; should decrease σ by factor 2 or √2 (for slow functions)
+
+define loopcost
+ benchmark-run (λ() #f)
+
+
+;; TODO: Simplify #:key setup -> . setup
+define* : benchmark-fun fun #:key setup
+ when setup
+ setup
+ - : benchmark-run fun
+ . loopcost
+
+define-syntax benchmark
+ ;; one single benchmark
+ lambda : x
+ syntax-case x (:let :setup)
+ : _ thunk :setup setup-thunk :let let-thunk args ...
+ #' benchmark thunk :let let-thunk :setup setup-thunk args ...
+ : _ thunk :let let-thunk :setup setup-thunk args ...
+ #' benchmark thunk :let let-thunk #:setup (lambda () setup-thunk) args ...
+ : _ thunk :setup setup-thunk args ...
+ #' benchmark thunk #:setup (lambda () setup-thunk) args ...
+ : _ thunk :let let-thunk args ...
+ #' let let-thunk
+ benchmark thunk args ...
+ : _ thunk args ...
+ #' benchmark-fun
+ . (lambda () thunk) args ...
+
+define : logiota steps start stepsize
+ . "Create numbers evenly spread in log space"
+ let*
+ : logstart : log (+ start 1)
+ logstep : / (- (log (+ start (* stepsize (- steps 1)))) logstart) (- steps 1)
+ map inexact->exact : map round : map exp : iota steps logstart logstep
+
+
+;; interesting functions to benchmark:
+;; - TODO: add to set/alist/hashmap
+;; - TODO: retrieve from alist/hashmap
+;; - TODO: sort
+;; - ... see https://wiki.python.org/moin/TimeComplexity
+
+;; operation benchmarks
+;; - TODO: or #f #t
+;; - TODO: and #t #f
+;; - TODO: math
+
+;; List benchmarks:
+;; - list-copy (py-copy)
+;; - cons (py-push / py-append)
+;; - car (py-pop)
+;; - list-ref (py-get-item)
+;; - list-set! (py-set-item)
+;; - take + drop (py-get-slice)
+;; - take-right + drop-right (py-get-slice)
+;; - last
+;; - append (py-extend)
+;; - delete (py-delete-item)
+;; - min (py-min)
+;; - max (py-max)
+;; - member (py-in)
+;; - reverse (py-reversed)
+;; - length (py-len)
+define : bench-append param-list
+ . "Test (append a b) with lists of lengths from the param-list."
+ define : f x
+ let : (N (list-ref x 0)) (m (list-ref x 1))
+ benchmark (append a b) :let ((a (iota N))(b (iota m)))
+ zip param-list : map f param-list
+
+define : bench-ref param-list
+ . "Test (list-ref a b) with lists of lengths from the param-list."
+ define : f x
+ let : (N (list-ref x 0)) (m (list-ref x 1))
+ benchmark (list-ref a b) :let ((a (iota (max N m)))(b (- m 1)))
+ zip param-list : map f param-list
+
+define : bench-car param-list
+ . "Test (coar a b) with element A and list B of lengths from the param-list."
+ define : f x
+ let : (N (list-ref x 0))
+ benchmark (car b) :let ((b (iota N)))
+ zip param-list : map f param-list
+
+define : bench-cdr param-list
+ . "Test (cdr a b) with element A and list B of lengths from the param-list (note: this is really, really fast)."
+ define : f x
+ let : (N (list-ref x 0))
+ benchmark (cdr b) :let ((b (iota N)))
+ zip param-list : map f param-list
+
+define : bench-sort param-list
+ . "Test (sort a <) with lists of lengths from the param-list."
+ define : f x
+ let : (N (list-ref x 0))
+ benchmark (sort a <) :let ((a (iota N)))
+ zip param-list : map f param-list
+
+define : bench-cons param-list
+ . "Test (cons a b) with element A and list B of lengths from the param-list."
+ define : f x
+ let : (N (list-ref x 0)) (m (list-ref x 1))
+ benchmark (cons b a) :let ((a (iota N))(b m))
+ zip param-list : map f param-list
+
+define : bench-copy param-list
+ . "Test (cons a b) with element A and list B of lengths from the param-list."
+ define : f x
+ let : (N (list-ref x 0))
+ benchmark (list-copy a) :let ((a (iota N)))
+ zip param-list : map f param-list
+
+define : bench-set param-list
+ . "Test (cons a b) with element A and list B of lengths from the param-list."
+ define : f x
+ let : (N (list-ref x 0)) (m (list-ref x 1))
+ benchmark (list-set! a b #t) :let ((a (iota (max N m)))(b (- m 1)))
+ zip param-list : map f param-list
+
+define : bench-copy param-list
+ . "Copy a list of length N."
+ define : f x
+ let : (N (list-ref x 0)) (m (list-ref x 1))
+ benchmark (set! b (list-copy a)) :let ((a (iota N))(b #f))
+ zip param-list : map f param-list
+
+define : bench-getslice-left param-list
+ . "Get a slice from left."
+ define : f x
+ let : (N (list-ref x 0)) (m (list-ref x 1))
+ benchmark (take (drop a b) b) :let ((a (iota (max N (* 2 m))))(b m))
+ zip param-list : map f param-list
+
+define : bench-getslice-right param-list
+ . "Get a slice from right."
+ define : f x
+ let : (N (list-ref x 0)) (m (list-ref x 1))
+ benchmark (take-right (drop-right a b) b) :let ((a (iota (max N (* 2 m))))(b m))
+ zip param-list : map f param-list
+
+define : bench-length param-list
+ . "Get the length of a list."
+ define : f x
+ let : (N (list-ref x 0)) (m (list-ref x 1))
+ benchmark (length a) :let ((a (iota N))(b m))
+ zip param-list : map f param-list
+
+define : bench-reverse param-list
+ . "Reverse a list."
+ define : f x
+ let : (N (list-ref x 0)) (m (list-ref x 1))
+ benchmark (reverse a) :let ((a (iota N))(b m))
+ zip param-list : map f param-list
+
+define : bench-member param-list
+ . "Check (member b a)."
+ define : f x
+ let : (N (list-ref x 0)) (m (list-ref x 1))
+ benchmark (member b a) :let ((a (iota N)) (b (- m 1)))
+ zip param-list : map f param-list
+
+define : bench-last param-list
+ . "Get the last element of a list."
+ define : f x
+ let : (N (list-ref x 0)) (m (list-ref x 1))
+ benchmark (last a) :let ((a (iota N))(b m))
+ zip param-list : map f param-list
+
+define : bench-max param-list
+ . "Get the maximum value of a list."
+ define : f x
+ let : (N (list-ref x 0)) (m (list-ref x 1))
+ benchmark (apply max a) :let ((a (iota N))(b m))
+ zip param-list : map f param-list
+
+define : bench-min param-list
+ . "Get the minimum value of a list."
+ define : f x
+ let : (N (list-ref x 0)) (m (list-ref x 1))
+ benchmark (apply min a) :let ((a (iota N))(b m))
+ zip param-list : map f param-list
+
+define : bench-delete param-list
+ . "Check (member b a)."
+ define : f x
+ let : (N (list-ref x 0)) (m (list-ref x 1))
+ benchmark (delete b a) :let ((a (iota N)) (b (- m 1)))
+ zip param-list : map f param-list
+
+define : bench-delete-smaller param-list
+ . "Check (delete b a <)."
+ define : f x
+ let : (N (list-ref x 0)) (m (list-ref x 1))
+ benchmark (delete b a <) :let ((a (iota N)) (b (- m 1)))
+ zip param-list : map f param-list
+
+define : bench-delete-larger param-list
+ . "Check (delete b a >)."
+ define : f x
+ let : (N (list-ref x 0)) (m (list-ref x 1))
+ benchmark (delete b a >) :let ((a (iota N)) (b (- m 1)))
+ zip param-list : map f param-list
+
+define : bench-delete! param-list
+ . "Check (member b a)."
+ define : f x
+ let : (N (list-ref x 0)) (m (list-ref x 1))
+ benchmark (delete! b a) :let ((a (iota N)) (b (- m 1)))
+ zip param-list : map f param-list
+
+
+;; TODO: VList benchmarks
+
+
+;; String benchmarks
+define : bench-append-string param-list
+ . "Test (string-append a b) with lists of lengths from the param-list."
+ define : f x
+ let : (N (list-ref x 0)) (m (list-ref x 1))
+ benchmark (string-append a b) :let ((a (make-string N))(b (make-string m)))
+ zip param-list : map f param-list
+
+define : bench-append-string/shared param-list
+ . "Test (string-append/shared a b) with lists of lengths from the param-list."
+ define : f x
+ let : (N (list-ref x 0)) (m (list-ref x 1))
+ benchmark (string-append/shared a b) :let ((a (make-string N))(b (make-string m)))
+ zip param-list : map f param-list
+
+;; Vector benchmarks
+define : bench-append-vector param-list
+ . "Test (vector-append a b) with lists of lengths from the param-list."
+ define : f x
+ let : (N (list-ref x 0)) (m (list-ref x 1))
+ benchmark (vector-append a b) :let ((a (make-vector N 1))(b (make-vector m 1)))
+ zip param-list : map f param-list
+
+;; Map/set benchmarks
+define : bench-assoc param-list
+ . "Test (assoc a b) with lists of lengths from the param-list."
+ define : f x
+ let : (N (list-ref x 0)) (m (list-ref x 1))
+ benchmark (assoc a b) :let ((a m)(b (reverse (fold (λ (x y z) (acons x y z)) '() (iota N 1) (iota N 1)))))
+ zip param-list : map f param-list
+
+
+;; opertations
+define : bench-operation-+ param-list
+ . "Test (assoc a b) with lists of lengths from the param-list."
+ define : f x
+ let : (N (list-ref x 0)) (m (list-ref x 1))
+ benchmark (+ a b) :let ((a N)(b m)(c 1)(d 2))
+ zip param-list : map f param-list
+
+define : bench-operation-+++ param-list
+ . "Test (assoc a b) with lists of lengths from the param-list."
+ define : f x
+ let : (N (list-ref x 0)) (m (list-ref x 1))
+ benchmark (+ (+ (+ a b) c) d) :let ((a N)(b m)(c 50)(d 100))
+ zip param-list : map f param-list
+
+
+;; prepare a multi-function fit
+import
+ only : examples ensemble-estimation
+ . EnSRF make-covariance-matrix-with-offdiagonals-using-stds
+ . standard-deviation-from-deviations x-deviations->y-deviations
+ . x^steps
+ only : ice-9 popen
+ . open-output-pipe close-pipe
+
+define-syntax-rule : or0 test c ...
+ if test : begin c ...
+ . 0
+
+define-syntax-rule : oror0 test1 test2 c ...
+ if (or test1 test2) : begin c ...
+ . 0
+
+define-syntax-rule : define-quoted sym val
+ ;; set the value to true using eval to break the symbol->variable barrier
+ primitive-eval `(define ,sym val)
+
+define*
+ H-N-m x pos #:key all const OlogN OsqrtN ON ONlogN ON²
+ . Ologm Osqrtm Om Omlogm Om²
+ . OlogNm ONlogm OmlogN ONm
+ . ONlogNlogN Omlogmlogm
+ . "Observation operator. It generates modelled observations from the input.
+
+x are parameters to be optimized, pos is another input which is not optimized. For plain functions it could be the position of the measurement on the x-axis. We currently assume absolute knowledge about the position.
+"
+ let : (N (first pos)) (m (second pos))
+ +
+ oror0 all const : list-ref x 0 ; constant value
+ ;; pure N
+ oror0 all OlogN : * (list-ref x 1) : log (+ 1 N) ; avoid breakage at pos 0
+ oror0 all OsqrtN : * (list-ref x 2) : sqrt N
+ oror0 all ON : * (list-ref x 3) N
+ oror0 all ONlogN : * (list-ref x 4) : * N : log (+ 1 N)
+ oror0 all ON² : * (list-ref x 5) : expt N 2
+ ;; pure m
+ oror0 all Ologm : * (list-ref x 6) : log (+ 1 m)
+ oror0 all Osqrtm : * (list-ref x 7) : sqrt m
+ oror0 all Om : * (list-ref x 8) m
+ oror0 all Omlogm : * (list-ref x 9) : * m : log (+ 1 m)
+ oror0 all Om² : * (list-ref x 10) : expt m 2
+ ;; mixed terms
+ oror0 all OlogNm : * (list-ref x 11) : log (+ 1 N m)
+ oror0 all ONlogm : * (list-ref x 12) : * N : log (+ 1 m)
+ oror0 all OmlogN : * (list-ref x 13) : * m : log (+ 1 N)
+ oror0 all ONm : * (list-ref x 14) : * N m
+ oror0 all ONlogNlogN : * (list-ref x 15) : * (log (+ 1 N)) (log (+ 1 N)) N
+ oror0 all Omlogmlogm : * (list-ref x 16) : * (log (+ 1 m)) (log (+ 1 m)) m
+
+
+define : interleave lx lz
+ cond
+ (null? lx) lz
+ else
+ cons : car lx
+ interleave lz : cdr lx
+
+
+define : print-fit x σ
+ . "Print the big-O parameters which are larger than 2.6σ (2.6 times their standard deviation, roughly 99% / p 0.01)."
+ ;; see https://en.wikipedia.org/wiki/68%E2%80%9395%E2%80%9399.7_rule#/media/File:Standard_score_and_prediction_interval.png
+ let : : number-format "~,1,,,,,'ee±~,1,,,,,'ee"
+ let big-O
+ : names : list "" "log(N)" "sqrt(N)" "N log(N)" "N^2" "log(m)" "sqrt(m)" "m" "m log(m)" "m^2" "log(N + m)" "N log(m)" "m log(N)" "N m" "N log(N)^2" "m^2 N"
+ x x
+ σ σ
+ cond
+ : or (null? names) (null? x) (null? σ)
+ newline
+ : > (abs (car x)) (* 2.6 (car σ)) ;; 99%: 2.6 times standard deviation as significance level
+ format #t : string-append number-format " " (car names) " "
+ . (car x) (car σ)
+ big-O (cdr names) (cdr x) (cdr σ)
+ else
+ big-O (cdr names) (cdr x) (cdr σ)
+
+
+define : flatten li
+ append-ec (: i li) i
+
+;; TODO: add filename and title and fix the units
+define* : plot-benchmark-result bench H #:key filename title
+ let*
+ : ensemble-member-count 32
+ ensemble-member-plot-skip 8 ;; must not be zero!
+ iterations 4
+ y_0 : apply min : map car : map cdr bench
+ y_m : * 0.25 : apply max : map car : map cdr bench
+ nb : apply max : interleave (map car (map car bench)) (map car (map cdr (map car bench)))
+ ;; "const" "log(N)" "sqrt(N)" "N" "N^2" "N^3" "log(m)" "sqrt(m)" "m" "m^2" "m^3" "log(N + m)" "N log(m)" "m log(N)" "N m" "N^2 m" "m^2 N"
+ x^b : list y_0 (/ y_m (log nb)) (/ y_m (sqrt nb)) (/ y_m nb) (/ y_m nb nb) (/ y_m nb nb nb) (/ y_m (log nb)) (/ y_m (sqrt nb)) (/ y_m nb) (/ y_m nb nb) (/ y_m nb nb nb) (/ y_m nb nb) (/ y_m nb nb) (/ y_m nb nb nb) (/ y_m nb nb nb) (/ y_m nb nb nb nb) (/ y_m nb nb nb nb) ; inital guess: constant starting at the first result
+ x^b-std : list-ec (: i x^b) (* 2 i) ; inital guess: 200% uncertainty
+ P : make-covariance-matrix-with-offdiagonals-using-stds x^b-std
+ y⁰-pos : map car bench
+ y⁰ : append-map cdr bench
+ ;; several iterations to better cope with non-linearity, following http://journals.ametsoc.org/doi/abs/10.1175/MWR-D-11-00176.1 (but globally)
+ y⁰-stds : list-ec (: i y⁰) : * (sqrt iterations) : min max-absolute-uncertainty-seconds {max-relative-uncertainty * i} ; enforcing 20% max std in benchmark-run
+ R : make-covariance-matrix-with-offdiagonals-using-stds y⁰-stds
+ optimized ;; iterate N times
+ let lp : (N iterations) (x^b x^b) (P P)
+ let : : optimized : EnSRF H x^b P y⁰ R y⁰-pos ensemble-member-count
+ cond
+ : <= N 1
+ . optimized
+ else
+ let*
+ : x-opt : list-ref optimized 0
+ x-deviations : list-ref optimized 1
+ x-std ;; re-create the ensemble with the new std
+ list-ec (: i (length x-opt))
+ apply standard-deviation-from-deviations
+ list-ec (: j x-deviations) : list-ref j i
+ P : make-covariance-matrix-with-offdiagonals-using-stds x-std
+ lp (- N 1) x-opt P
+ x-opt : list-ref optimized 0
+ x-deviations : list-ref optimized 1
+ x-std
+ list-ec (: i (length x-opt))
+ apply standard-deviation-from-deviations : list-ec (: j x-deviations) : list-ref j i
+ y-deviations : x-deviations->y-deviations H x-opt x-deviations y⁰-pos
+ y-stds : list-ec (: i y-deviations) : apply standard-deviation-from-deviations i
+ y-opt : map (λ (x) (H x-opt x)) y⁰-pos
+ x^b-deviations-approx
+ list-ec (: i ensemble-member-count)
+ list-ec (: j (length x^b))
+ * : random:normal
+ sqrt : list-ref (list-ref P j) j ; only for diagonal P!
+ y^b-deviations : x-deviations->y-deviations H x^b x^b-deviations-approx y⁰-pos
+ y-std
+ apply standard-deviation-from-deviations
+ flatten y-deviations
+ y-stds : list-ec (: i y-deviations) : apply standard-deviation-from-deviations i
+ y^b-stds : list-ec (: i y^b-deviations) : apply standard-deviation-from-deviations i
+
+ ;; print-fit x-std
+ when title
+ display title
+ newline
+ print-fit x-opt x-std
+ ;; TODO: minimize y-mismatch * y-uncertainty
+ format #t "Model standard deviation (uncertainty): ~,4e\n" y-std
+ newline
+ ; now plot the result
+ let : : port : open-output-pipe "python2"
+ format port "# encoding: utf-8\n"
+ format port "from __future__ import unicode_literals\n"
+ format port "import pylab as pl\nimport matplotlib as mpl\n"
+ format port "y0 = [float(i) for i in '~A'[1:-1].split(' ')]\n" y⁰
+ format port "ystds = [float(i) for i in '~A'[1:-1].split(' ')]\n" y⁰-stds
+ format port "ypos1 = [float(i) for i in '~A'[1:-1].split(' ')]\n" : list-ec (: i y⁰-pos) : first i
+ format port "ypos2 = [float(i) for i in '~A'[1:-1].split(' ')]\n" : list-ec (: i y⁰-pos) : second i
+ format port "yinit = [float(i) for i in '~A'[1:-1].split(' ')]\n" : list-ec (: i y⁰-pos) : H x^b i
+ format port "yinitstds = [float(i) for i in '~A'[1:-1].split(' ')]\n" y^b-stds
+ format port "yopt = [float(i) for i in '~A'[1:-1].split(' ')]\n" : list-ec (: i y⁰-pos) : H x-opt i
+ format port "yoptstds = [float(i) for i in '~A'[1:-1].split(' ')]\n" y-stds
+ ;; format port "pl.errorbar(*zip(*sorted(zip(ypos1, yinit))), yerr=zip(*sorted(zip(ypos1, yinitstds)))[1], label='prior vs N')\n"
+ format port "pl.errorbar(*zip(*sorted(zip(ypos1, yopt))), yerr=zip(*sorted(zip(ypos1, yoptstds)))[1], marker='H', mew=1, ms=10, linewidth=0.1, label='optimized vs N')\n"
+ format port "eb=pl.errorbar(*zip(*sorted(zip(ypos1, y0))), yerr=ystds, alpha=0.6, marker='x', mew=2, ms=10, linewidth=0, label='measurements vs N')\neb[-1][0].set_linewidth(1)\n"
+ ;; format port "pl.errorbar(*zip(*sorted(zip(ypos2, yinit))), yerr=zip(*sorted(zip(ypos2, yinitstds)))[1], label='prior vs. m')\n"
+ format port "pl.errorbar(*zip(*sorted(zip(ypos2, yopt))), yerr=zip(*sorted(zip(ypos2, yoptstds)))[1], marker='h', mew=1, ms=10, linewidth=0.1, label='optimized vs. m')\n"
+ format port "eb=pl.errorbar(*zip(*sorted(zip(ypos2, y0))), yerr=ystds, alpha=0.6, marker='x', mew=2, ms=10, linewidth=0, label='measurements vs. m')\neb[-1][0].set_linewidth(1)\n"
+ format port "pl.plot(sorted(ypos1+ypos2), pl.log(sorted(ypos1+ypos2))*(max(y0) / pl.log(max(ypos1+ypos2))), label='log(x)')\n"
+ format port "pl.plot(sorted(ypos1+ypos2), pl.sqrt(sorted(ypos1+ypos2))*(max(y0) / pl.sqrt(max(ypos1+ypos2))), label='sqrt(x)')\n"
+ format port "pl.plot(sorted(ypos1+ypos2), pl.multiply(sorted(ypos1+ypos2), max(y0) / max(ypos1+ypos2)), label='x')\n"
+ list-ec (: step 0 (length x^steps) 4)
+ let : : members : list-ref x^steps (- (length x^steps) step 1)
+ list-ec (: member-idx 0 (length members) ensemble-member-plot-skip) ; reversed
+ let : : member : list-ref members member-idx
+ format port "paired = pl.get_cmap('Paired')
+cNorm = mpl.colors.Normalize(vmin=~A, vmax=~A)
+scalarMap = mpl.cm.ScalarMappable(norm=cNorm, cmap=paired)\n" 0 (length member)
+ list-ec (: param-idx 0 (length member) 4) ; step = 4
+ ;; plot parameter 0
+ let : (offset (/ (apply max (append y⁰ y-opt)) 2)) (spreading (/ (apply max (append y⁰ y-opt)) (- (apply max member) (apply min member)) 2))
+ format port "pl.plot(~A, ~A, marker='.', color=scalarMap.to_rgba(~A), linewidth=0, label='', alpha=0.6, zorder=-1)\n"
+ . (/ step 1) (+ offset (* spreading (list-ref member param-idx))) param-idx
+ format port "pl.legend(loc='upper left', fancybox=True, framealpha=0.5)\n"
+ format port "pl.xlabel('position (N or m) / arbitrary units')\n"
+ format port "pl.ylabel('time / s')\n"
+ format port "pl.title('''~A''')\n" : or title "Operation scaling behaviour"
+ format port "pl.text(1, 0, '''fit: ~A''', horizontalalignment='right', verticalalignment='center', transform=pl.gca().transAxes)\n" : with-output-to-string : λ() : print-fit x-opt x-std
+ format port "pl.xscale('log')\n"
+ ;; format port "pl.yscale('log')\n"
+ if filename
+ format port "pl.savefig('~A', bbox_inches='tight')\n" filename
+ format port "pl.show()\n"
+ format port "exit()\n"
+ close-pipe port
+
+
+define : main args
+ let : : steps 25
+ when : member "--quick" args
+ set! max-relative-uncertainty 1.5
+ set! max-absolute-uncertainty-seconds 1.e-1
+ set! min-aggregated-runtime-seconds 1.e-7
+ set! max-iterations 16
+ set! steps 5
+ let*
+ : H : lambda (x pos) (H-N-m x pos #:all #t)
+ H-const : lambda (x pos) (H-N-m x pos #:const #t)
+ H-log : lambda (x pos) (H-N-m x pos #:const #t #:OlogN #t #:Ologm #t)
+ H-lin : lambda (x pos) (H-N-m x pos #:const #t #:ON #t #:Om #t #:ONlogN #t #:Omlogm #t #:ONlogNlogN #t #:Omlogmlogm #t )
+ pbr plot-benchmark-result
+ let lp
+ : N-start `(1 1 1 100 ,(* steps 1000))
+ N-step '(1000 1000 0 0 0)
+ m-start '(1 100 1 1 1)
+ m-step '(0 0 1000 1000 1000)
+ cond
+ : null? N-start
+ . #t
+ else
+ let*
+ : N : car N-start
+ dN : car N-step
+ m : car m-start
+ dm : car m-step
+ param-list : zip (logiota steps N dN) (logiota steps m dm)
+ define : title description
+ string-append description
+ format #f ", ~a ~a"
+ if (equal? dN 0) N "N"
+ if (equal? dm 0) m "m"
+ define : filename identifier
+ format #f "/tmp/benchmark-~a-~a-~a.png"
+ . identifier
+ if (equal? dN 0) N "N"
+ if (equal? dm 0) m "m"
+ pbr (bench-operation-+ param-list) H
+ . #:title : title "+ N m"
+ . #:filename : filename "operation-plus"
+ pbr (bench-operation-+++ param-list) H
+ . #:title : title "+ (+ (+ N m) 50) 100"
+ . #:filename : filename "operation-plus3"
+ pbr (bench-ref param-list) H-const
+ . #:title : title "list-ref (iota (max m N)) (- m 1)"
+ . #:filename : filename "list-ref"
+ when : equal? dm 0 ;; only over N
+ pbr (bench-car param-list) H-const
+ . #:title : title "car (iota N)"
+ . #:filename : filename "car"
+ pbr (bench-cdr param-list) H-const
+ . #:title : title "cdr (iota N)"
+ . #:filename : filename "cdr"
+ pbr (bench-sort param-list) H-lin
+ . #:title : title "sort (iota N)"
+ . #:filename : filename "sort"
+ pbr (bench-copy param-list) H
+ . #:title : title "list-copy (iota N)"
+ . #:filename : filename "copy"
+ pbr (bench-length param-list) H
+ . #:title : title "length (iota N)"
+ . #:filename : filename "length"
+ pbr (bench-reverse param-list) H
+ . #:title : title "reverse (iota N)"
+ . #:filename : filename "reverse"
+ pbr (bench-last param-list) H
+ . #:title : title "last (iota N)"
+ . #:filename : filename "last"
+ pbr (bench-max param-list) H
+ . #:title : title "apply max (iota N)"
+ . #:filename : filename "max"
+ pbr (bench-min param-list) H
+ . #:title : title "apply min (iota N)"
+ . #:filename : filename "min"
+ pbr (bench-append param-list) H-lin
+ . #:title : title "append (iota N) (iota m)"
+ . #:filename : filename "list-append"
+ pbr (bench-set param-list) H
+ . #:title : title "list-set! (iota (max N m)) m #t"
+ . #:filename : filename "list-set"
+ pbr (bench-getslice-left param-list) H
+ . #:title : title "take (drop (iota (max N (* 2 m))) m) m"
+ . #:filename : filename "list-getslice-left"
+ pbr (bench-getslice-right param-list) H
+ . #:title : title "take-right (drop-right (iota (max N (* 2 m))) m) m"
+ . #:filename : filename "list-getslice-right"
+ pbr (bench-member param-list) H
+ . #:title : title "member (- m 1) (iota N)"
+ . #:filename : filename "member"
+ pbr (bench-delete param-list) H
+ . #:title : title "delete (- m 1) (iota N)"
+ . #:filename : filename "delete"
+ pbr (bench-delete-smaller param-list) H
+ . #:title : title "delete (- m 1) (iota N) <"
+ . #:filename : filename "delete-smaller"
+ pbr (bench-delete-larger param-list) H
+ . #:title : title "delete (- m 1) (iota N) >"
+ . #:filename : filename "delete-larger"
+ pbr (bench-delete! param-list) H
+ . #:title : title "delete! (- m 1) (iota N)"
+ . #:filename : filename "delete-bang"
+ ;; strings
+ pbr (bench-append-string param-list) H-lin
+ . #:title : title "string-append (make-string N) (make-string m)"
+ . #:filename : filename "string-append"
+ pbr (bench-append-string/shared param-list) H-lin
+ . #:title : title "string-append/shared (make-string N) (make-string m)"
+ . #:filename : filename "string-append-shared"
+ ;; vectors
+ pbr (bench-append-vector param-list) H-lin
+ . #:title : title "vector-append (make-vector N 1) (make-vector m 1)"
+ . #:filename : filename "vector-append"
+ ;; maps
+ pbr (bench-assoc param-list) H
+ . #:title : title "assoc m '((1 . 1) (2 . 2) ... (N . N))"
+ . #:filename : filename "assoc"
+ pbr (bench-cons param-list) H
+ . #:title : title "cons m (iota N)"
+ . #:filename : filename "cons"
+ lp
+ cdr N-start
+ cdr N-step
+ cdr m-start
+ cdr m-step
diff --git a/examples/cartesian-sets.w b/examples/cartesian-sets.w
new file mode 100755
--- /dev/null
+++ b/examples/cartesian-sets.w
@@ -0,0 +1,39 @@
+#!/usr/bin/env sh
+# -*- wisp -*-
+exec guile -L $(dirname $(dirname $(realpath "$0"))) --language=wisp -e '(@@ (examples cartesian-sets) main)' -s "$0" "$@"
+; !#
+;; Implementation of the cartesian product over a list of lists, building on http://stackoverflow.com/a/20591545/7666
+
+define-module : examples cartesian-sets
+ . #:export : cartesian-product
+
+import : srfi srfi-1
+
+;; original
+define : cartesian-product-lambda . lists
+ fold-right
+ lambda : xs ys
+ append-map (lambda (x)
+ (map (lambda (y)
+ (cons x y))
+ ys))
+ . xs
+ . '(())
+ . lists
+
+
+;; easier to understand
+define : cartesian-product . lists
+ define : product-of-two xs ys
+ define : cons-on-each-ys x
+ map : lambda (y) (cons x y)
+ . ys
+ append-map cons-on-each-ys
+ . xs
+ fold-right product-of-two '(()) lists
+
+define : main args
+ write : cartesian-product-lambda '(1 2) '(3 4) '(5 6)
+ newline
+ write : cartesian-product '(1 2) '(3 4) '(5 6)
+ newline
diff --git a/examples/cholesky.w b/examples/cholesky.w
--- a/examples/cholesky.w
+++ b/examples/cholesky.w
@@ -6,41 +6,105 @@ exec guile -L $(dirname $(dirname $(real
;; Cholesky decomposition, following https://de.wikipedia.org/wiki/Cholesky-Zerlegung#Pseudocode
define-module : examples cholesky
- . #:export : cholesky!
+ . #:export : cholesky! matrix-ref matrix-set! matrix-transpose matrix-multiply
+
+use-modules : srfi srfi-42 ; list-comprehension
+ srfi srfi-11 ; let-values
-use-modules : guildhall ext foof-loop
+define : ->exact-matrix list-of-lists
+ . "Turn a list of lists into a matrix"
+ map
+ λ : x
+ apply list : map inexact->exact x
+ . list-of-lists
+
+define : ->inexact-matrix list-of-lists
+ . "Turn a list of lists into a matrix"
+ map
+ λ : x
+ apply list : map exact->inexact x
+ . list-of-lists
+
+define : matrix-ref X row col
+ list-ref (list-ref X row) col
-define : matrrix-ref X u v
- list-ref (list-ref X u) v
+define : matrix-set! X row col val
+ let : : sublist : list-ref X row
+ list-set! sublist col val
+ list-set! X row sublist
+
+define : matrix-transpose X
+ . "Swap columns and rows of a matrix"
+ list-ec (: outer (length X)) ; outer
+ list-ec (: inner (length (list-ref X outer))) ; inner
+ matrix-ref X inner outer
-define : matrrix-set! X u v val
- list-set! (list-ref X u) v val
+define : matrix-multiply X Y
+ . "Calculate the matrix product of X and Y"
+ list-ec (: row (length Y))
+ list-ec (: col (length X))
+ sum-ec (: inner (length (list-ref Y row)))
+ * : matrix-ref Y inner col
+ matrix-ref X row inner
+define : mostly-exact-sqrt n
+ . "Calculate an exact sqrt if possible, else use a good approximation"
+ inexact->exact : sqrt : inexact->exact n
define : cholesky! a
- . "Modifies the square matirx a to contain its cholesky decomposition.
+ . "Modifies the square matrix a to contain its cholesky decomposition.
sets a to g with a = ggT,
a is represented as list of lists."
let : : n : length a
- loop : : for i : up-from 1 : to n
- loop : : for j : up-from 1 : to i
+ do-ec (: i n)
+ do-ec (: j (+ 1 i))
let : : sum : matrix-ref a i j
+ ; format #t "n: ~A i: ~A j: ~A\n" n i j
when : >= j 1
- loop : : for k : up-from 1 : to {j - 1}
+ do-ec (: k j)
set! sum : - sum : * (matrix-ref a i k) (matrix-ref a j k)
cond
: > i j ; lower triangle
matrix-set! a i j
- / sum : matrix-ref a j j
- . a
+ / sum
+ matrix-ref a j j
: > sum 0 ; diagonal element
- matrix-set! a i i : sqrt sum
- . a
+ matrix-set! a i i
+ mostly-exact-sqrt sum ; preserves the exactness, since the result is an exact number, though not an exact result
else
- throw 'matrix-numerically-not-symmetric-positive-definite
+ throw 'matrix-numerically-not-symmetric-positive-definite a
+ do-ec (: i n)
+ do-ec (: j (+ 1 i) n)
+ matrix-set! a i j 0
+ . a
define : main args
- display : cholesky! '((1 2)(2 4))
+ let
+ : X : ->exact-matrix '(( 1 -1 1)
+ (-1 3 -.5)
+ ( 1 -.5 4))
+ L : ->exact-matrix '(( 1 0 0)
+ (-1 1.41421356 0)
+ ( 1 0.35355339 1.6955825))
+ format #t "X\n"
+ display : ->inexact-matrix X
+ newline
+ format #t "cholesky\n"
+ display : ->inexact-matrix : cholesky! X
+ newline
+ format #t "L\n"
+ display : ->inexact-matrix L
+ newline
+ format #t "L·Lt\n"
+ display
+ ->inexact-matrix
+ matrix-multiply L : matrix-transpose L
+ newline
+ format #t "X·Xt\n"
+ display
+ ->inexact-matrix
+ matrix-multiply X : matrix-transpose X
+ newline
diff --git a/examples/commandline-handling.w b/examples/commandline-handling.w
new file mode 100755
--- /dev/null
+++ b/examples/commandline-handling.w
@@ -0,0 +1,203 @@
+#!/usr/bin/env sh
+# -*- wisp -*-
+guile-2.0 -L $(dirname $(dirname $(realpath "$0"))) -c '(import (wisp-scheme) (language wisp spec))'
+exec guile-2.0 -L $(dirname $(dirname $(realpath "$0"))) --language=wisp -e '(examples commandline-handling)' -s "$0" "$@"
+; !#
+
+;; This is an example for complex commandline handling for a tool
+;; which takes a list of tasks to run as arguments.
+
+define-module : examples commandline-handling
+ . #:export : main
+
+import
+ ice-9 format
+ srfi srfi-1
+ srfi srfi-37
+ ice-9 popen ; for pipe-open*
+ ice-9 rdelim ; for read-string
+
+
+
+define : runcommand cmd
+ let*
+ : port : open-input-pipe cmd
+ output : read-string port
+ display output
+ newline
+
+
+define : run-my-shell-command
+ . "Run a predefined shell command"
+ let
+ :
+ cmd
+ string-join
+ list "for i in {1..5}; do echo $i; done"
+ when : debug?
+ display cmd : current-error-port
+ newline : current-error-port
+ runcommand cmd
+
+
+define : help . args ; args used for simpler option parsing
+ if
+ and
+ >= (length args) 3
+ third args
+ member (string->symbol (third args)) : task-list ; help got an argument
+ let*
+ : fun : string->symbol : third args
+ mod : resolve-module '(examples commandline-handling)
+ doc : procedure-documentation : module-ref mod fun
+ format #t "~a\n\n~a\n" fun doc
+ format #t "Usage: commandline-handling.w [option ...] [--] [task ...]
+
+Run the selected tasks given on the commandline.
+
+ -h [TASK] --help[=TASK]
+ display this help or infomation about the task and exit
+ -V --version output version information and exit
+ --tasks list all available tasks
+ -d [LEVEL] --debug[=LEVEL]
+ set logging to debug or to the given level
+
+Defined tasks:
+
+ ~a
+
+" : string-join : map symbol->string : task-list
+ exit 0
+
+
+define : version
+ display "commandline-handling 0.0.0
+
+Copyright (C) 2016 Arne Babenhauserheide, for IMK-ASF at Karlsruhe Institute for Technology
+See the file COPYING. There is NO warranty.
+"
+
+define help-option
+ option '(#\h "help")
+ . #f #t help
+
+define version-option
+ option '(#\V "version")
+ . #f #f
+ λ : option name arg operands
+ version
+ exit 0
+
+define : debug?
+ equal? 'debug : assoc-ref %options 'log-level
+
+
+define debug-option
+ let
+ : required #f
+ optional #t ; can take an argument
+ option '(#\d "debug")
+ . required optional
+ λ : option name arg operands
+ if arg
+ set! %options : alist-cons 'log-level (string->symbol arg) %options
+ set! %options : alist-cons 'log-level 'debug %options
+ format : current-error-port
+ . "debug: activate log level ~a\n"
+ if arg arg 'debug
+ . operands
+
+
+define utility-procedures
+ ' parse-args main run-task task-list runcommand debug?
+
+define debug-procedures
+ ' tasks help options version
+
+define : task-list
+ let : : mod : resolve-module '(examples commandline-handling)
+ delete #f
+ module-map
+ λ : x y
+ if
+ and
+ procedure? : module-ref mod x
+ not : member x utility-procedures
+ if : equal? 'debug : assoc-ref %options 'log-level
+ . #t
+ not : member x debug-procedures
+ . x
+ . #f
+ . mod
+
+define : tasks . args
+ map : λ (x) (display x)(newline)
+ task-list
+
+define tasks-option
+ option '("tasks")
+ . #f #f
+ λ : option name arg operands
+ tasks
+ exit 0
+
+
+define %options
+ '
+ log-level . info
+
+define : options
+ format : current-error-port
+ . "Currently active options: ~A\n"
+ . %options
+
+define %option-list
+ list help-option version-option debug-option tasks-option
+
+
+define : run-task task
+ let*
+ : mod : resolve-module '(examples commandline-handling)
+ t : string->symbol task
+ var : module-variable mod t
+ cond
+ var
+ let : : T : module-ref mod t
+ if : procedure? T
+ T
+ format : current-error-port
+ . "Not a procedure: ~a refers to ~a\n" task var
+ else
+ format : current-error-port
+ . "Unknown task: ~a\n" task
+
+
+define : parse-args args
+ let
+ :
+ tasks
+ reverse
+ args-fold args
+ . %option-list
+ λ : option name arg operands
+ format : current-error-port
+ . "unrecognized command line argument name: ~a arg: ~a operands: ~a\n"
+ . name arg operands
+ exit 1
+ λ : operand operands
+ cons operand operands
+ . '()
+ for-each
+ λ : task
+ if : and (equal? task "help") (not (null? (delete "help" tasks)))
+ map
+ λ : x
+ help #f #f x
+ delete "help" tasks
+ run-task task
+ . tasks
+
+define* : main args
+ if : null? : cdr args
+ help
+ parse-args : cdr args
diff --git a/examples/doctests-test.scm b/examples/doctests-test.scm
new file mode 100755
--- /dev/null
+++ b/examples/doctests-test.scm
@@ -0,0 +1,25 @@
+#!/usr/bin/env sh
+exec guile -L $(dirname $(dirname $(realpath "$0"))) -e '(@@ (examples doctests-test) main)' -s "$0" "$@"
+; !#
+
+(define-module (examples doctests-test))
+
+(import (examples doctests))
+
+(define (foo)
+ "(test 'foo
+ (test-equal \"bar\" (foo)))
+ "
+ "bar")
+
+(define %this-module (current-module))
+(define (main args)
+ " Testing doctests
+ (test 'mytest
+ (test-assert #t)
+ (test-assert #f))
+"
+ (doctests-testmod %this-module))
+
+
+
diff --git a/examples/doctests-test.w b/examples/doctests-test.w
new file mode 100755
--- /dev/null
+++ b/examples/doctests-test.w
@@ -0,0 +1,25 @@
+#!/usr/bin/env sh
+# -*- wisp -*-
+guile -L $(dirname $(dirname $(realpath "$0"))) -c '(import (wisp-scheme) (language wisp spec))'
+exec guile -L $(dirname $(dirname $(realpath "$0"))) --language=wisp -e '(@@ (examples doctests-test) main)' -s "$0" "$@"
+; !#
+
+define-module : examples doctests-test
+
+import : examples doctests
+
+define : foo
+ . "(test 'foo
+ (test-equal \"bar\" (foo)))
+ "
+ . "bar"
+
+define %this-module : current-module
+define : main args
+ . " Testing doctests
+ (test 'mytest
+ (test-assert #t)
+ (test-assert #f))
+"
+ doctests-testmod %this-module
+
diff --git a/examples/doctests-testone.scm b/examples/doctests-testone.scm
new file mode 100755
--- /dev/null
+++ b/examples/doctests-testone.scm
@@ -0,0 +1,16 @@
+#!/usr/bin/env sh
+exec guile -L $(dirname $(dirname $(realpath "$0"))) -s "$0" "$@"
+; !#
+
+(import (examples doctests))
+
+(define (foo)
+ "(test 'foo
+ (test-equal \"bar\" (foo)))
+ "
+ "bar")
+
+(doctests-testmod (current-module))
+
+
+
diff --git a/examples/doctests.scm b/examples/doctests.scm
new file mode 100755
--- /dev/null
+++ b/examples/doctests.scm
@@ -0,0 +1,118 @@
+#!/usr/bin/env sh
+exec guile -L $(dirname $(dirname $(realpath "$0"))) -e '(@@ (examples doctests) main)' -s "$0" "$@"
+; !#
+
+(define-module (examples doctests)
+ #:export (doctests-testmod))
+
+(import (ice-9 optargs)
+ (ice-9 rdelim)
+ (ice-9 match)
+ (oop goops)
+ (texinfo reflection))
+
+; define basic dir
+(define* (dir #:key (all? #f))
+ (if all?
+ (map (λ (x) (cons (module-name x)
+ (module-map (λ (sym var) sym) (resolve-interface (module-name x)))))
+ (cons (current-module) (module-uses (current-module))))
+ (module-map (λ (sym var) sym) (current-module))))
+; add support for giving the module as argument
+(define-generic dir)
+(define-method (dir (all? <boolean>)) (dir #:all? all?))
+(define-method (dir (m <list>)) (module-map (λ (sym var) sym) (resolve-interface m)))
+; add support for using modules directly (interfaces are also modules, so this catches both)
+(define-method (dir (m <module>)) (module-map (λ (sym var) sym) m))
+
+(define (string-index s fragment)
+ "return the index of the first character of the FRAGMENT in string S."
+ (let loop ((s s) (i 0))
+ (if (= 0 (string-length s))
+ #f
+ (if (string-prefix? fragment s)
+ i
+ (loop (string-drop s 1) (+ i 1))))))
+
+(define (doctests-extract-from-string s)
+ "Extract all test calls from a given string.
+
+ This is an example test:
+
+ (test 'mytest
+ (define v (make-vector 5 99))
+ (test-assert (vector? v))
+ (test-eqv 99 (vector-ref v 2))
+ (vector-set! v 2 7)
+ (test-eqv 7 (vector-ref v 2)))
+ (test 'mytest2
+ (test-assert #t))
+"
+ (let lp
+ ((str s)
+ (tests (list)))
+ (if (string-null? str)
+ (reverse tests)
+ (let ((idx (string-index str "(test")))
+ (if (not idx)
+ (reverse tests)
+ (let ((sub (substring str idx)))
+ (lp ; recurse with the rest of the string
+ (with-input-from-string sub
+ (λ () (read) (read-string)))
+ (cons
+ (with-input-from-string sub
+ (λ () (read)))
+ tests))))))))
+
+(define (doctests-testmod mod)
+ "Execute all doctests in the current module"
+ (let*
+ ((names (module-map (λ (sym var) sym) mod))
+ (filename
+ (if (module-filename mod) (string-join (string-split (module-filename mod) #\/) "-")
+ (string-join (cons "._" (map symbol->string (module-name mod))) "-")))
+ (docstrings
+ (map (λ (x) (if (procedure? x) (procedure-documentation x)))
+ (map (λ (x) (module-ref mod x)) names))))
+ (let loop
+ ((names names)
+ (docstrings docstrings))
+ (when (not (null? docstrings))
+ (when (string? (car docstrings))
+ (let*
+ ((name (car names))
+ (docstring (car docstrings)))
+ (let loop-tests
+ ((doctests (doctests-extract-from-string (car docstrings))))
+ (when (and (list? doctests) (not (null? doctests)))
+ (let*
+ ((doctest (car doctests))
+ (testid
+ (if (not (list? doctest))
+ #f
+ (string-join (list filename (symbol->string name) (symbol->string (primitive-eval (car (cdr doctest)))))
+ "--")))
+ (cleaned
+ (if (not (list? doctest))
+ '#f
+ (append
+ (cons 'begin
+ (cons '(import (srfi srfi-64))
+ (cons
+ (list 'test-begin testid)
+ (cdr (cdr doctest)))))
+ (list (list 'test-end testid))))))
+ (when cleaned
+ (let ()
+ (eval cleaned mod))
+ (newline))
+ (loop-tests (cdr doctests)))))))
+ (loop (cdr names) (cdr docstrings))))))
+
+(define %this-module (current-module))
+(define (main args)
+ (doctests-testmod %this-module))
+
+
+
diff --git a/examples/doctests.w b/examples/doctests.w
new file mode 100755
--- /dev/null
+++ b/examples/doctests.w
@@ -0,0 +1,118 @@
+#!/usr/bin/env sh
+# -*- wisp -*-
+guile -L $(dirname $(dirname $(realpath "$0"))) -c '(import (wisp-scheme) (language wisp spec))'
+exec guile -L $(dirname $(dirname $(realpath "$0"))) --language=wisp -e '(@@ (examples doctests) main)' -s "$0" "$@"
+; !#
+
+define-module : examples doctests
+ . #:export : doctests-testmod
+
+import : ice-9 optargs
+ ice-9 rdelim
+ ice-9 match
+ oop goops
+ texinfo reflection
+
+; define basic dir
+define* (dir #:key (all? #f))
+ if all?
+ map (λ (x) (cons (module-name x)
+ (module-map (λ (sym var) sym) (resolve-interface (module-name x)))))
+ cons (current-module) : module-uses (current-module)
+ module-map (λ (sym var) sym) (current-module)
+; add support for giving the module as argument
+define-generic dir
+define-method (dir (all? <boolean>)) (dir #:all? all?)
+define-method (dir (m <list>)) (module-map (λ (sym var) sym) (resolve-interface m))
+; add support for using modules directly (interfaces are also modules, so this catches both)
+define-method (dir (m <module>)) (module-map (λ (sym var) sym) m)
+
+define : string-index s fragment
+ . "return the index of the first character of the FRAGMENT in string S."
+ let loop : (s s) (i 0)
+ if : = 0 : string-length s
+ . #f
+ if : string-prefix? fragment s
+ . i
+ loop (string-drop s 1) (+ i 1)
+
+define : doctests-extract-from-string s
+ . "Extract all test calls from a given string.
+
+ This is an example test:
+
+ (test 'mytest
+ (define v (make-vector 5 99))
+ (test-assert (vector? v))
+ (test-eqv 99 (vector-ref v 2))
+ (vector-set! v 2 7)
+ (test-eqv 7 (vector-ref v 2)))
+ (test 'mytest2
+ (test-assert #t))
+"
+ let lp
+ : str s
+ tests : list
+ if : string-null? str
+ reverse tests
+ let : : idx : string-index str "(test"
+ if : not idx
+ reverse tests
+ let : : sub : substring str idx
+ lp ; recurse with the rest of the string
+ with-input-from-string sub
+ λ () (read) (read-string)
+ cons
+ with-input-from-string sub
+ λ () : read
+ . tests
+
+define : doctests-testmod mod
+ . "Execute all doctests in the current module"
+ let*
+ : names : module-map (λ (sym var) sym) mod
+ filename
+ if (module-filename mod) (string-join (string-split (module-filename mod) #\/ ) "-")
+ string-join (cons "._" (map symbol->string (module-name mod))) "-"
+ docstrings
+ map (λ (x) (if (procedure? x) (procedure-documentation x)))
+ map (λ (x) (module-ref mod x)) names
+ let loop
+ : names names
+ docstrings docstrings
+ when : not : null? docstrings
+ when : string? : car docstrings
+ let*
+ : name : car names
+ docstring : car docstrings
+ let loop-tests
+ : doctests : doctests-extract-from-string : car docstrings
+ when : and (list? doctests) : not : null? doctests
+ let*
+ : doctest : car doctests
+ testid
+ if : not : list? doctest
+ . #f
+ string-join : list filename (symbol->string name) : symbol->string : primitive-eval : car : cdr doctest
+ . "--"
+ cleaned
+ if : not : list? doctest
+ . '#f
+ append
+ cons 'begin
+ cons '(import (srfi srfi-64))
+ cons
+ list 'test-begin testid
+ cdr : cdr doctest
+ list : list 'test-end testid
+ when cleaned
+ let :
+ eval cleaned mod
+ newline
+ loop-tests : cdr doctests
+ loop (cdr names) (cdr docstrings)
+
+define %this-module : current-module
+define : main args
+ doctests-testmod %this-module
+
diff --git a/examples/duel.w b/examples/duel.w
new file mode 100755
--- /dev/null
+++ b/examples/duel.w
@@ -0,0 +1,68 @@
+#!/usr/bin/env sh
+# -*- wisp -*-
+D="$(dirname $(realpath "$0"))"
+W="$(dirname $(dirname $(realpath "$0")))"
+guile -L "$W" -c '(import (wisp-scheme) (language wisp spec))'
+exec guile -L "$W" --language=wisp -l "$D/enter-three-witches.w" -s "$0" "$@"
+; !#
+
+import : examples enter-three-witches
+
+set! *random-state* : random-state-from-platform
+
+Enter : Galtag Nimbleday
+ Lowlife Pirate
+ choose your answer
+
+define challenges
+ `
+ : You fight like a Dairy Farmer!
+ How appropriate! You fight like a cow!
+ And I've got a little TIP for you, get the POINT?
+
+; write answers
+; newline
+
+define : random-challenge
+ list-ref challenges : random : length challenges
+
+define : list->textline L
+ string-join : map ->string L
+ . " "
+
+;; TODO: define-syntax define-interaction
+define : duel me other
+ let*
+ : challenge : random-challenge
+ tease : car challenge
+ answers : map list->textline : cdr challenge
+ say-name other
+ say-words
+ : ,@tease
+ say-name ' : choose your answer
+ ;; TODO: shuffle the answers, check whether the right one is given
+ ;; (the first answer in the original ordering is the right one)
+ say-words
+ : ,(let ((counter 0))
+ (string-join
+ (map (λ (x)
+ (set! counter (+ 1 counter))
+ (string-append (number->string counter) " " x)) answers) "\n "))
+ let
+ : answer : list-ref answers (- (string->number (format #f "~a" (peek-char))) 1)
+ drain-input (current-input-port)
+ say-name me
+ say-words
+ : ,answer
+
+
+define-syntax-rule : Duel fighter1 fighter2
+ duel
+ quote fighter1
+ quote fighter2
+
+
+Duel
+ Galtag Nimbleday
+ Lowlife Pirate
+
diff --git a/examples/ensemble-estimation.w b/examples/ensemble-estimation.w
--- a/examples/ensemble-estimation.w
+++ b/examples/ensemble-estimation.w
@@ -1,10 +1,11 @@
#!/usr/bin/env sh
# -*- wisp -*-
-exec guile -L $(dirname $(dirname $(realpath "$0"))) --language=wisp -e '(@@ (examples ensemble-estimation) main)' -s "$0" "$@"
+guile -L $(dirname $(dirname $(realpath "$0"))) -c '(import (wisp-scheme) (language wisp spec))'
+exec guile -L $(dirname $(dirname $(realpath "$0"))) --language=wisp -e '(@@ (examples ensemble-estimation) main)' -l $(dirname $(realpath "$0"))/cholesky.w -s "$0" "$@"
; !#
;; Simple Ensemble Square Root Filter to estimate function parameters
-;; based on measurements.
+;; based on measurements with uncertainty.
;; Provide first guess parameters x^b and measurements y⁰ to get
;; optimized parameters x^a.
@@ -33,7 +34,15 @@ exec guile -L $(dirname $(dirname $(real
;; x'^a = x'^b - αK·H(x'^b)
define-module : examples ensemble-estimation
+ . #:export (EnSRF H standard-deviation-from-deviations
+ make-covariance-matrix-with-offdiagonals-using-stds
+ x-deviations->y-deviations x^steps)
+
use-modules : srfi srfi-42 ; list-ec
+ srfi srfi-9 ; records
+ oop goops ; generic functions
+ ice-9 optargs
+ examples cholesky ; cholesky! for random variables with covariance
use-modules
: ice-9 popen
. #:select : open-output-pipe close-pipe
@@ -49,8 +58,46 @@ define : make-diagonal-matrix-with-trace
list-ref trace i
. 0.0
+define : make-covariance-matrix-with-offdiagonals-using-stds stds
+ . "this is a dense covariance matrix with (√1/N std_i std_j) as the off-diagonal elements, with N the number of elements in the stds."
+ let : : dim : length stds
+ list-ec (: i dim)
+ list-ec (: j dim)
+ if : = i j
+ expt (list-ref stds i) 2
+ ; add smaller off-diag elements
+ * (sqrt (/ 1 dim)) (list-ref stds i) (list-ref stds j)
+
+; TODO: Allow for off-diagonal elements
+define-class <sparse-covariance-matrix> ()
+ trace #:getter get-trace #:init-keyword #:trace
+ zeros #:getter get-zeros #:init-keyword #:zeros
+ stds #:getter get-stds #:init-keyword #:stds
+ . #:allocation #:virtual
+ . #:slot-ref (lambda (o)
+ (map (lambda (x) (expt x 0.5)) (slot-ref o 'trace)))
+ . #:slot-set! (lambda (o m)
+ (slot-set! o 'trace (map (lambda (x) (expt x 2)) m))
+ (slot-set! o 'zeros (list-ec (: i (length m)) 0)))
+
+define-generic list-ref
+define-method : list-ref (M <sparse-covariance-matrix>) (i <integer>)
+ let
+ : trace : slot-ref M 'trace
+ zeros : slot-ref M 'zeros
+ append
+ list-head zeros i
+ list : list-ref trace i
+ list-tail zeros : + i 1
+
+define-generic length
+define-method : length (M <sparse-covariance-matrix>)
+ length : slot-ref M 'trace
+
define : make-covariance-matrix-from-standard-deviations stds
- make-diagonal-matrix-with-trace : map (lambda (x) (expt x 2)) stds
+ ; make-diagonal-matrix-with-trace : map (lambda (x) (expt x 2)) stds
+ ; make <sparse-covariance-matrix> #:stds stds
+ make-covariance-matrix-with-offdiagonals-using-stds stds
define : mean l
. "Calculate the average value of l (numbers)."
@@ -78,19 +125,26 @@ define* : write-multiple . x
;; Start with the simple case: One variable and independent observations (R diagonal)
;; First define a truth
-define x^seed '(0.5 0.6 2 0.1) ; 0.7 0.9 0.8 0.4)
+define x^seed '(-2 3 -1) ; 0.7 0.9 0.8 0.4)
+define x^seed-std '(3 4 2) ; 0.2 0.2 0.2 0.2)
;; The size is the length of the seed, squared, each multiplied by each
define x^true : append-ec (: i (length x^seed)) : list-ec (: j x^seed) : * j : list-ref x^seed i
;; And add an initial guess of the parameters
-define x^b : append-ec (: i (length x^seed)) '(1 1 1 1) ; 1 1 1 1) ; initial guess
-define P : make-covariance-matrix-from-standard-deviations : append-ec (: i (length x^seed)) '(0.5 0.1 0.3 0.1) ; 0.2 0.2 0.2 0.2)
+define x^b : list-ec (: i (length x^true)) 1 ; initial guess
+;; set x^b as x^true to test losing uncertainty
+; define x^b x^true
+define x^b-std : append-ec (: i (length x^seed)) x^seed-std
+define P : make-covariance-matrix-from-standard-deviations x^b-std
;; Then generate observations
-define y⁰-num 1000
+define y⁰-num 80
define y⁰-pos-max 100
+define y⁰-plot-skip : max 1 : * (/ 5 2) {y⁰-num / y⁰-pos-max}
;; At the positions where they are measured. Drawn randomly to avoid
;; giving an undue weight to later values.
-define y⁰-pos : list-ec (: i y⁰-num) : * (random:uniform) y⁰-pos-max
+define y⁰-pos-sorted : list-ec (: i y⁰-num) : exact->inexact : * y⁰-pos-max : / i y⁰-num
+define y⁰-pos-random : list-ec (: i y⁰-num) : * (random:uniform) y⁰-pos-max
+define y⁰-pos y⁰-pos-random
define : H-single-parameter xi xi-pos pos
. "Observation function for a single parameter."
@@ -103,6 +157,15 @@ define : H-single-parameter xi xi-pos po
* xi pos
exp : - : expt xi-posdist 2
+define : H-single-parameter-sinx/x xi xi-pos pos
+ . "Observation function for a single parameter."
+ let*
+ : xi-posdist : abs : / {pos - xi-pos} {y⁰-pos-max / 26.4} ; for (2 2 2 2) this just barely does resolves the two central values
+ * xi 15
+ / : sin xi-posdist
+ . xi-posdist
+
+
;; We need an observation operator to generate observations from true values
define : H x pos
. "Observation operator. It generates modelled observations from the input.
@@ -112,19 +175,18 @@ x are parameters to be optimized, pos is
let*
: len : length x
ystretch y⁰-pos-max
- x-pos : list-ec (: i len) : * ystretch {{i + 0.5} / {len + 1}}
- apply +
- list-ec (: i len)
- H-single-parameter
- list-ref x i
- list-ref x-pos i
- . pos
+ x-pos : list-ec (: i len) : * ystretch {{i + 0.5} / len}
+ sum-ec (: i len)
+ H-single-parameter-sinx/x
+ list-ref x i
+ list-ref x-pos i
+ . pos
;; We start with true observations which we will disturb later to get
;; the equivalent of measured observations
define y^true : list-ec (: i y⁰-pos) : H x^true i
;; now we disturb the observations with a fixed standard deviation. This assumes uncorrelated observations.
-define y⁰-std 10
+define y⁰-std 30
define y⁰ : list-ec (: i y^true) : + i : * y⁰-std : random:normal
;; and define the covariance matrix. This assumes uncorrelated observations.
define R : make-covariance-matrix-from-standard-deviations : list-ec (: i y⁰-num) y⁰-std
@@ -134,24 +196,43 @@ define R : make-covariance-matrix-from-s
;; The actual observations
;; define y⁰ : list-ec (: i y⁰-num) : + y⁰-mean : * y⁰-std : random:normal
+define : matrix-times-vector X y
+ . "Calculate the matrix product of X and Y"
+ list-ec (: row (length X))
+ sum-ec (: i (length y))
+ * : list-ref y i
+ list-ref (list-ref X row) i
-define : EnSRT H x P y R y-pos N
- . "Observation function H, parameters x,
+
+define x^steps '()
+define 1-AK '()
+
+define* : EnSRF H x P y R y-pos N #:key (penalty-function-of-x (λ (x) 0))
+ . "Observation function H, parameters x,
parameter-covariance P, observations y, observation covariance R
and number of ensemble members N.
+TODO: PENALTY-FUNCTION-OF-X is any function which takes the
+parameters X and returns a penalty.
+
Limitations: y is a single value. R and P are diagonal.
"
+ let*
+ : P_copy : list-ec (: j (length P)) : list-ec (: k (length (list-ref P j))) : list-ref (list-ref P j) k
+ L
+ cholesky! P_copy
let step
: observations-to-process y
observation-variances : list-ec (: i (length y)) : list-ref (list-ref R i) i
observation-positions y-pos
x^b x
- x-deviations
+ x-deviations ; multiply the sqrt of P (L with LLt=P) with a vector with random perturbations
list-ec (: i N)
- list-ec (: j (length x))
+ matrix-times-vector L
+ list-ec (: j (length x))
* : random:normal
- sqrt : list-ref (list-ref P j) j ; only for diagonal P!
+ . 1 ; sqrt : list-ref (list-ref P j) j ; only for diagonal P!
+ set! x^steps : cons x-deviations x^steps
cond
: null? observations-to-process
list x^b x-deviations
@@ -160,12 +241,12 @@ Limitations: y is a single value. R and
; newline
let*
: y_cur : car observations-to-process
- R_cur : car observation-variances
+ R_cur : * 1 : car observation-variances
y-pos_cur : car observation-positions
Hx^b_i
list-ec (: i x-deviations)
H
- list-ec (: j (length i))
+ list-ec (: j (length i))
+ (list-ref x^b j) (list-ref i j)
. y-pos_cur
Hx^b
@@ -182,7 +263,7 @@ Limitations: y is a single value. R and
list-ec (: j (length x^b)) ; for each x^b_i multiply the state-element and model-deviation for all ensemble members.
* {1 / {N - 1}}
sum-ec (: i N)
- * : list-ref (list-ref x-deviations i) j ; FIXME: this currently does not use j because I only do length 1 x
+ * : list-ref (list-ref x-deviations i) j
list-ref Hx^b-prime i
K : list-ec (: i PHt) {i / {HPHt + R_cur}}
x^a
@@ -199,6 +280,11 @@ Limitations: y is a single value. R and
* α
list-ref K j
list-ref Hx^b-prime i
+ if : equal? 1-AK '()
+ set! 1-AK : list-ec (: i K) {1 - i} ; init
+ set! 1-AK : list-ec (: i (length K)) : * (list-ref 1-AK i) {1 - (abs (list-ref K i))}
+ ;; display 1-AK ; TODO: What does this actually signify?
+ ;; newline
step
cdr observations-to-process
cdr observation-variances
@@ -207,36 +293,80 @@ Limitations: y is a single value. R and
. x^a-deviations
+define : x-deviations->y-deviations H x-opt x-deviations y⁰-pos
+ . "Calculate y-deviations for each measurement from the x-deviations.
+
+ return ((y_0'0 y_0'1 ...) ...)
+ "
+ define (~ li i) (list-ref li i)
+ ; for each ensemble member calculate the y-deviations
+ let*
+ : y-opt : map (λ (x) (H x-opt x)) y⁰-pos
+ y-ensemble
+ list-ec (: x-dev x-deviations) ; x-dev has one number (x'_i) per x-parameter
+ let*
+ : ; calculate x-parameters for the ensemble
+ x-opt+dev
+ list-ec (: j (length x-opt))
+ + : ~ x-opt j
+ ~ x-dev j
+ ; calculate all y-values for the ensemble
+ y-opt+dev : map (λ (x) (H x-opt+dev x)) y⁰-pos
+ ; calculate all differences
+ map (λ (x y) (- x y)) y-opt+dev y-opt
+ ; reshape into one ensemble per value
+ list-ec (: ensidx (length (~ y-ensemble 0)))
+ list-ec (: obsidx (length y-ensemble))
+ ~ (~ y-ensemble obsidx) ensidx
+
+define : flatten li
+ append-ec (: i li) i
+
define : main args
let*
- : optimized : EnSRT H x^b P y⁰ R y⁰-pos 40
+ : ensemble-member-count 32
+ ensemble-member-plot-skip 4
+ optimized : EnSRF H x^b P y⁰ R y⁰-pos ensemble-member-count
x-opt : list-ref optimized 0
x-deviations : list-ref optimized 1
- ; std : sqrt : * {1 / {(length x-deviations) - 1}} : sum-ec (: i x-deviations) : expt i 2
- format #t "x⁰: ~A ± ~A\nx: ~A ± ~A\nx^t: ~A\nx-t/σ:~A\ny̅: ~A ± ~A\ny̅⁰: ~A ± ~A\ny̅^t: ~A\nnoise:~A\n"
+ x-std
+ list-ec (: i (length x-opt))
+ apply standard-deviation-from-deviations : list-ec (: j x-deviations) : list-ref j i
+ y-deviations : x-deviations->y-deviations H x-opt x-deviations y⁰-pos
+ x^b-deviations-approx
+ list-ec (: i ensemble-member-count)
+ list-ec (: j (length x^b))
+ * : random:normal
+ sqrt : list-ref (list-ref P j) j ; only for diagonal P!
+ y^b-deviations : x-deviations->y-deviations H x^b x^b-deviations-approx y⁰-pos
+ y-std
+ apply standard-deviation-from-deviations
+ flatten y-deviations
+ y-stds : list-ec (: i y-deviations) : apply standard-deviation-from-deviations i
+ y^b-stds : list-ec (: i y^b-deviations) : apply standard-deviation-from-deviations i
+ σ
+ list-ec (: i (length x-opt))
+ apply standard-deviation-from-deviations : list-ec (: j x-deviations) : list-ref j i
+ Δ/σ
+ list-ec (: i (length x-opt))
+ / : - (list-ref x-opt i) (list-ref x^true i)
+ list-ref σ i
+ format #t "x⁰: ~A\n ± ~A\nx: ~A\n ± ~A\nx^t: ~A\nx-t/σ: ~A\n√Σ(Δ/σ)²/N:~A\n√Σσ²: ~A\ny̅: ~A ± ~A\ny̅⁰: ~A ± ~A\ny̅^t: ~A\nnoise: ~A\n"
. x^b
list-ec (: i (length x^b)) : list-ref (list-ref P i) i
. x-opt
- list-ec (: i (length x-opt))
- apply standard-deviation-from-deviations : list-ec (: j x-deviations) : list-ref j i
+ . x-std
. x^true
- list-ec (: i (length x-opt))
- / : - (list-ref x-opt i) (list-ref x^true i)
- apply standard-deviation-from-deviations : list-ec (: j x-deviations) : list-ref j i
- * {1 / (length y⁰)} : apply + : map (lambda (x) (H x-opt x)) y⁰-pos
- apply standard-deviation-from-deviations
- append-ec (: i (length x-deviations))
- let*
- :
- x-opt+dev
- list-ec (: j (length x-opt))
- + : list-ref x-opt j
- list-ref
- list-ref x-deviations i
- . j
- y-opt+dev : map (lambda (x) (H x-opt+dev x)) y⁰-pos
- y-opt : map (lambda (x) (H x-opt x)) y⁰-pos
- map (lambda (x y) (- x y)) y-opt+dev y-opt
+ . Δ/σ
+ * {1 / (length Δ/σ)}
+ sqrt
+ sum-ec (: i Δ/σ)
+ expt i 2
+ sqrt
+ sum-ec (: i σ)
+ expt i 2
+ mean : map (lambda (x) (H x-opt x)) y⁰-pos
+ . y-std
; list-ec (: i (length y-opt))
; - (list-ref y-opt+dev i) (list-ref y-opt i)
; apply standard-deviation-from-deviations : map H x-deviations ; FIXME: This only works for trivial H.
@@ -245,18 +375,31 @@ define : main args
* {1 / (length y⁰)} : apply + : map (lambda (x) (H x^true x)) y⁰-pos
. y⁰-std
; now plot the result
- let : : port : open-output-pipe "python"
- format port "import pylab as pl\n"
+ let : : port : open-output-pipe "python2"
+ format port "import pylab as pl\nimport matplotlib as mpl\n"
format port "y0 = [float(i) for i in '~A'[1:-1].split(' ')]\n" y⁰
+ format port "yerr = ~A\n" y⁰-std
format port "ypos = [float(i) for i in '~A'[1:-1].split(' ')]\n" y⁰-pos
format port "yinit = [float(i) for i in '~A'[1:-1].split(' ')]\n" : list-ec (: i y⁰-pos) : H x^b i
+ format port "yinitstds = [float(i) for i in '~A'[1:-1].split(' ')]\n" y^b-stds
format port "ytrue = [float(i) for i in '~A'[1:-1].split(' ')]\n" : list-ec (: i y⁰-pos) : H x^true i
format port "yopt = [float(i) for i in '~A'[1:-1].split(' ')]\n" : list-ec (: i y⁰-pos) : H x-opt i
- format port "pl.plot(*zip(*sorted(zip(ypos, yinit))), label='prior')\n"
+ format port "yoptstds = [float(i) for i in '~A'[1:-1].split(' ')]\n" y-stds
+ format port "pl.errorbar(*zip(*sorted(zip(ypos, yinit))), yerr=zip(*sorted(zip(ypos, yinitstds)))[1], label='prior')\n"
format port "pl.plot(*zip(*sorted(zip(ypos, ytrue))), label='true')\n"
- format port "pl.plot(*zip(*sorted(zip(ypos, yopt))), label='optimized')\n"
- format port "pl.plot(*zip(*sorted(zip(ypos, y0))), marker='+', linewidth=0, label='measurements')\n"
- format port "pl.legend()\n"
+ format port "pl.errorbar(*zip(*sorted(zip(ypos, yopt))), yerr=zip(*sorted(zip(ypos, yoptstds)))[1], label='optimized')\n"
+ format port "eb=pl.errorbar(*zip(*sorted(zip(ypos, y0))), yerr=yerr, alpha=0.6, marker='+', linewidth=0, label='measurements')\neb[-1][0].set_linewidth(1)\n"
+ list-ec (: step 0 (length x^steps) y⁰-plot-skip)
+ let : : members : list-ref x^steps (- (length x^steps) step 1)
+ list-ec (: member-idx 0 (length members) ensemble-member-plot-skip) ; reversed
+ let : : member : list-ref members member-idx
+ format port "paired = pl.get_cmap('Paired')
+cNorm = mpl.colors.Normalize(vmin=~A, vmax=~A)
+scalarMap = mpl.cm.ScalarMappable(norm=cNorm, cmap=paired)\n" 0 (length member)
+ list-ec (: param-idx 0 (length member) 4) ; step = 4
+ ; plot parameter 0
+ format port "pl.plot(~A, ~A, marker='.', color=scalarMap.to_rgba(~A), linewidth=0, label='', alpha=0.6, zorder=-1)\n" (/ step y⁰-plot-skip) (+ 80 (* 60 (list-ref member param-idx))) param-idx
+ format port "pl.legend(loc='upper right')\n"
format port "pl.xlabel('position [arbitrary units]')\n"
format port "pl.ylabel('value [arbitrary units]')\n"
format port "pl.title('ensemble optimization results')\n"
diff --git a/examples/enter-three-witches.scm b/examples/enter-three-witches.scm
new file mode 100644
--- /dev/null
+++ b/examples/enter-three-witches.scm
@@ -0,0 +1,267 @@
+#!/usr/bin/env sh
+(# -*- wisp -*-)
+(guile -L $(dirname $(dirname $(realpath "$0"))) -c '(import (wisp-scheme) (language wisp spec))')
+(exec guile -L $(dirname $(dirname $(realpath "$0"))) --language=wisp -e '(@@ (examples enter-three-witches) main)' -s "$0" "$@")
+; !#
+
+(define-module (examples enter-three-witches)
+ #:export (introduced-names ->string show colortable color say-words say-name say Speak Speak-indirect Enter Scene))
+
+(use-modules (ice-9 optargs)
+ (srfi srfi-1)
+ (system syntax))
+
+;; FIXME: This version currently does not allow using the same first
+;; name several times. It will need a more refined macro generator
+;; which first gathers all the necessary definitions and then builds
+;; them.
+
+(define introduced-names '())
+
+(define (->string x)
+ (cond
+ ((symbol? x)
+ (symbol->string x))
+ ((number? x)
+ (format #f "~a" x))
+ (else
+ (format #f "~A" x))))
+
+
+(define (show str)
+ (let lp ((chars (string->list str)))
+ (cond
+ ((null? chars)
+ #t)
+ (else
+ (display (car chars))
+ (usleep 60000)
+ (lp (cdr chars))))))
+
+
+(define colortable
+ `(
+ (#f . "\x1b[0m")
+ (black . "\x1b[1;30m")
+ (red . "\x1b[1;31m")
+ (green . "\x1b[1;32m")
+ (yellow . "\x1b[1;33m")
+ (blue . "\x1b[1;34m")
+ (magenta . "\x1b[1;35m")
+ (cyan . "\x1b[1;36m")
+ (white . "\x1b[1;37m")))
+
+
+(define (color col)
+ "helper function to colorize the input"
+ (cond
+ ((assoc col colortable)
+ (format #t (assoc-ref colortable col))
+ #f)
+ (else
+ (format #t (assoc-ref colortable #f))
+ #f)))
+
+(define-syntax say-words
+ (lambda (x)
+ (syntax-case x ()
+ ((_ (((word words ...))) (() lines ...))
+ #`(begin
+ (let ((w `word))
+ (cond
+ ((equal? w #f)
+ #f)
+ ((equal? w '..)
+ (show "."))
+ (else
+ (show " ")
+ (show (->string w)))))
+ (say-words (((words ...))) (() lines ...))))
+ ((_ ((())) (() lines ...))
+ #`(begin
+ (usleep 200000)
+ (newline)
+ (say-words (lines ...))))
+ ;; lines of form ,(...)
+ ((_ ((unq (word words ...)) lines ...))
+ #`(begin if (equal 'unquote `unq))
+ #`(begin ; add an extra level of parens
+ (show " ")
+ (say-words ((((unq (word words ...))))) (() lines ...))))
+ ((_ ((word words ...) lines ...))
+ #`(begin
+ (show " ")
+ (say-words (((word words ...))) (() lines ...))))
+ ((_ (() lines ...))
+ #`(say-words (lines ...)))
+ ((_ (lines ...))
+ #`(begin
+ (newline))))))
+
+
+(define (say-name nameparts)
+ (let
+ ;; symbols starting with : are not treated as part of the
+ ;; name. They can be used as actor instructions
+ ((pure-name (remove (lambda (x) (string-prefix? ":" (symbol->string x))) (remove pair? nameparts))))
+ (if (not (member pure-name introduced-names))
+ (error
+ (format #f "Tried to use ~A who did not Enter. Introduced names: ~A"
+ pure-name introduced-names))))
+ (format #t "~A\n"
+ (string-join (map symbol->string nameparts))))
+
+
+(define-syntax say
+ (lambda (x)
+ (syntax-case x ()
+ ((_ nameparts lines)
+ #`(begin
+ (say-name nameparts)
+ (say-words lines))))))
+
+
+(define-syntax Speak
+ (lambda (x)
+ (with-ellipsis :::
+ (syntax-case x ()
+ ;; Support form for modifiers: enclose by double parens (used later)
+ ((_ (((name :::))) ((mod :::)) (word :::) line :::)
+ #`(begin
+ (say-name (quasiquote (name ::: mod :::)))
+ (say-words ((word :::) line :::))))
+ ;; extend mod keywords
+ ((_ (((name :::))) ((mod :::)) modifier line :::)
+ ;; extend the modifier keyword list
+ #`(Speak (((name :::))) ((mod ::: modifier)) line :::))
+ ;; say form without modifier
+ ((_ (((name :::))) (word :::) line :::)
+ #`(Speak (((name :::))) (()) (word :::) line :::))
+ ;; first modifier keyword after the name
+ ((_ (((name :::))) modifier line :::)
+ ;; append to mod helper form
+ #`(Speak (((name :::))) ((modifier)) line :::))
+ ;; Strip the name from lines with empty arguments
+ ((_ (((name :::))) symbol :::)
+ #`(begin #t symbol :::))))))
+
+
+(define-syntax Speak-indirect
+ (lambda (x)
+ (syntax-case x ()
+ ;; Adjust name and lines for Speak for the case where I
+ ;; cannot match for the whole name.
+ ;; input: (((name1 name2 ... (word ...) ...)))
+
+ ;; grab the lines one by one from the back
+ ((_ (((symbols ... (word ...)))) lines ...)
+ #`(Speak-indirect (((symbols ...))) (word ...) lines ...))
+ ;; start with the last line
+ ((_ (((symbols ... (word ...)))))
+ #`(Speak-indirect (((symbols ...))) (word ...)))
+ ;; no more lines remain at the end: the rest must be the name
+ ((_ (((name ...))) lines ...)
+ #`(Speak (((name ...))) lines ...)))))
+
+
+(define-syntax Enter
+ (lambda (x)
+ (syntax-case x ()
+ ((_ (name more ...) b ...)
+ ; new binding: only create it if the binding is not already a macro
+ (not (eq? 'macro (syntax-local-binding (syntax name))))
+ #'(begin
+ ;; process the name: define special syntax for this name (only
+ ;; for the first word of the name, the correctness of the rest
+ ;; of the words is checked at runtime in the say procedure)
+ (define-syntax name
+ (lambda (y)
+ (with-ellipsis :::
+ (syntax-case y (more ...)
+ ; just forward matching rules to Speak
+ ((_ more ... symbol :::)
+ #'(Speak (((name more ...))) symbol :::))
+ ((_ symbols :::)
+ ; this does not correctly make the second name part of
+ ; the name, preventing differentiation between name and
+ ; modifier
+ #`(Speak-indirect (((name symbols :::)))))))))
+ ;; process the rest of the names
+ (Enter b ...)
+ ;; record that the name was introduced. I do not see a way to do
+ ;; this directly in the compiler, therefore it is checked later
+ ;; during runtime.
+ (set! introduced-names (cons '(name more ...) introduced-names))))
+ ;; add debug output, must be added it here, not in front
+ ; write
+ ; quote : list Enter (name more ...) b ...
+ ; newline
+ ((_ (name more ...) b ...)
+ ; existing binding: Just allow using this.
+ #'(begin
+ (Enter b ...)
+ (set! introduced-names (cons '(name more ...) introduced-names))))
+ ((_ b ...)
+ #'(begin #t)))))
+
+
+(define-syntax Scene
+ (lambda (x)
+ (syntax-case x ()
+ ((_ thisscene args ...)
+ (with-syntax ((c (datum->syntax x (module-name (current-module)))))
+ #`(begin ; FIXME: this currently requires the Scene identifier to be a valid symbol -> cannot use "Scene 1"
+ (module-re-export! (current-module)
+ (module-map (λ (x y) x)
+ (module-import-interface (current-module) 'Scene ))); ensure that all symbols remain available
+ (define-module (scene thisscene))
+ (import c)
+ #t))))))
+
+
+(define (main args)
+ (Enter (First Witch)
+ (Second Witch)
+ (Third Witch)
+ (First Eldritch))
+
+ (First Witch
+ (When shall we three meet again)
+ (In ,(color 'cyan) thunder, ,(color #f) ,(color 'white) lightning, ,(color #f) or in ,(color 'blue) rain? ,(color #f)))
+
+ (Second Witch :resolute
+ (When the hurlyburly's done, (we ,(+ 1 2)) ); inline-code is allowed!
+ (When the ,(color 'red) battle's ,(color #f)
+ lost and won. )); ,(read-char) ; and executed when the word is shown
+
+ (Third Witch
+ (That will be ere the set of ,(color 'yellow) sun ,(color #f) ..))
+ ; .. can be used for a . without preceding space. It MUST be
+ ; used to get a trailing .
+
+ (First Eldritch :crazy
+ (,(color 'magenta) gnignigni! ,(color #f)))
+
+ (Enter (Second Eldritch))
+
+ (Second Eldritch :quick
+ (,(color 'black) Guh!)
+ ; . :goo ; invalid ⇒ would be an error
+ ; . foo ; invalid ⇒ would be an error
+ (Moo ,(color #f))))
+
+;; Making the name longer throws an Error, but only at runtime:
+; Second Eldritch shoo
+; Guh!
+;; ⇒ ERROR: Tried to use (Second Eldritch shoo) who did not Enter. Introduced names: ((Second Eldritch) (First Witch) (Second Witch) (Third Witch) (First Eldritch))
+
+;; Adding one who did not enter throws an Error, but only at runtime:
+; Third Eldritch
+; Guh!
+;; ⇒ ERROR: Tried to use (Third Eldritch) who did not Enter. Introduced names: ((Second Eldritch) (First Witch) (Second Witch) (Third Witch) (First Eldritch))
+
+
+
+
+
+
diff --git a/examples/enter-three-witches.w b/examples/enter-three-witches.w
--- a/examples/enter-three-witches.w
+++ b/examples/enter-three-witches.w
@@ -1,49 +1,309 @@
#!/usr/bin/env sh
+# -*- wisp -*-
+guile -L $(dirname $(dirname $(realpath "$0"))) -c '(import (wisp-scheme) (language wisp spec))'
exec guile -L $(dirname $(dirname $(realpath "$0"))) --language=wisp -e '(@@ (examples enter-three-witches) main)' -s "$0" "$@"
; !#
define-module : examples enter-three-witches
+ . #:export : introduced-names ->string show colortable color say-words say-name say Speak Speak-indirect Enter Scene
use-modules : ice-9 optargs
+ srfi srfi-1
+ system syntax
+ ice-9 rdelim
+
+;; FIXME: This version currently does not allow using the same first
+;; name several times. It will need a more refined macro generator
+;; which first gathers all the necessary definitions and then builds
+;; them.
+
+define introduced-names '()
+
+define : ->string x
+ cond
+ : symbol? x
+ symbol->string x
+ : number? x
+ format #f "~a" x
+ else
+ format #f "~A" x
+
+
+define : show str
+ let lp : : chars : string->list str
+ cond
+ : null? chars
+ . #t
+ else
+ display : car chars
+ usleep 60000
+ lp : cdr chars
+
+
+define colortable
+ `
+ #f . "\x1b[0m"
+ black . "\x1b[1;30m"
+ red . "\x1b[1;31m"
+ green . "\x1b[1;32m"
+ yellow . "\x1b[1;33m"
+ blue . "\x1b[1;34m"
+ magenta . "\x1b[1;35m"
+ cyan . "\x1b[1;36m"
+ white . "\x1b[1;37m"
+
+
+define : color col
+ . "helper function to colorize the input"
+ cond
+ : assoc col colortable
+ format #t : assoc-ref colortable col
+ . #f
+ else
+ format #t : assoc-ref colortable #f
+ . #f
+
+define-syntax say-words
+ lambda (x)
+ syntax-case x (fdb6c10f-f8bf-4bb5-82c5-d3a5cd37b7c0)
+ : _ (((word words ...))) fdb6c10f-f8bf-4bb5-82c5-d3a5cd37b7c0 (() lines ...)
+ ;; TODO: move out to a helper macro
+ #` begin
+ let : : w `word
+ cond
+ : equal? w #f
+ . #f
+ : equal? w '..
+ show "."
+ else
+ show " "
+ show : ->string w
+ say-words (((words ...))) fdb6c10f-f8bf-4bb5-82c5-d3a5cd37b7c0 (() lines ...)
+ : _ ((())) fdb6c10f-f8bf-4bb5-82c5-d3a5cd37b7c0 (() lines ...)
+ #` begin
+ usleep 200000
+ newline
+ say-words (lines ...)
+ ;; lines of form ,(...)
+ : _ ((unq (word words ...)) lines ...)
+ #` if : equal? 'unquote `unq ;; FIXME: This guard seems to not actually work
+ #` begin ; add an extra level of parens
+ show " "
+ say-words (((unq (word words ...)))) fdb6c10f-f8bf-4bb5-82c5-d3a5cd37b7c0 (() lines ...)
+ : _ (((unq word)) lines ...)
+ #` if : equal? 'unquote-splicing `unq ;; FIXME: This guard seems to not actually work
+ #` begin ; include the unquoting without extra level of parentheses
+ ;; TODO: clean this up. This duplicates logic in the first case, and duplicates it again internally.
+ show " "
+ apply
+ λ (unq x)
+ cond
+ : equal? 'unquote-splicing unq
+ map (λ (x) (show " ")(show x))
+ if : pair? x
+ map ->string x
+ . x
+ : equal? 'unquote unq
+ cond
+ : equal? x #f
+ . #f
+ : equal? x '..
+ show "."
+ else
+ show " "
+ show : ->string x
+ else
+ cond
+ : equal? unq #f
+ . #f
+ : equal? unq '..
+ show "."
+ else
+ show " "
+ show : ->string unq
+ cond
+ : equal? x #f
+ . #f
+ : equal? x '..
+ show "."
+ else
+ show " "
+ show : ->string x
+ list 'unq word
+ say-words ((())) fdb6c10f-f8bf-4bb5-82c5-d3a5cd37b7c0 (() lines ...)
+ : _ ((word words ...) lines ...) ; start of a line
+ #` begin
+ show " "
+ say-words (((word words ...))) fdb6c10f-f8bf-4bb5-82c5-d3a5cd37b7c0 (() lines ...)
+ : _ (() lines ...) ; finished showing the line, show the next one
+ #` say-words (lines ...)
+ : _ (lines ...)
+ #` begin
+ newline
+
+
+define : say-name nameparts
+ let
+ ;; symbols starting with : are not treated as part of the
+ ;; name. They can be used as actor instructions
+ : pure-name : remove (lambda (x) (string-prefix? ":" (symbol->string x))) : remove pair? nameparts
+ if : not : member pure-name introduced-names
+ error
+ format #f "Tried to use ~A who did not Enter. Introduced names: ~A"
+ . pure-name introduced-names
+ format #t "~A\n"
+ string-join : map symbol->string nameparts
+
+
+define-syntax say
+ lambda (x)
+ syntax-case x ()
+ : _ nameparts lines
+ #` begin
+ say-name nameparts
+ say-words lines
+
+
+define-syntax Speak
+ lambda (x)
+ with-ellipsis :::
+ syntax-case x ()
+ ;; Support form for modifiers: enclose by double parens (used later)
+ : _ (((name :::))) ((mod :::)) (word :::) line :::
+ #` begin
+ say-name : quasiquote : name ::: mod :::
+ say-words : (word :::) line :::
+ ;; extend mod keywords
+ : _ (((name :::))) ((mod :::)) modifier line :::
+ ;; extend the modifier keyword list
+ #` Speak (((name :::))) ((mod ::: modifier)) line :::
+ ;; say form without modifier
+ : _ (((name :::))) (word :::) line :::
+ #` Speak (((name :::))) (()) (word :::) line :::
+ ;; first modifier keyword after the name
+ : _ (((name :::))) modifier line :::
+ ;; append to mod helper form
+ #` Speak (((name :::))) ((modifier)) line :::
+ ;; Strip the name from lines with empty arguments
+ : _ (((name :::))) symbol :::
+ #` begin #t symbol :::
+
+
+define-syntax Speak-indirect
+ lambda (x)
+ syntax-case x ()
+ ;; Adjust name and lines for Speak for the case where I
+ ;; cannot match for the whole name.
+ ;; input: (((name1 name2 ... (word ...) ...)))
+
+ ;; grab the lines one by one from the back
+ : _ (((symbols ... (word ...)))) lines ...
+ #` Speak-indirect (((symbols ...))) (word ...) lines ...
+ ;; start with the last line
+ : _ (((symbols ... (word ...))))
+ #` Speak-indirect (((symbols ...))) (word ...)
+ ;; no more lines remain at the end: the rest must be the name
+ : _ (((name ...))) lines ...
+ #` Speak (((name ...))) lines ...
+
define-syntax Enter
- syntax-rules ()
- : _ (name) b ...
- begin
- define-syntax name
- syntax-rules ::: ()
- : _ (c :::) d :::
- format #t "~A\n ~A\n\n"
- string-join
- string-split (symbol->string 'name) #\_
- string-join
- map : lambda (x) (string-join (map symbol->string x))
- quote : (c :::) d :::
- . "\n "
- : _ c d :::
- ;; allow for modifier keywords after the name
- begin
- format #t "~A:\n" : symbol->string 'c
- name d :::
- : _ c :::
- begin #t c :::
- Enter b ...
- : _ b ...
- begin
+ lambda (x)
+ syntax-case x ()
+ : _ (name more ...) b ...
+ ; new binding: only create it if the binding is not already a macro
+ not : eq? 'macro (syntax-local-binding (syntax name))
+ #' begin
+ ;; process the name: define special syntax for this name (only
+ ;; for the first word of the name, the correctness of the rest
+ ;; of the words is checked at runtime in the say procedure)
+ define-syntax name
+ lambda (y)
+ with-ellipsis :::
+ syntax-case y (more ...)
+ ; just forward matching rules to Speak
+ : _ more ... symbol :::
+ #' Speak (((name more ...))) symbol :::
+ : _ symbols :::
+ ; this does not correctly make the second name part of
+ ; the name, preventing differentiation between name and
+ ; modifier
+ #` Speak-indirect (((name symbols :::)))
+ ;; process the rest of the names
+ Enter b ...
+ ;; record that the name was introduced. I do not see a way to do
+ ;; this directly in the compiler, therefore it is checked later
+ ;; during runtime.
+ set! introduced-names : cons '(name more ...) introduced-names
+ ;; add debug output, must be added it here, not in front
+ ; write
+ ; quote : list Enter (name more ...) b ...
+ ; newline
+ : _ (name more ...) b ...
+ ; existing binding: Just allow using this.
+ #' begin
+ Enter b ...
+ set! introduced-names : cons '(name more ...) introduced-names
+ : _ b ...
+ #' begin #t
+
+
+define-syntax Scene
+ lambda (x)
+ syntax-case x ()
+ : _ thisscene args ...
+ with-syntax ((c (datum->syntax x (module-name (current-module)))))
+ #` begin ; FIXME: this currently requires the Scene identifier to be a valid symbol -> cannot use "Scene 1"
+ module-re-export! (current-module)
+ module-map (λ (x y) x)
+ module-import-interface (current-module) 'Scene ; ensure that all symbols remain available
+ define-module (scene thisscene)
+ import c
+ . #t
define : main args
- Enter : First_Witch
- Second_Witch
- Third_Witch
-
- First_Witch
+ Enter : First Witch
+ Second Witch
+ Third Witch
+ First Eldritch
+
+ First Witch
When shall we three meet again
- In thunder, lightning, or in rain?
+ In ,(color 'cyan) thunder, ,(color #f) ,(color 'white) lightning, ,(color #f) or in ,(color 'blue) rain? ,(color #f)
+
+ Second Witch :resolute
+ When the hurlyburly's done, (we ,(+ 1 2)) ; inline-code is allowed!
+ When the ,(color 'red) battle's ,(color #f)
+ . lost and won. ; ,(read-char) ; and executed when the word is shown
+
+ Third Witch
+ That will be ere the set of ,(color 'yellow) sun ,(color #f) ..
+ ; .. can be used for a . without preceding space. It MUST be
+ ; used to get a trailing .
+
+ First Eldritch :crazy
+ ,(color 'magenta) gnignigni! ,(color #f)
+
+ Enter : Second Eldritch
- Second_Witch
- When the hurlyburly's done,
- When the battle's lost and won.
+ Second Eldritch :quick
+ ,(color 'black) Guh!
+ ; . :goo ; invalid ⇒ would be an error
+ ; . foo ; invalid ⇒ would be an error
+ Moo ,(color #f)
- Third_Witch
- That will be ere the set of sun.
+;; Making the name longer throws an Error, but only at runtime:
+; Second Eldritch shoo
+; Guh!
+;; ⇒ ERROR: Tried to use (Second Eldritch shoo) who did not Enter. Introduced names: ((Second Eldritch) (First Witch) (Second Witch) (Third Witch) (First Eldritch))
+
+;; Adding one who did not enter throws an Error, but only at runtime:
+; Third Eldritch
+; Guh!
+;; ⇒ ERROR: Tried to use (Third Eldritch) who did not Enter. Introduced names: ((Second Eldritch) (First Witch) (Second Witch) (Third Witch) (First Eldritch))
+
+
+
+
+
diff --git a/examples/evolve.w b/examples/evolve.w
--- a/examples/evolve.w
+++ b/examples/evolve.w
@@ -7,8 +7,6 @@ exec guile -L $(dirname $(dirname $(real
; TODO: genetic with mutate+combinate, population which keeps the best and directed which only keeps improvements
-; NOTE: This only works after preprocessing to scheme.
-
define-module : examples evolve
. #:export : main
@@ -156,7 +154,3 @@ define : main args
newline
-define : main
- display "foo"
- newline
- run
diff --git a/examples/ild.w b/examples/ild.w
new file mode 100755
--- /dev/null
+++ b/examples/ild.w
@@ -0,0 +1,16 @@
+#!/usr/bin/env sh
+# -*- wisp -*-
+D="$(dirname $(realpath "$0"))"
+W="$(dirname $(dirname $(realpath "$0")))"
+guile -L "$W" -c '(import (wisp-scheme) (language wisp spec))'
+exec guile -L "$W" --language=wisp -l "$D/enter-three-witches.w" -s "$0" "$@"
+; !#
+
+import : examples enter-three-witches
+
+Enter : Dr. Arne Bab.
+
+Dr. Arne Bab.
+ Hallo Liebste,
+ ,(color 'red) Ich ,(color 'yellow) liebe ,(color 'red) Dich ,(color #f)
+ Dein Arne
diff --git a/examples/map-product-sums.w b/examples/map-product-sums.w
old mode 100644
new mode 100755
--- a/examples/map-product-sums.w
+++ b/examples/map-product-sums.w
@@ -2,9 +2,9 @@
exec guile -L $(dirname $(dirname $(realpath "$0"))) --language=wisp -e '(@@ (examples map-product-sums) main)' -s "$0" "$@"
; !#
-use-modules : (srfi srfi-42)
+define-module : examples map-product-sums
-define-module : examples map-product-sums
+use-modules : srfi srfi-42
define : list-product-sums list-of-numbers
. "return a list with the sum of the products of each number with all other numbers.
diff --git a/examples/unbiased-std.w b/examples/unbiased-std.w
new file mode 100644
--- /dev/null
+++ b/examples/unbiased-std.w
@@ -0,0 +1,31 @@
+define-module : example unbiased-std
+ . #:export : std
+
+define factors⁻¹
+ ' ;; from https://en.wikipedia.org/wiki/Unbiased_estimation_of_standard_deviation#Results_for_the_normal_distribution
+ 2 . 0.7978845608
+ 3 . 0.8862269255
+ 4 . 0.9213177319
+ 5 . 0.9399856030
+ 6 . 0.9515328619
+ 7 . 0.9593687891
+ 8 . 0.9650304561
+ 9 . 0.9693106998
+ 10 . 0.9726592741
+
+define : std . vals
+ . "Calculate the unbiased standard deviation of the values (the biased std for more than 10 values)."
+ let : : len : length vals
+ if : < len 2
+ . +inf.0
+ let
+ : mean (/ (apply + vals) len)
+ factor (or (assoc-ref factors⁻¹ len) 1)
+ * (/ 1 factor) : sqrt : * (/ 1 (- len 1)) : apply + : map (λ(x) (expt (- x mean) 2)) vals .
+
+;; quick test
+let : : res : std 0 0 3
+ when : not : > 0.01 : abs : - res : * 1.129 : sqrt 3 ;; calculated by hand
+ format #t "Bug: (std 0 0 3) gives ~a instead of 1.995\n" res
+
+write : std 5860.16 6141.81 6088.67
diff --git a/examples/unicode-math-fun.w b/examples/unicode-math-fun.w
--- a/examples/unicode-math-fun.w
+++ b/examples/unicode-math-fun.w
@@ -1,4 +1,7 @@
-#!/home/arne/wisp/wisp-multiline.sh
+#!/usr/bin/env sh
+# -*- wisp -*-
+guile -L $(dirname $(dirname $(realpath "$0"))) -c '(import (wisp-scheme) (language wisp spec))'
+exec guile -L $(dirname $(dirname $(realpath "$0"))) --language=wisp -s "$0" "$@"
; !#
;; Having fun with unicode and math :)
@@ -6,6 +9,9 @@
define : Σ . n
apply + n
+define : Π . n
+ apply * n
+
define : ∪ . lists
apply append lists
@@ -27,6 +33,8 @@ define : ∩ list1 list2
display : Σ 1 2 8 0 5 7 59 12 5
newline
+display : Π 1 2 8 0 5 7 59 12 5
+newline
display : ∪ '(1 2 3) '(4 5 6)
newline
display : ∩ '(1 789 7 897 89 78 78 97 89 2 3 6) '(4 5 6 2 8 7 879 879 879 879 8797 97 97 987 89789 7 7897 987 897 987 87 897 896)
diff --git a/examples/with.w b/examples/with.w
--- a/examples/with.w
+++ b/examples/with.w
@@ -13,27 +13,44 @@ define-module : examples with
import : oop goops
-define : enter thing
+define : enter thing state
. thing
define-generic enter
-define : exit thing
+define : exit thing state
. thing
define-generic exit
define-syntax with
syntax-rules : as
: _ thing as name thunk ...
- let*
- : name : enter thing
- res : begin thunk ...
- exit thing
- . res
+ let
+ : name #f
+ state #f
+ res #f
+ dynamic-wind
+ λ () : set! name : enter thing state
+ λ () : set! res : begin thunk ...
+ . res
+ λ () ; : exit thing state
+ . res
-define-method : exit (thing <port>)
+define-method : enter (thing <port>) state
. "Ensure that a port is always closed at the end of the with-block."
+ when : not : equal? #f state
+ set-port-column! thing (car state)
+ set-port-line! thing (car (cdr state))
+ . thing
+
+define-method : exit (thing <port>) state
+ . "Ensure that a port is always closed at the end of the with-block."
+ set! state : list (port-line thing) (port-column thing)
close-port thing
define : main args
with (open-file "with.w" "r") as port
format #t "~a\n" : read port
+ format #t "~a\n" : read port
+ format #t "~a\n" : read port
+
+ ;; TODO: test-continuation
diff --git a/examples/y-combinator.w b/examples/y-combinator.w
new file mode 100755
--- /dev/null
+++ b/examples/y-combinator.w
@@ -0,0 +1,85 @@
+#!/usr/bin/env sh
+# -*- wisp -*-
+guile -L $(dirname $(dirname $(realpath "$0"))) -c '(import (wisp-scheme) (language wisp spec))'
+exec guile -L $(dirname $(dirname $(realpath "$0"))) --language=wisp -e '(@@ (examples y-combinator) main)' -s "$0" "$@"
+; !#
+
+define-module : examples y-combinator
+
+;; Poor mans y-combinator from William Byrds talk: https://www.youtube.com/watch?v=OyfBQmvr2Hc&t=2844s
+define fac-pmy-zealous-wisp
+ :
+ λ : !
+ λ : n
+ :
+ ! !
+ . n
+ λ : !
+ λ : n
+ if : zero? n
+ . 1
+ * n
+ :
+ ! !
+ - n 1
+
+define fac-pmy-pragmatic-wisp
+ :
+ λ : !
+ λ : n
+ (! !) n
+ λ : !
+ λ : n
+ if : zero? n
+ . 1
+ * n : (! !) {n - 1}
+
+
+;; Poor mans y-combinator from William Byrds talk: https://www.youtube.com/watch?v=OyfBQmvr2Hc&t=2844s
+define facres-pmy
+ . (((λ (!)
+ (λ (n)
+ ((! !) n)))
+ (λ (!)
+ (λ (n)
+ (if (zero? n)
+ 1
+ (* n ((! !) (- n 1)))))))
+ 5)
+
+;; from rosetta code: https://rosettacode.org/wiki/Y_combinator#Scheme
+define Y
+ λ : h
+ : λ (x) : x x
+ λ : g
+ h : λ args : apply (g g) args
+
+define fac
+ Y
+ λ : f
+ λ : x
+ if : < x 2
+ . 1
+ * x : f : - x 1
+
+define fib
+ Y
+ λ : f
+ λ : x
+ if : < x 2
+ . x
+ + : f : - x 1
+ f : - x 2
+
+
+define : main args
+ display : fac-pmy-zealous-wisp 5
+ newline
+ display : fac-pmy-pragmatic-wisp 5
+ newline
+ display facres-pmy
+ newline
+ display : fac 6
+ newline
+ display : fib 6
+ newline
diff --git a/racket/parse.rkt b/racket/parse.rkt
new file mode 100644
--- /dev/null
+++ b/racket/parse.rkt
@@ -0,0 +1,836 @@
+#lang racket
+
+;; Scheme-only implementation of a wisp-preprocessor which output a
+;; scheme code tree to feed to a scheme interpreter instead of a
+;; preprocessed file.
+
+;; Limitations:
+;; - only unescapes up to 6 leading underscores at line start (\______)
+;; - in some cases the source line information is missing in backtraces.
+;; check for set-source-property!
+
+;; Copyright (C) Arne Babenhauserheide (2014--2015). All Rights Reserved.
+
+;; Permission is hereby granted, free of charge, to any person
+;; obtaining a copy of this software and associated documentation
+;; files (the "Software"), to deal in the Software without
+;; restriction, including without limitation the rights to use, copy,
+;; modify, merge, publish, distribute, sublicense, and/or sell copies
+;; of the Software, and to permit persons to whom the Software is
+;; furnished to do so, subject to the following conditions:
+;;
+;; The above copyright notice and this permission notice shall be
+;; included in all copies or substantial portions of the Software.
+;;
+;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+;; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+;; MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+;; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+;; BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+;; ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+;; CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+;; SOFTWARE.
+
+
+;; Helper functions for the indent-and-symbols data structure: '((indent token token ...) ...)
+(define (line-indent line)
+ (car line))
+
+(define (line-real-indent line)
+ "Get the indentation without the comment-marker for unindented lines (-1 is treated as 0)."
+ (let (( indent (line-indent line)))
+ (if (= -1 indent)
+ 0
+ indent)))
+
+(define (line-code line)
+ (let ((code (cdr line)))
+ ; propagate source properties
+ code))
+
+; literal values I need
+(define readcolon
+ (string->symbol ":"))
+
+(define wisp-uuid "e749c73d-c826-47e2-a798-c16c13cb89dd")
+; define an intermediate dot replacement with UUID to avoid clashes.
+(define repr-dot ; .
+ (string->symbol (string-append "REPR-DOT-" wisp-uuid)))
+
+; allow using reader additions as the first element on a line to prefix the list
+(define repr-quote ; '
+ (string->symbol (string-append "REPR-QUOTE-" wisp-uuid)))
+(define repr-unquote ; ,
+ (string->symbol (string-append "REPR-UNQUOTE-" wisp-uuid)))
+(define repr-quasiquote ; `
+ (string->symbol (string-append "REPR-QUASIQUOTE-" wisp-uuid)))
+(define repr-unquote-splicing ; ,@
+ (string->symbol (string-append "REPR-UNQUOTESPLICING-" wisp-uuid)))
+
+(define repr-syntax ; #'
+ (string->symbol (string-append "REPR-SYNTAX-" wisp-uuid)))
+(define repr-unsyntax ; #,
+ (string->symbol (string-append "REPR-UNSYNTAX-" wisp-uuid)))
+(define repr-quasisyntax ; #`
+ (string->symbol (string-append "REPR-QUASISYNTAX-" wisp-uuid)))
+(define repr-unsyntax-splicing ; #,@
+ (string->symbol (string-append "REPR-UNSYNTAXSPLICING-" wisp-uuid)))
+
+; TODO: wrap the reader to return the repr of the syntax reader
+; additions
+
+(define (match-charlist-to-repr charlist)
+ (let
+ ((chlist (reverse charlist)))
+ (cond
+ ((equal? chlist (list #\.))
+ repr-dot)
+ ((equal? chlist (list #\'))
+ repr-quote)
+ ((equal? chlist (list #\,))
+ repr-unquote)
+ ((equal? chlist (list #\`))
+ repr-quasiquote)
+ ((equal? chlist (list #\, #\@ ))
+ repr-unquote-splicing)
+ ((equal? chlist (list #\# #\' ))
+ repr-syntax)
+ ((equal? chlist (list #\# #\, ))
+ repr-unsyntax)
+ ((equal? chlist (list #\# #\` ))
+ repr-quasisyntax)
+ ((equal? chlist (list #\# #\, #\@ ))
+ repr-unsyntax-splicing)
+ (else
+ #f))))
+
+(define (wisp-read port)
+ "wrap read to catch list prefixes."
+ (let ((prefix-maxlen 4))
+ (let longpeek
+ ((peeked '())
+ (repr-symbol #f))
+ (cond
+ ((or (< prefix-maxlen (length peeked)) (eof-object? (peek-char port)) (equal? #\space (peek-char port)) (equal? #\newline (peek-char port)) )
+ (if repr-symbol ; found a special symbol, return it.
+ ; TODO: Somehow store source-properties. The commented-out code below does not work.
+ ; catch #t
+ ; lambda ()
+ ; write : source-properties symbol-or-symbols
+ ; set-source-property! symbol-or-symbols 'filename : port-filename port
+ ; set-source-property! symbol-or-symbols 'line : 1+ : port-line port
+ ; set-source-property! symbol-or-symbols 'column : port-column port
+ ; write : source-properties symbol-or-symbols
+ ; lambda : key . arguments
+ ; . #f
+ repr-symbol
+ (let unpeek
+ ((remaining peeked))
+ (cond
+ ((equal? '() remaining )
+ (read port )); let read to the work
+ (else
+ (unread-char (car remaining) port)
+ (unpeek (cdr remaining)))))))
+ (else
+ (let*
+ ((next-char (read-char port))
+ (peeked (cons next-char peeked)))
+ (longpeek
+ peeked
+ (match-charlist-to-repr peeked))))))))
+
+
+
+(define (line-continues? line)
+ (equal? repr-dot (car (line-code line))))
+
+(define (line-only-colon? line)
+ (and
+ (equal? ":" (car (line-code line)))
+ (null? (cdr (line-code line)))))
+
+(define (line-empty-code? line)
+ (null? (line-code line)))
+
+(define (line-empty? line)
+ (and
+ ; if indent is -1, we stripped a comment, so the line was not really empty.
+ (= 0 (line-indent line))
+ (line-empty-code? line)))
+
+(define (line-strip-continuation line )
+ (if (line-continues? line)
+ (append
+ (list
+ (line-indent line))
+ (cdr (line-code line)))
+ line))
+
+(define (line-strip-indentation-marker line)
+ "Strip the indentation markers from the beginning of the line"
+ (cdr line))
+
+(define (indent-level-reduction indentation-levels level select-fun)
+ "Reduce the INDENTATION-LEVELS to the given LEVEL and return the value selected by SELECT-FUN"
+ (let loop
+ ((newlevels indentation-levels)
+ (diff 0))
+ (cond
+ ((= level (car newlevels))
+ (select-fun (list diff indentation-levels)))
+ ((< level (car newlevels))
+ (loop
+ (cdr newlevels)
+ (1+ diff)))
+ (else
+ (throw 'wisp-syntax-error "Level ~A not found in the indentation-levels ~A.")))))
+
+(define (indent-level-difference indentation-levels level)
+ "Find how many indentation levels need to be popped off to find the given level."
+ (indent-level-reduction indentation-levels level
+ (lambda (x ); get the count
+ (car x))))
+
+(define (indent-reduce-to-level indentation-levels level)
+ "Find how many indentation levels need to be popped off to find the given level."
+ (indent-level-reduction indentation-levels level
+ (lambda (x ); get the levels
+ (car (cdr x)))))
+
+(define (chunk-ends-with-period currentsymbols next-char)
+ "Check whether indent-and-symbols ends with a period, indicating the end of a chunk."
+ (and (not (null? currentsymbols))
+ (equal? #\newline next-char)
+ (equal? repr-dot
+ (list-ref currentsymbols (- (length currentsymbols) 1)))))
+
+(define (wisp-scheme-read-chunk-lines port)
+ (let loop
+ ((indent-and-symbols (list )); '((5 "(foobar)" "\"yobble\"")(3 "#t"))
+ (inindent #t)
+ (inunderscoreindent (equal? #\_ (peek-char port)))
+ (incomment #f)
+ (currentindent 0)
+ (currentsymbols '())
+ (emptylines 0))
+ (cond
+ ((>= emptylines 2 ); the chunk end has to be checked
+ ; before we look for new chars in the
+ ; port to make execution in the REPL
+ ; after two empty lines work
+ ; (otherwise it shows one more line).
+ indent-and-symbols)
+ (else
+ (let ((next-char (peek-char port)))
+ (cond
+ ((eof-object? next-char)
+ (append indent-and-symbols (list (append (list currentindent) currentsymbols))))
+ ((and inindent (zero? currentindent) (not incomment) (not (null? indent-and-symbols)) (not inunderscoreindent) (not (or (equal? #\space next-char) (equal? #\newline next-char) (equal? (string-ref ";" 0) next-char))))
+ (append indent-and-symbols )); top-level form ends chunk
+ ((chunk-ends-with-period currentsymbols next-char)
+ ; the line ends with a period. This is forbidden in
+ ; SRFI-119. Use it to end the line in the REPL without
+ ; showing continuation dots (...).
+ (append indent-and-symbols (list (append (list currentindent) (drop-right currentsymbols 1)))))
+ ((and inindent (equal? #\space next-char))
+ (read-char port ); remove char
+ (loop
+ indent-and-symbols
+ #t ; inindent
+ #f ; inunderscoreindent
+ #f ; incomment
+ (1+ currentindent)
+ currentsymbols
+ emptylines))
+ ((and inunderscoreindent (equal? #\_ next-char))
+ (read-char port ); remove char
+ (loop
+ indent-and-symbols
+ #t ; inindent
+ #t ; inunderscoreindent
+ #f ; incomment
+ (1+ currentindent)
+ currentsymbols
+ emptylines))
+ ; any char but whitespace *after* underscoreindent is
+ ; an error. This is stricter than the current wisp
+ ; syntax definition. TODO: Fix the definition. Better
+ ; start too strict. FIXME: breaks on lines with only
+ ; underscores which should empty lines.
+ ((and inunderscoreindent (and (not (equal? #\space next-char)) (not (equal? #\newline next-char))))
+ (throw 'wisp-syntax-error "initial underscores without following whitespace at beginning of the line after" (last indent-and-symbols)))
+ ((equal? #\newline next-char)
+ (read-char port ); remove the newline
+ ; The following two lines would break the REPL by requiring one char too many.
+ ; if : and (equal? #\newline next-char) : equal? #\return : peek-char port
+ ; read-char port ; remove a full \n\r. Damn special cases...
+ (let* ; distinguish pure whitespace lines and lines
+ ; with comment by giving the former zero
+ ; indent. Lines with a comment at zero indent
+ ; get indent -1 for the same reason - meaning
+ ; not actually empty.
+ (
+ (indent
+ (cond
+ (incomment
+ (if (= 0 currentindent ); specialcase
+ -1
+ currentindent ))
+ ((not (null? currentsymbols )); pure whitespace
+ currentindent)
+ (else
+ 0)))
+ (parsedline (append (list indent) currentsymbols))
+ (emptylines
+ (if (not (line-empty? parsedline))
+ 0
+ (1+ emptylines))))
+ (when (not (= 0 (length parsedline)))
+ ; set the source properties to parsedline so we can try to add them later.
+ (set-source-property! parsedline 'filename (port-filename port))
+ (set-source-property! parsedline 'line (port-line port)))
+ ; TODO: If the line is empty. Either do it here and do not add it, just
+ ; increment the empty line counter, or strip it later. Replace indent
+ ; -1 by indent 0 afterwards.
+ (loop
+ (append indent-and-symbols (list parsedline))
+ #t ; inindent
+ (if (<= 2 emptylines)
+ #f ; chunk ends here
+ (equal? #\_ (peek-char port ))); are we in underscore indent?
+ #f ; incomment
+ 0
+ '()
+ emptylines)))
+ ((equal? #t incomment)
+ (read-char port ); remove one comment character
+ (loop
+ indent-and-symbols
+ #f ; inindent
+ #f ; inunderscoreindent
+ #t ; incomment
+ currentindent
+ currentsymbols
+ emptylines))
+ ((or (equal? #\space next-char) (equal? #\tab next-char) (equal? #\return next-char) ); remove whitespace when not in indent
+ (read-char port ); remove char
+ (loop
+ indent-and-symbols
+ #f ; inindent
+ #f ; inunderscoreindent
+ #f ; incomment
+ currentindent
+ currentsymbols
+ emptylines))
+ ; | cludge to appease the former wisp parser
+ ; | which had a problem with the literal comment
+ ; v char.
+ ((equal? (string-ref ";" 0) next-char)
+ (loop
+ indent-and-symbols
+ #f ; inindent
+ #f ; inunderscoreindent
+ #t ; incomment
+ currentindent
+ currentsymbols
+ emptylines))
+ (else ; use the reader
+ (loop
+ indent-and-symbols
+ #f ; inindent
+ #f ; inunderscoreindent
+ #f ; incomment
+ currentindent
+ ; this also takes care of the hashbang and leading comments.
+ ; TODO: If used from Guile, activate curly infix via read-options.
+ (append currentsymbols (list (wisp-read port)))
+ emptylines))))))))
+
+
+(define (line-code-replace-inline-colons line)
+ "Replace inline colons by opening parens which close at the end of the line"
+ ; format #t "replace inline colons for line ~A\n" line
+ (let loop
+ ((processed '())
+ (unprocessed line))
+ (cond
+ ((null? unprocessed)
+ ; format #t "inline-colons processed line: ~A\n" processed
+ processed)
+ ; replace : . with nothing
+ ((and (<= 2 (length unprocessed)) (equal? readcolon (car unprocessed)) (equal? repr-dot (car (cdr unprocessed))))
+ (loop
+ (append processed
+ (loop '() (cdr (cdr unprocessed))))
+ '()))
+ ((equal? readcolon (car unprocessed))
+ (loop
+ ; FIXME: This should turn unprocessed into a list.
+ (append processed
+ (list (loop '() (cdr unprocessed))))
+ '()))
+ (else
+ (loop
+ (append processed
+ (list (car unprocessed)))
+ (cdr unprocessed))))))
+
+(define (line-replace-inline-colons line)
+ (cons
+ (line-indent line)
+ (line-code-replace-inline-colons (line-code line))))
+
+(define (line-strip-lone-colon line)
+ "A line consisting only of a colon is just a marked indentation level. We need to kill the colon before replacing inline colons."
+ (if
+ (equal?
+ (line-code line)
+ (list readcolon))
+ (list (line-indent line))
+ line))
+
+(define (line-finalize line)
+ "Process all wisp-specific information in a line and strip it"
+ (let
+ (
+ (l
+ (line-code-replace-inline-colons
+ (line-strip-indentation-marker
+ (line-strip-lone-colon
+ (line-strip-continuation line))))))
+ (when (not (null? (source-properties line)))
+ (catch #t
+ (lambda ()
+ (set-source-properties! l (source-properties line)))
+ (lambda (key . arguments)
+ #f)))
+ l))
+
+(define (wisp-add-source-properties-from source target)
+ "Copy the source properties from source into the target and return the target."
+ (catch #t
+ (lambda ()
+ (set-source-properties! target (source-properties source)))
+ (lambda (key . arguments)
+ #f))
+ target)
+
+(define (wisp-propagate-source-properties code)
+ "Propagate the source properties from the sourrounding list into every part of the code."
+ (let loop
+ ((processed '())
+ (unprocessed code))
+ (cond
+ ((and (null? processed) (not (pair? unprocessed)) (not (list? unprocessed)))
+ unprocessed)
+ ((and (pair? unprocessed) (not (list? unprocessed)))
+ (cons
+ (wisp-propagate-source-properties (car unprocessed))
+ (wisp-propagate-source-properties (cdr unprocessed))))
+ ((null? unprocessed)
+ processed)
+ (else
+ (let ((line (car unprocessed)))
+ (if (null? (source-properties unprocessed))
+ (wisp-add-source-properties-from line unprocessed)
+ (wisp-add-source-properties-from unprocessed line))
+ (loop
+ (append processed (list (wisp-propagate-source-properties line)))
+ (cdr unprocessed)))))))
+
+(define (wisp-scheme-indentation-to-parens lines)
+ "Add parentheses to lines and remove the indentation markers"
+ ; FIXME: Find new algorithm which mostly uses current-line
+ ; and the indentation-levels for tracking. The try I have in
+ ; here right now is wrong.
+ (when
+ (and
+ (not (null? lines))
+ (not (line-empty-code? (car lines)))
+ (not (= 0 (line-real-indent (car lines ))))); -1 is a line with a comment
+ (throw 'wisp-syntax-error
+ (format #f "The first symbol in a chunk must start at zero indentation. Indentation and line: ~A"
+ (car lines))))
+ (let loop
+ ((processed '())
+ (unprocessed lines)
+ (indentation-levels '(0)))
+ (let*
+ (
+ (current-line
+ (if (<= 1 (length unprocessed))
+ (car unprocessed)
+ (list 0 ))); empty code
+ (next-line
+ (if (<= 2 (length unprocessed))
+ (car (cdr unprocessed))
+ (list 0 ))); empty code
+ (current-indentation
+ (car indentation-levels))
+ (current-line-indentation (line-real-indent current-line)))
+ ; format #t "processed: ~A\ncurrent-line: ~A\nnext-line: ~A\nunprocessed: ~A\nindentation-levels: ~A\ncurrent-indentation: ~A\n\n"
+ ; . processed current-line next-line unprocessed indentation-levels current-indentation
+ (cond
+ ; the real end: this is reported to the outside world.
+ ((and (null? unprocessed) (not (null? indentation-levels)) (null? (cdr indentation-levels)))
+ ; display "done\n"
+ ; reverse the processed lines, because I use cons.
+ processed)
+ ; the recursion end-condition
+ ((and (null? unprocessed))
+ ; display "last step\n"
+ ; this is the last step. Nothing more to do except
+ ; for rolling up the indentation levels. return the
+ ; new processed and unprocessed lists: this is a
+ ; side-recursion
+ (values processed unprocessed))
+ ((null? indentation-levels)
+ ; display "indentation-levels null\n"
+ (throw 'wisp-programming-error "The indentation-levels are null but the current-line is null: Something killed the indentation-levels."))
+ (else ; now we come to the line-comparisons and indentation-counting.
+ (cond
+ ((line-empty-code? current-line)
+ ; display "current-line empty\n"
+ ; We cannot process indentation without
+ ; code. Just switch to the next line. This should
+ ; only happen at the start of the recursion.
+ ; TODO: Somehow preserve the line-numbers.
+ (loop
+ processed
+ (cdr unprocessed)
+ indentation-levels))
+ ((and (line-empty-code? next-line) (<= 2 (length unprocessed )))
+ ; display "next-line empty\n"
+ ; TODO: Somehow preserve the line-numbers.
+ ; take out the next-line from unprocessed.
+ (loop
+ processed
+ (cons current-line
+ (cdr (cdr unprocessed)))
+ indentation-levels))
+ ((> current-indentation current-line-indentation)
+ ; display "current-indent > next-line\n"
+ ; this just steps back one level via the side-recursion.
+ (values processed unprocessed))
+ ((= current-indentation current-line-indentation)
+ ; display "current-indent = next-line\n"
+ (let
+ ((line (line-finalize current-line))
+ (next-line-indentation (line-real-indent next-line)))
+ (cond
+ ((>= current-line-indentation next-line-indentation)
+ ; simple recursiive step to the next line
+ ; display "current-line-indent >= next-line-indent\n"
+ (loop
+ (append processed
+ (if (line-continues? current-line)
+ line
+ (wisp-add-source-properties-from line (list line))))
+ (cdr unprocessed ); recursion here
+ indentation-levels))
+ ((< current-line-indentation next-line-indentation)
+ ; display "current-line-indent < next-line-indent\n"
+ ; format #t "line: ~A\n" line
+ ; side-recursion via a sublist
+ (let-values
+ (
+ ((sub-processed sub-unprocessed)
+ (loop
+ line
+ (cdr unprocessed ); recursion here
+ indentation-levels)))
+ ; format #t "side-recursion:\n sub-processed: ~A\n processed: ~A\n\n" sub-processed processed
+ (loop
+ (append processed (list sub-processed))
+ sub-unprocessed ; simply use the recursion from the sub-recursion
+ indentation-levels))))))
+ ((< current-indentation current-line-indentation)
+ ; display "current-indent < next-line\n"
+ (loop
+ processed
+ unprocessed
+ (cons ; recursion via the indentation-levels
+ current-line-indentation
+ indentation-levels)))
+ (else
+ (throw 'wisp-not-implemented
+ (format #f "Need to implement further line comparison: current: ~A, next: ~A, processed: ~A."
+ current-line next-line processed)))))))))
+
+
+(define (wisp-scheme-replace-inline-colons lines)
+ "Replace inline colons by opening parens which close at the end of the line"
+ (let loop
+ ((processed '())
+ (unprocessed lines))
+ (if (null? unprocessed)
+ processed
+ (loop
+ (append processed (list (line-replace-inline-colons (car unprocessed))))
+ (cdr unprocessed)))))
+
+
+(define (wisp-scheme-strip-indentation-markers lines)
+ "Strip the indentation markers from the beginning of the lines"
+ (let loop
+ ((processed '())
+ (unprocessed lines))
+ (if (null? unprocessed)
+ processed
+ (loop
+ (append processed (cdr (car unprocessed)))
+ (cdr unprocessed)))))
+
+(define (wisp-unescape-underscore-and-colon code)
+ "replace \\_ and \\: by _ and :"
+ (match code
+ ((a ...)
+ (map wisp-unescape-underscore-and-colon a))
+ ('\_
+ '_)
+ ('\__
+ '__)
+ ('\___
+ '___)
+ ('\____
+ '____)
+ ('\_____
+ '_____)
+ ('\______
+ '______)
+ ('\:
+ ':)
+ (a
+ a)))
+
+
+(define (wisp-replace-empty-eof code)
+ "replace ((#<eof>)) by ()"
+ ; FIXME: Actually this is a hack which fixes a bug when the
+ ; parser hits files with only hashbang and comments.
+ (if (and (not (null? code)) (pair? (car code)) (eof-object? (car (car code))) (null? (cdr code)) (null? (cdr (car code))))
+ (list)
+ code))
+
+
+(define (wisp-replace-paren-quotation-repr code)
+ "Replace lists starting with a quotation symbol by
+ quoted lists."
+ (match code
+ (('REPR-QUOTE-e749c73d-c826-47e2-a798-c16c13cb89dd a ...)
+ (list 'quote (map wisp-replace-paren-quotation-repr a)))
+ ((a ... 'REPR-QUOTE-e749c73d-c826-47e2-a798-c16c13cb89dd b ); this is the quoted empty list
+ (append
+ (map wisp-replace-paren-quotation-repr a)
+ (list (list 'quote (map wisp-replace-paren-quotation-repr b)))))
+ (('REPR-QUASIQUOTE-e749c73d-c826-47e2-a798-c16c13cb89dd 'REPR-UNQUOTE-e749c73d-c826-47e2-a798-c16c13cb89dd a ...)
+ (list 'quasiquote (list 'unquote (map wisp-replace-paren-quotation-repr a))))
+ (('REPR-UNQUOTE-e749c73d-c826-47e2-a798-c16c13cb89dd a ...)
+ (list 'unquote (map wisp-replace-paren-quotation-repr a)))
+ ((a ... 'REPR-UNQUOTE-e749c73d-c826-47e2-a798-c16c13cb89dd b )
+ (append
+ (map wisp-replace-paren-quotation-repr a)
+ (list (list 'unquote (map wisp-replace-paren-quotation-repr b)))))
+ (('REPR-QUASIQUOTE-e749c73d-c826-47e2-a798-c16c13cb89dd a ...)
+ (list 'quasiquote (map wisp-replace-paren-quotation-repr a)))
+ ((a ... 'REPR-QUASIQUOTE-e749c73d-c826-47e2-a798-c16c13cb89dd b ); this is the quoted empty list
+ (append
+ (map wisp-replace-paren-quotation-repr a)
+ (list (list 'quasiquote (map wisp-replace-paren-quotation-repr b)))))
+ (('REPR-UNQUOTESPLICING-e749c73d-c826-47e2-a798-c16c13cb89dd a ...)
+ (list 'unquote-splicing (map wisp-replace-paren-quotation-repr a)))
+ (('REPR-SYNTAX-e749c73d-c826-47e2-a798-c16c13cb89dd a ...)
+ (list 'syntax (map wisp-replace-paren-quotation-repr a)))
+ (('REPR-UNSYNTAX-e749c73d-c826-47e2-a798-c16c13cb89dd a ...)
+ (list 'unsyntax (map wisp-replace-paren-quotation-repr a)))
+ (('REPR-QUASISYNTAX-e749c73d-c826-47e2-a798-c16c13cb89dd a ...)
+ (list 'quasisyntax (map wisp-replace-paren-quotation-repr a)))
+ (('REPR-UNSYNTAXSPLICING-e749c73d-c826-47e2-a798-c16c13cb89dd a ...)
+ (list 'unsyntax-splicing (map wisp-replace-paren-quotation-repr a)))
+ ((a ...)
+ (map wisp-replace-paren-quotation-repr a))
+ (a
+ a)))
+
+(define (wisp-make-improper code)
+ "Turn (a #{.}# b) into the correct (a . b).
+
+read called on a single dot creates a variable named #{.}# (|.|
+in r7rs). Due to parsing the indentation before the list
+structure is known, the reader cannot create improper lists
+when it reads a dot. So we have to take another pass over the
+code to recreate the improper lists.
+
+Match is awesome!"
+ (let
+ (
+ (improper
+ (match code
+ ((a ... b 'REPR-DOT-e749c73d-c826-47e2-a798-c16c13cb89dd c)
+ (append (map wisp-make-improper a)
+ (cons (wisp-make-improper b) (wisp-make-improper c))))
+ ((a ...)
+ (map wisp-make-improper a))
+ (a
+ a))))
+ (define (syntax-error li msg)
+ (throw 'wisp-syntax-error (format #f "incorrect dot-syntax #{.}# in code: ~A: ~A" msg li)))
+ (if #t
+ improper
+ (let check
+ ((tocheck improper))
+ (match tocheck
+ ; lists with only one member
+ (('REPR-DOT-e749c73d-c826-47e2-a798-c16c13cb89dd)
+ (syntax-error tocheck "list with the period as only member"))
+ ; list with remaining dot.
+ ((a ...)
+ (if (and (member repr-dot a))
+ (syntax-error tocheck "leftover period in list")
+ (map check a)))
+ ; simple pair - this and the next do not work when parsed from wisp-scheme itself. Why?
+ (('REPR-DOT-e749c73d-c826-47e2-a798-c16c13cb89dd . c)
+ (syntax-error tocheck "dot as first element in already improper pair"))
+ ; simple pair, other way round
+ ((a . 'REPR-DOT-e749c73d-c826-47e2-a798-c16c13cb89dd)
+ (syntax-error tocheck "dot as last element in already improper pair"))
+ ; more complex pairs
+ ((? pair? a)
+ (let
+ ((head (drop-right a 1))
+ (tail (last-pair a)))
+ (cond
+ ((equal? repr-dot (car tail))
+ (syntax-error tocheck "equal? repr-dot : car tail"))
+ ((equal? repr-dot (cdr tail))
+ (syntax-error tocheck "equal? repr-dot : cdr tail"))
+ ((member repr-dot head)
+ (syntax-error tocheck "member repr-dot head"))
+ (else
+ a))))
+ (a
+ a))))))
+
+(define (wisp-scheme-read-chunk port)
+ "Read and parse one chunk of wisp-code"
+ (let (( lines (wisp-scheme-read-chunk-lines port)))
+ (wisp-make-improper
+ (wisp-replace-empty-eof
+ (wisp-unescape-underscore-and-colon
+ (wisp-replace-paren-quotation-repr
+ (wisp-propagate-source-properties
+ (wisp-scheme-indentation-to-parens lines))))))))
+
+(define (wisp-scheme-read-all port)
+ "Read all chunks from the given port"
+ (let loop
+ ((tokens '()))
+ (cond
+ ((eof-object? (peek-char port))
+ tokens)
+ (else
+ (loop
+ (append tokens (wisp-scheme-read-chunk port)))))))
+
+(define (wisp-scheme-read-file path)
+ (call-with-input-file path wisp-scheme-read-all))
+
+(define (wisp-scheme-read-file-chunk path)
+ (call-with-input-file path wisp-scheme-read-chunk))
+
+(define (wisp-scheme-read-string str)
+ (call-with-input-string str wisp-scheme-read-all))
+
+(define (wisp-scheme-read-string-chunk str)
+ (call-with-input-string str wisp-scheme-read-chunk))
+
+
+;;;; Test special syntax
+; ;; quote the list
+; write
+; wisp-scheme-read-string "moo
+; foo
+; ' bar
+; baz waz"
+; newline
+; ;; quote the symbol - in wisp, whitespace after quote is not allowed!
+; write
+; wisp-scheme-read-string "moo
+; foo
+; 'bar
+; baz waz"
+; newline
+; ; ;; quote the list with colon
+; write
+; wisp-scheme-read-string "moo : ' foo
+; foo
+; ' bar bah
+; baz waz"
+; newline
+; ; ;; syntax the list
+; write
+; wisp-scheme-read-string "moo : #' foo
+; foo
+; #' bar bah
+; baz waz"
+; newline
+;
+;;;; Test improper lists
+;;;; Good cases
+; write
+; wisp-scheme-read-string "foo . bar"
+; newline
+; write
+; wisp-scheme-read-string "foo .
+; . bar"
+; newline
+; write
+; wisp-scheme-read-string "foo
+; . . bar"
+; newline
+; write
+; wisp-scheme-read-string "moo
+; foo
+; . . bar
+; baz waz"
+; newline
+;;;; Syntax Error cases
+; write
+; wisp-scheme-read-string "foo
+; . . ."
+; newline
+; write
+; wisp-scheme-read-string "moo : . . bar"
+; write
+; wisp-scheme-read-string "foo .
+; . . bar"
+; newline
+; write
+; wisp-scheme-read-string "moo
+; foo
+; . . bar baz
+; baz waz"
+; newline
+;;;; stranger stuff
+; write
+; wisp-scheme-read-string "foo ; bar\n ; nop \n\n; nup\n; nup \n \n\n\nfoo : moo \"\n\" \n___ . goo . hoo"
+; newline
+; display
+; wisp-scheme-read-string " foo ; bar\n ; nop \n\n; nup\n; nup \n \n\n\nfoo : moo"
+; newline
+; write : wisp-scheme-read-file-chunk "wisp-scheme.w"
+; newline
+; call-with-output-file "wisp-guile.scm"
+; lambda : port
+; map
+; lambda : chunk
+; write chunk port
+; wisp-scheme-read-file "wisp-guile.w"
+; run all chunks in wisp-guile.w as parsed by wisp-scheme.w. Give wisp-guile.w to parse as argument.
+; map primitive-eval : wisp-scheme-read-file "wisp-guile.w" ; actually runs wisp-guile.w with the arguments supplied to this script.
+; uncomment the previous line, then run the next line in the shell. If 1 and 2 are equal, this parser works!
+; guile wisp.scm wisp-scheme.w > wisp-scheme.scm; guile wisp-scheme.scm wisp-guile.w > 1; guile wisp.scm wisp-guile.w > 2; diff 1 2
+
+
+
diff --git a/racket/wisp.rkt b/racket/wisp.rkt
new file mode 100644
--- /dev/null
+++ b/racket/wisp.rkt
@@ -0,0 +1,25 @@
+#lang racket
+
+;; Implement wisp in Racket
+;;
+;; -Author: Arne Babenhauserheide
+
+; adapted from wisp-in-guile and algol60.rkt
+
+(require (for-syntax "parse-base.rkt"))
+
+(provide literal-wisp)
+
+
+(define-syntax (literal-wisp stx)
+ (syntax-case stx ()
+ [(_ strs ...)
+ (andmap (λ (x) (string? (syntax-e x)))
+ (syntax->list (syntax (strs ...))))
+
+ (parse-wisp-port
+ (open-input-string
+ (apply
+ string-append
+ (map syntax-e (syntax->list #'(strs ...)))))
+ (syntax-source stx))]))
\ No newline at end of file
diff --git a/wisp-reader.w b/wisp-reader.w
--- a/wisp-reader.w
+++ b/wisp-reader.w
@@ -1,7 +1,4 @@
-#!/home/arne/wisp/wisp-multiline.sh
-; !#
-;;
-;; Implement wisp in guile
+;; Language interface for Wisp in Guile
;;
;; -Author: Arne Babenhauserheide