Q1ZTIGNvZGUgLQpHZW5lcmFsCgktIENoYW5nZWQgI2lmZGVmcyB0byBjaGVjayBmb3IgYm90aCBESVNBQkxFX1RBQkNPTVAgYW5kCgkgIE5BTk9fU01BTEwsIG1ha2VzIHRpbnkgb3B0aW9uIGxlYXZlIG91dCB0YWIgY29tcGxldGlvbiwgd2hpY2gKCSAgc2hvdWxkIGJlIGxlZnQgb3V0IGluIHRoYXQgY2lyY3Vtc3RhbmNlLiAgU2F2ZXMgYXQgbGVhc3QgNWsuCgktIFByZXZpb3VzIGNoYW5nZSB0byAjaWZkZWZzIERJU0FCTEVfVEFCQ09NUCBhbmQgTkFOT19TTUFMTCByb2xsZWQKCSAgYmFjay4gKFJvY2NvKQoJLSBWYXJpb3VzICNpZmRlZiAmICNpZm5kZWYgY2xlYW51cHMuIChSb2NjbykKCS0gQWRkZWQgbWVzc2FnZSBmb3Igd2hlbiBrZXlwYWQgZ29lcyBhd3J5LiAgQWRkZWQgY29kZSBpbiBtYWluIGFuZAoJICBmdW5jdGlvbiBwcmludF9udW1sb2NrX3dhcm5pbmcoKSB0byBub3RpZnkgdXNlciwgYW5kIGFkZGVkIGFuCgkgIGFwcm9wcmlhdGUgc2VjdGlvbiBpbiB0aGUgZmFxIHRvIHJlZmVyIHRvIHRoaXMgYnJva2VubmVzcy4KCS0gQWRkZWQgbWFjcm9zIGluIG5hbm8uaCBmb3IgbWFnaWMgdmFsdWVzIHRoYXQgbWlnaHQgYmUgdW5jbGVhciBpbgoJICBuYW5vLmM6Z2xvYmFsX2luaXQoKS4gKFJvY2NvKQotIGNvbmZpZ3VyZS5pbjoKCS0gRml4IGZvciBfdXNlX2tleXBhZCBjaGVjayBicmVha2luZyBzbGFuZyBzdXBwb3J0IChDaHJpc3RpYW4KCSAgV2Vpc2dlcmJlcikuCgktIENoYW5nZWQgdG8gYXV0b21hdGljYWxseSBkZWZpbmUgdGhlIDUgRElTQUJMRSB2YXJpYmxlcyB3aGVuCgkgIE5BTk9fU01BTEwgKGVuYWJsZS10aW55KSBpcyByZXF1ZXN0ZWQgYXQgY29uZmlndXJlLgotIGZhcS5odG1sOgoJLSBBZGRlZCBzb21lIGluZm8gb24gbWFraW5nIHRoZSBiaW5hcnkgc21hbGxlciB3aXRoIHRoZSBjb25maWd1cmUKCSAgc2NyaXB0LgoJLSBBZGRlZCBzZWN0aW9uIG9uIGtleXBhZCBidWdnaW5lc3MuCi0gZmlsZXMuYzoKICByZWFsX2Rpcl9mcm9tX3RpbGRlKCkKCS0gT29wcywgZml4IGNhc2Ugd2hlcmUgYnVmID0ifiIsIHNpbGx5IGNyYXNoIChidWcgZGlzY292ZXJlZCBieQoJICBOZWlsIFBhcmtzKS4KICBkb19icm93c2VyKCkKCS0gQWRkZWQgc3BhY2UgYW5kIC0ga2V5cyB0byBkbyBwYWdlIHVwIGFuZCBkb3duLgogIGN3ZF90YWJfY29tcGxldGlvbigpLCBpbnB1dF90YWIoKQoJLSBDaGFuZ2VkIGJhcmUgbWFsbG9jL2NhbGxvYyBjYWxscyB0byBubWFsbG9jIChmb3VuZCBieSBSb2NjbykuCgktIEFkZGVkIG51bGwgZW5kIG9mIHRtcEJ1ZiBmb3Igc2FuaXR5IChSb2NjbykuCi0gbmFuby5jOgogIEFCQ0QoKQoJLSBOZXcgZnVuY3Rpb24sIGZpZ3VyZXMgb3V0IHdoYXQga2JpbnB1dCB0byByZXR1cm4gZ2l2ZW4KCSAgaW5wdXQgY29tbW9uIHRvIHNldmVyYWwgc3dpdGNoIHN0YXRlbWVudHMsIGFsbG93cyB1cyB0byAKCSAgc3VwcG9ydCB0aGUgZGVmYXVsdCBLb25zb2xlIGtleSBzZXR0aW5ncy4KICBtYWluKCkKCS0gQWx0ZXJuYXRlIHNwZWxsZXIgb3B0aW9uIG5vIGxvbmdlciB2YWxpZCBpZiBESVNBQkxFX1NQRUxMRVIgaXMKCSAgYWN0aXZlLiAoUm9jY28pCgktIEluaXRpYWxpemVkIGtiaW5wdXQgdG8gZ2V0IGFyb3VuZCBzdHVwaWQgY29tcGlsZXIgd2FybmluZy4KICBuYW5vX3NtYWxsX21zZygpCgktIFRoaXMgZnVuY3Rpb24gaGFzIGJlZW4gcmVtb3ZlZC4gIEFsbCByZWZlcmVuY2VzIG5vdyBjYWxsCgkgIG5hbm9fZGlzYWJsZWRfbXNnLiAoUm9jY28pCiAgdmVyc2lvbigpCgktIFdoZW4gTkFOT19TTUFMTCAoZW5hYmxlLXRpbnkpIGlzIGRlZmluZWQsIHRoZSA1IG1haW4gRElTQUJMRQoJICB2YXJpYWJsZXMgKFNQRUxMRVIsIEhFTFAsIEpVU1RJRlksIEJST1dTRVIsIFRBQkNPTVApIGFyZSBub3QKCSAgcmVwb3J0ZWQgYXMgZW5hYmxlZCB3aGVuIE5hbm8gaXMgY2FsbGVkIHdpdGggLVYgKC0tdmVyc2lvbikKCSAgY29tbWFuZC1saW5lIG9wdGlvbi4gKFJvY2NvKQogIHVzYWdlKCkKCS0gQWx0ZXJuYXRlIHNwZWxsZXIgb3B0aW9uIG5vIGxvbmdlciB2YWxpZCBpZiBESVNBQkxFX1NQRUxMRVIgaXMKCSAgYWN0aXZlLiAoUm9jY28pCiAgd2luZG93X2luaXQoKSwgaGFuZGxlX3NpZ3dpbmNoKCkKCS0gQWRkZWQgY2hlY2sgZm9yIG5vdCBoYXZpbmcgZW5vdWdoIExJTkVTIHRvIGRvIGFueXRoaW5nIHVzZWZ1bCwKCSAgaWYgc28gZGllIHdpdGggYW4gZXJyb3IuIChSb2NjbykKICBkaWVfdG9vX3NtYWxsKCkKCS0gRnVuY3Rpb24gdG8gcHJpbnQgdGhlIHdpbmRvdyB0b28gc21hbGwgZXJyb3IgbWVzc2FnZSwgYXZvaWRzCgkgIHJlcGVhdGVkIHN0cmluZyBkZWZzIGFuZCBnbG9iYWxzLgotIGZpLnBvOgoJLSBVcGRhdGUgYnkgUGF1bGkgVmlydGFuZW4uCgpuYW5vIDAuOS4yNSAtIDAxLzA3LzIwMDEKR2VuZXJhbCAtIAoJLSBOZXcgZmlsZSBicm93c2VyIGNvZGUuICBOZXcgZnVuY3Rpb25zIGluIGZpbGVzLmM6ZG9fYnJvd3NlcigpLAoJICBoZWxwZXIgZnVuY3Rpb25zIGJyb3dzZXJfaW5pdCgpLCB0YWlsKCksIHN0cmlwb25lZGlyKCksCgkgIGZpbGVzdGF0KCkuICBOZXcgc2hvcnRjdXQgbGlzdCBicm93c2VyX2xpc3QuICBTb21lIG5ldwoJICBzdHJpbmdzIHRvIHRyYW5zbGF0ZS4gIEFkZGVkIGZ1bmN0aW9uIGRvX2Jyb3dzZV9mcm9tKCkuCgktIEtleXBhZCBjb2RlIGhhcyBiZWVuIGNoYW5nZWQgc2xpZ2h0bHkuICBOb3cgY2hlY2tzIGZvcgoJICBfdXNlX2tleXBhZCBmbGFnIGluIHdpbmRvdyB0byBzZWUgd2hldGhlciBvciBub3QgdG8gdHVybiAKCSAgdGhlIGtleXBhZCgpIGJhY2sgb2ZmIHdoZW4gZmluaXNoZWQgKHRha2VuIGZyb20gYXVtaXgpLiAgTW92ZWQKCSAgdG8gd2luaW8uYyB3aGVyZSBpdCBzaG91bGQgcHJvYmFibHkgYmUgYW55d2F5LiAgTmV3IGNvbmZndXJlCgkgIGNoZWNrIGZvciBfdXNlX2tleXBhZCBpbiB3aW5kb3cgc3N0cnVjdC4gIFRoaXMgd2lsbCBoYXZlIHRvIGRvCgkgIGZvciBub3cuCgktIE1vdmVkIGtleXBhZCgpIGNhbGxzIGZvciBQRENVUlNFUyBmcm9tIG1haW4oKSB0byB3aW5kb3dfaW5pdCgpCgkgIHNvIHRoZSBrZXlwYWQgY29udGludWVzIHRvIHdvcmsgYWZ0ZXIgYSBNZXRhLVgsIGZvciBleGFtcGxlLgoJICBGaXhlZCBidWcgIzUxLgotIGZhcS5odG1sOgoJLSBGaXggdHlwb3MgYW5kIHNtYWxsIG1pc3Rha2VzIChKb3JkaSkuCi0gZmlsZXMuYzoKICB1c2VybmFtZV90YWJfY29tcGxldGlvbigpCgktIEFkZGVkIHRoZSAoY2hhciAqKSBzaXplb2Ygd2hlbiBhbGxvY2F0aW5nIG1lbW9yeSBmb3IgdGhlIGZpbGVuYW1lCgkgIGFycmF5IChSb2NjbykuCiAgY3dkX3RhYl9jb21wbGV0aW9uKCkKCS0gcmVtb3ZlZCBza2lwcGluZyAuIGFuZCAuLiB3aGVuIHRhYnVsYXRpbmcgbWF0Y2hlcy4KCS0gQWRkZWQgdGhlIChjaGFyICopIHNpemVvZiB3aGVuIGFsbG9jYXRpbmcgbWVtb3J5IGZvciB0aGUgZmlsZW5hbWUKCSAgYXJyYXkgKFJvY2NvKS4KICBkb193cml0ZW91dCgpCgktIE5vdyB0YWtlcyBhbiBhcmd1bWVudCBzbyB0aGUgc3RyaW5nIHR5cGVkIGluIGNhbiBiZSByZXRhaW5lZAoJICB3aGVuIGNhbGxpbmcgdGhlIGJyb3dzZXIuCiAgZG9fYnJvd3NlcigpCgktIERvbid0IGRlY3JlbWVudCBsb25nZXN0IGJ5IHRoZSBsZW5ndGggb2YgcGF0aC4gIEZpeGVzIGNyYXNoZXMKCSAgb24gZW50ZXJpbmcgdmFyaW91cyBkaXJzICAoUm9jY28pLgoJLSBEb24ndCB1bmdldGNoKCkgdGhlIGV4aXQga2V5LCB1bm5lZWRlZCwgZml4ZXMgaW5lcnRpbmcgYSBmaWxlCgkgIGNhdXNlcyBleGl0IGNvZGUuCi0gbW92ZS5jOgogIHBhZ2VfZG93bigpCgktIERvbid0IGRvIGFuIGVkaXRfdXBkYXRlIHdoZW4gdGhlcmUgaXMgb25seSBvbmUgcGFnZSBvZiB0ZXh0CgkgIChmaWxlYWdlID09IGVkaXR0b3AgJiYgZmlsZWJvdCA9PSBlZGl0Ym90KS4gIEZpeGVzIEJ1ZyAjNTAuCi0gbmFuby5jOgogIG1haW4oKQoJLSBSZW9yZGVyIHRoZSBnZXRvcHQgb3B0aW9ucyB0byBiZSBtb3JlIG9yIGxlc3MgYWxwaGFiZXRpY2FsCgkgIChzdWdnZXN0ZWQgYnkgU3ZlbiBHdWNrZXMpLgotIHdpbmlvLmM6CiAgZG9fY3Vyc29ycG9zKCkKCS0gT3B0aW1pemF0aW9ucyBhbmQgY2xlYW51cHMgYnkgUm9jY28gQ29yc2kuCiAgZG9fY3JlZGl0cygpCgktIFNwZWxsIEVyaWsgQW5kZXJzZW4ncyBuYW1lIHJpZ2h0LgogIHRpdGxlYmFyKCkKCS0gTm93IHRha2VzIGFuIGFyZywgbmVlZGVkIGZvciBicm93c2VyIGZ1bmN0aW9uLgogIGRvX2hlbHAoKQoJLSBDaGFuZ2VkIHdheSBvZiB0ZW1wb3JhcmlseSBicmluZ2luZyB1cCBzaG9ydGN1dHMgYXQgdGhlCgkgIGJvdHRvbSBpbiB0aGUgaGVscCBzY3JlZW4gKGFjdHVhbGx5IHdvcmtzKS4KLSB1dGlscy5jOgogIG1hbGxvY3N0cmNweSgpCgktIFRha2VzIGNoYXIgcG9pbnRlcnMgbm93IGluc3RlYWQgb2Ygdm9pZCAobWFrZXMgZGVidWdnaW5nIGEKCSAgaGVsbHV2YSBsb3QgZWFzaWVyKQoJLSBEdWgsIGRvbid0IGRvIGFueXRoaW5nIGlmIHNyYyA9PSBkZXN0IQotIGVzLnBvOgoJLSBVcGRhdGVzIGZvciBmaWxlIGJyb3dzZXIgKEpvcmRpKS4KCm5hbm8gMC45LjI0IC0gMTIvMTgvMjAwMApHZW5lcmFsCgktIEFkZGVkIC0tZGlzYWJsZS1oZWxwIG9wdGlvbiwgYWZmZWN0cyBhY2NvbmZpZy5oLCBjb25maWd1cmUoLmluKSwKCSAgd2luaW8uYzpkb19oZWxwLCBuYW5vLmM6aGVscF9pbml0LGhlbHBfdGV4dF9pbml0LHZlcnNpb24uCgktIENoYW5nZWQgZmlsZW5hbWUgdG8gbm8gbG9uZ2VyIHVzZSBQQVRIX01BWCwgc28gaXQgY2FuIHdvcmsgb24gdGhlCgkgIEhVUkQuICBDaGFuZ2VzIGluIGZpbGVzLmM6d3JpdGVfZmlsZSgpLCBuZXcgZnVuY3Rpb24KCSAgbmFuby5jOmNsZWFyX2ZpbGVuYW1lKCksIG1hbnkgY2hhbmdlZCBpbiBtYWluKCksIGEgZmV3IG90aGVyCgkgIHBsYWNlcy4gIFBsZWFzZSB0ZXN0IHRoaXMhCgktIEFkZGVkIC1iLCAtZSwgYW5kIC1mIGZsYWdzLCB3aGljaCB3ZSBpZ25vcmUgYXMgbmFubyBwcm92aWRlcyAKCSAgdGhlaXIgZnVuY3Rpb25hbGl0eSBhbHJlYWR5LgotIGN1dC5jOgogIGRvX3VuY3V0X3RleHQoKQoJLSBGaXggcmVudW1iZXJpbmcgYnVnIHdoZW4gdW5jdXR0aW5nIG1hcmtlZCB0ZXh0IGF0IGZpbGVib3QuCgktIEZpeCBzY3JlZW4gbm90IGJlaW5nIGRpc3BsYXllZCB3aGVuIHdlIGFyZSB1bmN1dHRpbmcgbWFya2VkCgkgIHRleHQgYXQgZWRpdGJvdCAoQnVnIGRpc2NvdmVyZWQgYnkgS2VuIFR5bGVyKS4KCS0gRml4IG1hZ2ljIGxpbmUgbm90IGdldHRpbmcgY3JlYXRlZCB3aGVuICh5b3UgZ3Vlc3NlZCBpdCkKCSAgdW5jdXR0aW5nIG1hcmtlZCB0ZXh0IGF0IGZpbGVib3QgKFJ5YW4gS3JlYnMpLgotIGZpbGVzLmM6CiAgcmVhZF9maWxlKCkKCS0gSWYgd2UgZW5jb3VudGVyIGFuIGVycm9yIGFuZCBpbnNlcnQgaXMgbm90IHNldCwgcnVuIG5ld19maWxlKCkuCgkgIChidWcgZGlzY292ZXJlZCBieSBCZW4gUm9iZXJ0cykuCiAgd3JpdGVfZmlsZSgpCgktIENoYW5nZSBvcGVuIGNhbGwgZmxhZ3MsIGJhc2ljYWxseSBjb3B5IGpvZSdzIHdheSBvZiBkb2luZyBpdCBzbwoJICBhIG1vcmUgcmVjZW50IHZlcnNpb24gd2lsbCBhY3R1YWxseSBiZSBpbmNsdWRlZCBpbiAodW4pc3RhYmxlLgoJLSBSZW1vdmUgdXNlbGVzcyBmc3RhdCBjYWxsLgogIG9wZW5fZmlsZSgpCgktIEFkZGVkIGNoZWNrIGZvciBTX0lTQkxLIGFuZCBTX0lTQ0hSLCBkb24ndCBvcGVuIGRldmljZSBmaWxlcyEKLSBuYW5vLmM6CiAgcmVudW1iZXIoKQoJLSBEb250IHN0dXBpZGx5IGFzc2lnbiB0aGUgdmFsdWUgb2YgcHJldi0+bGluZW5vIGlmIHByZXYgPT0gTlVMTCEKICBtYWluKCkKCS0gQWRkZWQgY29kZSB0byBjaGVjayBmb3IgQWx0LUFsdCAoMjctMjcpIGtleXN0cm9rZXMgYW5kIHNldCB0aGUKCSAgbmV4dCBrZXlzdHJva2UgYXMgYSBjb250cm9sIHNlcXVlbmNlLiAgTmV3IHZhcmlhYmxlIAoJICBtb2RpZnlfY29udHJvbF9rZXkuICBSZW1vdmVkICNpZmRlZiBfUE9TSVhfVkRJU0FCTEUgY2hlY2sKCSAgYXJvdW5kIENvbnRyb2wtUyxRLFogaGFuZGxlcnMgYmVjYXVzZSB3ZSBuZWVkIGl0IG5vdyBmb3IKCSAgdGhlIEFsdC1BbHQteCBjb2RlLgoJLSBBZGRlZCAtLXZpZXcgb3B0aW9uIHRvIGdldG9wdF9sb25nKCljYWxsIC4gIEJ1ZyBkaXNjb3ZlcmVkIAoJICBieSBSb2NjbyBDb3JzaS4KICBoZWxwX2luaXQoKQoJLSBGaXggb2ZmIGJ5IG9uZSBlcnJvciB0aGF0IHdhcyBtYWtpbmcgXkcgaGVscCBpbiBub3JtYWwgbW9kZSBhbmQKCSAgXl8gaW4gcGljbyBtb2RlIG5vdCBiZSBkaXNwbGF5ZWQgaW4gdGhlIGhlbHAgKGJ1ZyBkaXNjb3ZlcmVkIGJ5CgkgIFJvY2NvIENvcnNpKS4KICBkb190b2dnbGUoKQoJLSBBZGRlZCBmaXhfZWRpdGJvdCgpIGNhbGwgdG8gZml4IGltcHJvcGVyIHJlZGlzcGxheSBvZiBlZGl0CgkgIHdpbmRvdyB3aGVuIHVzaW5nIG5vaGVscCB0b2dnbGUgKGJ1ZyBkaXNjb3ZlcmVkIGJ5IFJvY2NvIENvcnNpKS4KLSBuYW5vLjEsIG5hbm8uMS5odG1sOgoJLSBVcGRhdGVkIG1hbiBwYWdlIGZvciAtYiwgLWUsIC1mIGFuZCBleHBhbmRlZCBleHBsYW5hdGlvbiBmb3IgLXAuCi0gd2luaW8uYwogIGRvX2hlbHAoKQoJLSBGb3JjZSBrZXlwYWQgb24gc28gRi1rZXlzIGFuZCBQYWdlVXAvRG93biB3aWxsIHdvcmsgcHJvcGVybHkuCgkgIEFkZGVkIGNoZWNrIGZvciBOQU5PX0VYSVRfRktFWSB0byBsb29wLgotIHV0aWxzLmM6CiAgbmV3X21hZ2ljbGluZSgpCgktIEluY3JlbWVudCB0b3RzaXplISEgIFdlIGRlY3JlbWVudCBpdCB3aGVuIHdlJ3ZlIHJlYWQgYSBmaWxlLCAKCSAgZXZlcnl3aGVyZSBlbHNlIGl0IHNob3VsZCBhdXRvbWF0aWNhbGx5IGJlIGluY3JlbWVudGVkCgpuYW5vIDAuOS4yMyAtIDEyLzA4LzIwMDAKR2VuZXJhbAoJLSBDaGFuZ2VkIC0tZGlzYWJsZS1zcGVsbCB0byAtLWRpc2FibGUgc3BlbGxlci4gIFRoZSB0ZXJtIGlzCgkgICJzcGVsbGVyIiBmb3IgLXMsIHNvIGl0IHNob3VsZCBiZSAtLWRpc2FibGUtc3BlbGxlci4KLSBmaWxlcy5jOgogIHdyaXRlX2ZpbGUoKQoJLSBBZGRlZCB0bXAgY2hlY2sgdG8gVE1QX09QVCBzZWN0aW9uIChob3cgYXByb3ByaWF0ZSkuCgktIEFkZGVkIG5ldyBjb25zaXN0ZW5jeSBjaGVja2luZyBjb2RlIGZyb20gc2VjdXJpdHlmb2N1cyAKCSAgYXJ0aWNsZSBieSBPbGl2ZXIgRnJpZWRyaWNocywgYW5kIHVzZSBPX0VYQ0wgaWYgdG1wID09IDEuCgktIFdlIG5vdyBydW4gY2hlY2sgb24gcmVzdWx0IG9mIGxzdGF0KCksIG5vdCBzdGF0KCksIHRvIGJlCgkgIHNhZmVyLiAgTmV3IHZhcmlhYmxlIGFueWV4aXN0cywgd2UgdXNlIHN0aWxsIHVzZSByZWFsZXhpc3RzCgkgIGxhdGVyIGluIHRoZSBwcm9ncmFtLgoJLSBPT1BTLCBsaW5lIHVwIGxpbmsvdW5saW5rL3JlbmFtZSBjaGVjayBpZiBjb25kaXRpb25hbCB3aXRoIAoJICB0b3AgaWYgY29uZGl0aW9uYWwuICBPcHRpb24gLWwgaGFzIGJlZW4gYnJva2VuIGZvciA5IHZlcnNpb25zLAoJICBubyBvbmUgbm90aWNlZD8hCgktIEFkZGVkIHNhdmluZyBwZXJtcyBhdCBlbmQgb2YgbGluayBzbyB3ZSBjYW4gYXBwbHkgdGhlbSB0byB0aGUKCSAgbmV3IGZpbGUgaWYgLS1ub2ZvbGxvdyBpcyB1c2VkLgotIHdpbmlvLmM6CiAgZWRpdF9hZGQoKQoJLSBPZmYgYnkgb25lIGRpc3BsYXkgZXJyb3IgKGZpeCBieSBSb2NjbyBDb3JzaSkuCiAgZG9fcmVwbGFjZV9oaWdobGlnaHQoKQoJLSBOZXcgY29kZSB0byBoYW5kbGUgYmVpbmcgcGFzdCBDT0xTIChSb2NvIENvcnNpKS4KCS0gTW92ZWQgZnJvbSBzZWFyY2guYywgYXMgaXQncyBkZWZpbml0ZWx5IGEgd2luaW8gZnVuY3Rpb24gbm93ID0pCiAgdXBkYXRlX2xpbmUoKQoJLSBNb3JlICckJyBkaXNwbGF5IGZpeGVzIChSb2NjbyBDb3JzaSkuCgpuYW5vIDAuOS4yMiAtIDEyLzAyLzIwMDAKLSBHZW5lcmFsCgktIFVzZXJuYW1lIHRhYiBjb21wbGV0aW9uIGNvZGUsIGFuZCBjbGVhbmVkIHVwIGV4aXN0aW5nIHRhYmNvbXAKCSAgY29kZS4gTmV3IGZ1bmN0aW9ucyByZWFsX2Rpcl9mcm9tX3RpZGUoKSwgYXBwZW5kX3NsYXNoX2lmX2RpcigpLAoJICB1c2VybmFtZV90YWJfY29tcGxldGlvbiBpcyBtb3JlIHRoYW4gYSBzdHViIG5vdyA9LSkuCgktIElnbm9yZSBrZXkgc2VxdWVuY2UgNTQzICYgNTQ1LCByaWdodCBjb250cm9sIGFuZCBhbHQga2V5cyBpbgoJICB3aW5kb3dzLiBBZmZlY3RzIG1haW4oKSBhbmQgd2luaW8uYzpuYW5vZ2V0c3RyKCkuCgktIFRvb2sgb3V0IGhlbHAgZnJvbSBzcGVsbF9saXN0IGFuZCBjaGFuZ2VkIFNQRUxMX0xJU1RfTEVOIHRvIDEuCgkgIElzIHVzaW5nIGEgc3BlbGwgY2hlY2tlciBUSEFUIGRpZmZpY3VsdD8gPS0pCgktIE5ldyBmdW5jdGlvbiBuYW5vX2Rpc2FibGVkX21zZygpLCB0byBhbGVydCB0aGF0IGNlcnRhaW4KCSAgZnVuY3Rpb25zIGhhdmUgYmVlbiBkaXNhYmxlZCwgc2ltaWxhZXIgdG8gbmFub190aW55IGZlYXR1cmUuCi0gTmV3IGNvbmZpZ3VyZSBvcHRpb25zOgoJLSBBZGRlZCBjb25maWd1cmUgYXJndW1lbnQgLS1kaXNhYmxlLXRhYmNvbXAuICBBZmZlY3RzCgkgIGJvdHRvbSBvZiBmaWxlcy5jIGFuZCB3cml0ZV9maWxlLCB1dGlscy5jOmNoZWNrX3dpbGRjYXJkX21hdGNoKCkKCSAgYW5kIHdpbmlvLmM6bmFub2dldHRzcigpLgoJLSBOZXcgb3B0aW9ucyAtLWVuYWJsZS1leHRyYS4gIE5ldyBjb2RlIGluIG5hbm8uYzp2ZXJzaW9uKCkgdG8gCgkgIHByaW50IG91dCB2YXJpb3VzIG9wdGlvbnMgZnJvbSAuL2NvbmZpZ3VyZSwgZnVuY3Rpb24gZG9fY3JlZGl0cygpLgoJLSBBZGRlZCAtLWRpc2FibGUtc3BlbGwgb3B0aW9uIGZvciB0aG9zZSB3aG8gd2FudCB0byBqdXN0IGRpc2FibGUKCSAgdGhlIHNwZWxsIGNoZWNrIGZlYXR1cmUuICBBZmZlY3RzIHRoZSBzcGVsbGluZiBmdWNudGlvbnMKCSAgZG9fc3BlbGwsIGRvX2ludF9zcGVsbGVyIGFuZCBkb19hbHRfc3BlbGxlci4KCS0gQWRkZWQgLS1kaXNhYmxlLWp1c3RpZnkgdG8gZ2V0IHJpZCBvZiB0aGUganVzdGlmeSBmdW5jdGlvbi4KCSAgQWZmZWN0cyBkb19qdXN0aWZ5KCkgKG5vdCBzdXJwcmlzaW5nbHkpLgotIGZpbGVzLmM6CiAgd3JpdGVfZmlsZSgpCgktIFVuc2V0dGluZyBtb2RpZmllZCBvbiB0ZW1wIGZpbGVzIGJ1ZyBmaXhlZCAoUm9jY28gQ29yc2kpLgoJLSBPa2F5LCBpZiB0bXAgPT0gMSBhbmQgdGhlIGZpbGUgZXhpc3RzLCB3ZSBhYm9ydC4KICBkb19pbnNlcnRmaWxlKCkKCS0gQWRkZWQgY2FsbCB0byByZWFsX25hbWVfZnJvbSB0aWxkZSwgb29wcy4gIEFkZGVkIGNoZWNrIGZvcgoJICBESVNBQkxFX1RBQkNPTVAuCiAgcmVhZF9maWxlKCkKCS0gQWRkZWQgY2hlY2sgZm9yIGZpbGVwdHIgPT0gTlVMTC4KLSBnbG9iYWwuYzoKICBzaG9ydGN1dF9pbml0KCkKCS0gTm93IHRha2VzIGFuIGFyZ3VtZW50IGFzIHRvIHdoZXRoZXIgdG8gZGlzcGxheSB0aGUgdW5qdXN0aWZ5CgkgIHNob3J0Y3V0IG9yIHRoZSBub3JtYWwgdW5jdXQgdGV4dCBvbmUuICBOZWVkZWQgdG8gYWNjb21vZGF0ZQoJICB0aGUga2x1Z2V5IHVuanVzdGlmeSBjb2RlLgotIG5hbm8uMSwgbmFuby4xLmh0bWw6CgktIFVwZGF0ZWQgZGF0ZSBvbiBwYWdlcyBiZWNhdXNlIG9mIC1wIGNoYW5nZXMuCgktIEFkZGVkICJOT1RFUyIgc2VjdGlvbiwgd2hlcmUgSSBleHBsYWluIHdoYXQgbmFuby5zYXZlICYgZnJpZW5kcwoJICBhcmUuCgktIEFkZGVkIGEgY29weXJpZ2h0IG5vdGljZSBmb3IgdGhlIG1hbnBhZ2UsIHVuZGVyIHRoZSBHUEwuCgktIE90aGVyIG1pbm9yIGNoYW5nZXMuCi0gbmFuby5jOgogIGRvX2p1c3RpZnkoKQoJLSBXcm90ZSB1bmp1c3RpZnkgY29kZS4gIEJvcnJvd3MgY3V0YnVmZmVyIGFuZCBzdG9yZXMgdGhlIHVuanVzdGlmaWVkIAoJICB0ZXh0IHRoZXJlLCB0aGVuIGdyYWJzIHRoZSBuZXh0IGtleXN0cm9rZSBhbmQsIGlmIHRoZSB1bmp1c3RpZnkKCSAga2V5LCBnZXRzIHJpZCBvZiB0aGUganVzdGlmaWVkIHRleHQgYW5kIGNhbGxzIGRvX3VuY3V0X3RleHQuCgkgIEFkZGVkIG1hY3JvIE5BTk9fVU5KVVNUSUZZX0tFWS4KICBkb19pbnRfc3BlbGwqCgktIFZhcmlvdXMgZml4ZXMgKFJvY2NvIENvcnNpKS4KCS0gQ2hhbmdlZCBhYm9ydCBvZiBwcm9ncmFtIHRvIGFib3J0aW5nIGJhc2VkIG9uIHZhbHVlIG9mICJlZGl0IGEKCSAgcmVwbGFjZW1lbnQiIHF1ZXN0aW9uLCBhbmQgbm90IGNhcmluZyBhYm91dCB0aGUgcmVwbGFjZSBsb29wCgkgIHJldHVybiB2YWx1ZS4gIFRoYXQgd2F5IHRoZSB1c2VyIGNhbiBnZXQgb3V0IG9mIHRoZSByZXBsYWNlIGxvb3AKCSAgYW5kIGNvbnRpbnVlIHNwZWxsIGNoZWNraW5nICh2ZXJ5IGltcG9ydGFudCB0byBtZSBhbnl3YXkpLgogIHZlcnNpb24oKQoJLSBUb29rIG91dCBodWdlIGNoZWNrIGZvciB0aGUgdmFyaW91cyAtLWRpc2FibGVkIG1hY3JvcywKCSAgZXZlbnR1YWxseSB0aGVyZSB3aWxsIGJlIHRvbyBtYW55IHRvIHJlYXNvbmFibHkgY2hlY2sgZm9yLiAgCiAgbmFub19zbWFsbF9tc2coKSwgbmFub19kaXNhYmxlZF9tc2coKQoJLSBBZGRlZCBjaGVja3MgZm9yIGRpc2FibGVkIGZ1bmN0aW9ucyB0byBzZWUgd2hldGhlciBvciBub3QgdG8KCSAgZGVjbGFyZSB0aGVtLgogIGRvX25leHRfd29yZCgpCgktIFVwZGF0ZSB0aGUgcHJldmlvdXMgbGluZSBhcyB3ZWxsIGFzIHRoZSBjdXJyZW50IG9uZSBpbiBjYXNlIHdlCgkgIGhhdmUgbW92ZWQgYmV5b25kIENPTFMgb3IgYmFjayBmcm9tIENPTFMsIHBhdGNoIHN1Ym1pdHRlZAoJICBieSBSeWFuIEtyZWJzLgogIGRpZSgpCgktIE5vdyBjcmVhdGVzIC5zYXZlIGZpbGUgdXNpbmcgdmFyaWFibGUtbGVuZ3RoIHN0cmluZ3MuICBBbHNvCgkgIGNhbGxzIHdyaXRlX2ZpbGUgd2l0aCB0bXAgPT0gMSwgd2hpY2ggaGFwcGVucyB0byBkbyBleGFjdGx5IHdoYXQKCSAgd2Ugd2FudCAoYWJvcnQgb24gc2F2ZSBmaWxlIGV4aXN0cyBhbmQgdXNlIG1vZGUgMDYwMCkuCiAgaGFuZGxlX3NpZ2h1cCgpCgktIE5vdyBjYWxscyBkaWUgaW5zdGVhZCBvZiB3cml0aW5nIG9uIGl0cyBvd24gYW5kIGV4aXRpbmcgbm9ybWFsbHkuCi0gc2VhcmNoLmM6CiAgZG9fcmVwbGFjZV9oaWxpZ2h0KCkKCS0gTmV3IGZ1bmN0aW9uLCBkaXNwbGF5cyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHdvcmQgYXMgaGlsaWdodGVkCgkgIGluIHRoZSBzcGVsbCBjaGVjay4gIENhbGxlZCBmcm9tIGRvX3JlcGxhY2VfbG9vcCAoUm9jY28gQ29yc2kpLgoJLSBBZGRlZCBjYWxscyB0byBjdXJzX3NldCgwKSBhbmQgKDEpIHRvIGRpYWJsZSB0aGUgY3Vyc29yIHdoZW4KCSAgaGlsaWdodGluZywgbG9va3MgbXVjaCBiZXR0ZXIuCi0gZXMucG86IAoJLSBUcmFkaXRpb25hbCBTcGFuaXNoIHN0cmluZ3MgdXBkYXRlcy4KCm5hbm8gMC45LjIxIC0gMTEvMjMvMjAwMAotIEFVVEhPUlMKCS0gQWRkZWQgUm9jY28gQ29yc2kuCi0gbmFuby5jOgogIG1haW4oKQoJLSBDaGFuZ2VkIGNoZWNrIGZvciBhcmdjID09IDEgdG8gYXJndltvcHRpbmRdID09IE5VTEwgdG8gZGVjaWRlCgkgIHdoZXRoZXIgb3Igbm90IHRvIGRpc3BsYXkgIk5ldyBGaWxlIiBpbiB0aGUgc3RhdHVzYmFyLgotIHNlYXJjaC5jOgogIGZpbmRuZXh0c3RyKCkKCS0gRml4IGN1cmVudF94IGluY3JlbWVudCBidWcgYnkgdXNpbmcgYW5vdGhlciB2YXJpYWJsZSAoUm9jY28gQ29yc2kpLgogIHNlYXJjaF9pbml0KCkKCS0gU2lsbHkgdHlwbyBpbiBvdXIgIm9uZSBzaW1wbGUgY2FsbCIgb2Ygc3RhdHVzcS4gIFN0b3BwZWQKCSAgcHJldmlvdXMgc2VhcmNoIHN0cmluZyBmcm9tIGJlaW5nIGRpc3BsYXllZC4KICBkb19yZXBsYWNlKCkKCS0gQ29weSBiYWNrIHRoZSBwcmV2aW91cyB2YWx1ZSBvZiBsYXN0X3JlcGxhY2UgaW50byBhbnN3ZXIgaWYKCSAgdXNpbmcgUElDT19NT0RFIGFuZCBhbnN3ZXIgPT0gIiIKLSB3aW5pby5jOgogIGRvX3VwKCkKCS0gRGVsZXRlZCBmaXJzdCB1cGRhdGVfbGluZSgpIGNhbGwsIHNjcmV3cyB1cCBkaXNwbGF5IHdoZW4gbWFya2VyIGlzIHNldC4KLSBuYW5vLjEsIG5hbm8uMS5odG1sCgktIFVwZGF0ZWQgbWFuIHBhZ2UgZm9yIG5ldyAtcCBkZWZpbml0aW9uLgoKbmFubyAwLjkuMjAgLSAxMS8xOC8yMDAwCi0gR2VuZXJhbAoJLSBSYW4gc291cmNlIHRocm91Z2ggaW5kZW50IC1rciBhZ2Fpbi4gIE1ha2UgZXZlcnl0aGluZyBwcmV0dHkuCgktIENoYW5nZWQgYmVoYXZpb3Igb2YgInNlYXJjaCIgYW5kICJyZXBsYWNlIiBwcm9tcHRzIHRvIG1ha2UgYWxsCiAgCSAgcHJldmlvdXMgdmFsdWVzIGVkaXRhYmxlLiAgVGhpcyBjaGFuZ2Ugd2FzIG1hZGUgc28gdGhhdCB5b3UgY2FuIAoJICByZXBsYWNlIHdpdGggdGhlIG51bGwgc3RyaW5nIHdpdGhvdXQgbmVlZGluZyBhIHNwZWNpYWwga2V5IGZvciBpdC4gIAoJICBjaGFuZ2VkIGNvZGUgaW4gc2VhcmNoX2luaXQoKSwgZG9fcmVwbGFjZSgpLCBuYW5vZ2V0c3RyIChzZWUKCSAgYmVsb3cpLgoJLSBBZGRlZCBzb21lIG1pc3NpbmcgZ2V0dGV4dCBjYWxscyBoZXJlIGFuZCB0aGVyZSAoSm9yZGkpLgoJLSBSZXZhbXBlZCBuYW5vZ2V0c3IoKSBhbmQgY2FsbHMgdG8gaXQgdG8gdXNlIHZhcmlhYmxlIGxlbmd0aCBzdHJpbmdzLgoJICBNQU5ZIGNoYW5nZXMgaW4gbmFub2dldHN0cigpLCBtYW55IGNoYW5jZXMgaW4gc2VhcmNoLmMsIG5ldwoJICBmdW5jdGlvbiBtYWxsb2NzdHJjcHkgd2hpY2ggaXMgc3VyZSB0byBiZSBhIHByb2dyYW1tYXRpYwoJICBuaWdodG1hcmUsIGNoYW5nZWQgbGFzdF9zZWFyY2gsIGxhc3RfcmVwbGFjZSwgYW5zd2VyIHRvCgkgIHBvaW50ZXJzLiAgTmV3IGZ1bmN0aW9uIG5vdF9mb3VuZF9tc2cgaW4gc2VhcmNoLmMgZm9yIGRpc3BsYXlpbmcKCSAgdHJ1bmNhdGVkIHN0cmluZ3MgaW4gc2F0dXNiYXIgd2hlbiB0aGUgc3RyaW5nIGlzIG5vdCBmb3VuZAoJICAoLXBlZGFudGljIGZpeGVzIGJ5IFJvY2NvIENvcnNpKS4gV2UgZGlzYWJsZSB0aGlzIGZlYXR1cmUgd2hlbgoJICB1c2luZyBQSUNPX01PREUgKC1wKS4KCS0gTmV3IHNwZWxsaW5nIGNvZGUgYnkgUm9jY28gQ29yc2kuICBOZXcgZnVuY3Rpb25zCgkgIGRvX2ludF9zcGVsbGVyLCBkb19hbHRfc3BlbGxlciwgY2hhbmdlcyB0byBkb19zcGVsbCBpbiBuYW5vLmMsCgkgIE5ldyBmdW5jdGlvbnMgc2VhcmNoX2luaXRfZ2xvYmFscyBhbmQgZG9fcmVwbGFjZV9sb29wLCBjaGFuZ2VzCgkgIHRvIHNlYXJjaF9pbml0KCksIGRvX3JlcGxhY2UsIGZpbmRuZXh0c3RyLCBtb3ZlZCBsYXN0X3NlYXJjaCBhbmQKCSAgbGFzdF9yZXBsYWNlIGJhY2sgdG8gbmFuby5jICgqc2hydWcqKS4KCS0gTmV3IHRhYiBjb21wbGV0aW9uIGNvZGUuICBVc2VkIGNoZWNrX3dpbGRjYXJkX21hdGNoLCBpbnB1dF90YWIsIAoJICBjd2RfdGFiX2NvbXBsZXRpb24sIHVzZXJuYW1lX3RhYl9jb21wbGV0aW9uIGZyb20gYnVzeWJveCwgCgkgIGhhY2tlZCB0aGVtIGEgbG90LCBjaGFuZ2VzIHRvIG5hbm9nZXRzdHIoKS4gIG5hbm9nZXRzdHIoKSBhbmQKCSAgc3RhdHVzcSgpIG5vdyB0YWtlIGFuIGFyZyBmb3Igd2hldGhlciBvciBub3QgdG8gYWxsb3cgdGFiCgkgIGNvbXBsZXRpb24uCgktIEZpeGVkIHZhbHVlIGJlaW5nIGlucHV0IGluIHN0YXR1c2JhciBkdXJpbmcgYSBzZWFyY2ggb3IgcmVwbGFjZQoJICBhbmQgQ0FTRV9TRU5TSVRJVkUgb3IgdGhlIG90aGVyIHNlYXJjaCBpcyBjYWxsZWQgYW5kIHRoZQoJICBzdHJpbmcgYmVpbmcgdHlwZWQgaW4gaXMgYmxvd24gYXdheS4gIFJlcG9ydGVkIGJ5IEtlbiBUeWxlci4KCS0gQ2hhbmdlZCBQSUNPX01TR1MgZmxhZyB0byBQSUNPX01PREUsIGNoYW5nZWQgaGVscCBzdHJpbmdzCgkgIGFjY29yZGluZ2x5LgotIGZpbGVzLmM6CiAgZG9fd3JpdGVvdXQoKQoJLSBDaGFuZ2Ugc3RyY3B5IHRvIGFuc3dlciB0byBtYWxsb2NzdHJjcHkuCi0gZ2xvYmFsLmMKCS0gTmV3IGdsb2JhbCByZXBsYWNlX2xpc3RfMiwgZm9yIDJuZCBoYWxmIG9mIHRoZSByZXBsYWNlIGRpYWxvZwoJICAoIlJlcGxhY2Ugd2l0aDoiKSwgaGFzIGZld2VyIG9wdGlvbnMgdGhhbiBmaXJzdCBoYWxmIGJlY2F1c2UKCSAgdGhleSB3ZXJlIGluYXByb3ByaWF0ZS4gIAogIHRvZ2dsZV9pbml0KCkKCS0gQWRkZWQgI2lmZGVmIGFyb3VuZCB0b2dnbGVfcmVnZXhfbXNnIHRvIGdldCByaWQgb2YgY29tcGlsZXIgCgkgIHdhcm5pbmcuCgotIG5hbm8uYzoKICBrZXlwYWRfb24oKQoJLSBOZXcgZnVuY3Rpb24sIHRvZ2dsZXMgdHVybmluZyB0aGUga2V5cGFkIG9uIGFuZCBvZmYgaW4gZWRpdCBhbmQKCSAgYm90dG9td2luKCkuICBBZGRlZCBjYWxsIHRvIHRoaXMgaW4gZmluaXNoKCksIGZpeGVzIGJ1ZyAjNDUuCi0gc2VhcmNoLmMKICBmaW5kbmV4c3RyKCkKCS0gTmV3IGFyZyBmb3IgYmVnaW5feCB2YXJpYWJsZSwgYmFzaWNhbGx5IGEgcmV3cml0ZSB0aGF0CgkgIG1ha2VzIGEgbGl0dGxlIG1vcmUgc2Vuc2UgYW5kIGlzbid0IHF1aXRlIGFzIG1lc3N5IChSb2NjbyBDb3JzaSkuCgktIFVwZGF0ZSB0aGUgbGluZSB3ZSdyZSBjaGVja2luZyBpZiBub3QgdGhlIHdob2xlIHNjcmVlbiwgYmVjYXVzZQoJICBpdCdzIHF1aXRlIHBvc3NpYmxlIHRoZSBzZWFyY2ggdGVhbSBjb3VsZCBleGlzdCBzb21ld2hlcmUgd2F5CgkgIHRvIHRoZSByaWdodCBvbiB0aGUgc2FtZSBsaW5lLCBmb3IgZXhhbXBsZS4KICByZXBsYWNlX2Fib3J0KCkKCS0gQWRkIHJlc2V0IG9mIHBsYWNld2V3YW50LCBzdG9wcyBjdXJzb3IgZnJvbSBqdW1waW5nIHdoZW4gbW92aW5nCgkgIGN1cnNvciBhZnRlciBhIHJlcGxhY2UuCiAgZG9fcmVwbGFjZSgpCgktIEFkZGVkIGNvZGUgZm9yIEdvdG9saW5lIGtleSBhZnRlciBlbnRlcmluZyB0aGUgc2VhcmNoIHRlcm0uCgkgIEZpeGVzIGJ1ZyAjNDYuCgktIFJlbW92ZWQgcmVkdW5kYW50IGNvZGUgaW52b2x2aW5nIHByb2Nlc3NpbmcgcmVwbGFjZW1lbmV0IHN0cmluZy4KCSAgQ29udmVydGVkIGlmIHN0YXRlbWVudHMgdG8gc3dpdGNoIHN0YXRlbWVudHMuCgktIE9wdGltaXphdGlvbnMgYnkgUm9jY28gQ29yc2kuCgktIFJlbW92ZWQgY29kZSBmb3IgZGVsZXRlZCBzaG9ydGN1dHMgZnJvbSBpbiByZXBsYWNlX2xpc3RfMi4KICBkb19zZWFyY2goKQoJLSBDb252ZXJ0ZWQgaWYgc3RhdGVtZW50cyB0byBvbmUgc3dpdGNoIHN0YXRlbWVudC4KLSB3aW5pby5jCiAgbmFub2dldHN0cigpCgktIEFkZGVkIGNoZWNrIGZvciAzNDMgaW4gd2hpbGUgbG9vcCB0byBnZXQgcmlkIG9mIGdldHRpbmcgImxvY2tlZCIKCSAgaW50byBzdGF0dXNiYXIiIGJ1ZyBpbiBvZGQgJFRFUk1zIGxpa2UgaXJpcy1hbnNpLgoJLSBDaGFuZ2VkIGNoZWNrIHRvIHJldHVybiAtMiBvbiAiZW50ZXIiIGZyb20gYW5zd2VyID09ICIiCgkgIHRvIGFuc3dlciA9PSBkZWYuCgktIEZpeGVkIGZhbGx0aHJvdWdoIGNvZGUgYmVjYXVzZSB0aGVyZSB3YXMgbm8gYnJlYWsuICBNYWtlIG11Y2gKCSAgbW9yZSBzZW5zZSBub3cuCgktIEFkZGVkIGNoZWNrIGZvciBBU0NJSSA1NFsxMjRdIHdoZW4gdXNpbmcgUERDVVJTRVMsIGlnbm9yZSB0aGVtCgkgIGlmIG5vdGljZWQuCiAgbmFub2dldF9yZXBhaW50KCkKCS0gTmV3IGZ1bmN0aW9uLCByZW1vdmVzIGFib3V0IDMwIGxpbmVzIG9mIGR1cGxpY2F0ZSBjb2RlIGluIAoJICBuYW5vZ2V0c3RyKCkuCgktIEJsYWNrIG1hZ2ljIGNvZGUgdG8gbWFrZSAkIGFwcGVhciBpbiBwcm9tcHQgaWYgd2UncmUgcGFzdAoJICBDT0xTLgogIGJsYW5rX2VkaXQoKQoJLSBSZW1vdmVkIHdyZWZyZXNoKCkgY2FsbCwgbXVjaCBsZXNzIGNob3BweSBub3cuICBJZiB0aGVyZSdzIGEgbmVlZAoJICBmb3IgYSB3cmVmcmVzaCBhZnRlciBhIHNwZWNpZmljIGNhbGwsIGxldCBtZSBrbm93LgotIGVzLnBvOgoJLSBVcGRhdGVkIHRyYW5zbGF0aW9uIGZvciAwLjkuMjAgKEpvcmRpKS4KICAKbmFubyAwLjkuMTkgLSAxMC8wMi8yMDAwCi0gR2VuZXJhbAoJLSBBZGRlZCBQREN1cnNlcyBzdXBwb3J0IHVuZGVyIGN5Z3dpbiwgd2hpY2ggYWxsb3dzIGJ1aWxkaW5nCgkgIGEgbmljZSBzdGFuZC1hbG9uZSBuYW5vLmV4ZSBmb3IgdGhvc2UgcG9vciBXaW5kb3dzIHVzZXJzLgoJICBFeHRyYSBjaGVjayBpbiBjb25maWd1cmUuaW4gZm9yIGluaXRzY3IoKSBpbiAtbGN1cnNlcyAoYXMKCSAgUERjdXJzZXMgaGFzIG5vIHRnZXRlbnQpLCBzb21lICNpZmRlZiBQRENVUlNFUyBzdGF0ZW1lbnRzCgkgIGluIG1haW4oKS4KCS0gQ2hhbmdlZCB3ZWIgc2l0ZSBhbmQgZW1haWwgdG8gbmV3IG5hbm8tZWRpdG9yLm9yZyBkb21haW4uCi0gbmFuby5jCgktIEFkZGVkIChpbnQpIGNhc3RzIHRvIHJlbW92ZSBjb21waWxlIHdhcm5pbmdzIHdpdGggLVdhbGwuCiAgbWFpbigpCgktIEFkZGVkIGNoZWNrIGZvciBfUE9TSVhfVkRJU0FCTEUgYXJvdW5kIHRlcm0gdmFyaWFibGUgZGVmaW5pdGlvbi4KLSBzZWFyY2guYwoJLSBBZGRlZCBpbml0aWFsaXphdGlvbnMgZm9yIGxhc3Rfc2VhcmNoIGFuZCBsYXN0X3JlcGxhY2UgKFJvY2NvIENvcnNpKQoKbmFubyAwLjkuMTggLSAwOS8xOC8yMDAwCi0gR2VuZXJhbAoJLSBDaGFuZ2VkIF9QT1NJWF9WRVJTSU9OIGNoZWNrcyBpbiByZWdleCBjb2RlIHRvIEhBVkVfUkVHRVhfSCwgCgkgIGFkZGVkIGNoZWNrIGZvciByZWdleC5oIGluIGNvbmZpZ3VyZS5pbi4KLSBjb25maWd1cmUuaW46CgktIEFkZGVkIGRlZmF1bHQgY2FzZSBmb3IgY3Jvc3MtY29tcGlsaW5nIHRvIGdldCByaWQgb2YgYW5ub3lpbmcKCSAgQUNfVFJZX1JVTiB3YXJuaW5nLgotIGN1dC5jOgogIGRvX2N1dF90ZXh0KCkKCS0gRG9uJ3QgaW1tZWRpYXRlbHkgYWJvcnQgaWYgd2UncmUgb24gZmlsZWJvdCBhbmQgdGhlIG1hcmtlciBpcwoJICBzZXQgKGZpeGVzIGJ1ZyAjNDIpLgotIGZpbGVzLmM6CiAgb3Blbl9maWxlKCkKCS0gRml4IGZvciBidWcgIzQ0IChSb2NjbyBDb3JzaSkuCi0gZ2xvYmFsLmM6CiAgc2hvcnRjdXRfaW5pdCgpCgktIEFkZGVkIGluIEZLRVlzIHRoYXQgZm9yIHNvbWUgcmVhc29uIHdlcmUgbGVmdCBvdXQuICAqYm9nZ2xlKgotIG5hbm8uYzoKICBtYWluKCkKCS0gQWRkZWQgY2hlY2sgZm9yIF9QT1NJWF9WRElTQUJMRSBhbmQgdXNlIHJhdyBtb2RlIGlmIG5vdAoJICBhdmFpbGFibGUsIGFsbG93cyBuYW5vIHRvIHdvcmsgd2l0aCBjeWd3aW4uCgktIEFkZGVkIGdldHRleHQgY2FsbHMgdG8gZW5hYmxlL2Rpc2FibGUgc3RyaW5ncyAoSm9yZGkpLgoJLSBSZXZhbXBlZCBhIGdyZWF0IGRlYWwgb2YgdGhlIEYta2V5IGFuZCBrZXlwYWQga2V5IGhhbmRsaW5nLAoJICBiZWNhdXNlIHdlIG5vdCBsb25nZXIgdXNlIGtleXBhZCgpIChzZWUgYmVsb3cpLgoJLSBSZW1vdmVkIGtleXBhZCgpIGNhbGwgYmVjYXVzZSBuYW5vIHdhcyBub3Qgd29ya2luZyB3aXRoIHRoZQoJICBrZXlwYWQgaW4gbWFueSB0ZXJtcywgd2hpY2ggaXMgdmVyeSBiYWQuCgktIE1hZGUgaW5zZXJ0IGtleSBjYWxsIGRvX2luc2VydGZpbGUoKS4KICBkb190b2dnbGUoKQoJLSBSZXdyb3RlIGZ1bmN0aW9uIHRvIGFsbG93IE5PSEVMUCB0b2dnbGUgdG8gd290ayBvbiBzeXN0ZW1zCgkgIHdpdGhvdXQgYSB3b3JraW5nIHJlc2l6ZXdpbigpLiAgTmV3IGZ1bmN0aW9uIHdpbmRvd19pbml0KCkuCiAgbW91c2VfaW5pdCgpCgktIEFkZCBrZXlwYWQgb25seSBpZiBtb3VzZSBzdXBwb3J0IGlzIG9uLCBvdGhlcndpc2UgbW91c2UgZG9lc24ndAoJICB3b3JrLiAgSSBndWVzcyB5b3UgaGF2ZSB0byBjaG9vc2UgYmV0d2VlbiBoYXZpbmcgdGhlIG1vdXNlIGFuZAoJICBoYXZpbmcgYSB3b3JraW5nIGtleXBhZCBmb3IgdGhlIHRpbWUgYmVpbmcgKHRoYW5rIGdvZCBmb3IgTWV0YS1tKS4KLSB3aW5pby5jOgogIHRvdGFsX3JlZnJlc2goKQoJLSBBZGRlZCB0aXRsZWJhcigpIGNhbGwuCiAgb25la2V5KCkKCS0gT2ZmIGJ5IG9uZSBlcnJvciBmaXggZml4IDstKSAoUm9jY28gQ29yc2kpLgoKLSBzZWFyY2guYzoKICBmaW5kbmV4dHN0cigpCgktIFJlc2V0IHN0YXJ0aW5nIGF0IGN1cnJlbnQgZm9yIHNlYXJjaCBpbnN0ZWFkIG9mIGJlZ2luLgotIGVzLnBvOgoJLSBUcmFuc2xhdGVkIG5ldyBzdHJpbmdzIGFuZCBtaW5vciB1cGRhdGVzIChKb3JkaSkuCi0gZGUucG8gCgktIFJldmlzZWQgdHJhbnNsYXRpb25zIGJ5IGZsb2tpQGJpZ2Zvb3QuY29tCgpuYW5vLTAuOS4xNyAtIDA5LzA0LzIwMDAKLSBHZW5lcmFsCgktIE5ldyBzaG9ydGN1dHMgdG8gdG9nZ2xlIGNlcnRhaW4gb3B0aW9ucyB0aGF0IGFyZSBub3JtYWxseSBvbmx5CgkgIGZsYWdzIHZpYSBBbHQvTWV0YS4gIFNlZSBBbHQtQyxFLEksSyxNLFAsWCxaLiAgTmV3IHN0cnVjdCBjYWxsZWQKCSAgdG9nZ2xlcyBpbiBuYW5vLmgsIHRvZ2dsZV9pbml0KCksIHRvZ2dsZV9pbml0X29uZSgpIGluIGdsb2JhbC5jCgkgIGNhbGxlZCBmcm9tIHNob3J0Y3V0X2luaXQoKSwgYW5kIGRvX3RvZ2dsZSBpbiBuYW5vLmMuICBBbHNvIAoJICBtb3ZlZCB0aGUgc2lnbmFsIGNvZGUgaW50byBhIHNlcGFyYXRlIGZ1bmN0aW9uIGluIG5hbm8uYyBjYWxsZWQKCSAgc2lnbmFsX2luaXQoKS4gIE1vdmVkICJzdHJ1Y3Qgc2lnYWN0aW9uIGFjdCJpbnRvIGEgc3RhdGljIGluCgkgIG5hbm8uYy4KCS0gQ2hhbmdlZCBmcm9tIEFsdC1rZXkgc3ltYm9sIChAKSB3aGljaCBpcyBjb21wbGV0ZWx5IG5vbnN0YW5kYXJkCgkgIHRvIHRoZSAqbml4ICJNZXRhIiBzeW1ib2wgKE0tKS4gIENoYW5nZWQgaGVscF9pbml0IHRvIHNob3cKCSAgdGhlIE0ta2V5IHVzYWdlIGFuZCB0aGUgaGVscCB0ZXh0IHRvIGV4cGxhaW4ga2V5cyB3aGNpaCBnZW5lcmF0ZQoJICBNZXRhLiAgTW92ZWQgdGhlIHRvZ2dsZSBNZXRhIGtleXN0cm9rZXMgdG8gdGhlIGZpcnN0IGNvbHVtbgoJICBpbnN0ZWFkIG9mIHRoZSB0aGlyZCBhcyB0aGV5IGFyZSB0aGUgcHJpbWFyeSBrZXlzdHJva2VzIGZvciB0aGUKCSAgZnVuY3Rpb25zLiAgVGhhbmtzIE1pbmkgZWRpdG9yIHRlYW0gOi0+CgktIENoYW5nZWQgbGFzdF9zZWFyY2ggYW5kIGxhc3RfcmVwbGFjZSB2YXJzIHRvIHN0YXRpY2FsbHkgCgkgIGFsbG9jYXRlZCAoaGVuY2UgbnVsbGVkKSBhbmQgbW92ZWQgdG8gc2VhcmNoLmMgKE1hdHQgS3JhYWkpLgotIGdsb2JhbC5jOgogIHRvZ2dsZV9pbml0KCkKCS0gQ2hhbmdlZCAiTm8gYXV0byB3cmFwIiBhbmQgIk5vIGhlbHAgbW9kZSIgdG8gIkF1dG8gd3JhcCIgYW5kIAoJICAiSGVscCBtb2RlIi4gU2VlIHRoZSBjaGFuZ2UgdG8gZG9fdG9nZ2xlKCkgYmVsb3cuCi0gbmFuby5jOgogIGRvX21vdXNlKCkKCS0gUGF0Y2ggZm9yIGhhbmRsaW5nIGxpbmVzIHcvdGFicyBhbmQgbW91c2UgYmV0dGVyIChCZW4gUm9iZXJ0cykuCiAgZG9fd3JhcCgpCgktIE1hZGUgd3JhcHBpbmcgY29kZSBsZXNzIGFtYml0aW91cy4KICBkb190b2dnbGUoKQoJLSBBZGRlZCBjaGVja3MgZm9yIG5vIGhlbHAgYW5kIG5vIHdyYXAgbW9kZSwgYW5kIHByaW50IG9wcG9zaXRlCgkgIGVuYWJsZS9kaXNhYmxlIG1lc3NhZ2UuCiAgZG9fc3VzcGVuZCgpLCBkb19jb250KCk6CgktIE5ldyBmdW5jdGlvbnMsIGhhbmRsZSBzdXNwZW5kIHNpZ25hbCBpbiBhIFBpY28tbGlrZSBtYW5uZXIgYW5kCgkgIHdvcmsgd2l0aCBNZXRhLVouCi0gd2luaW8uYzoKICB0b3RhbF9yZWZyZXNoKCkKCS0gQWRkZWQgZWRpdF9yZWZyZXNoKCkgY2FsbCB0byBhY3R1YWxseSB1cGRhdGUgdGhlIHNjcmVlbiBpZiBtZXNzeS4KICBlZGl0X3JlZnJlc2hfY2xlYXJvaygpCgktIE5ldyBmdW5jdGlvbiwgZG9lcyBhIHRvdGFsIHVwZGF0ZSBmb3IgZWRpdCByZWZyZXNoLCBuZWVkZWQgdG8gZml4CgkgIGxhY2sgb2YgcmV2ZXJzZWQgdGV4dCBvbiBzZWFyY2hpbmcgd2l0aCBNQVJLX0lTU0VULgogIG9uZWtleSgpCgktIE9mZiBieSBvbmUgZXJyb3IgZml4IChSb2NjbyBDb3JzaSkuCgogIHVwZGF0ZV9saW5lKCkKCS0gQWRkZWQgY2hlY2sgZm9yIGJpbmFyeSBkYXRhID49IDEgYW5kIDw9IDI2LCBhbmQgdXNlIF4rbGV0dGVyCgkgIHRvIGRpc3BsYXkgaXQuICAgU2hvdWxkIGZpeCBlZGl0aW5nIHRleHQgZmlsZXMgd2l0aCBiaW5hcnkKCSAgZGF0YSBpbiB0aGVtLiAgUGxhY2luZyBvZiB0aGUgY3Vyc29yIHNlZW1zIHRvIGJlIGEgYml0IHNjcmV3ZWQKCSAgdGhvdWdoLi4uCi0gc2VhcmNoLmM6CiAgc2VhcmNoX2Fib3J0KCkKCS0gTm93IGNhbGxzIGVkaXRfcmVmcmVzaF9jbGVhcm9rIHdoZW4gTUFSS19JU1NFVCB0byBoYW5kbGUgc2NyZWVuCgkgIHVnbGluZXNzIGJ1ZyAocmVwb3J0ZWQgYnkgS2VuIFR5bGVyKS4KICBmaW5kbmV4dHN0cigpOgoJLSBBZGRlZCByZXNldCBmb3IgcGxhY2V3ZXdhbnQgKEJlbiBSb2JlcnRzKS4KCS0gRml4ZWQgY2hlY2sgZm9yIHN0cmluZyB0aGF0IG9ubHkgb2NjdXJzIG9uIHRoZSBzYW1lIGxpbmUgZmFpbGluZwoJICAoZGlzY292ZXJlZCBieSBLZW4gVHlsZXIpLgoKbmFuby0wLjkuMTYgLSAwOC8wOS8yMDAwCi0gY3V0LmM6CiAgZG9fY3V0X3RleHQoKQoJLSBGaXhlZCBnZXR0aW5nIGxvY2tlZCBpbnRvIGN1dGJ1ZmZlciBvbiBjdXR0aW5nIGZpcnN0IGxpbmUgb2YgZmlsZS4KCS0gQWRkZWQgY2hlY2tfc3RhdGJsYW5rKCkuCgktIENoZWNrIGZvciBmaWxlcHRyID09IGZpbGVib3QsIGlmIHNvIHJldHVybiwgd2Ugc2hvdWxkbid0IGJvdGhlcgoJICBjdXR0aW5nIHRoZSBtYWdpYyBsaW5lLgogIGRvX3VuY3V0X3RleHQoKQoJLSBBZGRlZCBjaGVja19zdGF0YmxhbmsoKS4KLSBuYW5vLmM6CiAgbWFpbigpCgktIENoYW5nZWQgdGFic2l6ZSBsb25nIGFyZyB0byBhY3R1YWxseSBhY2NlcHQgYW4gYXJndW1lbnQgKnNpZ2gqLgotIHBvL01ha2VmaWxlLmluLmluOgoJLSBQYXRjaCB0byBoYW5kbGUgJERFU1RESVIgKG9yaWcgYnkgRGFuIEhhcm5ldHQgY29udHJpYnV0ZWQgYnkKCSAgQ2hyaXN0aWFuIFdlaXNnZXJiZXIpCi0gY29uZmlndXJlLmluOgoJLSBOZXcgKGFuZCBzZXZlcmFsbHkgcmV2aXNlZCA9KSBzbGFuZyB0ZXN0IGNvZGUgKEFsYmVydCBDaGluLUEtWW91bmcpCgpuYW5vLTAuOS4xNSAtIDA4LzAzLzIwMDAKLSBDaGFuZ2VkIGVkaXRfdXBkYXRlIGNhbGwgdG8gdGFrZSBhcmd1bWVudHMgVE9QLCBDRU5URVIgb3IgQk9UVE9NLgogIEFmZmVjdHMgbWFueSBtYW55IGZ1bmN0aW9ucy4gIFJlbW92ZWQgZnVuY3Rpb25zIGVkaXRfdXBkYXRlX3RvcCBhbmQKICBlZGl0X3VwZGF0ZV9ib3QuCi0gQWRkZWQgZ2xvYmFsIHZhcmlhYmxlIHRhYnNpemUsIHdlIG5vIGxvbmdlciBzY3JldyB3aXRoIHRoZSBjdXJzZXMKICBsaWJyYXJ5IGluIG9yZGVyIHRvIGltcGxlbWVudCAtVCAoc3VnZ2VzdGVkIGJ5IENocmlzdGlhbiBXZWlzZ2VyYmVyKS4KLSBjb25maWd1cmUuaW46CgktIEZpbmFsbHkgZml4ZWQgY2hlY2sgZm9yIHNsYW5nIHRvIHJlcG9ydCAibm8iIGlmIG5vdCBjYWxsZWQKCSAgd2l0aCAtLXdpdGgtc2xhbmcgb3IgLS13aXRob3V0LXNsYW5nCi0gbmFuby5jOgogIHNwbGljZV9ub2RlKCkKCS0gTmV3IGZ1bmN0aW9uLCBhYnN0cmFjdHMgbGlua2luZyBpbiBub2Rlcy4gICBGaXhlcyBidWcgIzM2LgogIG51bGxfYXQoKQoJLSBOZXcgZnVuY3Rpb24sIG51bGxzIGEgc3RyaW5nIGF0IGEgZ2l2ZW4gaW5kZXggYW5kIHJlYWxpZ25zIGl0LgogIGRlbGV0ZV9idWZmZXIoKQoJLSBSZW1vdmVkLCBzYW1lIGFzIGZyZWVfZmlsZXN0cnVjdCgpLgogIGRvX2JhY2tzcGFjZSgpCgktIE5vdyBjYWxscyBwYWdlX3VwX2NlbnRlciBpbnN0ZWFkIG9mIHBhZ2VfdXAgKGFzIGl0IHNob3VsZD8pCiAgZG9fZW50ZXIoKQoJLSBGaXhlZCB0eXBvICg/KSBpbiBjaGVjayBmb3IgaW5wdHItPm5leHQuICBDYXVzZWQgbG90cyBvZgoJICBncmllZiBmb3IgZWRpdGluZyBsaW5lcyBhdCBmaWxlYm90LgogIG1haW4oKQoJLSBSZW1vdmVkIG5vdyB1c2VsZXNzIHVzcnRhYnNpemUgdmFyaWFibGUgKENocmlzdGlhbiBXZWlzZ2VyYmVyKS4KLSBzZWFyY2guYzoKICByZXBsYWNlX2Fib3J0KCkKCS0gcmVkdW5kYW50LCBub3cganVzdCBjYWxscyBzZWFyY2ggYWJvcnQgdW50aWwgaXQgZG9lcyBzb21ldGhpbmcKCSAgZGlmZmVyZW50LiAgCi0gd2luaW8uYzoKICBlZGl0X3JlZnJlc2goKQoJLSBBZGRlZCBjaGVjayBmb3IgY3VycmVudCBsaW5lICJydW5uaW5nIiBvZmYgdGhlIHNjcmVlbi4KCSAgSG9wZWZ1bGx5IHRoaXMgd2lsbCBub3QgY2F1c2UgYW55IHJlY3Vyc2l2ZSBsb2NrdXBzLgoJICAoV2hvIGFtIEkga2lkZGluZywgb2YgY291cnNlIGl0IHdpbGwhKQoJLSBBZGRlZCBjaGVjayB0byBzdG9wIGluZmluaXRlIGxvb3AgY2FsbGluZyBlZGl0X3VwZGF0ZS4KICBlZGl0X3VwZGF0ZSgpCgktIFJld3JpdHRlbiwgaG9wZWZ1bGx5IHRoaXMgd2lsbCByZW1vdmUgYSBsb3Qgb2YgdGhlCgkgIHNjcm9sbGluZyB0aGUgY3Vyc29yIGJhY2sgYW5kIGZvcnRoIG5lZWRsZXNzbHkuCi0gbW92ZS5jOgogIHBhZ2VfZG93bigpCgktIGRvIGFuIGVkaXRfdXBkYXRlKCkgYXQgbGFzdCBjYXNlLiAgTWFkZSBmdW5jdGlvbiBtb3JlIGxpa2UKCSAgUGljbydzIHZlcnNpb24sIG9ubHkgbW92ZSBkb3duIHRvIHR3byBsaW5lcyBiZWZvcmUgZWRpdGJvdC4KICBwYWdlX3VwKCkKCS0gTWFkZSBmdW5jdGlvbiBtb3JlIGxpa2UgUGljbydzIHZlcnNpb24sIG9ubHkgbW92ZSBkb3duIHRvIHR3bwoJICBsaW5lcyBhZnRlciBlZGl0dG9wLgoKbmFuby0wLjkuMTQgLSAwNy8yNy8yMDAwCi0gbmFuby5oOgoJLSBTZXQgQ1VUX1RPX0VORCB0byBhIGRpZmZlcmVudCBiaXQgdGhhbiBURU1QX09QVC4gIEZpeGVzIGJ1ZyAjMzIuCi0gY3V0LmM6CiAgZG9fY3V0X3RleHQoKQoJLSBBZGRlZCBjaGVjayBmb3IgTUFSS19JU1NFVCB3aGVuIHVzaW5nIENVVF9UT19FTkQuICBGaXhlcyBidWcgIzMxLgoJLSBTaW1wbGlmaWVkIGNoZWNrIGZvciBmcmVlaW5nIGN1dGJ1ZmZlci4gIEFkZGVkIGNoZWNrcyBmb3IgZG9pbmcKCSAgbXVsdGlwbGUgY3V0cyB3aXRoIC1rLCBub3cgc2V0cyBtYXJrZWRfY3V0IHRvIDIgZm9yIGxhdGVyCgkgIHByb2Nlc3NpbmcgYnkgZG9fdW5jdXRfdGV4dCgpLgogIGRvX3VuY3V0X3RleHQoKQoJLSBBZGRlZCBoYW5kbGVyIGZvciB1bmN1dHRpbmcgd2l0aCAtayBjdXRzLgotIGZpbGVzLmM6CiAgd3JpdGVfZmlsZSgpCgktIFJlbW92ZWQgKHJlZHVuZGFudCkgY2hlY2sgZm9yIHdyaXRpbmcgb3V0IGZpbGVzIHdpdGggLXQuCiAgZG9fd3JpdGVvdXQoKQoJLSBDaGFuZ2VkIGNoZWNrIGZvciBmaWxlbmFtZSB0byBmaWxlbmFtZVswXS4gIEFkZGVkIHNvbWUgY29kZSwgCgkgIG92ZXJhbGwgZml4ZXMgYnVnICMzMCA9LSkKLSBuYW5vLmM6CiAgZG9fanVzdGlmeSgpICYgZG9fd3JhcCgpOgoJLSB0b3RzaXplLXJlbGF0ZWQgZml4ZXMgKFJvYikKLSBkZS5wbyAKCS0gUmV2aXNlZCB0cmFuc2xhdGlvbnMgYnkgZmxva2lAYmlnZm9vdC5jb20KCm5hbm8tMC45LjEzIC0gMDcvMjMvMjAwMAotIEltcGxlbWVudGVkIFBpY28ncyAtayBtb2RlLiAgTmV3IGZsYWcgQ1VUX1RPX0VORCwgb3B0aW9uICgtaywgLS1jdXQpLCAKICBhZmZlY3RzIGRvX2N1dF90ZXh0IGluIGN1dC5jLiAgTm90IGF2YWlsYWJsZSB3aXRoIFNNQUxMX05BTk8gYmVjYXVzZSBpdAogIGRlcGVuZHMgb24gdGhlIG1hcmtlciBjb2RlIHdoaWNoIGlzIG5vdCBhdmFpbGFibGUgd2l0aCB0aGF0IHNldHRpbmcuCi0gQ2hhbmdlZCBzdGF0aWMgdGVtcF9vcHQgdG8gZmxhZyBURU1QX09QVC4gIEZpeGVkIGJ1ZyAjMjkgKHVzaW5nCiAgLXQgd2l0aCBhbiB1bndyaXRhYmxlIGZpbGUgY2F1c2VzIHVzZXJzIHRvIGdldCBsb2NrZWQgaW50byBlZGl0b3IpLgotIG1vdmUuYwogIHBhZ2VfZG93bigpCgktIERvbid0IGVkaXRfcmVmcmVzaCgpIGlmIHRoZSBib3R0b20gb2YgdGhlIGZpbGUgaXMgaW4gdGhlIGVkaXQKCSAgYnVmZmVyLiAoQWRhbSkKLSBuYW5vLmM6CiAgbWFpbigpOgoJLSBUQUJTSVpFIG5vdyBzZXQgYmVmb3JlIGZpcnN0IGNhbGwgdG8gZWRpdF9yZWZyZXNoIChCaWxsIFNvdWRhbikKCS0gRGlmZmVyZW50IF5DIGtpbGwgY29kZSAocGF0Y2ggYnkgQ2hyaXN0aWFuIFdlaXNnZXJiZXIpLgogIGRpZSgpOgoJLSBNb3JlIGludGVsbGlnZW50IGVtZXJnZW5jeS1zYXZlIGZpbGVuYW1lIHNlbGVjdGlvbiAoUm9iKQogIGRvX3NwZWxsKCk6CgktIENoYW5nZWQgZXhpdCBzZW1hbnRpbmNzIGEgYml0IHNvIHRoYXQgYXNwZWxsIHdvdWxkbid0IGdldAoJICBhbGwgc2NyZXd5IChidWcgZGlzb3ZlcmVkIGJ5IEpvc2h1YSBKZW5zZW4uCi0gZmlsZXMuYzoKICByZWFkX2ZpbGUoKToKCS0gQWRkZWQgaW5pdCBvZiBidWYgdmFyaWFibGUsIGhvcGVmdWxseSB0aGlzIHdpbGwgc3RvcCB0aGUgCgkgICJibGVlZGluZyIgb2YgdGV4dCBzZWVuIHdpdGggbXV0dCBhbmQgdXNpbmcgaTE4bi4KICB3cml0ZV9maWxlKCk6CgktIEFkZGVkIGNvZGUgdG8gY2hlY2sgdG8gc2VlIGlmIHVzaW5nIC1sIGFuZCB0aGUgZmlsZSBpcyBub3QKCSAgaW4gZmFjdCBhIGxpbmsuICBUaGlzIHNob3VsZCBmaXggdGhlIGJlaGF2aW9yIHdoZXJlIGEgZmlsZQoJICB0aGF0IGRvZXMgbm90IGhhdmUgd3JpdGUgcGVybWlzc2lvbiBidXQgY291bGQgYmUgcmVtb3ZlZCBhbmQKCSAgcmV3cml0dGVuIGlzIHNhdmVkIHdpdGhvdXQgZXJyb3IuICBQbGVhc2UgdGVzdCB0aGlzIGZlYXR1cmUKCSAgYW5kIGdpdmUgZmVlZGJhY2suCi0gc2VhcmNoLmM6CiAgc2VhcmNoX2luaXQoKToKCS0gQWRkZWQgIiAodG8gcmVwbGFjZSkiIHN0YXRlbWVudCB0byBlbmQgb2Ygc2VhcmNoIHN0cmluZyBpZiAKCSAgd2UgYXJlIGRvaW5nIGEgcmVwbGFjZS4gIE1hbnVhbGx5IGNvbnZlcnRlZCBhbGwgdGhlIHRyYW5zbGF0aW9ucwoJICBmcm9tICclcycgdG8gJyVzJXMnIHRvIGVuc3VyZSB0aGV5IHN0aWxsIHdvcmsgd2l0aCB0aGUgbmV3IGNvZGUuCgkgIEFsc28gcHV0IGluIHRoZSB0cmFuc2xhdGlvbiBmb3IgIiAocmVwbGFjZSkiIGluIHRoZSAucG8ncy4gIEhvcGUKCSAgSSBkaWRuJ3Qgc3RlcCBvbiB5b3VyIHRvZXMgZG9pbmcgdGhpcyBKb3JkaS4gKENocmlzKQogIGRvX3NlYXJjaCgpLCBkb19yZXBsYWNlKCk6CgktIFJlbW92ZWQgY2FsbCB0byBzZWFyY2hfYWJvcnQoKS9yZXBsYWNlX2Fib3J0KCkgYmVmb3JlIGNhbGwgdG8KCSAgdGhlIG9wcG9zaXRlIGZ1bmN0aW9uLgoJLSBGaXhlZCBidWcgIzI4LgogIGZpbmRuZXh0c3RyKCkKCS0gZG8gbm90IGNlbnRlciBzdHJpbmcgZm91bmQgaWYgaXQgaXMgY3VycmVudGx5IHZpc2FibGUuIChBZGFtKQotIGZyLnBvOgoJLSBGcmVuY2ggdXBkYXRlIGJ5IENsZW1lbnQgTGFmb3JldCA8Y2xlbV9sYWZAd2FuYWRvby5mcj4uCi0gZXMucG86CgktIFVwZGF0ZWQgc3RyaW5ncyB0byAwLjkuMTMgKEpvcmRpKS4KCm5hbm8tMC45LjEyIC0gMDcvMDcvMjAwMAotIGFsbDoKCS0gTmV3IHJlZ2V4cCBzZWFyY2ggZmVhdHVyZSBieSBCaWxsIFNvdWRhbi4gIE5ldyBmbGFncyBVU0VfUkVHRVhQCgkgIGFuZCBSRUdFWFBfQ09NUElMRUQsIG5ldyBmdW5jdGlvbnMgcmVnZXhwX2luaXQsIHJlZ2V4cF9jbGVhbnVwCgkgIHJlcGxhY2VfbGluZSwgcmVwbGFjZV9yZWdleHAgaW4gc2VhcmNoLmMsIGNoYW5nZXMgdG8KCSAgc2VhcmNoX2luaXQoKSBhbmQgZG9fcmVwbGFjZSgpIGFuZCBzdHJzdHJ3cmFwcGVyKCkuIAoJLSBBZGRlZCBfUE9TSVhfVkVSU0lPTiBjaGVjayB0byByZWdleHAgY29kZS4gIEJldHRlciB0aGFuIG5vdGhpbmcKCSAgZm9yIG5vbi1QT1NJWCBzeXN0ZW1zLi4uCgktIE1hZGUgc2VhcmNoIGZ1bmN0aW9ucyAmIGtleXMgbW9yZSBsaWtlIFBpY28uICBBZGRlZCBnb3RvIGxpbmUgZnJvbSAgCgkgIHNlYXJjaCBhbmQgcmVwbGFjZSBmdW5jdGlvbiwgY2hhbmdlZCB3b3JkaW5nIHRvICJObyBSZXBsYWNlIiBpbnN0ZWFkCgkgIG9mICJUbyBTZWFyY2giLCAiVG8gUmVwbGFjZSIgdG8gc2ltcGx5ICJSZXBsYWNlIiwgYW5kIGNoYW5nZWQgdG8KCSAgUGljbydzIGtleXN0cm9rZSBieSBkZWZhdWx0LCBeUi4gQWZmZWN0cyBzZWFyY2hfaW5pdCgpLAoJICBkb19zZWFyY2goKSBpbiBzZWFyY2guYywgZ2xvYmFscyBpbiBuYW5vLmggYW5kCgkgIHNob3J0Y3V0X2luaXQoKSBpbiBnbG9iYWwuYy4KCS0gY2hhbmdlZCAnc3ByaW50ZicgY2FsbHMgdG8gc2FmZXIgJ3NucHJpbnRmJyAoUm9iKQotIGN1dC5jCgktIGZ1cnRoZXIgdG90c2l6ZSB1cGRhdGUgY29ycmVjdGlvbnMKLSBmaWxlcy5jOgoJLSBjaGFuZ2VkIGRvX2luc2VydGZpbGUgdG8gY2FsbCBmaXhfZWRpdGJvdCAoUm9iKQoJLSBNYWdpYyBMaW5lIGNvZGUgaW4gcmVhZF9maWxlIChSb2IpCi0gbmFuby5jOgoJLSBSZW1vdmVkIGR1YWwgYWx0X3NwZWxsZXIgdmFyaWFibGVzLCBvb3BzISAoUm9jY28gQ29yc2kpCgktIFJlbW92ZWQgdW5uZWNlc3NhcnkgZG9fb2xkc3BlbGwgZnVuY3Rpb24gKFJvY2NvIENvcnNpKS4gIEFkZGVkCgkgIFNNQUxMX05BTk8gI2lmZGVmIGFyb3VuZCBhY3R1YWwgc3BlbGwgZnVuY3Rpb24uCgktIE1vdmVkIHBhZ2VfdXAoKSB0byBtb3ZlLmMgd2hlcmUgaXMgYmVsb25ncy4KCS0gQ29ycmVjdGVkIEZJWE1FIGluIGRvX2VudGVyIHdpdGggZXhwbGFuYXRpb24uIChSb2IpCgktIEZpeGVkIEZJWE1FIGluIGRvX2p1c3RpZnksIHJlc3VsdGVkIGluIGNyZWF0aW9uIG9mCgkgIGZpeF9lZGl0Ym90IFthbHNvIGZpeGVkIGluIGRvX2VudGVyXSAod2luaW8uYykgKFJvYikKICBoZWxwX2luaXQoKToKCS0gTW92ZWQgbmV3bGluZSBvdXQgb2YgaWYgc3RhdGVtZW50IChSb2NjbyBDb3JzaSkKICBkb19jaGFyKCk6CgktIE1hZ2ljIExpbmUgcmVsYXRlZCBjb2RlIGluIGRvX2NoYXIgKFJvYikKICBkb19iYWNrc3BhY2UoKSwgZG9fZGVsZXRlKCk6CgktIEFkZGVkIG1hZ2ljIGxpbmUgY29kZSBoZXJlIHRvby4KCi0gZGUucG86CgktIFJldmlzZWQgdHJhbnNsYXRpb25zIGJ5IGZsb2tpQGJpZ2Zvb3QuY29tLgotIGZpLnBvOgoJLSBGaW5uaXNoIHRyYW5zbGF0aW9uIGJ5IHBhdWxpLnZpcnRhbmVuQHNhdW5hbGFodGkuZmkuCi0gdXRpbHMuYzoKCS0gQWRkZWQgbmV3X21hZ2ljbGluZSgpCi0gd2luaW8uYzoKCS0gQWRkZWQgc3RkbGliLmggdG8gaW5jbHVkZXMsIGZvdW5kIGJ5IE9wZW5CU0QgZ2NjLgoJLSBsb3RzIG9mIG5ldyBjb21tZW50aW5nIGFyb3VuZCBkaXNwbGF5IGZ1bmN0aW9ucwogIGRvX3llc25vKCksIG5hbm9nZXRzdHIoKToKCS0gUmVtb3ZlZCBub3cgdW5uZWNlc3NhcnkgcmF3L2NicmVhayBjb21ib3MuCgktIFJlbW92ZWQgZ2V0dGV4dCBjYWxscyBmcm9tICJZKGVzKSIsICJOKG8pIiwgIkEobGwpIiBhbmQgIl5DIiwgdGlsbAoJICB3ZSBkZWNpZGUgaWYgdGhvc2Uga2V5YmluZGluZ3Mgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuIChKb3JkaSkKICBjbGVhcl9ib3R0b213aW4oKToKCS0gUmVtb3ZlZCB3cmVmcmVzaChlZGl0KSBjYWxsLgogIGVkaXRfdXBkYXRlX3RvcCgpOgoJLSBGaXhlZCBhIGJ1ZyB0aGF0IGNhdXNlZCBuYW5vIHRvIG5vdCB1cGRhdGUgd2hlbgoJICBjdXJyZW50LT5uZXh0ID09IE5VTEwgKGUuZy4gcGFnaW5nIGRvd24gdG8gdGhlIHZlcnkgYm90dG9tIG9mIAoJICBBQk9VVCBOTFMgd291bGRuJ3Qgd29yaykuCiAgZml4X2VkaXRib3Q6CgktIEFkZGVkIChzaG91bGQgcmVidWlsZCBlZGl0Ym90IGZyb20gYSB2YWxpZCBlZGl0dG9wKSAoUm9iKQogIGVkaXRfYWRkOgoJLSByZW1vdmFsIG9mIHJlZHVuZGFudCBjYWxsIHRvIG12d2FkZG5zdHIKCm5hbm8tMC45LjExIC0gMDYvMjAvMjAwMAotIE5ldyBmbGFnICItVCIgb3IgIi0tdGFic2l6ZSIgdG8gc3BlY2lmeSBob3cgdG8gZGlzcGxheSB0YWIgd2lkdGhzLgogIEFmZmVjdHMgbWFpbigpIGluIG5hbm8uYywgc3RybGVucHQoKSwgeHB0KCkgYW5kIGFjdHVhbF94KCkgKGV0IGFsKSBpbiAKICB3aW5pby5jLCBhbmQgbmFuby5oLiAgTWFueSBoYXJjb2RlZCAiOCJzIGhhdmUgYmVlbiBjaGFuZ2VkIHRvIHRoZSAKICBUQUJTSVpFIGludC4gIEFkZGVkIGNoYW5nZXMgdG8gbmFuby4xIGFuZCBuYW5vLjEuaHRtbC4KLSBpZC5wbzoKCS0gSW5kb25lc2lhbiB0cmFuc2xhdGlvbiBieSBUZWRpIEhlcml5YW50by4KLSBlcy5wbzoKCS0gVXBkYXRlZCB0cmFuc2xhdGlvbiAoSm9yZGkgTWFsbGFjaCkuCi0gd2luaW8uYwogICAgICAgIC0gUmV3cml0ZSBvZiBkaXNwbGF5IGZ1bmN0aW9ucyB0byBjb3JyZWN0IHRoZSBkaXNwbGF5IHByb2JsZW1zIAoJICB3ZSBoYWQgYmVlbiBzZWVpbmcuIEFmZmVjdHM6IGFkZF9tYXJrZWRfc2FtZWxpbmUsIGVkaXRfYWRkLAoJICBhbmQgbWFueSBvdGhlcnMuIChSb2IgU2llbWJvcnNraSkKCS0gdG90c2l6ZSBmaXhlcyAoUm9iIFNpZW1ib3Jza2kpCiAgdG90YWxfcmVmcmVzaCgpOgoJLSBDdXQgZGlzcGFseV9tYWluX2xpc3QgY2FsbCwgYXMgdGhpcyBmdW5jdGlvbiBpcyBvbmx5IHN1cHBvc2VkIHRvIHJlZnJlc2gKCSAgd2hhdCdzIGFscmVhZHkgb24gdGhlIHNjcmVlbiwgbm90IGdvIHRocm91Z2ggdGhlIHByb2Nlc3Mgb2YgYWRkaW5nIHRoZQoJICB0ZXh0IGFnYWluLgotIGN1dC5jOgoJLSB0b3RzaXplIGZpeGVzIChSb2IgU2llbWJvcnNraSkKLSBuYW5vLmM6CgktIGV4cGVyaW1lbnRhbCBkb193cmFwIGFuZCBjaGVja193cmFwIChBZGFtIFJvZ295c2tpKQoJLSBSZW1vdmVkIGVkaXR3aW5lb2IsIGFzIGl0IHdhcyByZWR1bmRhbnQgZm9yIChlZGl0d2lucm93cyAtIDEpLgoJICBDaGFuZ2VkIGFsbCBjYWxscyB0byBlZGl0d2lucm93cyAtIDEgaW4gbmFuby5jIGFuZCBtb3ZlLmMuCgktIFJlbW92ZWQgYWxsIGZ1bmN0aW9ucyB0aGF0IHdlcmUgc3BsaXQgaW50byBvdGhlciBmaWxlcy4KCSAgQWZmZWN0cyBMT1RTIG9mIGZ1bmNzLgogIGRvX2VudGVyKCk6CiAgICAgICAgLSBBZGRlZCByZXNldCBvZiBwbGFjZXdld2FudCB0byBlbmQuCiAgZG9faW5zZXJ0ZmlsZSgpOgoJLSBGaXggZGlzcGxheSBwcm9ibGVtIHdoZW4gdXNpbmcgY3RybC1yIHRvIGxvYWQgYSBmaWxlCgkgIGludG8gdGhlIGJ1ZmZlciAoUm9iIFNpZW1ib3Jza2kpCiAgaGFuZGxlX3NpZ3dpbmNoKCk6CgktIEFkZGVkIHRpdGxlYmFyKCksIGVkaXRfcmVmcmVzaCgpIGFuZCBkaXNwbGF5X21haW5fbGlzdCgpIGNhbGxzIGJlY2F1c2UKCSAgYSByZXNpemUgd2Fzbid0IHBpY2tpbmcgdXAgb24gcG9zc2libGUgZGlmZmVyZW50IHdpZHRoIGNvcnJlY3RseS4KLSB1dGlscy5jOgoJLSBNb3ZlZCBubWFsbG9jKCkgYW5kIG5yZWFsbG9jKCkgaGVyZS4KLSBtb3ZlLmM6CgktIE5ldyBmaWxlLCBjb250YWlucyBtb3ZlbWVudCBmdW5jdGlvbnMgKGxpa2UgZG9faG9tZSgpLCBkb191cCgpLAoJICBkb19kb3duKCksIHBhZ2VfdXAoKSwgZXRjLi4uKS4KLSBmaWxlcy5jOgoJLSBDb250YWlucyBmdW5jdGlvbnMgZm9yIGZpbGVzIChyZWFkX2ZpbGUsIGluc2VydF9maWxlLAoJICBkb193cml0ZW91dCgpLCBldGMpLgotIHNlYXJjaC5jOgoJLSBDb250YWlucyBhbGwgb3VyIHNlYXJjaGluZyBhbmQgcmVsYXRlZCBmdW5jdGlvbnMsIChkb19zZWFyY2goKSwKCSAgZmluZG5leHRzdHIoKSwgZG9fcmVwbGFjZSgpLCBkb19nb3RvbGluZSgpKS4KCm5hbm8tMC45LjEwIC0gMDYvMDQvMjAwMAotIGVzLnBvOgoJLSBUcmFuc2xhdGlvbiB1cGRhdGVzIChKb3JkaSkuCi0gQVVUSE9SUywgbmFuby4xLmh0bWwsIFRPRE8sIFJFQURNRToKCS0gRG9jdW1lbnRhdGlvbiBhbmQgZW1haWwgYWRkcmVzcyB1cGRhdGVzIChKb3JkaSkuCi0gbmFuby5jOgogIG1haW4oKToKCS0gTW92ZWQgQWRhbSdzIHRlcm1pbyBjb2RlIGRvd24gdG8gYWZ0ZXIgZ2V0b3B0KCkgYW5kIGJlZm9yZSBpbml0c2NyKCkKCSAgdG8gc3RvcCBwZW9wbGUgbG9zaW5nIHRoZWlyIFNJR0lOVCBjaGFyYWN0ZXIgd2hlbiB1c2luZyBhcmdzIHRoYXQKCSAgZXhpdCBuYW5vIGJlZm9yZSBpdCBydW5zICgtLXZlcnNpb24sIC0taGVscCwgZXRjKS4KCm5hbm8tMC45LjkgLSAwNS8zMS8yMDAwCi0gTWFrZWlsZS5hbToKCS0gQWRkZWQgcHJvcGVyIGxpbmVzIGZvciBkZWZpbmluZyBMT0NBTEVESVIuCi0gY29uZmlndXJlLmluOgoJLSBTcGVsbGluZyBmaXhlcyAoSm9yZGkgTWFsbGFjaCkKCS0gUmVtb3ZlZCBDRkxBR1MgY2hhbmdlcyBmb3IgZ2NjLCByZWR1Y2VzIHBvcnRhYmlsaXR5IGFjY29yZGluZyB0bwoJICBzb21lLCBhbmQgaXQgY2VydGFpbmx5IGRvZXNuJ3Qgc2VlbSB0byBkZWNyZWFzZSBleGUgc2l6ZS4KLSBlcy5wbzoKCS0gU3BhbmlzaCByYW5zbGF0aW9uIHVwZGF0ZXMgKEpvcmRpIE1hbGxhY2gpCi0gUE9URklMRVMuaW46CgktIEFkZGVkIGdsb2JhbC5jIGZpbGUsIHdhcyBzY3Jld2luZyB1cCB0cmFuc2xhdGlvbnMgKGkuZS4gdGhleQoJICB3ZXJlbid0IGdldHRpbmcgZG9uZSkuCi0gY3V0LmM6CiAgYWRkX3RvX2N1dGJ1ZmZlcigpOgoJLSBBZGRlZCB0b3RzaXplIGluY3JlbWVudC4KCS0gQ3V0IGZpeGVzIGFuZCBvcHRpbWl6YXRpb25zIChSb2IgU2llbWJvcnNraSkuCiAgZG9fdW5jdXRfdGV4dCgpOgoJLSBBZGRlZCB0b3RzaXplIGluY3JlbWVudCBpbiBzZXZlcmFsIHBsYWNlcy4KLSBuYW5vLmM6CiAgaGVhZGVyczoKCS0gUmVtb3ZlZCBMT0NBTEVESVIgZGVmaW5lLgogIGRvX2p1c3RpZnkoKToKCS0gQWRkZWQgZWRpdF9yZWZyZXNoKCkgY2FsbCAoYnVnIGRpc2NvdmVyZWQgYnkgQWRhbSkuCiAgcGFnZV9kb3duX2NlbnRlcigpOgoJLSBBZGRlZCBjYWxsIHRvIGVkaXRfdXBkYXRlKGN1cnJlbnQpIGZvciBsYXN0IGNhc2UuICBSZW1vdmVkIAoJICBpbmNyZW1lbnQgb2YgY3VycmVudF95IHNpbmNlIGl0J3Mgbm93IGp1c3Qgd2FzdGVmdWwuCiAgZG9fZW50ZXIoKToKCS0gQWRkZWQgdG90c2l6ZSBpbmNyZW1lbnQuCiAgcmVudW1iZXIoKSwgcmVudW1iZXJfYWxsKCk6CgktIFJlbW92ZWQgdG90c2l6ZS0tIGFuZCB0b3RzaXplIGluaXQgaW4gcmVudW1iZXJfYWxsLgogIGRvX21vdXNlKCk6CgktIEFkZGVkIGVkaXRfcmVmcmVzaCgpIGNhbGwgdG8gc2hvdyBoaWxpZ2h0IHVwZGF0ZXMuICBSZW1vdmVkCgkgIHVubmVjZXNzYXJ5IHdyZWZyZXNoKGVkaXQpLgogIG1haW4oKToKCS0gTW92ZWQgdXAgbG9jYWxlIGNhbGxzIHNvIHRoYXQgdHJhbnNsYXRlZCAtLWhlbHAgbWVzc2FnZXMgd291bGQKCSAgYWN0dWFsbHkgZ2V0IHRyYW5zbGF0ZWQuCiAgZG9fYmFja3NwYWNlKCksIGRvX2RlbGV0ZSgpOgoJLSBBZGRlZCBkZWNyZW1lbnQgb2YgdG90c2l6ZS4KICBpbml0X2hlbHBfbXNnKCk6CgktIE5ldyBmdW5jdGlvbiwgaW5pdGlhbGl6ZXMgaGVscCB0ZXh0IGlmIE5BTk9fU01BTEwgaXNuJ3Qgc2V0IChmaXhlcwoJICBicm9rZW4gaTE4bikuCiAgcmVhZF9maWxlKCk6CgktIG1hbGxvYyBjYWxsIGNoYW5nZWQgdG8gbm1hbGxvYyAoUm9iIFNpZW1ib3Jza2kpLgotIHdpbmlvLmM6CiAgdG90YWxfcmVmcmVzaCgpOgoJLSBDb21wbGV0ZWx5IHJld3JvdGUgZnVuY3Rpb24sIG5vdCBxdWl0ZSBzbyBicmFpbmRhbWFnZWQgbm93LgoKbmFuby0wLjkuOCAtIDA1LzE4LzIwMDAKLSBuYW5vLmM6CiAgbWFpbigpOgoJLSBBZGRlZCBhd2Vzb21lIGNvZGUgdGhhdCBkaXNhYmxlcyB0aGUgQ0lOVFIgYW5kIENRVUlUIAoJICBjaGFyYWN0ZXIgKEFkYW0gUm9nb3lza2kpLiAgUmVtb3ZlZCByYXcoKS9ub3JhdygpIGNhbGxzIHNvIHRoYXQKCSAgbmFubyBnZXRzIGlucHV0IGluICdub3JtYWwnIG1vZGUsIHdoaWNoIGlzIHRoZSBSaWdodCBXYXkodG0pIHRvCgkgIGRvIGl0LiBeUywgXlogYW5kIF5RIG5vdyB3b3JrIHByb3Blcmx5IGFzIGEgcmVzdWx0LCBhcyB3ZWxsIGFzCgkgIF5DLiAgTmV3IHZhcmlhYmxlIHRlcm0sIGdsb2JhbCBiYXJpYWJsZSBvbGR0ZXJtIHRvIHNhdmUgcHJldmlvdXMKCSAgdGVybSBzZXR0aW5ncywgYW5kIGNoYW5nZXMgdG8gZmluaXNoKCkgYW5kIGRpZSgpLgoJLSBBZGRlZCBleHRyYSAjaWZkZWZzIGluIGdldG9wdCBjb2RlLCBzbyB0aGF0IGFib3ZlIGNvZGUgYW5kCgkgIGZsYWcgaW5pdCBpcyBydW4gZXZlbiBpZiBHRVRPUFRfTE9ORyBpcyBub3QgI2RlZmluZWQuCgktIEFkZGVkIG1lbXNldCBsaW5lIGJlZm9yZSBzaWdhY3Rpb25zLiAoQWRhbSBSb2dveXNraSkKICBkb19zdXNwZW5kKCk6CgkgIFJlbW92ZWQgZnVuY3Rpb24sIHNlZSBhYm92ZSBmb3Igd2h5LgotIHdpbmlvLmM6CiAgdXBkYXRlX2xpbmUoKSwgY2VudGVyX2N1cnNvcigpOgoJLSBSZW1vdmVkIHdyZWZyZXNoKGVkaXQpIGZyb20gYm90dG9tIG9mIGZ1bmN0aW9ucy4gIHdyZWZyZXNoCgkgIHNob3VsZCBub3cgb25seSBiZSBjYWxsZWQgb25jZSwgYXQgdGhlIGJvdHRvbSBvZiB0aGUgbWFpbigpCgkgIGxvb3AuCi0gZ2xvYmFsLmM6CiAgIHNob3J0Y3V0X2luaXQoKToKCS0gUmVtb3ZlZCBzdXNwZW5kIHNjX2luaXQgY2FsbCBhbmQgc3VzcGVuZCBtZXNzYWdlIGJlY2F1c2Ugc3VzcGVuZCBpcyBubwoJICBsb25nZXIgbmVlZGVkIGluIHRoZSBzaG9ydGN1dCBsaXN0IHRvIHdvcmsgcHJvcGVybHkuCiAgICAKbmFuby0wLjkuNyAtIDA1LzE0LzIwMDAKLSBuYW5vLmM6CiAgZG9faG9tZSgpLCBkb19lbmQoKTogCgktIEFkZGVkIGNhbGxzIHRvIHVwZGF0ZV9saW5lIGZvciB0aGUgY3VycmVudCBsaW5lLCBmaXhlcwoJICBsYWNrIG9mIHVwZGF0ZSAoYnVnIGRpc2NvdmVyZWQgYnkgQWxiZXJ0byBHYXJj7WEpLgogIG1haW4oKToKCS0gQWRkZWQgU0VUKEZPTExPV19TWU1MSU5LUykgYmVmb3JlIGdldG9wdCBjYWxsLCBmaXhlcyBub3QgCgkgIGZvbGxvd2luZyBzeW1saW5rcyBldmVuIHdoZW4gLWwgaXNuJ3Qgc2V0LCBhbmQgIm5vIGNoYW5nZXMiCgkgIGVycm9yIHdoZW4gbmFubyBpcyBjYWxsZWQgZnJvbSBjcm9udGFiIC1lIChBZGFtIFJvZ295c2tpKS4KLSBjdXQuYzoKICBkb19jdXRfdGV4dCgpOgoJLSBBZGRlZCBlZGl0X3VwZGF0ZV90b3AgdG8gY3V0IHdoZW4gbWFyayBpcyBzZXQsIGZpeGVzIGxhY2sgb2YKCSAgZGlzcGxheSB1cGRhdGUgKGJ1ZyBkaXNjb3ZlcmVkIGJ5IEtlbiBUeWxlcikuCgpuYW5vLTAuOS42IC0gMDUvMDgvMjAwMAotIE5ldyBJdGFsaWFuIHRyYW5zbGF0aW9uIChpdC5wbyksIGJ5IERhbmllbGUgTWVkcmkuCi0gbmFuby5jOgogIHBhZ2VfdXAoKSwgcGFnZV9kb3duKCk6CgktIEFkZGVkIHJlc2V0IG9mIHBsYWNld2V3YW50IHRvIDAsIGFzIGl0IHNob3VsZCBiZS4KICBkb191cCgpLCBkb19kb3duKCk6CgktIEFkZGVkIGNhbGwgdG8gdXBkYXRlX2xpbmUoKSBmb3IgbGluZSB3ZSBtb3ZlIGZyb20gYW5kIGxpbmUgd2UKCSAgbW92ZSB0bywgaW4gb3JkZXIgdG8ga2VlcCB0aGUgaGlnaGxpZ2h0aW5nIGNvcnJlY3QuCiAgZG9fd3JhcCgpOgoJLSBBZGRlZCB2YXIgY2hvcCwgbmV3IGNvZGUgdG8gd3JhcCBsaW5lcyBtb3JlIGxpa2UgUGljbywgbW9zdGx5LgoJICBUSElTIFNUSUxMIERFRklOSVRFTFkgTkVFRFMgVE8gQkUgUkVXUklUVEVOIQotIHdpbmlvLmM6CiAgZG9faGVscCgpOgoJLSBBZGRlZCBlZGl0X3JlZnJlc2goKSBiZWZvcmUgZXhpdC4KICB1cGRhdGVfY3Vyc29yKCk6CgktIFJlbW92ZWQgY3Vyc29yIHVwZGF0aW5nIHdoaWNoIHJlYWxseSB3YXNuJ3QgbmVlZGVkIGFueXdheS4KICBlZGl0X3VwZGF0ZSgpOgoJLSBSZW1vdmVkIHl1Y2t5IGNvZGUgdGhhdCBkaWRuJ3Qgd29yaywgdGhpcyBmdW5jdGlvbiBub3cganVzdAoJICBjb21wdXRlcyBlZGl0dG9wIGFuZCBlZGl0Ym90IGFuZCBjYWxscyBlZGl0X3JlZnJlc2goKSB0byBkbyB0aGUKCSAgcmVzdCwgd2hpY2ggcmVtb3ZlcyBhIGxvdCBvZiBkdXBsaWljYXRlIGNvZGUuLiAgCiAgCm5hbm8tMC45LjUgLSAwNS8wMS8yMDAwCi0gUmVtb3ZlZCBieXRlcyBmcm9tIGZpbGUgc3RydWN0IGJlY2F1c2UgaXQgd2FzIGNvbXB1dGF0aW9uYWxseSB3YXN0ZWZ1bC4KLSBjdXQuYzoKICBkb191bmN1dF90ZXh0KCk6CgktIEFkZGVkIGNhbGwgdG8gZWRpdF9yZWZyZXNoKCkuCi0gbmFuby5jOgogIGRvX2JhY2tzcGFjZSgpOgoJLSBBZGRlZCByZXNldCBvZiBlZGl0Ym90IHdoZW4gZGVsZXRpbmcgdGhlIGxhc3QgbGluZSBvZiB0aGUgZmlsZQoJICAoYnVnIGRpc2NvdmVyZWQgYnkgQWRhbSkuCiAgZG9fY2hhcigpOgoJLSBSZW1vdmVkIGNhbGwgdG8gcmVzZXRfY3Vyc29yKCkuCiAgZG9fZGVsZXRlKCk6CgktIEFkZGVkIHNpbWlsYXIgY2hlY2sgYXMgdG8gZG9fYmFja3NwYWNlKCkuCiAgZG9fZW50ZXIoKToKCS0gQWRkZWQgY2FsbCB0byBlZGl0X3JlZnJlc2goKS4KICBkb19sZWZ0KCksIHJpZ2h0KCk6CgktIEFkZGVkIGNhbGwgdG8gdXBkYXRlX2xpbmUoKSwgc3RpbGwgcmVkdW5kYW50IGJ1dCBiZXR0ZXIuLi4KICBkb191cCgpLCBkb19kb3duKCk6CgktIEFkZGVkIHJlZnJlc2ggY2FsbHMgYm90aCBmb3IgY3VycmVudCBsaW5lIGFuZCBsaW5lIHRvIHdoaWNoCgkgIHdlIGFyZSBtb3ZpbmcuCiAgbWFpbigpOgoJLSBSZW1vdmVkIGluZWZmaWNpZW50IGNhbGwgdG8gZWRpdF9yZWZyZXNoKCkgYWZ0ZXIgZXZlcnkga2V5c3Ryb2tlLgoJICBJdCBpcyBub3cgdXAgZWFjaCBmdW5jdGlvbiB0byBsZWF2ZSB0aGUgc2NyZWVuIGluIGEgZ29vZCBzdGF0ZS4KLSB3aW5pby5jOgogIGRvX2N1cnNvcnBvcygpCgktIFJld3JpdHRlbiB0byBub3QgdXNlIGJ5dGVzIGZyb20gZmlsZXN0cnVjdCBieSBhbiBpbmNyZW1lbnRhbCBzdW0uCiAgdXBkYXRlX2xpbmUoKSwgcmVzZXRfY3Vyc29yKCk6CgktIE9wdGltaXplZCBjYWxscyB0byB4cGx1c3RhYnMoKSB0aHJvdWdoIGEgc2luZ2xlIHZhcmlhYmxlLgoJLSB1cGRhdGVfbGluZSgpIG5vdyB0YWtlcyBhIG5ldyBhcmcsIGFuIGluZGV4IGludG8gdGhlIHN0cmluZwoJICBmb3Igd2hlcmUgdG8gdXBkYXRlIHRoZSBsaW5lIGZyb20uICBOZWVkZWQgZm9yIG5ldyB1cGRhdGUKCSAgY29kZS4KLSBjb25maWd1cmUuaW46CgktIEJldHRlciBjaGVja3MgZm9yIHNsYW5nLCBhbGxvd3MgYXJndW1lbnQgdG8gLS13aXRoLXNsYW5nLgoJICAoQWxiZXJ0IENoaW4tQS1Zb3VuZykKCS0gUmVtb3ZlZCAtSWludGwgZnJvbSBDRkxBR1MgaW4gZ2NjIGNoZWNrLgotIE1ha2VmaWxlLmFtOgoJLSBBZGRpdGlvbiBvZiAtSWludGwgZm9yIGdldHRleHQgKEFsYmVydCBDaGluLUEtWW91bmcpCgpuYW5vLTAuOS40IC0gMDQvMjUvMjAwMAogLSBGaXhlZCBjYWxscyB0byBub19oZWxwIGFuZCBjaGFuZ2VkIHRoZW0gdG8gdGhlIG1vcmUgY29uc2lzdGVudAogICBJU1NFVChOT19IRUxQKS4gIEZpeGVkIHJldHVybiB2YWwgb2Ygbm9faGVscCB0byBiZSB3aGF0IGl0IHNob3VsZCAoMiwKICAgbm90IDEuICBDb2RlIHRvIHRlbXBvcmFyaWx5IGRpc2FibGUgTk9fSEVMUCB3aGVuIGluIHRoZQogICBoZWxwIHN5c3RlbS4gKEFkYW0gUm9nb3lza2kpCi0gY3V0LmM6CiAgZG9fbWFya2VkX2N1dCgpLCBkb19jdXQoKSwgZG9fdW5jdXQoKToKCS0gQ29tbWVudGVkIG91dCB1bm5lY2Vzc2FyeSBiaXRzIHdoZW4gTkFOT19TTUFMTCBpcyBiZWluZyB1c2VkLgotIHdpbmlvLmM6CiAgeHB0KCksIHN0cmxlbnB0KCksIGFjdHVhbF94KCk6CgktIEFkZGVkIGNoZWNrIGZvciB2YWx1ZSBvZiBkYXRhW2ldICYgMHg4MCwgaWYgc28gZG8gbm90IG1ha2UKCSAgY2hhcmFjdGVyIDIgY2hhcnMgd2lkZSAob3JpZy4gYnkgQ2hyaXMsIDB4ODAgY2hlY2sgYnkgQWRhbSkuCiAgZWRpdF9yZWZyZXNoKCk6CgktIE5ldyBjaGVjayBmb3IgdGVtcCA9PSBOVUxMIChiYWQgdGhpbmcpLCBpZiBzbyBnbyBiYWNrIHRvIHRoZQoJICBwcmV2aW91cyBsaW5lLiAgTmV3IGZpbGVzdHJ1Y3QgdmFyIGhvbGQgcG9pbnRzIHRvIHByZXYgbGluZS4KCSAgRml4ZXMgc2VnZmF1bHQgd2hlbiBwYWdpbmcgZG93biB0byB0aGUgZW5kIG9mIGEgZmlsZS4KLSBuYW5vLmM6CiAgd3JpdGVfZmlsZSgpOgoJLSBBZGRlZCBjaGVjayBmb3IgaWYgZmlsZSBleGlzdHMgYW5kIGlzIG5vdCBlcXVhbCB0byB0aGUgY3VycmVudAoJICBmaWxlbmFtZSwgcHJvbXB0IGZvciBvdmVyd3JpdGUgKEFkYW0gUm9nb3lza2kpLgogIGRvX2Rvd24oKToKCS0gUmVtb3ZlZCBjaGVjayBmb3IgY3VycmVudC0+bmV4dCA9PSBOVUxMLCBub3cgY2hlY2tzIHJldHVybiB2YWx1ZQoJICBvZiBkb19kb3duIGJlZm9yZSBzZXR0aW5nIGN1cnJlbnRfeCA9IDAgKGRpc2NvdmVyZWQgYnkgQWRhbSkuCiAgZG9fanVzdGlmeSgpOgoJLSBGaXhlZCBzZWdmYXVsdCB3aGVuIHJlYWNoaW5nIHRoZSBsYXN0IGxpbmUgKHRyaWVkIHRvIGFzc2lnbgoJICBjdXJycmVudC0+bmV4dC0+ZGF0YSB3aGVuIGN1cnJlbnQtPm5leHQgPT0gTlVMTCkgKGRpc2NvdmVyZWQKCSAgYnkgQWRhbSkuCi0gdXRpbHMuYzoKCS0gUmVtb3ZlZCBleHRyYSBtYWNybyBkZWZzIHRoYXQgYXJlIG5vdyBpbiBuYW5vLmguCi0gbmFuby5oOgoJLSBDaGFuZ2VkIG1hY3JvIFNFVCgpIHRvIHVzZSB8PSBpbnN0ZWFkIG9mIF49LiAgRml4ZXMgYnVnIGluCgkgIGN1dCBjb2RlIHdoZW4gY3V0dGluZyBtb3JlIHRoYW4gb25lIGxpbmUsIGFuZCBjdXRidWZmZXIgZ2V0cwoJICBibG93biBhd2F5IHdoZW4gaXQgc2hvdWxkbnQuICAKCm5hbm8tMC45LjMgLSAwNC8yOS8yMDAwCi0gY3V0LmM6CiAgZG9fbWFya2VkX2N1dCgpOgoJLSBGaXhlZCBvZmYgYnkgb25lIGVycm9yIGluIGN1dCBjb2RlIGZvciBtYXJrZWQgdGV4dC4KICBkb19jdXRfdGV4dCgpOgoJLSBSZW1vdmVkIGNoZWNrIGZvciBiZWluZyBvbiB0aGUgbGFzdCBsaW5lLCBwYXJ0IG9mCgkgIG1hZ2ljIGxpbmUgY29kZS4KICBhZGRfdG9fY3V0YnVmZmVyKCk6CgktIE1vdmVkIHRtcC0+cHJldiA9IGlucHRyIGxpbmUgdG8gcGFydCB3aGVyZSBjdXRidWZmZXIgIT0gTlVMTC4KCS0gQWRkZWQgaW5wdHItPnByZXYgPSBOVUxMIGZvciBjYXNlIHdoZXJlIGN1dGJ1ZmZlciA9PSBOVUxMLgotIG5hbm8uYzoKICBkb19iYWNrc3BhY2UoKSwgZG9fY2hhcigpOiAgCgktIFJlbW92ZWQgIm1hZ2ljIGxpbmUiIGNvZGUuICBJdCB3YXMgYmFzaWNhbGx5IGNhdXNpbmcgbW9yZSBidWdzCgkgIHRoYW4gaXQgd2FzIGhlbHBpbmcgZm9yIHRoZSBzYWtlIG9mIGNvbXBhdGliaWxsaXR5LiAgVGhpcyBmaXhlcwoJICBhdCBsZWFzdCBvbmUga25vd24gc2VnZmF1bHQgY29uZGl0aW9uLgogIGRvX2VudGVyKCk6CgktIEFkZGVkIHNldHRpbmcgZWRpdGJvdCB0byBuZXcgbm9kZSBpZiB0aGUgbmV3IG5vZGUgaXMgdGhlIGxhc3QKCSAgbm9kZSBpbiB0aGUgZmlsZS4KICB3cml0ZV9maWxlKCk6CgktIENoYW5nZWQgd3JpdGluZyBmaWxlIGJhaGF2aW9yLiAgTm93LCBpZiBsYXN0IGxpbmUgb2YgdGhlIGZpbGUKCSAgaGFzIGFueSBkYXRhIG9uIGl0LCB3ZSB3cml0ZSBhIG5ld2xpbmUgb24gaXQsIGVsc2Ugd2UgZG9udC4KLSB3aW5pby5jOgogIGFkZF9tYXJrZWRfc2FtZWxpbmUoKToKCS0gTmV3IGNvZGUgdGhhdCBjaGVja3MgZm9yIHdoZXRoZXIgdGhlIGJlZ2luIGFuZCBlbmQgb2YgdGhlIG1hcmtlcgoJICBhcmUgb24gZGlmZmVyZW50IGxpbmVzLiAgTWlzc2luZyBwcmV2aW91c2x5LgogIGVkaXRfYWRkKCk6CgktIGFkZGVkIHNvbWUgbW9yZSBjaGVja3MgZm9yIHRleHQgbGVuZ3RoLiAgQ2xlYW5lZCB1cCBzb21lIG12d2FkZG5zdHJzIHRoYXQKCSAgY291bGQgYmUgd3JpdHRlbiBtb3JlIHNpbXBseSBhcyB3YWRkbnN0cnMuCiAgZWRpdF9yZWZyZXNoKCk6CgktIFJlbW92ZWQgY2hlY2sgZm9yIHRlbXAgPT0gZmlsZWJvdCwgaXQgaXMgbm93IHRyZWF0ZWQgbGlrZSBhbnkgb3RoZXIgbGluZS4KCSAgRml4ZXMgYSBidWcgd2hlcmUgc2VsZWN0ZWQgdGV4dCBvbiB0aGUgbGFzdCBsaW5lIHNob3dzIG5vcm1hbGx5LgogIHhwdCgpOgoJLSBSZW1vdmVkIGFuIGV4dHJhIGNvbXB1dGF0aW9uIGZvciB0YWJzIHZhcmlhYmxlIHRoYXQgd2FzIGluY29ycmVjdC4KICB4cGx1c3RhYnMoKToKCS0gU2luY2UgeHB0IG5vdyBhY3R1YWx5IHdvcmtzLCB0aGlzIGZ1bmMgaXMgbm93IGp1c3QgYSB3cmFwcGVyIGZvcgoJICB4cHQoY3VycmVudCwgY3VycmVudF94KQotIG5hbm8uMSwgbmFuby4xLmh0bWw6CgktIEFkZGVkIC1sIG9wdGlvbiB0byBtYW4gcGFnZXMuCi0gY29uZmlndXJlLmluOgoJLSBOZXcgb3B0aW9uIC0tZW5hYmxlLXRpbnksICNkZWZpbmVzIE5BTk9fU01BTEwgaW4gY29uZmlnLmguICAKCSAgRGlzYWJsZXMgY2FsbCB0byBnZXR0ZXh0IGluIGZ1bmN0aW9ucyBhbmQgb3RoZXIgaTE4biBzdHVmZiBpbiAKCSAgbmFuby5jLCB0aGUgZGV0YWlsZWQgaGVscCBtb2RlLCB0aGUgcmVzaXplIGZ1bmN0aW9ucywgYW5kIHRoZSAKCSAganVzdGlmeSBjb2RlIHdoaWNoIG5vIG9uZSBldmVyIHVzZXMuCgktIE5ldyBvcHRpb24gLS13aXRoLXNsYW5nLiAgRW5hYmxlcyBzbGFuZyBsaWJyYXJpZXMgaW5zdGVhZCBvZgoJICBuY3Vyc2VzLCByZXF1aXJlcyBzbGN1cnNlcy5oIGZvciB3cmFwcGVyIGZ1bmN0aW9ucy4gKEJhc2VkCgkgIG9uIHBhdGNoZXMgZm9yIDAuOC43IGJ5IEdsZW5uIE1jR3JhdGgpLgoKbmFuby0wLjkuMiAtIDA0LzE1LzIwMDAKLSBUaGlzIHJlbGVhc2UganVzdCBmaXhlcyB0aGUgc2VyaW91cyBzZWdmYXVsdCBwcm9ibGVtIGlmIG5hbm8gaXMgCiAgaW52b2tlZCBhbnkgd2F5IG90aGVyIHRoYW4gdXNpbmcgdGhlIGFic29sdXRlIHBhdGguICBUaGUgYnVnIHdhcwogIGluIHRoZSBuZXcgY29kZSBmb3IgY2hlY2tpbmcgd2hldGhlciBuYW5vIGlzIGludm9rZWQgYXMgcGljby4KCm5hbm8tMC45LjEgLSAwNC8xNC8yMDAwCi0gQWRkZWQgcGljbyBjb21wYXRpYmlsaXR5IGZvciBeVCB3aGVuIGluIHNlYXJjaCBvciBzd2l0Y2ggdG8gc3dpdGNoCiAgdG8gdGhlIG9wcG9zaXRlIGZ1bmN0aW9uLiAgQWRkZWQgb25lIHRvIFJFUExBQ0VfTElTVF9MRU4gYW5kIAogIFdIRVJFSVNfTElTVF9MRU4gaW4gbmFuby5oLCBuZXcgYXJncyB0byBzY19pbml0X29uZSBpbiBnbG9iYWwuYyBhbmQKICBuZXcgc3RyaW5ncyB0aGF0IHdpbGwgaGF2ZSB0byBiZSBnZXR0ZXgoKWVkLiAgTmV3IGFyZ3VtZW50ICdyZXBsYWNpbmcnCiAgdG8gc2VhcmNoX2luaXQoKS4gIEhhbmRsZXJzIGluIGRvX3JlcGxhY2UgYW5kIGRvX3NlYXJjaCgpLgotIE5ldyB3cml0ZSBjb2RlLCBub3cgZm9sbG93cyBzeW1ib2xpYyBsaW5rcyBpbnN0ZWFkIG9mIHJlcGxhY2luZyB0aGVtCiAgd2l0aCB0aGUgbmV3IGZpbGUuICBOZXcgb3B0aW9uICgtbCwgLS1ub2ZvbGxvdykgdG8gZW5hYmxlIHRoZSBvbGQKICAoaW5jb3JyZWN0LCBidXQgc2VjdXJlKSBiZWhhdmlvciAoQWRhbSBSb2dveXNraSkuCi0gbmFuby5jOgogIGRvX3dyYXAoKToJCgktIEZpeGVkIGFub3RoZXIgYnVnIHJlbGF0aW5nIHRvIHdyYXBwaW5nLCBhbmQgd2hpY2ggd291bGQgY2F1c2UKCSAgYSBzZWdmYXVsdCAqc2lnaCouCiAgZG9fcmVwbGFjZSgpOiAKCS0gSW5jcmVtZW50ZWQgY3VycmVudF94IGJ5IHRoZSBsZW5ndGggb2YgdGhlIHJlcGxhY2VtZW50CgkgIHRleHQgaW5zaWRlIHRoZSBtYWluIHJlcGFsY2UgbG9vcC4gIEZpeGVzIGJ1ZyAjMTUuCiAgYWRkX21hcmtlZF9zYW1lbGluZSgpOgoJLSBOZXcgZnVuY3Rpb24sIGhhbmRsZXMgbWFya2VkIHRleHQgd2hlbiBzdGFydCAmIGVuZCBvZiBtYXJrZXIgaXMKCSAgb24gb25lIGxpbmUsIGFsc28gc3VwcG9ydHMgbW9zdCBtYXJrZWQgdGV4dCB3aGVuIGN1cnNvciA+IENPTFMuCiAgbWFpbigpOgoJLSBDb2RlIHRvIGNoZWNrIGlmIG5hbm8gaXMgaW52b2tlZCBhcyAncGljbycsIGFuZCBpZiBzbwoJICBhdXRvbWF0aWNhbGx5IHNldCBwaWNvX21zZ3MgKFJvYmVydCBKb25lcykuCgpuYW5vLTAuOS4wIC0gMDQvMDcvMjAwMAotIG5hbm8uMSwgbmFuby4xLmh0bWw6IAlVcGRhdGVkIG1hbiBwYWdlIHdpdGggbXkgZW1haWwgYWRkcmVzcyBhbmQgaG9tZXBhZ2UuCi0gd2luaW8uYzoKICByZXNldF9jdXJzb3IoKSwgdXBkYXRlX2xpbmUoKToJCgktIENoYW5nZWQgdXBkYXRlIGFsZ29yaXRobSBmb3IgeCB2YWx1ZSB0byAoQ09MUyAtIDcpIG11bHRpcGxlIHdoZW4geAoJICB2YWx1ZSA+IChDT0xTIC0gMikuCi0gZWRpdF9yZWZyZXNoKCk6CgktIFJlbW92ZWQgaW5uZXIgbG9vcCBjb2RlLCBub3cgY2FsbHMgdXBkYXRlX2xpbmUoKSBmb3IgZWFjaCBsaW5lCgkgIGluIHF1ZXN0aW9uLCBNVUNIIG5pY2VyLgotIHhwbHVzdGFicygpLCB4cHQoKToKCS0gUmVtb3ZlZCByZWR1bmRhbnQgaW5jcmVtZW50IG9mIHRhYnMgd2hlbiBjb2xsdW1uIG5vICUgOCA9PSAwLgoJLSBBZGRlZCBjaGVjayBmb3IgZGF0YVtpXSA8IDMyLCBtb3N0IG9mIHN1Y2ggYml0cyBhcmUgMiBjaGFycyB3aWRlLgotIHVwZGF0ZV9saW5lKCk6CgktIEZpeGVkIGEgc3R1cGlkIGNhbGwgdG8gc3RybGVucHQgd2l0aCBjb2wgd2hlbiB3ZSBzaG91bGQgaGF2ZQoJICBiZWVuIHVzaW5nIGFjdHVhbF9jb2wuICBVZ2guCgpuYW5vLTAuOC45IC0gMDMvMjIvMjAwMAotIG5hbm8uYzoKICBlbXB0eV9saW5lKCksIG5vX3NwYWNlcygpLCBqdXN0aWZ5X2Zvcm1hdCgpLCBkb19qdXN0aWZ5KCk6CgkJQWN0dWFsbHkgYWRkZWQgdGhlc2UgKHNjcmV3dXAgYXBwbHlpbmcgcGF0Y2gpLgogIGRvX2p1c3RpZnkoKToJQWRkZWQgY2FsbCB0byBzZXRfbW9kaWZpZWQoKS4KCm5hbm8tMC44LjggLSAwMy8xMi8yMDAwCi0gUHJlbGltaW5hcnkgaW50ZXJuYXRpb25hbGl6YXRpb24gc3VwcG9ydC4gIE1hbnkgbWFueSBmdW5jdGlvbnMgbW9kaWZpZWQKICB0byB1c2UgZ2V0dGV4dCAodmlhIF8oKSBtYWNybykuICBlcy5wbyBmaWxlIGluY2x1ZGVkLiAoSm9yZGkgTWFsbGFjaCkKICBOZXcgZGlycyBwby8gYW5kIGludGwvLCBjaGFuZ2VzIHRvIGNvbmZpZ3VyZS5pbiBhbmQgQXV0b21ha2UuYW0gdG8KICBzdXBwb3J0IGkxOG4uCi0gbmFuby5jOgogIGluY2x1ZGVzOglEZGRlZCBzeXMvcGFyYW0uaCBhbmQgbGltaXRzLmguIChBZGFtIFJvZ295c2tpKS4KICBzdGF0aWNzOiAJQ2hhbmdlZCBzb21lIHRoaW5ncyB0aGF0IHdlcmUgbm90IG5lY2Vzc2FyaWx5IHN0YXRpYyAKCQkoQWRhbSBSb2dveXNraSkuCiAgbnJlYWxsb2MoKToJTmV3IGZ1bmN0aW9uLCBzaW1pbGFyIHRvIG5tYWxsb2MoKS4gIENoYW5nZWQgY2FsbHMgZnJvbQoJCXJlYWxsb2MoKSB0byBucmVhbGxvYyAoQWRhbSBSb2dveXNraSkuCiAgZW1wdHlfbGluZSgpLCBub19zcGFjZXMoKSwganVzdGlmeV9mb3JtYXQoKSwgZG9fanVzdGlmeSgpOgoJCU5ldyBmdW5jdGlvbnMgZm9yIGp1c3RpZnkgZnVuY3Rpb24gKEFkYW0gUm9nb3lza2kpLgotIHdpbmlvLmM6CiAgYmxhbmtfZWRpdCgpOglBZGRlZCB3cmVmcmVzaCBjYWxsIHRvIGVkaXQgc28gdGhhdCBzY3JlZW4gdXBkYXRlcyAobGlrZQoJCW9uIF5MKSBhY3R1YWxseSB3b3JrLgogIHhwbHVzdGFicygpLCB4cHQoKSwgc3RybGVucHQoKTogRml4ZWQgb2ZmLWJ5LW9uZSBidWdsZXRzIChBZGFtIFJvZ295c2tpKS4KCm5hbm8tMC44LjcgLSAwMy8wMS8yMDAwCi0gbWFpbi5jOgogIGRvX3dyYXAoKToJQmV0dGVyIGZpeCBmb3Igc2VnZmF1bHRzLCBhbmQgZml4IGZvciBsaXNuZXMgYmVpbmcgd3JhcHBlZCAKCQl0byBhIHNpbmdsZSBjaGFyYWN0ZXIgb24gb25lIGxpbmUgd2hlbiBubyBnb29kIHBsYWNlIHRvIAoJCWJyZWFrIHRoZSBsaW5lIGV4aXN0cywgYW5kIGZvciB3cmFwcGluZyBsaW5lcyBsb25nZXIgdGhhbiBDT0xTLgotIG5hbm8uMS5odG1sOgoJCUh0bWwgdmVyc2lvbiBvZiBtYW4gcGFnZSwgbm93IGluY2x1ZGVkIGluIGRpc3QuICBGb3IKCQl0aGUgYmVuZWZpdCBvZiBuYW5vIHBhY2thZ2VzIGluIExpbnV4IGRpc3RyaWJ1dGlvbnMuCgpuYW5vLTAuOC42IC0gMDIvMjQvMjAwMAotIGdvYmFsLmM6CiAgc2hvcnRjdXRfaW5pdCgpOgoJCUFkZGVkIHNob3J0Y3V0cyBmb3IgZ290b19saW5lIGFuZCBkb19yZXBsYWNlIHdoZW4gdXNpbmcKCQlwaWNvX21zZ3MuICBPb3BzLgotIG5hbm8uYzoKICBzdGF0aWNzOglDaGFuZ2VkIGZpbGwgYmFjayB0byAwIGZyb20gNzEgYnkgZGVmYXVsdCAoQWRhbSBSb2dveXNraSkuCiAgZG9fd3JhcCgpOglBZGRlZCBjaGVjayBmb3IgYmFja2luZyB1cCBwYXN0IHRhYnMsIHdoaWNoIHdlIHNob3VsZG50IGRvLgoJCVJlbW92ZWQgY2hlY2sgZm9yIGJhY2tpbmcgdXAgcGFzdCBzcGFjZXMgZmlyc3QuCiAgbWFpbigpOglBZGRlZCBmb3IgbG9vcCB0byBjaGVjayBmb3IgYWx0IGtleXMgaW5zdGVhZCBvZiBoYXJkIGxpc3QuCiAgZG9fZW50ZXIoKToJRml4IGZvciBidWcgIzE0LCBhZGRlZCBjYWxsIHRvIHJlc2V0X2N1cnNvciBhbmQgbWVzc2VkCgkJdXAgZG9fY2hhciBxdWl0ZSBhIGJpdC4KICB2ZXJzaW9uKCk6CUFkZGVkIHRpbWUgYW5kIGRhdGUgc3RhbXAgZm9yIGNvbXBpbGUgb24gdmVyc2lvbiBtZXNzYWdlLgoJCUFkZGVkIG1haWwgYW5kIHdlYiBwYWdlIGluZm8uCi0gUkVBRE1FOglVcGRhdGVkIG1haWxpbmcgbGlzdCBpbmZvLgoKbmFuby0wLjguNSAtIDAyLzE4LzIwMDAKLSBuYW5vLmM6CiAgbWFpbigpOglGaW5hbGx5IGZpeGVkIHRpbGRlIGJlaW5nIGlucHV0IG9uIHBhZ2UgdXAvZG93biBrZXlzIGluCgkJY2VydGFpbiB0ZXJtaW5hbCB0eXBlcy4gIEZpeCB3YXMgaW5wdXQgMjYtPjkxLT41WzM0XSBjaGVjawoJCWZvciAxMjYsIGlmIHNvIG1ha2UgdGhlIGtiaW5wdXQgUEFHRSBVUC9ET1dOLCBlbHNlIHVuZ2V0CgkJdGhlIGtleXN0cm9rZSBhbmQgY29udGludWUuICBBZGRlZCAjaW5jbHVkZSA8aW9jdGwuaD4gZm9yCgkJaW9jdGwgY2FsbC4KICBoYW5kbGVfaHVwKCk6CgkJSGFuZGxlciBmb3IgaGFuZ3VwIHNpZ25hbC4gIEJlbGF0ZWQgaW5jbHVkZSBvZiBwYXRjaCBmcm9tCgkJVGltIFNoZXJ3b29kLgotIHdpbmlvLmM6CiAgZWRpdF9yZWZyZXNoKCk6CgkJVGVtcG9yYXJ5IGZpeCBmb3Igc2VsZWN0aW5nIHRleHQgd2hlbiB0ZW1wID09IGN1cnJlbnQuCgkJZWRpdF9yZWZyZXNoKCkgaXMgbm93IHVubWFuYWdhYmx5IGNvbXBsZXgsIGFuZCBtdXN0IGJlCgkJcmV2YW1wZWQuCiAgY2hlY2tfc3RhdGJsYW5rKCk6CgkJQWRkZWQgY2hlY2sgZm9yIGNvbnN0dXBkYXRlLCBtYWtlcyB0aGluZ3MgbGVzcyBjaG9wcHkKCQkoQWRhbSBSb2dveXNraSkKCm5hbm8tMC44LjQgLSAwMi8xMS8yMDAwCi0gTW92ZWQgZ2xvYmFsIHZhcmlhYmxlcyB0aGF0IHdlcmUgb25seSAob3IgbW9zdGx5KSB1c2VkIGluIG9uZSBmaWxlIGludG8KICBpdHMgcHJvcGVyIGZpbGUgYXMgYSBzdGF0aWMuICBBZmZlY3RzIGN1dC5jLCBuYW5vLmMsIGdsb2JhbC5jIChBbmR5IEthaG4pLgotIGdsb2JhbC5jOgkKICBzaG9ydGN1dF9pbml0KCk6CgkJUmVtb3ZlZCByZWR1bmRhbnQgTkFOT19DT05UUk9MX0ggZnJvbSBiYWNrc3BhY2Ugc2hvcnRjdXQsCgkJYWRkZWQgY2hhciAxMjcgd2hpY2ggc2hvdWxkIGhhdmUgYmVlbiB0aGVyZS4KLSBuYW5vLmM6CiAgbWFpbigpOglGaXggZm9yIGxvb3BzIGxvb3BpbmcgdW50aWwgTUFJTl9MRU4sIGFkZGVkIC0xIHRvIHN0b3AKCQlzZWdmYXVsdHMgKEFkYW0gUm9nb3lza2kpLgotIE1ha2VmaWxlLmFtOglBZGRlZCBhbGwgc291cmNlIGZpbGVuYW1lcyAoQWRhbSBSb2dveXNraSkuCi0gbmFuby4xOglGaXhlZCBtYWlsIGFkZHJlc3NlZCBhbmQgYWRkZWQgbWFpbGluZyBsaXN0IGFkZHJlc3MuCi0gUkVBRE1FOglVcGRhdGVkIG15IGVtYWlsIGFkZHJlc3MgYW5kIHRoZSBuYW5vIHdlYiBwYWdlLgoKbmFuby0wLjguMyAtIDAyLzA4LzIwMDAKLSBOZXcgcGljbyBtb2RlICgtcCwgLS1waWNvKSwgdG9nZ2xlcyAobW9yZSkgY29tcGF0aWJpbGl0eSB3aXRoIHRoZQogIFBpY28gbWVzc2FnZXMgZGlzcGxheWVkIGluIHRoZSBzaG9ydGN1dCBsaXN0LiAgTm90ZSB0aGF0IHRoZXJlIGFyZSBzdGlsbAogIHNtYWxsIGRpZmZlcmVuY2VzIGluIHRoaXMgbW9kZS4KLSBuYW5vLmg6CU5ldyBzaG9ydGN1dCBzdHJ1Y3QgZm9ybWF0LCBmb3IgdGhlIGJlbmVmaXQgb2YgaTE4biBhbmQKCQlvdXIgaGVscCBtZW51LiAgUmVtb3ZlZCBzaG9ydGN1dCBtZXNzYWdlIG1hY3JvcywgdGhleSBhcmUKCQlub3cgYWxsIGluIHNob3J0Y3V0X2luaXQgaW4gZ2xvYmFsLmMuCi0gbmFuby5jOgogIGRvX3dyYXAoKToJUmVtb3ZlZCByZXNldHRpbmcgb2YgY3VycmVudF94IHdoZW4gd2UgYXJlIGluIGZhY3QKCQl3cmFwcGluZyB0byB0aGUgbmV4dCBsaW5lLCBmaXhlcyBhIGJ1ZyBpbiAtaSBtb2RlLgogIGRvX2VudGVyKCk6CgkJUmV3cm90ZSB0aGUgYXV0b2luZGVudCBtb2RlIGNvZGUgdG8gYmUgYSBsb3QgbGVzcyBwcmV0dHksCgkJYnV0IGEgbG90IG1vcmUgbWFnaWNhbC4KICBtYWluKCk6CgkJUmVtb3ZlZCBjYXNlIGZvciBpZ25vcmluZyBjaGFyIDEyNiAofikuICBUaGF0J3Mga2luZCBvZgoJCWltcG9ydGFudCwgd2UnbGwgaGF2ZSB0byBmaXggaGFuZGxpbmcgdGhhdCBzZXF1ZW5jZSB3aGVuCgkJcGFnZWluZyB1cC9kb3duIG9uIGEgdGVybWluYWwgc29tZSBvdGhlciB3YXkuLi4gUmV2YW1wZWQKCQltYWluIHN3aXRjaCBsb29wIGluIG11Y2ggc25henppZXIgZmFzaGlvbiBiYXNlZCBvbiB0aGUKCQlzaG9ydGN1dCBsaXN0LgotIHdpbmlvLmM6CgkJTmV3IGZ1bmN0aW9uIGRpc3BsYXlfbWFpbl9saXN0LiAgQWZmZWN0cyBhbGwgZnVuY3Rpb25zCgkJdGhhdCB1c2VkIHRvIGNhbGwgYm90dG9tYmFycygpIHdpdGggbWFpbl9saXN0LiAgQWRkZWQKCQliZWNhdXNlIHdlIG5vdyBvbmx5IGNhbGwgYm90dG9tYmFycyB3aXRoIHRoZSBtYWNybwoJCU1BSU5fVklTSUJMRSBpbnN0ZWFkIG9mIE1BSU5fTElTVF9MRU4sIGJlY2F1c2Ugb2YgdGhlCgkJY2hhbmdlcyB0byB0aGUgbWFpbl9saXN0IHNob3J0Y3V0IGxpc3QgKHNlZSBnbG9iYWwuYyBiZWxvdykuCgkJTmV3IGZ1bmN0aW9uIGRvX2hlbHAsIG91ciBwcmVsaW1pbmFyeSBkeW5hbWljIGhlbHAgc3lzdGVtLgotIE1hbnkgbWFueSBmdW5jczoKCQlDaGFuZ2VkIGZyb20gaW50IHRvIHZvaWQgdG8gYWxsb3cgb25lIHVuaWZvcm0gdHlwZSB0byBjYWxsCgkJZnJvbSB0aGUgc2hvcnRjdXQgc3RydWN0LiAgQWxzbyBhIGZldyBmdW5jdGlvbnMgdGhhdCBkbwoJCW5vdCBzaW1wbGUgaGF2ZSB2b2lkIGFyZ3VtZW50IGhhdmUgbmV3IGZ1bmN0aW9ucyBjYWxsZWQKCQlmdW5jbmFtZV92b2lkKHZvaWQpIHRvIGJlIGNhbGxlZCBmcm9tIHRoZSBzaG9ydGN1dCBsaXN0LgoJCWRvX2N1dF90ZXh0IGFuZCBkb191bmN1dF90ZXh0IHdlcmUgY2hhbmdlZCB0byB2b2lkCgkJYXJndW1lbnRzIGJlY2F1c2UgdGhleSB3ZXJlIG5ldmVyIGNhbGxlZCB3aXRoIGEgZmlsZXN0cnVjdAoJCW90aGVyIHRoYW4gKmN1cnJlbnQgYW55d2F5LgotIGdsb2JhbC5jOgoJCVNob3J0Y3V0IGxpc3QgbWFpbl9saXN0IHdhcyBleHBhbmRlZCB0byBjb3ZlciBhbGwKCQlzaG9ydGN1dHMgdGhhdCBjb3VsZCBiZSBjYXVnaHQgaW4gdGhlIG1haW4gbG9vcC4KCQlDb25zZXF1ZW50bHkgdGhlcmUgaXMgYSBuZXcgbWFjcm8gTUFJTl9WSVNJQkxFIHdoaWNoIHRlbGxzCgkJaG93IG1hbnkgaXRlbXMgaW4gdGhlIG1haW4gbGlzdCB0byBhY3R1YWxseSBzaG93LgoKbmFuby0wLjguMiAtIDAyLzAyLzIwMDAKLSBBZGRlZCBpbml0aWFsIG1vdXNlICgtbSwgLS1tb3VzZSkgc3VwcG9ydC4gIE5ldyBnbG9iYWwgdmFyaWFibGUKICB1c2VfbW91c2UuIChBZGFtIFJvZ295c2tpKQoKLSBuYW5vLmM6CVNldCBpbnRpYWwgdmFsdWUgb2YgZmlsbCB0byBDT0xTIC0gOCByYXRoZXIgdGhhbiBqdXN0IDcyCgkJcmVnYXJkbGVzcy4gKEFkYW0gUm9nb3lza2kpLgogIGRvX2RlbGV0ZSgpOgkKCQlEZWxldGVkIGNhbGwgdG8gZG9fYmFja3NwYWNlKCkgd2hlbiBvbiB0aGUgZW5kIG9mIGEgbGluZSwKCQliZWNhdXNlIGl0IHdvbid0IHVwZGF0ZSB0aGUgbGluZSBwcm9wZXJseS4KICBkb19iYWNrc3BhY2UoKToKCQlSZW1vdmVkIHVubmVjZXNzYXJ5IHBvaW50ZXIgbWFuaXB1bGF0aW9uIHRoYXQgd2FzIGJlaW5nCgkJaGFuZGxlZCBieSB1bmxpbmtfbm9kZSgpLgogIG9wZW5fZmlsZSgpOgoJCUFkZGVkIGNoZWNrIGZvciB0cnlpbmcgdG8gb3BlbiBhIGRpcmVjdG9yeSAoY3VycmVudGx5IHdlCgkJc2VnZmF1bHQgb24gdGhpcykuICBCdWcgcG9pbnRlZCBvdXQgYnkgQ2hhZCBaaWNjYXJkaS4KCm5hbm8tMC44LjEgLSAwMS8yOC8yMDAwCi0gSW1wbGVtZW50ZWQgUGljbydzIC1yIChmaWxsKSBtb2RlLCBjb21tYW5kIGxpbmUgZmxhZyAtciBvciAtLWZpbGwuICBOZXcKICBnbG9iYWwgdmFyaWFibGUgZmlsbCwgYWZmZWN0cyBjaGVja193cmFwKCksIGRvX3dyYXAoKSwgbWFpbigpLCB1c2FnZSgpLAogIGdsb2JhbC5jIGFuZCBwcm90by5oLgotIG5hbm8uYzoKd3JpdGVfZmlsZSgpOgkJQWRkZWQgKGluY3JlZGlibHkpIG5lY2Vzc2FyeSBjaGVjayBmb3IgRVBFUk0gd2hlbgoJCQlsaW5rKCkgZmFpbHMuICBUaGlzIGFsbG93cyB1cyB0byBhY3R1YWxseSBzYXZlCgkJCWZpbGVzIHZpYSByZW5hbWUoKSBvbiBmaWxlc3lzdGVtcyB0aGF0IGRvbnQKCQkJc3VwcG9ydCBoYXJkIGxpbmtzIChBSUVFRUVFRSkuCmRvX2dvdG8oKToKCQkJRml4ZWQgYSBzdHVwaWQgbWlzdGFrZSB3aGVyZSB3ZSB3ZXJlIGNhbGxpbmcKCQkJYm90dG9tYmFycygpIHdpdGggcmVwbGFjZV9saXN0IGluc3RlYWQgb2YgZ290b19saXN0LgotIG5hbm8uaDoKCQkJTmV3IGNoYXIgKmhlbHAgaW4gc2hvcnRjdXQgc3RydWN0dXJlIGZvciBoZWxwCgkJCWZlYXR1cmUuIEFkZGVkIE5BTk9fKl9NU0cgYW5kIE5BTk9fKl9IRUxQICNkZWlmbmVzCgkJCWZvciBoZWxwIGZ1bmN0aW9uIGFuZCBpMThuLgotIGdsb2JhbC5jOgoJCQlOZXcgZnVuY3Rpb25zIHNob3J0Y3V0X2luaXQgKGNhbGxlZCBpbiBuYW5vLmMpIGFuZAoJCQlzY19pbml0X29uZSgpIHRvIGluaXRpYWxpemUgdGhlIHNob3J0Y3V0cyB3aXRob3V0CgkJCXVzaW5nIHt9cyAoZm9yIGkxOG4pLgoKbmFuby0wLjguMCAtIDAxLzI1LzIwMDAKLSBWaWV3IGZsYWcgKC12LCAtLXZpZXcpIGltcGxlbWVudGVkLiAgR2xvYmFsIHZhcmlhYmxlIHZpZXdfbW9kZSwgYWZmZWN0cwogIG1haW4gbG9vcCBvZiBuYW5vLmMgYW5kIG5ld19maWxlKCkuIChtZSkKLSBuYW5vLmM6CgkJCXNwbGl0IGNoZWNrcyBmb3IgVEVSTUlPU19IIGFuZCBURVJNSU9fSCB1cCBzbyB3ZQoJCQljYW4gKHRoZW9yZXRpY2FsbHkpIGluY2x1ZGUgdGhlbSBib3RoLCB3aGljaCBpcyBnb29kLgpoYW5kbGVfc2lnd2luY2goKToKCQkJQWRkZWQgY2hlY2sgZm9yIG5jdXJzZXMuaC4gIChBbmR5IEthaG4pCmRvX3NwZWxsKCk6CgkJCVdlIG5vdyBvbmx5IHRyeSBpc3BlbGwgYmVjYXVzZSB3ZSBkb24ndCBhcyBvZiB5ZXQKCQkJaGFuZGxlIHRoZSAnc3BlbGwnIHByb2dyYW0gdGhlIHJpZ2h0IHdheSwgbm93IHRoYXQKCQkJSSBmaW5hbGx5IGtub3cgd2hhdCB0aGUgcmlnaHQgd2F5IGlzID0tKS4gIEFkZGVkCgkJCWNhbGwgdG8gZWRpdF91cGRhdGUoZmlsZWFnZSkgdG8gc3RvcCBzZWdmYXVsdHMuCmdsb2JhbF9pbml0KCk6CgkJCUFkZGVkIGluaXRpYWxpemF0aW9uIG9mIGVkaXQqIGZpbGVzdHJ1Y3QgcG9pbnRlcnMKCQkJdG8gc3RvcCBzZWdmYXVsdHMgb24gc3BlbGwgY2hlY2suCnVzYWdlKCk6CgkJCUNoZWNrIGZvciBnZXRvcHRfbG9uZywgYW5kIGlmIG5vIGxlYXZlIG91dCB0aGUKCQkJR05VIG9wdGlvbnMgZXZlcnlvbmUgc2VlbXMgdG8gbG92ZSBzbyBtdWNoIChBbmR5IEthaG4pCm1haW4oKToKCQkJQWRkZWQgY2hlY2tzIGZvciBnZXRvcHRfbG9uZyAoQW5keSBLYWhuKQoJCQlXZSBpZ25vcmUgY2hhcmFjdGVyIDEyNiBiZWNhdXNlIGl0IGdldHMgcHV0IGludG8KCQkJdGhlIGJ1ZmZlciB3aGVuIHdlIHBhZ2UgdXAvZG93biBvbiBhIHZ0IHRlcm1pbmFsLgp3cml0ZV9maWxlKCk6CgkJCUZpeGVzIGZvciB1bWFzayAoQWRhbSBSb2dveXNraSkuICBSZW5hbWVkIHRtcGZpbGUKCQkJdmFyaWFibGUgdG8gdG1wLiAgRG9jdW1lbnRlZCB0aGUgdG1wIG9wdHRpb24KCQkJYmV0dGVyIGluIHRoZSBmdW5jdGlvbiBjb21tZW50cy4gIEZpeGVkIG15IAoJCQlzdHVwaWRseSBjb21tZW50ZWQgb3V0IGNoZWNrIGZvciB0bXAgb24gc2V0dGluZwoJCQl1bWFzayB3aGljaCBJIHJlYWxseSBsaWtlID0+Ci0gbmFuby5oOgoJCQlNYWRlIGRlc2MgdmFyaWFibGUgaW4gc2hvcnRjdXQgc3RydWN0IGEgcG9pbnRlcgoJCQlpbnN0ZWFkIG9mIGEgZml4ZWQtbGVuZ3RoIHN0cmluZy4KLSB1dGlscy5jOgoJCQlGaXhlZCBjaGVjayBmb3IgY29uZmlnLmggYmVmb3JlIG5hbm8uaC4KLSBjb25maWd1cmUuaW46CgkJCU5ldyBjaGVja3MgZm9yIGdldG9wdF9sb25nLCBnZXRvcHQuaCwgcmVtb3ZlZAoJCQlDRkxBR1MgYW5kIExERkxBR1MgY2hhbmdlcy4gIEdvbm5hIGhhdmUgdG8gcnVuCgkJCXN0cmlwIG1hbnVhbGx5IG5vdyA9LSkgKEFuZHkgS2FobikKCQkJQWRkZWQgY2hlY2sgZm9yIEhBVkVfV1JFU0laRSwgbmV3IGZpbGUgYWNjb25maWcuaCAobWUpLgoKbmFuby0wLjcuOSAtIDAxLzI0LzIwMDAKLSBOZXcgYXV0b2luZGVudCBmZWF0dXJlLiAgQ29tbWFuZCBmbGFnICdpJyBvciAnLS1hdXRvaW5kZW50Jy4gIE5ldwogIGZ1bmN0aW9uIGRvX2NoYXIoKSB0byBjbGVhbiB1cCBjaGFyYWN0ZXIgb3V0cHV0LCBnbG9iYWwKICB2YXJpYWJsZSBhdXRvaW5kZW50IGluIGdsb2JhbC5jLiAoR3JhaGFtIE1haW53YXJpbmcpCi0gTmV3IGZsYWcgJ3QnIG9yICctLXRlbXBmaWxlJywgbGlrZSBQaWNvJ3MgLXQgbW9kZSwgYXV0b21hdGljYWxseSBzYXZlcwogIGZpbGVzIG9uIGV4aXQgd2l0aG91dCBwcm9tcHRpbmcuICBBZmZlY3RzIGRvX3dyaXRlb3V0KCkuICBBbHNvCiAgZG9fd3JpdGVvdXQoKSBub3cgdGFrZXMgYSBwYXJhbWV0ZXIgZm9yIGlmIGV4aXRpbmcuCiAgR2xvYmFsIHZhcmlhYmxlIHRlbXBfb3B0IGluIGdsb2JhbC5jIChHcmFoYW0gTWFpbndhcmluZykKLSBQcmVsaW1pbmFyeSBzcGVsbCBwcm9ncmFtIHN1cHBvcnQuICBBZGRlZCBjb21tYW5kIGZsYWcgJy1zJyBvcgogICctLXNwZWxsZXInIGZvciBhbHRlcm5hdGl2ZSBzcGVsbGVyIGNvbW1hbmQuICBBZGRlZCBmdW5jdGlvbiBkb19zcGVsbCgpCiAgYW5kIGV4aXRfc3BlbGwoKSB0byBuYW5vLmMuICBOZXcgZ2xvYmFsIHZhcmlhYmxlIGFsdF9zcGVsbGVyLgotIG5hbm8uYzoKICBtYWluKCk6CVdlIG5vdyBpZ25vcmUgaW5wdXQgb2YgZGVjaW1hbCA0MTAgYmVjYXVzZSB0aGVzZSBnZXQgZW50ZXJlZCAKCQl3aGVuIHdlIHJlc2l6ZSB0aGUgc2NyZWVuLiAgU29ydGVkIG9wdGlvbnMgaW4gZ2V0b3B0KCkKCQlzd2l0Y2ggc3RhdGVtZW50LgogIHVzYWdlKCk6CVNvcnRlZCBvcHRpb25zIGFuZCBjaGFuZ2VkIHRhYnMgdG8gbWFrZSByb29tIGZvciAtcyBvcHRpb24uCiAgd3JpdGVfZmlsZSgpOglOb3cgdGFrZXMgYSBzZWNvbmQgcGFyYW1ldGVyICd0bXBmaWxlJywgdXNlcyBtYXNrIDA2MDAgYW5kCgkJZG9lc24ndCBwcmludCB0aGUgbnVtYmVyIG9mIGxpbmVzIHdyaXR0ZW4gb24gdGhlIHN0YXR1c2Jhci4KICBnbG9iYWxfaW5pdCgpOgoJCUFkZGVkIG1vcmUgaW5pdGlhbGl6YXRpb25zIHRvIGdsb2JhbHMgdG8gc3VwcG9ydCBkb19zcGVsbCgpLgoKbmFuby0wLjcuOCAtIDAxLzIzLzIwMDAKLSBTdHViYmVkIGp1c3RpZnkgZnVuY3Rpb24uICBBZmZlY3RzIG1haW4oKSBpbiBuYW5vLmMgYW5kIG5hbm8uaCBkZWZpbmVzLgotIEFkZGVkIEZrZXkgZXF1aXZhbGVudHMgZm9yIFBpY28gY29tcGF0aWJpbHR5LiAgQWZmZWN0cyBuYW5vLmggZGVmaW5lcwogIGFuZCBtYWluKCkgaW4gbmFuby5jCi0gUmVtb3ZlZCByZWR1bmRhbnQgcmVzZXRfY3Vyc29yKCkgY2FsbHMgZnJvbSB0aGUgYmxhbmsoKSByb3V0aW5lcy4KLSBuYW5vLmM6CiAgbWFpbigpOglGaXhlZCB0eXBvIGluIG1haW4gd2hpbGUgbG9vcCBmb3IgTkFOT19BTFRfUkVQTEFDRV9LRVkuCgkJUmVtb3ZlZCBjaGVjayBmb3IgaXNwcmludCgpIGNoYXJhY3RlcnMgaW4gbWFpbiB3aGlsZSBsb29wCgkJZm9yIHBlb3BsZSB3aXRoIG9kZCBjaGFyYWN0ZXIgc2V0cyAqc2hydWcqLiAgQWRkZWQgc29tZSBYCgkJd2luZG93IEYta2V5IGNvbWJvcy4KICByZWFkX2xpbmUoKToJTmV3IGZ1bmN0aW9uLCBjb25zb2xpZGF0ZXMgb2YgbW9zdCBvZiB0aGUgc3BlY2lhbAoJCXNlY3Rpb25zIG9mIHRoZSBmaWxlIHJlYWRpbmcgY29kZS4gKFJvYiBTaWVtYm9yc2tpKQogIGRvX3JlcGxhY2UoKTogTWFueSBzY2F0dGVyZWQgZml4ZXMuIChSb2IgU2llbWJvcnNraSkKICB3cml0ZV9maWxlKCk6CUFkZGVkIGNoZWNrIGZvciBlbXB0eSBmaWxlbmFtZS4KLSB3aW5pby5jOgogIG5hbm9nZXRzdHIoKToJRml4ZXMgZm9yIGRlbGV0aW5nIGF0IHBsYWNlcyBvdGhlciB0aGFuIHRoZSBlbmQgb2YgdGhlCgkJYnVmZmVyLCBjdXQgc3VwcG9ydC4gKEFkYW0gUm9nb3lza2kpCiAgYmxhbmtfZWRpdCgpOglOZXcgZnVuY3Rpb24sIGJsYW5rcyBlZGl0IGJ1ZmZlci4gIEFkZGVkIGNhbGwgdG8gaXQgaW4gCgkJdG90YWxfcmVmcmVzaCgpLgotIGNvbmZpZ3VyZToJQ2hlY2tzIGZvciBnbGliIGlmIHNucHJpbnRmIG9mIHZzbnByaW50ZiBhcmVuJ3QgYXZhaWxhYmxlCgkJKEFuZHkgS2FobikuIENoYW5nZWQgd2FybmluZyBtZXNzYWdlIHdoZW4gbm8gdGVybWNhcCBsaWIKCQlpcyBmb3VuZC4KCm5hbm8tMC43LjcgLSAwMS8xOS8yMDAwCi0gT3B0aW9uICctdicgZm9yIHZlcnNpb24gbW92ZWQgdG8gJy1WJywgYmVjYXVzZSAtdiBpcyBQaWNvJ3MgInJlYWQgb25seSIKICBtb2RlIChhZmZlY3RzIGdldG9wdCgpIGluIG1haW4oKSBhbmQgdXNhZ2UoKSBmdW5jdGlvbiBpbiBuYW5vLmMKLSBOZXcgZmxhZyAtYywgYWx3YXlzIHNob3cgY3Vyc29yIHBvc2l0aW9uLiAgQWZmZWN0cyBtYWluKCkgaW4gbmFuby5jIGFuZAogIHN0YXR1c2JhcigpIGluIHdpbmlvLmMKLSBPcHRpb24gJy14JyBkb2Vzbid0IHNob3cgaGVscCB3aW5kb3cgYXQgdGhlIGJvdHRvbSBvZiB0aGUgZWRpdG9yLgogIE5ldyB2YXJpYWJsZSBub19oZWxwIGluIG5hbm8uaCBhbmQgcHJvdG8uaCwgYWZmZWN0cyBtYWluKCksIHVzYWdlKCksCiAgYW5kIGdsb2JhbF9pbml0KCkgaW4gbmFuby5jLCBibGFua19ib3R0b21iYXJzKCksIGNsZWFyX2JvdHRvbXdpbigpLAogIGJvdHRvbWJhcnMoKSwgYW5kIGRvX3llc25vKCkgIGluIHdpbmlvLmMgIChJIGhhZCB0byBhcHBseSB0aGlzIHBhdGNoIGJ5CiAgaGFuZCA9UCkgKEFkYW0gUm9nb3lza2kpCi0gbmFuby5jOgogIGhhbmRsZV9zaWd3aW5jaCgpOglOZXcgZnVuY3Rpb24gKEFkYW0gUm9nb3lza2kpLCBoYW5kbGVzIHJlc2l6aW5nLgogIHBhZ2VfdXAoKSwgcGFnZV9kb3duKCk6CQoJLSBOZXcgZnVuY3Rpb25zLiAgV2Ugbm93IHNldCB0aGUgY3Vyc29yIGF0IHRoZSB0b3AgcmlnaHQgY29ybmVyLAoJICBub3QgYXQgdGhlIGNlbnRlciBsaW5lLCBhbmQgcGFnZSB1cCBhbmQgZG93biBhIGZ1bGwgc2NyZWVuCgkgIHJhdGhlciB0aGFuIGEgaGFsZiBzY3JlZW4uIE9yaWdpbmFsIGZ1bmN0aW9ucyByZW5hbWVkIHRvCgkgIHBhZ2VfdXBfY2VudGVyKCkgYW5kIHBhZ2VfZG93bl9jZW50ZXIoKS4KICBtYWluKCk6IAoJLSBBZGRlZCBjaGVjayBmb3Iga2V5c3Ryb2tlIGtleSBzZXF1ZW5jZSA0MDcgb3IgTkFOT19DT05UUk9MX1oKCSAgaW4gbWFpbiB3aGlsZSBsb29wIGJlY2F1c2Ugc3VzcGVuZCBtb2RlIHdhcyBicm9rZW4uICBUaGlzIHNob3VsZAoJICBmaXggaXQsIGF0IGxlYXN0IGZvciBub3cuCgktIEFkZGVkIGxvbmcgb3B0aW9uIHN1cHBvcnQgKEJ5IHBvcHVsYXIgaGFyYXNzbWVudCA7LSkgLSBBZGRlZAoJICAjaW5jbHVkZSBmb3IgZ2V0b3B0LmgsIGNoYW5nZWQgZ2V0b3B0KCkgdG8gZ2V0b3B0X2xvbmcoKS4KCSAgT3B0aW9ucyBhZGRlZCBzbyBmYXI6IC0tdmVyc2lvbiAoLVYpLCAtLW5vd3JhcCAoLXcpLCAtLXN1c3BlbmQKCSAgKC16KSwgLS1oZWxwICgtaCksIC0tbm9oZWxwICgteCkuCgktIFJld3JvdGUgc2lnbmFsIHN0YXRlbWVudHMgKEFkYW0gUm9nb3lza2kpCgpuYW5vIDAuNy42IC0gMDEvMTUvMjAwMAotIE5ldyBDaGFuZ2VMb2cgZm9ybWF0Ci0gbmFuby5jOiAKICBtYWluKCk6IAlCb3VuZCBDT05UUk9MX0ggdG8gYmFja3NwYWNlIChvb3BzKQoJCUFkZGVkIG1vcmUgQWx0LVsta2V5IGNvbWJpbmF0aW9ucywgZm9yIHBhZ2UgdXAgJiBkb3duLgogIHJlYWRfYnl0ZXMoKToJTmV3IGZ1bmN0aW9uIChBZGFtIFJvZ295c2tpKQogIHJlYWRfZmlsZSgpOglPcHRpbWl6YXRpb25zIC0gbWFsbG9jKClzICpidWYgYSBsaXR0bGUgYXQgYSB0aW1lIHJhdGhlcgoJCXRoYW4gb25lIGh1Z2UgYnVmZmVyLCBhbmQgcmVwbGFjZWQgdGhlIHN0cmNhdCBhdCB0aGUgZW5kCgkJd2l0aCBhbiBpbmRleCB2YXJpYWJsZS4gIEFkZGVkIGNhbGwgdG8gcmVhZF9ieXRlcygpLgogIGRvX25leHRfd29yZCgpOiBOZXcgZnVuY3Rpb24sIGJpbmRpbmcgaXMgY29udHJvbC1zcGFjZSAoMCkgKG1lKQoKLSB3aW5pby5jOiAKICBib3R0b21iYXJzKCk6CUZpeGVkIG5vbi1leHBhbmRpbmcgc2hvcnRjdXQga2V5cyBhdCBib3R0b20gb2Ygc2NyZWVuLgoJCShmb3JtdWxhIGlzIGV4dHJhIHNwYWNlIG5lZWRlZCA9IENPTFMgLyA2IC0gMTMpLgogIGFjdHVhbF94KCkgJiBzdHJsZW5wdCgpOgkKCQlBZGRlZCBidWcjOSBmaXggLSB3aGVuIHRhYnMgJSA4ID09IDAsIHdlIHNob3VsZCBvbmx5CgkJaW5jcmVtZW50IHRhYnMgYnkgMS4KICB0aXRsZWJhcigpOglGaXhlZCBvdmVycnVuIGluIHRpdGxlYmFyIG9uIHZlcnkgbG9uZyBmaWxlbmFtZXMuCgowLjcuNQlQaWNvICdsYXN0IGxpbmUnIGZlYXR1cmUgYWRkZWQgKFJvYiBTaWVtYm9yc2tpICYgbWUpLiAgRWxpbWluYXRlZAoJd3JpdGluZyBhIG5ld2xpbmUgYXQgRU9GLiBkb19jdXJzb3Jwb3MgYW5kIGRvX3JlcGxhY2UgYXJlIG5vdyBub3QKCWRpcmVjdGx5IGJvdW5kIHRvIHNpZ25hbHMgYnV0IHBpY2tlZCB1cCBhcyB0aGVpciBjb250cm9sIHNlcXVlbmNlcwoJaW4gcmF3IG1vZGUuIEJ1ZyBmaXggaW4gZG9fYmFja3NwYWNlLiBGaXhlZCBidWcgIzkgKHdvb2hvbyEpCjAuNy40CU9wdGltaXplZCAob2JmdXNjYXRlZD8pIGVkaXRfcmVmcmVzaC4gTWFsbG9jKCkgY2FsbHMgY2hlY2tlZCBmb3IKCWF2YWlsYWJsZSBtZW1vcnksIGFsaWduIGJ1ZyBmaXhlZCAoQmlnIEdhdXRlKS4KCi0tLSBBcyBvZiB2ZXJzaW9uIDAuNy40IFRJUCBpcyByZW5hbWVkIHRvIG5hbm8uCgowLjcuMwlGaXhlZCBhIGRvdWJsZSBibGFua19zdGF0dXNiYXIoKSB3aGVuIGp1bXBpbmcgdG8gZmlyc3QgYW5kIGxhc3QKCWxpbmVzLiAgVG9vayBvdXQgdW5uZWNlc3NhcnkgdXBkYXRlcyBpbiBsb2FkX2ZpbGUuIEJ1ZyBmaXggaW4KCWRvX2xlZnQuIE1pc3NpbmcgdXBkYXRlcyB0byB0b3RsaW5lcywgZml4ZWQgYnVnICM3IChsYXN0IGxpbmUgbm90CgloYXZpbmcgYSBuZXdsaW5lIGF0IHRoZSBlbmQgZG9lc250IGdldCByZWFkLCBidWdmaXggaW4gZG9fcmVwbGFjZQoJd2l0aCByZXBsYWNlIGFsbCwgbW9yZS9iZXR0ZXIgY29tbWVudHMgKFJvYmVydCBTaWVtYm9yc2tpKQowLjcuMglPdXIgZmlyc3QgcGF0Y2ggYWNjZXB0ZWQgaW50byB0aGUgc291cmNlISBjb25maWd1cmUgZml4ZXMgCglhbmQgb3B0aW1pemF0aW9ucyAoRXJpayBBbmRlcnNvbikuICBBZGRlZCBtaXNzaW5nIHN0ZGFyZy5oIHRvIHdpbmlvLmMuIAoJQnVnIGZpeCBpbiB1cGRhdGVfbGluZSBmb3IgZWRpdGluZyBsb25nIGxpbmVzLiBGaXhlZCBhcmd1bWVudHMKCWJlaW5nIHB1dCBpbnRvIHRoZSBmaWxlbmFtZSB3aGVuIG5vbmUgaXMgc3BlY2lmaWVkLiBQcmVsaW1pbmFyeQoJK2xpbmUgY29tbWFuZCBhcmd1bWVudCBmdW5jdGlvbi4KMC43LjEJY29uZmlndXJlIHR3ZWFrIGZvciBiZXR0ZXIgRnJlZUJTRCBzdXBwb3J0LiBSZW1vdmVkIHJlZnJlc2goKSBmcm9tCgllZGl0X3JlZnJlc2ggdG8gc3RvcCBjdXJzb3IgImp1bXBpbmciIGR1cmluZyBzY3JlZW4gdXBkYXRlcy4gIFRoaXMKCXdpbGwgcHJvYmFibHkgY2F1c2UgYSBidWcgb3IgdHdvLiBSZXBsYWNlIGlzIG5vdyBBbHQtUiAoQFIpIGFuZCAKCUdvdG8gbGluZSBpcyBBbHQtRyAoQEcpLCBidXQgdGhleSBoYXZlIGNvbnRyb2wga2V5IGFsaWFzZXMgb2YgXlwgYW5kIAoJXl8gcmVzcGVjdGl2ZWx5LiAgTWFkZSBDb250cm9sLUYsQixOLFAgd29yayBsaWtlIHRoZXkgZG8gaW4gUGljby4KCUNvbnRyb2wtRyB3aWxsIGJlY29tZSB0aGUgSGVscCBrZXksIGJ1dCBmb3Igbm93IGlzIHN0dWJiZWQgb3V0LgowLjcuMAlGaXhlZCBtaXNzaW5nIHN0ZGxpYi5oIGZyb20gY3V0LmMuIEZpeGVkIGEgZmV3IG1lc3NhZ2UgYnVncyBpbgoJZmluZG5leHRzdHIuIEJvdW5kIENvbnRyb2wtRCB0byBEZWxldGUuIFJlZml4ZWQgc2VnZmF1bHQgb24gemVybwoJbGVuZ3RoIGZpbGUuIEFkZGVkIEVzYy1bLUEsQixDLEQgY3Vyc29yIGtleSBzZXF1ZW5jZXMuCjAuNi45CVByZWxpbWluYXJ5IGN1cnNvciBwb3NpdGlvbiBmdW5jdGlvbi4gU3BsaXQgdXAgdGlwLmMgbW9yZSwgbWFkZQoJbmV3IGZpbGVzIGN1dC5jIGFuZCB3aW5pby5jLiBGaXhlZCBhIGJ1ZyBpbiBjdXRfbWFya2VkX3NlZ21lbnQKCXRoYXQgd2FzIGxlYXZpbmcgb3V0IGEgY2hhcmFjdGVyLgowLjYuOAlCeSByZXF1ZXN0LCBvcHRjaHIgaW4gbWFpbigpIGlzIG5vdyBhbiBpbnQuICBSZW1vdmVkIHVubmVlZGVkCglnbG9iYWxzLiBCb3VuZCBmdW5jdGlvbnMgZm9yIG5leHQvcHJldiBwYWdlLCBhbmQgd3JvdGUgZnVuY3Rpb25zCglkb19ob21lIGFuZCBkb19lbmQuCjAuNi43CUJ1Z2ZpeCBpbiBkb191bmN1dF90ZXh0IGZvciB0b3RsaW5lcy4gQnJva2UgdXAgb3Blbl9maWxlIGFuZAoJY3JlYXRlZCByZWFkX2ZpbGUuICBJbXBsZW1lbnRlZCBJbnNlcnQgRmlsZS4gRml4ZXMgaW4gdGlwZ2V0c3RyCglmb3IgZXJyb25lb3VzIGtleXN0cm9rZXMuIEFkZGVkIGxlYXZlX2N1cnNvciBhcmcgdG8gZG9feWVzbm8oKS4KMC42LjYJRml4ZXMgaW4gZG9fc2VhcmNoKCksIGRvX3JlcGxhY2UoKSwgZG9fd3JpdGVvdXQsIGFuZCBkb19leGl0KCkgZm9yIAoJYWJvcnRlZCBzZWFyY2hlcyBhbmQgbW9yZSBQaWNvLWNvbXBhdGlibGUgbWVzc2FnZXMuIHN0YXR1c3EoKSBub3cKCXJldHVybnMgLTIgb24gYSBibGFuayBlbnRyeSBpbnN0ZWFkIG9mIC0xLiBCdWcgZml4IGluIGFjdHVhbF94KCkuCjAuNi41CU1vcmUgQlNEIGNvbXBhdGliaWxpdHkuICBGaXhlZCB0d28gYnVncyBpbiBkb191bmN1dF90ZXh0CglyZWdhcmRpbmcgYnVmZmVycyB3aXRoIGZpbGVib3QgaW4gdGhlbS4gIEZpeGlucyBpbiBkb19iYWNrc3BhY2UKCWFuZCBkb19lbnRlci4gUmVtb3ZlZCB1bnVzZWQgdmFyaWFibGVzLiBSZW1vdmVkIHN0cmlwX25ld2xpbmUuCjAuNi40CVRvb2sgb3V0IHRoZSBhd2Z1bCBuZXdsaW5lcyBmcm9tIGVhY2ggc3RyaW5nIGJ1ZmZlcnMuICBUaGlzIHdpbGwKCWNlcnRhaW5seSBjYXVzZSBtb3JlIGJ1Z3MuIEZpeGVzIGluIGRvX2V4aXQoKS4gQmV0dGVyIGVtcHR5IGZpbGUKCWhhbmRsaW5nIChJIGhvcGUpLgowLjYuMwlJbXBsZW1lbnRlZCBeRS4gIFJlbW92ZWQgbm93IHVubmVlZGVkIHdyYXBsaW5lIGZyb20gZmlsZXN0cnVjdC4KCWRvX2VudGVyKCkgcmV3cml0dGVuLgowLjYuMglCZXR0ZXIgZGVmYXVsdCBmaWxlIHBlcm1pc3Npb25zLiBDb21wbGV0ZSByZXdyaXRlIG9mIGRvX3dyYXAoKS4KCUJldHRlciBoYW5kbGluZyBvZiBlZGl0aW5nIHdpdGggY3Vyc29yIG5lYXIgQ09MUyAtIDEuCjAuNi4xCVN0YXJ0aW5nIHRvIGltcGxlbWVudCB3cmFwcGluZyB0b2dnbGUuIEZpeCBmb3IgdW5oYW5kbGVkIGNvbnRyb2wKCWNvZGVzIGJlaW5nIGVudGVyZWQgaW50byB0aGUgYnVmZmVyLiBCdWcgZml4IGluIGFjdHVhbF94OyBtb3JlCgk+IENPTFMgLSAxIGZ1bmN0aW9uYWxpdHksIGVzcGVjaWFsbHkgb24gbGluZXMgd2l0aCBUQUJzLiAgRml4ZWQgYmVpbmcgCglsb2NrZWQgaW50byBjdXRidWZmZXIgd2hlbiBjdXR0aW5nIG1vcmUgdGhhbiBvbmUgbWFya2VkIHNjcmVlbiBvZiB0ZXh0LgowLjYuMAlXZSBoYXZlIFRBQnMhISEgIFRvIGRvIHRoaXMsIHBsYWNld2V3YW50IGlzIG5vdyBzZXQgdG8gdGhlIGFjdHVhbAoJd2lkdGggb24gdGhlIHNjcmVlbiB3ZSB3YW50IHRvIGJlLCBub3QgYW4gaW5kZXggb2YgY3VycmVudC0+ZGF0YS4KCU5ldyBmdW5jdGlvbnMgeHBsdXN0YWJzIGFuZCBhY3R1YWxfeCBjb252ZXJ0IHRoZSBhY3R1YWwgcGxhY2UKCXRoZSBjdXJzb3Igc2hvdWxkIGJlIG9uIHRoZSBzY3JlZW4gdG8gYW5kIGZyb20gdGhlIHBsYWNlIGluIHRoZQoJc3RyaW5nLgowLjUuNQlDaGFuZ2VkIGRvX3JpZ2h0IHRvIHRlc3QgZG9fZG93biBiZWZvcmUgc2V0dGluZyBjdXJyZW50X3ggdG8gMCwKCWVsaW1pbmlhdGluZyB0aGUgImxvb3BpbmciIG9uIHRoZSBsYXN0IGxpbmUgd2hlbiBob2xkaW5nIHRoZSByaWdodAoJYXJyb3cuICBQcmVsaW1pbmFyeSBzdXBwb3J0IGZvciBsb25nZXIgdGhhbiBDT0xTIC0gMSBsaW5lcy4KCVdyb3RlIGRvX2RlbGV0ZS4KMC41LjQJRml4ZWQgYSBiaWcgaW4gdG90YWxfdXBkYXRlIHRoYXQgd2Fzbid0IHJlcGFpbnRpbmcgdGhlIHNjcmVlbiBwcm9wZXJseS4KCXRpcGdldHN0ciBpcyBtdWNoIG1vcmUgbWVzc3kgYnV0IHRleHQgaXMgbm93IG1vcmUgZWRpdGFibGUgOykKCUZpeGVkIGNyYXNoIG9uIGVudGVyaW5nIGEgbmV3IGZpbGUsIGhvcGVmdWxseS4gQXdmdWwgc3R1YiBmb3IgdGFiCgloYW5kbGluZywgb25seSBpbiBkb19yaWdodCgpIHRvIHNhdmUgbWUgc29tZSBzYW5pdHkuCjAuNS4zCUFkZGVkIGNoZWNrIGZvciBtYWxsb2MuaC4gIEltcGxlbWVudGluZyB1bmN1dCBmcm9tIG1hcmtlciBzbG93bHkuCglGaXhlZCBhIGZldyBidWdzIGluIGRvX3VuY3V0IHdoZW4gbm90IHVuY3V0dGluZyBmcm9tIG1hcmtlZCB0ZXh0LgogICAgICAgIEkgd291bGQgbm90IHRydXN0IHlvdXIgZGF0YSB3aXRoIHRoZSBtYXJrIGNvZGUgcmlnaHQgbm93LCBidXQgdGhlbgogICAgICAgIHdlJ3JlIG5vdCBhdCB2ZXJzaW9uIDEuMCB5ZXQgc28gZG9udCB0cnVzdCBhbnl0aGluZyA7KQowLjUuMglBZGRlZCByZXNldF9jdXJzb3IoKSBiZWZvcmUgZW5kIG9mIHVwZGF0ZV9saW5lIHNvIGN1cnNvciBkb2VzbnQKCWp1bXAgYWZ0ZXIgZWFjaCBrZXlzdHJva2UgZW50ZXJlZC4gU2VsZWN0IHRleHQgc3R1YmJlZC4gRml4ZWQKCWEgYnVnIGluIHRvdGFsX3JlZnJlc2goKS4gIFNldHRpbmcgYSBtYXJrIHdpbGwgaGlsaWdodCBwcm9wZXJseSwKCWJ1dCBkb2VzIG5vdCBhY3R1YWxseSBhZmZlY3Qgd2hhdCBnZXRzIHB1dCBpbiB0aGUgY3V0YnVmZmVyICh5ZXQpLgowLjUuMQlXcml0aW5nIGEgZmlsZSBvdXQgY2F1c2VzIG1vZGlmaWVkIHRvIGJlIHNldCBiYWNrIHRvIDAuICBHb29kLgoJU2V0X21vZGlmaWVkIGZ1bmN0aW9uIHdyaXR0ZW4uICBDdXQgYW5kIHVuY3V0IHRleHQgbm93IHNldAoJbW9kaWZpZWQgd2hlbiBjYWxsZWQuCjAuNS4wCUhhbGYgd2F5IHRoZXJlISAgSW1wbGVtZW50ZWQgd3JpdGUgb3V0LCBzYXZlIGZ1bmN0aW9uIHNlZW1zCglzdGFibGUuICBDaGFuZ2VkIHN0YXR1c2JhciBibGFuayByb3V0aW5nIHRvIG5vdCByZWZyZXNoLCBhIHNlcGFydGUKCXByb2dyYW0gY2FsbHMgaXQgYW5kIHRoZW4gcmVmcmVzaGVzLiAgTWFkZSB0aGUgcHJvZ3JhbSBub3QgY2xlYXIKCXRoZSBzcmNlZW4gb24gZXhpdCwganVzdCB0aGUgYm90dG9tIHR3byBsaW5lcyAobGlrZSBQaWNvKS4KMC40LjIJSW1wbGVtZW50ZWQgcmVwbGFjZSBhbGwgaW4gcmVwbGFjZSBmdW5jdGlvbi4gIENydWRlIGV4aXQgZnVuY3Rpb24KCShhc2tzIHllcyBvciBubyBpZiBtb2RpZmllZCBidXQgZG9lcyBub3Qgd3JpdGUgdG8gZmlsZSkuCjAuNC4xCUltcGxlbWVudGluZyBzZWFyY2ggJiByZXBsYWNlLiAgRml4ZWQgY3Jhc2ggb24gZGVsZXRpbmcgYXQgdG9wIG9mCgllZGl0IGJ1ZmZlci4gIEltcGxlbWVudGVkICJ0aW1lb3V0IiBvZiBzdGF0dXNiYXIgbWVzc2FnZXMuCglJbXBsZW1lbnRlZCBeQSBhbmQgXkUgKGJlZ2lubmluZyBhbmQgZW5kIG9mIGxpbmUpLgowLjQuMAlTcGxpdCBjb2RlIGludG8gZ2xvYmFsLmMgYW5kIHByb3RvLmggdG8gYWxsb3cgZm9yIGJldHRlciBtdWx0aXBsZQoJZmlsZSBoYW5kbGluZy4gIEFkZGVkICNkZWZpbmVzIGZvciB0aGUgbWFqb3JpdHkgb2YgdGhlIHNob3J0Y3V0CglrZXRzIGluIHRpcC5oIGZvciBlYXN5IG1vZGlmaWNhdGlvbi4gCjAuMy4xCVdyaXRlIGVkaXRfcmVmcmVzaCB3aGljaCBkb2Vzbid0IG1vdmUgdGhlIHNjcmVlbiBhcm91bmQsIGp1c3QKCXVwZGF0ZXMgd2hhdCdzIHRoZXJlIGFscmVhZHkuICBkb193cmFwKCkgYW5kIGRvX2VudGVyKCkgYWRkZWQuCjAuMy4wCVByZWxpbWluYXJ5IGN1dGJ1ZmZlciAoY3V0IGFuZCB1bmN1dCkgc3VwcG9ydC4KMC4yLjcgICBDaGVjayBmb3IgTW9kaWZpY2F0aW9uIGFkZGVkLiAgZG9fc2VhcmNoKCkgd29ya3MuCjAuMi41CVJld3JpdGUgb2YgZmlsZSBkYXRhIHN0cnVjdC4KMC4yCVJlYWQgaW4gZGF0YSB0byBidWZmZXIsIGJvdW5kIGtleXN0cm9rZXMgdG8gc3R1YiBmdW5jdGlvbnMsIAoJaW5pdGlhbCBjdXJzb3IgbW92ZW1lbnQgb24gc2NyZWVuLiAgSW5pdGlhbCBhdXRvY29uZiBzdXBwb3J0LgowLjEJSW5pdGlhbCBwcm9ncmFtIHNldHVwIHcvbmN1cnNlcwoKJElkJAo=