I conducted an analysis of how much content from junk news websites is spread by public Facebook pages and groups that support US Presidential Candidates Donald Trump and Joe Biden. For the purposes of this analysis, “junk news” websites are domains that posted false or misleading content in the past according to FactCheck.org

To identify pages and groups that support the candidates, I used the CrowdTangle API to search for pages and groups that have shared posts from the official Facebook pages of the candidates any time in the past year (October 2018 and October 2019). Below is the number of pages that were found which comprise the support “ecosystems” of pro-Trump and pro-Biden used in this analysis:

Of the nearly one million posts in the data, here are the number of posts that shared links of any kind (excluding links to Facebook posts):

Here are the number of links to “junk news” websites that were found in each ecosystem:

In the pro-Trump Pages Ecosystem, there were 213 unique links shared from 10 “junk news” websites. Of the 213 links, 163 of them came from the Geller Report, which according to FactCheck.org “is run by Pamela Geller, an anti-Islamic activist.” Other sources of “junk news” that were shared were:

The links from “junk news” websites that were most shared within the pro-Trump Pages ecosystem were as follows:

A text analysis of the Descriptions accompanying the links highlights the dominant topics of the “junk news” shared: borders and Islam. Mentions of Islam are correlated with prominent Democratic congresswomen Ilhan Omar and Rashida Tlaib as well as sharia and jihad.

Of the 100 pages in the pro-Trump Pages ecosystem, 34 of them shared a “junk news” link. The most prolific sharer is “Wake Up America, the Original”, which was responsible for nearly one-third of the “junk news” links and has more than 500,000 followers.

Only a handful of junk news links (nine) were shared by multiple pages so it is difficult to assess widespread coordinated behavior among pages. However, a social network analysis of “junk news” links that were shared indicates apparent coordination among four pro-Trump pages to amplify content:

A time-series analysis indicates that the “Stand With [blank] Against the Illegal Alien Invasion” pages are clearly coordinating to share junk news links related to immigration. The x axis represents the time elapsed between posts (in seconds), thus the more vertical the line, the shorter the time between posts of the same link. A lesser substantial trend (given so few data points) is seen in relation to junk news links that reference Jeffrey Epstein and Elijah Cummings, indicating that the “Trump ‘The People’s President’” page may be an influencor of at least two other pages: “Republicans For Trump” and “Trump, American Patriot.”

In the pro-Trump Groups Ecosystem, there were 506 unique links shared from different 16 “junk news” websites. Of the 506 links, 129 were from “neonnettle.com.” Multiple “junk news” websites found in the pro-Trump Pages ecosystem, e.g. “puppetstringnews.com”, “newspunch.com”, “gellerreport.com” - were widely shared in pro-Trump Groups. Three other “junk news” websites also featured prominently:

The links from “junk news” websites that were most shared within the pro-Trump Groups ecosystem were as follows:

A text analysis of the Descriptions accompanying the links highlights Ukraine as a key topic of conversation, specifically in relation to the Bidens. Other “junk news” topics relate to the ongoing impeachment inquiry and two prominent House Democrats - Speaker Nancy Pelosi and Intelligence Committee Chairman Adam Schiff. The Clintons are less prominent topics of “junk news”" circulating in pro-Trump groups.

Of the 226 groups in the pro-Trump Groups ecosystem, at least one “junk news” links was found to have been posted in 162 of them. Two large groups with the name “Drain The Swamp” are particularly rife with junk news links.

A social network analysis of “junk news” links posted within the pro-Trump Groups ecosystem indicates a lot of overlap in “junk news” content from group to group although it is unclear how much coordination, if any, exists.

Note: With consideration to privacy protection of Facebook users, CrowdTangle does not permit you to see which specific user accounts posted to groups or whether the link was shared from a particular page. Thus it is not possible to definitively determine whether specific accounts are engaging in coordinated behavior to amplify content across groups. However, it is possible to see what content is shared within groups by timestamp, providing some insight as to whether there may be some coordination among users across groups.

A further analysis of nine of the top 10 junk news links shared in pro-Trump Groups indicates that there is seemingly little coordination. Instead, the sharing of junk news links, while pervasive, appears to be more or less organic. However, it is not possible to definitively say whether there is some level of coordination among specific group members given that the identities of members are privacy protected.

In the pro-Biden Groups Ecosystem, there were 26 unique links shared from six different “junk news” websites - all of which appear in the pro-Trump Pages or pro-Trump Groups ecosystems. Of the 26 links, 13 were from “neonnettle.com”, seven were from “newspunch.com”, two from “yournewswire.com” and one each from “conservativepost.com”, “gellerreport.com”, “infowars.com”, and “puppetstringnews.com”.

The links from “junk news” websites that were most shared within the pro-Biden Groups ecosystem were as follows:

Of the 77 groups in the pro-Biden Groups ecosystem, at least one “junk news” link was posted in 18 of them. Most links were only posted one time in a single group. In six groups, two “junk news” links were found. The outlier is a group named “Biden for president”, in which 13 different “junk news” links were found.

The “junk news” links in the “Biden for President” group feature links to anti-Biden, anti-Democrat, anti-immigrant and anti-Islam content, which suggests that the “Biden for president” group is actually an anti-Biden group.

LS0tCnRpdGxlOiAiSnVuayBOZXdzIFNoYXJpbmcgaW4gUHJvLVRydW1wICYgUHJvLUJpZGVuIEZhY2Vib29rIEVjb3N5c3RlbXMiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCkkgY29uZHVjdGVkIGFuIGFuYWx5c2lzIG9mIGhvdyBtdWNoIGNvbnRlbnQgZnJvbSBqdW5rIG5ld3Mgd2Vic2l0ZXMgaXMgc3ByZWFkIGJ5IHB1YmxpYyBGYWNlYm9vayBwYWdlcyBhbmQgZ3JvdXBzIHRoYXQgc3VwcG9ydCBVUyBQcmVzaWRlbnRpYWwgQ2FuZGlkYXRlcyBEb25hbGQgVHJ1bXAgYW5kIEpvZSBCaWRlbi4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGFuYWx5c2lzLCAianVuayBuZXdzIiB3ZWJzaXRlcyBhcmUgZG9tYWlucyB0aGF0IHBvc3RlZCBmYWxzZSBvciBtaXNsZWFkaW5nIGNvbnRlbnQgaW4gdGhlIHBhc3QgYWNjb3JkaW5nIHRvIFtGYWN0Q2hlY2sub3JnXShodHRwczovL3d3dy5mYWN0Y2hlY2sub3JnLzIwMTcvMDcvd2Vic2l0ZXMtcG9zdC1mYWtlLXNhdGlyaWNhbC1zdG9yaWVzLykgCgpUbyBpZGVudGlmeSBwYWdlcyBhbmQgZ3JvdXBzIHRoYXQgc3VwcG9ydCB0aGUgY2FuZGlkYXRlcywgSSB1c2VkIHRoZSBDcm93ZFRhbmdsZSBBUEkgdG8gc2VhcmNoIGZvciBwYWdlcyBhbmQgZ3JvdXBzIHRoYXQgaGF2ZSBzaGFyZWQgcG9zdHMgZnJvbSB0aGUgb2ZmaWNpYWwgRmFjZWJvb2sgcGFnZXMgb2YgdGhlIGNhbmRpZGF0ZXMgYW55IHRpbWUgaW4gdGhlIHBhc3QgeWVhciAoT2N0b2JlciAyMDE4IGFuZCBPY3RvYmVyIDIwMTkpLiBCZWxvdyBpcyB0aGUgbnVtYmVyIG9mIHBhZ2VzIHRoYXQgd2VyZSBmb3VuZCB3aGljaCBjb21wcmlzZSB0aGUgc3VwcG9ydCAiZWNvc3lzdGVtcyIgb2YgcHJvLVRydW1wIGFuZCBwcm8tQmlkZW4gdXNlZCBpbiB0aGlzIGFuYWx5c2lzOiAKCiogMTAwIHByby1UcnVtcCBQYWdlcyAoMjk5LDk5NiBQb3N0cykKKiAyMTYgcHJvLVRydW1wIEdyb3VwcyAoMjk5LDk3NCBQb3N0cykKKiA0OCBwcm8tQmlkZW4gUGFnZXMgKDg2LDM4NyBQb3N0cykKKiA3NyBwcm8tQmlkZW4gR3JvdXBzICgyOTksOTk1IFBvc3RzKQoKYGBge3IsIGVjaG89RkFMU0UsIGV2YWw9RkFMU0UsIGV2YWw9RkFMU0V9CiMwX0xPQUQgUEFDS0FHRVMKcmVxdWlyZSgiZHBseXIiKQpyZXF1aXJlKCJzdHJpbmdyIikKcmVxdWlyZSgiZ2dwbG90MiIpCnJlcXVpcmUoImdyaWRFeHRyYSIpCnJlcXVpcmUoInNjYWxlcyIpCnJlcXVpcmUoIkRUIikKcmVxdWlyZSgiaWdyYXBoIikKcmVxdWlyZSgiZ2dyYXBoIikKI3JlcXVpcmUoInJzY29ubmVjdCIpCmBgYAoKYGBge3IsIGVjaG89RkFMU0UsIGV2YWw9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiMxX1JFQUQgSU4gREFUQSBBTkQgTE9BRCBORUVERUQgRlVOQ1RJT05TCmR0cGFnZXMgPC0gcmVhZFJEUyhmaWxlPSJkdHBhZ2VzX29jdDE4LW9jdDE5LnJkYSIpCmR0Z3JvdXBzIDwtIHJlYWRSRFMoZmlsZT0iZHRncm91cHNfb2N0MTgtb2N0MTkucmRhIikKamJwYWdlcyA8LSByZWFkUkRTKGZpbGU9ImpicGFnZXNfb2N0MTgtb2N0MTkucmRhIikKamJncm91cHMgPC0gcmVhZFJEUyhmaWxlPSJqYmdyb3Vwc19vY3QxOC1vY3QxOS5yZGEiKQoKI0Z1bmN0aW9uIGZvciBEb21haW4gRXh0cmFjdGlvbgpkb21haW4gPC0gZnVuY3Rpb24oeCkgc3Ryc3BsaXQoZ3N1YigiaHR0cDovL3xodHRwczovL3x3d3dcXC4iLCAiIiwgeCksICIvIilbW2MoMSwgMSldXQoKI0RvbWFpbnMgdG8gZXhjbHVkZSB0aHJvdWdoIGZpbHRlcmluZwpleGNsdWRlIDwtIGMoImZhY2Vib29rLmNvbSIsICJ5b3V0dWJlLmNvbSIsICJ5b3V0dS5iZSIsICJ0d2l0dGVyLmNvbSIsICJyZXV0ZXJzLmNvbSIsICJ0cmliLmFsIiwgImJpdC5seSIsICJtLnlvdXR1YmUuY29tIiwgImRsdnIuaXQiLCAidC5jbyIsICJvdy5seSIsICJidWZmLmx5IiwgIm5ld3N0ZWFtLnJvIiwgInJldmVyYm5hdGlvbi5jb20iKQoKI0RvbWFpbnMgS25vd24gVG8gUGVkZGxlICJGYWtlIE5ld3MiCiNzb3VyY2UgPSBodHRwczovL3d3dy5mYWN0Y2hlY2sub3JnLzIwMTcvMDcvd2Vic2l0ZXMtcG9zdC1mYWtlLXNhdGlyaWNhbC1zdG9yaWVzLwpmYWtlbmV3cyA8LSBjKCJhbWVyaWNhc2ZyZWVkb21maWdodGVycy5jb20iLCAiYW1lcmljYXNsYXN0bGluZW9mZGVmZW5zZS5vcmciLCAidHJ1bXBiZXRyYXllZC51cyIsICJ3b3JzdHBvdC51cyIsICJub2Zha2VuZXdzb25saW5lLnVzIiwgInRoZWFtZXJpY2FuZXdzLmNvIiwgImFtZXJpY2Fuam91cm5hbHJldmlldy5jb20iLCAiYW1lcmljYXRhbGtzLmNvbSIsICJ0aGVwZWRvZ2F0ZS5jb20iLCAiYmFubmVkaW5mb3JtYXRpb24uY29tIiwgImJsaW5nbmV3cy5jb20iLCAiY2JpbmZvMjQuY29tIiwiY2hhbm5lbDIzbmV3cy5jb20iLCJjb25zZXJ2YXRpdmVhbmdsZS5jb20iLCAiY29uc25hdGlvbi5jb20iLCAiY29uc2VydmF0aXZlcG9zdC5jb20iLCJ0aGVjb25zZXJ2YXRpdmV0cmVlaG91c2UuY29tIiwgImRhaWx5LXZpbmUuY29tIiwgImVtcGlyZW5ld3MubmV0IiwgImVuLXZvbHZlLmNvbSIsICJmYm5ld3NjeWNsZS5jb20iLCAiZmVsbG93c2hpcG9mdGhlbWluZHMuY29tIiwgImdlbGxlcnJlcG9ydC5jb20iLCAiaW5mb3dhcnMuY29tIiwgImthZ2ZlZWQuY29tIiwgInRoZWxpYmVydHlyYWlzZS5jb20iLCAibG9uZG9ud2VibmV3cy5jb20iLCAibW1pbmZvMjQuY29tIiwgIm5lb25uZXR0bGUuY29tIiwgIm5ld3NwdW5jaC5jb20iLCAieW91cm5ld3N3aXJlLmNvbSIsICJwb2xpdGljb3BzLmNvbSIsICJwb2xpdGljb3QuY29tIiwgIm55ZXZlbmluZ25ld3MuY29tIiwgInBhdHJpb3Rzd2Fsay51cyIsICJwb2xpY2V0YXNrLmNvbSIsICJwb2xpdGljc2ZvY3VzLmNvbSIsICJ0aGUtcG9zdGlsbG9uLmNvbSIsICJwdXBwZXRzdHJpbmduZXdzLmNvbSIsICJyZWFsbmV3c3JpZ2h0bm93LmNvbSIsICJyaWdodHdpbmd0cmlidW5lLmNvbSIsICJyd25vZmZpY2lhbC5jb20iLCAidGhlcmlnaHRpc3RzLmNvbSIsICJzcGVjaWFsbmV3c3VzZS5jb20iLCAiN25ld3Nwb2xpdGljYWwuc2l0ZSIsICJzdGdlb3JnZWdhemV0dGUuY29tIiwgInRlZGR5c3RpY2suY29tIiwgInRvcGFsZXJ0bmV3cy5jb20iLCAidHJ1dGhmZWVkbmV3cy5jb20iLCAidW5pdmVyc2FsZWluZm8uY29tIiwgInVzc2FuZXdzLmNvbSIsICJ2aXJhbGNvcmRzLmNvbSIsICJ2aXJhbG5ld3NwYnMuc2l0ZSIsICJ2aXJhbGl0eXRoaW5ncy51cyIsICJ3ZWJ2aW5lcnMuY29tIiwgIndvcmxkbmV3c2RhaWx5cmVwb3J0LmNvbSIpCgp0ZXh0X2NsZWFuIDwtIGZ1bmN0aW9uKGRhdGEsIHRleHQpIHsKICByZXF1aXJlKCJkcGx5ciIpCiAgdGV4dCA8LSBlbnF1byh0ZXh0KQogIGRhdGEgPC0gZGF0YSAlPiUgc2VsZWN0KCEhdGV4dCkgJT4lIGZpbHRlcighIXRleHQgIT0gIiIpICNyZW1vdmUgZW1wdHkgbWVzc2FnZXMKICBkYXRhIDwtIGRhdGEgJT4lIG11dGF0ZSh0ZXh0PWFzLmNoYXJhY3RlcighIXRleHQpKQogIGRhdGEgPC0gZGF0YSAlPiUgbXV0YXRlKHRleHQ9Z3N1YigiaHR0cFteWzpzcGFjZTpdXSoiLCAnJywgdGV4dCkpCiAgZGF0YSA8LSBkYXRhICU+JSBtdXRhdGUodGV4dD1nc3ViKCIjXFx3KyAqIiwgJycsIHRleHQpKQogIGRhdGEgPC0gZGF0YSAlPiUgbXV0YXRlKHRleHQ9Z3N1YigiQFxcdysgKiIsICcnLCB0ZXh0KSkKICBkYXRhIDwtIGRhdGEgJT4lIG11dGF0ZSh0ZXh0PWdzdWIoIlJUXFx3KyAqOiIsICcnLCB0ZXh0KSkgCiAgZGF0YSA8LSBkYXRhICU+JSBtdXRhdGUodGV4dD1nc3ViKCJbWzpkaWdpdDpdXSsiLCAnJywgdGV4dCkpCiAgZGF0YSA8LSBkYXRhICU+JSBtdXRhdGUodGV4dD1nc3ViKCJbWzpwdW5jdDpdXSsiLCAnJywgdGV4dCkpIAogIGRhdGEgPC0gZGF0YSAlPiUgbXV0YXRlKHRleHQ9Z3N1YigiW15bOmFsbnVtOl1dIiwnICcsIHRleHQpKQogIGRhdGEgPC0gZGF0YSAlPiUgZmlsdGVyKHRleHQgIT0gIiIpICU+JSBtdXRhdGUoaWQgPSByb3dfbnVtYmVyKCkpICU+JSB0cmFuc211dGUoaWQ9aWQsIHRleHQ9dGV4dCkgIAogIHJldHVybihkYXRhKQp9Cgp0ZXh0X3Rva2VuaXplIDwtIGZ1bmN0aW9uKGRhdGEsIHRleHQsIHN0b3B3b3Jkcz1OVUxMLCBuPU5VTEwpIHsKICByZXF1aXJlKCJkcGx5ciIpCiAgcmVxdWlyZSgidGlkeXIiKQogIHJlcXVpcmUoInRpZHl0ZXh0IikKICB0ZXh0PWVucXVvKHRleHQpCiAgaWYoaXMubnVsbChzdG9wd29yZHMpKSB7IHN0b3B3b3JkcyA8LSB0aWR5dGV4dDo6c3RvcF93b3JkcyB9CiAgaWYoaXMubnVsbChuKSkgeyBuIDwtIDEgfQogIHRva2VucyA8LSBkYXRhICU+JSB1bm5lc3RfdG9rZW5zKHdvcmQsICEhdGV4dCkKICB0b2tlbnMgPC0gdG9rZW5zICU+JSBmaWx0ZXIoIShuY2hhcih3b3JkKT09MSkpICU+JSBhbnRpX2pvaW4oc3RvcHdvcmRzKSAKICB0b2tlbnMgPC0gdG9rZW5zICU+JSBtdXRhdGUoaW5kPXJvd19udW1iZXIoKSkKICB0b2tlbnMgPC0gdG9rZW5zICU+JSBncm91cF9ieShpZCkgJT4lIG11dGF0ZShpbmQ9cm93X251bWJlcigpKSAlPiUgc3ByZWFkKGtleT1pbmQsIHZhbHVlPXdvcmQpIAogIHRva2Vuc1tpcy5uYSh0b2tlbnMpXSA8LSAiIgogIHRva2VucyA8LSB1bml0ZSh0b2tlbnMsIHRleHQsIC1pZCwgc2VwPSIgIikKICB0b2tlbnMkdGV4dCA8LSB0cmltd3ModG9rZW5zJHRleHQpCiAgdG9rZW5zIDwtIHRva2VucyAlPiUgdW5uZXN0X3Rva2VucyhuZ3JhbSwgdGV4dCwgdG9rZW49Im5ncmFtcyIsIG49bikKICByZXR1cm4odG9rZW5zKQp9Cgp0ZXh0X2NvcnJlbGF0aW9uIDwtIGZ1bmN0aW9uKGRhdGEsIG5ncmFtLCB0b3A9TlVMTCwgbWVudGlvbnM9TlVMTCkgewogIHJlcXVpcmUoImRwbHlyIikKICByZXF1aXJlKCJ3aWR5ciIpCiAgbmdyYW0gPC0gZW5xdW8obmdyYW0pCiAgaWYoaXMubnVsbCh0b3ApKSB7IHRvcCA8LSAyMCB9CiAgaWYoaXMubnVsbChtZW50aW9ucykpIHsgbWVudGlvbnMgPC0gMSB9CiAgdG9wX25ncmFtcyA8LSBkYXRhICU+JSBncm91cF9ieSghIW5ncmFtKSAlPiUgY291bnQoKSAlPiUgYXJyYW5nZShkZXNjKG4pKSAlPiUgaGVhZCh0b3ApCiAgdG9wX25ncmFtcyA8LSB0b3BfbmdyYW1zJG5ncmFtCiAgY29ycmVsYXRpb24gPC0gZGF0YSAlPiUgZ3JvdXBfYnkoISFuZ3JhbSkgJT4lIGZpbHRlcihuKCkgPj0gbWVudGlvbnMpICU+JSBwYWlyd2lzZV9jb3IobmdyYW0sIGlkLCBzb3J0PVQpCiAgdG9wX3RvcGljcyA8LSBjb3JyZWxhdGlvbiAlPiUgZmlsdGVyKGl0ZW0xICVpbiUgdG9wX25ncmFtcykgJT4lIHRyYW5zbXV0ZSh0b3BpYz1pdGVtMSwgbWVudGlvbj1pdGVtMiwgY29ycmVsYXRpb249Y29ycmVsYXRpb24pCiAgcmV0dXJuKHRvcF90b3BpY3MpCn0KCnRvcGljX3JlZHVjZSA8LSBmdW5jdGlvbihkYXRhLCB0b3BpYywgbWVudGlvbnM9TlVMTCkgewogIHJlcXVpcmUoImRwbHlyIikKICB0b3BpYyA8LSBlbnF1byh0b3BpYykKICAjc29ydCA8LSBlbnF1byhzb3J0KQogICNpZihpcy5udWxsKHNvcnQpKSB7IHNvcnQgPC0gY29ycmVsYXRpb24gfQogIGlmKGlzLm51bGwobWVudGlvbnMpKSB7IG1lbnRpb25zIDwtIDEwIH0KICBjbGVhbiA8LSBkYXRhICU+JSBncm91cF9ieSghIXRvcGljKSAlPiUgdG9wX24obWVudGlvbnMsIHd0PWNvcnJlbGF0aW9uKSAlPiUgdW5ncm91cCgpICU+JSBhcnJhbmdlKCEhdG9waWMsIGNvcnJlbGF0aW9uKSAlPiUgbXV0YXRlKC5yID0gcm93X251bWJlcigpKQogIHJldHVybihjbGVhbikKfQpgYGAKCk9mIHRoZSBuZWFybHkgb25lIG1pbGxpb24gcG9zdHMgaW4gdGhlIGRhdGEsIGhlcmUgYXJlIHRoZSBudW1iZXIgb2YgcG9zdHMgdGhhdCBzaGFyZWQgbGlua3Mgb2YgYW55IGtpbmQgKGV4Y2x1ZGluZyBsaW5rcyB0byBGYWNlYm9vayBwb3N0cyk6IAoKKiBwcm8tVHJ1bXAgUGFnZXM6IDUwLDIyMiBMaW5rcwoqIHByby1UcnVtcCBHcm91cHM6IDExNCwwMzIgTGlua3MKKiBwcm8tQmlkZW4gUGFnZXM6IDEyLDY4MCBMaW5rcwoqIHByby1CaWRlbiBHcm91cHM6IDEyOCwwMDggTGlua3MKCmBgYHtyLCBlY2hvPUZBTFNFLCBldmFsPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojVHJ1bXAgUGFnZXMKZHRwYWdlc19qdW5rX2RvbSA8LSBkdHBhZ2VzICU+JSBmaWx0ZXIoRmluYWwuTGluayE9IiIpCmR0cGFnZXNfanVua19kb20kZG9tYWluIDwtIHNhcHBseShkdHBhZ2VzX2p1bmtfZG9tJEZpbmFsLkxpbmssIGRvbWFpbikKZHRwYWdlc19qdW5rX2RvbSRkb21haW4gPC0gdG9sb3dlcihkdHBhZ2VzX2p1bmtfZG9tJGRvbWFpbikKcm0oZHRwYWdlcykKCiNUcnVtcCBHcm91cHMKZHRncm91cHNfanVua19kb20gPC0gZHRncm91cHMgJT4lIGZpbHRlcihMaW5rIT0iIikKZHRncm91cHNfanVua19kb20kZG9tYWluIDwtIHNhcHBseShkdGdyb3Vwc19qdW5rX2RvbSRMaW5rLCBkb21haW4pCmR0Z3JvdXBzX2p1bmtfZG9tJGRvbWFpbiA8LSB0b2xvd2VyKGR0Z3JvdXBzX2p1bmtfZG9tJGRvbWFpbikKZHRncm91cHNfanVua19kb21fbm9mYiA8LSBkdGdyb3Vwc19qdW5rX2RvbSAlPiUgZmlsdGVyKGRvbWFpbiAhPSAiZmFjZWJvb2suY29tIikKcm0oZHRncm91cHMpCgojQmlkZW4gUGFnZXMKamJwYWdlc19qdW5rX2RvbSA8LSBqYnBhZ2VzICU+JSBmaWx0ZXIoRmluYWwuTGluayE9IiIpCmpicGFnZXNfanVua19kb20kZG9tYWluIDwtIHNhcHBseShqYnBhZ2VzX2p1bmtfZG9tJEZpbmFsLkxpbmssIGRvbWFpbikKamJwYWdlc19qdW5rX2RvbSRkb21haW4gPC0gdG9sb3dlcihqYnBhZ2VzX2p1bmtfZG9tJGRvbWFpbikgCnJtKGpicGFnZXMpCgojQmlkZW4gR3JvdXBzCmpiZ3JvdXBzX2p1bmtfZG9tIDwtIGpiZ3JvdXBzICU+JSBmaWx0ZXIoTGluayE9IiIpCmpiZ3JvdXBzX2p1bmtfZG9tJGRvbWFpbiA8LSBzYXBwbHkoamJncm91cHNfanVua19kb20kTGluaywgZG9tYWluKQpqYmdyb3Vwc19qdW5rX2RvbSRkb21haW4gPC0gdG9sb3dlcihqYmdyb3Vwc19qdW5rX2RvbSRkb21haW4pCmpiZ3JvdXBzX2p1bmtfZG9tX25vZmIgPC0gamJncm91cHNfanVua19kb20gJT4lIGZpbHRlcihkb21haW4gIT0gImZhY2Vib29rLmNvbSIpCnJtKGR0Z3JvdXBzKQpgYGAKSGVyZSBhcmUgdGhlIG51bWJlciBvZiBsaW5rcyB0byAianVuayBuZXdzIiB3ZWJzaXRlcyB0aGF0IHdlcmUgZm91bmQgaW4gZWFjaCBlY29zeXN0ZW06CgoqIHByby1UcnVtcCBQYWdlczogMjQ4IFRvdGFsIExpbmtzICgwLjUlIG9mIGFsbCBsaW5rcykKKiBwcm8tVHJ1bXAgR3JvdXBzOiAxLDM0MyBUb3RhbCBMaW5rcyAoMS4xJSBvZiBhbGwgbGlua3MpCiogcHJvLUJpZGVuIFBhZ2VzOiAwIFRvdGFsIExpbmtzICgwJSBvZiBhbGwgTGlua3MpCiogcHJvLUJpZGVuIEdyb3VwczogMzggVG90YWwgTGlua3MgKDAuMDIlIG9mIGFsbCBsaW5rcykgCgpgYGB7ciwgZWNobz1GQUxTRSwgZXZhbD1GQUxTRSwgd2FybmluZz1GQUxTRX0KI0FsbCBKdW5rIE5ld3MgTGlua3MgCmR0cGFnZXNfanVua19kb20gJT4lIHNlbGVjdChQYWdlLk5hbWUsIENyZWF0ZWQsIGRvbWFpbiwgTGluay5UZXh0LCBQYWdlLkxpa2VzLmF0LlBvc3RpbmcpICU+JSBmaWx0ZXIoZG9tYWluICVpbiUgZmFrZW5ld3MpICU+JSBncm91cF9ieShMaW5rLlRleHQpICU+JSBhcnJhbmdlKENyZWF0ZWQpICU+JSBtdXRhdGUocmVhY2g9Y3Vtc3VtKFBhZ2UuTGlrZXMuYXQuUG9zdGluZyksIGluZGV4PXNlcV9hbG9uZyhMaW5rLlRleHQpKSAlPiUgYXJyYW5nZShMaW5rLlRleHQsIGluZGV4KQoKamJwYWdlc19qdW5rX2RvbSAlPiUgc2VsZWN0KFBhZ2UuTmFtZSwgQ3JlYXRlZCwgZG9tYWluLCBMaW5rLlRleHQsIFBhZ2UuTGlrZXMuYXQuUG9zdGluZykgJT4lIGZpbHRlcihkb21haW4gJWluJSBmYWtlbmV3cykgJT4lIGdyb3VwX2J5KExpbmsuVGV4dCkgJT4lIGFycmFuZ2UoQ3JlYXRlZCkgJT4lIG11dGF0ZShyZWFjaD1jdW1zdW0oUGFnZS5MaWtlcy5hdC5Qb3N0aW5nKSwgaW5kZXg9c2VxX2Fsb25nKExpbmsuVGV4dCkpICU+JSBhcnJhbmdlKExpbmsuVGV4dCwgaW5kZXgpCmBgYAoKSW4gdGhlICoqcHJvLVRydW1wIFBhZ2VzIEVjb3N5c3RlbSoqLCB0aGVyZSB3ZXJlIDIxMyB1bmlxdWUgbGlua3Mgc2hhcmVkIGZyb20gMTAgImp1bmsgbmV3cyIgd2Vic2l0ZXMuIE9mIHRoZSAyMTMgbGlua3MsIDE2MyBvZiB0aGVtIGNhbWUgZnJvbSB0aGUgR2VsbGVyIFJlcG9ydCwgd2hpY2ggYWNjb3JkaW5nIHRvIEZhY3RDaGVjay5vcmcgImlzIHJ1biBieSBQYW1lbGEgR2VsbGVyLCBhbiBhbnRpLUlzbGFtaWMgYWN0aXZpc3QuIiBPdGhlciBzb3VyY2VzIG9mICJqdW5rIG5ld3MiIHRoYXQgd2VyZSBzaGFyZWQgd2VyZTogCgoqICJwdXBwZXRzdHJpbmduZXdzLmNvbSIsIHdoaWNoIHBlciBpdHMgaG9tZXBhZ2Ugd2FzICJjcmVhdGVkIGJ5IGEgVVMgTkFWWSB2ZXQsIHdobyBzZXJ2ZWQgZm91ciB5ZWFycyBpbiB0aGUgbWlsaXRhcnksIGdvdCBvdXQgYmVjYXVzZSBoZSB3YXMgdGlyZWQgb2YgdGhlIHdvcmxkIGFuZCBpdOKAmXMgY3VycmVudCBzdGF0ZS4gRGVjaWRlZCB0byBnZXQgaW50byBhbHRlcm5hdGl2ZSBuZXdzIHRvIHRlbGwgdGhlIHRydXRoIHRvIGJlc3Qgb2YgYWJpbGl0eS4iCiogIm5lb25uZXR0bGUuY29tIiwgd2hpY2ggaXMgYSBCcml0aXNoIHdlYnNpdGUgd2l0aCBhbiAiQWJvdXQgVXMiIHBhZ2UgdGhhdCBzdGF0ZXM6ICJ3ZSBiZWxpZXZlIHRoZSBtYWluc3RyZWFtIGhhcyBiZWNvbWUgbGVzcyB2YWxpZCBhcyBpdCBjb250aW51ZXMgaXRzIG9uZ29pbmcgcHJhY3RpY2VzIG9mIGNlbnNvcnNoaXAgYW5kIGVuZ2luZWVyZWQgbmFycmF0aXZlcy4iCiogIm5ld3NwdW5jaC5jb20iLCB3aGljaCBGYWN0Q2hlY2sub3JnIHNheXMgImlzIHRoZSBuZXcgc2l0ZSBmb3IgWW91cm5ld3N3aXJlLmNvbSwgd2hpY2ggaGFzIGJlZW4gYSBwcm9saWZpYyBwb3N0ZXIgb2YgbWlzaW5mb3JtYXRpb24gYW5kIGNvbnNwaXJhY3kgdGhlb3JpZXMuIgoKVGhlIGxpbmtzIGZyb20gImp1bmsgbmV3cyIgd2Vic2l0ZXMgdGhhdCB3ZXJlIG1vc3Qgc2hhcmVkIHdpdGhpbiB0aGUgcHJvLVRydW1wIFBhZ2VzIGVjb3N5c3RlbSB3ZXJlIGFzIGZvbGxvd3M6CgpgYGB7ciwgZWNobz1GQUxTRSwgZXZhbD1UUlVFLCB3YXJuaW5nPUZBTFNFfQojTW9zdCBTaGFyZWQgIkp1bmsgTmV3cyIgTGlua3MgKG4gPiAxKQoKI2R0cGFnZXNfanVua19kb20gJT4lIGZpbHRlcihkb21haW4gJWluJSBmYWtlbmV3cykgJT4lIGdyb3VwX2J5KGRvbWFpbikgJT4lIGNvdW50KCkgJT4lIGFycmFuZ2UoZGVzYyhuKSkgJT4lIGhlYWQoMjUpCm9kZGJhbGwgPC0gYygiUGFtZWxhIEdlbGxlciIsICJ8IE5lb24gTmV0dGxlIiwgCiJDb25zZXJ2YXRpdmUgUG9zdCIsICJBbmdlbCIsICJEZW5uaXMiLCAiTGFycnkiLCAiTGVlIiwgIlNob3cgQXJjaGl2ZXMiLCAiQnJpYW4gS29sZmFnZSIpCmR0cF9kdCA8LSBkdHBhZ2VzX2p1bmtfZG9tICU+JSBzZWxlY3QoUGFnZS5OYW1lLCBDcmVhdGVkLCBkb21haW4sIExpbmsuVGV4dCwgUGFnZS5MaWtlcy5hdC5Qb3N0aW5nKSAlPiUgZmlsdGVyKGRvbWFpbiAlaW4lIGZha2VuZXdzKSAlPiUgZmlsdGVyKCFMaW5rLlRleHQgJWluJSBvZGRiYWxsKSAlPiUgZ3JvdXBfYnkoTGluay5UZXh0LCBkb21haW4pICU+JSBjb3VudCgpICU+JSBhcnJhbmdlKGRlc2MobikpCgojZHRwX2R0ICU+JSBncm91cF9ieShkb21haW4pICU+JSBjb3VudCgpICU+JSBhcnJhbmdlKGRlc2MobikpCgpkYXRhdGFibGUoZHRwX2R0LCBvcHRpb25zPWxpc3Qob3JkZXI9bGlzdChsaXN0KDMsICdkZXNjJykpKSkKYGBgCgpBIHRleHQgYW5hbHlzaXMgb2YgdGhlIERlc2NyaXB0aW9ucyBhY2NvbXBhbnlpbmcgdGhlIGxpbmtzIGhpZ2hsaWdodHMgdGhlIGRvbWluYW50IHRvcGljcyBvZiB0aGUgImp1bmsgbmV3cyIgc2hhcmVkOiBib3JkZXJzIGFuZCBJc2xhbS4gTWVudGlvbnMgb2YgSXNsYW0gYXJlIGNvcnJlbGF0ZWQgd2l0aCBwcm9taW5lbnQgRGVtb2NyYXRpYyBjb25ncmVzc3dvbWVuIElsaGFuIE9tYXIgYW5kIFJhc2hpZGEgVGxhaWIgYXMgd2VsbCBhcyBzaGFyaWEgYW5kIGppaGFkLiAKCmBgYHtyLCBlY2hvPUZBTFNFLCBldmFsPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpkdHBhZ2VzX2p1bmtfZG9tICU+JSBmaWx0ZXIoZG9tYWluICVpbiUgZmFrZW5ld3MpICU+JSBzZWxlY3QoTGluay5UZXh0LCBEZXNjcmlwdGlvbikgJT4lIGhlYWQoMTAwKQoKZHRwYWdlc19qdW5rX2xpbmt0ZXh0IDwtIGR0cGFnZXNfanVua19kb20gJT4lIGZpbHRlcihkb21haW4gJWluJSBmYWtlbmV3cykgJT4lIGdyb3VwX2J5KFBhZ2UuTmFtZSkgJT4lIHVuZ3JvdXAoKSAlPiUgbXV0YXRlKGlkPXJvd19udW1iZXIoKSwgRGVzY3JpcHRpb249YXMuY2hhcmFjdGVyKERlc2NyaXB0aW9uKSkgJT4lIHNlbGVjdChpZCwgRGVzY3JpcHRpb24pCmR0cGFnZXNfanVua19saW5rdGV4dCA8LSB0ZXh0X2NsZWFuKGRhdGE9ZHRwYWdlc19qdW5rX2xpbmt0ZXh0LCB0ZXh0PURlc2NyaXB0aW9uKQpkdHBhZ2VzX2p1bmtfbGlua3Rva2VucyA8LSB0ZXh0X3Rva2VuaXplKGRhdGE9ZHRwYWdlc19qdW5rX2xpbmt0ZXh0LCB0ZXh0PXRleHQsIHN0b3B3b3Jkcz1OVUxMLCBuPTEpIAojZHRwYWdlc19saW5rdG9rZW5zMiA8LSB0ZXh0X3Rva2VuaXplKGRhdGE9ZHRwYWdlc19saW5rdGV4dCwgdGV4dD10ZXh0LCBzdG9wd29yZHM9TlVMTCwgbj0yKSAKZHRwYWdlc19qdW5rX2xpbmtjb3JyZWxhdGlvbiA8LSB0ZXh0X2NvcnJlbGF0aW9uKGRhdGE9ZHRwYWdlc19qdW5rX2xpbmt0b2tlbnMsIG5ncmFtPW5ncmFtLCB0b3A9MjAsIG1lbnRpb25zPTUpCgojQ2xlYW4gVGV4dCBmb3IgV29yZHMgVGhhdCBBcmUgTm90IFJlbGV2YW50CmR0cGFnZXNfanVua19saW5rY29ycmVsYXRpb24gJT4lIGdyb3VwX2J5KHRvcGljKSAlPiUgdG9wX24obj0xMCwgd3Q9Y29ycmVsYXRpb24pICU+JSBhcnJhbmdlKHRvcGljKQpkdHBhZ2VzX2p1bmtfbGlua3RvcGljc19jbGVhbiA8LSBkdHBhZ2VzX2p1bmtfbGlua2NvcnJlbGF0aW9uICU+JSBmaWx0ZXIoIXRvcGljICVpbiUgYygibmV0dGxlIiwgIm5lb24iLCAidHJ1ZSIsICJwdW5kaXQiKSB8ICFtZW50aW9uICVpbiUgIGMoIm5ldHRsZSIsICJuZW9uIiwgInRydWUiLCAicHVuZGl0IikpIAojZHRwYWdlc19saW5rY29ycmVsYXRpb24yICU+JSBncm91cF9ieSh0b3BpYykgJT4lIHRvcF9uKG49MTAsIHd0PWNvcnJlbGF0aW9uKSAlPiUgYXJyYW5nZSh0b3BpYykKI1JlZHVjZSBUb3BpY3MgJiBQcmVwIEZvciBQbG90dGluZwpkdHBhZ2VzX2p1bmtfbGlua3RvcGljcyA8LSB0b3BpY19yZWR1Y2UoZHRwYWdlc19qdW5rX2xpbmt0b3BpY3NfY2xlYW4sIHRvcGljPXRvcGljLCBtZW50aW9ucz0xMCkKYGBgCgpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgZXZhbD1UUlVFfQpzZXQuc2VlZCgyMDE5KQpkdHBhZ2VzX2p1bmtfbGlua3RvcGljcyAlPiUKICBmaWx0ZXIoY29ycmVsYXRpb24gPiAuMTMpICU+JQogIGdyYXBoX2Zyb21fZGF0YV9mcmFtZSgpICU+JQogIGdncmFwaChsYXlvdXQgPSAia2siKSArCiAgZ2VvbV9lZGdlX2xpbmsoYWVzKGVkZ2VfYWxwaGEgPSBjb3JyZWxhdGlvbiksIHNob3cubGVnZW5kID0gRkFMU0UpICsKICBnZW9tX25vZGVfcG9pbnQoY29sb3IgPSAicmVkIiwgc2l6ZSA9IDIpICsKICBnZW9tX25vZGVfdGV4dChhZXMobGFiZWwgPSBuYW1lKSwgcmVwZWwgPSBUUlVFKSArCiAgdGhlbWVfdm9pZCgpCgpgYGAKCk9mIHRoZSAxMDAgcGFnZXMgaW4gdGhlIHByby1UcnVtcCBQYWdlcyBlY29zeXN0ZW0sIDM0IG9mIHRoZW0gc2hhcmVkIGEgImp1bmsgbmV3cyIgbGluay4gVGhlIG1vc3QgcHJvbGlmaWMgc2hhcmVyIGlzICJXYWtlIFVwIEFtZXJpY2EsIHRoZSBPcmlnaW5hbCIsIHdoaWNoIHdhcyByZXNwb25zaWJsZSBmb3IgbmVhcmx5IG9uZS10aGlyZCBvZiB0aGUgImp1bmsgbmV3cyIgbGlua3MgYW5kIGhhcyBtb3JlIHRoYW4gNTAwLDAwMCBmb2xsb3dlcnMuICAgICAKCmBgYHtyLCBlY2hvPUZBTFNFLCBldmFsPVRSVUUsIHdhcm5pbmc9RkFMU0V9CiNCaWdnZXN0IFNoYXJlcnMgb2YgIkp1bmsgTmV3cyBEb21haW5zIiAtIEFycmFuZ2VkIGJ5IG51bWJlciBvZiBwb3N0cyBzaGFyZWQgdGhlbiBmb2xsb3dlcnMgCmR0cF9kdF9sZWFkZXJzIDwtIGR0cGFnZXNfanVua19kb20gJT4lIHNlbGVjdChQYWdlLk5hbWUsIENyZWF0ZWQsIGRvbWFpbiwgTGluay5UZXh0LCBQYWdlLkxpa2VzLmF0LlBvc3RpbmcpICU+JSBmaWx0ZXIoZG9tYWluICVpbiUgZmFrZW5ld3MpICU+JSBncm91cF9ieShQYWdlLk5hbWUpICU+JSBtdXRhdGUoUG9zdHM9bGVuZ3RoKFBhZ2UuTmFtZSksIEZvbGxvd2Vycz1tYXgoUGFnZS5MaWtlcy5hdC5Qb3N0aW5nKSkgJT4lIHNlbGVjdChQYWdlLk5hbWUsIEZvbGxvd2VycywgUG9zdHMpICU+JSBkaXN0aW5jdCgpICU+JSBhcnJhbmdlKGRlc2MoUG9zdHMpLCBkZXNjKEZvbGxvd2VycykpCgpkYXRhdGFibGUoZHRwX2R0X2xlYWRlcnMsIG9wdGlvbnM9bGlzdChvcmRlcj1saXN0KGxpc3QoMywgJ2Rlc2MnKSkpKQoKCmBgYAoKT25seSBhIGhhbmRmdWwgb2YganVuayBuZXdzIGxpbmtzIChuaW5lKSB3ZXJlIHNoYXJlZCBieSBtdWx0aXBsZSBwYWdlcyBzbyBpdCBpcyBkaWZmaWN1bHQgdG8gYXNzZXNzIHdpZGVzcHJlYWQgY29vcmRpbmF0ZWQgYmVoYXZpb3IgYW1vbmcgcGFnZXMuIEhvd2V2ZXIsIGEgc29jaWFsIG5ldHdvcmsgYW5hbHlzaXMgb2YgImp1bmsgbmV3cyIgbGlua3MgdGhhdCB3ZXJlIHNoYXJlZCBpbmRpY2F0ZXMgYXBwYXJlbnQgY29vcmRpbmF0aW9uIGFtb25nIGZvdXIgcHJvLVRydW1wIHBhZ2VzIHRvIGFtcGxpZnkgY29udGVudDogCgorIFNpbGVuY2UgaXMgQ29uc2VudCAtIFVTIEJvcmRlciBJbnZhc2lvbgorIFN0YW5kIFdpdGggSWxsaW5vaXMgQWdhaW5zdCBUaGUgSWxsZWdhbCBBbGllbiBJbnZhc2lvbgorIFN0YW5kIFdpdGggTm9ydGggRGFrb3RhIEFnYWluc3QgVGhlIElsbGVnYWwgQWxpZW4gSW52YXNpb24KKyBTdGFuZCBXaXRoIFNvdXRoIERha290YSBBZ2FpbnN0IFRoZSBJbGxlZ2FsIEFsaWVuIEludmFzaW9uCgpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgZXZhbD1GQUxTRSwgaW5jbHVkZT1GQUxTRX0KZHRwYWdlc19qdW5rX2ZhY2Vib29rIDwtIGR0cGFnZXNfanVua19kb20gJT4lIGZpbHRlcihkb21haW4gJWluJSBmYWtlbmV3cykgJT4lIHVuZ3JvdXAoKSAlPiUgc2VsZWN0KExpbmsuVGV4dCwgUGFnZS5OYW1lLCBDcmVhdGVkKQpkdHBhZ2VzX2p1bmtfZmFjZWJvb2tfbmV0d29yayA8LSBkdHBhZ2VzX2p1bmtfZmFjZWJvb2sgJT4lIGdyb3VwX2J5KExpbmsuVGV4dCkgJT4lIGFycmFuZ2UoQ3JlYXRlZCkgJT4lIG11dGF0ZShmaXJzdD1QYWdlLk5hbWUsIHNlY29uZD1sZWFkKFBhZ2UuTmFtZSwxKSwgaW5kZXg9cm93X251bWJlcigpKSAlPiUgZmlsdGVyKHNlY29uZCAhPSAiIiAmIGZpcnN0ICE9IHNlY29uZCkgJT4lIHVuZ3JvdXAoTGluay5UZXh0KSAlPiUgc2VsZWN0KGZpcnN0LCBzZWNvbmQpICU+JSBtdXRhdGUoc2Vjb25kPWFzLmNoYXJhY3RlcihzZWNvbmQpKQojZHRwYWdlc19qdW5rX2ZhY2Vib29rX25ldHdvcmsgJT4lIGhlYWQoMjApOyAjZGltKGR0Z3JvdXBzX2p1bmtfZmFjZWJvb2tfbmV0d29yaykKZHRwYWdlc19qdW5rX2NvdW50cyA8LSBkdHBhZ2VzX2p1bmtfZmFjZWJvb2tfbmV0d29yayAlPiUgY291bnQoZmlyc3QpICU+JSBhcnJhbmdlKGRlc2MobikpCiNkdHBhZ2VzX2p1bmtfY291bnRzICU+JSBoZWFkKDIwKQpkdHBhZ2VzX2p1bmtfY29ycmVsYXRpb25zIDwtIGR0cGFnZXNfanVua19mYWNlYm9va19uZXR3b3JrICU+JSBzZW1pX2pvaW4oZHRwYWdlc19qdW5rX2NvdW50cykKI2R0cGFnZXNfanVua19jb3JyZWxhdGlvbnMgJT4lIGhlYWQoMjApCmR0cGFnZXNfanVua19jb3JyZWxhdGlvbnMxIDwtIGR0cGFnZXNfanVua19jb3JyZWxhdGlvbnMgJT4lIHBhaXJ3aXNlX2NvcihmaXJzdCwgc2Vjb25kLCBzb3J0PVQsIHVwcGVyPUYpCmR0cGFnZXNfanVua19jb3JyZWxhdGlvbnMxCmBgYAoKYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGV2YWw9RkFMU0V9CnNldC5zZWVkKDIwMTkpCmR0cGFnZXNfanVua19jb3JyZWxhdGlvbnMxICU+JQogIGZpbHRlcihjb3JyZWxhdGlvbiA+IC4xNSkgJT4lCiAgZ3JhcGhfZnJvbV9kYXRhX2ZyYW1lKGRpcmVjdGVkPVQpICU+JQogIGdncmFwaChsYXlvdXQgPSAia2siKSArCiAgZ2VvbV9lZGdlX2xpbmsoYWVzKGVkZ2VfYWxwaGEgPSBjb3JyZWxhdGlvbiksIHNob3cubGVnZW5kID0gRkFMU0UpICsKICBnZW9tX25vZGVfcG9pbnQoY29sb3IgPSAicmVkIiwgc2l6ZSA9IDIpICsKICBnZW9tX25vZGVfdGV4dChhZXMobGFiZWwgPSBuYW1lKSwgcmVwZWwgPSBUUlVFKSArCiAgdGhlbWVfdm9pZCgpCgojZHRwYWdlc19qdW5rX2NvcnJlbGF0aW9uczEgJT4lCiMgIGZpbHRlcihjb3JyZWxhdGlvbiA+IC4yKSAlPiUKIyAgZ3JhcGhfZnJvbV9kYXRhX2ZyYW1lKGRpcmVjdGVkPVQpICU+JQojICBnZ3JhcGgobGF5b3V0ID0gImxpbmVhciIpICsKIyAgZ2VvbV9lZGdlX2FyYyhhZXMoYWxwaGE9Y29ycmVsYXRpb24pLCBjb2xvcj0iZ3JheSIsIHdpZHRoPTAuNSkgKwogICNnZW9tX2VkZ2VfYXJjKGVkZ2VfY29sb3VyPSJibGFjayIsIGVkZ2VfYWxwaGE9MC4yLCBlZGdlX3dpZHRoPTAuMywgZm9sZD1UKSArIy4uaW5kZXguLikpICsKICAjZ2VvbV9lZGdlX2xpbmsoYWVzKGVkZ2VfYWxwaGEgPSBjb3JyZWxhdGlvbiksIHNob3cubGVnZW5kID0gRkFMU0UpICsKIyAgZ2VvbV9ub2RlX3BvaW50KGNvbG9yID0gInJlZCIsIHNpemUgPSAxKSArCiMgIGdlb21fbm9kZV90ZXh0KGFlcyhsYWJlbD1uYW1lKSwgYW5nbGU9OTAsIGhqdXN0PTAuMSwgbnVkZ2VfeSA9IC0wLjUsIHNpemU9MSwgY29sb3I9InJlZCIpICsKIyAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLAojICAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpLAojICAgICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSwKIyAgICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwKIyAgICAgICAgICBsZWdlbmQudGl0bGU9IGVsZW1lbnRfYmxhbmsoKSwKIyAgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfYmxhbmsoKSwKIyAgICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiMgICAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCBzaXplPTgpLAojICAgICAgICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgc2l6ZT04KSwKIyAgICAgICAgICBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoZmFjZSA9ICJpdGFsaWMiLCBzaXplPTgpLAojICAgICAgICAgIHBhbmVsLmdyaWQubWlub3I9ZWxlbWVudF9ibGFuaygpLAojICAgICAgICAgIHBhbmVsLmdyaWQubWFqb3I9ZWxlbWVudF9ibGFuaygpLAojICAgICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksIAojICAgICAgICAgIGF4aXMubGluZSA9IGVsZW1lbnRfYmxhbmsoKSwKIyAgICAgICAgICBheGlzLnRpY2tzID0gZWxlbWVudF9ibGFuaygpKQpgYGAKCkEgdGltZS1zZXJpZXMgYW5hbHlzaXMgaW5kaWNhdGVzIHRoYXQgdGhlICJTdGFuZCBXaXRoIFtibGFua10gQWdhaW5zdCB0aGUgSWxsZWdhbCBBbGllbiBJbnZhc2lvbiIgcGFnZXMgYXJlIGNsZWFybHkgY29vcmRpbmF0aW5nIHRvIHNoYXJlIGp1bmsgbmV3cyBsaW5rcyByZWxhdGVkIHRvIGltbWlncmF0aW9uLiBUaGUgeCBheGlzIHJlcHJlc2VudHMgdGhlIHRpbWUgZWxhcHNlZCBiZXR3ZWVuIHBvc3RzIChpbiBzZWNvbmRzKSwgdGh1cyB0aGUgbW9yZSB2ZXJ0aWNhbCB0aGUgbGluZSwgdGhlIHNob3J0ZXIgdGhlIHRpbWUgYmV0d2VlbiBwb3N0cyBvZiB0aGUgc2FtZSBsaW5rLiBBIGxlc3NlciBzdWJzdGFudGlhbCB0cmVuZCAoZ2l2ZW4gc28gZmV3IGRhdGEgcG9pbnRzKSBpcyBzZWVuIGluIHJlbGF0aW9uIHRvIGp1bmsgbmV3cyBsaW5rcyB0aGF0IHJlZmVyZW5jZSBKZWZmcmV5IEVwc3RlaW4gYW5kIEVsaWphaCBDdW1taW5ncywgaW5kaWNhdGluZyB0aGF0IHRoZSAiVHJ1bXAgJ1RoZSBQZW9wbGUncyBQcmVzaWRlbnQnIiBwYWdlIG1heSBiZSBhbiBpbmZsdWVuY29yIG9mIGF0IGxlYXN0IHR3byBvdGhlciBwYWdlczogIlJlcHVibGljYW5zIEZvciBUcnVtcCIgYW5kICJUcnVtcCwgQW1lcmljYW4gUGF0cmlvdC4iIApgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgZXZhbD1UUlVFfQojLCBlbGFwc2VkPWlmZWxzZShpcy5uYShlbGFwc2VkKSwgMCwgZWxhcHNlZCkpICU+JSBhcnJhbmdlKExpbmsuVGV4dCwgaW5kZXgpICAKZHRwYWdlc19qdW5rX3Bsb3QgPC0gZHRwYWdlc19qdW5rX2RvbSAlPiUgc2VsZWN0KFBhZ2UuTmFtZSwgQ3JlYXRlZCwgZG9tYWluLCBMaW5rLlRleHQsIFBhZ2UuTGlrZXMuYXQuUG9zdGluZykgJT4lIGZpbHRlcihkb21haW4gJWluJSBmYWtlbmV3cyAmICFMaW5rLlRleHQgJWluJSBjKCJQYW1lbGEgR2VsbGVyIiwgIkNvbnNlcnZhdGl2ZSBQb3N0IikpICU+JSBncm91cF9ieShMaW5rLlRleHQsIGRvbWFpbikgJT4lIGFycmFuZ2UoQ3JlYXRlZCkgJT4lIG11dGF0ZShyZWFjaD1jdW1zdW0oUGFnZS5MaWtlcy5hdC5Qb3N0aW5nKSwgaW5kZXg9c2VxX2Fsb25nKHJlYWNoKSwgbj1tYXgoaW5kZXgpKSAlPiUgZmlsdGVyKG4gPiAxKSAlPiUgbXV0YXRlKEFydGljbGU9aWZlbHNlKGluZGV4PT1uLCBhcy5jaGFyYWN0ZXIoTGluay5UZXh0KSwgIiIpKSAKCmR0cGFnZXNfanVua19wbG90IDwtIGR0cGFnZXNfanVua19wbG90ICU+JSBncm91cF9ieShMaW5rLlRleHQpICU+JSBhcnJhbmdlKENyZWF0ZWQpICU+JSBtdXRhdGUocHJldmlvdXM9bGFnKENyZWF0ZWQsIDEpLCBlbGFwc2VkPUNyZWF0ZWQtbGFnKENyZWF0ZWQsMSksIGVsYXBzZWQ9aWZlbHNlKGlzLm5hKGVsYXBzZWQpLCAwLCBhcy5pbnRlZ2VyKGVsYXBzZWQpKSwgdGltZT1jdW1zdW0oZWxhcHNlZCksIE5hbWU9UGFnZS5OYW1lKQojZHRwYWdlc19qdW5rX3Bsb3QKCmR0cGFnZXNfanVua19wbG90ICU+JSBnZ3Bsb3QoYWVzKHg9dGltZSwgeT1yZWFjaCkpICsKICBnZW9tX2ppdHRlcihhZXMoY29sb3I9ZG9tYWluKSkgKyAKICBnZW9tX3BhdGgoYWVzKGNvbG91cj1kb21haW4pLCBzaXplPTAuNSwgYWxwaGE9MC41KSArCiAgZ2VvbV90ZXh0KGFlcyh4PXRpbWUsIHk9cmVhY2gsIGxhYmVsPU5hbWUpLCBzaXplPTEsIGhqdXN0PSJpbndhcmQiKSArCiAgI3hsaW0oMCwgNTAwMDAwMCkgKwogIGxhYnMoeD0iVGltZSBFbGFwc2VkIChpbiBTZWNvbmRzKSIsIHk9IkZvbGxvd2VycyIsIGNvbG91cj0iRG9tYWluIikgKyAgCiAgZmFjZXRfd3JhcCh+IExpbmsuVGV4dCwgc2NhbGVzPSJmcmVlX3kiLCBsYWJlbGxlciA9IGxhYmVsX3dyYXBfZ2VuKHdpZHRoID0gNzUsIG11bHRpX2xpbmUgPVQpKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hKSArCiAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIHNpemU9NCksCiAgICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCBzaXplPTQpLAogICAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIHNpemU9NCksCiAgICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCBzaXplPTQpLAogICAgICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMyksCiAgICAgICAgICAjcGFuZWwubWFyZ2luLnkgPSB1bml0KC0zLCAnY20nKSwKICAgICAgICAgIGxlZ2VuZC50aXRsZT1lbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgc2l6ZT00KSwKICAgICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIHNpemU9NCksCiAgICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiAgICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCBzaXplPTQpLAogICAgICAgICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiaXRhbGljIiwgc2l6ZT00KSwKICAgICAgICAgICNwYW5lbC5ncmlkLm1pbm9yPWVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICNwYW5lbC5ncmlkLm1ham9yPWVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksIAogICAgICAgICAgI2F4aXMubGluZSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICNwbG90Lm1hcmdpbiA9IG1hcmdpbigtMC4yNSwgLTAuMjUsIC0wLjI1LCAtMC4yNSwgImNtIiksCiAgICAgICAgICBheGlzLnRpY2tzLnk9ZWxlbWVudF9ibGFuaygpKSAKCmBgYAoKSW4gdGhlICoqcHJvLVRydW1wIEdyb3VwcyBFY29zeXN0ZW0qKiwgdGhlcmUgd2VyZSA1MDYgdW5pcXVlIGxpbmtzIHNoYXJlZCBmcm9tIGRpZmZlcmVudCAxNiAianVuayBuZXdzIiB3ZWJzaXRlcy4gT2YgdGhlIDUwNiBsaW5rcywgMTI5IHdlcmUgZnJvbSAibmVvbm5ldHRsZS5jb20uIiBNdWx0aXBsZSAianVuayBuZXdzIiB3ZWJzaXRlcyBmb3VuZCBpbiB0aGUgcHJvLVRydW1wIFBhZ2VzIGVjb3N5c3RlbSwgZS5nLiAicHVwcGV0c3RyaW5nbmV3cy5jb20iLCAibmV3c3B1bmNoLmNvbSIsICJnZWxsZXJyZXBvcnQuY29tIiAtIHdlcmUgd2lkZWx5IHNoYXJlZCBpbiBwcm8tVHJ1bXAgR3JvdXBzLiBUaHJlZSBvdGhlciAianVuayBuZXdzIiB3ZWJzaXRlcyBhbHNvIGZlYXR1cmVkIHByb21pbmVudGx5OiAgIAoKKiAiY29uc2VydmF0aXZldHJlZWhvdXNlLmNvbSIsIHdoaWNoIG5vdGVzIG9uIGl0cyAiQWJvdXQgVXMiIHBhZ2UgdGhhdCDigJxmZWFyIGlzIGF0IHRoZSBjb3JlIG9mIGxpYmVyYWxpc20sIGFuZCBsb3ZlL3RydXN0IGlzIGF0IHRoZSBjb3JlIG9mIGNvbnNlcnZhdGlzbS4gTGliZXJhbGlzbSBpcyBhYm91dCBjb250cm9sLiBDb25zZXJ2YXRpc20gaXMgYWJvdXQgc2VsZi1lbXBvd2VybWVudC7igJ0KKiAiaW5mb3dhcnMuY29tIiwgd2hpY2ggaXMgdGhlIHdlYnNpdGUgZm9yIHRoZSBwb3B1bGFyIGNvbnNwaXJhY3kgdGhlb3J5IHJhZGlvIHNob3cgYnkgdGhlIHNhbWUgbmFtZSBob3N0ZWQgYnkgQWxleCBKb25lcy4gCiogInJpZ2h0d2luZ3RyaWJ1bmUuY29tIiwgd2hpY2ggRmFjdENoZWNrLm9yZyBzYXlzICJkb2VzbuKAmXQgaGF2ZSBhIGRpc2NsYWltZXIsIGJ1dCBpdCBkb2VzIHNheSBvbiBvbmUgb2YgYXQgbGVhc3QgZml2ZSBhc3NvY2lhdGVkIEZhY2Vib29rIHBhZ2VzOiAnSWYgWW91IEFyZSBBIFJpZ2h0IFdpbmdlciBBbmQgUElTU0VEIFlvdeKAmXJlIEluIFRoZSBSaWdodCBQbGFjZS4gV2UgUHJvdmlkZSBIaWdoIFF1YWxpdHkgSm91cm5hbGlzbSBXaXRoIFZpcmFsIE1lbWVzIGFuZCBWaWRlbyBJbiBCZXR3ZWVuISBTbyBHaXZlIFVzIEEgTGlrZSEgWW91IFdvbuKAmXQgQmUgRGlzc2Fwb2ludGVkLiciCgpUaGUgbGlua3MgZnJvbSAianVuayBuZXdzIiB3ZWJzaXRlcyB0aGF0IHdlcmUgbW9zdCBzaGFyZWQgd2l0aGluIHRoZSBwcm8tVHJ1bXAgR3JvdXBzIGVjb3N5c3RlbSB3ZXJlIGFzIGZvbGxvd3M6CgpgYGB7ciwgZWNobz1GQUxTRSwgZXZhbD1UUlVFLCB3YXJuaW5nPUZBTFNFfQojTW9zdCBTaGFyZWQgIkp1bmsgTmV3cyIgTGlua3MgKG4gPiAxKQojZHRncm91cHNfanVua19kb21fbm9mYiAlPiUgc2VsZWN0KEdyb3VwLk5hbWUsIENyZWF0ZWQsIGRvbWFpbiwgTGluay5UZXh0LCBNZW1iZXJzLmF0LlBvc3RpbmcpICU+JSBmaWx0ZXIoZG9tYWluICVpbiUgZmFrZW5ld3MpICU+JSBncm91cF9ieShMaW5rLlRleHQpICU+JSBhcnJhbmdlKENyZWF0ZWQpICU+JSBtdXRhdGUocmVhY2g9Y3Vtc3VtKE1lbWJlcnMuYXQuUG9zdGluZyksIGluZGV4PXNlcV9hbG9uZyhMaW5rLlRleHQpKSAlPiUgYXJyYW5nZShMaW5rLlRleHQsIGluZGV4KQoKI2R0Z3JvdXBzX2p1bmtfZG9tX25vZmIgJT4lIHNlbGVjdChHcm91cC5OYW1lLCBDcmVhdGVkLCBkb21haW4sIExpbmsuVGV4dCwgTWVtYmVycy5hdC5Qb3N0aW5nKSAlPiUgZmlsdGVyKGRvbWFpbiAlaW4lIGZha2VuZXdzKSAlPiUgZ3JvdXBfYnkoTGluay5UZXh0KSAlPiUgY291bnQoKSAlPiUgYXJyYW5nZShkZXNjKG4pKQoKI2R0Z3JvdXBzX2p1bmtfZG9tICU+JSBmaWx0ZXIoZG9tYWluICVpbiUgZmFrZW5ld3MpICU+JSBncm91cF9ieShkb21haW4pICU+JSBjb3VudCgpICU+JSBhcnJhbmdlKGRlc2MobikpICU+JSBoZWFkKDI1KQpvZGRiYWxsIDwtIGMoIlBhbWVsYSBHZWxsZXIiLCAifCBOZW9uIE5ldHRsZSIsICJDb25zZXJ2YXRpdmUgUG9zdCIsICJBbmdlbCIsICJEZW5uaXMiLCAiTGFycnkiLCAiTGVlIiwgIlNob3cgQXJjaGl2ZXMiLCAiQnJpYW4gS29sZmFnZSIsICJEaW5hIiwgIkRpbm8iLCAiTGlzYSIsICJDaG9uIiwgIk1lcnJpbGwiLCAiUGF0IiwgIlNhcmFoIiwgIkJpbGwiLCAiRGFuaWVsIiwgIkVsaXphYmV0aCIsICJNaWNreSIsICJLaW1iZXJsZXkiLCAiUm9uIiwgIkRhcmxlbmUiLCAiSmVycnkiLCAiSm9obiIsICJNYXJrIiwgIkRhbiIsICJGcmFuayIsICJHYXlsZSIsICJHZW5lIiwgIkdyZWdnIiwgIkthcmVuIiwgICJMaW5kYSIsICJNaWNoZWFsaW5hIiwgIlJveGFubmUiLCAiVGhlcmVzYSIsICJBbGljZSIsICJBbGljaWEiLCAiQXN0cmlkIiwgIkNhdGh5IiwgIkNoZXIiLCAiQ2xpbnQiLCAiRGF2aWQiLCAiRGFuaWVsIiwgIkRlbmlzZSIsICJEaWFuZSIsICJEb25uYSIsICJEb3VnIiwgIkdhcnkiLCAiR2VubmFkeSIsICJIZWxlbiIsICJIb2x0b24iLCAiSmFtZXMtQ2hyaXN0aW5hIiwgIkphbmUiLCAiSmVubmlmZXIiLCAiSmVyaSIsICJKZXdlbCIsICJKb3NlIiwgICJLYXRpZSIsICJLZW4iLCAiS2VubmV0aCIsICJLZXZpbiIsICJNYXJpZSIsICJNYXJ5IiwgIk1lbCIsICJNaWNoYWVsIiwgICJNb250eSIsICJQYXRyaWNrIiwgIlBhdHR5IiwgIlJhbHBoIFdpbGxpYW0iLCAiUmFuZHkiLCAiU2VuY2VyaWEiLCAiU2FsbWFuIiwgIlNoYXJvbiIsICJTdGFjaWUiLCAiU2hhbmthciIsICJTdGVwaGVuIiwgIlN0ZXZlbiIsICJTdGV2ZSIsICJUaGVyZXNhIiwgIlRvbW15IiwgIlRyZWciLCAiV2FsdGVyIikKZHRnX2R0IDwtIGR0Z3JvdXBzX2p1bmtfZG9tICU+JSBzZWxlY3QoR3JvdXAuTmFtZSwgQ3JlYXRlZCwgZG9tYWluLCBMaW5rLlRleHQsIE1lbWJlcnMuYXQuUG9zdGluZykgJT4lIGZpbHRlcihkb21haW4gJWluJSBmYWtlbmV3cykgJT4lIGZpbHRlcighTGluay5UZXh0ICVpbiUgb2RkYmFsbCkgJT4lIGdyb3VwX2J5KExpbmsuVGV4dCwgZG9tYWluKSAlPiUgY291bnQoKSAlPiUgYXJyYW5nZShkZXNjKG4pKQoKI2R0Z19kdCAlPiUgZ3JvdXBfYnkoZG9tYWluKSAlPiUgY291bnQoKSAlPiUgYXJyYW5nZShkZXNjKG4pKQoKZGF0YXRhYmxlKGR0Z19kdCwgb3B0aW9ucz1saXN0KG9yZGVyPWxpc3QobGlzdCgzLCAnZGVzYycpKSkpCmBgYAoKQSB0ZXh0IGFuYWx5c2lzIG9mIHRoZSBEZXNjcmlwdGlvbnMgYWNjb21wYW55aW5nIHRoZSBsaW5rcyBoaWdobGlnaHRzIFVrcmFpbmUgYXMgYSBrZXkgdG9waWMgb2YgY29udmVyc2F0aW9uLCBzcGVjaWZpY2FsbHkgaW4gcmVsYXRpb24gdG8gdGhlIEJpZGVucy4gT3RoZXIg4oCcanVuayBuZXdz4oCdIHRvcGljcyByZWxhdGUgdG8gdGhlIG9uZ29pbmcgaW1wZWFjaG1lbnQgaW5xdWlyeSBhbmQgdHdvIHByb21pbmVudCBIb3VzZSBEZW1vY3JhdHMgLSBTcGVha2VyIE5hbmN5IFBlbG9zaSBhbmQgSW50ZWxsaWdlbmNlIENvbW1pdHRlZSBDaGFpcm1hbiBBZGFtIFNjaGlmZi4gVGhlIENsaW50b25zIGFyZSBsZXNzIHByb21pbmVudCB0b3BpY3Mgb2YgImp1bmsgbmV3cyIiIGNpcmN1bGF0aW5nIGluIHByby1UcnVtcCBncm91cHMuIAoKYGBge3IsIGluY2x1ZGU9RkFMU0V9CiNkdGdyb3Vwc19qdW5rX2RvbSAlPiUgZmlsdGVyKGRvbWFpbiAlaW4lIGZha2VuZXdzKSAlPiUgc2VsZWN0KExpbmsuVGV4dCwgRGVzY3JpcHRpb24pICU+JSBoZWFkKDEwMCkKCmR0Z3JvdXBzX2p1bmtfbGlua3RleHQgPC0gZHRncm91cHNfanVua19kb20gJT4lIGZpbHRlcihkb21haW4gJWluJSBmYWtlbmV3cyAmIExpbmsuVGV4dCAhPSJQZXRpdGlvbiB0byDigJhJbXBlYWNoIE5hbmN5IFBlbG9zaSBmb3IgVHJlYXNvbuKAmSBHb2VzIFZpcmFsIikgJT4lIGdyb3VwX2J5KEdyb3VwLk5hbWUpICU+JSB1bmdyb3VwKCkgJT4lIG11dGF0ZShpZD1yb3dfbnVtYmVyKCksIERlc2NyaXB0aW9uPWFzLmNoYXJhY3RlcihEZXNjcmlwdGlvbikpICU+JSBzZWxlY3QoaWQsIERlc2NyaXB0aW9uKQpkdGdyb3Vwc19qdW5rX2xpbmt0ZXh0IDwtIHRleHRfY2xlYW4oZGF0YT1kdGdyb3Vwc19qdW5rX2xpbmt0ZXh0LCB0ZXh0PURlc2NyaXB0aW9uKQpkdGdyb3Vwc19qdW5rX2xpbmt0b2tlbnMgPC0gdGV4dF90b2tlbml6ZShkYXRhPWR0Z3JvdXBzX2p1bmtfbGlua3RleHQsIHRleHQ9dGV4dCwgc3RvcHdvcmRzPU5VTEwsIG49MSkgCiNkdGdyb3Vwc19saW5rdG9rZW5zMiA8LSB0ZXh0X3Rva2VuaXplKGRhdGE9ZHRncm91cHNfbGlua3RleHQsIHRleHQ9dGV4dCwgc3RvcHdvcmRzPU5VTEwsIG49MikgCmR0Z3JvdXBzX2p1bmtfbGlua2NvcnJlbGF0aW9uIDwtIHRleHRfY29ycmVsYXRpb24oZGF0YT1kdGdyb3Vwc19qdW5rX2xpbmt0b2tlbnMsIG5ncmFtPW5ncmFtLCB0b3A9MjAsIG1lbnRpb25zPTEwKQoKI0NsZWFuIFRleHQgZm9yIFdvcmRzIFRoYXQgQXJlIE5vdCBSZWxldmFudAojZHRncm91cHNfanVua19saW5rY29ycmVsYXRpb24gJT4lIGdyb3VwX2J5KHRvcGljKSAlPiUgdG9wX24obj0xMCwgd3Q9Y29ycmVsYXRpb24pICU+JSBhcnJhbmdlKHRvcGljKQpkdGdyb3Vwc19qdW5rX2xpbmt0b3BpY3NfY2xlYW4gPC0gZHRncm91cHNfanVua19saW5rY29ycmVsYXRpb24gJT4lIGZpbHRlcighdG9waWMgJWluJSBjKCJuZXR0bGUiLCAibmVvbiIsICJuZXdzIiwgInJlcG9ydCIpIHwgIW1lbnRpb24gJWluJSAgYygiZ2F0ZXdheSIsICJwdW5kaXQiLCAibmV0dGxlIiwgIm5lb24iLCAidHJ1ZSIsICJwdW5kaXQiKSkgCiNkdGdyb3Vwc19saW5rY29ycmVsYXRpb24yICU+JSBncm91cF9ieSh0b3BpYykgJT4lIHRvcF9uKG49MTAsIHd0PWNvcnJlbGF0aW9uKSAlPiUgYXJyYW5nZSh0b3BpYykKI1JlZHVjZSBUb3BpY3MgJiBQcmVwIEZvciBQbG90dGluZwpkdGdyb3Vwc19qdW5rX2xpbmt0b3BpY3MgPC0gdG9waWNfcmVkdWNlKGR0Z3JvdXBzX2p1bmtfbGlua3RvcGljc19jbGVhbiwgdG9waWM9dG9waWMsIG1lbnRpb25zPTEwKQoKYGBgCgpgYGB7ciwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgZXZhbD1UUlVFfQpzZXQuc2VlZCgyMDE5KQpkdGdyb3Vwc19qdW5rX2xpbmt0b3BpY3MgJT4lCiAgZmlsdGVyKGNvcnJlbGF0aW9uID4gLjM1KSAlPiUKICBncmFwaF9mcm9tX2RhdGFfZnJhbWUoKSAlPiUKICBnZ3JhcGgobGF5b3V0ID0gImtrIikgKwogIGdlb21fZWRnZV9saW5rKGFlcyhlZGdlX2FscGhhID0gY29ycmVsYXRpb24pLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArCiAgZ2VvbV9ub2RlX3BvaW50KGNvbG9yID0gInJlZCIsIHNpemUgPSAyKSArCiAgZ2VvbV9ub2RlX3RleHQoYWVzKGxhYmVsID0gbmFtZSksIHJlcGVsID0gVFJVRSkgKwogIHRoZW1lX3ZvaWQoKQoKYGBgCgpPZiB0aGUgMjI2IGdyb3VwcyBpbiB0aGUgcHJvLVRydW1wIEdyb3VwcyBlY29zeXN0ZW0sIGF0IGxlYXN0IG9uZSAianVuayBuZXdzIiBsaW5rcyB3YXMgZm91bmQgdG8gaGF2ZSBiZWVuIHBvc3RlZCBpbiAxNjIgb2YgdGhlbS4gVHdvIGxhcmdlIGdyb3VwcyB3aXRoIHRoZSBuYW1lICJEcmFpbiBUaGUgU3dhbXAiIGFyZSBwYXJ0aWN1bGFybHkgcmlmZSB3aXRoIGp1bmsgbmV3cyBsaW5rcy4KCmBgYHtyLCBlY2hvPUZBTFNFLCBldmFsPVRSVUUsIHdhcm5pbmc9RkFMU0V9CiNCaWdnZXN0IFNoYXJlcnMgb2YgIkp1bmsgTmV3cyBEb21haW5zIiAtIEFycmFuZ2VkIGJ5IG51bWJlciBvZiBwb3N0cyBzaGFyZWQgdGhlbiBmb2xsb3dlcnMgCmR0Z19kdF9sZWFkZXJzIDwtIGR0Z3JvdXBzX2p1bmtfZG9tICU+JSBzZWxlY3QoR3JvdXAuTmFtZSwgQ3JlYXRlZCwgZG9tYWluLCBMaW5rLlRleHQsIE1lbWJlcnMuYXQuUG9zdGluZykgJT4lIGZpbHRlcihkb21haW4gJWluJSBmYWtlbmV3cykgJT4lIGdyb3VwX2J5KEdyb3VwLk5hbWUpICU+JSBtdXRhdGUoUG9zdHM9bGVuZ3RoKEdyb3VwLk5hbWUpLCBNZW1iZXJzPW1heChNZW1iZXJzLmF0LlBvc3RpbmcpKSAlPiUgc2VsZWN0KEdyb3VwLk5hbWUsIE1lbWJlcnMsIFBvc3RzKSAlPiUgZGlzdGluY3QoKSAlPiUgYXJyYW5nZShkZXNjKFBvc3RzKSwgZGVzYyhNZW1iZXJzKSkKCmRhdGF0YWJsZShkdGdfZHRfbGVhZGVycywgb3B0aW9ucz1saXN0KG9yZGVyPWxpc3QobGlzdCgzLCAnZGVzYycpKSkpCgpgYGAKCkEgc29jaWFsIG5ldHdvcmsgYW5hbHlzaXMgb2YgImp1bmsgbmV3cyIgbGlua3MgcG9zdGVkIHdpdGhpbiB0aGUgcHJvLVRydW1wIEdyb3VwcyBlY29zeXN0ZW0gaW5kaWNhdGVzIGEgbG90IG9mIG92ZXJsYXAgaW4gImp1bmsgbmV3cyIgY29udGVudCBmcm9tIGdyb3VwIHRvIGdyb3VwIGFsdGhvdWdoIGl0IGlzIHVuY2xlYXIgaG93IG11Y2ggY29vcmRpbmF0aW9uLCBpZiBhbnksIGV4aXN0cy4gICAKCk5vdGU6IFdpdGggY29uc2lkZXJhdGlvbiB0byBwcml2YWN5IHByb3RlY3Rpb24gb2YgRmFjZWJvb2sgdXNlcnMsIENyb3dkVGFuZ2xlIGRvZXMgbm90IHBlcm1pdCB5b3UgdG8gc2VlIHdoaWNoIHNwZWNpZmljIHVzZXIgYWNjb3VudHMgcG9zdGVkIHRvIGdyb3VwcyBvciB3aGV0aGVyIHRoZSBsaW5rIHdhcyBzaGFyZWQgZnJvbSBhIHBhcnRpY3VsYXIgcGFnZS4gVGh1cyBpdCBpcyBub3QgcG9zc2libGUgdG8gZGVmaW5pdGl2ZWx5IGRldGVybWluZSB3aGV0aGVyIHNwZWNpZmljIGFjY291bnRzIGFyZSBlbmdhZ2luZyBpbiBjb29yZGluYXRlZCBiZWhhdmlvciB0byBhbXBsaWZ5IGNvbnRlbnQgYWNyb3NzIGdyb3Vwcy4gSG93ZXZlciwgaXQgaXMgcG9zc2libGUgdG8gc2VlIHdoYXQgY29udGVudCBpcyBzaGFyZWQgd2l0aGluIGdyb3VwcyBieSB0aW1lc3RhbXAsIHByb3ZpZGluZyBzb21lIGluc2lnaHQgYXMgdG8gd2hldGhlciB0aGVyZSBtYXkgYmUgc29tZSBjb29yZGluYXRpb24gYW1vbmcgdXNlcnMgYWNyb3NzIGdyb3Vwcy4KCmBgYHtyLCBpbmNsdWRlPUZBTFNFfQpkdGdyb3Vwc19qdW5rX2ZhY2Vib29rIDwtIGR0Z3JvdXBzX2p1bmtfZG9tICU+JSBmaWx0ZXIoZG9tYWluICVpbiUgZmFrZW5ld3MpICU+JSB1bmdyb3VwKCkgJT4lIHNlbGVjdChMaW5rLlRleHQsIEdyb3VwLk5hbWUsIENyZWF0ZWQpCmR0Z3JvdXBzX2p1bmtfZmFjZWJvb2tfbmV0d29yayA8LSBkdGdyb3Vwc19qdW5rX2ZhY2Vib29rICU+JSBncm91cF9ieShMaW5rLlRleHQpICU+JSBhcnJhbmdlKENyZWF0ZWQpICU+JSBtdXRhdGUoZmlyc3Q9R3JvdXAuTmFtZSwgc2Vjb25kPWxlYWQoR3JvdXAuTmFtZSwxKSwgaW5kZXg9cm93X251bWJlcigpKSAlPiUgZmlsdGVyKHNlY29uZCAhPSAiIiAmIGZpcnN0ICE9IHNlY29uZCkgJT4lIHVuZ3JvdXAoTGluay5UZXh0KSAlPiUgc2VsZWN0KGZpcnN0LCBzZWNvbmQpICU+JSBtdXRhdGUoc2Vjb25kPWFzLmNoYXJhY3RlcihzZWNvbmQpKQojZHRwYWdlc19qdW5rX2ZhY2Vib29rX25ldHdvcmsgJT4lIGhlYWQoMjApOyAjZGltKGR0Z3JvdXBzX2p1bmtfZmFjZWJvb2tfbmV0d29yaykKZHRncm91cHNfanVua19jb3VudHMgPC0gZHRncm91cHNfanVua19mYWNlYm9va19uZXR3b3JrICU+JSBjb3VudChmaXJzdCkgJT4lIGFycmFuZ2UoZGVzYyhuKSkKI2R0cGFnZXNfanVua19jb3VudHMgJT4lIGhlYWQoMjApCmR0Z3JvdXBzX2p1bmtfY29ycmVsYXRpb25zIDwtIGR0Z3JvdXBzX2p1bmtfZmFjZWJvb2tfbmV0d29yayAlPiUgc2VtaV9qb2luKGR0Z3JvdXBzX2p1bmtfY291bnRzKQpkdGdyb3Vwc19qdW5rX2NvcnJlbGF0aW9ucyAlPiUgaGVhZCgyMCkKZHRncm91cHNfanVua19jb3JyZWxhdGlvbnMxIDwtIGR0Z3JvdXBzX2p1bmtfY29ycmVsYXRpb25zICU+JSBwYWlyd2lzZV9jb3IoZmlyc3QsIHNlY29uZCwgc29ydD1ULCB1cHBlcj1GKQpgYGAKCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBldmFsPVRSVUV9CnNldC5zZWVkKDIwMTkpCmR0Z3JvdXBzX2p1bmtfY29ycmVsYXRpb25zMSAlPiUKICBmaWx0ZXIoY29ycmVsYXRpb24gPiAuMikgJT4lCiAgZ3JhcGhfZnJvbV9kYXRhX2ZyYW1lKGRpcmVjdGVkPVQpICU+JQogIGdncmFwaChsYXlvdXQgPSAibGluZWFyIikgKwogIGdlb21fZWRnZV9hcmMoYWVzKGFscGhhPWNvcnJlbGF0aW9uKSwgY29sb3I9ImdyYXkiLCB3aWR0aD0wLjUpICsKICAjZ2VvbV9lZGdlX2FyYyhlZGdlX2NvbG91cj0iYmxhY2siLCBlZGdlX2FscGhhPTAuMiwgZWRnZV93aWR0aD0wLjMsIGZvbGQ9VCkgKyMuLmluZGV4Li4pKSArCiAgI2dlb21fZWRnZV9saW5rKGFlcyhlZGdlX2FscGhhID0gY29ycmVsYXRpb24pLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArCiAgZ2VvbV9ub2RlX3BvaW50KGNvbG9yID0gInJlZCIsIHNpemUgPSAxKSArCiAgZ2VvbV9ub2RlX3RleHQoYWVzKGxhYmVsPW5hbWUpLCBhbmdsZT05MCwgaGp1c3Q9MSwgbnVkZ2VfeSA9IC0wLjUsIHNpemU9MSwgY29sb3I9InJlZCIpICsKICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgbGVnZW5kLnRpdGxlPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgc2l6ZT04KSwKICAgICAgICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgc2l6ZT04KSwKICAgICAgICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChmYWNlID0gIml0YWxpYyIsIHNpemU9OCksCiAgICAgICAgICBwYW5lbC5ncmlkLm1pbm9yPWVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgIHBhbmVsLmdyaWQubWFqb3I9ZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwgCiAgICAgICAgICBheGlzLmxpbmUgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICBheGlzLnRpY2tzID0gZWxlbWVudF9ibGFuaygpKQoKYGBgCmBgYHtyLCBpbmNsdWRlPUZBTFNFfQpkdGdyb3Vwc19qdW5rX3Bsb3QgPC0gZHRncm91cHNfanVua19kb20gJT4lIHNlbGVjdChHcm91cC5OYW1lLCBDcmVhdGVkLCBkb21haW4sIExpbmsuVGV4dCwgTWVtYmVycy5hdC5Qb3N0aW5nKSAlPiUgZmlsdGVyKGRvbWFpbiAlaW4lIGZha2VuZXdzICYgIUxpbmsuVGV4dCAlaW4lIGMoIlNhcmFoIiwgIkRpbm8iLCAiUGF0IiwgIkxpc2EiKSkgJT4lIGdyb3VwX2J5KExpbmsuVGV4dCwgZG9tYWluKSAlPiUgYXJyYW5nZShDcmVhdGVkKSAlPiUgbXV0YXRlKHJlYWNoPWN1bXN1bShNZW1iZXJzLmF0LlBvc3RpbmcpLCBpbmRleD1zZXFfYWxvbmcocmVhY2gpLCBuPW1heChpbmRleCkpICU+JSBmaWx0ZXIobiA+IDEpICU+JSBtdXRhdGUoQXJ0aWNsZT1pZmVsc2UoaW5kZXg9PW4sIGFzLmNoYXJhY3RlcihMaW5rLlRleHQpLCAiIikpIAoKZHRncm91cHNfanVua19wbG90IDwtIGR0Z3JvdXBzX2p1bmtfcGxvdCAlPiUgZ3JvdXBfYnkoTGluay5UZXh0KSAlPiUgYXJyYW5nZShDcmVhdGVkKSAlPiUgbXV0YXRlKHByZXZpb3VzPWxhZyhDcmVhdGVkLCAxKSwgZWxhcHNlZD1DcmVhdGVkLWxhZyhDcmVhdGVkLDEpLCBlbGFwc2VkPWlmZWxzZShpcy5uYShlbGFwc2VkKSwgMCwgYXMuaW50ZWdlcihlbGFwc2VkKSksIHRpbWU9Y3Vtc3VtKGVsYXBzZWQpLCBOYW1lPUdyb3VwLk5hbWUpCmBgYApBIGZ1cnRoZXIgYW5hbHlzaXMgb2YgbmluZSBvZiB0aGUgdG9wIDEwIGp1bmsgbmV3cyBsaW5rcyBzaGFyZWQgaW4gcHJvLVRydW1wIEdyb3VwcyBpbmRpY2F0ZXMgdGhhdCB0aGVyZSBpcyBzZWVtaW5nbHkgbGl0dGxlIGNvb3JkaW5hdGlvbi4gSW5zdGVhZCwgdGhlIHNoYXJpbmcgb2YganVuayBuZXdzIGxpbmtzLCB3aGlsZSBwZXJ2YXNpdmUsIGFwcGVhcnMgdG8gYmUgbW9yZSBvciBsZXNzIG9yZ2FuaWMuIEhvd2V2ZXIsIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBkZWZpbml0aXZlbHkgc2F5IHdoZXRoZXIgdGhlcmUgaXMgc29tZSBsZXZlbCBvZiBjb29yZGluYXRpb24gYW1vbmcgc3BlY2lmaWMgZ3JvdXAgbWVtYmVycyBnaXZlbiB0aGF0IHRoZSBpZGVudGl0aWVzIG9mIG1lbWJlcnMgYXJlIHByaXZhY3kgcHJvdGVjdGVkLgoKYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGV2YWw9VFJVRX0KdG9wZHRqdW5rIDwtIGR0Z3JvdXBzX2p1bmtfcGxvdCAlPiUgZ3JvdXBfYnkoTGluay5UZXh0KSAlPiUgY291bnQoKSAlPiUgYXJyYW5nZShkZXNjKG4pKSAlPiUgaGVhZCgxMCkKdG9wZHRqdW5rIDwtIHRvcGR0anVua1stMSxdCnRvcGR0anVuayA8LSB0b3BkdGp1bmskTGluay5UZXh0CgpkdGdyb3Vwc19qdW5rX3Bsb3QgJT4lIGZpbHRlcihMaW5rLlRleHQgJWluJSB0b3BkdGp1bmspICU+JSBnZ3Bsb3QoYWVzKHg9dGltZSwgeT1yZWFjaCkpICsKICBnZW9tX2ppdHRlcihhZXMoY29sb3I9ZG9tYWluKSkgKyAKICBnZW9tX3BhdGgoYWVzKGNvbG91cj1kb21haW4pLCBzaXplPTAuNSwgYWxwaGE9MC41KSArCiAgZ2VvbV90ZXh0KGFlcyh4PXRpbWUsIHk9cmVhY2gsIGxhYmVsPU5hbWUpLCBzaXplPTEsIGhqdXN0PSJpbndhcmQiKSArCiAgI3hsaW0oMCwgNTAwMDAwMCkgKwogIGxhYnMoeD0iVGltZSBFbGFwc2VkIChpbiBTZWNvbmRzKSIsIHk9IkZvbGxvd2VycyIsIGNvbG91cj0iRG9tYWluIikgKyAgCiAgZmFjZXRfd3JhcCh+IExpbmsuVGV4dCwgc2NhbGVzPSJmcmVlX3kiLCBsYWJlbGxlciA9IGxhYmVsX3dyYXBfZ2VuKHdpZHRoID0gNzUsIG11bHRpX2xpbmUgPVQpKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hKSArCiAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIHNpemU9NCksCiAgICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCBzaXplPTQpLAogICAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIHNpemU9NCksCiAgICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCBzaXplPTQpLAogICAgICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMyksCiAgICAgICAgICAjcGFuZWwubWFyZ2luLnkgPSB1bml0KC0zLCAnY20nKSwKICAgICAgICAgIGxlZ2VuZC50aXRsZT1lbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgc2l6ZT00KSwKICAgICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIHNpemU9NCksCiAgICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiAgICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCBzaXplPTQpLAogICAgICAgICAgcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiaXRhbGljIiwgc2l6ZT00KSwKICAgICAgICAgICNwYW5lbC5ncmlkLm1pbm9yPWVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICNwYW5lbC5ncmlkLm1ham9yPWVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksIAogICAgICAgICAgI2F4aXMubGluZSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICNwbG90Lm1hcmdpbiA9IG1hcmdpbigtMC4yNSwgLTAuMjUsIC0wLjI1LCAtMC4yNSwgImNtIiksCiAgICAgICAgICBheGlzLnRpY2tzLnk9ZWxlbWVudF9ibGFuaygpKSAKCmBgYAoKSW4gdGhlICoqcHJvLUJpZGVuIEdyb3VwcyBFY29zeXN0ZW0qKiwgdGhlcmUgd2VyZSAyNiB1bmlxdWUgbGlua3Mgc2hhcmVkIGZyb20gc2l4IGRpZmZlcmVudCAianVuayBuZXdzIiB3ZWJzaXRlcyAtIGFsbCBvZiB3aGljaCBhcHBlYXIgaW4gdGhlIHByby1UcnVtcCBQYWdlcyBvciBwcm8tVHJ1bXAgR3JvdXBzIGVjb3N5c3RlbXMuIE9mIHRoZSAyNiBsaW5rcywgMTMgd2VyZSBmcm9tICJuZW9ubmV0dGxlLmNvbSIsIHNldmVuIHdlcmUgZnJvbSAibmV3c3B1bmNoLmNvbSIsIHR3byBmcm9tICJ5b3VybmV3c3dpcmUuY29tIiBhbmQgb25lIGVhY2ggZnJvbSAiY29uc2VydmF0aXZlcG9zdC5jb20iLCAiZ2VsbGVycmVwb3J0LmNvbSIsICJpbmZvd2Fycy5jb20iLCBhbmQgInB1cHBldHN0cmluZ25ld3MuY29tIi4KClRoZSBsaW5rcyBmcm9tICJqdW5rIG5ld3MiIHdlYnNpdGVzIHRoYXQgd2VyZSBtb3N0IHNoYXJlZCB3aXRoaW4gdGhlIHByby1CaWRlbiBHcm91cHMgZWNvc3lzdGVtIHdlcmUgYXMgZm9sbG93czoKCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBldmFsPVRSVUV9CiNBbGwgSnVuayBOZXdzIExpbmtzIAojamJncm91cHNfanVua19kb21fbm9mYiAlPiUgc2VsZWN0KEdyb3VwLk5hbWUsIENyZWF0ZWQsIGRvbWFpbiwgTGluay5UZXh0LCBNZW1iZXJzLmF0LlBvc3RpbmcpICU+JSBmaWx0ZXIoZG9tYWluICVpbiUgZmFrZW5ld3MpICU+JSBncm91cF9ieShMaW5rLlRleHQpICU+JSBmaWx0ZXIoIUdyb3VwLk5hbWUgJWluJSBjKCJXZSBBcmUgUSIsICJVTklURUQgREVNT0NSQVRTLCBSRVBVQkxJQ0FOUyAmIExJQkVSVEFSSUFOUyA0IFRSVU1QICh0YWtpbmcgYmFjayB0aGUgVVNBKSIpKSAlPiUgYXJyYW5nZShDcmVhdGVkKSAlPiUgbXV0YXRlKHJlYWNoPWN1bXN1bShNZW1iZXJzLmF0LlBvc3RpbmcpLCBpbmRleD1zZXFfYWxvbmcoTGluay5UZXh0KSkgJT4lIGFycmFuZ2UoTGluay5UZXh0LCBpbmRleCkKCm9kZGJhbGwgPC0gYygiUGFtZWxhIEdlbGxlciIsICJ8IE5lb24gTmV0dGxlIiwgIkNvbnNlcnZhdGl2ZSBQb3N0IiwgIkFuZ2VsIiwgIkRlbm5pcyIsICJMYXJyeSIsICJMZWUiLCAiU2hvdyBBcmNoaXZlcyIsICJCcmlhbiBLb2xmYWdlIiwgIkRpbmEiLCAiRGlubyIsICJMaXNhIiwgIkNob24iLCAiTWVycmlsbCIsICJQYXQiLCAiU2FyYWgiLCAiQmlsbCIsICJEYW5pZWwiLCAiRWxpemFiZXRoIiwgIk1pY2t5IiwgIktpbWJlcmxleSIsICJSb24iLCAiRGFybGVuZSIsICJKZXJyeSIsICJKb2huIiwgIk1hcmsiLCAiRGFuIiwgIkZyYW5rIiwgIkdheWxlIiwgIkdlbmUiLCAiR3JlZ2ciLCAiS2FyZW4iLCAgIkxpbmRhIiwgIk1pY2hlYWxpbmEiLCAiUm94YW5uZSIsICJUaGVyZXNhIiwgIkFsaWNlIiwgIkFsaWNpYSIsICJBc3RyaWQiLCAiQ2F0aHkiLCAiQ2hlciIsICJDbGludCIsICJEYXZpZCIsICJEYW5pZWwiLCAiRGVuaXNlIiwgIkRpYW5lIiwgIkRvbm5hIiwgIkRvdWciLCAiR2FyeSIsICJHZW5uYWR5IiwgIkhlbGVuIiwgIkhvbHRvbiIsICJKYW1lcy1DaHJpc3RpbmEiLCAiSmFuZSIsICJKZW5uaWZlciIsICJKZXJpIiwgIkpld2VsIiwgIkpvc2UiLCAgIkthdGllIiwgIktlbiIsICJLZW5uZXRoIiwgIktldmluIiwgIk1hcmllIiwgIk1hcnkiLCAiTWVsIiwgIk1pY2hhZWwiLCAgIk1vbnR5IiwgIlBhdHJpY2siLCAiUGF0dHkiLCAiUmFscGggV2lsbGlhbSIsICJSYW5keSIsICJTZW5jZXJpYSIsICJTYWxtYW4iLCAiU2hhcm9uIiwgIlN0YWNpZSIsICJTaGFua2FyIiwgIlN0ZXBoZW4iLCAiU3RldmVuIiwgIlN0ZXZlIiwgIlRoZXJlc2EiLCAiVG9tbXkiLCAiVHJlZyIsICJXYWx0ZXIiLCAiV2lsbGlzIikKamJnX2R0IDwtIGpiZ3JvdXBzX2p1bmtfZG9tICU+JSBzZWxlY3QoR3JvdXAuTmFtZSwgQ3JlYXRlZCwgZG9tYWluLCBMaW5rLlRleHQsIE1lbWJlcnMuYXQuUG9zdGluZykgJT4lIGZpbHRlcihkb21haW4gJWluJSBmYWtlbmV3cykgJT4lIGZpbHRlcighTGluay5UZXh0ICVpbiUgb2RkYmFsbCAmICFHcm91cC5OYW1lICVpbiUgYygiV2UgQXJlIFEiLCAiVU5JVEVEIERFTU9DUkFUUywgUkVQVUJMSUNBTlMgJiBMSUJFUlRBUklBTlMgNCBUUlVNUCAodGFraW5nIGJhY2sgdGhlIFVTQSkiKSkgJT4lIGdyb3VwX2J5KExpbmsuVGV4dCwgZG9tYWluKSAlPiUgY291bnQoKSAlPiUgYXJyYW5nZShkZXNjKG4pKQoKI2piZ3JvdXBzX2p1bmtfZG9tICU+JSBzZWxlY3QoR3JvdXAuTmFtZSwgQ3JlYXRlZCwgZG9tYWluLCBMaW5rLlRleHQsIE1lbWJlcnMuYXQuUG9zdGluZykgJT4lIGZpbHRlcihkb21haW4gJWluJSBmYWtlbmV3cykgJT4lIGZpbHRlcighTGluay5UZXh0ICVpbiUgb2RkYmFsbCAmICFHcm91cC5OYW1lICVpbiUgYygiV2UgQXJlIFEiLCAiVU5JVEVEIERFTU9DUkFUUywgUkVQVUJMSUNBTlMgJiBMSUJFUlRBUklBTlMgNCBUUlVNUCAodGFraW5nIGJhY2sgdGhlIFVTQSkiKSkgJT4lIHVuZ3JvdXAoKSAlPiUgc2VsZWN0KGRvbWFpbiwgTGluay5UZXh0KSAlPiUgZGlzdGluY3QoKSAlPiUgZ3JvdXBfYnkoZG9tYWluKSAlPiUgY291bnQoKSAlPiUgYXJyYW5nZShkZXNjKG4pKQoKZGF0YXRhYmxlKGpiZ19kdCwgb3B0aW9ucz1saXN0KG9yZGVyPWxpc3QobGlzdCgzLCAnZGVzYycpKSkpCmBgYAoKT2YgdGhlIDc3IGdyb3VwcyBpbiB0aGUgcHJvLUJpZGVuIEdyb3VwcyBlY29zeXN0ZW0sIGF0IGxlYXN0IG9uZSAianVuayBuZXdzIiBsaW5rIHdhcyBwb3N0ZWQgaW4gMTggb2YgdGhlbS4gTW9zdCBsaW5rcyB3ZXJlIG9ubHkgcG9zdGVkIG9uZSB0aW1lIGluIGEgc2luZ2xlIGdyb3VwLiBJbiBzaXggZ3JvdXBzLCB0d28gImp1bmsgbmV3cyIgbGlua3Mgd2VyZSBmb3VuZC4gVGhlIG91dGxpZXIgaXMgYSBncm91cCBuYW1lZCAiQmlkZW4gZm9yIHByZXNpZGVudCIsIGluIHdoaWNoIDEzIGRpZmZlcmVudCAianVuayBuZXdzIiBsaW5rcyB3ZXJlIGZvdW5kLiAgICAKYGBge3IsIGVjaG89RkFMU0UsIGV2YWw9VFJVRSwgd2FybmluZz1GQUxTRX0KI0JpZ2dlc3QgU2hhcmVycyBvZiAiSnVuayBOZXdzIERvbWFpbnMiIC0gQXJyYW5nZWQgYnkgbnVtYmVyIG9mIHBvc3RzIHNoYXJlZCB0aGVuIGZvbGxvd2VycyAKamJnX2R0X2xlYWRlcnMgPC0gamJncm91cHNfanVua19kb20gJT4lIHNlbGVjdChHcm91cC5OYW1lLCBDcmVhdGVkLCBkb21haW4sIExpbmsuVGV4dCwgTWVtYmVycy5hdC5Qb3N0aW5nKSAlPiUgZmlsdGVyKGRvbWFpbiAlaW4lIGZha2VuZXdzICYgIUxpbmsuVGV4dCAlaW4lIG9kZGJhbGwgJiAhR3JvdXAuTmFtZSAlaW4lIGMoIldlIEFyZSBRIiwgIlVOSVRFRCBERU1PQ1JBVFMsIFJFUFVCTElDQU5TICYgTElCRVJUQVJJQU5TIDQgVFJVTVAgKHRha2luZyBiYWNrIHRoZSBVU0EpIikpICU+JSBncm91cF9ieShHcm91cC5OYW1lKSAlPiUgbXV0YXRlKFBvc3RzPWxlbmd0aChHcm91cC5OYW1lKSwgTWVtYmVycz1tYXgoTWVtYmVycy5hdC5Qb3N0aW5nKSkgJT4lIHNlbGVjdChHcm91cC5OYW1lLCBNZW1iZXJzLCBQb3N0cykgJT4lIGRpc3RpbmN0KCkgJT4lIGFycmFuZ2UoZGVzYyhQb3N0cyksIGRlc2MoTWVtYmVycykpCgpkYXRhdGFibGUoamJnX2R0X2xlYWRlcnMsIG9wdGlvbnM9bGlzdChvcmRlcj1saXN0KGxpc3QoMywgJ2Rlc2MnKSkpKQoKYGBgCgpUaGUgImp1bmsgbmV3cyIgbGlua3MgaW4gdGhlICJCaWRlbiBmb3IgUHJlc2lkZW50IiBncm91cCBmZWF0dXJlIGxpbmtzIHRvICBhbnRpLUJpZGVuLCBhbnRpLURlbW9jcmF0LCBhbnRpLWltbWlncmFudCBhbmQgYW50aS1Jc2xhbSBjb250ZW50LCB3aGljaCBzdWdnZXN0cyB0aGF0IHRoZSAiQmlkZW4gZm9yIHByZXNpZGVudCIgZ3JvdXAgaXMgYWN0dWFsbHkgYW4gYW50aS1CaWRlbiBncm91cC4gCgpgYGB7ciwgaW5jbHVkZT1GQUxTRX0KamJnX2R0X2I0cCA8LSBqYmdyb3Vwc19qdW5rX2RvbSAlPiUgZmlsdGVyKGRvbWFpbiAlaW4lIGZha2VuZXdzICYgR3JvdXAuTmFtZT09IkJpZGVuIGZvciBwcmVzaWRlbnQiICYgIUxpbmsuVGV4dD09IlJhbHBoIFdpbGxpYW0iKSAlPiUgYXJyYW5nZShDcmVhdGVkKSAlPiUgc2VsZWN0KExpbmsuVGV4dCwgTGluaykgCmBgYAoKYGBge3IsIGVjaG89RkFMU0UsIGV2YWw9VFJVRSwgd2FybmluZz1GQUxTRX0KZGF0YXRhYmxlKGpiZ19kdF9iNHAsIG9wdGlvbnM9bGlzdChvcmRlcj1saXN0KGxpc3QoMSwgJ2Rlc2MnKSkpKQoKYGBgCg==