Chris Culy

Work in Progress: Key Words

This page is a continuation of some of my current work in progess, in particular exploring what letters are about. The first part looked at word frequences, but simple word frequencies don’t tell the whole story. We used variance to get one idea of the variability of word frequencies. Another idea is that of key words, words which “clump” in certain letters. A typical measure of key words is the ratio of the relative frequency of the word in the letter to the number of documents it occurs in (called tfidf). The higher the ratio, the more special the word is for that letter.

EBB and RB key words

As with word frequencies, and with many of the other examples in the demo videos, I am using the letters between Elizabeth Barrett (EBB, or just E) and Robert Browning (RB, or just R). And as with word frequencies, we will be looking at nouns, verbs, etc individually, and we will be using lemmas (the dictionary forms).

Comparing key words

Nouns

First up are nouns as key words. We’ll use a slope graph to compare the key words for EBB and RB. As usual, I’m using just the top 20 nouns for each. Lines connect the same word (lemma) for E and R; where there is no line, that means that word does not occur in the other person’s top 20 noun key words. We can see that EBB and RB have few key words in common — just book and happiness.

We can also see a glitch in the automatic processing: &c (“etc”) is considered to be a noun, even though we probably wouldn’t consider it to be one.

We can also compare key words versus frequent words. One thing that is interesting is that Kenyon (a relative of EBB and a friend of RB) is a frequent word for EBB, but not a key word. This is because she mentions Mr. Kenyon in lots of letters, so he is not a special mention: key words are words that are concentrated in just some letters.

Finally, we can also look at the key words across time. Here the size of the dots indicates the TFIDF measure. Only book and happiness have dots for both EBB and RB, since those are the only two key words they have in common. One interesting word to note is Flush, EBB’s dog. Flush was kidnapped and RB helped recover him. This was important to EBB, but apparently not as important to RB (Flush actually bit RB at one point early on).

Verbs

When we look at verbs, we see that EBB and RB have no overlap at all in their key word verbs.

And looking at them over time … (Note R’s use of kiss)

TIFIDF for individual words

We can also look at the TFIDF scores for individual words, not just the top key words. Here we look at love, poem, and poetry, since EBB and RB were romantic poets. Since these are not key words, there is much more overlap in their usage. There is actually even more overlap, but I am not showing the letters with low TFIDF scores (anything less than 0.1).

LS0tCnRpdGxlOiAiV29yayBpbiBQcm9ncmVzczogS2V5IFdvcmRzIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgojIyBDaHJpcyBDdWx5CiMjIyMgaW5mb0BjaHJpc2N1bHkubmV0IAojIyMjIFtjaHJpc2N1bHkubmV0XShodHRwOi8vY2hyaXNjdWx5Lm5ldCkKIyMjIyBbQmFjayB0byB0aGUgZGVtbyB2aWRlb3NdKC4uL2luZGV4Lmh0bWwpCiMjIyMgW0JhY2sgdG8gV29yayBpbiBQcm9ncmVzczogV29yZCBGcmVxdWVuY2llc10od2lwLmh0bWwpCiMjIyMjIFJldmlzZWQgMjcgQXVndXN0IDIwMTcKCiMgV29yayBpbiBQcm9ncmVzczogS2V5IFdvcmRzCgpUaGlzIHBhZ2UgaXMgYSBjb250aW51YXRpb24gb2Ygc29tZSBvZiBteSBjdXJyZW50IHdvcmsgaW4gcHJvZ2VzcywgaW4gcGFydGljdWxhciBleHBsb3Jpbmcgd2hhdCBsZXR0ZXJzIGFyZSBhYm91dC4gVGhlIFtmaXJzdCBwYXJ0XSh3aXAuaHRtbCkgbG9va2VkIGF0IHdvcmQgZnJlcXVlbmNlcywgYnV0IHNpbXBsZSB3b3JkIGZyZXF1ZW5jaWVzIGRvbid0IHRlbGwgdGhlIHdob2xlIHN0b3J5LiBXZSB1c2VkIF92YXJpYW5jZV8gdG8gZ2V0IG9uZSBpZGVhIG9mIHRoZSB2YXJpYWJpbGl0eSBvZiB3b3JkIGZyZXF1ZW5jaWVzLiBBbm90aGVyIGlkZWEgaXMgdGhhdCBvZiBfa2V5IHdvcmRzXywgd29yZHMgd2hpY2ggImNsdW1wIiBpbiBjZXJ0YWluIGxldHRlcnMuIEEgdHlwaWNhbCBtZWFzdXJlIG9mIGtleSB3b3JkcyBpcyB0aGUgcmF0aW8gb2YgdGhlIHJlbGF0aXZlIGZyZXF1ZW5jeSBvZiB0aGUgd29yZCBpbiB0aGUgbGV0dGVyIHRvIHRoZSBudW1iZXIgb2YgZG9jdW1lbnRzIGl0IG9jY3VycyBpbiAoY2FsbGVkIF90ZmlkZl8pLiBUaGUgaGlnaGVyIHRoZSByYXRpbywgdGhlIG1vcmUgc3BlY2lhbCB0aGUgd29yZCBpcyBmb3IgdGhhdCBsZXR0ZXIuCgojIEVCQiBhbmQgUkIga2V5IHdvcmRzCgpBcyB3aXRoIHdvcmQgZnJlcXVlbmNpZXMsIGFuZCB3aXRoIG1hbnkgb2YgdGhlIG90aGVyIGV4YW1wbGVzIGluIHRoZSBkZW1vIHZpZGVvcywgSSBhbSB1c2luZyB0aGUgbGV0dGVycyBiZXR3ZWVuIEVsaXphYmV0aCBCYXJyZXR0IChFQkIsIG9yIGp1c3QgRSkgYW5kIFJvYmVydCBCcm93bmluZyAoUkIsIG9yIGp1c3QgUikuIEFuZCBhcyB3aXRoIHdvcmQgZnJlcXVlbmNpZXMsIHdlIHdpbGwgYmUgbG9va2luZyBhdCBub3VucywgdmVyYnMsIGV0YyBpbmRpdmlkdWFsbHksIGFuZCB3ZSB3aWxsIGJlIHVzaW5nIF9sZW1tYXNfICh0aGUgZGljdGlvbmFyeSBmb3JtcykuCgoKYGBge3Igc2V0dXAsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0V9CgpsaWJyYXJ5KHJlYWRyKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShyZXNoYXBlMikKCgppbmZvIDwtIHJlYWRfY3N2KCJ+L0Ryb3Bib3gvcHl0aG9uX3RleHQvZ2Vuc2ltX3RvcGljcy9lYmJyYl9sZW1tYXNfcG9zLmNzdiIsIAogICAgY29sX3R5cGVzID0gY29scyhkYXRlID0gY29sX2RhdGUoZm9ybWF0ID0gIiVZLSVtLSVkIiksIAogICAgICAgIGZyb20gPSBjb2xfZmFjdG9yKGxldmVscyA9IGMoIkUiLCAiUiIpKSkpCgojdGZpZGZzCgp0ZmlkZnNfQWxsX0UgPC0gcmVhZF9jc3YoIn4vRHJvcGJveC9weXRob25fdGV4dC9nZW5zaW1fdG9waWNzL3RmaWRmc19BbGxfRS5jc3YiLCBjb2xfdHlwZXMgPSBjb2xzKGZyb20gPSBjb2xfZmFjdG9yKGxldmVscyA9IGMoIkUiLCAiUiIpKSkpCnRmaWRmc19BbGxfUiA8LSByZWFkX2Nzdigifi9Ecm9wYm94L3B5dGhvbl90ZXh0L2dlbnNpbV90b3BpY3MvdGZpZGZzX0FsbF9SLmNzdiIsIGNvbF90eXBlcyA9IGNvbHMoZnJvbSA9IGNvbF9mYWN0b3IobGV2ZWxzID0gYygiRSIsICJSIikpKSkKdGZpZGZzX05zX0UgPC0gcmVhZF9jc3YoIn4vRHJvcGJveC9weXRob25fdGV4dC9nZW5zaW1fdG9waWNzL3RmaWRmc19Oc19FLmNzdiIsIGNvbF90eXBlcyA9IGNvbHMoZnJvbSA9IGNvbF9mYWN0b3IobGV2ZWxzID0gYygiRSIsICJSIikpKSkKdGZpZGZzX05zX1IgPC0gcmVhZF9jc3YoIn4vRHJvcGJveC9weXRob25fdGV4dC9nZW5zaW1fdG9waWNzL3RmaWRmc19Oc19SLmNzdiIsIGNvbF90eXBlcyA9IGNvbHMoZnJvbSA9IGNvbF9mYWN0b3IobGV2ZWxzID0gYygiRSIsICJSIikpKSkKdGZpZGZzX1ZzX0UgPC0gcmVhZF9jc3YoIn4vRHJvcGJveC9weXRob25fdGV4dC9nZW5zaW1fdG9waWNzL3RmaWRmc19Wc19FLmNzdiIsIGNvbF90eXBlcyA9IGNvbHMoZnJvbSA9IGNvbF9mYWN0b3IobGV2ZWxzID0gYygiRSIsICJSIikpKSkKdGZpZGZzX1ZzX1IgPC0gcmVhZF9jc3YoIn4vRHJvcGJveC9weXRob25fdGV4dC9nZW5zaW1fdG9waWNzL3RmaWRmc19Wc19SLmNzdiIsIGNvbF90eXBlcyA9IGNvbHMoZnJvbSA9IGNvbF9mYWN0b3IobGV2ZWxzID0gYygiRSIsICJSIikpKSkKYGBgCgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQpub3VucyA8LSBjKCJOTiIsIk5OUyIsIk5QIiwiTlBTIikKdmVyYnMgPC0gYygnVkJaJywgJ1ZCUCcsICdWQicsICdWQkcnLCAnVkJOJywgJ1ZCRCcpCm1vZGFscyA8LSBjKCJNRCIpCnByb25vdW5zIDwtIGMoIlBQIiwiUFAkIikKYWRqZWN0aXZlcyA8LSBjKCJKSiIpICNubyBjb21wYXJhdGl2ZXMsIHN1cGVybGF0aXZlcyA/CmFkdmVyYnMgPC0gYygiUkIiKSAjbm8gY29tcGFyYXRpdmVzLCBzdXBlcmxhdGl2ZXMgPwpgYGAKCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0V9CgpmaWx0ZXJMZW1tYXMgPC0gZnVuY3Rpb24oaW5mb0YscmVtb3ZlTGVtbWFzPU5VTEwsIGluY2x1ZGVMZW1tYXM9TlVMTCkgewogICBpbmZvWCA8LSBpbmZvRgogICBpZiAoISBpcy5udWxsKHJlbW92ZUxlbW1hcykpIHsKICAgICAgaW5mb1ggPC0gZmlsdGVyKGluZm9YLCAhIChsZW1tYSAlaW4lIHJlbW92ZUxlbW1hcykpCiAgICB9IGVsc2UgaWYgKCEgaXMubnVsbChpbmNsdWRlTGVtbWFzKSkgewogICAgICBpbmZvWCA8LSBmaWx0ZXIoaW5mb1gsIGxlbW1hICVpbiUgaW5jbHVkZUxlbW1hcykKICAgIH0gCiAgICByZXR1cm4oaW5mb1gpCn0KCm1ha2VWYXJzIDwtIGZ1bmN0aW9uKHBhcnRzT2ZTcGVlY2gsIHRvcG4sIHJlbW92ZUxlbW1hcz1OVUxMLCBpbmNsdWRlTGVtbWFzPU5VTEwpIHsKICAgIGluZm9YIDwtIGZpbHRlcihpbmZvLCBwb3MgJWluJSBwYXJ0c09mU3BlZWNoKQogICAgCiAgICBYQnlEb2MgPC0gaW5mb1ggJT4lIGNvdW50KGlkLGxlbW1hKQogICAgWENvdW50cyA8LSBsZWZ0X2pvaW4oZ3JvdXBfYnkoaW5mb1gsZnJvbSksWEJ5RG9jKQogICAgWEJ5UGVyc29uIDwtIGluZm9YICU+JSBjb3VudChmcm9tKSAlPiUgc2VsZWN0KGZyb209ZnJvbSx0b3RhbD1uKQogICAgWENvdW50cyA8LSBsZWZ0X2pvaW4oWENvdW50cyxYQnlQZXJzb24pICU+JQogICAgICBmaWx0ZXJMZW1tYXMocmVtb3ZlTGVtbWFzPXJlbW92ZUxlbW1hcyxpbmNsdWRlTGVtbWFzPWluY2x1ZGVMZW1tYXMpCgoKICAgIFhSYW5rcyA8LSBpbmZvWCAlPiUgCiAgICAgIGZpbHRlckxlbW1hcyhyZW1vdmVMZW1tYXM9cmVtb3ZlTGVtbWFzLGluY2x1ZGVMZW1tYXM9aW5jbHVkZUxlbW1hcykgJT4lCiAgICAgIGNvdW50KGZyb20sbGVtbWEsIHNvcnQ9VFJVRSkgJT4lIAogICAgICBncm91cF9ieShmcm9tKSAlPiUgCiAgICAgIG11dGF0ZShyYW5rPXJvd19udW1iZXIoKSkKICAgIAogICAgWFJhbmtzIDwtIGxlZnRfam9pbihYUmFua3MsIFhCeVBlcnNvbikgJT4lIG11dGF0ZSh0Zj1uL3RvdGFsKQogICAgCiAgICBYUmFua3NUb3BOIDwtIGZpbHRlcihYUmFua3MsIHJhbms8PXRvcG4pCiAgICAKICAgIFhDb3VudHNUb3BOIDwtIGZpbHRlcihYQ291bnRzLCBsZW1tYSAlaW4lIHVuaXF1ZShYUmFua3NUb3BOJGxlbW1hKSkKICAgIAogICAgcmV0dXJuKCBsaXN0KCJjb3VudHMiID0gWENvdW50c1RvcE4sICJyYW5rcyIgPSBYUmFua3NUb3BOKSApCn0KCgpnZ1NpZGVCeVNpZGUgPC0gZnVuY3Rpb24oY291bnRzLCB0aXRsZSwgbWF4WT1OQSkgewogIGNvdW50cyAlPiUgZ2dwbG90KCkgKyAKICAgIGdlb21fbGluZShhZXMoZGF0ZSxuL3RvdGFsLGNvbG9yPWZyb20pKSArIAogICAgeGxpbShyYW5nZShjb3VudHMkZGF0ZSkpICsKICAgIHlsaW0oMCxtYXhZKSArCiAgICBmYWNldF93cmFwKGxlbW1hfmZyb20sbmNvbD0yLCBzY2FsZXM9ImZyZWVfeCIsIGxhYmVsbGVyID0gbGFiZWxfd3JhcF9nZW4obXVsdGlfbGluZT1GQUxTRSkpICsgCiAgICB0aGVtZV9jbGFzc2ljKCkgKyAKICAgIGxhYnModGl0bGU9dGl0bGUsIHk9IlJlbGF0aXZlIEZyZXF1ZW5jeSIpICsKICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQp9CgpnZ1Nsb3BlIDwtIGZ1bmN0aW9uKHJhbmtzLCB0aXRsZSkgewogIHJhbmtzICU+JSBnZ3Bsb3QoKSArIAogICAgZ2VvbV9saW5lKGFlcyhmcm9tLHJhbmssZ3JvdXA9bGVtbWEsIGNvbG9yPWxlbW1hKSwgc2hvdy5sZWdlbmQ9RkFMU0UpICsgCiAgICBnZW9tX3RleHQoZGF0YT1maWx0ZXIocmFua3MsZnJvbT09IkUiKSxhZXMoZnJvbSxyYW5rLGxhYmVsPWxlbW1hLGNvbG9yPWxlbW1hKSwgaGp1c3Q9InJpZ2h0IiwgbnVkZ2VfeD0tMC4wNSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyAKICAgIGdlb21fdGV4dChkYXRhPWZpbHRlcihyYW5rcyxmcm9tPT0iUiIpLGFlcyhmcm9tLHJhbmssbGFiZWw9bGVtbWEsY29sb3I9bGVtbWEpLCBoanVzdD0ibGVmdCIsIG51ZGdlX3g9MC4wNSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyAKICAgIHNjYWxlX3hfZGlzY3JldGUocG9zaXRpb24gPSAidG9wIikgKwogICAgc2NhbGVfeV9jb250aW51b3VzKHRyYW5zID0gInJldmVyc2UiLCBicmVha3MgPSB1bmlxdWUocmFua3MkcmFuayksIHNlYy5heGlzID0gZHVwX2F4aXMoKSkgKyAKICAgIHRoZW1lX2NsYXNzaWMoKSArIAogICAgdGhlbWUoYXhpcy5saW5lPWVsZW1lbnRfYmxhbmsoKSwgYXhpcy50aWNrcyA9IGVsZW1lbnRfYmxhbmsoKSwgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsgCiAgICBsYWJzKHRpdGxlPXRpdGxlLCB4PSIiKQp9CgojZm9yIGNvbXBhcmluZyByYW5rcyBvZiBmcmVxdWVuY2llcyB3aXRoIHJhbmtzIHRvIHRmaWRmcwojeFJhbmtzIG5lZWQgbGVtbWEsZnJvbSxyYW5rCmdnU2xvcGVGVCA8LSBmdW5jdGlvbihmcmVxUmFua3MsIHRmaWRmUmFua3MsIHRpdGxlKSB7CiAgekZSIDwtIHNlbGVjdChmcmVxUmFua3MsIGxlbW1hLGZyb20scmFuaykgJT4lIG11dGF0ZSh3aGljaD0iRnJlcXVlbmN5IikKICB6VFIgPC0gc2VsZWN0KHRmaWRmUmFua3MsIGxlbW1hLGZyb20scmFuaykgJT4lIG11dGF0ZSh3aGljaD0iVEZJREYiKQogIHJhbmtzIDwtIGJpbmRfcm93cyh6RlIselRSKQogIAogIHJhbmtzICU+JSBnZ3Bsb3QoKSArIAogICAgZ2VvbV9saW5lKGFlcyh3aGljaCxyYW5rLGdyb3VwPWxlbW1hLCBjb2xvcj1sZW1tYSksIHNob3cubGVnZW5kPUZBTFNFKSArIAogICAgZ2VvbV90ZXh0KGRhdGE9ZmlsdGVyKHJhbmtzLHdoaWNoPT0iRnJlcXVlbmN5IiksYWVzKHdoaWNoLHJhbmssbGFiZWw9bGVtbWEsY29sb3I9bGVtbWEpLCBoanVzdD0icmlnaHQiLCBudWRnZV94PS0wLjA1LCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArIAogICAgZ2VvbV90ZXh0KGRhdGE9ZmlsdGVyKHJhbmtzLHdoaWNoPT0iVEZJREYiKSxhZXMod2hpY2gscmFuayxsYWJlbD1sZW1tYSxjb2xvcj1sZW1tYSksIGhqdXN0PSJsZWZ0IiwgbnVkZ2VfeD0wLjA1LCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArIAogICAgc2NhbGVfeF9kaXNjcmV0ZShwb3NpdGlvbiA9ICJ0b3AiKSArCiAgICBzY2FsZV95X2NvbnRpbnVvdXModHJhbnMgPSAicmV2ZXJzZSIsIGJyZWFrcyA9IHVuaXF1ZShyYW5rcyRyYW5rKSwgc2VjLmF4aXMgPSBkdXBfYXhpcygpKSArIAogICAgdGhlbWVfY2xhc3NpYygpICsgCiAgICB0aGVtZShheGlzLmxpbmU9ZWxlbWVudF9ibGFuaygpLCBheGlzLnRpY2tzID0gZWxlbWVudF9ibGFuaygpLCBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKyAKICAgIGxhYnModGl0bGU9dGl0bGUsIHg9IiIpICsgZmFjZXRfd3JhcCh+ZnJvbSxuY29sPTIpCn0KYGBgCgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQptYWtlVmFyaWFuY2UgPC0gZnVuY3Rpb24ocGFydHNPZlNwZWVjaCwgcmVtb3ZlTGVtbWFzPU5VTEwsIGluY2x1ZGVMZW1tYXM9TlVMTCkgewogICAgaW5mb1ggPC0gZmlsdGVyKGluZm8sIHBvcyAlaW4lIHBhcnRzT2ZTcGVlY2gpCiAgICAKICAgIFhDb3VudHMgPC0gaW5mb1ggJT4lIGNvdW50KGlkLGZyb20sbGVtbWEpCiAgICBYQnlQZXJzb24gPC0gaW5mb1ggJT4lIGNvdW50KGZyb20pICU+JSBzZWxlY3QoZnJvbT1mcm9tLHRvdGFsPW4pCiAgICBYQ291bnRzIDwtIGxlZnRfam9pbihYQ291bnRzLFhCeVBlcnNvbikgCiAgICAKICAgIFhCeUxlbW1hIDwtIGluZm9YICU+JSBjb3VudChmcm9tLGxlbW1hKQogICAgWFJlbEZyZXEgPC0gbGVmdF9qb2luKFhCeUxlbW1hLFhCeVBlcnNvbikgJT4lIG11dGF0ZShyZj1uL3RvdGFsKQogICAgCiAgICBYVmFyIDwtIFhDb3VudHMgJT4lIGdyb3VwX2J5KGxlbW1hLGZyb20pICU+JSBzdW1tYXJpemUodmFyPXZhcihuL3RvdGFsKSkgJT4lIGZpbHRlcighIGlzLm5hKHZhcikpICNOQXMgYXJlIGhhcGF4CiAgICAKICAgIGxlZnRfam9pbihYVmFyLCBYUmVsRnJlcSkgJT4lIAogICAgICBmaWx0ZXJMZW1tYXMocmVtb3ZlTGVtbWFzID0gcmVtb3ZlTGVtbWFzLCBpbmNsdWRlTGVtbWFzID0gaW5jbHVkZUxlbW1hcykKCn0KYGBgCgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQpyYW5rX3RmaWRmcyA8LSBmdW5jdGlvbih0ZmlkZnMsZGxlbnMsdG9wbixkb2NfcGVyY2VudCkgewogIG5kb2NzIDwtIHRmaWRmcyAlPiUgc2VsZWN0KGRvY2lkKSAlPiUgdW5pcXVlKCkgJT4lIG5yb3coKQogIHRocmVzaCA8LSBkb2NfcGVyY2VudCAqIG5kb2NzCiAgCiAgcnRmaWRmcyA8LSB0ZmlkZnMgJT4lIGFycmFuZ2UoZG9jaWQsZGVzYyh0ZmlkZikpICU+JSBncm91cF9ieShkb2NpZCkgJT4lIG11dGF0ZShyYW5rPXJvd19udW1iZXIoKSkKICBydGZpZGZzIDwtIGxlZnRfam9pbihydGZpZGZzLGRsZW5zLCBieT1jKCJkb2NpZCI9ImlkIikpICU+JSBmaWx0ZXIocmFuazw9a2V5d2RzKSAlPiUgZ3JvdXBfYnkobGVtbWEpICU+JSBzdW1tYXJpc2UobmRvY3M9bigpKSAlPiUgZmlsdGVyKG5kb2NzID49IHRocmVzaCkgJT4lIGFycmFuZ2UoZGVzYyhuZG9jcykpCiAgcnRmaWRmcyAlPiUgbXV0YXRlKGZyb209dW5pcXVlKHRmaWRmcyRmcm9tKSwgcmFuaz1yb3dfbnVtYmVyKCkpICU+JSBmaWx0ZXIocmFuayA8PSB0b3BuKSAKfQoKdG9wX3RmaWRmczIgPC0gZnVuY3Rpb24od2hpY2gsbix3b3Jkc19wZXJfdG9waWM9NTAsZG9jX3BlcmNlbnQ9MC4wMikgewogICAgZG9jX2xlbnMgPC0gaW5mbyAlPiUgZ3JvdXBfYnkoaWQpICU+JSBzdW1tYXJpc2UoZGxlbj1uKCksa2V5d2RzPXJvdW5kKGRsZW4vd29yZHNfcGVyX3RvcGljKSkKCiAgICBpZiAod2hpY2ggPT0gIkFsbCIpIHsKICAgICAgdGZpZGZzX3JhbmtlZF9FIDwtIHJhbmtfdGZpZGZzKHRmaWRmc19BbGxfRSxkb2NfbGVucyxuLGRvY19wZXJjZW50KQogICAgICB0ZmlkZnNfcmFua2VkX1IgPC0gcmFua190ZmlkZnModGZpZGZzX0FsbF9SLGRvY19sZW5zLG4sZG9jX3BlcmNlbnQpCiAgICB9IGVsc2UgaWYgKHdoaWNoID09ICJOIikgewogICAgICBub3BlcyA8LSBjKCLvv70iKSAjIiZjIiAgICNyZWFsbHkgc2hvdWxkIGZpbHRlciBiZWZvcmUgZmluYWwgcmFua2luZwogICAgICB0ZmlkZnNfcmFua2VkX0UgPC0gcmFua190ZmlkZnModGZpZGZzX05zX0UsZG9jX2xlbnMsbixkb2NfcGVyY2VudCkgJT4lIGZpbHRlcighKGxlbW1hICVpbiUgbm9wZXMpKQogICAgICB0ZmlkZnNfcmFua2VkX1IgPC0gcmFua190ZmlkZnModGZpZGZzX05zX1IsZG9jX2xlbnMsbixkb2NfcGVyY2VudCkgJT4lIGZpbHRlcighKGxlbW1hICVpbiUgbm9wZXMpKQogICAgfSBlbHNlIGlmICh3aGljaCA9PSAiViIpIHsKICAgICAgdGZpZGZzX3JhbmtlZF9FIDwtIHJhbmtfdGZpZGZzKHRmaWRmc19Wc19FLGRvY19sZW5zLG4sZG9jX3BlcmNlbnQpCiAgICAgIHRmaWRmc19yYW5rZWRfUiA8LSByYW5rX3RmaWRmcyh0ZmlkZnNfVnNfUixkb2NfbGVucyxuLGRvY19wZXJjZW50KQogICAgfQogICAgCiAgICAKICAgIGJpbmRfcm93cyh0ZmlkZnNfcmFua2VkX0UsIHRmaWRmc19yYW5rZWRfUikKfQpgYGAKCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0V9CgpzaG93X3RvcEtleVdkcyA8LSBmdW5jdGlvbih3aGljaCxuLHdvcmRzX3Blcl90b3BpYz01MCxkb2NfcGVyY2VudD0wLjAyLCB0aHJlc2hvbGQ9MC4wMSwgdGl0bGU9IiAiKSB7CiAgdG9wX2tleXdvcmRzIDwtIHRvcF90ZmlkZnMyKHdoaWNoLG4sd29yZHNfcGVyX3RvcGljPTUwLGRvY19wZXJjZW50PTAuMDIpCiAgCiAgaWYgKHdoaWNoID09ICJBbGwiKSB7CiAgICAgIHRmaWRmc19FID0gdGZpZGZzX0FsbF9FCiAgICAgIHRmaWRmc19SIDwtIHRmaWRmc19BbGxfUgogICAgfSBlbHNlIGlmICh3aGljaCA9PSAiTiIpIHsKICAgICAgdGZpZGZzX0UgPC0gdGZpZGZzX05zX0UKICAgICAgdGZpZGZzX1IgPC0gdGZpZGZzX05zX1IKICAgIH0gZWxzZSBpZiAod2hpY2ggPT0gIlYiKSB7CiAgICAgIHRmaWRmc19FIDwtIHRmaWRmc19Wc19FCiAgICAgIHRmaWRmc19SIDwtIHRmaWRmc19Wc19SCiAgICB9CiAgCiAgdGZpZGZzIDwtIGJpbmRfcm93cyh0ZmlkZnNfRSwgdGZpZGZzX1IpCiAgCiAgY29tYm8gPC0gc2VtaV9qb2luKHRmaWRmcyx0b3Bfa2V5d29yZHMpICU+JSBmaWx0ZXIodGZpZGYgPj0gdGhyZXNob2xkKQogIAogIChnZ1NjYXR0ZXJURklERihjb21ibyx0aHJlc2hvbGQgPSB0aHJlc2hvbGQsIHRpdGxlPXRpdGxlKSkKfQoKc2hvd190ZmlkZnMgPC0gZnVuY3Rpb24obGVtbWFzLHRocmVzaG9sZD0wLjAsdGl0bGU9IiIpIHsKICB0ZmlkZnNfRSA8LSB0ZmlkZnNfQWxsX0UgJT4lIGZpbHRlcihsZW1tYSAlaW4lIGxlbW1hcyx0ZmlkZj49dGhyZXNob2xkKQogIHRmaWRmc19SIDwtIHRmaWRmc19BbGxfUiAlPiUgZmlsdGVyKGxlbW1hICVpbiUgbGVtbWFzLHRmaWRmPj10aHJlc2hvbGQpCiAgdGZpZGZzIDwtIGJpbmRfcm93cyh0ZmlkZnNfRSwgdGZpZGZzX1IpCiAgZ2dTY2F0dGVyVEZJREYodGZpZGZzLHRocmVzaG9sZD10aHJlc2hvbGQsdGl0bGU9dGl0bGUpCn0KCmdnU2NhdHRlclRGSURGIDwtIGZ1bmN0aW9uKHRmaWRmcyx0aHJlc2hvbGQ9MC4wLCB0aXRsZT0iIikgewogIHRmaWRmcyAlPiUgCiAgICBnZ3Bsb3QoKSArIGdlb21fcG9pbnQoYWVzKGRhdGUsbGVtbWEsc2l6ZT10ZmlkZixjb2xvcj1mcm9tKSxhbHBoYT0wLjMpICsgCiAgICBzY2FsZV95X2Rpc2NyZXRlKGxpbWl0cyA9IHJldihsZXZlbHMoZmFjdG9yKHRmaWRmcyRsZW1tYSkpKSkgKwogICAgI3NjYWxlX3lfZGlzY3JldGUobGltaXRzID0gbGV2ZWxzKHRmaWRmcyRsZW1tYSkpICsKICAgIHRoZW1lX2NsYXNzaWMoKSArIAogICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsgCiAgICBsYWJzKHRpdGxlPXRpdGxlLCB4PSIiLCB5PSIiLHNpemU9InRmaWRmIikgCn0KCmBgYAojIENvbXBhcmluZyBrZXkgd29yZHMKCiMjIE5vdW5zCgpGaXJzdCB1cCBhcmUgbm91bnMgYXMga2V5IHdvcmRzLiBXZSdsbCB1c2UgYSBfc2xvcGUgZ3JhcGhfIHRvIGNvbXBhcmUgdGhlIGtleSB3b3JkcyBmb3IgRUJCIGFuZCBSQi4gQXMgdXN1YWwsIEknbSB1c2luZyBqdXN0IHRoZSB0b3AgMjAgbm91bnMgZm9yIF9lYWNoXy4gTGluZXMgY29ubmVjdCB0aGUgc2FtZSB3b3JkIChsZW1tYSkgZm9yIEUgYW5kIFI7IHdoZXJlIHRoZXJlIGlzIG5vIGxpbmUsIHRoYXQgbWVhbnMgdGhhdCB3b3JkIGRvZXMgbm90IG9jY3VyIGluIHRoZSBvdGhlciBwZXJzb24ncyB0b3AgMjAgbm91biBrZXkgd29yZHMuIFdlIGNhbiBzZWUgdGhhdCBFQkIgYW5kIFJCIGhhdmUgZmV3IGtleSB3b3JkcyBpbiBjb21tb24gJm1kYXNoOyBqdXN0IF9ib29rXyBhbmQgX2hhcHBpbmVzc18uCgpXZSBjYW4gYWxzbyBzZWUgYSBnbGl0Y2ggaW4gdGhlIGF1dG9tYXRpYyBwcm9jZXNzaW5nOiBfJmFtcDtjXyAoImV0YyIpIGlzIGNvbnNpZGVyZWQgdG8gYmUgYSBub3VuLCBldmVuIHRob3VnaCB3ZSBwcm9iYWJseSB3b3VsZG4ndCBjb25zaWRlciBpdCB0byBiZSBvbmUuCgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD00IH0KCnRvcG4gPC0gMjAKdG9wTnMgPC0gdG9wX3RmaWRmczIoIk4iLHRvcG4pCnQgPC0gcGFzdGUoIkVCQiAmIFJCIFRvcCIsdG9wbiwia2V5IHdvcmQgbm91bnMiLCBzZXA9IiAiKQooZ2dTbG9wZSh0b3BOcywgdCkpCgpgYGAKCldlIGNhbiBhbHNvIGNvbXBhcmUga2V5IHdvcmRzIHZlcnN1cyBmcmVxdWVudCB3b3Jkcy4gT25lIHRoaW5nIHRoYXQgaXMgaW50ZXJlc3RpbmcgaXMgdGhhdCBfS2VueW9uXyAoYSByZWxhdGl2ZSBvZiBFQkIgYW5kIGEgZnJpZW5kIG9mIFJCKSBpcyBhIGZyZXF1ZW50IHdvcmQgZm9yIEVCQiwgYnV0IG5vdCBhIGtleSB3b3JkLiBUaGlzIGlzIGJlY2F1c2Ugc2hlIG1lbnRpb25zIE1yLiBLZW55b24gaW4gbG90cyBvZiBsZXR0ZXJzLCBzbyBoZSBpcyBub3QgYSBzcGVjaWFsIG1lbnRpb246IGtleSB3b3JkcyBhcmUgd29yZHMgdGhhdCBhcmUgY29uY2VudHJhdGVkIGluIGp1c3Qgc29tZSBsZXR0ZXJzLgoKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZmlnLmhlaWdodD04LCBmaWcud2lkdGg9MTAgfQoKdG9wbiA8LSAyMAp0b3BOc19rZXkgPC0gdG9wX3RmaWRmczIoIk4iLHRvcG4pCnRvcE5zX2ZyZXEgPC0gbWFrZVZhcnMobm91bnMsdG9wbikkcmFuawp0ID0gcGFzdGUoIkVCQiAmIFJCIFRvcCIsdG9wbiwibm91bnM6IGZyZXF1ZW5jeSB2cyBrZXkgd29yZCAodGZpZGYgc2NvcmUpIiwgc2VwPSIgIikKKGdnU2xvcGVGVCh0b3BOc19mcmVxLHRvcE5zX2tleSwgdCkpCgpgYGAKCkZpbmFsbHksIHdlIGNhbiBhbHNvIGxvb2sgYXQgdGhlIGtleSB3b3JkcyBhY3Jvc3MgdGltZS4gSGVyZSB0aGUgc2l6ZSBvZiB0aGUgZG90cyBpbmRpY2F0ZXMgdGhlIFRGSURGIG1lYXN1cmUuIE9ubHkgX2Jvb2tfIGFuZCBfaGFwcGluZXNzXyBoYXZlIGRvdHMgZm9yIGJvdGggRUJCIGFuZCBSQiwgc2luY2UgdGhvc2UgYXJlIHRoZSBvbmx5IHR3byBrZXkgd29yZHMgdGhleSBoYXZlIGluIGNvbW1vbi4gT25lIGludGVyZXN0aW5nIHdvcmQgdG8gbm90ZSBpcyBfRmx1c2hfLCBFQkIncyBkb2cuIEZsdXNoIHdhcyBraWRuYXBwZWQgYW5kIFJCIGhlbHBlZCByZWNvdmVyIGhpbS4gVGhpcyB3YXMgaW1wb3J0YW50IHRvIEVCQiwgYnV0IGFwcGFyZW50bHkgbm90IGFzIGltcG9ydGFudCB0byBSQiAoRmx1c2ggYWN0dWFsbHkgYml0IFJCIGF0IG9uZSBwb2ludCBlYXJseSBvbikuCgoKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTEwfQp0b3BuID0gMTAKdCA9IHQgPSBwYXN0ZSgiRUJCICYgUkIgVG9wIix0b3BuLCJrZXkgd29yZCBub3VucyIsIHNlcD0iICIpCnNob3dfdG9wS2V5V2RzKCJOIix0b3BuLHdvcmRzX3Blcl90b3BpYz01MCxkb2NfcGVyY2VudD0wLjAyLCB0aHJlc2hvbGQ9MC4xNzUsIHRpdGxlPXQpCmBgYAoKCiMjIFZlcmJzCgpXaGVuIHdlIGxvb2sgYXQgdmVyYnMsIHdlIHNlZSB0aGF0IEVCQiBhbmQgUkIgaGF2ZSBubyBvdmVybGFwIGF0IGFsbCBpbiB0aGVpciBrZXkgd29yZCB2ZXJicy4KCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTQgfQoKdG9wbiA8LSAyMAp0b3BWcyA8LSB0b3BfdGZpZGZzMigiViIsdG9wbikKdCA8LSBwYXN0ZSgiRUJCICYgUkIgVG9wIix0b3BuLCJrZXkgd29yZCB2ZXJicyIsIHNlcD0iICIpCihnZ1Nsb3BlKHRvcFZzLCB0KSkKCmBgYAoKQW5kIGxvb2tpbmcgYXQgdGhlbSBvdmVyIHRpbWUgLi4uIChOb3RlIFIncyB1c2Ugb2YgX2tpc3NfKQoKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTEwfQpuID0gMTAKdCA8LSBwYXN0ZSgiRUJCICYgUkIgVG9wIix0b3BuLCJrZXkgd29yZCB2ZXJicyIsIHNlcD0iICIpCnNob3dfdG9wS2V5V2RzKCJWIixuLHdvcmRzX3Blcl90b3BpYz01MCxkb2NfcGVyY2VudD0wLjAyLCB0aHJlc2hvbGQ9MC4yNSwgdGl0bGU9dCkKYGBgCgojIyBUSUZJREYgZm9yIGluZGl2aWR1YWwgd29yZHMKCldlIGNhbiBhbHNvIGxvb2sgYXQgdGhlIFRGSURGIHNjb3JlcyBmb3IgaW5kaXZpZHVhbCB3b3Jkcywgbm90IGp1c3QgdGhlIHRvcCBrZXkgd29yZHMuIEhlcmUgd2UgbG9vayBhdCBfbG92ZV8sIF9wb2VtXywgYW5kIF9wb2V0cnlfLCBzaW5jZSBFQkIgYW5kIFJCIHdlcmUgcm9tYW50aWMgcG9ldHMuIFNpbmNlIHRoZXNlIGFyZSBub3Qga2V5IHdvcmRzLCB0aGVyZSBpcyBtdWNoIG1vcmUgb3ZlcmxhcCBpbiB0aGVpciB1c2FnZS4gVGhlcmUgaXMgYWN0dWFsbHkgZXZlbiBtb3JlIG92ZXJsYXAsIGJ1dCBJIGFtIG5vdCBzaG93aW5nIHRoZSBsZXR0ZXJzIHdpdGggbG93IFRGSURGIHNjb3JlcyAoYW55dGhpbmcgbGVzcyB0aGFuIDAuMSkuCgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9M30KbGVtbWFzIDwtIGMoImxvdmUiLCJwb2VtIiwicG9ldHJ5IikKc2hvd190ZmlkZnMobGVtbWFzLHRpdGxlPSJUaGUgUm9tYW50aWMgUG9ldHMiLHRocmVzaG9sZD0wLjEpCmBgYAoKIyMjIFtCYWNrIHRvIFdvcmsgaW4gUHJvZ3Jlc3M6IFdvcmQgRnJlcXVlbmNpZXNdKHdpcC5odG1sKQojIyMgW0JhY2sgdG8gdGhlIGRlbW9zXSguLi9pbmRleC5odG1sKQo=