From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!.POSTED.blaine.gmane.org!not-for-mail From: amirouche@hyper.dev Newsgroups: gmane.lisp.guile.user Subject: Re: [ANN] guile-snowball-stemmer 0.1.0 Date: Tue, 07 May 2019 22:36:21 +0200 Message-ID: <36da8d5e1ea385da0a45c7186b3d4621@hyper.dev> References: <6960bb6e6efed59895daf07ae443cb4b@hyper.dev> <71f30a8ffbb073c94f4a0e08e4802b74@hyper.dev> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=_8a856e773e8bfd852b8568f4c88cb250" Injection-Info: blaine.gmane.org; posting-host="blaine.gmane.org:195.159.176.226"; logging-data="193109"; mail-complaints-to="usenet@blaine.gmane.org" User-Agent: Roundcube Webmail/1.3.8 Cc: guile-user To: guile-user gnu Original-X-From: guile-user-bounces+guile-user=m.gmane.org@gnu.org Tue May 07 22:43:56 2019 Return-path: Envelope-to: guile-user@m.gmane.org Original-Received: from lists.gnu.org ([209.51.188.17]) by blaine.gmane.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:256) (Exim 4.89) (envelope-from ) id 1hO6wM-000o4i-4f for guile-user@m.gmane.org; Tue, 07 May 2019 22:43:54 +0200 Original-Received: from localhost ([127.0.0.1]:54551 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hO6wL-00062h-3N for guile-user@m.gmane.org; Tue, 07 May 2019 16:43:53 -0400 Original-Received: from eggs.gnu.org ([209.51.188.92]:35220) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hO6pG-0006Fl-7B for guile-user@gnu.org; Tue, 07 May 2019 16:36:36 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hO6pE-0004ah-7c for guile-user@gnu.org; Tue, 07 May 2019 16:36:34 -0400 Original-Received: from relay4-d.mail.gandi.net ([217.70.183.196]:52069) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1hO6p9-0004WH-Fh; Tue, 07 May 2019 16:36:27 -0400 Original-Received: from webmail.gandi.net (webmail14.sd4.0x35.net [10.200.201.14]) (Authenticated sender: amirouche@hyper.dev) by relay4-d.mail.gandi.net (Postfix) with ESMTPA id C0028E0006; Tue, 7 May 2019 20:36:21 +0000 (UTC) In-Reply-To: <71f30a8ffbb073c94f4a0e08e4802b74@hyper.dev> X-Sender: amirouche@hyper.dev X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 217.70.183.196 X-BeenThere: guile-user@gnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: General Guile related discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guile-user-bounces+guile-user=m.gmane.org@gnu.org Original-Sender: "guile-user" Xref: news.gmane.org gmane.lisp.guile.user:15455 Archived-At: --=_8a856e773e8bfd852b8568f4c88cb250 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=US-ASCII; format=flowed On 2019-05-07 20:30, amirouche@hyper.dev wrote: > On 2019-05-07 15:28, amirouche@hyper.dev wrote: >> I am pleased to announce the immediate availability of >> guile-snowball-stemmer. >> I made (yet another toy) search engine. It is a small command line tool that I attach to this mail. The code can be found at: https://git.sr.ht/~amz3/guile-gotofish Here is an example run: $ mkdir ~/.gotofish # Database is stored there $ guile -L . gotofish.scm search gnu guile # Nothing yet! # Let'index a couple of articles $ curl https://en.wikipedia.org/wiki/GNU_Guile | html2text | guile -L . gotofish.scm index "GNU Guile" Done! $ curl https://en.wikipedia.org/wiki/Scheme_%28programming_language%29 | html2text | guile -L . gotofish.scm index "Scheme" Done! $ curl https://en.wikipedia.org/wiki/GNU | html2text | guile -L . gotofish.scm index "GNU" Done! $ curl https://en.wikipedia.org/wiki/Tf%E2%80%93idf | html2text | guile -L . gotofish.scm index "tf-idf" Done! # Let's search $ guile -L . gotofish.scm search gnu guile ** Scheme ** GNU Guile $ guile -L . gotofish.scm search gnu ** GNU ** GNU Guile ** Scheme $ guile -L . gotofish.scm search science ** GNU ** GNU Guile ** Scheme $ guile -L . gotofish.scm search retrieval # Even if the exact word "retrieval" is not in those pages, # "retrieved" has the same stem as "retrieval" so all are # matches ** GNU ** tf-idf ** GNU Guile ** Scheme $ guile -L . gotofish.scm search idf ** tf-idf Also one can use multiple words to do a lookup. This is very primitive but hopefully it will help get going tomorrow to build my great app! --=_8a856e773e8bfd852b8568f4c88cb250 Content-Transfer-Encoding: base64 Content-Type: text/plain; name=gotofish.scm Content-Disposition: attachment; filename=gotofish.scm; size=10245 OzsgZ3VpbGUtZ290b2Zpc2gKOzsKOzsgQ29weXJpZ2h0IChDKSAyMDE5IEFtaXJvdWNoZSBCb3Vi ZWtraSA8YW1pcm91Y2hlQGh5cGVyLmRldj4KOzsKOzsgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29m dHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgo7OyBtb2RpZnkgaXQgdW5kZXIg dGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCjs7IExpY2Vuc2UgYXMg cHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgo7OyB2ZXJz aW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNp b24uCjs7Cjs7IFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0 IHdpbGwgYmUgdXNlZnVsLAo7OyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZl biB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgo7OyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBG T1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQo7OyBMZXNzZXIgR2VuZXJhbCBQ dWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgo7Owo7OyBZb3Ugc2hvdWxkIGhhdmUgcmVj ZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKOzsg YWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdh cmUgRm91bmRhdGlvbiwKOzsgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwg Qm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCihleHBvcnQgc3RyaW5nLT5zdGVtKQoKKGltcG9y dCAoc2NoZW1lIGJhc2UpKQooaW1wb3J0IChzY2hlbWUgaGFzaC10YWJsZSkpCihpbXBvcnQgKHNj aGVtZSBjb21wYXJhdG9yKSkKKGltcG9ydCAoc2NoZW1lIGdlbmVyYXRvcikpCihpbXBvcnQgKHNj aGVtZSBwcm9jZXNzLWNvbnRleHQpKQooaW1wb3J0IChzY2hlbWUgbWFwcGluZyBoYXNoKSkKKGlt cG9ydCAoc2NoZW1lIHNldCkpCgooaW1wb3J0IChpY2UtOSBtYXRjaCkpCgooaW1wb3J0IChzbm93 YmFsbC1zdGVtbWVyKSkKKGltcG9ydCAod2lyZWR0aWdlciBva3ZzKSkKKGltcG9ydCAod2lyZWR0 aWdlciBuc3RvcmUpKQoKCihkZWZpbmUgY29tcGFyYXRvciAobWFrZS1kZWZhdWx0LWNvbXBhcmF0 b3IpKQoKKGRlZmluZSBwdW5jdHVhdGlvbiAobWFrZS1oYXNoLXRhYmxlIGNvbXBhcmF0b3IpKQoK KGxldCBsb29wICgoY2hhcnMgKHN0cmluZy0+bGlzdCAiIVwiIyQlJlxcJygpKissLS4vOjs8PT4/ QFtcXF1eX2B7fH1+XG5cdCIpKSkKICAodW5sZXNzIChudWxsPyBjaGFycykKICAgIChoYXNoLXRh YmxlLXNldCEgcHVuY3R1YXRpb24gKGNhciBjaGFycykgI3QpCiAgICAobG9vcCAoY2RyIGNoYXJz KSkpKQoKKGRlZmluZSAoY2xlYW4gc3RyaW5nKQogICJSZXBsYWNlIHB1bmN0dWF0aW9uIGNoYXJh Y3RlcnMgZnJvbSBTVFJJTkcgd2l0aCBhIHNwYWNlIGNoYXJhY3RlciIKICAoc3RyaW5nLW1hcAog ICAobGFtYmRhIChjaGFyKSAoaWYgKGhhc2gtdGFibGUtcmVmIHB1bmN0dWF0aW9uIGNoYXIgKGNv bnN0ICNmKSkgI1xzcGFjZSBjaGFyKSkgc3RyaW5nKSkKCihkZWZpbmUgc3BsaXQgKGxhbWJkYSAo eCkgKHN0cmluZy1zcGxpdCB4ICNcc3BhY2UpKSkKCjs7IHNldHVwIHN0b3B3b3JkcwoKKGRlZmlu ZSAlc3RvcHdvcmRzICJhCmFibGUKYWJvdXQKYWJvdmUKYWJzdAphY2NvcmRhbmNlCmFjY29yZGlu ZwphY2NvcmRpbmdseQphY3Jvc3MKYWN0CmFjdHVhbGx5CmFkZGVkCmFkagphZmZlY3RlZAphZmZl Y3RpbmcKYWZmZWN0cwphZnRlcgphZnRlcndhcmRzCmFnYWluCmFnYWluc3QKYWgKYWluJ3QKYWxs CmFsbG93CmFsbG93cwphbG1vc3QKYWxvbmUKYWxvbmcKYWxyZWFkeQphbHNvCmFsdGhvdWdoCmFs d2F5cwphbQphbW9uZwphbW9uZ3N0CmFuCmFuZAphbm5vdW5jZQphbm90aGVyCmFueQphbnlib2R5 CmFueWhvdwphbnltb3JlCmFueW9uZQphbnl0aGluZwphbnl3YXkKYW55d2F5cwphbnl3aGVyZQph cGFydAphcHBhcmVudGx5CmFwcGVhcgphcHByZWNpYXRlCmFwcHJvcHJpYXRlCmFwcHJveGltYXRl bHkKYXJlCmFyZW4KYXJlbnQKYXJlbid0CmFyaXNlCmFyb3VuZAphcwphJ3MKYXNpZGUKYXNrCmFz a2luZwphc3NvY2lhdGVkCmF0CmF1dGgKYXZhaWxhYmxlCmF3YXkKYXdmdWxseQpiCmJhY2sKYmUK YmVjYW1lCmJlY2F1c2UKYmVjb21lCmJlY29tZXMKYmVjb21pbmcKYmVlbgpiZWZvcmUKYmVmb3Jl aGFuZApiZWdpbgpiZWdpbm5pbmcKYmVnaW5uaW5ncwpiZWdpbnMKYmVoaW5kCmJlaW5nCmJlbGll dmUKYmVsb3cKYmVzaWRlCmJlc2lkZXMKYmVzdApiZXR0ZXIKYmV0d2VlbgpiZXlvbmQKYmlvbApi b3RoCmJyaWVmCmJyaWVmbHkKYnV0CmJ5CmMKY2EKY2FtZQpjYW4KY2Fubm90CmNhbnQKY2FuJ3QK Y2F1c2UKY2F1c2VzCmNlcnRhaW4KY2VydGFpbmx5CmNoYW5nZXMKY2xlYXJseQpjJ21vbgpjbwpj b20KY29tZQpjb21lcwpjb25jZXJuaW5nCmNvbnNlcXVlbnRseQpjb25zaWRlcgpjb25zaWRlcmlu Zwpjb250YWluCmNvbnRhaW5pbmcKY29udGFpbnMKY29ycmVzcG9uZGluZwpjb3VsZApjb3VsZG50 CmNvdWxkbid0CmNvdXJzZQpjJ3MKY3VycmVudGx5CmQKZGF0ZQpkZWZpbml0ZWx5CmRlc2NyaWJl ZApkZXNwaXRlCmRpZApkaWRuJ3QKZGlmZmVyZW50CmRvCmRvZXMKZG9lc24ndApkb2luZwpkb25l CmRvbid0CmRvd24KZG93bndhcmRzCmR1ZQpkdXJpbmcKZQplYWNoCmVkCmVkdQplZmZlY3QKZWcK ZWlnaHQKZWlnaHR5CmVpdGhlcgplbHNlCmVsc2V3aGVyZQplbmQKZW5kaW5nCmVub3VnaAplbnRp cmVseQplc3BlY2lhbGx5CmV0CmV0LWFsCmV0YwpldmVuCmV2ZXIKZXZlcnkKZXZlcnlib2R5CmV2 ZXJ5b25lCmV2ZXJ5dGhpbmcKZXZlcnl3aGVyZQpleApleGFjdGx5CmV4YW1wbGUKZXhjZXB0CmYK ZmFyCmZldwpmZgpmaWZ0aApmaXJzdApmaXZlCmZpeApmb2xsb3dlZApmb2xsb3dpbmcKZm9sbG93 cwpmb3IKZm9ybWVyCmZvcm1lcmx5CmZvcnRoCmZvdW5kCmZvdXIKZnJvbQpmdXJ0aGVyCmZ1cnRo ZXJtb3JlCmcKZ2F2ZQpnZXQKZ2V0cwpnZXR0aW5nCmdpdmUKZ2l2ZW4KZ2l2ZXMKZ2l2aW5nCmdv CmdvZXMKZ29pbmcKZ29uZQpnb3QKZ290dGVuCmdyZWV0aW5ncwpoCmhhZApoYWRuJ3QKaGFwcGVu cwpoYXJkbHkKaGFzCmhhc24ndApoYXZlCmhhdmVuJ3QKaGF2aW5nCmhlCmhlZApoZSdkCmhlJ2xs CmhlbGxvCmhlbmNlCmhlcgpoZXJlCmhlcmVhZnRlcgpoZXJlYnkKaGVyZWluCmhlcmVzCmhlcmUn cwpoZXJldXBvbgpoZXJzCmhlcnNlbGYKaGVzCmhlJ3MKaGkKaGlkCmhpbQpoaW1zZWxmCmhpcwpo aXRoZXIKaG9tZQpob3BlZnVsbHkKaG93Cmhvd2JlaXQKaG93ZXZlcgpob3cncwpodW5kcmVkCmkK SQppZAppJ2QKaWUKaWYKaWdub3JlZAppJ2xsCmltCmknbQppbW1lZGlhdGUKaW1tZWRpYXRlbHkK aW1wb3J0YW5jZQppbXBvcnRhbnQKaW4KaW5hc211Y2gKaW5jCmluZGVlZAppbmRleAppbmRpY2F0 ZQppbmRpY2F0ZWQKaW5kaWNhdGVzCmluZm9ybWF0aW9uCmlubmVyCmluc29mYXIKaW5zdGVhZApp bnRvCmludmVudGlvbgppbndhcmQKaXMKaXNuJ3QKaXQKaXRkCml0J2QKaXQnbGwKaXRzCml0J3MK aXRzZWxmCmkndmUKagpqdXN0CmsKa2VlcAprZWVwIAlrZWVwcwprZWVwcwprZXB0CmtnCmttCmtu b3cKa25vd24Ka25vd3MKbApsYXJnZWx5Cmxhc3QKbGF0ZWx5CmxhdGVyCmxhdHRlcgpsYXR0ZXJs eQpsZWFzdApsZXNzCmxlc3QKbGV0CmxldHMKbGV0J3MKbGlrZQpsaWtlZApsaWtlbHkKbGluZQps aXR0bGUKJ2xsCmxvb2sKbG9va2luZwpsb29rcwpsdGQKbQptYWRlCm1haW5seQptYWtlCm1ha2Vz Cm1hbnkKbWF5Cm1heWJlCm1lCm1lYW4KbWVhbnMKbWVhbnRpbWUKbWVhbndoaWxlCm1lcmVseQpt ZwptaWdodAptaWxsaW9uCm1pc3MKbWwKbW9yZQptb3Jlb3Zlcgptb3N0Cm1vc3RseQptcgptcnMK bXVjaAptdWcKbXVzdAptdXN0bid0Cm15Cm15c2VsZgpuCm5hCm5hbWUKbmFtZWx5Cm5heQpuZApu ZWFyCm5lYXJseQpuZWNlc3NhcmlseQpuZWNlc3NhcnkKbmVlZApuZWVkcwpuZWl0aGVyCm5ldmVy Cm5ldmVydGhlbGVzcwpuZXcKbmV4dApuaW5lCm5pbmV0eQpubwpub2JvZHkKbm9uCm5vbmUKbm9u ZXRoZWxlc3MKbm9vbmUKbm9yCm5vcm1hbGx5Cm5vcwpub3QKbm90ZWQKbm90aGluZwpub3ZlbApu b3cKbm93aGVyZQpvCm9idGFpbgpvYnRhaW5lZApvYnZpb3VzbHkKb2YKb2ZmCm9mdGVuCm9oCm9r Cm9rYXkKb2xkCm9taXR0ZWQKb24Kb25jZQpvbmUKb25lcwpvbmx5Cm9udG8Kb3IKb3JkCm90aGVy Cm90aGVycwpvdGhlcndpc2UKb3VnaHQKb3VyCm91cnMKb3Vyc2VsdmVzCm91dApvdXRzaWRlCm92 ZXIKb3ZlcmFsbApvd2luZwpvd24KcApwYWdlCnBhZ2VzCnBhcnQKcGFydGljdWxhcgpwYXJ0aWN1 bGFybHkKcGFzdApwZXIKcGVyaGFwcwpwbGFjZWQKcGxlYXNlCnBsdXMKcG9vcmx5CnBvc3NpYmxl CnBvc3NpYmx5CnBvdGVudGlhbGx5CnBwCnByZWRvbWluYW50bHkKcHJlc2VudApwcmVzdW1hYmx5 CnByZXZpb3VzbHkKcHJpbWFyaWx5CnByb2JhYmx5CnByb21wdGx5CnByb3VkCnByb3ZpZGVzCnB1 dApxCnF1ZQpxdWlja2x5CnF1aXRlCnF2CnIKcmFuCnJhdGhlcgpyZApyZQpyZWFkaWx5CnJlYWxs eQpyZWFzb25hYmx5CnJlY2VudApyZWNlbnRseQpyZWYKcmVmcwpyZWdhcmRpbmcKcmVnYXJkbGVz cwpyZWdhcmRzCnJlbGF0ZWQKcmVsYXRpdmVseQpyZXNlYXJjaApyZXNwZWN0aXZlbHkKcmVzdWx0 ZWQKcmVzdWx0aW5nCnJlc3VsdHMKcmlnaHQKcnVuCnMKc2FpZApzYW1lCnNhdwpzYXkKc2F5aW5n CnNheXMKc2VjCnNlY29uZApzZWNvbmRseQpzZWN0aW9uCnNlZQpzZWVpbmcKc2VlbQpzZWVtZWQK c2VlbWluZwpzZWVtcwpzZWVuCnNlbGYKc2VsdmVzCnNlbnNpYmxlCnNlbnQKc2VyaW91cwpzZXJp b3VzbHkKc2V2ZW4Kc2V2ZXJhbApzaGFsbApzaGFuJ3QKc2hlCnNoZWQKc2hlJ2QKc2hlJ2xsCnNo ZXMKc2hlJ3MKc2hvdWxkCnNob3VsZG4ndApzaG93CnNob3dlZApzaG93bgpzaG93bnMKc2hvd3MK c2lnbmlmaWNhbnQKc2lnbmlmaWNhbnRseQpzaW1pbGFyCnNpbWlsYXJseQpzaW5jZQpzaXgKc2xp Z2h0bHkKc28Kc29tZQpzb21lYm9keQpzb21laG93CnNvbWVvbmUKc29tZXRoYW4Kc29tZXRoaW5n CnNvbWV0aW1lCnNvbWV0aW1lcwpzb21ld2hhdApzb21ld2hlcmUKc29vbgpzb3JyeQpzcGVjaWZp Y2FsbHkKc3BlY2lmaWVkCnNwZWNpZnkKc3BlY2lmeWluZwpzdGlsbApzdG9wCnN0cm9uZ2x5CnN1 YgpzdWJzdGFudGlhbGx5CnN1Y2Nlc3NmdWxseQpzdWNoCnN1ZmZpY2llbnRseQpzdWdnZXN0CnN1 cApzdXJlCnN1cmUgCXQKdGFrZQp0YWtlbgp0YWtpbmcKdGVsbAp0ZW5kcwp0aAp0aGFuCnRoYW5r CnRoYW5rcwp0aGFueAp0aGF0CnRoYXQnbGwKdGhhdHMKdGhhdCdzCnRoYXQndmUKdGhlCnRoZWly CnRoZWlycwp0aGVtCnRoZW1zZWx2ZXMKdGhlbgp0aGVuY2UKdGhlcmUKdGhlcmVhZnRlcgp0aGVy ZWJ5CnRoZXJlZAp0aGVyZWZvcmUKdGhlcmVpbgp0aGVyZSdsbAp0aGVyZW9mCnRoZXJlcmUKdGhl cmVzCnRoZXJlJ3MKdGhlcmV0bwp0aGVyZXVwb24KdGhlcmUndmUKdGhlc2UKdGhleQp0aGV5ZAp0 aGV5J2QKdGhleSdsbAp0aGV5cmUKdGhleSdyZQp0aGV5J3ZlCnRoaW5rCnRoaXJkCnRoaXMKdGhv cm91Z2gKdGhvcm91Z2hseQp0aG9zZQp0aG91CnRob3VnaAp0aG91Z2hoCnRob3VzYW5kCnRocmVl CnRocm91Zwp0aHJvdWdoCnRocm91Z2hvdXQKdGhydQp0aHVzCnRpbAp0aXAKdG8KdG9nZXRoZXIK dG9vCnRvb2sKdG93YXJkCnRvd2FyZHMKdHJpZWQKdHJpZXMKdHJ1bHkKdHJ5CnRyeWluZwp0cwp0 J3MKdHdpY2UKdHdvCnUKdW4KdW5kZXIKdW5mb3J0dW5hdGVseQp1bmxlc3MKdW5saWtlCnVubGlr ZWx5CnVudGlsCnVudG8KdXAKdXBvbgp1cHMKdXMKdXNlCnVzZWQKdXNlZnVsCnVzZWZ1bGx5CnVz ZWZ1bG5lc3MKdXNlcwp1c2luZwp1c3VhbGx5CnYKdmFsdWUKdmFyaW91cwondmUKdmVyeQp2aWEK dml6CnZvbAp2b2xzCnZzCncKd2FudAp3YW50cwp3YXMKd2FzbnQKd2Fzbid0CndheQp3ZQp3ZWQK d2UnZAp3ZWxjb21lCndlbGwKd2UnbGwKd2VudAp3ZXJlCndlJ3JlCndlcmVudAp3ZXJlbid0Cndl J3ZlCndoYXQKd2hhdGV2ZXIKd2hhdCdsbAp3aGF0cwp3aGF0J3MKd2hlbgp3aGVuY2UKd2hlbmV2 ZXIKd2hlbidzCndoZXJlCndoZXJlYWZ0ZXIKd2hlcmVhcwp3aGVyZWJ5CndoZXJlaW4Kd2hlcmVz CndoZXJlJ3MKd2hlcmV1cG9uCndoZXJldmVyCndoZXRoZXIKd2hpY2gKd2hpbGUKd2hpbQp3aGl0 aGVyCndobwp3aG9kCndob2V2ZXIKd2hvbGUKd2hvJ2xsCndob20Kd2hvbWV2ZXIKd2hvcwp3aG8n cwp3aG9zZQp3aHkKd2h5J3MKd2lkZWx5CndpbGwKd2lsbGluZwp3aXNoCndpdGgKd2l0aGluCndp dGhvdXQKd29uZGVyCndvbnQKd29uJ3QKd29yZHMKd29ybGQKd291bGQKd291bGRudAp3b3VsZG4n dAp3d3cKeAp5Cnllcwp5ZXQKeW91CnlvdWQKeW91J2QKeW91J2xsCnlvdXIKeW91cmUKeW91J3Jl CnlvdXJzCnlvdXJzZWxmCnlvdXJzZWx2ZXMKeW91J3ZlCnoKemVybwoiKQoKKGRlZmluZSBzdG9w d29yZHMgKG1ha2UtaGFzaC10YWJsZSBjb21wYXJhdG9yKSkKCihsZXQgbG9vcCAoKHdvcmRzIChz cGxpdCAoY2xlYW4gJXN0b3B3b3JkcykpKSkKICAodW5sZXNzIChudWxsPyB3b3JkcykKICAgICho YXNoLXRhYmxlLXNldCEgc3RvcHdvcmRzIChjYXIgd29yZHMpICN0KQogICAgKGxvb3AgKGNkciB3 b3JkcykpKSkKCihkZWZpbmUgKGZpbHRlci1zdG9wd29yZHMgbHN0KQogIChmaWx0ZXIgKGxhbWJk YSAodG9rZW4pIChub3QgKGhhc2gtdGFibGUtcmVmIHN0b3B3b3JkcyB0b2tlbiAoY29uc3QgI2Yp KSkpIGxzdCkpCgo7OyBzdHJpbmctPnN0ZW1zCgooZGVmaW5lIChzYW5pdGl6ZSB3b3JkcykKICAi T25seSBrZWVwIHdvcmRzIHRoYXQgaGF2ZSBsZW5ndGggYmlnZ2VyIHRoYW4gb25lIgogIChmaWx0 ZXIgKGxhbWJkYSAod29yZCkgKDwgMSAoc3RyaW5nLWxlbmd0aCB3b3JkKSkpIHdvcmRzKSkKCihk ZWZpbmUgZW5nbGlzaCAobWFrZS1zdGVtbWVyICJlbmdsaXNoIikpCgooZGVmaW5lIHN0cmluZy0+ c3RlbXMKICA7OyBUT0RPOiB1bmlxdWlmeQogIChjb21wb3NlIChsYW1iZGEgKHdvcmRzKSAobWFw IChsYW1iZGEgKHdvcmQpIChzdGVtIGVuZ2xpc2ggd29yZCkpIHdvcmRzKSkKICAgICAgICAgICBm aWx0ZXItc3RvcHdvcmRzCiAgICAgICAgICAgc2FuaXRpemUKICAgICAgICAgICBzcGxpdAogICAg ICAgICAgIHN0cmluZy1kb3duY2FzZQogICAgICAgICAgIGNsZWFuKSkKCjs7OyBoZWxwZXJzCgoo ZGVmaW5lLXB1YmxpYyAoc2NtLT5zdHJpbmcgc2NtKQogIChjYWxsLXdpdGgtb3V0cHV0LXN0cmlu ZwogICAgKGxhbWJkYSAocG9ydCkKICAgICAgKHdyaXRlIHNjbSBwb3J0KSkpKQoKKGRlZmluZS1w dWJsaWMgKHN0cmluZy0+c2NtIHN0cmluZykKICAoY2FsbC13aXRoLWlucHV0LXN0cmluZyBzdHJp bmcgcmVhZCkpCgo7OyBva3ZzICYgbnN0b3JlIGhlbHBlcnMKCihkZWZpbmUgKmJpZ2lzaCogKGV4 cHQgMiAyNTYpKQoKKGRlZmluZSAoc29tZT8gdHJhbnNhY3Rpb24gbnN0b3JlIGNvbGxlY3Rpb24g dWlkKQogIChsZXQgKChnZW5lcmF0b3IgKG5zdG9yZS1mcm9tIHRyYW5zYWN0aW9uIG5zdG9yZQog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsaXN0IGNvbGxlY3Rpb24KICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWQKICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAobnN0b3JlLXZhciAna2V5KQogICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIChuc3RvcmUtdmFyICd2YWx1ZSkpKSkpCiAgICAobm90IChlb2Ytb2JqZWN0 PyAoZ2VuZXJhdG9yKSkpKSkKCihkZWZpbmUgcmFuZG9tLXVpZAogIChsYW1iZGEgKHRyYW5zYWN0 aW9uIG5zdG9yZSBjb2xsZWN0aW9uKQogICAgKGxldCBsb29wICgoaW5kZXggMykpCiAgICAgIChp ZiAoemVybz8gaW5kZXgpCiAgICAgICAgICAocmFpc2UgKGNvbnMgJ2dvdG9maXNoICJPb29wcyEg Tm8gbW9yZSByYW5kb20gdWlkISIpKQogICAgICAgICAgKGxldCAoKGNhbmRpZGF0ZSAobnVtYmVy LT5zdHJpbmcgKHJhbmRvbSAqYmlnaXNoKikgMzYpKSkKICAgICAgICAgICAgKGlmIChzb21lPyB0 cmFuc2FjdGlvbiBuc3RvcmUgY29sbGVjdGlvbiBjYW5kaWRhdGUpCiAgICAgICAgICAgICAgICAo bG9vcCAoLSBpbmRleCAxKSkKICAgICAgICAgICAgICAgIGNhbmRpZGF0ZSkpKSkpKQoKOzsgZGF0 YWJhc2Ugc2V0dXAKCihkZWZpbmUgKHRyaXBsZXN0b3JlKQogIChsZXQgKChlbmdpbmUgKG5zdG9y ZS1lbmdpbmUgb2t2cy1yZWYgb2t2cy1zZXQhIG9rdnMtcm0hIG9rdnMtcHJlZml4KSkpCiAgICAo bnN0b3JlIGVuZ2luZSAjdnU4KDAxKSAnKHVpZCBrZXkgdmFsdWUpKSkpCgo7OyBUT0RPOiBta2Rp ciBkaXJlY3RvcnkKKGRlZmluZSBob21lIChzdHJpbmctYXBwZW5kIChnZXRlbnYgIkhPTUUiKSAi Ly5nb3RvZmlzaCIpKQooZGVmaW5lIG9rdnMgKG9rdnMgYCgoaG9tZSAuICxob21lKSAoY3JlYXRl PyAuICN0KSAod2FsPyAuICN0KSkpKQooZGVmaW5lIHN0b3JlICh0cmlwbGVzdG9yZSkpCgo7OyBp bmRleAoKKGRlZmluZSAocmVhZC1saW5lcykKICAobGV0IGxvb3AgKChsaW5lIChyZWFkLWxpbmUp KQogICAgICAgICAgICAgKG91dCAnKCkpKQogICAgKGlmIChlb2Ytb2JqZWN0PyBsaW5lKQogICAg ICAgIChzdHJpbmctam9pbiBvdXQgIiAiKQogICAgICAgIChsb29wIChyZWFkLWxpbmUpIChjb25z IGxpbmUgb3V0KSkpKSkKCihkZWZpbmUgYWRkIQogIChva3ZzLXRyYW5zYWN0aW9uYWwKICAgKGxh bWJkYSAodHJhbnNhY3Rpb24gc3RvcmUgdWlkIHN0ZW0pCiAgICAgKG5zdG9yZS1hZGQhIHRyYW5z YWN0aW9uIHN0b3JlIChsaXN0IHVpZCAnc3RlbSBzdGVtKSkpKSkKCihkZWZpbmUgKGluZGV4IHVp ZCkKICAobGV0ICgoZG9jdW1lbnQgKHJlYWQtbGluZXMpKSkKICAgIChsZXQgbG9vcCAoKHN0ZW1z IChzdHJpbmctPnN0ZW1zIGRvY3VtZW50KSkpCiAgICAgICh1bmxlc3MgKG51bGw/IHN0ZW1zKQog ICAgICAgIChhZGQhIG9rdnMgc3RvcmUgdWlkIChjYXIgc3RlbXMpKQogICAgICAgIChsb29wIChj ZHIgc3RlbXMpKSkpKQogIChjbG9zZSAoY3VycmVudC1pbnB1dC1wb3J0KSkKICAoZm9ybWF0ICN0 ICJEb25lIVxuIikpCgo7OyBzZWFyY2gKCihkZWZpbmUgJWxvb2t1cAogIChva3ZzLXRyYW5zYWN0 aW9uYWwKICAgKGxhbWJkYSAodHJhbnNhY3Rpb24gc3RvcmUgc3RlbSkKICAgICAoYXBwbHkgc2V0 IGNvbXBhcmF0b3IKICAgICAgICAgICAgKG1hcCAobGFtYmRhICh4KSAoaGFzaG1hcC1yZWYgeCAn dWlkIChjb25zdCAjZikpKQogICAgICAgICAgICAgICAgIChnZW5lcmF0b3ItPmxpc3QKICAgICAg ICAgICAgICAgICAgKG5zdG9yZS1mcm9tIHRyYW5zYWN0aW9uIHN0b3JlCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAobGlzdCAobnN0b3JlLXZhciAndWlkKQogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgJ3N0ZW0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHN0ZW0pKSkpKSkpKQoKKGRlZmluZSAobG9va3VwIGtleXdvcmQpCiAgKCVsb29rdXAg b2t2cyBzdG9yZSAoc3RlbSBlbmdsaXNoIChzdHJpbmctZG93bmNhc2Uga2V5d29yZCkpKSkKCihk ZWZpbmUgKHNlYXJjaCBzZWVkIGtleXdvcmRzKQogIChsZXQgbG9vcCAoKGtleXdvcmRzIGtleXdv cmRzKQogICAgICAgICAgICAgKG91dCAobG9va3VwIHNlZWQpKSkKICAgIChpZiAobnVsbD8ga2V5 d29yZHMpCiAgICAgICAgKGZvci1lYWNoIChsYW1iZGEgKHgpIChmb3JtYXQgI3QgIioqIH5hXG4i IHgpKSAoc2V0LT5saXN0IG91dCkpCiAgICAgICAgKGxvb3AgKGNkciBrZXl3b3JkcykgKHNldC1p bnRlcnNlY3Rpb24gKGxvb2t1cCAoY2FyIGtleXdvcmRzKSkgb3V0KSkpKSkKCjs7IGV4ZWMKCiht YXRjaCAoY2RyIChjb21tYW5kLWxpbmUpKQogICAgICAgKCgiaW5kZXgiIHVpZCkgKGluZGV4IHVp ZCkpCiAgICAgICAoKCJzZWFyY2giIGtleXdvcmQga2V5d29yZHMgLi4uKSAoc2VhcmNoIGtleXdv cmQga2V5d29yZHMpKQogICAgICAgKGVsc2UgKGZvcm1hdCAjdCAiSSBkbyBub3QgdW5kZXJzdGFu ZCB3aGF0IHlvdSB3YW50IVxuIikpKQoKKG9rdnMtY2xvc2Ugb2t2cykK --=_8a856e773e8bfd852b8568f4c88cb250 Content-Transfer-Encoding: base64 Content-Type: text/plain; name=README.md Content-Disposition: attachment; filename=README.md; size=277 IyBndWlsZS1nb3RvZmlzaAoKU21hbGwgY29tbWFuZCBsaW5lIHV0aWxpdHkgdG8gaW5kZXggYW5k IHNlYXJjaCBwbGFpbiB0ZXh0LgoKYGBgCiQgZ290b2Zpc2ggLS1oZWxwCgogIGNhdCBoZWxsbyB8 IGdvdG9maXNoIGluZGV4IFVOSVFVRS1JREVOVElGSUVSCgogIGN1cmwgaHR0cHM6Ly9lbi53aWtp cGVkaWEub3JnL3dpa2kvR05VX0d1aWxlIHwgaHRtbDJ0ZXh0IHwgZ290b2Zpc2ggaW5kZXggIkdO VSBHdWlsZSIKCiAgZ290b2Zpc2ggc2VhcmNoICtrZXl3b3JkIC1taW51cwoKYGBgCg== --=_8a856e773e8bfd852b8568f4c88cb250--