fix for wordfreq for MLton

Stephen Weeks sweeks@intertrust.com
Tue, 12 Jun 2001 23:16:50 -0700


--q3cOXNn2YU
Content-Type: text/plain; charset=us-ascii
Content-Description: message body text
Content-Transfer-Encoding: 7bit


> I already E-mail'd Stephen, but he hasn't answered yet: the reason that
> wordfreq is so slow in MLton is because of a bug in the hash function used.
> I sent the fix to him, but if you just change the hash function so that it
> actually loops it will run MUCH better (currently it is only returning
> 26 different hash values, so the buckets are really big).
> Here is the fixed hash:
...

Thanks for the fix Henry (and for the other one you sent as well).  Doug,
attached is the entire new version of wordfreq.mlton with both bug fixes.  Of
course, there will probably be another one along shortly, since Henry and I are
looking into why it's still so slow.



--q3cOXNn2YU
Content-Type: application/octet-stream
Content-Disposition: attachment;
	filename="wordfreq.mlton"
Content-Transfer-Encoding: base64

KCogLSotIG1vZGU6IHNtbCAtKi0KICogJElkOiB3b3JkZnJlcS5tbHRvbix2IDEuMSAyMDAxLzA2
LzAxIDE3OjU2OjMxIGRvdWcgRXhwICQKICogaHR0cDovL3d3dy5iYWdsZXkub3JnL35kb3VnL3No
b290b3V0LwogKiBmcm9tIFN0ZXBoZW4gV2Vla3MKICopCgpmdW4gZm9yIChzdGFydCwgc3RvcCwg
ZikgPQogICBsZXQKICAgICAgZnVuIGxvb3AgaSA9CgkgaWYgaSA+IHN0b3AKCSAgICB0aGVuICgp
CgkgZWxzZSAoZiBpOyBsb29wIChpICsgMSkpCiAgIGluCiAgICAgIGxvb3Agc3RhcnQKICAgZW5k
CmZ1biBpbmNyIHIgPSByIDo9IDEgKyAhcgp2YWwgc3ViID0gQXJyYXkuc3ViCnZhbCB1cGRhdGUg
PSBBcnJheS51cGRhdGUKICAgCnNpZ25hdHVyZSBIQVNIX1NFVCA9CiAgIHNpZwogICAgICB0eXBl
ICdhIHQKCiAgICAgIHZhbCBmb3JlYWNoOiAnYSB0ICogKCdhIC0+IHVuaXQpIC0+IHVuaXQKICAg
ICAgKCogbG9va3VwT3JJbnNlcnQgKHMsIGgsIHAsIGYpICBsb29rcyBpbiB0aGUgc2V0IHMgZm9y
IGFuIGVudHJ5IHdpdGggaGFzaCBoCiAgICAgICAqIHNhdGlzZnlpbmcgcHJlZGljYXRlIHAuICBJ
ZiB0aGUgZW50cnkgaXMgdGhlcmUsIGl0IGlzIHJldHVybmVkLgogICAgICAgKiBPdGhlcndpc2Us
IHRoZSBmdW5jdGlvbiBmIGlzIGNhbGxlZCB0byBjcmVhdGUgYSBuZXcgZW50cnksIHdoaWNoIGlz
CiAgICAgICAqIGluc2VydGVkIGFuZCByZXR1cm5lZC4KICAgICAgICopCiAgICAgIHZhbCBsb29r
dXBPckluc2VydDogJ2EgdCAqIHdvcmQgKiAoJ2EgLT4gYm9vbCkgKiAodW5pdCAtPiAnYSkgLT4g
J2EKICAgICAgdmFsIG5ldzoge2hhc2g6ICdhIC0+IHdvcmR9IC0+ICdhIHQKICAgICAgdmFsIHNp
emU6ICdhIHQgLT4gaW50CiAgIGVuZAoKc3RydWN0dXJlIEhhc2hTZXQ6IEhBU0hfU0VUID0Kc3Ry
dWN0CgpkYXRhdHlwZSAnYSB0ID0KICAgVCBvZiB7YnVja2V0czogJ2EgbGlzdCBhcnJheSByZWYs
CgkgaGFzaDogJ2EgLT4gd29yZCwKCSBtYXNrOiB3b3JkIHJlZiwKCSBudW1JdGVtczogaW50IHJl
Zn0KCnZhbCBpbml0aWFsU2l6ZTogaW50ID0gNjU1MzYKdmFsIGluaXRpYWxNYXNrOiB3b3JkID0g
V29yZC5mcm9tSW50IGluaXRpYWxTaXplIC0gMHcxCgpmdW4gJ2EgbmV3IHtoYXNofTogJ2EgdCA9
CiAgIFQge2J1Y2tldHMgPSByZWYgKEFycmF5LmFycmF5IChpbml0aWFsU2l6ZSwgW10pKSwKICAg
ICAgaGFzaCA9IGhhc2gsCiAgICAgIG51bUl0ZW1zID0gcmVmIDAsCiAgICAgIG1hc2sgPSByZWYg
aW5pdGlhbE1hc2t9CgpmdW4gc2l6ZSAoVCB7bnVtSXRlbXMsIC4uLn0pID0gIW51bUl0ZW1zCmZ1
biBudW1CdWNrZXRzIChUIHtidWNrZXRzLCAuLi59KSA9IEFycmF5Lmxlbmd0aCAoIWJ1Y2tldHMp
CgpmdW4gaW5kZXggKHc6IHdvcmQsIG1hc2s6IHdvcmQpOiBpbnQgPQogICBXb3JkLnRvSW50IChX
b3JkLmFuZGIgKHcsIG1hc2spKQogICAKZnVuIHJlc2l6ZSAoVCB7YnVja2V0cywgaGFzaCwgbWFz
aywgLi4ufSwgc2l6ZTogaW50LCBuZXdNYXNrOiB3b3JkKTogdW5pdCA9CiAgIGxldAogICAgICB2
YWwgbmV3QnVja2V0cyA9IEFycmF5LmFycmF5IChzaXplLCBbXSkKICAgaW4gQXJyYXkuYXBwIChm
biByID0+CgkJIExpc3QuYXBwIChmbiBhID0+CgkJCSAgICAgICBsZXQgdmFsIGogPSBpbmRleCAo
aGFzaCBhLCBuZXdNYXNrKQoJCQkgICAgICAgaW4gQXJyYXkudXBkYXRlCgkJCQkgIChuZXdCdWNr
ZXRzLCBqLAoJCQkJICAgYSA6OiBBcnJheS5zdWIgKG5ld0J1Y2tldHMsIGopKQoJCQkgICAgICAg
ZW5kKSByKSAoIWJ1Y2tldHMpCiAgICAgIDsgYnVja2V0cyA6PSBuZXdCdWNrZXRzCiAgICAgIDsg
bWFzayA6PSBuZXdNYXNrCiAgIGVuZAogICAJICAgICAgIApmdW4gbWF5YmVHcm93IChzIGFzIFQg
e2J1Y2tldHMsIG1hc2ssIG51bUl0ZW1zLCAuLi59KTogdW5pdCA9CiAgIGxldAogICAgICB2YWwg
biA9IEFycmF5Lmxlbmd0aCAoIWJ1Y2tldHMpCiAgIGluIGlmICFudW1JdGVtcyAqIDQgPiBuCgkg
dGhlbiByZXNpemUgKHMsCgkJICAgICAgbiAqIDIsCgkJICAgICAgKCogVGhlIG5ldyBtYXNrIGRl
cGVuZHMgb24gZ3Jvd0ZhY3RvciBiZWluZyAyLiAqKQoJCSAgICAgIFdvcmQub3JiICgwdzEsIFdv
cmQuPDwgKCFtYXNrLCAwdzEpKSkKICAgICAgZWxzZSAoKQogICBlbmQKCmZ1biBwZWVrR2VuIChU
IHtidWNrZXRzID0gcmVmIGJ1Y2tldHMsIG1hc2ssIC4uLn0sIHcsIHAsIG5vLCB5ZXMpID0KICAg
bGV0CiAgICAgIHZhbCBqID0gaW5kZXggKHcsICFtYXNrKQogICAgICB2YWwgYiA9IEFycmF5LnN1
YiAoYnVja2V0cywgaikKICAgaW4gY2FzZSBMaXN0LmZpbmQgcCBiIG9mCiAgICAgIE5PTkUgPT4g
bm8gKGosIGIpCiAgICB8IFNPTUUgYSA9PiB5ZXMgYQogICBlbmQKCmZ1biBsb29rdXBPckluc2Vy
dCAodGFibGUgYXMgVCB7YnVja2V0cywgbnVtSXRlbXMsIC4uLn0sIHcsIHAsIGYpID0KICAgbGV0
CiAgICAgIGZ1biBubyAoaiwgYikgPQoJIGxldCB2YWwgYSA9IGYgKCkKCSAgICB2YWwgXyA9IGlu
Y3IgbnVtSXRlbXMKCSAgICB2YWwgXyA9IEFycmF5LnVwZGF0ZSAoIWJ1Y2tldHMsIGosIGEgOjog
YikKCSAgICB2YWwgXyA9IG1heWJlR3JvdyB0YWJsZQoJIGluIGEKCSBlbmQKICAgaW4gcGVla0dl
biAodGFibGUsIHcsIHAsIG5vLCBmbiB4ID0+IHgpCiAgIGVuZAoKZnVuIGZvcmVhY2ggKFQge2J1
Y2tldHMsIC4uLn0sIGYpID0KICAgQXJyYXkuYXBwIChmbiByID0+IExpc3QuYXBwIGYgcikgKCFi
dWNrZXRzKQoKZW5kCgpzdHJ1Y3R1cmUgQnVmZmVyOgogICBzaWcKICAgICAgdHlwZSB0CgogICAg
ICB2YWwgYWRkOiB0ICogV29yZDgud29yZCAtPiB1bml0CiAgICAgIHZhbCBjbGVhcjogdCAtPiB1
bml0CiAgICAgIHZhbCBjb250ZW50czogdCAtPiBzdHJpbmcKICAgICAgdmFsIG5ldzogaW50IC0+
IHQKICAgZW5kID0KICAgc3RydWN0CiAgICAgIGRhdGF0eXBlIHQgPSBUIG9mIHtlbHRzOiBXb3Jk
OEFycmF5LmFycmF5IHJlZiwKCQkJIHNpemU6IGludCByZWZ9CgogICAgICBmdW4gY29udGVudHMg
KFQge2VsdHMsIHNpemUsIC4uLn0pID0KCSBCeXRlLmJ5dGVzVG9TdHJpbmcgKFdvcmQ4QXJyYXku
ZXh0cmFjdCAoIWVsdHMsIDAsIFNPTUUgKCFzaXplKSkpCgogICAgICBmdW4gY2xlYXIgKFQge3Np
emUsIC4uLn0pID0gc2l6ZSA6PSAwCgogICAgICBmdW4gbmV3IChidWZTaXplKSA9CgkgVCB7ZWx0
cyA9IHJlZiAoV29yZDhBcnJheS5hcnJheSAoYnVmU2l6ZSwgMHcwKSksCgkgICAgc2l6ZSA9IHJl
ZiAwfQoKICAgICAgZnVuIGFkZCAoVCB7ZWx0cywgc2l6ZX0sIHgpID0KCSBsZXQKCSAgICB2YWwg
cyA9ICFzaXplCgkgICAgdmFsIF8gPSBzaXplIDo9IHMgKyAxCgkgICAgdmFsIGEgPSAhZWx0cwoJ
ICAgIHZhbCBuID0gV29yZDhBcnJheS5sZW5ndGggYQoJIGluCgkgICAgaWYgcyA9IG4KCSAgICAg
ICB0aGVuCgkJICBsZXQKCQkgICAgIHZhbCBhJyA9CgkJCVdvcmQ4QXJyYXkudGFidWxhdGUKCQkJ
KDIgKiBuLCBmbiBpID0+CgkJCSBpZiBpIDwgbiB0aGVuIFdvcmQ4QXJyYXkuc3ViIChhLCBpKSBl
bHNlIDB3MCkKCQkgICAgIHZhbCBfID0gZWx0cyA6PSBhJwoJCSAgICAgdmFsIF8gPSBXb3JkOEFy
cmF5LnVwZGF0ZSAoYScsIHMsIHgpCgkJICBpbiAoKQoJCSAgZW5kCgkgICAgZWxzZSBXb3JkOEFy
cmF5LnVwZGF0ZSAoYSwgcywgeCkKCSBlbmQKICAgZW5kCgpzdHJ1Y3R1cmUgUXVpY2tzb3J0Ogog
ICBzaWcKICAgICAgdmFsIHF1aWNrc29ydDogJ2EgYXJyYXkgKiAoJ2EgKiAnYSAtPiBib29sKSAt
PiB1bml0CiAgIGVuZCA9CiAgIHN0cnVjdAogICAgICBmdW4gYXNzZXJ0IChzLCBmOiB1bml0IC0+
IGJvb2wpID0KCSBpZiB0cnVlIG9yZWxzZSBmICgpCgkgICAgdGhlbiAoKQoJIGVsc2UgcmFpc2Ug
RmFpbCAoY29uY2F0IFsiYXNzZXJ0OiAiLCBzXSkKCiAgICAgIGZ1biBmb3JhbGwgKGxvdywgaGln
aCwgZikgPQoJIGxldAoJICAgIGZ1biBsb29wIGkgPSBpID4gaGlnaCBvcmVsc2UgKGYgaSBhbmRh
bHNvIGxvb3AgKGkgKyAxKSkKCSBpbgoJICAgIGxvb3AgbG93CgkgZW5kCgogICAgICBmdW4gZm9s
ZCAobCwgdSwgc3RhdGUsIGYpID0KCSBsZXQKCSAgICBmdW4gbG9vcCAoaSwgc3RhdGUpID0KCSAg
ICAgICBpZiBpID4gdQoJCSAgdGhlbiBzdGF0ZQoJICAgICAgIGVsc2UgbG9vcCAoaSArIDEsIGYg
KGksIHN0YXRlKSkKCSBpbgoJICAgIGxvb3AgKGwsIHN0YXRlKQoJIGVuZAoKICAgICAgKCogQ2hl
Y2sgaWYgZW50cmllcyBpbiBhW2xvIC4uLiBoaV0gYXJlIHNvcnRlZC4gKikKICAgICAgZnVuICdh
IGlzU29ydGVkIChhOiAnYSBhcnJheSwKCQkgICAgICAgbG86IGludCwKCQkgICAgICAgaGk6IGlu
dCwKCQkgICAgICAgb3AgPD0gOiAnYSAqICdhIC0+IGJvb2wpID0KCSBsZXQKCSAgICBmdW4gbG9v
cCAoaSwgeCkgPQoJICAgICAgIGkgPiBoaQoJICAgICAgIG9yZWxzZSBsZXQKCQkJIHZhbCB5ID0g
c3ViIChhLCBpKQoJCSAgICAgIGluCgkJCSB4IDw9IHkgYW5kYWxzbyBsb29wIChpICsgMSwgeSkK
CQkgICAgICBlbmQKCSBpbgoJICAgIGxvID49IGhpIG9yZWxzZSBsb29wIChsbyArIDEsIHN1YiAo
YSwgbG8pKQoJIGVuZAoKICAgICAgKCogRnJvbSBwYWdlIDI4NCBvZiBOdW1lcmljYWwgUmVjaXBl
cyBpbiBDLiAqKQogICAgICBsb2NhbAoJIG9wZW4gV29yZAoJIHZhbCBzZWVkID0gcmVmIDB3MTMK
ICAgICAgaW4KCSBmdW4gcmFuZCAoKSA9CgkgICAgbGV0CgkgICAgICAgdmFsIHJlcyA9IDB3MTY2
NDUyNSAqICFzZWVkICsgMHcxMDEzOTA0MjIzCgkgICAgICAgdmFsIF8gPSBzZWVkIDo9IHJlcwoJ
ICAgIGluCgkgICAgICAgdG9JbnRYIHJlcwoJICAgIGVuZAogICAgICBlbmQKCiAgICAgIGZ1biBy
YW5kSW50IChsbywgaGkpID0gbG8gKyBJbnQubW9kIChyYW5kKCksIGhpIC0gbG8gKyAxKQoKICAg
ICAgKCogaW5zZXJ0aW9uIHNvcnQgYmFzZWQgb24gcGFnZSAxMDggb2YgUHJvZ3JhbW1pbmcgUGVh
cmxzLCBieSBCZW50bGV5LiAqKQogICAgICBmdW4gaW5zZXJ0aW9uU29ydCAoYTogJ2EgYXJyYXks
IG9wIDw9IDogJ2EgKiAnYSAtPiBib29sKTogdW5pdCA9CgkgbGV0CgkgICAgZnVuIHggaSA9IHN1
YiAoYSwgaSkKCSBpbgoJICAgIGZvciAoMSwgQXJyYXkubGVuZ3RoIGEgLSAxLCBmbiBpID0+CgkJ
IGxldAoJCSAgICB2YWwgXyA9CgkJICAgICAgIGFzc2VydCAoImluc2VydGlvblNvcnQxIiwgZm4g
KCkgPT4KCQkJICAgICAgIGlzU29ydGVkIChhLCAwLCBpIC0gMSwgb3AgPD0pKQoJCSAgICB2YWwg
dCA9IHggaQoJCSAgICBmdW4gc2lmdCAoajogaW50KSA9CgkJICAgICAgIChhc3NlcnQgKCJpbnNl
cnRpb25Tb3J0MiIsIGZuICgpID0+CgkJCQlpc1NvcnRlZCAoYSwgMCwgaiAtIDEsIG9wIDw9KQoJ
CQkJYW5kYWxzbyBpc1NvcnRlZCAoYSwgaiArIDEsIGksIG9wIDw9KQoJCQkJYW5kYWxzbyBmb3Jh
bGwgKGogKyAxLCBpLCBmbiBrID0+IHQgPD0geCBrKSkKCQkJOyBpZiBqID4gMAoJCQkgICAgIHRo
ZW4KCQkJCWxldAoJCQkJICAgdmFsIGonID0gaiAtIDEKCQkJCSAgIHZhbCB6ID0geCBqJwoJCQkJ
aW4gaWYgdCA8PSB6CgkJCQkgICAgICB0aGVuICh1cGRhdGUgKGEsIGosIHopOwoJCQkJCSAgICBz
aWZ0IGonKQoJCQkJICAgZWxzZSBqCgkJCQllbmQKCQkJICBlbHNlIGopCgkJICAgIHZhbCBfID0g
dXBkYXRlIChhLCBzaWZ0IGksIHQpCgkJIGluICgpCgkJIGVuZCkKCSBlbmQKCiAgICAgICgqIHF1
aWNrc29ydCBiYXNlZCBvbiBwYWdlIDExMiBvZiBQcm9ncmFtbWluZyBQZWFybHMsIGJ5IEJlbnRs
ZXkuICopCiAgICAgIGZ1biAnYSBxdWlja3NvcnQgKGE6ICdhIGFycmF5LCBvcCA8PSA6ICdhICog
J2EgLT4gYm9vbCk6IHVuaXQgPQoJIGxldAoJICAgIGZ1biB4IGkgPSBBcnJheS5zdWIgKGEsIGkp
CgkgICAgZnVuIHN3YXAgKGksIGopID0KCSAgICAgICBsZXQKCQkgIHZhbCB0ID0geCBpCgkJICB2
YWwgXyA9IHVwZGF0ZSAoYSwgaSwgeCBqKQoJCSAgdmFsIF8gPSB1cGRhdGUgKGEsIGosIHQpCgkg
ICAgICAgaW4gKCkKCSAgICAgICBlbmQKCSAgICB2YWwgY3V0b2ZmID0gMjAKCSAgICBmdW4gcXNv
cnQgKGw6IGludCwgdTogaW50KTogdW5pdCA9CgkgICAgICAgaWYgdSAtIGwgPiBjdXRvZmYKCQkg
IHRoZW4KCQkgICAgIGxldAoJCQl2YWwgXyA9IHN3YXAgKGwsIHJhbmRJbnQgKGwsIHUpKQoJCQl2
YWwgdCA9IHggbAoJCQl2YWwgbSA9CgkJCSAgIGZvbGQKCQkJICAgKGwgKyAxLCB1LCBsLCBmbiAo
aSwgbSkgPT4KCQkJICAgIChhc3NlcnQKCQkJICAgICAoInFzb3J0IiwgZm4gKCkgPT4KCQkJICAg
ICAgZm9yYWxsIChsICsgMSwgbSwgZm4gayA9PiB4IGsgPD0gdCkKCQkJICAgICAgYW5kYWxzbyBm
b3JhbGwgKG0gKyAxLCBpIC0gMSwgZm4gayA9PiBub3QgKHggayA8PSB0KSkpCgkJCSAgICAgOyBp
ZiB4IGkgPD0gdAoJCQkJICB0aGVuIChzd2FwIChtICsgMSwgaSkKCQkJCQk7IG0gKyAxKQoJCQkg
ICAgICAgZWxzZSBtKSkKCQkJdmFsIF8gPSBzd2FwIChsLCBtKQoJCQl2YWwgXyA9IHFzb3J0IChs
LCBtIC0gMSkKCQkJdmFsIF8gPSBxc29ydCAobSArIDEsIHUpCgkJICAgICBpbiAoKQoJCSAgICAg
ZW5kCgkgICAgICAgZWxzZSAoKQoJICAgIHZhbCBtYXggPSBBcnJheS5sZW5ndGggYSAtIDEKCSAg
ICB2YWwgXyA9IHFzb3J0ICgwLCBtYXgpCgkgICAgdmFsIF8gPSBpbnNlcnRpb25Tb3J0IChhLCBv
cCA8PSkgIAoJIGluCgkgICAgKCkKCSBlbmQKICAgZW5kCgooKiBUaGlzIGhhc2ggZnVuY3Rpb24g
aXMgdGFrZW4gZnJvbSBwYWdlcyA1Ni01NyBvZgogKiBUaGUgUHJhY3RpY2Ugb2YgUHJvZ3JhbW1p
bmcgYnkgS2VybmlnaGFuIGFuZCBQaWtlLgogKikKZnVuIGhhc2ggKHM6IHN0cmluZyk6IHdvcmQg
PQogICBsZXQKICAgICAgdmFsIG4gPSBTdHJpbmcuc2l6ZSBzCiAgICAgIGZ1biBsb29wIChpLCB3
KSA9CgkgaWYgaSA9IG4KCSAgICB0aGVuIHcKCSBlbHNlIFdvcmQuZnJvbUludCAoQ2hhci5vcmQg
KFN0cmluZy5zdWIgKHMsIGkpKSkgKyBXb3JkLiogKHcsIDB3MzEpCiAgIGluCiAgICAgIGxvb3Ag
KDAsIDB3MCkKICAgZW5kCgpmdW4gaGFzaCAoczogc3RyaW5nKTogd29yZCA9CiAgIGxldAogICAg
ICB2YWwgbiA9IFN0cmluZy5zaXplIHMKICAgICAgZnVuIGxvb3AgKGksIHcpID0KCSBpZiBpID0g
bgoJICAgIHRoZW4gdwoJIGVsc2UgbG9vcCAoaSArIDEsCgkJICAgIFdvcmQuZnJvbUludCAoQ2hh
ci5vcmQgKFN0cmluZy5zdWIgKHMsIGkpKSkKCQkgICAgICAgKyBXb3JkLiogKHcsIDB3MzEpKQog
ICBpbgogICAgICBsb29wICgwLCAwdzApCiAgIGVuZAoKKCogQmFzZWQgb24gd29yZGZyZXEub2Nh
bWwuICopCgp2YWwgbWF4ID0gNDA5Ngp2YWwgYnVmID0gV29yZDhBcnJheS5hcnJheSAobWF4LCAw
dzApCnZhbCBjb3VudDoge2hhc2g6IHdvcmQsCgkgICAgd29yZDogc3RyaW5nLAoJICAgIGNvdW50
OiBpbnQgcmVmfSBIYXNoU2V0LnQgPSBIYXNoU2V0Lm5ldyB7aGFzaCA9ICNoYXNofQp2YWwgd2J1
ZiA9IEJ1ZmZlci5uZXcgNjQKCnZhbCBjMmIgPSBCeXRlLmNoYXJUb0J5dGUKZnVuIHNjYW5fd29y
ZHMgKGksIG4sIGlud29yZCkgPQogIGlmIGkgPCBuCiAgICAgdGhlbgoJbGV0CgkgICB2YWwgYyA9
IFdvcmQ4QXJyYXkuc3ViIChidWYsIGkpCglpbgoJICAgaWYgYzJiICMiYSIgPD0gYyBhbmRhbHNv
IGMgPD0gYzJiICMieiIKCSAgICAgIHRoZW4gKEJ1ZmZlci5hZGQgKHdidWYsIGMpOwoJCSAgICBz
Y2FuX3dvcmRzIChpICsgMSwgbiwgdHJ1ZSkpCgkgICBlbHNlCgkgICAgICBpZiBjMmIgIyJBIiA8
PSBjIGFuZGFsc28gYyA8PSBjMmIgIyJaIgoJCSB0aGVuCgkJICAgIChCdWZmZXIuYWRkICh3YnVm
LCBjICsgMHczMik7CgkJICAgICBzY2FuX3dvcmRzIChpICsgMSwgbiwgdHJ1ZSkpCgkgICAgICBl
bHNlCgkJIGlmIGlud29yZAoJCSAgICB0aGVuIAoJCSAgICAgICBsZXQKCQkJICB2YWwgdyA9IEJ1
ZmZlci5jb250ZW50cyB3YnVmCgkJCSAgdmFsIGggPSBoYXNoIHcKCQkgICAgICAgaW4KCQkJICBp
bmNyICgjY291bnQKCQkJCShIYXNoU2V0Lmxvb2t1cE9ySW5zZXJ0CgkJCQkgKGNvdW50LCBoLAoJ
CQkJICBmbiB7aGFzaCwgd29yZCwgLi4ufSA9PgoJCQkJICBoYXNoID0gaCBhbmRhbHNvIHdvcmQg
PSB3LAoJCQkJICBmbiAoKSA9PiB7aGFzaCA9IGgsIHdvcmQgPSB3LCBjb3VudCA9IHJlZiAwfSkp
KTsKCQkJICBCdWZmZXIuY2xlYXIgd2J1ZjsKCQkJICBzY2FuX3dvcmRzIChpICsgMSwgbiwgZmFs
c2UpCgkJICAgICAgIGVuZAoJCSBlbHNlIHNjYW5fd29yZHMgKGkgKyAxLCBuLCBmYWxzZSkKCWVu
ZAogIGVsc2UKICAgICBsZXQKCXZhbCBucmVhZCA9CgkgICBQb3NpeC5JTy5yZWFkQXJyIChQb3Np
eC5GaWxlU3lzLnN0ZGluLAoJCQkgICAgIHtidWYgPSBidWYsIGkgPSAgMCwgc3ogPSBOT05FfSkK
ICAgICBpbgoJaWYgbnJlYWQgPSAwCgkgICB0aGVuICgpCgllbHNlIHNjYW5fd29yZHMgKDAsIG5y
ZWFkLCBpbndvcmQpCiAgICAgZW5kCgpmdW4gcHJpbnRsIFtdID0gcHJpbnQgIlxuIiB8IHByaW50
bChoOjp0KSA9ICggcHJpbnQgaCA7IHByaW50bCB0ICkKCmZ1biByaWdodEp1c3RpZnkgKHM6IHN0
cmluZywgd2lkdGg6IGludCkgPQogICBsZXQKICAgICAgdmFsIG4gPSBTdHJpbmcuc2l6ZSBzCiAg
IGluIGNvbmNhdCBbQ2hhclZlY3Rvci50YWJ1bGF0ZSAod2lkdGggLSBuLCBmbiBfID0+ICMiICIp
LCBzXQogICBlbmQKCmZ1biBtYWluIChuYW1lLCBhcmdzKSA9CiAgIGxldAoJdmFsIF8gPSBzY2Fu
X3dvcmRzICgwLCAwLCBmYWxzZSkKCXZhbCBhID0gQXJyYXkuYXJyYXkgKEhhc2hTZXQuc2l6ZSBj
b3VudCwgKDAsICIiKSkKCXZhbCBpID0gcmVmIDAKCXZhbCBfID0gSGFzaFNldC5mb3JlYWNoIChj
b3VudCwgZm4ge3dvcmQsIGNvdW50LCAuLi59ID0+CgkJCSAoQXJyYXkudXBkYXRlIChhLCAhaSwg
KCFjb3VudCwgd29yZCkpOyBpbmNyIGkpKQoJdmFsIF8gPSBRdWlja3NvcnQucXVpY2tzb3J0IChh
LCBmbiAoKGMsIHcpLCAoYycsIHcnKSkgPT4KCQkJICAgICBjID4gYycgb3JlbHNlIGMgPSBjJyBh
bmRhbHNvIHcgPj0gdycpCgl2YWwgXyA9IEFycmF5LmFwcCAoZm4gKGMsIHcpID0+CgkJICAgcHJp
bnRsIFtyaWdodEp1c3RpZnkgKEludC50b1N0cmluZyBjLCA3KSwgIlx0Iiwgd10pIGEKICAgaW4K
ICAgICAgT1MuUHJvY2Vzcy5zdWNjZXNzCiAgIGVuZAoKdmFsIF8gPSBtYWluKCBDb21tYW5kTGlu
ZS5uYW1lKCksIENvbW1hbmRMaW5lLmFyZ3VtZW50cygpICkKCg==

--q3cOXNn2YU--