Loan list
This link will let you download the full list of loans for the metro area. This might end up being a little big for your computer, depending on the size of the area. The largest, New York, has 229,000 rows. But it gets smaller very quickly. The fifth-largest, Washington, DC, has about 75,000.
Here is a summary by zip code area, which you can search for names of post offices. There are additional columns giving you a little more feel for the demographics in the downloadable version. There will be some small zip codes that will have really weird answers because the count of USPS businesses is less than the count of the number of loans.
(Note: There are 479 extra business addresses across the U.S. buried somewhere in this data file, out of 12.6 million. I believe it comes from rounding the number of vacancies when allocating tracts to zip codes, but I’m not sure. I decided not to worry about it. It’s a 0.004 percent error.)
Local map
How to read this map:
Each area is a zip code area – it may include some postal Zip Codes that are single buildings or companies located there. It’s shaded by an approximate percentage of businesses that got PPP loans in both rounds, through December 2020. The percentage is based on the estimate of USPS business addresses that were not considered vacant as of December 2019.
The dots show you what the dominant ethnic group of the zip code area is.
Clicking on the area gives you a little more information about it, including median income (when available), the number of loans in each round, and the postal name of the zip code.
Lenders
This section provides some data on the lenders in an area. All of the lenders with at least 50 loans in this area are listed separately, and the rest are grouped into a “999” group.
Here is the portion of loans in this area taken up by lenders by size:
This table provides some metrics for each lender:
- The market share
- The percentage of loans by ethnicity of the zip codes for each lender, versus those in the market as a whole
- The percentage of loans by ethnicity of the zip codes for each lender versus the number of non-vacant business addresses in the market.
How to read it:
For each lender, there is a percentage of the loans for each type of zip code by ethnicity. For example, if “White %” says “35%” for Chase, it means that 35 percent of Chase’s loans in this market were to majority White zip codes. This is reapeated for any type of zip code with at least 5 percent of the market’s loans. They won’t add to 100% because you are not seeing the ones that were under 5% of the market.
Then there are two sets of comparisons for each group: The percent of loans compared with the average for that market, and a comparison to the distribution if it were the same as the underlying businesses from the USPS. In those columns, anything over 1.0 means that the group is over-represented. Anything under 1.0 means that it’s under-represented.
For example, if the number for Chase under “Hispanic / Latino” is 1.1, it means that Chase is 10 percent more likely to have loans in Hispanic / Latino areas than the rest of the market. If it’s .9, it means that Chase is 10 percent less likely to have loans in that area.
Prepared by Sarah Cohen, December 22, 2020
LS0tCmF1dGhvcjogIlNhcmFoIENvaGVuIgpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiCm91dHB1dDogCiAgaHRtbF9kb2N1bWVudDoKICAgIHRoZW1lOiB1bml0ZWQKICAgIGRmX3ByaW50OiBwYWdlZAogICAgY29kZV9kb3dubG9hZDogdHJ1ZQpwYXJhbXM6CiAgbWV0cm86IDMxMDgwLTMxMDg0CiAgY2l0eTogTG9zIEFuZ2VsZXMKICBwcmludGNvZGU6IGZhbHNlCiAgY3N2X2xpbms6ICJodHRwczovL3d3dy5kcm9wYm94LmNvbS9zL215bzF0YmlzbnB4cTgwNS9jYV9sb3NfYW5nZWxlcy5jc3Y/ZGw9MSIKICByb290X25hbWUgOiBjYV9sb3NfYW5nZWxlcwp0aXRsZTogIlBQUCBSZXBvcnQgZm9yIGByIHBhcmFtcyRjaXR5YCIKLS0tCgo8IS0tIFRoZSBiZWdpbm5pbmcgb2YgdGhpcyBSIE1hcmtkb3duIHNldHMgdXAgdGhlIGxpYnJhcmllcyBuZWVkZWQgYWxvbmcgd2l0aCB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIHJlc3Qgb2YgdGhlIHByb2dyYW0uIAogICAgIEkgaGF2ZSBhbHJlYWR5IGNyZWF0ZWQgc2VwYXJhdGUgY3N2cyBvZiBlYWNoIG1ldHJvIGFyZWEsIGJhc2VkIG9uIHRoZSBuYW1lcyBtYXRjaGVkIHVwIHdpdGggdGhlIG1ldHJvIGNvZGVzLiBTbyBvbmNlCiAgICAgSSBrbm93IHdoaWNoIG1ldHJvIGNvZGUgSSB3YW50LCB0aGlzIHdpbGwgcnVuIHRoZSBzdGFuZGFyZCBzdHVmZiBmb3IgdGhhdCBtZXRybyBjb2RlLiAKICAgICAKICAgICBJZGVhbGx5LCBJIHdvdWxkIHNldCB0aGlzIHVwIHNvIHRoYXQgeW91IGNvdWxkIGp1c3QgY3JlYXRlIGluIGFkdmFuY2UgYWxsIG9mIHRoZSBtZXRyb3MsIGJ1dCBJIGp1c3QgZG9uJ3Qga25vdyBob3cgdG8gZG8gdGhhdCByaWdodCBub3cuCiAgICAgSSBrbm93IHRoZXJlJ3MgYSB3YXkgc28gSSBjYW4gZmlndXJlIGl0IG91dCBpZiB3ZSBuZWVkIHRvLgotLT4KCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0KIyMgYmUgY2FyZWZ1bCB3aXRoIHRoZSBjYWNoZSBiZWNhdXNlIGl0IHNvbWV0aW1lcyBnZXRzIG1lc3NlZCB1cC4gCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gcGFyYW1zJHByaW50Y29kZSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgY2FjaGU9RkFMU0UpCgojIGZvciBtYXBzCmxpYnJhcnkobGVhZmxldCkKbGlicmFyeShzZikKbGlicmFyeSh0aWdyaXMpCmxpYnJhcnkobGVhZmxldC5leHRyYXMpCmxpYnJhcnkobGVhZmxldC5wcm92aWRlcnMpCmxpYnJhcnkoY2xhc3NJbnQpCgoKCiMgbm9ybWFsCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGphbml0b3IpCmxpYnJhcnkoc2NhbGVzKQpsaWJyYXJ5KERUKQojIGZvciBjb21wbGV4IHNlYXJjaC1hbmQtcmVwbGFjZSB0byBnZXQgdGl0bGVzIG9mIGhlYWRpbmdzIHJpZ2h0CmxpYnJhcnkoc3RyaW5naSkKCiN0aWdyaXMgY2FuIHRha2UgYSB3aGlsZQpvcHRpb25zKHRpZ3Jpc191c2VfY2FjaGU9VFJVRSwgZHBseXIuc3VtbWFyaXNlLmluZm9ybT1GQUxTRSwgc2NpcGVuPTk5OSkKCiN0aGlzIGhhcyBldmVyeXRoaW5nIGVsc2Ugd2UgbmVlZCwgSSB0aGluay4gCmxvYWQgKCJkYXRhL3pjdGFfbWFzdGVyX21hcC5SZGEiKQoKCmBgYAoKCgojIyBMb2FuIGxpc3QKClRoaXMgbGluayB3aWxsIGxldCB5b3UgW2Rvd25sb2FkIHRoZSBmdWxsIGxpc3Qgb2YgbG9hbnMgZm9yIHRoZSBtZXRybyBhcmVhXShgciBwYXJhbXMkY3N2X2xpbmtgKS4gVGhpcyBtaWdodCBlbmQgdXAgYmVpbmcgYSBsaXR0bGUgYmlnIGZvciB5b3VyIGNvbXB1dGVyLCBkZXBlbmRpbmcgb24gdGhlIHNpemUgb2YgdGhlIGFyZWEuIFRoZSBsYXJnZXN0LCBOZXcgWW9yaywgaGFzIDIyOSwwMDAgcm93cy4gQnV0IGl0IGdldHMgc21hbGxlciB2ZXJ5IHF1aWNrbHkuIFRoZSBmaWZ0aC1sYXJnZXN0LCBXYXNoaW5ndG9uLCBEQywgaGFzIGFib3V0IDc1LDAwMC4gCgoKSGVyZSBpcyBhIHN1bW1hcnkgYnkgemlwIGNvZGUgYXJlYSwgd2hpY2ggeW91IGNhbiBzZWFyY2ggZm9yIG5hbWVzIG9mIHBvc3Qgb2ZmaWNlcy4gVGhlcmUgYXJlIGFkZGl0aW9uYWwgY29sdW1ucyBnaXZpbmcgeW91IGEgbGl0dGxlIG1vcmUgZmVlbCBmb3IgdGhlIGRlbW9ncmFwaGljcyBpbiB0aGUgZG93bmxvYWRhYmxlIHZlcnNpb24uIFRoZXJlIHdpbGwgYmUgc29tZSBzbWFsbCB6aXAgY29kZXMgdGhhdCB3aWxsIGhhdmUgcmVhbGx5IHdlaXJkIGFuc3dlcnMgYmVjYXVzZSB0aGUgY291bnQgb2YgVVNQUyBidXNpbmVzc2VzIGlzIGxlc3MgdGhhbiB0aGUgY291bnQgb2YgdGhlIG51bWJlciBvZiBsb2Fucy4gCgpgYGB7cn0KCnpjdGFfbWFwICU+JQogIGFzLmRhdGEuZnJhbWUoKSAlPiUKICBmaWx0ZXIgKCBtZXRyb19jb2RlID09IHBhcmFtcyRtZXRybykgJT4lCiAgYXJyYW5nZSAoIHpjdGEpICU+JQogIG11dGF0ZSAoYE5hbWVgID0gcGFzdGUoemN0YV9uYW1lLCBzdF9hYmJyZXYsIHNlcD0iLCAiKSwgCiAgICAgICAgICBgJSBidXMgdy8gbG9hbnNgID0gbG9hbnMgLyBidXNfbm92YWNhbnQpICU+JQogIHNlbGVjdCAoIGBaaXAgY29kZWAgPSB6Y3RhLCAKICAgICAgICAgICBgTmFtZWAgLAogICAgICAgICAgIGBFdGhuaWNpdHlgID0gemN0YV9ldGhuaWMsCiAgICAgICAgICAgYExvYW5zYCA9IGxvYW5zLAogICAgICAgICAgIGAlIGJ1cyB3LyBsb2Fuc2AsCiAgICAgICAgICAgYFJvdW5kIDFgID0gbG9hbnNfcjEsIAogICAgICAgICAgIGBSb3VuZCAyYCA9IGxvYW5zX3IyLCAKICAgICAgICAgICBgQW1vdW50YCA9IGxvYW5fYW1vdW50LAogICAgICAgICAgIGBVU1BTIE5vbi12YWNhbnQgYnVzaW5lc3Nlc2AgPSBidXNfbm92YWNhbnQsIAogICAgICAgICAgIGBOb24tdmFjYW50IGFkZHJlc3Nlc2AgPSBhbGxfbm92YWNhbnQsCiAgICAgICAgICAgYENlbnN1cyBidXNpbmVzc2VzYCA9IHpicF9idXMsIAogICAgICAgICAgIGBQb3B1bGF0aW9uYCA9IHRvdF9wb3AsCiAgICAgICAgICAgYEhvdXNlaG9sZHNgID0gaG91c2Vob2xkcywKICAgICAgICAgICBgUGN0IFdoaXRlIG5vbi1IaXNwYW5pYyBjYXRlZ29yeWAgPSB3aGl0ZV9uaF9ncm91cCwgCiAgICAgICAgICAgYFdoaXRlICVgID0gcGN0X3doaXRlX25oLCAKICAgICAgICAgICBgQmxhY2sgJWAgPSBwY3RfYmxhY2tfbmgsIAogICAgICAgICAgIGBIaXNwYW5pYyAvIExhdGlubyAlYCA9IHBjdF9oaXNwYW5pYywKICAgICAgICAgICBgQXNpYW4gJWAgPSBwY3RfYXNpYW5fbmgsIAogICAgICAgICAgIGBOYXRpdmUgQW1lcmljYW4gJWA9IHBjdF9haWFuX25oLCAKICAgICAgICAgICBgTWVkaWFuIGluY29tZWAgPSBtZWRpYW5faW5jXzIwMTgsIAogICAgICAgICAgIGAlIGNvbGxlZ2UgZ3JhZGAgPSBwY3RfY29sbGVnZV9ncmFkLCAKICAgICAgICAgICBgVW5lbXBsb3ltZW50IHJhdGUgYXZnIDIwMTQtMThgID0gdW5lbXBsX3JhdGUpICU+JQogICMgZ2xpbXBzZSgpCiAgIGRhdGF0YWJsZSgKICAgICAgICAgICAgcm93bmFtZXM9RkFMU0UsCiAgICAgICAgICAgIGV4dGVuc2lvbnM9IkJ1dHRvbnMiLCAKICAgICAgICAgICAgb3B0aW9ucyA9IGxpc3QgKAogICAgICAgICAgICAgICBhdXRvV2lkdGggPSBUUlVFLCAKICAgICAgICAgICAgICAgc2Nyb2xsWCA9IFRSVUUsCiAgICAgICAgICAgICAgIHNjcm9sbFkgPSBUUlVFLAogICAgICAgICAgICAgICBjb2x1bW5EZWZzID0gbGlzdCAoIGxpc3QgKCB3aWR0aD0nMTUwcHgnLCB0YXJnZXRzPWMoMSwyLDEzKSkgLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QgKCB2aXNpYmxlPUZBTFNFLCB0YXJnZXRzPWMoOSwgMTE6MTMsIDE4LCAyMDoyMSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAsIAogICAgICAgICAgICAgICBvcmRlciA9IGxpc3QgKGxpc3QgKDAsICJhcyIpICksIAogICAgICAgICAgICAgICAjZG9tID0gImZsQnJ0aXAiLCAKICAgICAgICAgICAgICAgZG9tID0gJzwidG9wIkJpZj5ydDwiYm90dG9tImxwPjwiY2xlYXIiPicsCiAgICAgICAgICAgICAgIGJ1dHRvbnMgPSBjICgiY29weSIsICJjc3YiLCAiZXhjZWwiKQogICAgICAgICAgICApCikgJT4lCiAgZm9ybWF0Um91bmQgKGMoNCwgNiw3LCA5LCAxMCwgMTEsIDEyLCAxMyApLCBkaWdpdHM9MCwgbWFyaz0iLCIgLCBpbnRlcnZhbD0zKSAlPiUKICBmb3JtYXRDdXJyZW5jeSAoIGMoOCwgIDIwKSwgZGlnaXRzPTApICU+JQogIGZvcm1hdFBlcmNlbnRhZ2UoIGMoIDUsIDE1OjE5KSkKCiAgCgoKYGBgCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAooTm90ZTogVGhlcmUgYXJlIDQ3OSBleHRyYSBidXNpbmVzcyBhZGRyZXNzZXMgYWNyb3NzIHRoZSBVLlMuIGJ1cmllZCBzb21ld2hlcmUgaW4gdGhpcyBkYXRhIGZpbGUsIG91dCBvZiAxMi42IG1pbGxpb24uIEkgYmVsaWV2ZSBpdCBjb21lcyBmcm9tIHJvdW5kaW5nIHRoZSBudW1iZXIgb2YgdmFjYW5jaWVzIHdoZW4gYWxsb2NhdGluZyB0cmFjdHMgdG8gemlwIGNvZGVzLCBidXQgSSdtIG5vdCBzdXJlLiBJIGRlY2lkZWQgbm90IHRvIHdvcnJ5IGFib3V0IGl0LiBJdCdzIGEgMC4wMDQgcGVyY2VudCBlcnJvci4pIAoKIyMgTG9jYWwgbWFwCgo8IS0tQWxyZWFkeSBsb2FkZWQgdGhlIG9iamVjdCBmcm9tIHRpZ3JpcyBhbmQgc2YsIHNvIHRoZSB6Y3RhX21hcCBvYmplY3QgaXMgYWxyZWFkeSBhIG11bHRpcG9seWdvbiBzaW1wbGUgZmVhdHVyZS4tLT4KCgo8IS0tIFN0ZXAgMjogUHVsbCBvdXQganVzdCB0aGUgbWV0cm8gYXJlYSB5b3Ugd2FudCByaWdodCBub3cgLS0gdGhhdCdzIHdpbGwgYmUgYSBmdW5jdGlvbiBvZiB0aGUgbWV0cm8gYXJlYXMgZnJvbSB0aGUgbGlzdCBpbiB0aGUgcHJldmlvdXMgc3RlcC4gCkFmdGVyIHRoaXMsIHdlJ2xsIGhhdmUgdGhlIGBhcHByb3hfY2VudGVyYCBvZiB0aGUgbWFwLCB0aGUgYHNwYW5fYm91bmRzYCBvZiB0aGUgbWFwLCBhbmQgdGhlIGBicmVha3NgIGJhc2VkIG9uIEplbmtzIHJvdW5kZWQgZG93biB0byB0aGUgbmVhcmVzdCA1ICUuICBXZSBjYW4gYWxzbyBzZXQgdGhlIHBhbGV0dGUgbm93IHRoYXQgd2Uga25vdyB0aGUgYnJlYWtzLiBJdCBzZXRzIHRoZSBwYWxldHRlcyBhcyBgZGlzY3JldGVfcGFsYCB1c2luZyBhbGwgbGV2ZWxzIG9mIHRoZSBldGhuaWNpdHkgZnJvbSB0aGUgbmF0aW9uYWwgZmlsZTsgYW5kIGBibHVlX3BhbGAgYXMgYmlubmVkIGZyb20gdGhlIGplbmtzIGJyZWFrcy4gIEl0IGFsc28gY3JlYXRlcyBhIHBvaW50IGxheWVyIGZvciB0aGUgbWV0cm8gYXJlYS4gCi0tPgoKCmBgYHtyIGdldF9tZXRyb19iYXNlLCB3YXJuaW5nPUZBTFNFfQoKbWV0cm9fbWFwX2Jhc2UgPC0gZmlsdGVyICggemN0YV9tYXAsIG1ldHJvX2NvZGUgPT0gcGFyYW1zJG1ldHJvKSAgJT4lCiAgbXV0YXRlICggcGN0X2xvYW4gPSByb3VuZCAoIHBtaW4gKCBsb2FucyAvIGJ1c19ub3ZhY2FudCAsIDEpICwgMyApICkKCm1ldHJvX21hcF9wdCA8LSAgc3RfY2VudHJvaWQgKCBtZXRyb19tYXBfYmFzZSkgCgoKIyBub3cgZ2V0IHR3byBtZWFzdXJlczogVGhlIGJvdW5kaW5nIGJveCBvZiB0aGUgbWFwIGFuZCB0aGUgamVua3MgYnJlYWtzCmJveCA8LSBzdF9iYm94IChtZXRyb19tYXBfYmFzZSkKYXBwcm94X2NlbnRlciA8LQogICBjICggbWVhbiAoYyhib3hbMV0sIGJveFszXSkpLCAKICAgICAgICAgbWVhbihjKGJveFsyXSwgYm94WzRdKSkpCgojIHB1dHRpbmcgYSBwcmV0dHkgYmlnIHJhbmdlIGFyb3VuZCB0aGlzIC0tIHdvbid0IGVuZCB1cCBvdXQgaW4gQXNpYSwgYnV0IG1pZ2h0IGhhdmUgdG8gcGFuIGEgbGl0dGxlISAKc3Bhbl9ib3VuZHMgPSB1bm5hbWUoIGMgKGJveFsneG1pbiddLTEsIGJveFsneW1pbiddLTEsIGJveFsneG1heCddKzEsIGJveFsneW1heCddKzEpKQoKIyBqZW5rcyBicmVha3MgLSByb3VuZCB0byA1IGdyb3Vwcz8gCmplbmtzIDwtIGNsYXNzSW50OjpjbGFzc0ludGVydmFscyhtZXRyb19tYXBfYmFzZSRwY3RfbG9hbiwgbj01LCBzdHlsZT0iamVua3MiKSRicmtzCiMgKCBmbG9vciAoLjc1IC8gLjA1KSAqIC4wNSkgbm8gaWRlYSB3aHkgdGhpcyB3b3JrcyBidXQgaXQgZG9lcwpicmVha3MgPC0gKCBjZWlsaW5nIChqZW5rcy8gLjA1KSAqIC4wNSkKI2Jya3MgPC0gYyggMCwgLjI1LCAuNCwgLjU1LCAuOCwgMSkKCgpibHVlX3BhbCA8LSBjb2xvckJpbiAocGFsZXR0ZT0iQmx1ZXMiLCAKICAgICAgICAgICAgICAgICAgICAgZG9tYWluID0gbWV0cm9fbWFwX2Jhc2UkcGN0X2xvYW4sIAogICAgICAgICAgICAgICAgICAgICBicmVha3MsCiAgICAgICAgICAgICAgICAgICAgIG5hLmNvbG9yID0gIndoaXRlIikKCiNzZXQgdGhlIGNvbG9ycyBmb3IgdGhlIGNpcmNsZXMgYmFzZWQgb24gdGhlIGxhcmdlciBkYXRhc2V0IHNvIHRoZXkncmUgYWx3YXlzIHRoZSBzYW1lLiAKCmRpc2NyZXRlX3BhbCA8LSBjb2xvckZhY3RvcihwYWxldHRlPSJEYXJrMiIsIGRvbWFpbiA9IHpjdGFfbWFwJHpjdGFfZXRobmljKQoKYGBgCgoKPCEtLU5vdyBjcmVhdGUgdGhlIG1hcC4gLS0+CgpIb3cgdG8gcmVhZCB0aGlzIG1hcDogCgpFYWNoIGFyZWEgaXMgYSB6aXAgY29kZSBhcmVhIC0tIGl0IG1heSBpbmNsdWRlIHNvbWUgcG9zdGFsIFppcCBDb2RlcyB0aGF0IGFyZSBzaW5nbGUgYnVpbGRpbmdzIG9yIGNvbXBhbmllcyBsb2NhdGVkIHRoZXJlLiBJdCdzIHNoYWRlZCBieSBhbiBhcHByb3hpbWF0ZSBwZXJjZW50YWdlIG9mIGJ1c2luZXNzZXMgdGhhdCBnb3QgUFBQIGxvYW5zIGluIGJvdGggcm91bmRzLCB0aHJvdWdoIERlY2VtYmVyIDIwMjAuICBUaGUgcGVyY2VudGFnZSBpcyBiYXNlZCBvbiB0aGUgZXN0aW1hdGUgb2YgVVNQUyBidXNpbmVzcyBhZGRyZXNzZXMgdGhhdCB3ZXJlIG5vdCBjb25zaWRlcmVkIHZhY2FudCBhcyBvZiBEZWNlbWJlciAyMDE5LiAKClRoZSBkb3RzIHNob3cgeW91IHdoYXQgdGhlIGRvbWluYW50IGV0aG5pYyBncm91cCBvZiB0aGUgemlwIGNvZGUgYXJlYSBpcy4gCgpDbGlja2luZyBvbiB0aGUgYXJlYSBnaXZlcyB5b3UgYSBsaXR0bGUgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBpdCwgaW5jbHVkaW5nIG1lZGlhbiBpbmNvbWUgKHdoZW4gYXZhaWxhYmxlKSwgdGhlIG51bWJlciBvZiBsb2FucyBpbiBlYWNoIHJvdW5kLCBhbmQgdGhlIHBvc3RhbCBuYW1lIG9mIHRoZSB6aXAgY29kZS4gCgoKYGBge3IgbGVhZmxldF9tYXB9CgptIDwtIGxlYWZsZXQgKCBtZXRyb19tYXBfYmFzZSkgJT4lCiAgICAgYWRkUHJvdmlkZXJUaWxlcyhwcm92aWRlcnMkRXNyaS5Xb3JsZFN0cmVldE1hcCwgCiAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zID0gcHJvdmlkZXJUaWxlT3B0aW9ucyggbWluWm9vbSA9IDcpKSAgJT4lCiAgICAgc2V0VmlldyggYXBwcm94X2NlbnRlclsxXSwgYXBwcm94X2NlbnRlclsyXSwgIHpvb209MTApICU+JQogICAgIHNldE1heEJvdW5kcyAoc3Bhbl9ib3VuZHNbMV0sIHNwYW5fYm91bmRzWzJdLCBzcGFuX2JvdW5kc1szXSwgc3Bhbl9ib3VuZHNbNF0gKSU+JQogICAgIGFkZFBvbHlnb25zICggZmlsbENvbG9yID0gfmJsdWVfcGFsKCBwY3RfbG9hbiksCiAgICAgICAgICAgICAgICAgICAjY29sPSIjNzgyMDBFIiwgCiAgICAgICAgICAgICAgICAgICBzdHJva2UgPTEsIAogICAgICAgICAgICAgICAgICAgd2VpZ2h0PS4zLCAKICAgICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5ID0gLjcgLCAKICAgICAgICAgICAgICAgICAgcG9wdXAgPSB+IHBhc3RlMCAoICJaaXAgQ29kZSAiLCB6Y3RhICwgIiwgIiwgemN0YV9uYW1lLCAiLCAgIiwgY291bnR5X25hbWUsICI8YnI+IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJaaXAgY29kZSBldGhuaWNpdHk6ICIgLCAgemN0YV9ldGhuaWMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPiIsICIlIG9mIG5vbi12YWNhbnQgVVNQUyBidXNpbmVzc2VzIHdpdGggbG9hbnM6ICIgLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyY2VudCggcGN0X2xvYW4sIGFjY3VyYWN5PS4xKSAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPiIsICJMb2FucyA6IFJvdW5kIDEtICAiLCBsb2Fuc19yMSwgIiwgUm91bmQgMiAtICIsICBsb2Fuc19yMiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+IE1lZGlhbiBJbmNvbWUgIiAsIGRvbGxhciggbWVkaWFuX2luY18yMDE4KSkpICU+JQogICAgIGFkZENpcmNsZU1hcmtlcnMgKCBkYXRhPSBtZXRyb19tYXBfcHQsIAogICAgICAgICAgICAgICAgICAgICAgICByYWRpdXMgPSA0LCAKICAgICAgICAgICAgICAgICAgICAgICAgI3JhZGl1cyA9IH5zcXJ0KCBsb2FucyAvIDQwKSAsIAogICAgICAgICAgICAgICAgICAgICAgICBjb2xvcj0gfmRpc2NyZXRlX3BhbCAoemN0YV9ldGhuaWMpLCBzdHJva2U9RkFMU0UgLCBmaWxsT3BhY2l0eSA9IC44LCAKICAgICAgICAgICAgICAgICAgICAgZ3JvdXAgPSAiY2lyY2xlcyIpICU+JSAgIAogIGFkZFJlc2V0TWFwQnV0dG9uKCkgJT4lCiAgYWRkTGVnZW5kICgidG9wcmlnaHQiLCBwYWw9ZGlzY3JldGVfcGFsLCB2YWx1ZXMgPSB+emN0YV9ldGhuaWMsIGdyb3VwPSJjaXJjbGVzIiwgdGl0bGU9IkV0aG5pY2l0eSIpICU+JSAKICBhZGRMZWdlbmQgKCJib3R0b21sZWZ0IiwgcGFsPWJsdWVfcGFsLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gfnBjdF9sb2FuLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiRm9ybWF0ID0gbGFiZWxGb3JtYXQgKHN1ZmZpeD0iJSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtID0gZnVuY3Rpb24gKHgpIHsxMDAqeH0pICwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlID0gIiUgb2YgVVNQUyBhY3RpdmUgYnVzLiIpCiAgCm0KCmBgYAoKPCEtLSBjbGVhbiB1cCBlbnZpcm9ubWVudCBzbyBpdCdzIG5vdCBjb25mdXNpbmcgbGF0ZXIgLS0+CgpgYGB7cn0KCnJtIChsaXN0ID0gYygnbScsJ3pjdGFfbWFwJywgJ21ldHJvX21hcF9wdCcsICdhcHByb3hfY2VudGVyJywgJ2JveCcsICdicmVha3MnLCAnamVua3MnLCAnc3Bhbl9ib3VuZHMnLCAnYmx1ZV9wYWwnLCAnZGlzY3JldGVfcGFsJykgKSAKCmBgYAoKCiMjIExlbmRlcnMKCjwhLS0gdGhpcyByZWFkcyBpbiB0aGUgY3N2IGZpbGUgZnJvbSB0aGUgc2F2ZWQgb25lcywgd2hpY2ggaXMgbXVjaCBmYXN0ZXIgdGhhbiBsb2FkaW5nIGFsbCBvZiB0aGUgbG9hbnMgZnJvbSB0aGUgb3JpZ2luYWwuIE5lZWQgdG8gZml4IHRoZSB0cmVhdG1lbnQgb2YgemlwIGNvZGVzIGFuZCBuYWljcyBpbnRvIGNoYXJhY3Rlci4tLT4KClRoaXMgc2VjdGlvbiBwcm92aWRlcyBzb21lIGRhdGEgb24gdGhlIGxlbmRlcnMgaW4gYW4gYXJlYS4gQWxsIG9mIHRoZSBsZW5kZXJzIHdpdGggYXQgbGVhc3QgNTAgbG9hbnMgaW4gdGhpcyBhcmVhIGFyZSBsaXN0ZWQgc2VwYXJhdGVseSwgYW5kIHRoZSByZXN0IGFyZSBncm91cGVkIGludG8gYSAiOTk5IiBncm91cC4gIAoKPCEtLQpOb3cgSSBoYXZlIHRvIGF1dG9tYXRlIGdldHRpbmcgdGhlIGxlbmRlcnMgaW50byBhIHRhYmxlIHdpdGggYW4gZXhwb3J0IHRvIEV4Y2VsIGJ1dHRvbi4gSW5zdGVhZCBvZiBjYWxjdWxhdGluZyBtYXJrZXQgc2hhcmUsIHdoaWNoIGlzIGEgcmVhbGx5IHNtYWxsIG51bWJlciBmb3IgZWFjaCBsZW5kZXIsIEknbSBjb21wYXJpbmcgdGhlIHBlcmNlbnQgb2YgbG9hbnMgZnJvbSB0aGUgbGVuZGVyIGJ5IGdyb3VwIHRvIHRoZSBwZXJjZW50IGluIHRoZSByZWdpb24uIFRoYXQgY29tZXMgb3V0IHRvIHRoZSBzYW1lIGRpZmZlcmVuY2UgaW4gbWFya2V0IHNoYXJlLCBidXQgaXQncyBhIGxpdHRsZSBlYXNpZXIgdG8gcmVhZC4gCgpGb3IgZWFjaCBtZXRybyBhcmVhLCBJJ20gc2VsZWN0aW5nIGFueSBsZW5kZXIgd2l0aCBhdCBsZWFzdCAxMDAgbG9hbnMuIFRoZXJlIGFyZW4ndCB0aGF0IG1hbnkgb2YgdGhlbSwgYW5kIHRoZXkgdXN1YWxseSBtYWtlIHVwIGFib3V0IDk1IHBlcmNlbnQgb2YgdGhlIGxvYW5zIGluIHRoZSBhcmVhLiBFdmVyeXRoaW5nIGVsc2UgaXMgYmVpbmcgcHV0IGludG8gYW4gImV2ZXJ5b25lIGVsc2UiIGNhdGVnb3J5LiAKCkl0IHdvdWxkIGJlIGdyZWF0IHRvIGJlIGFibGUgdG8gZ2VuZXJhdGUgdGhpcyBvdXRwdXQgYXMgSFRNTCBXaWRnZXQgdG8gc2F2ZSByYXRoZXIgdGhhbiBoYXZlIHRvIHJlZG8gaXQgZm9yIGVhY2ggc2luY2UgdGhlIGxvYW4gZGF0YSB0YWtlcyBzbyBsb25nIHRvIHJlYWQgaW4uIChCZXR0ZXIgdG8gYWRkIHRoZSB3aWRnZXQgdG8gYW4gZXhpc3Rpbmcgcm1kIHRoYW4gdG8gZG8gaXQgYXMgaXRzIG93biBybWFya2Rvd24uKQotLT4KCkhlcmUgaXMgdGhlIHBvcnRpb24gb2YgbG9hbnMgaW4gdGhpcyBhcmVhIHRha2VuIHVwIGJ5IGxlbmRlcnMgYnkgc2l6ZTogCgoKPCEtLSBTb21ldGhpbmcgSSBoYXZlIHRvIGRvOiBzZXQgdXAgYSBrZXkgZm9yIHRoZSBldGhuaWNpdGllcyBzbyB0aGF0IHRoZXkgY3JlYXRlIGdvb2QgdmFyaWFibGUgbmFtZXMgbGF0ZXIgb24gLS0+CgpgYGB7cn0KCmV0aG5pY19rZXkgPC0gYyggIjAwIC0gTm8gcGVvcGxlIiAgPSAiTm8gcGVvcGxlIiwgCiAgICAgICAgICAgICAgICAgIjAxIC0gTWFqb3JpdHkgd2hpdGUiID0gIldoaXRlIiwgCiAgICAgICAgICAgICAgICAgIjAyIC0gTm8gZGlzdGluY3QgbWlub3JpdHkiID0iTm8gZGlzdGluY3QgbWlub3JpdHkiLCAKICAgICAgICAgICAgICAgICAiMDMgLSBCbGFjayIgPSAiQmxhY2siLCAKICAgICAgICAgICAgICAgICAiMDQgLSBIaXNwYW5pYyIgPSAiSGlzcGFuaWMgLyBMYXRpbm8iLAogICAgICAgICAgICAgICAgICIwNSAtIEFzaWFuIiA9ICJBc2lhbiIgLAogICAgICAgICAgICAgICAgICIwNiAtIE5hdGl2ZSBBbWVyaWNhbiIgPSAiTmF0aXZlIEFtZXJpY2FuIikKCgoKYGBgCgoKCgoKYGBge3IgcGlja19sZW5kZXJzfQoKYXJlYV9sb2FucyA8LSByZWFkX2NzdihwYXN0ZTAoImRhdGEvbWV0cm9fY3N2cy8iLCBwYXJhbXMkcm9vdF9uYW1lLCAiLmNzdiIpLCAKICAgICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZXM9IGNvbHMgKC5kZWZhdWx0PSBjb2xfZ3Vlc3MoKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpjdGEgPSAiYyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aXAgPSAiYyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYWljc19jb2RlID0gImMiKSkKCgoKbGVuZGVyX3JhbmtzIDwtIAogIGFyZWFfbG9hbnMgJT4lCiAgZ3JvdXBfYnkgKGxlbmRlcikgJT4lCiAgc3VtbWFyaXNlICggbGVuZGVyX2xvYW5zID0gbigpKSAlPiUKICBtdXRhdGUgKCByYW5rID0gbWluX3JhbmsgKCAtbGVuZGVyX2xvYW5zKSwgCiAgICAgICAgICAgbGVuZGVyX2dyb3VwID0gaWZfZWxzZSAoIGxlbmRlcl9sb2FucyA+PSA1MCwgcmFuaywgYXMuaW50ZWdlcig5OTkpKSwgCiAgICAgICAgICAgbGVuZGVyX2lkID0gb3JkZXJlZCggcGFzdGUoIHNwcmludGYgKCIlMDNkIiwgbGVuZGVyX2dyb3VwKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZfZWxzZSAobGVuZGVyX2dyb3VwID09IDk5OSwgIlNtYWxsIGxlbmRlcnMiLCBsZW5kZXIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcD0iIC0gIikpKQoKCgpsZW5kZXJfcmFua3MgJT4lICAKICBhcnJhbmdlICgtbGVuZGVyX2xvYW5zKSAlPiUKICBncm91cF9ieSAoYmluID0gY3V0IChsZW5kZXJfbG9hbnMsIGJyZWFrcz1jICgwLCA1MCwgMTAwLCA1MDAsIEluZiksIGluY2x1ZGUubG93ZXN0PUZBTFNFLCByaWdodD1GQUxTRSwgbGFiZWxzPWMoIjAtNDkiLCAiNTAtOTkiLCAiMTAwLTQ5OSIsICI1MDAgJiB1cCIpICkpICU+JQogIHN1bW1hcmlzZSAgKCIjIG9mIGxlbmRlcnMiID0gbigpLCB0b3RhbCA9IHN1bShsZW5kZXJfbG9hbnMpKSAgJT4lCiAgYXJyYW5nZSAoIC1hcy5udW1lcmljKGJpbikpICU+JQogIG11dGF0ZSAoIkN1bXVsYXRpdmUgJSIgPSBjdW1zdW0odG90YWwpL3N1bSh0b3RhbCkpICU+JQogIHJlbmFtZSAoIlJhbmdlIiA9IGJpbiwgIiMgb2YgbG9hbnMiID0gdG90YWwpICU+JQogIGRhdGF0YWJsZSAoIG9wdGlvbnMgPSBsaXN0KGRvbT0idCIsIHdpZHRoPSI4MCUiLCBvcmRlcmluZz1GQUxTRSksIAogICAgICAgICAgICAgIHJvd25hbWVzID0gRkFMU0UsIAogICAgICAgICAgICAgIHdpZHRoPSI1MCUiKSAlPiUKICBmb3JtYXRSb3VuZCAoYygyKSwgZGlnaXRzPTIsIGludGVydmFsPTMsIG1hcms9IiwiKSAlPiUKICBmb3JtYXRQZXJjZW50YWdlKCBjKDMsNCksIGRpZ2l0cz0xKSAKCmBgYAoKVGhpcyB0YWJsZSBwcm92aWRlcyBzb21lIG1ldHJpY3MgZm9yIGVhY2ggbGVuZGVyOiAKCiogVGhlIG1hcmtldCBzaGFyZSAKKiBUaGUgcGVyY2VudGFnZSBvZiBsb2FucyBieSBldGhuaWNpdHkgb2YgdGhlIHppcCBjb2RlcyBmb3IgZWFjaCBsZW5kZXIsIHZlcnN1cyB0aG9zZSBpbiB0aGUgbWFya2V0IGFzIGEgd2hvbGUKKiBUaGUgcGVyY2VudGFnZSBvZiBsb2FucyBieSBldGhuaWNpdHkgb2YgdGhlIHppcCBjb2RlcyBmb3IgZWFjaCBsZW5kZXIgdmVyc3VzIHRoZSBudW1iZXIgb2Ygbm9uLXZhY2FudCBidXNpbmVzcyBhZGRyZXNzZXMgaW4gdGhlIG1hcmtldC4gCgoKCmBgYHtyIGxlbmRlcl9jb21wYXJpc29uc30KIyBzZXQgdXAgc29tZSBtb3JlIHByaW50LWZyaWVuZGx5IGNvbHVtbiBoZWFkaW5ncyAKZXRobmljX2tleSA8LSBjKCAiMDAgLSBObyBwZW9wbGUiICA9ICJObyBwZW9wbGUiLCAKICAgICAgICAgICAgICAgICAiMDEgLSBNYWpvcml0eSB3aGl0ZSIgPSAiV2hpdGUiLCAKICAgICAgICAgICAgICAgICAiMDIgLSBObyBkaXN0aW5jdCBtaW5vcml0eSIgPSJObyBkaXN0aW5jdCBtaW5vcml0eSIsIAogICAgICAgICAgICAgICAgICIwMyAtIEJsYWNrIiA9ICJCbGFjayIsIAogICAgICAgICAgICAgICAgICIwNCAtIEhpc3BhbmljIiA9ICJIaXNwYW5pYyAvIExhdGlubyIsCiAgICAgICAgICAgICAgICAgIjA1IC0gQXNpYW4iID0gIkFzaWFuIiAsCiAgICAgICAgICAgICAgICAgIjA2IC0gTmF0aXZlIEFtZXJpY2FuIiA9ICJOYXRpdmUgQW1lcmljYW4iKQoKdmFybmFtZV9sb29rdXAgPC0gYygibGVuZGVyX2V0aG5pYyIgPSAiJSAiLCAgImxlbmRlcl9ta3RfcmVsIiA9ICJ2cy4gbWFya2V0IiwgImxlbmRlcl9idXNfcmVsIiA9ICJ2cy4gVVNQUyBidXNpbmVzc2VzIikKCgphcmVhX3RvdGFscyA8LSAKICBtZXRyb19tYXBfYmFzZSAlPiUKICBhcy5kYXRhLmZyYW1lKCkgJT4lCiAgZ3JvdXBfYnkgKHpjdGFfZXRobmljKSAlPiUKICBzdW1tYXJpc2UgKGFyZWFfbG9hbnMgPSBzdW0gKGxvYW5zKSwgCiAgICAgICAgICAgICBhcmVhX2J1c2luZXNzZXMgPSBzdW0oYnVzX25vdmFjYW50KSkgJT4lCiAgbXV0YXRlICggc3VtX2FyZWFfbG9hbnMgPSBzdW0oYXJlYV9sb2FucyksIAogICAgICAgICAgIHN1bV9hcmVhX2J1c2luZXNzZXMgPSBzdW0oYXJlYV9idXNpbmVzc2VzKSkKCiMganVzdCBjaGVjayB0byBtYWtlIHN1cmUgdGhpcyBpcyB0aGUgc2FtZSBhcyB0aGUgbG9hbnMgd2UganVzdCBwaWNrZWQgdXAuIAojIHN1bShhcmVhX3RvdGFscyRhcmVhX2xvYW5zLCBuYS5ybT1UUlVFKSA9PSBucm93KCBhcmVhX2xvYW5zKQoKI2Rvbid0IHVzZSBsZW5kZXJfbG9hbnMgZnJvbSB0aGUgcmFua3MgZGF0YSAtLSBpdCB3aWxsIGNoYW5nZW4gbm93IHRoYXQgd2UgaGF2ZSB0aGUgOTk5J3MgY29tYmluZWQuCgpsZW5kZXJfdG90YWxzIDwtIAogIGFyZWFfbG9hbnMgJT4lCiAgaW5uZXJfam9pbiAoc2VsZWN0IChsZW5kZXJfcmFua3MsIGxlbmRlciwgbGVuZGVyX2lkKSAsIGJ5PWMoImxlbmRlciI9ImxlbmRlciIpKSAlPiUKICBncm91cF9ieSAobGVuZGVyX2lkLCB6Y3RhX2V0aG5pYykgJT4lIAogIHN1bW1hcmlzZSAoIGxlbmRlcl9sb2FucyA9IG4oKSAsIC5ncm91cHM9ImRyb3BfbGFzdCIpICU+JSAKICBtdXRhdGUgKCBzdW1fbGVuZGVyX2xvYW5zID0gc3VtKGxlbmRlcl9sb2FucykpCgpsZW5kZXJfcmF3X2NvdW50cyA8LSAKICAgYXJlYV90b3RhbHMgJT4lCiAgIGxlZnRfam9pbiAoIGxlbmRlcl90b3RhbHMgLCBieT1jKCJ6Y3RhX2V0aG5pYyIgPSAiemN0YV9ldGhuaWMiKSkgJT4lCiAgIHVuZ3JvdXAoKSAlPiUKICAgYXJyYW5nZSAobGVuZGVyX2lkLCB6Y3RhX2V0aG5pYykgJT4lCiAgIG11dGF0ZSAoIG1rdF9zaGFyZSA9IHN1bV9sZW5kZXJfbG9hbnMvIHN1bV9hcmVhX2xvYW5zICwgCiAgICAgICAgICAgIGxlbmRlcl9ldGhuaWMgPSBsZW5kZXJfbG9hbnMgLyBzdW1fbGVuZGVyX2xvYW5zLCAKICAgICAgICAgICAgbWt0X2V0aG5pYyA9IGFyZWFfbG9hbnMgLyBzdW1fYXJlYV9sb2FucywgCiAgICAgICAgICAgIGJ1c19ldGhuaWMgPSBhcmVhX2J1c2luZXNzZXMgLyBzdW1fYXJlYV9idXNpbmVzc2VzLCAKICAgICAgICAgICAgbGVuZGVyX21rdF9yZWwgPSBsZW5kZXJfZXRobmljIC8gbWt0X2V0aG5pYywgCiAgICAgICAgICAgIGxlbmRlcl9idXNfcmVsID0gbGVuZGVyX2V0aG5pYyAvIGJ1c19ldGhuaWMsIAogICAgICAgICAgICAjIHRoaXMgcmVuYW1lcyB0aGUgZXRobmljaXRpZXMgc28gdGhhdCB3aGVuIHdlIGZsaXAgdGhlIGRhdGEgZnJhbWUgaXQgd2lsbCAKICAgICAgICAgICAgZXRobmljID0gcmVjb2RlIChvcmRlcmVkKHpjdGFfZXRobmljKSwgISEhYXMubGlzdChldGhuaWNfa2V5ICkpIAogICApCiAgICAgICAgICAgIAoKbnVtX2V0aG5pY19ncm91cHMgPC0gbGVuZGVyX3Jhd19jb3VudHMgJT4lIGZpbHRlciggbWt0X2V0aG5pYyA+PSAuMDUpICU+JSBkaXN0aW5jdCggemN0YV9ldGhuaWMpICU+JSBzdW1tYXJpc2UobigpKSAlPiUgYXMubnVtZXJpYygpCiAgICAgICAgICAgIAojIyBGbGlwIHRoaXMgYW5kIGtlZXAgdGhlIHRoaW5ncyB3ZSBjYXJlIGFib3V0IAojIyBUaGlzIGlzIHRoZSBvbmx5IHdheSBJIGtub3cgaG93IHRvIG1ha2UgdGhlIG5hbWVzIHdvcmsgb3V0IGNvcnJlY3RseTogCnBpdm90ZWRfbG9hbnMgPC0gCiAgbGVuZGVyX3Jhd19jb3VudHMgJT4lCiAgZmlsdGVyIChta3RfZXRobmljID49IC4wNSkgJT4lCiAgc2VsZWN0ICggbGVuZGVyX2lkLCB6Y3RhX2V0aG5pYywgc3VtX2xlbmRlcl9sb2FucywgCiAgICAgICAgICAgbWt0X3NoYXJlICwgbGVuZGVyX2V0aG5pYywgbGVuZGVyX21rdF9yZWwsIAogICAgICAgICAgIGxlbmRlcl9idXNfcmVsKSAlPiUKICBwaXZvdF9sb25nZXIgKGNvbHMgID0gYyhsZW5kZXJfZXRobmljOiBsZW5kZXJfYnVzX3JlbCkgLCBuYW1lc190byA9ICJ2bmFtZSIsIHZhbHVlc190bz0gInBjdHMiKSAlPiUKICBtdXRhdGUgKHZuYW1lMiA9IHN0cmlfcmVwbGFjZV9hbGxfZml4ZWQodm5hbWUsIG5hbWVzKHZhcm5hbWVfbG9va3VwKSwgdW5uYW1lKHZhcm5hbWVfbG9va3VwKSwgdmVjdG9yaXNlX2FsbCA9IEZBTFNFICksIAogICAgICAgICAgZXRobmljID0gc3RyaV9yZXBsYWNlX2FsbF9maXhlZCggemN0YV9ldGhuaWMsIG5hbWVzKGV0aG5pY19rZXkpLCB1bm5hbWUoZXRobmljX2tleSksIHZlY3RvcmlzZV9hbGw9RkFMU0UpLCAKICAgICAgICAgIG5ld192bmFtZSA9IHBhc3RlKGV0aG5pYywgdm5hbWUyLCBzZXA9IiAiKQopICU+JQogIHNlbGVjdCAoLXZuYW1lMiwgLWV0aG5pYykgJT4lCiAgcGl2b3Rfd2lkZXIgKCBpZF9jb2xzPWMobGVuZGVyX2lkLCBta3Rfc2hhcmUsIHN1bV9sZW5kZXJfbG9hbnMpLCB2YWx1ZXNfZnJvbT1wY3RzLCBuYW1lc19mcm9tPW5ld192bmFtZSwgdmFsdWVzX2ZpbGw9MCApICU+JQogIHNlbGVjdCAoTGVuZGVyID0gbGVuZGVyX2lkLCAiTG9hbnMiID0gc3VtX2xlbmRlcl9sb2FucyAsIGBNYXJrZXQgc2hhcmVgPW1rdF9zaGFyZSwgZW5kc193aXRoKCIlICIpLCBlbmRzX3dpdGgoInZzLiBtYXJrZXQiKSwgZW5kc193aXRoKCJ2cy4gVVNQUyBidXNpbmVzc2VzIikpIAoKIApgYGAKCkhvdyB0byByZWFkIGl0OiAKCkZvciBlYWNoIGxlbmRlciwgdGhlcmUgaXMgYSBwZXJjZW50YWdlIG9mIHRoZSBsb2FucyBmb3IgZWFjaCB0eXBlIG9mIHppcCBjb2RlIGJ5IGV0aG5pY2l0eS4gRm9yIGV4YW1wbGUsIGlmICJXaGl0ZSAlIiBzYXlzICIzNSUiIGZvciBDaGFzZSwgaXQgbWVhbnMgdGhhdCAzNSBwZXJjZW50IG9mIENoYXNlJ3MgbG9hbnMgaW4gdGhpcyBtYXJrZXQgd2VyZSB0byBtYWpvcml0eSBXaGl0ZSB6aXAgY29kZXMuIFRoaXMgaXMgcmVhcGVhdGVkIGZvciBhbnkgdHlwZSBvZiB6aXAgY29kZSB3aXRoIGF0IGxlYXN0IDUgcGVyY2VudCBvZiB0aGUgbWFya2V0J3MgbG9hbnMuIFRoZXkgd29uJ3QgYWRkIHRvIDEwMCUgYmVjYXVzZSB5b3UgYXJlIG5vdCBzZWVpbmcgdGhlIG9uZXMgdGhhdCB3ZXJlIHVuZGVyIDUlIG9mIHRoZSBtYXJrZXQuCgpUaGVuIHRoZXJlIGFyZSB0d28gc2V0cyBvZiBjb21wYXJpc29ucyBmb3IgZWFjaCBncm91cDogVGhlIHBlcmNlbnQgb2YgbG9hbnMgY29tcGFyZWQgd2l0aCB0aGUgYXZlcmFnZSBmb3IgdGhhdCBtYXJrZXQsIGFuZCBhIGNvbXBhcmlzb24gdG8gdGhlIGRpc3RyaWJ1dGlvbiBpZiBpdCB3ZXJlIHRoZSBzYW1lIGFzIHRoZSB1bmRlcmx5aW5nIGJ1c2luZXNzZXMgZnJvbSB0aGUgVVNQUy4gSW4gdGhvc2UgY29sdW1ucywgYW55dGhpbmcgb3ZlciAxLjAgbWVhbnMgdGhhdCB0aGUgZ3JvdXAgaXMgb3Zlci1yZXByZXNlbnRlZC4gQW55dGhpbmcgdW5kZXIgMS4wIG1lYW5zIHRoYXQgaXQncyB1bmRlci1yZXByZXNlbnRlZC4gCgpGb3IgZXhhbXBsZSwgaWYgdGhlIG51bWJlciBmb3IgQ2hhc2UgdW5kZXIgIkhpc3BhbmljIC8gTGF0aW5vIiBpcyAxLjEsIGl0IG1lYW5zIHRoYXQgQ2hhc2UgaXMgMTAgcGVyY2VudCBtb3JlIGxpa2VseSB0byBoYXZlIGxvYW5zIGluIEhpc3BhbmljIC8gTGF0aW5vIGFyZWFzIHRoYW4gdGhlIHJlc3Qgb2YgdGhlIG1hcmtldC4gSWYgaXQncyAuOSwgaXQgbWVhbnMgdGhhdCBDaGFzZSBpcyAxMCBwZXJjZW50IGxlc3MgbGlrZWx5IHRvIGhhdmUgbG9hbnMgaW4gdGhhdCBhcmVhLiAKCmBgYHtyIGluY2x1ZGU9RkFMU0V9CgphcmVhX2xvYW5zICU+JQogIHNlbGVjdCAoIHJvd2lkLCBsZW5kZXIsIHpjdGFfZXRobmljICkgJT4lCiAgZmlsdGVyICggc3RyX2RldGVjdCAobGVuZGVyLCAiQ2l0aWJhbmsiKSkKCgpgYGAKYGBge3J9CiMgYnVpbGQgdGhlIHRhYmxlCgpjb2xfZXRobmljX2NvdW50IDwtIG51bV9ldGhuaWNfZ3JvdXBzICogMwpwY3RhZ2VfY29scyA8LSBjKDQ6KDMrbnVtX2V0aG5pY19ncm91cHMpKQpyb3VuZF9jb2xzIDwtIGMoIChtYXgocGN0YWdlX2NvbHMpICsgMSk6KG1heChwY3RhZ2VfY29scykgKyAoMipudW1fZXRobmljX2dyb3VwcykgKSkKbWF4X2NvbF9udW0gPC0gbWF4KHJvdW5kX2NvbHMpCgpwaXZvdGVkX2xvYW5zICU+JQogICBkYXRhdGFibGUoIGNsYXNzPSJjb21wYWN0IiwgCiAgICAgICAgICAgIHJvd25hbWVzPUZBTFNFLAogICAgICAgICAgICBleHRlbnNpb25zPSJCdXR0b25zIiwgCiAgICAgICAgICAgIG9wdGlvbnMgPSBsaXN0ICgKICAgICAgICAgICAgICAgYXV0b1dpZHRoID0gVFJVRSwgCiAgICAgICAgICAgICAgIHNjcm9sbFggPSBUUlVFLAogICAgICAgICAgICAgICBjb2x1bW5EZWZzID0gbGlzdCAoIGxpc3QgKCB3aWR0aD0nMTUwcHgnLCB0YXJnZXRzPWMoMCkpIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNsaXN0ICggdmlzaWJsZT1GQUxTRSwgdGFyZ2V0cz1jKDAsOSwgMTE6MjAgICkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApICwgCiAgICAgICAgICAgICAgIG9yZGVyID0gbGlzdCAobGlzdCAoMCwgImFzYyIpKSAsIAogICAgICAgICAgICAgICBkb20gPSAiQmZydGlwIiwgCiAgICAgICAgICAgICAgIGJ1dHRvbnMgPSBjICgiY29weSIsICJjc3YiLCAiZXhjZWwiKQogICAgICAgICAgICApLAogICAgICAgICAgICkgJT4lCiAgIyB0aGlzIGlzIHdlaXJkIC0gdGhlIHN0dWZmIGluICJvcHRpb25zIiBpcyAwYmFzZWQgYW5kIHRoZSBzdHVmZiBoZXJlIGlzIDEtYmFzZWQuCiAgZm9ybWF0Um91bmQgKCByb3VuZF9jb2xzICwgZGlnaXRzPTIsIGludGVydmFsPTMsIG1hcms9IiwiKSAlPiUKICBmb3JtYXRQZXJjZW50YWdlICggcGN0YWdlX2NvbHMsIGRpZ2l0cz0wKSAlPiUKICBmb3JtYXRQZXJjZW50YWdlICggYygzKSwgZGlnaXRzPTIpICU+JQogIGZvcm1hdFJvdW5kICgyLCBkaWdpdHM9MCwgaW50ZXJ2YWw9MywgbWFyaz0iLCIpCgoKCgoKYGBgCgo8ZGl2IHN0eWxlPSJzaXplOjgwJTtjb2xvcjpncmF5O2ZvbnQtc3R5bGU6aXRhbGljOyI+ClByZXBhcmVkIGJ5IFNhcmFoIENvaGVuLCBgciBmb3JtYXQoU3lzLkRhdGUoKSwgIiVCICVkLCAlWSIpYAo8L2Rpdj4=